agentic-devtools 0.2.118__tar.gz → 0.2.120__tar.gz

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.
Files changed (2862) hide show
  1. agentic_devtools-0.2.120/.github/scripts/speckit-trigger/generate-spec-from-issue.sh +3819 -0
  2. agentic_devtools-0.2.120/.github/scripts/speckit-trigger/lib/spec-validation.sh +597 -0
  3. agentic_devtools-0.2.120/.github/scripts/speckit-trigger/test_spec_validation.sh +1112 -0
  4. agentic_devtools-0.2.120/.github/scripts/speckit-trigger/test_specify_retry.sh +395 -0
  5. agentic_devtools-0.2.120/.github/workflows/ai-pr-loop.yml +118 -0
  6. agentic_devtools-0.2.120/PKG-INFO +959 -0
  7. agentic_devtools-0.2.120/agentic_devtools/_version.py +24 -0
  8. agentic_devtools-0.2.120/agentic_devtools/cli/ci/actionable_checks.py +12 -0
  9. agentic_devtools-0.2.120/agentic_devtools/cli/ci/commands.py +220 -0
  10. agentic_devtools-0.2.120/agentic_devtools/cli/ci/orchestrator.py +1781 -0
  11. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/__init__.py +28 -0
  12. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/__init__.py +21 -0
  13. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/approve.py +153 -0
  14. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/dispatch_repair.py +202 -0
  15. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/guards.py +120 -0
  16. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/merge.py +198 -0
  17. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/publish.py +120 -0
  18. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/request_review.py +111 -0
  19. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/resolve_threads.py +153 -0
  20. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/actions/squash.py +112 -0
  21. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/base.py +40 -0
  22. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/command.py +155 -0
  23. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/models.py +65 -0
  24. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/runner.py +209 -0
  25. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/session_detector.py +78 -0
  26. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/snapshot.py +321 -0
  27. agentic_devtools-0.2.120/agentic_devtools/cli/ci/pipeline/summary.py +305 -0
  28. agentic_devtools-0.2.120/specs/1505-structural-validation-and-retry/tasks.md +148 -0
  29. agentic_devtools-0.2.120/specs/1519-auto-push-force-lease/fr-coverage.json +1 -0
  30. agentic_devtools-0.2.120/specs/1519-auto-push-force-lease/tasks.md +91 -0
  31. agentic_devtools-0.2.120/specs/1519-auto-push-force-lease/test-coverage.json +183 -0
  32. agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/.markdownlint.json +4 -0
  33. agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/analysis-report.md +170 -0
  34. agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/checklists/requirements.md +46 -0
  35. agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/fr-coverage.json +1 -0
  36. agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/plan.md +214 -0
  37. agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/spec.md +346 -0
  38. agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/tasks.md +171 -0
  39. agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/test-coverage.json +288 -0
  40. agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/.markdownlint.json +4 -0
  41. agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/checklists/requirements.md +44 -0
  42. agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/fr-coverage.json +1 -0
  43. agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/plan.md +131 -0
  44. agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/spec.md +282 -0
  45. agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/tasks.md +148 -0
  46. agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/test-coverage.json +184 -0
  47. agentic_devtools-0.2.120/specs/1568-copilot-session-detection-false-positives/.markdownlint.json +5 -0
  48. agentic_devtools-0.2.120/specs/1568-copilot-session-detection-false-positives/analysis-report.md +69 -0
  49. agentic_devtools-0.2.120/specs/1568-copilot-session-detection-false-positives/checklists/requirements.md +44 -0
  50. agentic_devtools-0.2.120/specs/1568-copilot-session-detection-false-positives/fr-coverage.json +1 -0
  51. agentic_devtools-0.2.120/specs/1568-copilot-session-detection-false-positives/plan.md +137 -0
  52. agentic_devtools-0.2.120/specs/1568-copilot-session-detection-false-positives/spec.md +205 -0
  53. agentic_devtools-0.2.120/specs/1568-copilot-session-detection-false-positives/tasks.md +102 -0
  54. agentic_devtools-0.2.120/specs/1568-copilot-session-detection-false-positives/test-coverage.json +139 -0
  55. agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/.markdownlint.json +5 -0
  56. agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/analysis-report.md +55 -0
  57. agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/checklists/requirements.md +51 -0
  58. agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/fr-coverage.json +1 -0
  59. agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/plan.md +95 -0
  60. agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/spec.md +393 -0
  61. agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/tasks.md +103 -0
  62. agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/test-coverage.json +156 -0
  63. agentic_devtools-0.2.120/specs/1575-copilot-agent-fallback-speckit/.markdownlint.json +5 -0
  64. agentic_devtools-0.2.120/specs/1575-copilot-agent-fallback-speckit/checklists/requirements.md +50 -0
  65. agentic_devtools-0.2.120/specs/1575-copilot-agent-fallback-speckit/plan.md +223 -0
  66. agentic_devtools-0.2.120/specs/1575-copilot-agent-fallback-speckit/spec.md +309 -0
  67. agentic_devtools-0.2.120/specs/1577-logs-not-visible-loop/.markdownlint.json +5 -0
  68. agentic_devtools-0.2.120/specs/1577-logs-not-visible-loop/checklists/requirements.md +41 -0
  69. agentic_devtools-0.2.120/specs/1577-logs-not-visible-loop/fr-coverage.json +1 -0
  70. agentic_devtools-0.2.120/specs/1577-logs-not-visible-loop/plan.md +151 -0
  71. agentic_devtools-0.2.120/specs/1577-logs-not-visible-loop/spec.md +176 -0
  72. agentic_devtools-0.2.120/specs/1577-logs-not-visible-loop/tasks.md +118 -0
  73. agentic_devtools-0.2.120/specs/1577-logs-not-visible-loop/test-coverage.json +163 -0
  74. agentic_devtools-0.2.120/specs/1580-update-constitution-align-new/.markdownlint.json +5 -0
  75. agentic_devtools-0.2.120/specs/1580-update-constitution-align-new/checklists/requirements.md +38 -0
  76. agentic_devtools-0.2.120/specs/1580-update-constitution-align-new/plan.md +196 -0
  77. agentic_devtools-0.2.120/specs/1580-update-constitution-align-new/spec.md +255 -0
  78. agentic_devtools-0.2.120/specs/1594-feature-abstract-title-body/.markdownlint.json +5 -0
  79. agentic_devtools-0.2.120/specs/1594-feature-abstract-title-body/spec.md +286 -0
  80. agentic_devtools-0.2.120/tests/unit/cli/ci/commands/test_ai_pr_loop_command.py +145 -0
  81. agentic_devtools-0.2.120/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_actionable_checks.py +127 -0
  82. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/approve/test_approveaction.py +150 -0
  83. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/dispatch_repair/test_dispatchrepairaction.py +183 -0
  84. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/guards/test_guardsaction.py +126 -0
  85. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/merge/test_mergeaction.py +234 -0
  86. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/publish/test_publishaction.py +108 -0
  87. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/request_review/test_requestreviewaction.py +105 -0
  88. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/resolve_threads/test_resolvethreadsaction.py +175 -0
  89. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/squash/test_squashaction.py +96 -0
  90. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/command/test__determine_exit_code.py +105 -0
  91. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/command/test_run_ai_pr_loop_v2.py +116 -0
  92. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/models/test_actiondecision.py +26 -0
  93. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/models/test_actionresult.py +36 -0
  94. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/models/test_pipelinerunsummary.py +33 -0
  95. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/runner/test_run_pipeline.py +506 -0
  96. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/session_detector/test_is_copilot_session_active.py +67 -0
  97. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/snapshot/test_build_pr_state_snapshot.py +284 -0
  98. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/snapshot/test_derivedstate.py +37 -0
  99. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/snapshot/test_prstatesnapshot.py +43 -0
  100. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/summary/test_collapse_prior_summaries.py +203 -0
  101. agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/summary/test_render_summary_comment.py +180 -0
  102. agentic_devtools-0.2.120/tests/unit/context_budget/__init__.py +0 -0
  103. agentic_devtools-0.2.120/tests/unit/file_locking/__init__.py +0 -0
  104. agentic_devtools-0.2.120/tests/unit/mcp/__init__.py +0 -0
  105. agentic_devtools-0.2.120/tests/unit/mcp/server/__init__.py +0 -0
  106. agentic_devtools-0.2.120/tests/unit/orchestration/__init__.py +0 -0
  107. agentic_devtools-0.2.120/tests/unit/orchestration/checkpointing/__init__.py +0 -0
  108. agentic_devtools-0.2.120/tests/unit/orchestration/graph_builder/__init__.py +0 -0
  109. agentic_devtools-0.2.120/tests/unit/orchestration/pilot_workflow/__init__.py +0 -0
  110. agentic_devtools-0.2.120/tests/unit/orchestration/review/__init__.py +0 -0
  111. agentic_devtools-0.2.120/tests/unit/orchestration/review/graph_builder/__init__.py +0 -0
  112. agentic_devtools-0.2.120/tests/unit/orchestration/review/nodes/__init__.py +0 -0
  113. agentic_devtools-0.2.120/tests/unit/orchestration/review/preflight/__init__.py +0 -0
  114. agentic_devtools-0.2.120/tests/unit/orchestration/review/runner/__init__.py +0 -0
  115. agentic_devtools-0.2.120/tests/unit/orchestration/runner/__init__.py +0 -0
  116. agentic_devtools-0.2.120/tests/unit/orchestration/state_schema/__init__.py +0 -0
  117. agentic_devtools-0.2.120/tests/unit/prompts/__init__.py +0 -0
  118. agentic_devtools-0.2.120/tests/unit/prompts/loader/__init__.py +0 -0
  119. agentic_devtools-0.2.120/tests/unit/skill_injector/__init__.py +0 -0
  120. agentic_devtools-0.2.120/tests/unit/state/__init__.py +0 -0
  121. agentic_devtools-0.2.120/tests/unit/submission_manager/__init__.py +0 -0
  122. agentic_devtools-0.2.120/tests/unit/submission_processor/__init__.py +0 -0
  123. agentic_devtools-0.2.120/tests/unit/task_state/__init__.py +0 -0
  124. agentic_devtools-0.2.120/tests/unit/tools/__init__.py +0 -0
  125. agentic_devtools-0.2.120/tests/unit/tools/azure_devops/__init__.py +0 -0
  126. agentic_devtools-0.2.120/tests/unit/tools/git/__init__.py +0 -0
  127. agentic_devtools-0.2.120/tests/unit/tools/jira/__init__.py +0 -0
  128. agentic_devtools-0.2.120/tests/workflows/__init__.py +0 -0
  129. agentic_devtools-0.2.118/.github/scripts/speckit-trigger/generate-spec-from-issue.sh +0 -3666
  130. agentic_devtools-0.2.118/.github/workflows/ai-pr-loop.yml +0 -114
  131. agentic_devtools-0.2.118/PKG-INFO +0 -959
  132. agentic_devtools-0.2.118/agentic_devtools/_version.py +0 -24
  133. agentic_devtools-0.2.118/agentic_devtools/cli/ci/commands.py +0 -203
  134. agentic_devtools-0.2.118/agentic_devtools/cli/ci/orchestrator.py +0 -1789
  135. agentic_devtools-0.2.118/specs/1505-structural-validation-and-retry/tasks.md +0 -139
  136. agentic_devtools-0.2.118/tests/unit/cli/ci/commands/test_ai_pr_loop_command.py +0 -110
  137. agentic_devtools-0.2.118/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_actionable_checks.py +0 -125
  138. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.devcontainer/README.md +0 -0
  139. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.devcontainer/devcontainer.json +0 -0
  140. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/ISSUE_TEMPLATE/speckit-test.md +0 -0
  141. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/MARKDOWN_LINTING.md +0 -0
  142. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/.markdownlint.json +0 -0
  143. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.add-jira-comment.agent.md +0 -0
  144. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.add-pull-request-comment.agent.md +0 -0
  145. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.add-users-to-project-role-batch.agent.md +0 -0
  146. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.add-users-to-project-role.agent.md +0 -0
  147. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.address-copilot-review.agent.md +0 -0
  148. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.address-copilot-review.ci-repair.agent.md +0 -0
  149. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.address-copilot-review.evaluate-and-respond.agent.md +0 -0
  150. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.advance-workflow.agent.md +0 -0
  151. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.analyze-workflow.agent.md +0 -0
  152. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.apply-pr-suggestions.initiate.agent.md +0 -0
  153. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.approve-file.agent.md +0 -0
  154. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.approve-pull-request.agent.md +0 -0
  155. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.autonomous-issue-refinement.agent.md +0 -0
  156. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.azure-context-current.agent.md +0 -0
  157. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.azure-context-ensure-login.agent.md +0 -0
  158. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.azure-context-status.agent.md +0 -0
  159. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.azure-context-use.agent.md +0 -0
  160. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.break-down-issue-into-subtasks.initiate.agent.md +0 -0
  161. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.check-user-exists.agent.md +0 -0
  162. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.check-users-exist.agent.md +0 -0
  163. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.clear-workflow.agent.md +0 -0
  164. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.clear.agent.md +0 -0
  165. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.confirm-suggestion-addressed.agent.md +0 -0
  166. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.copilot-auto-start.agent.md +0 -0
  167. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-agdt-bug-issue.agent.md +0 -0
  168. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-agdt-documentation-issue.agent.md +0 -0
  169. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-agdt-feature-issue.agent.md +0 -0
  170. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-agdt-issue.agent.md +0 -0
  171. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-agdt-task-issue.agent.md +0 -0
  172. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-checklist.agent.md +0 -0
  173. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-epic.agent.md +0 -0
  174. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-issue.agent.md +0 -0
  175. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-issues-from-analysis.agent.md +0 -0
  176. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-jira-epic.initiate.agent.md +0 -0
  177. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-jira-issue.initiate.agent.md +0 -0
  178. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-jira-subtask.initiate.agent.md +0 -0
  179. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-pipeline.agent.md +0 -0
  180. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-pull-request.agent.md +0 -0
  181. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.create-subtask.agent.md +0 -0
  182. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.delete.agent.md +0 -0
  183. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.find-role-id-by-name.agent.md +0 -0
  184. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get-jira-issue.agent.md +0 -0
  185. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get-next-workflow-prompt.agent.md +0 -0
  186. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get-pipeline-id.agent.md +0 -0
  187. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get-project-role-details.agent.md +0 -0
  188. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get-pull-request-details.agent.md +0 -0
  189. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get-pull-request-threads.agent.md +0 -0
  190. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get-run-details.agent.md +0 -0
  191. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get-workflow.agent.md +0 -0
  192. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.get.agent.md +0 -0
  193. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.git-force-push.agent.md +0 -0
  194. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.git-publish.agent.md +0 -0
  195. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.git-push.agent.md +0 -0
  196. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.git-save-work.agent.md +0 -0
  197. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.git-stage.agent.md +0 -0
  198. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.git-sync.agent.md +0 -0
  199. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.list-pipelines.agent.md +0 -0
  200. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.list-project-roles.agent.md +0 -0
  201. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.mark-file-reviewed.agent.md +0 -0
  202. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.mark-pull-request-draft.agent.md +0 -0
  203. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.network-status.agent.md +0 -0
  204. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.optimize-issue-for-ai-agent.initiate.agent.md +0 -0
  205. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.parse-jira-error-report.agent.md +0 -0
  206. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.pr-merge-execute.agent.md +0 -0
  207. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.pr-merge-manager.agent.md +0 -0
  208. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.publish-pull-request.agent.md +0 -0
  209. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.pull-request-review.completion.agent.md +0 -0
  210. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.pull-request-review.decision.agent.md +0 -0
  211. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.pull-request-review.file-review.agent.md +0 -0
  212. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.pull-request-review.initiate.agent.md +0 -0
  213. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.query-app-insights.agent.md +0 -0
  214. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.query-fabric-dap-errors.agent.md +0 -0
  215. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.query-fabric-dap-provisioning.agent.md +0 -0
  216. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.query-fabric-dap-timeline.agent.md +0 -0
  217. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.reject-suggestion-resolution.agent.md +0 -0
  218. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.release-pypi.agent.md +0 -0
  219. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.reply-to-pull-request-thread.agent.md +0 -0
  220. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.request-changes-with-suggestion.agent.md +0 -0
  221. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.request-changes.agent.md +0 -0
  222. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.resolve-merge-conflicts.agent.md +0 -0
  223. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.resolve-thread.agent.md +0 -0
  224. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.review.agent.md +0 -0
  225. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.run-e2e-tests-fabric.agent.md +0 -0
  226. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.run-e2e-tests-synapse.agent.md +0 -0
  227. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.run-wb-patch.agent.md +0 -0
  228. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.set.agent.md +0 -0
  229. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.setup-certs.agent.md +0 -0
  230. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.setup-check.agent.md +0 -0
  231. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.setup-copilot-cli.agent.md +0 -0
  232. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.setup-gh-cli.agent.md +0 -0
  233. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.setup-worktree-background.agent.md +0 -0
  234. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.setup.agent.md +0 -0
  235. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.show-checklist.agent.md +0 -0
  236. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.show-other-incomplete-tasks.agent.md +0 -0
  237. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.show.agent.md +0 -0
  238. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.squash-commits.agent.md +0 -0
  239. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.submit-file-review.agent.md +0 -0
  240. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.task-log.agent.md +0 -0
  241. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.task-status.agent.md +0 -0
  242. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.task-wait.agent.md +0 -0
  243. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.tasks-clean.agent.md +0 -0
  244. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.tasks.agent.md +0 -0
  245. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.test-file.agent.md +0 -0
  246. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.test-pattern.agent.md +0 -0
  247. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.test-quick.agent.md +0 -0
  248. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.test.agent.md +0 -0
  249. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.update-checklist.agent.md +0 -0
  250. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.update-jira-issue.agent.md +0 -0
  251. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.update-jira-issue.initiate.agent.md +0 -0
  252. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.update-pipeline.agent.md +0 -0
  253. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.vpn-off.agent.md +0 -0
  254. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.vpn-on.agent.md +0 -0
  255. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.vpn-run.agent.md +0 -0
  256. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.vpn-status.agent.md +0 -0
  257. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.wait-for-run.agent.md +0 -0
  258. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.checklist-creation.agent.md +0 -0
  259. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.commit.agent.md +0 -0
  260. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.completion.agent.md +0 -0
  261. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.implementation-review.agent.md +0 -0
  262. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.implementation.agent.md +0 -0
  263. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.initiate.agent.md +0 -0
  264. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.planning.agent.md +0 -0
  265. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.pull-request.agent.md +0 -0
  266. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.retrieve.agent.md +0 -0
  267. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.setup.agent.md +0 -0
  268. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/agdt.work-on-jira-issue.verification.agent.md +0 -0
  269. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/copilot-instructions.md +0 -0
  270. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/security-scan.agent.md +0 -0
  271. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/senior-python-developer.md +0 -0
  272. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.analyze.agent.md +0 -0
  273. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.checklist.agent.md +0 -0
  274. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.clarify.agent.md +0 -0
  275. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.constitution.agent.md +0 -0
  276. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.implement.agent.md +0 -0
  277. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.plan.agent.md +0 -0
  278. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.specify.agent.md +0 -0
  279. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.tasks.agent.md +0 -0
  280. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/agents/speckit.taskstoissues.agent.md +0 -0
  281. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/ai-pr-loop-config.json +0 -0
  282. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/copilot-instructions.md +0 -0
  283. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/.markdownlint.json +0 -0
  284. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.add-jira-comment.prompt.md +0 -0
  285. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.add-pull-request-comment.prompt.md +0 -0
  286. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.add-users-to-project-role-batch.prompt.md +0 -0
  287. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.add-users-to-project-role.prompt.md +0 -0
  288. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.address-copilot-review.ci-repair.prompt.md +0 -0
  289. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.address-copilot-review.evaluate-and-respond.prompt.md +0 -0
  290. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.address-copilot-review.prompt.md +0 -0
  291. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.advance-workflow.prompt.md +0 -0
  292. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.analyze-workflow.prompt.md +0 -0
  293. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.apply-pr-suggestions.initiate.prompt.md +0 -0
  294. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.approve-file.prompt.md +0 -0
  295. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.approve-pull-request.prompt.md +0 -0
  296. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.autonomous-issue-refinement.prompt.md +0 -0
  297. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.azure-context-current.prompt.md +0 -0
  298. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.azure-context-ensure-login.prompt.md +0 -0
  299. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.azure-context-status.prompt.md +0 -0
  300. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.azure-context-use.prompt.md +0 -0
  301. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.break-down-issue-into-subtasks.initiate.prompt.md +0 -0
  302. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.check-user-exists.prompt.md +0 -0
  303. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.check-users-exist.prompt.md +0 -0
  304. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.clear-workflow.prompt.md +0 -0
  305. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.clear.prompt.md +0 -0
  306. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.confirm-suggestion-addressed.prompt.md +0 -0
  307. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.copilot-auto-start.prompt.md +0 -0
  308. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-agdt-bug-issue.prompt.md +0 -0
  309. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-agdt-documentation-issue.prompt.md +0 -0
  310. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-agdt-feature-issue.prompt.md +0 -0
  311. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-agdt-issue.prompt.md +0 -0
  312. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-agdt-task-issue.prompt.md +0 -0
  313. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-checklist.prompt.md +0 -0
  314. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-epic.prompt.md +0 -0
  315. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-issue.prompt.md +0 -0
  316. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-issues-from-analysis.prompt.md +0 -0
  317. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-jira-epic.initiate.prompt.md +0 -0
  318. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-jira-issue.initiate.prompt.md +0 -0
  319. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-jira-subtask.initiate.prompt.md +0 -0
  320. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-pipeline.prompt.md +0 -0
  321. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-pull-request.prompt.md +0 -0
  322. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.create-subtask.prompt.md +0 -0
  323. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.delete.prompt.md +0 -0
  324. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.find-role-id-by-name.prompt.md +0 -0
  325. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get-jira-issue.prompt.md +0 -0
  326. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get-next-workflow-prompt.prompt.md +0 -0
  327. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get-pipeline-id.prompt.md +0 -0
  328. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get-project-role-details.prompt.md +0 -0
  329. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get-pull-request-details.prompt.md +0 -0
  330. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get-pull-request-threads.prompt.md +0 -0
  331. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get-run-details.prompt.md +0 -0
  332. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get-workflow.prompt.md +0 -0
  333. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.get.prompt.md +0 -0
  334. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.git-force-push.prompt.md +0 -0
  335. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.git-publish.prompt.md +0 -0
  336. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.git-push.prompt.md +0 -0
  337. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.git-save-work.prompt.md +0 -0
  338. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.git-stage.prompt.md +0 -0
  339. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.git-sync.prompt.md +0 -0
  340. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.list-pipelines.prompt.md +0 -0
  341. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.list-project-roles.prompt.md +0 -0
  342. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.mark-file-reviewed.prompt.md +0 -0
  343. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.mark-pull-request-draft.prompt.md +0 -0
  344. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.network-status.prompt.md +0 -0
  345. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.optimize-issue-for-ai-agent.initiate.prompt.md +0 -0
  346. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.parse-jira-error-report.prompt.md +0 -0
  347. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.pr-merge-manager.prompt.md +0 -0
  348. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.publish-pull-request.prompt.md +0 -0
  349. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.pull-request-review.completion.prompt.md +0 -0
  350. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.pull-request-review.decision.prompt.md +0 -0
  351. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.pull-request-review.file-review.prompt.md +0 -0
  352. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.pull-request-review.initiate.prompt.md +0 -0
  353. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.query-app-insights.prompt.md +0 -0
  354. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.query-fabric-dap-errors.prompt.md +0 -0
  355. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.query-fabric-dap-provisioning.prompt.md +0 -0
  356. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.query-fabric-dap-timeline.prompt.md +0 -0
  357. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.reject-suggestion-resolution.prompt.md +0 -0
  358. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.release-pypi.prompt.md +0 -0
  359. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.reply-to-pull-request-thread.prompt.md +0 -0
  360. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.request-changes-with-suggestion.prompt.md +0 -0
  361. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.request-changes.prompt.md +0 -0
  362. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.resolve-merge-conflicts.prompt.md +0 -0
  363. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.resolve-thread.prompt.md +0 -0
  364. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.review.prompt.md +0 -0
  365. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.run-e2e-tests-fabric.prompt.md +0 -0
  366. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.run-e2e-tests-synapse.prompt.md +0 -0
  367. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.run-wb-patch.prompt.md +0 -0
  368. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.set.prompt.md +0 -0
  369. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.setup-certs.prompt.md +0 -0
  370. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.setup-check.prompt.md +0 -0
  371. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.setup-copilot-cli.prompt.md +0 -0
  372. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.setup-gh-cli.prompt.md +0 -0
  373. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.setup-worktree-background.prompt.md +0 -0
  374. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.setup.prompt.md +0 -0
  375. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.show-checklist.prompt.md +0 -0
  376. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.show-other-incomplete-tasks.prompt.md +0 -0
  377. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.show.prompt.md +0 -0
  378. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.squash-commits.prompt.md +0 -0
  379. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.submit-file-review.prompt.md +0 -0
  380. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.task-log.prompt.md +0 -0
  381. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.task-status.prompt.md +0 -0
  382. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.task-wait.prompt.md +0 -0
  383. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.tasks-clean.prompt.md +0 -0
  384. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.tasks.prompt.md +0 -0
  385. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.test-file.prompt.md +0 -0
  386. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.test-pattern.prompt.md +0 -0
  387. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.test-quick.prompt.md +0 -0
  388. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.test.prompt.md +0 -0
  389. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.update-checklist.prompt.md +0 -0
  390. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.update-jira-issue.initiate.prompt.md +0 -0
  391. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.update-jira-issue.prompt.md +0 -0
  392. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.update-pipeline.prompt.md +0 -0
  393. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.vpn-off.prompt.md +0 -0
  394. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.vpn-on.prompt.md +0 -0
  395. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.vpn-run.prompt.md +0 -0
  396. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.vpn-status.prompt.md +0 -0
  397. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.wait-for-run.prompt.md +0 -0
  398. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.checklist-creation.prompt.md +0 -0
  399. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.commit.prompt.md +0 -0
  400. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.completion.prompt.md +0 -0
  401. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.implementation-review.prompt.md +0 -0
  402. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.implementation.prompt.md +0 -0
  403. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.initiate.prompt.md +0 -0
  404. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.planning.prompt.md +0 -0
  405. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.pull-request.prompt.md +0 -0
  406. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.retrieve.prompt.md +0 -0
  407. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.setup.prompt.md +0 -0
  408. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/agdt.work-on-jira-issue.verification.prompt.md +0 -0
  409. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.analyze.prompt.md +0 -0
  410. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.checklist.prompt.md +0 -0
  411. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.clarify.prompt.md +0 -0
  412. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.constitution.prompt.md +0 -0
  413. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.implement.prompt.md +0 -0
  414. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.plan.prompt.md +0 -0
  415. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.specify.prompt.md +0 -0
  416. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.tasks.prompt.md +0 -0
  417. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
  418. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/check-analysis-gate-cli.sh +0 -0
  419. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/check-analysis-gate.sh +0 -0
  420. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/check-idempotency.sh +0 -0
  421. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/copilot_generate.py +0 -0
  422. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/create-spec-pr.sh +0 -0
  423. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/enforce_budget.py +0 -0
  424. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fix_markdown_deterministic.py +0 -0
  425. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-dynamic-header.md +0 -0
  426. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-empty.md +0 -0
  427. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-formatting-variants.md +0 -0
  428. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-malformed-no-table.md +0 -0
  429. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-metrics-zero-but-table-critical.md +0 -0
  430. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-mixed-resolved-unresolved.md +0 -0
  431. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-no-criticals.md +0 -0
  432. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-remediated.md +0 -0
  433. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-strikethrough-no-resolved.md +0 -0
  434. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-with-criticals.md +0 -0
  435. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/analysis-report-with-resolved-criticals.md +0 -0
  436. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/content-preservation/checklists/requirements.md +0 -0
  437. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/content-preservation/spec.md +0 -0
  438. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/long-line.md +0 -0
  439. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/missing-heading.md +0 -0
  440. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/fixtures/trailing-whitespace.md +0 -0
  441. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/lib/clarify-retry.sh +0 -0
  442. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/lib/critical-gate-remediation.sh +0 -0
  443. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/lib/retry.sh +0 -0
  444. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/post-issue-comment.sh +0 -0
  445. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/sanitize-branch-name.sh +0 -0
  446. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/templates/.markdownlint.json +0 -0
  447. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/templates/already-processed.md +0 -0
  448. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/templates/completed.md +0 -0
  449. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/templates/failed.md +0 -0
  450. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/templates/spec-markdownlint.json +0 -0
  451. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/templates/started.md +0 -0
  452. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/test_check_analysis_gate.sh +0 -0
  453. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/test_clarify_retry.sh +0 -0
  454. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/test_content_preservation.sh +0 -0
  455. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/test_critical_gate_remediation.sh +0 -0
  456. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/test_markdownlint_validation.sh +0 -0
  457. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/test_sc004_regression.sh +0 -0
  458. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/tests/test_retry_lib.sh +0 -0
  459. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/validate-label.sh +0 -0
  460. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/scripts/speckit-trigger/wrap_markdown_lines.py +0 -0
  461. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/README.md +0 -0
  462. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/copilot-review-gate.yml +0 -0
  463. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/copilot-setup-steps.yml +0 -0
  464. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/lint.yml +0 -0
  465. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/publish.yml +0 -0
  466. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/release.yml +0 -0
  467. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/scripts/check-release-exists.sh +0 -0
  468. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/scripts/get-next-version.sh +0 -0
  469. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/security-scan-on-merge.yml +0 -0
  470. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/speckit-implement-trigger.yml +0 -0
  471. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/speckit-issue-trigger.yml +0 -0
  472. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/speckit-packages.yml +0 -0
  473. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/speckit-phase-progression.yml +0 -0
  474. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/squash-wait-scheduler.yml +0 -0
  475. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/synthetic-copilot-review.yml +0 -0
  476. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/test.yml +0 -0
  477. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/workflow-approval-monitor.yml +0 -0
  478. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.github/workflows/workflow-tests.yml +0 -0
  479. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.gitignore +0 -0
  480. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.markdownlint-cli2.jsonc +0 -0
  481. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.markdownlint.json +0 -0
  482. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.push-trigger +0 -0
  483. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/SDD_QUICK_REFERENCE.md +0 -0
  484. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/config.yml +0 -0
  485. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/.markdownlint.json +0 -0
  486. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/analyze.md +0 -0
  487. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/checklist.md +0 -0
  488. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/clarify.md +0 -0
  489. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/constitution.md +0 -0
  490. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/implement.md +0 -0
  491. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/plan.md +0 -0
  492. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/specify.md +0 -0
  493. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/tasks.md +0 -0
  494. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/commands/taskstoissues.md +0 -0
  495. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/extension.yml +0 -0
  496. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/bash/check-prerequisites.sh +0 -0
  497. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/bash/common.sh +0 -0
  498. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/bash/create-new-feature.sh +0 -0
  499. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/bash/setup-plan.sh +0 -0
  500. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/bash/update-agent-context.sh +0 -0
  501. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/powershell/check-prerequisites.ps1 +0 -0
  502. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/powershell/common.ps1 +0 -0
  503. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/powershell/create-new-feature.ps1 +0 -0
  504. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/powershell/setup-plan.ps1 +0 -0
  505. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/extensions/agdt-workflows/scripts/powershell/update-agent-context.ps1 +0 -0
  506. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/memory/constitution.md +0 -0
  507. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/memory/markdown-rules.md +0 -0
  508. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/presets/agdt-templates/preset.yml +0 -0
  509. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/presets/agdt-templates/templates/agent-file-template.md +0 -0
  510. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/presets/agdt-templates/templates/checklist-template.md +0 -0
  511. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/presets/agdt-templates/templates/plan-template.md +0 -0
  512. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/presets/agdt-templates/templates/spec-template.md +0 -0
  513. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/presets/agdt-templates/templates/tasks-template.md +0 -0
  514. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.specify/presets/agdt-templates/templates/vscode-settings.json +0 -0
  515. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/.work-folder-info +0 -0
  516. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/AUDIT-LOG.md +0 -0
  517. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/CHANGELOG.md +0 -0
  518. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/COMMIT_CONVENTION.md +0 -0
  519. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/CONTRIBUTING.md +0 -0
  520. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/LICENSE +0 -0
  521. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/PR_DESCRIPTION.md +0 -0
  522. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/PR_INSTRUCTIONS.md +0 -0
  523. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/PR_MERGE_INSTRUCTIONS_PYTHON.md +0 -0
  524. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/README.md +0 -0
  525. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/RELEASING.md +0 -0
  526. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/SECURITY_SCANNING.md +0 -0
  527. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/SOLUTION_SUMMARY.md +0 -0
  528. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/SPEC_DRIVEN_DEVELOPMENT.md +0 -0
  529. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/__init__.py +0 -0
  530. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/_bundled_skills/__init__.py +0 -0
  531. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/_bundled_skills/agents/__init__.py +0 -0
  532. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/_bundled_skills/prompts/__init__.py +0 -0
  533. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/_bundled_skills/workflow-analysis/SKILL.md +0 -0
  534. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/adapters/__init__.py +0 -0
  535. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/adapters/base.py +0 -0
  536. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/adapters/github_adapter.py +0 -0
  537. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/adapters/jira_adapter.py +0 -0
  538. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/adapters/markdown_adapter.py +0 -0
  539. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/agdt_gitignore.py +0 -0
  540. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/background_tasks.py +0 -0
  541. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/__init__.py +0 -0
  542. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/activity_log.py +0 -0
  543. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/analysis/__init__.py +0 -0
  544. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/analysis/context_resolver.py +0 -0
  545. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/analysis/external_context.py +0 -0
  546. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/analysis/identity_scanner.py +0 -0
  547. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure/__init__.py +0 -0
  548. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure/app_insights_commands.py +0 -0
  549. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure/auth.py +0 -0
  550. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure/config.py +0 -0
  551. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_context/__init__.py +0 -0
  552. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_context/commands.py +0 -0
  553. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_context/config.py +0 -0
  554. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_context/management.py +0 -0
  555. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/__init__.py +0 -0
  556. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/approve_files.py +0 -0
  557. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/async_commands.py +0 -0
  558. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/auth.py +0 -0
  559. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/batch_review_helpers.py +0 -0
  560. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/commands.py +0 -0
  561. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/config.py +0 -0
  562. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/file_review_commands.py +0 -0
  563. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/__init__.py +0 -0
  564. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/classification.py +0 -0
  565. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/convergence.py +0 -0
  566. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/identity.py +0 -0
  567. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/models.py +0 -0
  568. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/orchestrator.py +0 -0
  569. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/repair.py +0 -0
  570. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/reporting.py +0 -0
  571. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/finalization/verification.py +0 -0
  572. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/helpers.py +0 -0
  573. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/mark_reviewed.py +0 -0
  574. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/marker.py +0 -0
  575. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/pipeline_commands.py +0 -0
  576. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/pr_summary_commands.py +0 -0
  577. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/pull_request_details_commands.py +0 -0
  578. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/request_changes_batch.py +0 -0
  579. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_attribution.py +0 -0
  580. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_commands.py +0 -0
  581. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_config.py +0 -0
  582. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_helpers.py +0 -0
  583. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_jira.py +0 -0
  584. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_models_config.py +0 -0
  585. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_prompts.py +0 -0
  586. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_scaffold.py +0 -0
  587. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_state.py +0 -0
  588. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/review_templates.py +0 -0
  589. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/run_details_commands.py +0 -0
  590. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/status_cascade.py +0 -0
  591. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/suggestion_commands.py +0 -0
  592. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/suggestion_verification.py +0 -0
  593. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/verdict_protocol.py +0 -0
  594. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/azure_devops/vpn_toggle.py +0 -0
  595. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/cert_utils.py +0 -0
  596. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/__init__.py +0 -0
  597. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/ado_provider.py +0 -0
  598. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/evaluator/__init__.py +0 -0
  599. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/evaluator/actions.py +0 -0
  600. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/evaluator/classifier.py +0 -0
  601. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/evaluator/command.py +0 -0
  602. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/evaluator/diff_heuristic.py +0 -0
  603. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/evaluator/lock.py +0 -0
  604. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/evaluator/models.py +0 -0
  605. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/evaluator/snapshot.py +0 -0
  606. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/exceptions.py +0 -0
  607. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/github_provider.py +0 -0
  608. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/guards.py +0 -0
  609. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/models.py +0 -0
  610. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/provider.py +0 -0
  611. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/retry.py +0 -0
  612. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/ci/speckit_trigger.py +0 -0
  613. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/config/__init__.py +0 -0
  614. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/config/project_config.py +0 -0
  615. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/copilot/__init__.py +0 -0
  616. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/copilot/auto_start.py +0 -0
  617. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/copilot/session.py +0 -0
  618. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/git/__init__.py +0 -0
  619. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/git/agdt_branch.py +0 -0
  620. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/git/async_commands.py +0 -0
  621. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/git/commands.py +0 -0
  622. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/git/core.py +0 -0
  623. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/git/diff.py +0 -0
  624. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/git/operations.py +0 -0
  625. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/__init__.py +0 -0
  626. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/async_commands.py +0 -0
  627. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/copilot_review_status.py +0 -0
  628. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/issue_commands.py +0 -0
  629. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/pr_approve.py +0 -0
  630. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/pr_checks_status.py +0 -0
  631. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/pr_merge.py +0 -0
  632. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/pr_poll_ready.py +0 -0
  633. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/pr_state.py +0 -0
  634. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/repo_resolution.py +0 -0
  635. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/request_copilot_review.py +0 -0
  636. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/rerun_checks.py +0 -0
  637. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/resolve_review_threads.py +0 -0
  638. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/review_reply.py +0 -0
  639. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/github/state_helpers.py +0 -0
  640. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/__init__.py +0 -0
  641. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/adf.py +0 -0
  642. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/async_commands.py +0 -0
  643. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/async_status.py +0 -0
  644. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/commands.py +0 -0
  645. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/comment_commands.py +0 -0
  646. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/config.py +0 -0
  647. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/create_commands.py +0 -0
  648. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/formatting.py +0 -0
  649. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/get_commands.py +0 -0
  650. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/helpers.py +0 -0
  651. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/parse_error_report.py +0 -0
  652. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/role_commands.py +0 -0
  653. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/state_helpers.py +0 -0
  654. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/update_commands.py +0 -0
  655. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/jira/vpn_wrapper.py +0 -0
  656. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/network/__init__.py +0 -0
  657. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/network/commands.py +0 -0
  658. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/network/detection.py +0 -0
  659. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/release/__init__.py +0 -0
  660. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/release/commands.py +0 -0
  661. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/release/helpers.py +0 -0
  662. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/review/__init__.py +0 -0
  663. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/review/commands.py +0 -0
  664. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/review/config_commands.py +0 -0
  665. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/review/consolidate.py +0 -0
  666. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/review/dispatch.py +0 -0
  667. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/review/status.py +0 -0
  668. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/runner.py +0 -0
  669. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/__init__.py +0 -0
  670. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/commands.py +0 -0
  671. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/copilot_cli_installer.py +0 -0
  672. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/dependency_checker.py +0 -0
  673. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/gh_cli_installer.py +0 -0
  674. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/gitignore_negations.py +0 -0
  675. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/platform_detection.py +0 -0
  676. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/pr_workflow.py +0 -0
  677. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/__init__.py +0 -0
  678. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/atomic_write.py +0 -0
  679. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/complete_setup.py +0 -0
  680. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/configured_setup.py +0 -0
  681. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/constants.py +0 -0
  682. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/gitignore_updater.py +0 -0
  683. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/legacy_migration.py +0 -0
  684. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/repo_specific.py +0 -0
  685. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/required_setup.py +0 -0
  686. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/script_generators/root_entry_point.py +0 -0
  687. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/shell_profile.py +0 -0
  688. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/templates/README.md +0 -0
  689. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/templates/review-pr.py +0 -0
  690. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/templates/work-on-issue.py +0 -0
  691. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/version_guard.py +0 -0
  692. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/setup/workflow_templates.py +0 -0
  693. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/__init__.py +0 -0
  694. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/commands.py +0 -0
  695. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/cross_ref.py +0 -0
  696. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_e2/__init__.py +0 -0
  697. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_e2/constants.py +0 -0
  698. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_e2/coverage_mapper.py +0 -0
  699. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_e2/models.py +0 -0
  700. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_e2/reporter.py +0 -0
  701. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_e2/spec_parser.py +0 -0
  702. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_e2/task_classifier.py +0 -0
  703. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_e2/validator.py +0 -0
  704. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/__init__.py +0 -0
  705. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/classifier.py +0 -0
  706. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/constants.py +0 -0
  707. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/extractors/__init__.py +0 -0
  708. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/extractors/base.py +0 -0
  709. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/extractors/python_extractor.py +0 -0
  710. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/intent_detector.py +0 -0
  711. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/inventory.py +0 -0
  712. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/matcher.py +0 -0
  713. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/models.py +0 -0
  714. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/reference_extractor.py +0 -0
  715. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/pass_g/reporter.py +0 -0
  716. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/validate_checklists.py +0 -0
  717. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/speckit/validate_frs.py +0 -0
  718. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/state.py +0 -0
  719. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/subprocess_utils.py +0 -0
  720. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/tasks/__init__.py +0 -0
  721. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/tasks/commands.py +0 -0
  722. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/testing.py +0 -0
  723. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/vpn/__init__.py +0 -0
  724. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/vpn/commands.py +0 -0
  725. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/vpn/runner.py +0 -0
  726. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/vscode_tasks.py +0 -0
  727. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/__init__.py +0 -0
  728. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/advancement.py +0 -0
  729. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/applied_suggestions.py +0 -0
  730. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/base.py +0 -0
  731. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/checklist.py +0 -0
  732. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/commands.py +0 -0
  733. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/engine_resolution.py +0 -0
  734. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/manager.py +0 -0
  735. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/preflight.py +0 -0
  736. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/cli/workflows/worktree_setup.py +0 -0
  737. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/config.py +0 -0
  738. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/context/__init__.py +0 -0
  739. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/context/models.py +0 -0
  740. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/context/nodes.py +0 -0
  741. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/context/retriever.py +0 -0
  742. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/context_budget.py +0 -0
  743. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/file_locking.py +0 -0
  744. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/mcp/__init__.py +0 -0
  745. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/mcp/server.py +0 -0
  746. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/__init__.py +0 -0
  747. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/checkpointing.py +0 -0
  748. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/graph_builder.py +0 -0
  749. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/pilot_workflow.py +0 -0
  750. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/review/__init__.py +0 -0
  751. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/review/graph_builder.py +0 -0
  752. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/review/nodes.py +0 -0
  753. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/review/preflight.py +0 -0
  754. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/review/runner.py +0 -0
  755. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/review/state_schema.py +0 -0
  756. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/runner.py +0 -0
  757. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/orchestration/state_schema.py +0 -0
  758. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/__init__.py +0 -0
  759. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/apply-pull-request-review-suggestions/default-initiate-prompt.md +0 -0
  760. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/break-down-issue-into-subtasks/default-initiate-prompt.md +0 -0
  761. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/ci/__init__.py +0 -0
  762. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/ci/exhausted-comment.md +0 -0
  763. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/ci/merge-failed-comment.md +0 -0
  764. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/ci/ready-no-merge-comment.md +0 -0
  765. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/ci/timeout-comment.md +0 -0
  766. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/create-jira-epic/default-initiate-prompt.md +0 -0
  767. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/create-jira-issue/default-initiate-prompt.md +0 -0
  768. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/create-jira-subtask/default-initiate-prompt.md +0 -0
  769. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/loader.py +0 -0
  770. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/optimize-issue-for-ai-agent/default-initiate-prompt.md +0 -0
  771. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/pr-merge-orchestrator/default-init-prompt.md +0 -0
  772. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/pull-request-review/default-completion-prompt.md +0 -0
  773. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/pull-request-review/default-decision-prompt.md +0 -0
  774. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/pull-request-review/default-file-review-prompt.md +0 -0
  775. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/pull-request-review/default-initiate-prompt.md +0 -0
  776. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/pull-request-review/default-pull-request-overview-prompt.md +0 -0
  777. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/update-jira-issue/default-initiate-prompt.md +0 -0
  778. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/update-jira-issue/default-make-updates-prompt.md +0 -0
  779. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-checklist-creation-prompt.md +0 -0
  780. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-commit-prompt.md +0 -0
  781. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-completion-prompt.md +0 -0
  782. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-prompt.md +0 -0
  783. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-review-prompt.md +0 -0
  784. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-initiate-prompt.md +0 -0
  785. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-planning-prompt.md +0 -0
  786. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-pull-request-prompt.md +0 -0
  787. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-retrieve-prompt.md +0 -0
  788. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-setup-prompt.md +0 -0
  789. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/prompts/work-on-jira-issue/default-verification-prompt.md +0 -0
  790. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/skill_injector.py +0 -0
  791. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/state.py +0 -0
  792. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/submission_manager.py +0 -0
  793. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/submission_processor.py +0 -0
  794. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/task_state.py +0 -0
  795. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/tools/__init__.py +0 -0
  796. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/tools/azure_devops.py +0 -0
  797. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/tools/git.py +0 -0
  798. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/agentic_devtools/tools/jira.py +0 -0
  799. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/01-introduction-and-goals.md +0 -0
  800. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/02-architecture-constraints.md +0 -0
  801. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/03-system-context.md +0 -0
  802. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/04-solution-strategy.md +0 -0
  803. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/05-building-blocks.md +0 -0
  804. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/06-runtime-view.md +0 -0
  805. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/07-deployment-view.md +0 -0
  806. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/08-cross-cutting-concepts.md +0 -0
  807. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/09-architecture-decisions.md +0 -0
  808. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/10-quality-requirements.md +0 -0
  809. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/11-risks-and-technical-debt.md +0 -0
  810. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/12-glossary.md +0 -0
  811. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/README.md +0 -0
  812. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/analysis/001-orchestration-framework-evaluation.md +0 -0
  813. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-001-state-management-single-json-file.md +0 -0
  814. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-002-parameterless-command-pattern.md +0 -0
  815. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-003-background-task-execution.md +0 -0
  816. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-004-multi-worktree-support.md +0 -0
  817. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-005-workflow-state-machine-pattern.md +0 -0
  818. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-006-mermaid-diagrams.md +0 -0
  819. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-007-argparse-cli.md +0 -0
  820. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-008-pyproject-toml.md +0 -0
  821. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-009-dynamic-versioning-git-tags.md +0 -0
  822. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-010-azure-devops-primary.md +0 -0
  823. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-011-test-coverage-requirement.md +0 -0
  824. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-012-cross-platform-file-locking.md +0 -0
  825. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/architecture-decisions/ADR-013-orchestration-framework-selection.md +0 -0
  826. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/ci-secrets.md +0 -0
  827. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/copilot-commands.md +0 -0
  828. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/mcp-server.md +0 -0
  829. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/speckit-migration-inventory.md +0 -0
  830. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/state-keys.md +0 -0
  831. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/docs/workflow-prompts.md +0 -0
  832. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/pipelines/ai-review-stage.yaml +0 -0
  833. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/pyproject.toml +0 -0
  834. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/scripts/check-pr-test-coverage.py +0 -0
  835. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/scripts/check-pr-test-coverage.sh +0 -0
  836. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/scripts/run-pr-checks.sh +0 -0
  837. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/scripts/scaffold_tests.py +0 -0
  838. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/scripts/validate_test_structure.py +0 -0
  839. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/scripts/verify-agent-coverage.py +0 -0
  840. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-add-workflow-step-agents/checklists/requirements.md +0 -0
  841. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-add-workflow-step-agents/plan.md +0 -0
  842. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-add-workflow-step-agents/spec.md +0 -0
  843. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-add-workflow-step-agents/tasks.md +0 -0
  844. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-pypi-wheel-release/checklists/requirements.md +0 -0
  845. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-pypi-wheel-release/plan.md +0 -0
  846. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-pypi-wheel-release/spec.md +0 -0
  847. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-pypi-wheel-release/tasks.md +0 -0
  848. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-separate-docs/checklists/requirements.md +0 -0
  849. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-separate-docs/plan.md +0 -0
  850. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-separate-docs/spec.md +0 -0
  851. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-separate-docs/tasks.md +0 -0
  852. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-workflow-step-skills/checklists/requirements.md +0 -0
  853. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/001-workflow-step-skills/spec.md +0 -0
  854. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/002-github-action-speckit-trigger/checklists/requirements.md +0 -0
  855. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/002-github-action-speckit-trigger/plan.md +0 -0
  856. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/002-github-action-speckit-trigger/spec.md +0 -0
  857. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/002-github-action-speckit-trigger/tasks.md +0 -0
  858. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/002-github-action-speckit-trigger/workflow-sequence-diagram.md +0 -0
  859. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/003-comprehensive-e2e-smoke-tests/checklists/requirements.md +0 -0
  860. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/003-comprehensive-e2e-smoke-tests/spec.md +0 -0
  861. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/003-e2e-smoke-tests-cli/plan.md +0 -0
  862. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/005-resolve-test-suite-warnings/analysis-report.md +0 -0
  863. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/005-resolve-test-suite-warnings/checklists/requirements.md +0 -0
  864. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/005-resolve-test-suite-warnings/plan.md +0 -0
  865. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/005-resolve-test-suite-warnings/spec.md +0 -0
  866. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/005-resolve-test-suite-warnings/tasks.md +0 -0
  867. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1175-plan-phase-fails-large/analysis-report.md +0 -0
  868. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1175-plan-phase-fails-large/checklists/checklist.md +0 -0
  869. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1175-plan-phase-fails-large/checklists/requirements.md +0 -0
  870. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1175-plan-phase-fails-large/plan.md +0 -0
  871. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1175-plan-phase-fails-large/spec.md +0 -0
  872. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1175-plan-phase-fails-large/tasks.md +0 -0
  873. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1176-use-issue-number-speckit/analysis-report.md +0 -0
  874. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1176-use-issue-number-speckit/checklists/requirements.md +0 -0
  875. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1176-use-issue-number-speckit/plan.md +0 -0
  876. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1176-use-issue-number-speckit/spec.md +0 -0
  877. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1176-use-issue-number-speckit/tasks.md +0 -0
  878. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1179-enhance-agdt-analyze-workflow/analysis-report.md +0 -0
  879. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1179-enhance-agdt-analyze-workflow/checklists/requirements.md +0 -0
  880. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1179-enhance-agdt-analyze-workflow/plan.md +0 -0
  881. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1179-enhance-agdt-analyze-workflow/spec.md +0 -0
  882. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1179-enhance-agdt-analyze-workflow/tasks.md +0 -0
  883. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/.markdownlint.json +0 -0
  884. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/analysis-report.md +0 -0
  885. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/checklists/checklist.md +0 -0
  886. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/checklists/requirements.md +0 -0
  887. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/fr-coverage.json +0 -0
  888. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/plan.md +0 -0
  889. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/spec.md +0 -0
  890. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/tasks.md +0 -0
  891. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1180-split-state-directory-during/test-coverage.json +0 -0
  892. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1191-speckit-pipeline-markdownlint-validation/analysis-report.md +0 -0
  893. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1191-speckit-pipeline-markdownlint-validation/checklists/requirements.md +0 -0
  894. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1191-speckit-pipeline-markdownlint-validation/plan.md +0 -0
  895. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1191-speckit-pipeline-markdownlint-validation/spec.md +0 -0
  896. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1191-speckit-pipeline-markdownlint-validation/tasks.md +0 -0
  897. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1193-speckit-pipeline-enforce-line/analysis-report.md +0 -0
  898. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1193-speckit-pipeline-enforce-line/checklists/requirements.md +0 -0
  899. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1193-speckit-pipeline-enforce-line/plan.md +0 -0
  900. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1193-speckit-pipeline-enforce-line/spec.md +0 -0
  901. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1193-speckit-pipeline-enforce-line/tasks.md +0 -0
  902. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1194-speckit-prompts-require-language/.markdownlint.json +0 -0
  903. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1194-speckit-prompts-require-language/analysis-report.md +0 -0
  904. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1194-speckit-prompts-require-language/checklists/requirements.md +0 -0
  905. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1194-speckit-prompts-require-language/plan.md +0 -0
  906. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1194-speckit-prompts-require-language/spec.md +0 -0
  907. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1194-speckit-prompts-require-language/tasks.md +0 -0
  908. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1195-speckit-clarification-step-overwrites/.markdownlint.json +0 -0
  909. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1195-speckit-clarification-step-overwrites/analysis-report.md +0 -0
  910. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1195-speckit-clarification-step-overwrites/checklists/checklist.md +0 -0
  911. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1195-speckit-clarification-step-overwrites/checklists/requirements.md +0 -0
  912. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1195-speckit-clarification-step-overwrites/plan.md +0 -0
  913. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1195-speckit-clarification-step-overwrites/spec.md +0 -0
  914. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1195-speckit-clarification-step-overwrites/tasks.md +0 -0
  915. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1196-speckit-pipeline-auto-request/.markdownlint.json +0 -0
  916. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1196-speckit-pipeline-auto-request/analysis-report.md +0 -0
  917. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1196-speckit-pipeline-auto-request/checklists/requirements.md +0 -0
  918. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1196-speckit-pipeline-auto-request/plan.md +0 -0
  919. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1196-speckit-pipeline-auto-request/spec.md +0 -0
  920. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1196-speckit-pipeline-auto-request/tasks.md +0 -0
  921. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1197-speckit-pipeline-gate-creation/.markdownlint.json +0 -0
  922. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1197-speckit-pipeline-gate-creation/analysis-report.md +0 -0
  923. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1197-speckit-pipeline-gate-creation/checklists/requirements.md +0 -0
  924. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1197-speckit-pipeline-gate-creation/plan.md +0 -0
  925. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1197-speckit-pipeline-gate-creation/spec.md +0 -0
  926. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1197-speckit-pipeline-gate-creation/tasks.md +0 -0
  927. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1198-speckit-prompts-require-phase/.markdownlint.json +0 -0
  928. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1198-speckit-prompts-require-phase/analysis-report.md +0 -0
  929. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1198-speckit-prompts-require-phase/checklists/requirements.md +0 -0
  930. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1198-speckit-prompts-require-phase/fr-coverage.json +0 -0
  931. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1198-speckit-prompts-require-phase/plan.md +0 -0
  932. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1198-speckit-prompts-require-phase/spec.md +0 -0
  933. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1198-speckit-prompts-require-phase/tasks.md +0 -0
  934. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1199-speckit-pipeline-validate-all/.markdownlint.json +0 -0
  935. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1199-speckit-pipeline-validate-all/analysis-report.md +0 -0
  936. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1199-speckit-pipeline-validate-all/checklists/requirements.md +0 -0
  937. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1199-speckit-pipeline-validate-all/plan.md +0 -0
  938. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1199-speckit-pipeline-validate-all/spec.md +0 -0
  939. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1199-speckit-pipeline-validate-all/tasks.md +0 -0
  940. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1200-speckit-prompts-use-anchor/.markdownlint.json +0 -0
  941. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1200-speckit-prompts-use-anchor/analysis-report.md +0 -0
  942. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1200-speckit-prompts-use-anchor/checklists/requirements.md +0 -0
  943. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1200-speckit-prompts-use-anchor/plan.md +0 -0
  944. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1200-speckit-prompts-use-anchor/spec.md +0 -0
  945. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1200-speckit-prompts-use-anchor/tasks.md +0 -0
  946. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1201-speckit-pipeline-task-deduplication/.markdownlint.json +0 -0
  947. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1201-speckit-pipeline-task-deduplication/analysis-report.md +0 -0
  948. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1201-speckit-pipeline-task-deduplication/checklists/requirements.md +0 -0
  949. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1201-speckit-pipeline-task-deduplication/fr-coverage.json +0 -0
  950. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1201-speckit-pipeline-task-deduplication/plan.md +0 -0
  951. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1201-speckit-pipeline-task-deduplication/spec.md +0 -0
  952. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1201-speckit-pipeline-task-deduplication/tasks.md +0 -0
  953. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/.markdownlint.json +0 -0
  954. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/analysis-report.md +0 -0
  955. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/checklists/requirements.md +0 -0
  956. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/fixtures/sc-001/spec.md +0 -0
  957. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/fixtures/sc-001/tasks.md +0 -0
  958. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/fr-coverage.json +0 -0
  959. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/plan.md +0 -0
  960. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/spec.md +0 -0
  961. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1202-speckit-pipeline-validate-each/tasks.md +0 -0
  962. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1203-speckit-pipeline-validate-checklist/.markdownlint.json +0 -0
  963. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1203-speckit-pipeline-validate-checklist/analysis-report.md +0 -0
  964. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1203-speckit-pipeline-validate-checklist/checklists/requirements.md +0 -0
  965. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1203-speckit-pipeline-validate-checklist/fr-coverage.json +0 -0
  966. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1203-speckit-pipeline-validate-checklist/plan.md +0 -0
  967. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1203-speckit-pipeline-validate-checklist/spec.md +0 -0
  968. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1203-speckit-pipeline-validate-checklist/tasks.md +0 -0
  969. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1204-speckit-pipeline-cross-reference/.markdownlint.json +0 -0
  970. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1204-speckit-pipeline-cross-reference/analysis-report.md +0 -0
  971. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1204-speckit-pipeline-cross-reference/checklists/requirements.md +0 -0
  972. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1204-speckit-pipeline-cross-reference/fr-coverage.json +0 -0
  973. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1204-speckit-pipeline-cross-reference/plan.md +0 -0
  974. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1204-speckit-pipeline-cross-reference/spec.md +0 -0
  975. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1204-speckit-pipeline-cross-reference/tasks.md +0 -0
  976. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1215-fix-remove-invalid-yes/.markdownlint.json +0 -0
  977. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1215-fix-remove-invalid-yes/analysis-report.md +0 -0
  978. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1215-fix-remove-invalid-yes/checklists/requirements.md +0 -0
  979. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1215-fix-remove-invalid-yes/plan.md +0 -0
  980. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1215-fix-remove-invalid-yes/spec.md +0 -0
  981. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1215-fix-remove-invalid-yes/tasks.md +0 -0
  982. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1258-use-pat-copilot-review/.markdownlint.json +0 -0
  983. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1258-use-pat-copilot-review/analysis-report.md +0 -0
  984. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1258-use-pat-copilot-review/checklists/requirements.md +0 -0
  985. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1258-use-pat-copilot-review/plan.md +0 -0
  986. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1258-use-pat-copilot-review/spec.md +0 -0
  987. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1258-use-pat-copilot-review/tasks.md +0 -0
  988. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1270-finalize-review-workflow-automatic/.markdownlint.json +0 -0
  989. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1270-finalize-review-workflow-automatic/analysis-report.md +0 -0
  990. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1270-finalize-review-workflow-automatic/checklists/requirements.md +0 -0
  991. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1270-finalize-review-workflow-automatic/fr-coverage.json +0 -0
  992. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1270-finalize-review-workflow-automatic/plan.md +0 -0
  993. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1270-finalize-review-workflow-automatic/spec.md +0 -0
  994. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1270-finalize-review-workflow-automatic/tasks.md +0 -0
  995. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1270-finalize-review-workflow-automatic/test-coverage.json +0 -0
  996. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1283-update-workflow-use-github/.markdownlint.json +0 -0
  997. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1283-update-workflow-use-github/analysis-report.md +0 -0
  998. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1283-update-workflow-use-github/checklists/requirements.md +0 -0
  999. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1283-update-workflow-use-github/fr-coverage.json +0 -0
  1000. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1283-update-workflow-use-github/plan.md +0 -0
  1001. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1283-update-workflow-use-github/spec.md +0 -0
  1002. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1283-update-workflow-use-github/tasks.md +0 -0
  1003. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1300-bug-agdt-copilot-auto/.markdownlint.json +0 -0
  1004. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1300-bug-agdt-copilot-auto/analysis-report.md +0 -0
  1005. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1300-bug-agdt-copilot-auto/checklists/requirements.md +0 -0
  1006. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1300-bug-agdt-copilot-auto/fr-coverage.json +0 -0
  1007. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1300-bug-agdt-copilot-auto/plan.md +0 -0
  1008. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1300-bug-agdt-copilot-auto/spec.md +0 -0
  1009. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1300-bug-agdt-copilot-auto/tasks.md +0 -0
  1010. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1322-restructure-setup-dev-tools/.markdownlint.json +0 -0
  1011. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1322-restructure-setup-dev-tools/analysis-report.md +0 -0
  1012. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1322-restructure-setup-dev-tools/checklists/requirements.md +0 -0
  1013. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1322-restructure-setup-dev-tools/fr-coverage.json +0 -0
  1014. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1322-restructure-setup-dev-tools/plan.md +0 -0
  1015. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1322-restructure-setup-dev-tools/spec.md +0 -0
  1016. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1322-restructure-setup-dev-tools/tasks.md +0 -0
  1017. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1322-restructure-setup-dev-tools/test-coverage.json +0 -0
  1018. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1324-pin-agentic-devtools-version/.markdownlint.json +0 -0
  1019. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1324-pin-agentic-devtools-version/analysis-report.md +0 -0
  1020. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1324-pin-agentic-devtools-version/checklists/requirements.md +0 -0
  1021. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1324-pin-agentic-devtools-version/fr-coverage.json +0 -0
  1022. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1324-pin-agentic-devtools-version/plan.md +0 -0
  1023. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1324-pin-agentic-devtools-version/spec.md +0 -0
  1024. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1324-pin-agentic-devtools-version/tasks.md +0 -0
  1025. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1324-pin-agentic-devtools-version/test-coverage.json +0 -0
  1026. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1326-improve-error-handling-and/.markdownlint.json +0 -0
  1027. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1326-improve-error-handling-and/analysis-report.md +0 -0
  1028. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1326-improve-error-handling-and/checklists/requirements.md +0 -0
  1029. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1326-improve-error-handling-and/fr-coverage.json +0 -0
  1030. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1326-improve-error-handling-and/plan.md +0 -0
  1031. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1326-improve-error-handling-and/spec.md +0 -0
  1032. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1326-improve-error-handling-and/tasks.md +0 -0
  1033. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1326-improve-error-handling-and/test-coverage.json +0 -0
  1034. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1359-loop-automated-agentic-handling/.markdownlint.json +0 -0
  1035. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1359-loop-automated-agentic-handling/analysis-report.md +0 -0
  1036. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1359-loop-automated-agentic-handling/checklists/requirements.md +0 -0
  1037. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1359-loop-automated-agentic-handling/fr-coverage.json +0 -0
  1038. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1359-loop-automated-agentic-handling/plan.md +0 -0
  1039. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1359-loop-automated-agentic-handling/spec.md +0 -0
  1040. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1359-loop-automated-agentic-handling/tasks.md +0 -0
  1041. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1359-loop-automated-agentic-handling/test-coverage.json +0 -0
  1042. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1364-fix-speckit-label-operations/.markdownlint.json +0 -0
  1043. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1364-fix-speckit-label-operations/analysis-report.md +0 -0
  1044. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1364-fix-speckit-label-operations/checklists/requirements.md +0 -0
  1045. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1364-fix-speckit-label-operations/fr-coverage.json +0 -0
  1046. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1364-fix-speckit-label-operations/plan.md +0 -0
  1047. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1364-fix-speckit-label-operations/spec.md +0 -0
  1048. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1364-fix-speckit-label-operations/tasks.md +0 -0
  1049. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1364-fix-speckit-label-operations/test-coverage.json +0 -0
  1050. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1391-fix-request-copilot-review/.markdownlint.json +0 -0
  1051. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1391-fix-request-copilot-review/analysis-report.md +0 -0
  1052. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1391-fix-request-copilot-review/checklists/requirements.md +0 -0
  1053. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1391-fix-request-copilot-review/fr-coverage.json +0 -0
  1054. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1391-fix-request-copilot-review/plan.md +0 -0
  1055. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1391-fix-request-copilot-review/spec.md +0 -0
  1056. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1391-fix-request-copilot-review/tasks.md +0 -0
  1057. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1391-fix-request-copilot-review/test-coverage.json +0 -0
  1058. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1393-blocker-workflow-approval-required/.markdownlint.json +0 -0
  1059. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1393-blocker-workflow-approval-required/analysis-report.md +0 -0
  1060. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1393-blocker-workflow-approval-required/checklists/requirements.md +0 -0
  1061. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1393-blocker-workflow-approval-required/fr-coverage.json +0 -0
  1062. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1393-blocker-workflow-approval-required/plan.md +0 -0
  1063. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1393-blocker-workflow-approval-required/spec.md +0 -0
  1064. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1393-blocker-workflow-approval-required/tasks.md +0 -0
  1065. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1393-blocker-workflow-approval-required/test-coverage.json +0 -0
  1066. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1400-extract-workflow-logic-yaml/.markdownlint.json +0 -0
  1067. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1400-extract-workflow-logic-yaml/analysis-report.md +0 -0
  1068. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1400-extract-workflow-logic-yaml/checklists/requirements.md +0 -0
  1069. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1400-extract-workflow-logic-yaml/fr-coverage.json +0 -0
  1070. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1400-extract-workflow-logic-yaml/plan.md +0 -0
  1071. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1400-extract-workflow-logic-yaml/spec.md +0 -0
  1072. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1400-extract-workflow-logic-yaml/tasks.md +0 -0
  1073. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1400-extract-workflow-logic-yaml/test-coverage.json +0 -0
  1074. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1408-migrate-native-spec-kit/.markdownlint.json +0 -0
  1075. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1408-migrate-native-spec-kit/analysis-report.md +0 -0
  1076. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1408-migrate-native-spec-kit/checklists/requirements.md +0 -0
  1077. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1408-migrate-native-spec-kit/fr-coverage.json +0 -0
  1078. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1408-migrate-native-spec-kit/plan.md +0 -0
  1079. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1408-migrate-native-spec-kit/spec.md +0 -0
  1080. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1408-migrate-native-spec-kit/tasks.md +0 -0
  1081. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1408-migrate-native-spec-kit/test-coverage.json +0 -0
  1082. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1428-implement-langchain-based-pull/.markdownlint.json +0 -0
  1083. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1428-implement-langchain-based-pull/analysis-report.md +0 -0
  1084. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1428-implement-langchain-based-pull/checklists/requirements.md +0 -0
  1085. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1428-implement-langchain-based-pull/fr-coverage.json +0 -0
  1086. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1428-implement-langchain-based-pull/plan.md +0 -0
  1087. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1428-implement-langchain-based-pull/spec.md +0 -0
  1088. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1428-implement-langchain-based-pull/tasks.md +0 -0
  1089. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1428-implement-langchain-based-pull/test-coverage.json +0 -0
  1090. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/.markdownlint.json +0 -0
  1091. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/analysis-report.md +0 -0
  1092. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/checklists/requirements.md +0 -0
  1093. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/contracts/.gitkeep +0 -0
  1094. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/data-model.md +0 -0
  1095. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/fr-coverage.json +0 -0
  1096. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/plan.md +0 -0
  1097. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/quickstart.md +0 -0
  1098. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/research.md +0 -0
  1099. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/spec.md +0 -0
  1100. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/tasks.md +0 -0
  1101. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1430-langchain-based-work-issue/test-coverage.json +0 -0
  1102. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1432-standardize-copilot-review-response/.markdownlint.json +0 -0
  1103. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1432-standardize-copilot-review-response/analysis-report.md +0 -0
  1104. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1432-standardize-copilot-review-response/checklists/requirements.md +0 -0
  1105. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1432-standardize-copilot-review-response/fr-coverage.json +0 -0
  1106. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1432-standardize-copilot-review-response/plan.md +0 -0
  1107. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1432-standardize-copilot-review-response/spec.md +0 -0
  1108. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1432-standardize-copilot-review-response/tasks.md +0 -0
  1109. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1432-standardize-copilot-review-response/test-coverage.json +0 -0
  1110. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1435-second-pat-agdt-approver/.markdownlint.json +0 -0
  1111. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1435-second-pat-agdt-approver/analysis-report.md +0 -0
  1112. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1435-second-pat-agdt-approver/checklists/requirements.md +0 -0
  1113. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1435-second-pat-agdt-approver/fr-coverage.json +0 -0
  1114. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1435-second-pat-agdt-approver/plan.md +0 -0
  1115. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1435-second-pat-agdt-approver/spec.md +0 -0
  1116. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1435-second-pat-agdt-approver/tasks.md +0 -0
  1117. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1435-second-pat-agdt-approver/test-coverage.json +0 -0
  1118. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1444-monorepo-spec-kit-strategy/checklists/requirements.md +0 -0
  1119. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1444-monorepo-spec-kit-strategy/plan.md +0 -0
  1120. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1444-monorepo-spec-kit-strategy/spec.md +0 -0
  1121. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1444-monorepo-spec-kit-strategy/tasks.md +0 -0
  1122. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/.markdownlint.json +0 -0
  1123. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/analysis-report.md +0 -0
  1124. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/checklists/.gitkeep +0 -0
  1125. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/checklists/requirements.md +0 -0
  1126. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/contracts/.gitkeep +0 -0
  1127. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/fr-coverage.json +0 -0
  1128. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/plan.md +0 -0
  1129. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/spec.md +0 -0
  1130. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/tasks.md +0 -0
  1131. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1486-post-agent-copilot-review/test-coverage.json +0 -0
  1132. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/.markdownlint.json +0 -0
  1133. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/analysis-report.md +0 -0
  1134. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/checklists/.gitkeep +0 -0
  1135. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/checklists/requirements.md +0 -0
  1136. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/contracts/.gitkeep +0 -0
  1137. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/fr-coverage.json +0 -0
  1138. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/plan.md +0 -0
  1139. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/spec.md +0 -0
  1140. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/tasks.md +0 -0
  1141. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1503-improve-copilot-review-finalization/test-coverage.json +0 -0
  1142. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1505-structural-validation-and-retry/.markdownlint.json +0 -0
  1143. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1505-structural-validation-and-retry/analysis-report.md +0 -0
  1144. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1505-structural-validation-and-retry/checklists/requirements.md +0 -0
  1145. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1505-structural-validation-and-retry/fr-coverage.json +0 -0
  1146. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1505-structural-validation-and-retry/plan.md +0 -0
  1147. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1505-structural-validation-and-retry/spec.md +0 -0
  1148. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1505-structural-validation-and-retry/test-coverage.json +0 -0
  1149. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/.markdownlint.json +0 -0
  1150. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/analysis-report.md +0 -0
  1151. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/checklists/.gitkeep +0 -0
  1152. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/checklists/requirements.md +0 -0
  1153. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/contracts/.gitkeep +0 -0
  1154. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/fr-coverage.json +0 -0
  1155. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/plan.md +0 -0
  1156. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/spec.md +0 -0
  1157. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/tasks.md +0 -0
  1158. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1509-spec-loop-complete-state/test-coverage.json +0 -0
  1159. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/.markdownlint.json +0 -0
  1160. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/checklists/.gitkeep +0 -0
  1161. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/checklists/requirements.md +0 -0
  1162. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/contracts/.gitkeep +0 -0
  1163. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/data-model.md +0 -0
  1164. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/fr-coverage.json +0 -0
  1165. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/plan.md +0 -0
  1166. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/quickstart.md +0 -0
  1167. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/research.md +0 -0
  1168. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/spec.md +0 -0
  1169. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/tasks.md +0 -0
  1170. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1515-agdt-setup-generates-corrupted/test-coverage.json +0 -0
  1171. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1517-shared-review-threads-across/.markdownlint.json +0 -0
  1172. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1517-shared-review-threads-across/checklists/requirements.md +0 -0
  1173. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1517-shared-review-threads-across/contracts/.gitkeep +0 -0
  1174. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1517-shared-review-threads-across/data-model.md +0 -0
  1175. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1517-shared-review-threads-across/plan.md +0 -0
  1176. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1517-shared-review-threads-across/quickstart.md +0 -0
  1177. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1517-shared-review-threads-across/research.md +0 -0
  1178. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1517-shared-review-threads-across/spec.md +0 -0
  1179. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1518-thread-title-formatting-subsequent/.markdownlint.json +0 -0
  1180. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1518-thread-title-formatting-subsequent/checklists/requirements.md +0 -0
  1181. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1518-thread-title-formatting-subsequent/contracts/.gitkeep +0 -0
  1182. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1518-thread-title-formatting-subsequent/data-model.md +0 -0
  1183. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1518-thread-title-formatting-subsequent/plan.md +0 -0
  1184. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1518-thread-title-formatting-subsequent/quickstart.md +0 -0
  1185. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1518-thread-title-formatting-subsequent/research.md +0 -0
  1186. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1518-thread-title-formatting-subsequent/spec.md +0 -0
  1187. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1519-auto-push-force-lease/.markdownlint.json +0 -0
  1188. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1519-auto-push-force-lease/checklists/.gitkeep +0 -0
  1189. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1519-auto-push-force-lease/checklists/requirements.md +0 -0
  1190. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1519-auto-push-force-lease/contracts/.gitkeep +0 -0
  1191. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1519-auto-push-force-lease/plan.md +0 -0
  1192. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1519-auto-push-force-lease/spec.md +0 -0
  1193. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1523-review-all-files-every/.markdownlint.json +0 -0
  1194. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1523-review-all-files-every/checklists/.gitkeep +0 -0
  1195. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1523-review-all-files-every/contracts/.gitkeep +0 -0
  1196. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1523-review-all-files-every/spec.md +0 -0
  1197. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1525-parallel-safe-state-isolated/.markdownlint.json +0 -0
  1198. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1525-parallel-safe-state-isolated/checklists/.gitkeep +0 -0
  1199. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1525-parallel-safe-state-isolated/contracts/.gitkeep +0 -0
  1200. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1525-parallel-safe-state-isolated/spec.md +0 -0
  1201. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1527-consolidate-speckit-issue-trigger/.markdownlint.json +0 -0
  1202. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1527-consolidate-speckit-issue-trigger/checklists/.gitkeep +0 -0
  1203. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1527-consolidate-speckit-issue-trigger/contracts/.gitkeep +0 -0
  1204. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/1527-consolidate-speckit-issue-trigger/spec.md +0 -0
  1205. /agentic_devtools-0.2.118/tests/unit/__init__.py → /agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/checklists/.gitkeep +0 -0
  1206. /agentic_devtools-0.2.118/tests/unit/adapters/__init__.py → /agentic_devtools-0.2.120/specs/1559-refactor-loop-into-idempotent/contracts/.gitkeep +0 -0
  1207. /agentic_devtools-0.2.118/tests/unit/adapters/__init__/__init__.py → /agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/checklists/.gitkeep +0 -0
  1208. /agentic_devtools-0.2.118/tests/unit/adapters/base/__init__.py → /agentic_devtools-0.2.120/specs/1566-loop-requests-review-before/contracts/.gitkeep +0 -0
  1209. /agentic_devtools-0.2.118/tests/unit/adapters/github_adapter/__init__.py → /agentic_devtools-0.2.120/specs/1569-remove-active-session-precondition/contracts/.gitkeep +0 -0
  1210. /agentic_devtools-0.2.118/tests/unit/adapters/jira_adapter/__init__.py → /agentic_devtools-0.2.120/specs/1575-copilot-agent-fallback-speckit/checklists/.gitkeep +0 -0
  1211. /agentic_devtools-0.2.118/tests/unit/adapters/markdown_adapter/__init__.py → /agentic_devtools-0.2.120/specs/1575-copilot-agent-fallback-speckit/contracts/.gitkeep +0 -0
  1212. /agentic_devtools-0.2.118/tests/unit/agdt_gitignore/__init__.py → /agentic_devtools-0.2.120/specs/1580-update-constitution-align-new/checklists/.gitkeep +0 -0
  1213. /agentic_devtools-0.2.118/tests/unit/background_tasks/__init__.py → /agentic_devtools-0.2.120/specs/1580-update-constitution-align-new/contracts/.gitkeep +0 -0
  1214. /agentic_devtools-0.2.118/tests/unit/cli/__init__.py → /agentic_devtools-0.2.120/specs/1594-feature-abstract-title-body/checklists/.gitkeep +0 -0
  1215. /agentic_devtools-0.2.118/tests/unit/cli/activity_log/__init__.py → /agentic_devtools-0.2.120/specs/1594-feature-abstract-title-body/contracts/.gitkeep +0 -0
  1216. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/specs/README.md +0 -0
  1217. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/README.md +0 -0
  1218. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/__init__.py +0 -0
  1219. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_context/__init__.py +0 -0
  1220. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_context/test_commands.py +0 -0
  1221. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_context/test_config.py +0 -0
  1222. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_context/test_management.py +0 -0
  1223. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/__init__.py +0 -0
  1224. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/conftest.py +0 -0
  1225. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_async_commands.py +0 -0
  1226. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_auth.py +0 -0
  1227. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_commands_api.py +0 -0
  1228. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_commands_dry_run.py +0 -0
  1229. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_config.py +0 -0
  1230. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_file_review_commands.py +0 -0
  1231. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_helpers.py +0 -0
  1232. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_mark_reviewed.py +0 -0
  1233. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_pipeline_commands.py +0 -0
  1234. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_pr_summary_commands.py +0 -0
  1235. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_pull_request_details_commands.py +0 -0
  1236. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_review_commands.py +0 -0
  1237. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_run_details_commands.py +0 -0
  1238. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/azure_devops/test_vpn_toggle.py +0 -0
  1239. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/cli/test_azure_app_insights_commands.py +0 -0
  1240. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/cli/test_azure_auth.py +0 -0
  1241. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/cli/test_azure_config.py +0 -0
  1242. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/conftest.py +0 -0
  1243. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/README.md +0 -0
  1244. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/__init__.py +0 -0
  1245. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/conftest.py +0 -0
  1246. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/fixtures/cassettes/azure_devops_create_pr.yaml +0 -0
  1247. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/fixtures/cassettes/jira_add_comment.yaml +0 -0
  1248. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/fixtures/cassettes/jira_get_issue.yaml +0 -0
  1249. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/test_azure_devops_commands_e2e.py +0 -0
  1250. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/test_git_commands_e2e.py +0 -0
  1251. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/test_jira_commands_e2e.py +0 -0
  1252. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/e2e_smoke/test_speckit_packages_e2e.py +0 -0
  1253. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/README.md +0 -0
  1254. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/golden_issues_labeled.json +0 -0
  1255. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/golden_pull_request.json +0 -0
  1256. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/golden_pull_request_review.json +0 -0
  1257. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/golden_workflow_run.json +0 -0
  1258. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/issue_comment_created.json +0 -0
  1259. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/issues_labeled.json +0 -0
  1260. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/pull_request_opened.json +0 -0
  1261. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/pull_request_review_submitted.json +0 -0
  1262. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/pull_request_synchronize.json +0 -0
  1263. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/fixtures/ci_events/workflow_run_completed.json +0 -0
  1264. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/helpers.py +0 -0
  1265. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/network/test_detection.py +0 -0
  1266. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/network/test_network_cli.py +0 -0
  1267. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_file_review_commands.py +0 -0
  1268. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_file_review_queue_management.py +0 -0
  1269. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_git_async.py +0 -0
  1270. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_git_commands.py +0 -0
  1271. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_git_core.py +0 -0
  1272. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_git_diff.py +0 -0
  1273. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_git_operations.py +0 -0
  1274. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_git_utilities.py +0 -0
  1275. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_no_scripts_temp_references.py +0 -0
  1276. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_release_commands.py +0 -0
  1277. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_release_helpers.py +0 -0
  1278. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_release_integration.py +0 -0
  1279. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_scaffold_tests.py +0 -0
  1280. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_validate_test_structure.py +0 -0
  1281. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/test_version.py +0 -0
  1282. {agentic_devtools-0.2.118/tests/unit/cli/analysis → agentic_devtools-0.2.120/tests/unit}/__init__.py +0 -0
  1283. {agentic_devtools-0.2.118/tests/unit/cli/analysis/external_context → agentic_devtools-0.2.120/tests/unit/adapters/__init__}/__init__.py +0 -0
  1284. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/adapters/__init__/test_get_adapter.py +0 -0
  1285. {agentic_devtools-0.2.118/tests/unit/cli/analysis/context_resolver → agentic_devtools-0.2.120/tests/unit/adapters}/__init__.py +0 -0
  1286. {agentic_devtools-0.2.118/tests/unit/cli/analysis/identity_scanner → agentic_devtools-0.2.120/tests/unit/adapters/base}/__init__.py +0 -0
  1287. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/adapters/base/test_issueadapter.py +0 -0
  1288. {agentic_devtools-0.2.118/tests/unit/cli/azure → agentic_devtools-0.2.120/tests/unit/adapters/github_adapter}/__init__.py +0 -0
  1289. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/adapters/github_adapter/test_githubissuesadapter.py +0 -0
  1290. {agentic_devtools-0.2.118/tests/unit/cli/azure/app_insights_commands → agentic_devtools-0.2.120/tests/unit/adapters/jira_adapter}/__init__.py +0 -0
  1291. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/adapters/jira_adapter/test_jiraadapter.py +0 -0
  1292. {agentic_devtools-0.2.118/tests/unit/cli/azure/auth → agentic_devtools-0.2.120/tests/unit/adapters/markdown_adapter}/__init__.py +0 -0
  1293. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/adapters/markdown_adapter/test_markdownadapter.py +0 -0
  1294. {agentic_devtools-0.2.118/tests/unit/cli/azure/config → agentic_devtools-0.2.120/tests/unit/agdt_gitignore}/__init__.py +0 -0
  1295. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/agdt_gitignore/test_ensure_agdt_gitignore.py +0 -0
  1296. {agentic_devtools-0.2.118/tests/unit/cli/azure_context → agentic_devtools-0.2.120/tests/unit/background_tasks}/__init__.py +0 -0
  1297. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/background_tasks/test_cleanup_old_logs.py +0 -0
  1298. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/background_tasks/test_create_log_file_path.py +0 -0
  1299. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/background_tasks/test_get_task_log_content.py +0 -0
  1300. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/background_tasks/test_run_function_in_background.py +0 -0
  1301. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/background_tasks/test_run_in_background.py +0 -0
  1302. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/background_tasks/test_wait_for_task.py +0 -0
  1303. {agentic_devtools-0.2.118/tests/unit/cli/azure_context/commands → agentic_devtools-0.2.120/tests/unit/cli}/__init__.py +0 -0
  1304. {agentic_devtools-0.2.118/tests/unit/cli/azure_context/config → agentic_devtools-0.2.120/tests/unit/cli/activity_log}/__init__.py +0 -0
  1305. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/activity_log/test_activity_log.py +0 -0
  1306. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/activity_log/test_activity_log_entry.py +0 -0
  1307. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/activity_log/test_get_activity_log_file_path.py +0 -0
  1308. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/activity_log/test_load_activity_log.py +0 -0
  1309. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/activity_log/test_load_from_branch.py +0 -0
  1310. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/activity_log/test_save_activity_log.py +0 -0
  1311. {agentic_devtools-0.2.118/tests/unit/cli/azure_context/management → agentic_devtools-0.2.120/tests/unit/cli/analysis}/__init__.py +0 -0
  1312. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops → agentic_devtools-0.2.120/tests/unit/cli/analysis/context_resolver}/__init__.py +0 -0
  1313. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/context_resolver/test_list_worktree_state_dirs.py +0 -0
  1314. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/context_resolver/test_resolve_analysis_context.py +0 -0
  1315. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/context_resolver/test_resolve_analysis_context_edge_cases.py +0 -0
  1316. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/context_resolver/test_resolve_analysis_context_errors.py +0 -0
  1317. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/approve_files → agentic_devtools-0.2.120/tests/unit/cli/analysis/external_context}/__init__.py +0 -0
  1318. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/external_context/test__discover_worktrees.py +0 -0
  1319. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/external_context/test__read_log_excerpt.py +0 -0
  1320. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/external_context/test_build_external_context_field.py +0 -0
  1321. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/external_context/test_collect_external_context.py +0 -0
  1322. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/async_commands → agentic_devtools-0.2.120/tests/unit/cli/analysis/identity_scanner}/__init__.py +0 -0
  1323. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/identity_scanner/test_format_evidence_prefix.py +0 -0
  1324. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/identity_scanner/test_list_identity_directories.py +0 -0
  1325. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/identity_scanner/test_scan_identity_logs.py +0 -0
  1326. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/identity_scanner/test_scan_identity_logs_determinism.py +0 -0
  1327. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/analysis/identity_scanner/test_scan_identity_logs_performance.py +0 -0
  1328. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/auth → agentic_devtools-0.2.120/tests/unit/cli/azure}/__init__.py +0 -0
  1329. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/batch_review_helpers → agentic_devtools-0.2.120/tests/unit/cli/azure/app_insights_commands}/__init__.py +0 -0
  1330. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/app_insights_commands/test_query_app_insights.py +0 -0
  1331. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/app_insights_commands/test_query_app_insights_async.py +0 -0
  1332. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_errors.py +0 -0
  1333. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_errors_async.py +0 -0
  1334. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_provisioning.py +0 -0
  1335. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_provisioning_async.py +0 -0
  1336. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_timeline.py +0 -0
  1337. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_timeline_async.py +0 -0
  1338. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/commands → agentic_devtools-0.2.120/tests/unit/cli/azure/auth}/__init__.py +0 -0
  1339. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/auth/test_detect_account_type.py +0 -0
  1340. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/auth/test_ensure_azure_account.py +0 -0
  1341. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/auth/test_get_current_azure_account.py +0 -0
  1342. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/auth/test_is_aza_account.py +0 -0
  1343. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/auth/test_switch_azure_account.py +0 -0
  1344. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/auth/test_verify_azure_cli.py +0 -0
  1345. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops → agentic_devtools-0.2.120/tests/unit/cli/azure}/config/__init__.py +0 -0
  1346. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/config/test_get_account_for_environment.py +0 -0
  1347. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure/config/test_get_app_insights_config.py +0 -0
  1348. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/file_review_commands → agentic_devtools-0.2.120/tests/unit/cli/azure_context}/__init__.py +0 -0
  1349. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization → agentic_devtools-0.2.120/tests/unit/cli/azure_context/commands}/__init__.py +0 -0
  1350. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/commands/test_azure_context_current_command.py +0 -0
  1351. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/commands/test_azure_context_ensure_login_command.py +0 -0
  1352. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/commands/test_azure_context_status_command.py +0 -0
  1353. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/commands/test_azure_context_use_command.py +0 -0
  1354. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/classification → agentic_devtools-0.2.120/tests/unit/cli/azure_context/config}/__init__.py +0 -0
  1355. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/config/test_get_context_config.py +0 -0
  1356. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/convergence → agentic_devtools-0.2.120/tests/unit/cli/azure_context/management}/__init__.py +0 -0
  1357. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/management/test_check_login_status.py +0 -0
  1358. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/management/test_ensure_logged_in.py +0 -0
  1359. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/management/test_get_context_env.py +0 -0
  1360. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/management/test_get_current_context.py +0 -0
  1361. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/management/test_run_with_context.py +0 -0
  1362. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/management/test_show_all_contexts.py +0 -0
  1363. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_context/management/test_switch_context.py +0 -0
  1364. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/identity → agentic_devtools-0.2.120/tests/unit/cli/azure_devops}/__init__.py +0 -0
  1365. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/models → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/approve_files}/__init__.py +0 -0
  1366. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/approve_files/test_approve_files_cli.py +0 -0
  1367. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/orchestrator → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/async_commands}/__init__.py +0 -0
  1368. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/_helpers.py +0 -0
  1369. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test__require_int_value.py +0 -0
  1370. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_add_pull_request_comment_async.py +0 -0
  1371. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_add_pull_request_comment_async_cli.py +0 -0
  1372. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_approve_file_async.py +0 -0
  1373. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_approve_file_async_cli.py +0 -0
  1374. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_approve_pull_request_async.py +0 -0
  1375. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_approve_pull_request_async_cli.py +0 -0
  1376. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_checkout_and_sync_branch_async.py +0 -0
  1377. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_confirm_suggestion_addressed_async.py +0 -0
  1378. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_create_pipeline_async.py +0 -0
  1379. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_create_pull_request_async.py +0 -0
  1380. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_create_pull_request_async_cli.py +0 -0
  1381. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_generate_review_prompts_async.py +0 -0
  1382. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_get_pipeline_id_async.py +0 -0
  1383. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_details_async.py +0 -0
  1384. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_threads_async.py +0 -0
  1385. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_threads_async_cli.py +0 -0
  1386. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_get_run_details_async.py +0 -0
  1387. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_list_pipelines_async.py +0 -0
  1388. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_lookup_jira_issue_from_pr_async.py +0 -0
  1389. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_lookup_pr_from_jira_issue_async.py +0 -0
  1390. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_mark_file_reviewed_async.py +0 -0
  1391. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_mark_pull_request_draft_async.py +0 -0
  1392. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_publish_pull_request_async.py +0 -0
  1393. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_reject_suggestion_resolution_async.py +0 -0
  1394. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_reply_to_pull_request_thread_async.py +0 -0
  1395. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_reply_to_pull_request_thread_async_cli.py +0 -0
  1396. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_request_changes_async.py +0 -0
  1397. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_request_changes_async_cli.py +0 -0
  1398. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_request_changes_with_suggestion_async.py +0 -0
  1399. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_request_changes_with_suggestion_async_cli.py +0 -0
  1400. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_resolve_thread_async.py +0 -0
  1401. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_resolve_thread_async_cli.py +0 -0
  1402. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_run_e2e_tests_fabric_async.py +0 -0
  1403. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_run_e2e_tests_synapse_async.py +0 -0
  1404. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_run_wb_patch_async.py +0 -0
  1405. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_setup_pull_request_review_async.py +0 -0
  1406. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_submit_reviews_async.py +0 -0
  1407. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_submit_reviews_cli.py +0 -0
  1408. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_update_pipeline_async.py +0 -0
  1409. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/async_commands/test_wait_for_run_async.py +0 -0
  1410. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/repair → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/auth}/__init__.py +0 -0
  1411. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/auth/test_get_auth_headers.py +0 -0
  1412. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/auth/test_get_pat.py +0 -0
  1413. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/reporting → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/batch_review_helpers}/__init__.py +0 -0
  1414. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/batch_review_helpers/test__is_empty_or_whitespace.py +0 -0
  1415. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/batch_review_helpers/test__validate_suggestion_fields.py +0 -0
  1416. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/batch_review_helpers/test_resolve_batch_reviews.py +0 -0
  1417. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/batch_review_helpers/test_validate_batch_reviews.py +0 -0
  1418. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/verification → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/commands}/__init__.py +0 -0
  1419. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test__extract_issue_key_from_branch.py +0 -0
  1420. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_add_pull_request_comment.py +0 -0
  1421. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_approve_pull_request.py +0 -0
  1422. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_create_pull_request.py +0 -0
  1423. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_get_pull_request_threads.py +0 -0
  1424. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_mark_pull_request_draft.py +0 -0
  1425. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_parse_bool_from_state.py +0 -0
  1426. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_publish_pull_request.py +0 -0
  1427. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_reply_to_pull_request_thread.py +0 -0
  1428. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_require_content.py +0 -0
  1429. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_resolve_thread.py +0 -0
  1430. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/commands/test_update_review_narrative.py +0 -0
  1431. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/helpers → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/config}/__init__.py +0 -0
  1432. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/config/test__parse_azure_devops_context_from_remote_url.py +0 -0
  1433. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/config/test_azure_devops_config.py +0 -0
  1434. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/config/test_constants.py +0 -0
  1435. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/config/test_get_azure_devops_context_from_git_remote.py +0 -0
  1436. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/config/test_get_repository_name_from_git_remote.py +0 -0
  1437. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/conftest.py +0 -0
  1438. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/mark_reviewed → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/file_review_commands}/__init__.py +0 -0
  1439. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test__complete_active_session.py +0 -0
  1440. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test__get_attribution_params.py +0 -0
  1441. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test__get_queue_path.py +0 -0
  1442. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test__process_file_parallel.py +0 -0
  1443. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test__update_queue_after_review.py +0 -0
  1444. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test__validate_suggestion_fields.py +0 -0
  1445. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test_approve_file.py +0 -0
  1446. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test_get_queue_status.py +0 -0
  1447. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test_print_next_file_prompt.py +0 -0
  1448. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test_request_changes.py +0 -0
  1449. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test_request_changes_with_suggestion.py +0 -0
  1450. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test_submit_reviews.py +0 -0
  1451. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/file_review_commands/test_trigger_in_progress_for_file.py +0 -0
  1452. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/marker → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization}/__init__.py +0 -0
  1453. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/pipeline_commands → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization/classification}/__init__.py +0 -0
  1454. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/classification/test__extract_first_comment.py +0 -0
  1455. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/classification/test__get_author_id.py +0 -0
  1456. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/classification/test__process_thread_first_comment.py +0 -0
  1457. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/classification/test__scan_activity_log_replies.py +0 -0
  1458. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/classification/test_classify_eligible_comments.py +0 -0
  1459. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/pr_summary_commands → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization/convergence}/__init__.py +0 -0
  1460. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/convergence/test__compute_activity_log_content.py +0 -0
  1461. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/convergence/test__compute_file_summary_content.py +0 -0
  1462. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/convergence/test__compute_overall_summary_content.py +0 -0
  1463. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/convergence/test_check_convergence.py +0 -0
  1464. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/convergence/test_compute_expected_content.py +0 -0
  1465. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/convergence/test_normalize_for_comparison.py +0 -0
  1466. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/pull_request_details_commands → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization/identity}/__init__.py +0 -0
  1467. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/identity/test_resolve_pat_identity.py +0 -0
  1468. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/request_changes_batch → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization/models}/__init__.py +0 -0
  1469. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/models/test_comment_key.py +0 -0
  1470. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/models/test_finalizationreport.py +0 -0
  1471. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_attribution → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization/orchestrator}/__init__.py +0 -0
  1472. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/orchestrator/test__build_report.py +0 -0
  1473. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/orchestrator/test__check_timeout.py +0 -0
  1474. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/orchestrator/test__collect_all_comments.py +0 -0
  1475. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/orchestrator/test__count_eligible.py +0 -0
  1476. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/orchestrator/test__fetch_threads.py +0 -0
  1477. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/orchestrator/test_run_finalization_pass.py +0 -0
  1478. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_commands → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization/repair}/__init__.py +0 -0
  1479. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/repair/test__cascade_overall_summary.py +0 -0
  1480. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/repair/test__complete_activity_log.py +0 -0
  1481. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/repair/test__patch_file_thread_status.py +0 -0
  1482. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/repair/test__targeted_repair_activity_log.py +0 -0
  1483. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/repair/test_batch_repair_pass.py +0 -0
  1484. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/repair/test_targeted_repair.py +0 -0
  1485. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_config → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization/reporting}/__init__.py +0 -0
  1486. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/reporting/test_build_finalization_report.py +0 -0
  1487. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_helpers → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/finalization/verification}/__init__.py +0 -0
  1488. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/verification/test__collect_all_comments.py +0 -0
  1489. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/verification/test__fetch_comment_content.py +0 -0
  1490. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/finalization/verification/test_verify_convergence.py +0 -0
  1491. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_jira → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/helpers}/__init__.py +0 -0
  1492. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test__get_repository_id_via_rest.py +0 -0
  1493. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_build_thread_context.py +0 -0
  1494. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_convert_to_pull_request_title.py +0 -0
  1495. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_find_jira_issue_from_pr.py +0 -0
  1496. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_find_pr_from_jira_issue.py +0 -0
  1497. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_find_pull_request_by_issue_key.py +0 -0
  1498. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_get_pull_request_changed_files.py +0 -0
  1499. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_get_pull_request_details.py +0 -0
  1500. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_get_pull_request_source_branch.py +0 -0
  1501. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_get_repository_id.py +0 -0
  1502. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_parse_bool_from_state_value.py +0 -0
  1503. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_parse_json_response.py +0 -0
  1504. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_patch_comment.py +0 -0
  1505. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_patch_thread_status.py +0 -0
  1506. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_print_threads.py +0 -0
  1507. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_require_content.py +0 -0
  1508. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_require_requests.py +0 -0
  1509. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_resolve_review_artifact_dir_name.py +0 -0
  1510. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_resolve_thread_by_id.py +0 -0
  1511. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/helpers/test_verify_az_cli.py +0 -0
  1512. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_models_config → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/mark_reviewed}/__init__.py +0 -0
  1513. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/mark_reviewed/test_cachedreviewercontext.py +0 -0
  1514. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/mark_reviewed/test_fetch_reviewer_context.py +0 -0
  1515. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/mark_reviewed/test_mark_file_reviewed.py +0 -0
  1516. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/mark_reviewed/test_mark_file_reviewed_cli.py +0 -0
  1517. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/mark_reviewed/test_normalize_repo_path.py +0 -0
  1518. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/mark_reviewed/test_set_batch_context.py +0 -0
  1519. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_prompts → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/marker}/__init__.py +0 -0
  1520. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/marker/test__get_first_comment_content.py +0 -0
  1521. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/marker/test_build_marker.py +0 -0
  1522. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/marker/test_classify_agdt_threads.py +0 -0
  1523. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/marker/test_filter_agdt_threads.py +0 -0
  1524. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/marker/test_has_agdt_marker.py +0 -0
  1525. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/marker/test_parse_marker.py +0 -0
  1526. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/marker/test_strip_marker_line.py +0 -0
  1527. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_scaffold → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/pipeline_commands}/__init__.py +0 -0
  1528. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pipeline_commands/test_create_pipeline.py +0 -0
  1529. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pipeline_commands/test_get_pipeline_id.py +0 -0
  1530. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pipeline_commands/test_list_pipelines.py +0 -0
  1531. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pipeline_commands/test_run_e2e_tests_fabric.py +0 -0
  1532. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pipeline_commands/test_run_e2e_tests_synapse.py +0 -0
  1533. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pipeline_commands/test_run_wb_patch.py +0 -0
  1534. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pipeline_commands/test_update_pipeline.py +0 -0
  1535. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_state → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/pr_summary_commands}/__init__.py +0 -0
  1536. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pr_summary_commands/test_generate_overarching_pr_comments.py +0 -0
  1537. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pr_summary_commands/test_generate_overarching_pr_comments_cli.py +0 -0
  1538. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_templates → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/pull_request_details_commands}/__init__.py +0 -0
  1539. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_change_tracking_id_for_file.py +0 -0
  1540. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_current_user_id.py +0 -0
  1541. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_iteration_change_tracking_map.py +0 -0
  1542. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_iteration_changes.py +0 -0
  1543. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_details.py +0 -0
  1544. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_iterations.py +0 -0
  1545. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_threads.py +0 -0
  1546. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_reviewer_payload.py +0 -0
  1547. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_viewed_files_via_contribution.py +0 -0
  1548. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_invoke_ado_rest.py +0 -0
  1549. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/pull_request_details_commands/test_invoke_ado_rest_post.py +0 -0
  1550. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/run_details_commands → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/request_changes_batch}/__init__.py +0 -0
  1551. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/request_changes_batch/test_request_changes_batch_cli.py +0 -0
  1552. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/status_cascade → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_attribution}/__init__.py +0 -0
  1553. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_attribution/test_build_commit_file_url.py +0 -0
  1554. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_attribution/test_build_commit_folder_url.py +0 -0
  1555. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_attribution/test_build_commit_pr_url.py +0 -0
  1556. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_attribution/test_format_status.py +0 -0
  1557. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_attribution/test_get_model_icon.py +0 -0
  1558. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_attribution/test_render_attribution_line.py +0 -0
  1559. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_attribution/test_should_use_emoji.py +0 -0
  1560. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/suggestion_commands → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_commands}/__init__.py +0 -0
  1561. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_build_reviewed_paths_set.py +0 -0
  1562. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_checkout_and_sync_branch.py +0 -0
  1563. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_convert_to_prompt_filename.py +0 -0
  1564. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_extract_jira_issue_key_from_title.py +0 -0
  1565. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_fetch_and_display_jira_issue.py +0 -0
  1566. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_fetch_pull_request_basic_info.py +0 -0
  1567. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_filter_threads.py +0 -0
  1568. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_generate_review_prompts.py +0 -0
  1569. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_get_jira_issue_key_from_state.py +0 -0
  1570. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_get_linked_pull_request_from_jira.py +0 -0
  1571. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_get_pull_request_id_from_state.py +0 -0
  1572. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_get_root_folder.py +0 -0
  1573. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_get_threads_for_file.py +0 -0
  1574. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_normalize_repo_path.py +0 -0
  1575. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_print_review_instructions.py +0 -0
  1576. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_scaffold_threads_for_review.py +0 -0
  1577. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_setup_pull_request_review.py +0 -0
  1578. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_commands/test_write_file_prompt.py +0 -0
  1579. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/suggestion_verification → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_config}/__init__.py +0 -0
  1580. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_config/test__matches_pattern.py +0 -0
  1581. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_config/test__parse_int_field.py +0 -0
  1582. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_config/test_compute_mechanical_consensus.py +0 -0
  1583. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_config/test_default_review_config.py +0 -0
  1584. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_config/test_filter_files.py +0 -0
  1585. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_config/test_load_review_config.py +0 -0
  1586. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_config/test_resolve_trigger_overrides.py +0 -0
  1587. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_config/test_reviewconfig.py +0 -0
  1588. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/verdict_protocol → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_helpers}/__init__.py +0 -0
  1589. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_build_full_file_content_section.py +0 -0
  1590. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_build_reviewed_paths_set.py +0 -0
  1591. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_convert_to_prompt_filename.py +0 -0
  1592. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_extract_jira_issue_key_from_title.py +0 -0
  1593. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_filter_threads.py +0 -0
  1594. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_get_agdt_threads.py +0 -0
  1595. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_get_language_from_extension.py +0 -0
  1596. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_get_root_folder.py +0 -0
  1597. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_get_threads_for_file.py +0 -0
  1598. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_is_binary_file.py +0 -0
  1599. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_normalize_repo_path.py +0 -0
  1600. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_helpers/test_resolve_repository_root.py +0 -0
  1601. {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/vpn_toggle → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_jira}/__init__.py +0 -0
  1602. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test__get_jira_ssl_verify.py +0 -0
  1603. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_display_jira_issue_summary.py +0 -0
  1604. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_extract_linked_pr_from_issue.py +0 -0
  1605. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_extract_pr_id_from_development_panel.py +0 -0
  1606. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_fetch_and_display_jira_issue.py +0 -0
  1607. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_fetch_development_panel_prs.py +0 -0
  1608. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_fetch_jira_issue.py +0 -0
  1609. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_get_jira_credentials.py +0 -0
  1610. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_get_linked_pull_request_from_jira.py +0 -0
  1611. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_jira/test_get_pr_from_development_panel.py +0 -0
  1612. {agentic_devtools-0.2.118/tests/unit/cli/cert_utils → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_models_config}/__init__.py +0 -0
  1613. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_models_config/test_ensure_default_config.py +0 -0
  1614. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_models_config/test_load_review_models_config.py +0 -0
  1615. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_models_config/test_reviewmodelsconfig.py +0 -0
  1616. {agentic_devtools-0.2.118/tests/unit/cli/ci → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_prompts}/__init__.py +0 -0
  1617. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_prompts/test_build_file_prompt_content.py +0 -0
  1618. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_prompts/test_generate_review_prompts.py +0 -0
  1619. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_prompts/test_generate_review_prompts_edge_cases.py +0 -0
  1620. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_prompts/test_get_prompts_output_dir.py +0 -0
  1621. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_prompts/test_print_review_instructions.py +0 -0
  1622. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_prompts/test_write_file_prompt.py +0 -0
  1623. {agentic_devtools-0.2.118/tests/unit/cli/ci/ado_provider → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_scaffold}/__init__.py +0 -0
  1624. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__append_path_to_url.py +0 -0
  1625. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__build_pr_base_url.py +0 -0
  1626. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__check_session_status.py +0 -0
  1627. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__create_session.py +0 -0
  1628. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__demote_main_comment.py +0 -0
  1629. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__format_activity_log_entry.py +0 -0
  1630. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__fresh_scaffold.py +0 -0
  1631. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__get_file_name.py +0 -0
  1632. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__get_folder_for_path.py +0 -0
  1633. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__get_thread_comments.py +0 -0
  1634. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__incremental_rescaffold.py +0 -0
  1635. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__mark_stale_sessions_failed.py +0 -0
  1636. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__patch_comment_content.py +0 -0
  1637. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__post_activity_log_entry.py +0 -0
  1638. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__post_reply.py +0 -0
  1639. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__post_thread.py +0 -0
  1640. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__print_dry_run_plan.py +0 -0
  1641. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__update_activity_log_comment_status.py +0 -0
  1642. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test__validate_with_git_diff.py +0 -0
  1643. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test_detect_file_changes.py +0 -0
  1644. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test_filechangeresult.py +0 -0
  1645. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test_scaffold_idempotency_scenarios.py +0 -0
  1646. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_scaffold/test_scaffold_review_threads.py +0 -0
  1647. {agentic_devtools-0.2.118/tests/unit/cli/ci/commands → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_state}/__init__.py +0 -0
  1648. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test__atomic_write_json.py +0 -0
  1649. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test__get_lock_file_path.py +0 -0
  1650. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_add_suggestion_to_file.py +0 -0
  1651. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_clear_suggestions_for_re_review.py +0 -0
  1652. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_compute_aggregate_status.py +0 -0
  1653. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_fileentry.py +0 -0
  1654. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_fileentry_multi_model.py +0 -0
  1655. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_folderentry.py +0 -0
  1656. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_foldergroup.py +0 -0
  1657. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_get_file_entry.py +0 -0
  1658. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_get_folder_entry.py +0 -0
  1659. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_get_review_state_file_path.py +0 -0
  1660. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_load_from_branch.py +0 -0
  1661. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_load_review_state.py +0 -0
  1662. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_locking_behavior.py +0 -0
  1663. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_modelverdict.py +0 -0
  1664. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_normalize_file_path.py +0 -0
  1665. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_overallsummary.py +0 -0
  1666. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_read_modify_write_review_state.py +0 -0
  1667. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_reviewsession.py +0 -0
  1668. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_reviewstate.py +0 -0
  1669. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_reviewstate_multi_model.py +0 -0
  1670. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_reviewstatus.py +0 -0
  1671. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_save_review_state.py +0 -0
  1672. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_skippedfile.py +0 -0
  1673. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_suggestionentry.py +0 -0
  1674. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_sync_review_state_from_threads.py +0 -0
  1675. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_update_file_status.py +0 -0
  1676. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_state/test_validate_and_deserialize.py +0 -0
  1677. {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/review_templates}/__init__.py +0 -0
  1678. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_templates/test_build_discussion_url.py +0 -0
  1679. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_templates/test_render_file_summary.py +0 -0
  1680. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_templates/test_render_model_review_progress_table.py +0 -0
  1681. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/review_templates/test_render_overall_summary.py +0 -0
  1682. {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/actions → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/run_details_commands}/__init__.py +0 -0
  1683. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_build_run.py +0 -0
  1684. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_build_timeline.py +0 -0
  1685. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_failed_job_logs.py +0 -0
  1686. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_pipeline_run.py +0 -0
  1687. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_task_log.py +0 -0
  1688. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_get_failed_tasks.py +0 -0
  1689. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_get_run_details.py +0 -0
  1690. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_get_run_details_impl.py +0 -0
  1691. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_is_run_finished.py +0 -0
  1692. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_print_failed_logs_summary.py +0 -0
  1693. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_print_parameters.py +0 -0
  1694. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_print_summary.py +0 -0
  1695. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_save_json.py +0 -0
  1696. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_save_log_file.py +0 -0
  1697. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_wait_for_run.py +0 -0
  1698. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/run_details_commands/test_wait_for_run_impl.py +0 -0
  1699. {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/classifier → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/status_cascade}/__init__.py +0 -0
  1700. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/status_cascade/test_cascade_overall_summary_update.py +0 -0
  1701. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/status_cascade/test_cascade_status_update.py +0 -0
  1702. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/status_cascade/test_derive_overall_status.py +0 -0
  1703. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/status_cascade/test_execute_cascade.py +0 -0
  1704. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/status_cascade/test_patch_operation.py +0 -0
  1705. {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/command → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/suggestion_commands}/__init__.py +0 -0
  1706. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_commands/test_confirm_suggestion_addressed.py +0 -0
  1707. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_commands/test_reject_suggestion_resolution.py +0 -0
  1708. {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/diff_heuristic → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/suggestion_verification}/__init__.py +0 -0
  1709. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_verification/test_categorize_all_suggestions.py +0 -0
  1710. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_verification/test_fetch_threads_lookup.py +0 -0
  1711. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_verification/test_has_unaddressed.py +0 -0
  1712. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_verification/test_partition_results.py +0 -0
  1713. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_verification/test_render_abort_summary.py +0 -0
  1714. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_verification/test_render_unaddressed_thread_comment.py +0 -0
  1715. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_verification/test_suggestionverificationresult.py +0 -0
  1716. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/suggestion_verification/test_verify_previous_suggestions.py +0 -0
  1717. {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/lock → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/verdict_protocol}/__init__.py +0 -0
  1718. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/verdict_protocol/test_compute_file_effective_status.py +0 -0
  1719. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/verdict_protocol/test_evaluate_consolidation_need.py +0 -0
  1720. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/verdict_protocol/test_initialize_model_verdicts.py +0 -0
  1721. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/verdict_protocol/test_record_verdict.py +0 -0
  1722. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/verdict_protocol/test_render_consolidation_decision.py +0 -0
  1723. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/verdict_protocol/test_render_reviewer_addendum.py +0 -0
  1724. {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/models → agentic_devtools-0.2.120/tests/unit/cli/azure_devops/vpn_toggle}/__init__.py +0 -0
  1725. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_check_network_status.py +0 -0
  1726. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_connect_vpn.py +0 -0
  1727. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_disconnect_vpn.py +0 -0
  1728. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_ensure_jira_vpn_access.py +0 -0
  1729. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_get_corporate_network_test_host.py +0 -0
  1730. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_get_vpn_hostnames.py +0 -0
  1731. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_get_vpn_url_from_state.py +0 -0
  1732. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_is_on_corporate_network.py +0 -0
  1733. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_is_pulse_secure_installed.py +0 -0
  1734. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_is_vpn_connected.py +0 -0
  1735. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_reconnect_vpn.py +0 -0
  1736. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_smart_connect_vpn.py +0 -0
  1737. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_off_async.py +0 -0
  1738. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_off_cmd.py +0 -0
  1739. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_on_async.py +0 -0
  1740. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_on_cmd.py +0 -0
  1741. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_status_async.py +0 -0
  1742. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_status_cmd.py +0 -0
  1743. {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/snapshot → agentic_devtools-0.2.120/tests/unit/cli/cert_utils}/__init__.py +0 -0
  1744. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/cert_utils/test__print_ssl_error_help.py +0 -0
  1745. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/cert_utils/test_count_certificates_in_pem.py +0 -0
  1746. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/cert_utils/test_ensure_ca_bundle.py +0 -0
  1747. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/cert_utils/test_ensure_ca_bundle_force.py +0 -0
  1748. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/cert_utils/test_fetch_certificate_chain_openssl.py +0 -0
  1749. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/cert_utils/test_fetch_certificate_chain_ssl.py +0 -0
  1750. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/cert_utils/test_get_ssl_verify.py +0 -0
  1751. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/cert_utils/test_ssl_request_with_retry.py +0 -0
  1752. {agentic_devtools-0.2.118/tests/unit/cli/ci/exceptions → agentic_devtools-0.2.120/tests/unit/cli/ci}/__init__.py +0 -0
  1753. {agentic_devtools-0.2.118/tests/unit/cli/ci/github_provider → agentic_devtools-0.2.120/tests/unit/cli/ci/ado_provider}/__init__.py +0 -0
  1754. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/ado_provider/test_azuredevopsprovider.py +0 -0
  1755. {agentic_devtools-0.2.118/tests/unit/cli/ci/guards → agentic_devtools-0.2.120/tests/unit/cli/ci/commands}/__init__.py +0 -0
  1756. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/commands/test_ai_pr_loop_command_missing_dep.py +0 -0
  1757. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/commands/test_ci_paths_golden_smoke.py +0 -0
  1758. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/commands/test_feature_flag.py +0 -0
  1759. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/commands/test_speckit_trigger_command.py +0 -0
  1760. {agentic_devtools-0.2.118/tests/unit/cli/ci/models → agentic_devtools-0.2.120/tests/unit/cli/ci/evaluator}/__init__.py +0 -0
  1761. {agentic_devtools-0.2.118/tests/unit/cli/ci/orchestrator → agentic_devtools-0.2.120/tests/unit/cli/ci/evaluator/actions}/__init__.py +0 -0
  1762. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/actions/test_agentic_fallback.py +0 -0
  1763. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/actions/test_dispatch_action.py +0 -0
  1764. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/actions/test_no_action.py +0 -0
  1765. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/actions/test_synthesize_sentinel.py +0 -0
  1766. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/actions/test_trigger_re_review.py +0 -0
  1767. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/actions/test_verify_and_resolve.py +0 -0
  1768. {agentic_devtools-0.2.118/tests/unit/cli/ci/patch_handler → agentic_devtools-0.2.120/tests/unit/cli/ci/evaluator/classifier}/__init__.py +0 -0
  1769. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/classifier/test_classify_post_agent_state.py +0 -0
  1770. {agentic_devtools-0.2.118/tests/unit/cli/ci/provider → agentic_devtools-0.2.120/tests/unit/cli/ci/evaluator/command}/__init__.py +0 -0
  1771. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/command/test_evaluate_post_agent_state_command.py +0 -0
  1772. {agentic_devtools-0.2.118/tests/unit/cli/ci/retry → agentic_devtools-0.2.120/tests/unit/cli/ci/evaluator/diff_heuristic}/__init__.py +0 -0
  1773. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/diff_heuristic/test_check_lines_modified.py +0 -0
  1774. {agentic_devtools-0.2.118/tests/unit/cli/ci/speckit_trigger → agentic_devtools-0.2.120/tests/unit/cli/ci/evaluator/lock}/__init__.py +0 -0
  1775. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/lock/test__get_writer_token.py +0 -0
  1776. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/lock/test_acquire_lock.py +0 -0
  1777. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/lock/test_check_lock_status.py +0 -0
  1778. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/lock/test_release_lock.py +0 -0
  1779. {agentic_devtools-0.2.118/tests/unit/cli/config → agentic_devtools-0.2.120/tests/unit/cli/ci/evaluator/models}/__init__.py +0 -0
  1780. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/models/test_commentinfo.py +0 -0
  1781. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/models/test_evaluationresult.py +0 -0
  1782. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/models/test_postagentaction.py +0 -0
  1783. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/models/test_postagentclassification.py +0 -0
  1784. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/models/test_postagentsnapshot.py +0 -0
  1785. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/models/test_threadinfo.py +0 -0
  1786. {agentic_devtools-0.2.118/tests/unit/cli/config/project_config → agentic_devtools-0.2.120/tests/unit/cli/ci/evaluator/snapshot}/__init__.py +0 -0
  1787. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/snapshot/test__get_latest_agent_comment.py +0 -0
  1788. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/snapshot/test__get_review_thread_statuses.py +0 -0
  1789. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/snapshot/test__has_evaluator_sentinel_comment.py +0 -0
  1790. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/evaluator/snapshot/test_build_snapshot.py +0 -0
  1791. {agentic_devtools-0.2.118/tests/unit/cli/copilot → agentic_devtools-0.2.120/tests/unit/cli/ci/exceptions}/__init__.py +0 -0
  1792. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/exceptions/test_malformedeventerror.py +0 -0
  1793. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/exceptions/test_providerratelimiterror.py +0 -0
  1794. {agentic_devtools-0.2.118/tests/unit/cli/copilot/auto_start → agentic_devtools-0.2.120/tests/unit/cli/ci/github_provider}/__init__.py +0 -0
  1795. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__build_comment_verification_context.py +0 -0
  1796. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__build_repair_comment.py +0 -0
  1797. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__build_verification_context_diff.py +0 -0
  1798. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__clean_sdk_commit_message.py +0 -0
  1799. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__generate_commit_message_via_sdk.py +0 -0
  1800. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__has_existing_addressed_reply.py +0 -0
  1801. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__list_addressed_reply_parent_comment_ids.py +0 -0
  1802. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__parse_paginated_json.py +0 -0
  1803. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__resolve_conflicted_file_content_via_sdk.py +0 -0
  1804. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__resolve_rebase_conflicts_via_sdk.py +0 -0
  1805. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test__verify_comment_via_sdk.py +0 -0
  1806. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_approve_pr.py +0 -0
  1807. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_finalize_post_repair.py +0 -0
  1808. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_find_comment.py +0 -0
  1809. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_get_check_annotations.py +0 -0
  1810. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_get_commit_range_diff.py +0 -0
  1811. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_get_pr_diff.py +0 -0
  1812. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_get_pr_metadata.py +0 -0
  1813. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_list_check_runs.py +0 -0
  1814. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_list_issue_comments.py +0 -0
  1815. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_list_pr_files.py +0 -0
  1816. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_list_pr_issue_events.py +0 -0
  1817. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_list_review_comments.py +0 -0
  1818. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_list_review_thread_states.py +0 -0
  1819. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_list_reviews.py +0 -0
  1820. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_merge_pr.py +0 -0
  1821. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_parse_event.py +0 -0
  1822. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_parse_event_label.py +0 -0
  1823. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_post_comment.py +0 -0
  1824. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_publish_pr.py +0 -0
  1825. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_request_reviewer.py +0 -0
  1826. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_retry_integration.py +0 -0
  1827. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_squash_before_publish.py +0 -0
  1828. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/github_provider/test_update_comment.py +0 -0
  1829. {agentic_devtools-0.2.118/tests/unit/cli/copilot/session → agentic_devtools-0.2.120/tests/unit/cli/ci/guards}/__init__.py +0 -0
  1830. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/guards/test_check_cycle_limit.py +0 -0
  1831. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/guards/test_check_deduplication.py +0 -0
  1832. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/guards/test_check_docker_files.py +0 -0
  1833. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/guards/test_check_exclusion_labels.py +0 -0
  1834. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/guards/test_check_fork_pr.py +0 -0
  1835. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/guards/test_check_privileged_paths.py +0 -0
  1836. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/guards/test_get_dedup_writer_token.py +0 -0
  1837. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/guards/test_squash_wait_marker.py +0 -0
  1838. {agentic_devtools-0.2.118/tests/unit/cli/git → agentic_devtools-0.2.120/tests/unit/cli/ci/models}/__init__.py +0 -0
  1839. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_checkrunstatus.py +0 -0
  1840. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_commentresolution.py +0 -0
  1841. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_copilot_reviewer_login.py +0 -0
  1842. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_eventpayload.py +0 -0
  1843. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_finalizationresult.py +0 -0
  1844. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_prmetadata.py +0 -0
  1845. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_repairdecision.py +0 -0
  1846. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_reviewcommentinfo.py +0 -0
  1847. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_reviewinfo.py +0 -0
  1848. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/models/test_verificationverdict.py +0 -0
  1849. {agentic_devtools-0.2.118/tests/unit/cli/git/agdt_branch → agentic_devtools-0.2.120/tests/unit/cli/ci/orchestrator}/__init__.py +0 -0
  1850. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test__dispatch_repair.py +0 -0
  1851. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test__emit_decision_summary.py +0 -0
  1852. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test__evaluate_repair_decision.py +0 -0
  1853. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test__get_copilot_review_request_skip_reason.py +0 -0
  1854. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test__latest_copilot_review_on_head.py +0 -0
  1855. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test__normalize_review_body.py +0 -0
  1856. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test__parse_iso8601_timestamp.py +0 -0
  1857. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop.py +0 -0
  1858. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_blocked.py +0 -0
  1859. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_malformed.py +0 -0
  1860. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_no_issue.py +0 -0
  1861. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_ready.py +0 -0
  1862. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/orchestrator/test_squash_wait_flow.py +0 -0
  1863. {agentic_devtools-0.2.118/tests/unit/cli/git/async_commands → agentic_devtools-0.2.120/tests/unit/cli/ci/patch_handler}/__init__.py +0 -0
  1864. {agentic_devtools-0.2.118/tests/unit/cli/git/commands → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline}/__init__.py +0 -0
  1865. {agentic_devtools-0.2.118/tests/unit/cli/git/core → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions}/__init__.py +0 -0
  1866. {agentic_devtools-0.2.118/tests/unit/cli/git/diff → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/approve}/__init__.py +0 -0
  1867. {agentic_devtools-0.2.118/tests/unit/cli/git/operations → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/dispatch_repair}/__init__.py +0 -0
  1868. {agentic_devtools-0.2.118/tests/unit/cli/github → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/guards}/__init__.py +0 -0
  1869. {agentic_devtools-0.2.118/tests/unit/cli/github/async_commands → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/merge}/__init__.py +0 -0
  1870. {agentic_devtools-0.2.118/tests/unit/cli/github/copilot_review_status → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/publish}/__init__.py +0 -0
  1871. {agentic_devtools-0.2.118/tests/unit/cli/github/issue_commands → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/request_review}/__init__.py +0 -0
  1872. {agentic_devtools-0.2.118/tests/unit/cli/github/pr_approve → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/resolve_threads}/__init__.py +0 -0
  1873. {agentic_devtools-0.2.118/tests/unit/cli/github/pr_checks_status → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/actions/squash}/__init__.py +0 -0
  1874. {agentic_devtools-0.2.118/tests/unit/cli/github/pr_merge → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/command}/__init__.py +0 -0
  1875. {agentic_devtools-0.2.118/tests/unit/cli/github/pr_poll_ready → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/models}/__init__.py +0 -0
  1876. {agentic_devtools-0.2.118/tests/unit/cli/github/pr_state → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/runner}/__init__.py +0 -0
  1877. {agentic_devtools-0.2.118/tests/unit/cli/github/repo_resolution → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/session_detector}/__init__.py +0 -0
  1878. {agentic_devtools-0.2.118/tests/unit/cli/github/request_copilot_review → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/snapshot}/__init__.py +0 -0
  1879. {agentic_devtools-0.2.118/tests/unit/cli/github/rerun_checks → agentic_devtools-0.2.120/tests/unit/cli/ci/pipeline/summary}/__init__.py +0 -0
  1880. {agentic_devtools-0.2.118/tests/unit/cli/github/resolve_review_threads → agentic_devtools-0.2.120/tests/unit/cli/ci/provider}/__init__.py +0 -0
  1881. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/provider/test_ciplatformprovider.py +0 -0
  1882. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/provider/test_ciplatformprovider_integration.py +0 -0
  1883. {agentic_devtools-0.2.118/tests/unit/cli/github/review_reply → agentic_devtools-0.2.120/tests/unit/cli/ci/retry}/__init__.py +0 -0
  1884. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/retry/test_retry_with_backoff.py +0 -0
  1885. {agentic_devtools-0.2.118/tests/unit/cli/github/state_helpers → agentic_devtools-0.2.120/tests/unit/cli/ci/speckit_trigger}/__init__.py +0 -0
  1886. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/ci/speckit_trigger/test_process_speckit_label_event.py +0 -0
  1887. {agentic_devtools-0.2.118/tests/unit/cli/jira → agentic_devtools-0.2.120/tests/unit/cli/config}/__init__.py +0 -0
  1888. {agentic_devtools-0.2.118/tests/unit/cli/jira/adf → agentic_devtools-0.2.120/tests/unit/cli/config/project_config}/__init__.py +0 -0
  1889. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/config/project_config/test__get_config_path.py +0 -0
  1890. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/config/project_config/test_get_project_config_value.py +0 -0
  1891. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/config/project_config/test_load_project_config.py +0 -0
  1892. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/config/project_config/test_save_project_config.py +0 -0
  1893. {agentic_devtools-0.2.118/tests/unit/cli/jira/async_commands → agentic_devtools-0.2.120/tests/unit/cli/copilot}/__init__.py +0 -0
  1894. {agentic_devtools-0.2.118/tests/unit/cli/jira/async_status → agentic_devtools-0.2.120/tests/unit/cli/copilot/auto_start}/__init__.py +0 -0
  1895. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/auto_start/test__is_retryable_win_error.py +0 -0
  1896. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/auto_start/test__is_run_triggered.py +0 -0
  1897. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/auto_start/test__mark_run_triggered.py +0 -0
  1898. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/auto_start/test__read_model_from_state.py +0 -0
  1899. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/auto_start/test__run_copilot_with_retry.py +0 -0
  1900. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/auto_start/test__unmark_run_triggered.py +0 -0
  1901. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/auto_start/test_copilot_auto_start_cmd.py +0 -0
  1902. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/auto_start/test_retry_autostart_cmd.py +0 -0
  1903. {agentic_devtools-0.2.118/tests/unit/cli/jira/comment_commands → agentic_devtools-0.2.120/tests/unit/cli/copilot/session}/__init__.py +0 -0
  1904. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test__build_copilot_args.py +0 -0
  1905. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test__emit_log_marker.py +0 -0
  1906. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test__get_copilot_binary.py +0 -0
  1907. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test__get_jsonl_file_path.py +0 -0
  1908. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test_build_copilot_args.py +0 -0
  1909. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test_copilotsessionresult.py +0 -0
  1910. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test_get_default_copilot_model.py +0 -0
  1911. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test_is_gh_copilot_available.py +0 -0
  1912. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/copilot/session/test_start_copilot_session.py +0 -0
  1913. {agentic_devtools-0.2.118/tests/unit/cli/jira/config → agentic_devtools-0.2.120/tests/unit/cli/git}/__init__.py +0 -0
  1914. {agentic_devtools-0.2.118/tests/unit/cli/jira/create_commands → agentic_devtools-0.2.120/tests/unit/cli/git/agdt_branch}/__init__.py +0 -0
  1915. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__branch_exists_locally.py +0 -0
  1916. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__branch_exists_remotely.py +0 -0
  1917. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__discover_workflow_files.py +0 -0
  1918. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__fetch_branch.py +0 -0
  1919. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__get_parent_sha.py +0 -0
  1920. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__get_repo_root.py +0 -0
  1921. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__has_matching_run_id.py +0 -0
  1922. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__read_commit_message.py +0 -0
  1923. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__read_tree_for_commit.py +0 -0
  1924. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__reset_dirty.py +0 -0
  1925. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test__run_plumbing.py +0 -0
  1926. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_build_tree.py +0 -0
  1927. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_create_commit.py +0 -0
  1928. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_gitplumbingerror.py +0 -0
  1929. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_hash_object.py +0 -0
  1930. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_is_dirty.py +0 -0
  1931. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_load_workflow_artifacts.py +0 -0
  1932. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_mark_dirty.py +0 -0
  1933. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_persist_if_dirty.py +0 -0
  1934. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_persist_workflow_state.py +0 -0
  1935. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_persistresult.py +0 -0
  1936. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_push_branch.py +0 -0
  1937. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_read_blob.py +0 -0
  1938. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_read_branch_tree.py +0 -0
  1939. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_resolve_worktree_key.py +0 -0
  1940. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/agdt_branch/test_update_ref.py +0 -0
  1941. {agentic_devtools-0.2.118/tests/unit/cli/jira/formatting → agentic_devtools-0.2.120/tests/unit/cli/git/async_commands}/__init__.py +0 -0
  1942. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/async_commands/_helpers.py +0 -0
  1943. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/async_commands/test_amend_async.py +0 -0
  1944. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/async_commands/test_commit_async.py +0 -0
  1945. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/async_commands/test_force_push_async.py +0 -0
  1946. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/async_commands/test_publish_async.py +0 -0
  1947. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/async_commands/test_push_async.py +0 -0
  1948. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/async_commands/test_stage_async.py +0 -0
  1949. {agentic_devtools-0.2.118/tests/unit/cli/jira/get_commands → agentic_devtools-0.2.120/tests/unit/cli/git/commands}/__init__.py +0 -0
  1950. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/conftest.py +0 -0
  1951. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test__get_issue_key_from_state.py +0 -0
  1952. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test__mark_checklist_items_completed.py +0 -0
  1953. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test__sync_with_main.py +0 -0
  1954. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test__trigger_implementation_review.py +0 -0
  1955. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test_amend_cmd.py +0 -0
  1956. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test_commit_cmd.py +0 -0
  1957. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test_force_push_cmd.py +0 -0
  1958. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test_publish_cmd.py +0 -0
  1959. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test_push_cmd.py +0 -0
  1960. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/commands/test_stage_cmd.py +0 -0
  1961. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/conftest.py +0 -0
  1962. {agentic_devtools-0.2.118/tests/unit/cli/jira/helpers → agentic_devtools-0.2.120/tests/unit/cli/git/core}/__init__.py +0 -0
  1963. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/core/test_get_bool_state.py +0 -0
  1964. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/core/test_get_commit_message.py +0 -0
  1965. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/core/test_get_current_branch.py +0 -0
  1966. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/core/test_run_git.py +0 -0
  1967. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/core/test_temp_message_file.py +0 -0
  1968. {agentic_devtools-0.2.118/tests/unit/cli/jira/parse_error_report → agentic_devtools-0.2.120/tests/unit/cli/git/diff}/__init__.py +0 -0
  1969. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test__is_diff_file_header.py +0 -0
  1970. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_addedline.py +0 -0
  1971. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_addedlinesinfo.py +0 -0
  1972. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_diffentry.py +0 -0
  1973. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_difflinesinfo.py +0 -0
  1974. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_get_added_lines_info.py +0 -0
  1975. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_get_diff_entries.py +0 -0
  1976. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_get_diff_lines_info.py +0 -0
  1977. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_get_diff_patch.py +0 -0
  1978. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_get_removed_lines_info.py +0 -0
  1979. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_normalize_ref_name.py +0 -0
  1980. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_removedline.py +0 -0
  1981. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_removedlinesinfo.py +0 -0
  1982. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/diff/test_sync_git_ref.py +0 -0
  1983. {agentic_devtools-0.2.118/tests/unit/cli/jira/role_commands → agentic_devtools-0.2.120/tests/unit/cli/git/operations}/__init__.py +0 -0
  1984. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_amend_commit.py +0 -0
  1985. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_branch_has_commits_ahead_of_main.py +0 -0
  1986. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_branchsafetycheckresult.py +0 -0
  1987. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_check_branch_safe_to_recreate.py +0 -0
  1988. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_checkout_branch.py +0 -0
  1989. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_checkoutresult.py +0 -0
  1990. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_create_commit.py +0 -0
  1991. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_delete_local_branch.py +0 -0
  1992. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_fetch_branch.py +0 -0
  1993. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_fetch_main.py +0 -0
  1994. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_force_push.py +0 -0
  1995. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_get_commits_behind_main.py +0 -0
  1996. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_get_files_changed_on_branch.py +0 -0
  1997. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_get_last_commit_message.py +0 -0
  1998. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_get_short_commit_hash.py +0 -0
  1999. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_has_local_changes.py +0 -0
  2000. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_last_commit_contains_issue_key.py +0 -0
  2001. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_local_branch_matches_origin.py +0 -0
  2002. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_publish_branch.py +0 -0
  2003. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_push.py +0 -0
  2004. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_rebase_onto_main.py +0 -0
  2005. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_rebaseresult.py +0 -0
  2006. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_rename_local_branch.py +0 -0
  2007. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_reset_branch_to_origin.py +0 -0
  2008. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_should_amend_instead_of_commit.py +0 -0
  2009. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/git/operations/test_stage_changes.py +0 -0
  2010. {agentic_devtools-0.2.118/tests/unit/cli/jira/state_helpers → agentic_devtools-0.2.120/tests/unit/cli/github}/__init__.py +0 -0
  2011. {agentic_devtools-0.2.118/tests/unit/cli/jira/update_commands → agentic_devtools-0.2.120/tests/unit/cli/github/async_commands}/__init__.py +0 -0
  2012. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_bug_issue_async.py +0 -0
  2013. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_bug_issue_async_cli.py +0 -0
  2014. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_documentation_issue_async.py +0 -0
  2015. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_documentation_issue_async_cli.py +0 -0
  2016. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_feature_issue_async.py +0 -0
  2017. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_feature_issue_async_cli.py +0 -0
  2018. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_issue_async.py +0 -0
  2019. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_issue_async_cli.py +0 -0
  2020. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_task_issue_async.py +0 -0
  2021. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/async_commands/test_create_agdt_task_issue_async_cli.py +0 -0
  2022. {agentic_devtools-0.2.118/tests/unit/cli/jira/vpn_wrapper → agentic_devtools-0.2.120/tests/unit/cli/github/copilot_review_status}/__init__.py +0 -0
  2023. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/copilot_review_status/test__classify_review_status.py +0 -0
  2024. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/copilot_review_status/test__count_inline_comments.py +0 -0
  2025. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/copilot_review_status/test__count_suppressed_comments.py +0 -0
  2026. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/copilot_review_status/test__fetch_reviews_for_pr.py +0 -0
  2027. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/copilot_review_status/test__select_latest_copilot_review.py +0 -0
  2028. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/copilot_review_status/test_copilot_review_status_command.py +0 -0
  2029. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/copilot_review_status/test_get_copilot_review_status.py +0 -0
  2030. {agentic_devtools-0.2.118/tests/unit/cli/network → agentic_devtools-0.2.120/tests/unit/cli/github/issue_commands}/__init__.py +0 -0
  2031. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test__append_related_issues.py +0 -0
  2032. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test__append_terminal_log.py +0 -0
  2033. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test__build_gh_create_args.py +0 -0
  2034. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test__check_gh_cli.py +0 -0
  2035. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test__get_environment_info.py +0 -0
  2036. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test__gh_supports_issue_type.py +0 -0
  2037. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test_create_agdt_bug_issue.py +0 -0
  2038. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test_create_agdt_documentation_issue.py +0 -0
  2039. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test_create_agdt_feature_issue.py +0 -0
  2040. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test_create_agdt_issue.py +0 -0
  2041. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/issue_commands/test_create_agdt_task_issue.py +0 -0
  2042. {agentic_devtools-0.2.118/tests/unit/cli/network/commands → agentic_devtools-0.2.120/tests/unit/cli/github/pr_approve}/__init__.py +0 -0
  2043. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_approve/test__check_gh_available.py +0 -0
  2044. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_approve/test__resolve_current_user.py +0 -0
  2045. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_approve/test__submit_approval.py +0 -0
  2046. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_approve/test__validate_repo_format.py +0 -0
  2047. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_approve/test__verify_approval.py +0 -0
  2048. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_approve/test_approve_pr.py +0 -0
  2049. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_approve/test_pr_approve_command.py +0 -0
  2050. {agentic_devtools-0.2.118/tests/unit/cli/network/detection → agentic_devtools-0.2.120/tests/unit/cli/github/pr_checks_status}/__init__.py +0 -0
  2051. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_checks_status/test__classify_checks.py +0 -0
  2052. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_checks_status/test__fetch_check_suites.py +0 -0
  2053. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_checks_status/test__fetch_pr_checks.py +0 -0
  2054. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_checks_status/test__normalize_repo.py +0 -0
  2055. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_checks_status/test__reconcile_results.py +0 -0
  2056. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_checks_status/test__verify_check_suites.py +0 -0
  2057. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_checks_status/test_get_pr_checks_status.py +0 -0
  2058. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_checks_status/test_pr_checks_status_command.py +0 -0
  2059. {agentic_devtools-0.2.118/tests/unit/cli/release → agentic_devtools-0.2.120/tests/unit/cli/github/pr_merge}/__init__.py +0 -0
  2060. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_merge/test__check_gh_available.py +0 -0
  2061. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_merge/test__classify_merge_error.py +0 -0
  2062. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_merge/test__execute_merge.py +0 -0
  2063. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_merge/test__verify_merge.py +0 -0
  2064. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_merge/test_merge_pr.py +0 -0
  2065. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_merge/test_pr_merge_command.py +0 -0
  2066. {agentic_devtools-0.2.118/tests/unit/cli/release/commands → agentic_devtools-0.2.120/tests/unit/cli/github/pr_poll_ready}/__init__.py +0 -0
  2067. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_poll_ready/test__evaluate_iteration.py +0 -0
  2068. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_poll_ready/test__should_rerun_checks.py +0 -0
  2069. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_poll_ready/test_poll_pr_ready.py +0 -0
  2070. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_poll_ready/test_pr_poll_ready_command.py +0 -0
  2071. {agentic_devtools-0.2.118/tests/unit/cli/release/helpers → agentic_devtools-0.2.120/tests/unit/cli/github/pr_state}/__init__.py +0 -0
  2072. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_state/test__evaluate_terminal_condition.py +0 -0
  2073. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_state/test__fetch_pr_with_retry.py +0 -0
  2074. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_state/test_get_pr_state.py +0 -0
  2075. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/pr_state/test_pr_state_command.py +0 -0
  2076. {agentic_devtools-0.2.118/tests/unit/cli/review → agentic_devtools-0.2.120/tests/unit/cli/github/repo_resolution}/__init__.py +0 -0
  2077. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/repo_resolution/test__repo_from_git_remote.py +0 -0
  2078. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/repo_resolution/test__resolve_repo_from_git_remote.py +0 -0
  2079. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/repo_resolution/test__validate_repo_format.py +0 -0
  2080. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/repo_resolution/test_resolve_github_repo.py +0 -0
  2081. {agentic_devtools-0.2.118/tests/unit/cli/review/commands → agentic_devtools-0.2.120/tests/unit/cli/github/request_copilot_review}/__init__.py +0 -0
  2082. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/request_copilot_review/test__check_login_in_response.py +0 -0
  2083. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/request_copilot_review/test__check_reviewer_in_reviews.py +0 -0
  2084. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/request_copilot_review/test__login_matches.py +0 -0
  2085. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/request_copilot_review/test__post_review_request.py +0 -0
  2086. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/request_copilot_review/test__verify_reviewer_requested.py +0 -0
  2087. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/request_copilot_review/test_request_copilot_review.py +0 -0
  2088. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/request_copilot_review/test_request_copilot_review_command.py +0 -0
  2089. {agentic_devtools-0.2.118/tests/unit/cli/review/config_commands → agentic_devtools-0.2.120/tests/unit/cli/github/rerun_checks}/__init__.py +0 -0
  2090. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/rerun_checks/test__fetch_workflow_runs.py +0 -0
  2091. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/rerun_checks/test__filter_failed_runs.py +0 -0
  2092. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/rerun_checks/test__rerun_single_workflow.py +0 -0
  2093. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/rerun_checks/test_rerun_checks_command.py +0 -0
  2094. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/rerun_checks/test_rerun_failed_checks.py +0 -0
  2095. {agentic_devtools-0.2.118/tests/unit/cli/review/consolidate → agentic_devtools-0.2.120/tests/unit/cli/github/resolve_review_threads}/__init__.py +0 -0
  2096. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/resolve_review_threads/test__fetch_review_comment_ids.py +0 -0
  2097. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/resolve_review_threads/test__fetch_review_threads.py +0 -0
  2098. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/resolve_review_threads/test__map_comments_to_threads.py +0 -0
  2099. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/resolve_review_threads/test__resolve_and_verify.py +0 -0
  2100. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/resolve_review_threads/test__resolve_thread.py +0 -0
  2101. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/resolve_review_threads/test_resolve_review_threads.py +0 -0
  2102. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/resolve_review_threads/test_resolve_review_threads_command.py +0 -0
  2103. {agentic_devtools-0.2.118/tests/unit/cli/review/dispatch → agentic_devtools-0.2.120/tests/unit/cli/github/review_reply}/__init__.py +0 -0
  2104. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/review_reply/test__check_gh_available.py +0 -0
  2105. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/review_reply/test__load_replies_file.py +0 -0
  2106. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/review_reply/test__post_single_reply.py +0 -0
  2107. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/review_reply/test__retry_failed_replies.py +0 -0
  2108. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/review_reply/test__validate_reply_entries.py +0 -0
  2109. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/review_reply/test__verify_replies.py +0 -0
  2110. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/review_reply/test_reply_to_review_comments.py +0 -0
  2111. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/review_reply/test_reply_to_review_comments_command.py +0 -0
  2112. {agentic_devtools-0.2.118/tests/unit/cli/review/status → agentic_devtools-0.2.120/tests/unit/cli/github/state_helpers}/__init__.py +0 -0
  2113. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/state_helpers/test_get_issue_value.py +0 -0
  2114. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/github/state_helpers/test_set_issue_value.py +0 -0
  2115. {agentic_devtools-0.2.118/tests/unit/cli/runner → agentic_devtools-0.2.120/tests/unit/cli/jira}/__init__.py +0 -0
  2116. {agentic_devtools-0.2.118/tests/unit/cli/setup → agentic_devtools-0.2.120/tests/unit/cli/jira/adf}/__init__.py +0 -0
  2117. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/adf/test__convert_adf_to_text.py +0 -0
  2118. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/adf/test__process_adf_children.py +0 -0
  2119. {agentic_devtools-0.2.118/tests/unit/cli/setup/commands → agentic_devtools-0.2.120/tests/unit/cli/jira/async_commands}/__init__.py +0 -0
  2120. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/conftest.py +0 -0
  2121. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_add_comment_async.py +0 -0
  2122. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_add_comment_async_cli.py +0 -0
  2123. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_add_users_to_project_role_async.py +0 -0
  2124. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_add_users_to_project_role_batch_async.py +0 -0
  2125. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_check_user_exists_async.py +0 -0
  2126. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_check_users_exist_async.py +0 -0
  2127. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_create_epic_async.py +0 -0
  2128. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_create_issue_async.py +0 -0
  2129. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_create_subtask_async.py +0 -0
  2130. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_find_role_id_by_name_async.py +0 -0
  2131. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_get_issue_async.py +0 -0
  2132. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_get_project_role_details_async.py +0 -0
  2133. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_list_project_roles_async.py +0 -0
  2134. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_commands/test_update_issue_async.py +0 -0
  2135. {agentic_devtools-0.2.118/tests/unit/cli/setup/copilot_cli_installer → agentic_devtools-0.2.120/tests/unit/cli/jira/async_status}/__init__.py +0 -0
  2136. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_status/conftest.py +0 -0
  2137. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/async_status/test_write_async_status.py +0 -0
  2138. {agentic_devtools-0.2.118/tests/unit/cli/setup/dependency_checker → agentic_devtools-0.2.120/tests/unit/cli/jira/comment_commands}/__init__.py +0 -0
  2139. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/comment_commands/test_add_comment.py +0 -0
  2140. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/comment_commands/test_add_comment_cli.py +0 -0
  2141. {agentic_devtools-0.2.118/tests/unit/cli/setup/gh_cli_installer → agentic_devtools-0.2.120/tests/unit/cli/jira/config}/__init__.py +0 -0
  2142. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/config/test_build_jira_issue_pattern.py +0 -0
  2143. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/config/test_get_jira_auth_header.py +0 -0
  2144. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/config/test_get_jira_base_url.py +0 -0
  2145. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/config/test_get_jira_headers.py +0 -0
  2146. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/config/test_get_jira_project_keys.py +0 -0
  2147. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/conftest.py +0 -0
  2148. {agentic_devtools-0.2.118/tests/unit/cli/setup/gitignore_negations → agentic_devtools-0.2.120/tests/unit/cli/jira/create_commands}/__init__.py +0 -0
  2149. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/create_commands/test_create_epic.py +0 -0
  2150. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/create_commands/test_create_issue.py +0 -0
  2151. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/create_commands/test_create_issue_sync.py +0 -0
  2152. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/create_commands/test_create_subtask.py +0 -0
  2153. {agentic_devtools-0.2.118/tests/unit/cli/setup/platform_detection → agentic_devtools-0.2.120/tests/unit/cli/jira/formatting}/__init__.py +0 -0
  2154. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/formatting/test_build_user_story_description.py +0 -0
  2155. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/formatting/test_format_bullet_list.py +0 -0
  2156. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/formatting/test_merge_labels.py +0 -0
  2157. {agentic_devtools-0.2.118/tests/unit/cli/setup/pr_workflow → agentic_devtools-0.2.120/tests/unit/cli/jira/get_commands}/__init__.py +0 -0
  2158. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/get_commands/test__fetch_epic.py +0 -0
  2159. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/get_commands/test__fetch_parent_issue.py +0 -0
  2160. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/get_commands/test__fetch_remote_links.py +0 -0
  2161. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/get_commands/test_get_issue.py +0 -0
  2162. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators → agentic_devtools-0.2.120/tests/unit/cli/jira/helpers}/__init__.py +0 -0
  2163. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__count_certificates_in_pem.py +0 -0
  2164. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__ensure_jira_pem.py +0 -0
  2165. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__fetch_certificate_chain_openssl.py +0 -0
  2166. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__fetch_certificate_chain_ssl.py +0 -0
  2167. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__get_repo_jira_pem_path.py +0 -0
  2168. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__get_requests.py +0 -0
  2169. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__get_ssl_verify.py +0 -0
  2170. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__get_temp_jira_pem_path.py +0 -0
  2171. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__parse_comma_separated.py +0 -0
  2172. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/helpers/test__parse_multiline_string.py +0 -0
  2173. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/atomic_write → agentic_devtools-0.2.120/tests/unit/cli/jira/parse_error_report}/__init__.py +0 -0
  2174. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/parse_error_report/test_get_user_details.py +0 -0
  2175. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/parse_error_report/test_get_user_details_api_calls.py +0 -0
  2176. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/parse_error_report/test_parse_error_file.py +0 -0
  2177. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/parse_error_report/test_parse_error_file_combined_errors.py +0 -0
  2178. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/parse_error_report/test_parse_error_file_multiple_dataproducts.py +0 -0
  2179. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report.py +0 -0
  2180. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report_command.py +0 -0
  2181. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report_integration.py +0 -0
  2182. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/complete_setup → agentic_devtools-0.2.120/tests/unit/cli/jira/role_commands}/__init__.py +0 -0
  2183. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_add_users_to_project_role.py +0 -0
  2184. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_add_users_to_project_role_additional_cases.py +0 -0
  2185. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_add_users_to_project_role_batch.py +0 -0
  2186. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_check_user_exists.py +0 -0
  2187. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_check_user_exists_command.py +0 -0
  2188. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_check_users_exist.py +0 -0
  2189. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_check_users_exist_command.py +0 -0
  2190. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_check_users_exist_command_paths.py +0 -0
  2191. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_find_role_id_by_name.py +0 -0
  2192. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_get_project_role_details.py +0 -0
  2193. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_get_project_role_details_command_paths.py +0 -0
  2194. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_list_project_roles.py +0 -0
  2195. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_list_project_roles_command_paths.py +0 -0
  2196. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_role_commands_error_handling.py +0 -0
  2197. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/role_commands/test_role_id_extraction.py +0 -0
  2198. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/configured_setup → agentic_devtools-0.2.120/tests/unit/cli/jira/state_helpers}/__init__.py +0 -0
  2199. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/state_helpers/test_get_jira_value.py +0 -0
  2200. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/state_helpers/test_set_jira_value.py +0 -0
  2201. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/gitignore_updater → agentic_devtools-0.2.120/tests/unit/cli/jira/update_commands}/__init__.py +0 -0
  2202. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/update_commands/test__build_update_payload.py +0 -0
  2203. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/update_commands/test_update_issue.py +0 -0
  2204. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/legacy_migration → agentic_devtools-0.2.120/tests/unit/cli/jira/vpn_wrapper}/__init__.py +0 -0
  2205. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context.py +0 -0
  2206. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context_decorator.py +0 -0
  2207. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context_integration.py +0 -0
  2208. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/repo_specific → agentic_devtools-0.2.120/tests/unit/cli/network}/__init__.py +0 -0
  2209. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/required_setup → agentic_devtools-0.2.120/tests/unit/cli/network/commands}/__init__.py +0 -0
  2210. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/network/commands/test_network_status_cmd.py +0 -0
  2211. {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/root_entry_point → agentic_devtools-0.2.120/tests/unit/cli/network/detection}/__init__.py +0 -0
  2212. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/network/detection/test_detect_network_context.py +0 -0
  2213. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/network/detection/test_get_network_context_display.py +0 -0
  2214. {agentic_devtools-0.2.118/tests/unit/cli/setup/shell_profile → agentic_devtools-0.2.120/tests/unit/cli/release}/__init__.py +0 -0
  2215. {agentic_devtools-0.2.118/tests/unit/cli/setup/version_guard → agentic_devtools-0.2.120/tests/unit/cli/release/commands}/__init__.py +0 -0
  2216. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/release/commands/test_release_pypi_async.py +0 -0
  2217. {agentic_devtools-0.2.118/tests/unit/cli/setup/workflow_templates → agentic_devtools-0.2.120/tests/unit/cli/release/helpers}/__init__.py +0 -0
  2218. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/release/helpers/test_build_distribution.py +0 -0
  2219. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/release/helpers/test_compute_sha256.py +0 -0
  2220. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/release/helpers/test_normalize_package_name.py +0 -0
  2221. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/release/helpers/test_pypi_version_exists.py +0 -0
  2222. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/release/helpers/test_upload_distribution.py +0 -0
  2223. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/release/helpers/test_validate_distribution.py +0 -0
  2224. {agentic_devtools-0.2.118/tests/unit/cli/speckit → agentic_devtools-0.2.120/tests/unit/cli/review}/__init__.py +0 -0
  2225. {agentic_devtools-0.2.118/tests/unit/cli/speckit → agentic_devtools-0.2.120/tests/unit/cli/review}/commands/__init__.py +0 -0
  2226. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/commands/test_build_parser.py +0 -0
  2227. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/commands/test_main.py +0 -0
  2228. {agentic_devtools-0.2.118/tests/unit/cli/speckit/cross_ref → agentic_devtools-0.2.120/tests/unit/cli/review/config_commands}/__init__.py +0 -0
  2229. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/config_commands/test__config_to_dict.py +0 -0
  2230. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/config_commands/test__resolve_repo_root.py +0 -0
  2231. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/config_commands/test_run_config_get.py +0 -0
  2232. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/config_commands/test_run_config_validate.py +0 -0
  2233. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2 → agentic_devtools-0.2.120/tests/unit/cli/review/consolidate}/__init__.py +0 -0
  2234. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/consolidate/test__apply_resolution.py +0 -0
  2235. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/consolidate/test__build_consolidation_prompt.py +0 -0
  2236. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/consolidate/test__invoke_consolidator_model.py +0 -0
  2237. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/consolidate/test__load_amendment_replies.py +0 -0
  2238. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/consolidate/test_run_consolidate.py +0 -0
  2239. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/constants → agentic_devtools-0.2.120/tests/unit/cli/review/dispatch}/__init__.py +0 -0
  2240. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/dispatch/test__check_files_need_consolidation.py +0 -0
  2241. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/dispatch/test__invoke_consolidation.py +0 -0
  2242. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/dispatch/test__invoke_reviewer.py +0 -0
  2243. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/dispatch/test__print_dispatch_plan.py +0 -0
  2244. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/dispatch/test_run_dispatch.py +0 -0
  2245. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/coverage_mapper → agentic_devtools-0.2.120/tests/unit/cli/review/status}/__init__.py +0 -0
  2246. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/review/status/test_run_status.py +0 -0
  2247. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/models → agentic_devtools-0.2.120/tests/unit/cli/runner}/__init__.py +0 -0
  2248. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/runner/test_command_map.py +0 -0
  2249. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/runner/test_command_map_integrity.py +0 -0
  2250. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/runner/test_main.py +0 -0
  2251. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/runner/test_main_entry_point.py +0 -0
  2252. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/runner/test_run_as_script.py +0 -0
  2253. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/runner/test_run_command.py +0 -0
  2254. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/reporter → agentic_devtools-0.2.120/tests/unit/cli/setup}/__init__.py +0 -0
  2255. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/spec_parser → agentic_devtools-0.2.120/tests/unit/cli/setup/commands}/__init__.py +0 -0
  2256. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__build_unified_ca_bundle.py +0 -0
  2257. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__generate_setup_scripts.py +0 -0
  2258. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__persist_env_vars_to_profile.py +0 -0
  2259. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__persist_single_var.py +0 -0
  2260. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__prefetch_certs.py +0 -0
  2261. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__print_manual_instructions.py +0 -0
  2262. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__print_path_instructions_if_needed.py +0 -0
  2263. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__prompt_copilot_model.py +0 -0
  2264. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__prompt_project_config.py +0 -0
  2265. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__query_copilot_models.py +0 -0
  2266. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test__valid_issue_adapters_fallback.py +0 -0
  2267. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test_setup_certs_cmd.py +0 -0
  2268. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test_setup_check_cmd.py +0 -0
  2269. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test_setup_cmd.py +0 -0
  2270. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test_setup_copilot_cli_cmd.py +0 -0
  2271. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/commands/test_setup_gh_cli_cmd.py +0 -0
  2272. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/conftest.py +0 -0
  2273. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/task_classifier → agentic_devtools-0.2.120/tests/unit/cli/setup/copilot_cli_installer}/__init__.py +0 -0
  2274. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/copilot_cli_installer/test_detect_platform_asset.py +0 -0
  2275. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/copilot_cli_installer/test_download_and_install.py +0 -0
  2276. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/copilot_cli_installer/test_get_copilot_cli_binary.py +0 -0
  2277. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/copilot_cli_installer/test_get_installed_version.py +0 -0
  2278. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/copilot_cli_installer/test_get_latest_release_info.py +0 -0
  2279. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/copilot_cli_installer/test_install_copilot_cli.py +0 -0
  2280. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/validator → agentic_devtools-0.2.120/tests/unit/cli/setup/dependency_checker}/__init__.py +0 -0
  2281. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/dependency_checker/test__find_binary.py +0 -0
  2282. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/dependency_checker/test__get_version.py +0 -0
  2283. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/dependency_checker/test__run_version.py +0 -0
  2284. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/dependency_checker/test_check_all_dependencies.py +0 -0
  2285. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/dependency_checker/test_dependencystatus.py +0 -0
  2286. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/dependency_checker/test_print_dependency_report.py +0 -0
  2287. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g → agentic_devtools-0.2.120/tests/unit/cli/setup/gh_cli_installer}/__init__.py +0 -0
  2288. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/gh_cli_installer/test_detect_platform_asset.py +0 -0
  2289. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/gh_cli_installer/test_download_and_install.py +0 -0
  2290. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/gh_cli_installer/test_get_gh_cli_binary.py +0 -0
  2291. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/gh_cli_installer/test_get_installed_version.py +0 -0
  2292. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/gh_cli_installer/test_get_latest_release_info.py +0 -0
  2293. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/gh_cli_installer/test_install_gh_cli.py +0 -0
  2294. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/classifier → agentic_devtools-0.2.120/tests/unit/cli/setup/gitignore_negations}/__init__.py +0 -0
  2295. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/gitignore_negations/test__detect_newline.py +0 -0
  2296. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/gitignore_negations/test_ensure_root_gitignore_negations.py +0 -0
  2297. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/constants → agentic_devtools-0.2.120/tests/unit/cli/setup/platform_detection}/__init__.py +0 -0
  2298. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/platform_detection/test__get_origin_remote_url.py +0 -0
  2299. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/platform_detection/test_confirm_and_override.py +0 -0
  2300. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/platform_detection/test_detect_platforms.py +0 -0
  2301. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/platform_detection/test_detectionresult.py +0 -0
  2302. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/extractors → agentic_devtools-0.2.120/tests/unit/cli/setup/pr_workflow}/__init__.py +0 -0
  2303. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/pr_workflow/test__resolve_branch_name.py +0 -0
  2304. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/pr_workflow/test_run_setup_with_pr_workflow.py +0 -0
  2305. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/extractors/base → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators}/__init__.py +0 -0
  2306. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/extractors/python_extractor → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators/atomic_write}/__init__.py +0 -0
  2307. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/atomic_write/test_concurrent_writes.py +0 -0
  2308. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/intent_detector → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators/complete_setup}/__init__.py +0 -0
  2309. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/complete_setup/test_generate_complete_setup.py +0 -0
  2310. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/inventory → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators/configured_setup}/__init__.py +0 -0
  2311. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/configured_setup/test_generate_configured_setup.py +0 -0
  2312. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/configured_setup/test_render_tool_installs.py +0 -0
  2313. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/matcher → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators/gitignore_updater}/__init__.py +0 -0
  2314. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/gitignore_updater/test_update_gitignore.py +0 -0
  2315. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/models → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators/legacy_migration}/__init__.py +0 -0
  2316. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/legacy_migration/test_detect_legacy.py +0 -0
  2317. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/legacy_migration/test_migrate_content.py +0 -0
  2318. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/reference_extractor → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators/repo_specific}/__init__.py +0 -0
  2319. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/repo_specific/test_never_overwrite.py +0 -0
  2320. {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/reporter → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators/required_setup}/__init__.py +0 -0
  2321. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/required_setup/test__site_packages_dirs.py +0 -0
  2322. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/required_setup/test_cleanup_artifacts.py +0 -0
  2323. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/required_setup/test_detect_corrupted_artifacts.py +0 -0
  2324. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/required_setup/test_generate_required_setup.py +0 -0
  2325. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/required_setup/test_install_package.py +0 -0
  2326. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/required_setup/test_setup_git_hooks.py +0 -0
  2327. {agentic_devtools-0.2.118/tests/unit/cli/speckit/validate_checklists → agentic_devtools-0.2.120/tests/unit/cli/setup/script_generators/root_entry_point}/__init__.py +0 -0
  2328. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/script_generators/root_entry_point/test_generate_root_entry_point.py +0 -0
  2329. {agentic_devtools-0.2.118/tests/unit/cli/speckit/validate_frs → agentic_devtools-0.2.120/tests/unit/cli/setup/shell_profile}/__init__.py +0 -0
  2330. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/shell_profile/test_detect_shell_profile.py +0 -0
  2331. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/shell_profile/test_detect_shell_type.py +0 -0
  2332. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/shell_profile/test_persist_env_var.py +0 -0
  2333. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/shell_profile/test_persist_path_entry.py +0 -0
  2334. {agentic_devtools-0.2.118/tests/unit/cli/state → agentic_devtools-0.2.120/tests/unit/cli/setup/version_guard}/__init__.py +0 -0
  2335. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/version_guard/test__fallback_compare.py +0 -0
  2336. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/version_guard/test__segment_value.py +0 -0
  2337. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/version_guard/test_check_version_guard.py +0 -0
  2338. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/version_guard/test_compare_versions.py +0 -0
  2339. {agentic_devtools-0.2.118/tests/unit/cli/subprocess_utils → agentic_devtools-0.2.120/tests/unit/cli/setup/workflow_templates}/__init__.py +0 -0
  2340. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/workflow_templates/test_generate_default_templates.py +0 -0
  2341. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/workflow_templates/test_list_available_templates.py +0 -0
  2342. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/setup/workflow_templates/test_template_info.py +0 -0
  2343. {agentic_devtools-0.2.118/tests/unit/cli/tasks → agentic_devtools-0.2.120/tests/unit/cli/speckit}/__init__.py +0 -0
  2344. {agentic_devtools-0.2.118/tests/unit/cli/tasks → agentic_devtools-0.2.120/tests/unit/cli/speckit}/commands/__init__.py +0 -0
  2345. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test__load_prompt.py +0 -0
  2346. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test__parse_args.py +0 -0
  2347. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test__run.py +0 -0
  2348. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_analyze.py +0 -0
  2349. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_checklist.py +0 -0
  2350. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_clarify.py +0 -0
  2351. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_constitution.py +0 -0
  2352. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_implement.py +0 -0
  2353. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_plan.py +0 -0
  2354. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_specify.py +0 -0
  2355. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_tasks.py +0 -0
  2356. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/commands/test_speckit_taskstoissues.py +0 -0
  2357. {agentic_devtools-0.2.118/tests/unit/cli/testing → agentic_devtools-0.2.120/tests/unit/cli/speckit/cross_ref}/__init__.py +0 -0
  2358. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/cross_ref/test_cross_ref_command.py +0 -0
  2359. {agentic_devtools-0.2.118/tests/unit/cli/vpn → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_e2}/__init__.py +0 -0
  2360. {agentic_devtools-0.2.118/tests/unit/cli/vpn/commands → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_e2/constants}/__init__.py +0 -0
  2361. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/constants/test_test_task_keywords.py +0 -0
  2362. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/constants/test_test_type_keywords.py +0 -0
  2363. {agentic_devtools-0.2.118/tests/unit/cli/vpn/runner → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_e2/coverage_mapper}/__init__.py +0 -0
  2364. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/coverage_mapper/test_evaluate_coverage.py +0 -0
  2365. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/coverage_mapper/test_generate_task_scoped_findings.py +0 -0
  2366. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/coverage_mapper/test_map_test_tasks_to_frs.py +0 -0
  2367. {agentic_devtools-0.2.118/tests/unit/cli/vscode_tasks → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_e2/models}/__init__.py +0 -0
  2368. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/models/test_models.py +0 -0
  2369. {agentic_devtools-0.2.118/tests/unit/cli/workflows → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_e2/reporter}/__init__.py +0 -0
  2370. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/reporter/test_render_findings.py +0 -0
  2371. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/reporter/test_render_test_coverage_summary.py +0 -0
  2372. {agentic_devtools-0.2.118/tests/unit/cli/workflows/advancement → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_e2/spec_parser}/__init__.py +0 -0
  2373. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/spec_parser/test__extract_priority_from_section.py +0 -0
  2374. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/spec_parser/test_build_us_to_fr_mapping.py +0 -0
  2375. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/spec_parser/test_extract_frs_with_priority.py +0 -0
  2376. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/spec_parser/test_parse_user_story_sections.py +0 -0
  2377. {agentic_devtools-0.2.118/tests/unit/cli/workflows/base → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_e2/task_classifier}/__init__.py +0 -0
  2378. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/task_classifier/test__build_multi_word_pattern.py +0 -0
  2379. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/task_classifier/test_classify_test_types.py +0 -0
  2380. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/task_classifier/test_detect_ambiguous_task.py +0 -0
  2381. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/task_classifier/test_extract_task_fr_refs.py +0 -0
  2382. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/task_classifier/test_is_test_task.py +0 -0
  2383. {agentic_devtools-0.2.118/tests/unit/cli/workflows/checklist → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_e2/validator}/__init__.py +0 -0
  2384. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/validator/test__parse_tasks_from_content.py +0 -0
  2385. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/validator/test__print_human_output.py +0 -0
  2386. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/validator/test__safe_print.py +0 -0
  2387. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/validator/test_test_coverage_command.py +0 -0
  2388. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_e2/validator/test_validate_test_coverage.py +0 -0
  2389. {agentic_devtools-0.2.118/tests/unit/cli/workflows/commands → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g}/__init__.py +0 -0
  2390. {agentic_devtools-0.2.118/tests/unit/cli/workflows/engine_resolution → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/classifier}/__init__.py +0 -0
  2391. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/classifier/test__check_partial_match.py +0 -0
  2392. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/classifier/test__should_skip.py +0 -0
  2393. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/classifier/test_classify_references.py +0 -0
  2394. {agentic_devtools-0.2.118/tests/unit/cli/workflows/manager → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/constants}/__init__.py +0 -0
  2395. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/constants/test_disambiguation_margin.py +0 -0
  2396. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/constants/test_high_confidence_threshold.py +0 -0
  2397. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/constants/test_max_candidates_per_reference.py +0 -0
  2398. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/constants/test_new_symbol_noun_markers.py +0 -0
  2399. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/constants/test_new_symbol_verb_markers.py +0 -0
  2400. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/constants/test_performance_warning_seconds.py +0 -0
  2401. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/constants/test_protected_file_patterns.py +0 -0
  2402. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/constants/test_suggestion_threshold.py +0 -0
  2403. {agentic_devtools-0.2.118/tests/unit/cli/workflows/preflight → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/extractors}/__init__.py +0 -0
  2404. {agentic_devtools-0.2.118/tests/unit/cli/workflows/worktree_setup → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/extractors/base}/__init__.py +0 -0
  2405. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/extractors/base/test_symbolextractor.py +0 -0
  2406. {agentic_devtools-0.2.118/tests/unit/config → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/extractors/python_extractor}/__init__.py +0 -0
  2407. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/extractors/python_extractor/test__file_to_module_path.py +0 -0
  2408. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/extractors/python_extractor/test__parse_project_scripts.py +0 -0
  2409. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/extractors/python_extractor/test_pythonextractor.py +0 -0
  2410. {agentic_devtools-0.2.118/tests/unit/context → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/intent_detector}/__init__.py +0 -0
  2411. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/intent_detector/test_detect_new_symbol_intent.py +0 -0
  2412. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/intent_detector/test_detect_new_symbol_intent_noun.py +0 -0
  2413. {agentic_devtools-0.2.118/tests/unit/context/models → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/inventory}/__init__.py +0 -0
  2414. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/inventory/test_build_inventory.py +0 -0
  2415. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/inventory/test_build_inventory_extended.py +0 -0
  2416. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/inventory/test_symbolinventory.py +0 -0
  2417. {agentic_devtools-0.2.118/tests/unit/context/nodes → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/matcher}/__init__.py +0 -0
  2418. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/matcher/test_classify_match_confidence.py +0 -0
  2419. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/matcher/test_exact_match.py +0 -0
  2420. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/matcher/test_fuzzy_match.py +0 -0
  2421. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/matcher/test_fuzzy_match_extended.py +0 -0
  2422. {agentic_devtools-0.2.118/tests/unit/context/retriever → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/models}/__init__.py +0 -0
  2423. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/models/test_candidate.py +0 -0
  2424. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/models/test_finding.py +0 -0
  2425. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/models/test_matchstatus.py +0 -0
  2426. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/models/test_reference.py +0 -0
  2427. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/models/test_referencekind.py +0 -0
  2428. {agentic_devtools-0.2.118/tests/unit/context_budget → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/reference_extractor}/__init__.py +0 -0
  2429. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/reference_extractor/test_classify_reference_kind.py +0 -0
  2430. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/reference_extractor/test_extract_references.py +0 -0
  2431. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/reference_extractor/test_extract_references_extended.py +0 -0
  2432. {agentic_devtools-0.2.118/tests/unit/file_locking → agentic_devtools-0.2.120/tests/unit/cli/speckit/pass_g/reporter}/__init__.py +0 -0
  2433. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/reporter/test_render_json.py +0 -0
  2434. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/reporter/test_render_markdown.py +0 -0
  2435. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/pass_g/reporter/test_reporter_edge_cases.py +0 -0
  2436. {agentic_devtools-0.2.118/tests/unit/mcp → agentic_devtools-0.2.120/tests/unit/cli/speckit/validate_checklists}/__init__.py +0 -0
  2437. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test__print_human_output.py +0 -0
  2438. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test__resolve_issue_number.py +0 -0
  2439. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test__resolve_paths.py +0 -0
  2440. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test__verify_source_issue_marker.py +0 -0
  2441. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test_aggregateresult.py +0 -0
  2442. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test_classify_file.py +0 -0
  2443. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test_count_checkboxes.py +0 -0
  2444. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test_remediate_file.py +0 -0
  2445. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test_validate_checklists.py +0 -0
  2446. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test_validate_checklists_command.py +0 -0
  2447. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_checklists/test_validate_file.py +0 -0
  2448. {agentic_devtools-0.2.118/tests/unit/mcp/server → agentic_devtools-0.2.120/tests/unit/cli/speckit/validate_frs}/__init__.py +0 -0
  2449. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_frs/test__coerce_max_retries.py +0 -0
  2450. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_frs/test__resolve_max_retries.py +0 -0
  2451. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_frs/test_check_coverage.py +0 -0
  2452. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_frs/test_extract_frs.py +0 -0
  2453. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_frs/test_sort_fr_ids.py +0 -0
  2454. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_frs/test_validate_frs.py +0 -0
  2455. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_frs/test_validate_frs_command.py +0 -0
  2456. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/speckit/validate_frs/test_validationresult.py +0 -0
  2457. {agentic_devtools-0.2.118/tests/unit/orchestration → agentic_devtools-0.2.120/tests/unit/cli/state}/__init__.py +0 -0
  2458. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/state/test_clear_cmd.py +0 -0
  2459. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/state/test_clear_workflow_cmd.py +0 -0
  2460. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/state/test_delete_cmd.py +0 -0
  2461. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/state/test_get_cmd.py +0 -0
  2462. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/state/test_get_workflow_cmd.py +0 -0
  2463. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/state/test_set_cmd.py +0 -0
  2464. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/state/test_show_cmd.py +0 -0
  2465. {agentic_devtools-0.2.118/tests/unit/orchestration/checkpointing → agentic_devtools-0.2.120/tests/unit/cli/subprocess_utils}/__init__.py +0 -0
  2466. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/subprocess_utils/test_run_safe.py +0 -0
  2467. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/subprocess_utils/test_run_safe_integration.py +0 -0
  2468. {agentic_devtools-0.2.118/tests/unit/orchestration/graph_builder → agentic_devtools-0.2.120/tests/unit/cli/tasks}/__init__.py +0 -0
  2469. {agentic_devtools-0.2.118/tests/unit/orchestration/pilot_workflow → agentic_devtools-0.2.120/tests/unit/cli/tasks/commands}/__init__.py +0 -0
  2470. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_handle_task_completed.py +0 -0
  2471. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_helper_functions.py +0 -0
  2472. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_list_tasks.py +0 -0
  2473. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_safe_print_unicode_error.py +0 -0
  2474. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_show_other_incomplete_tasks.py +0 -0
  2475. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_task_command_integration.py +0 -0
  2476. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_task_id_argument.py +0 -0
  2477. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_task_log.py +0 -0
  2478. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_task_log_line_limits.py +0 -0
  2479. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_task_status.py +0 -0
  2480. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_task_wait.py +0 -0
  2481. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_task_wait_value_error_handling.py +0 -0
  2482. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_tasks_clean.py +0 -0
  2483. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/tasks/commands/test_try_advance_pr_review_to_decision.py +0 -0
  2484. {agentic_devtools-0.2.118/tests/unit/orchestration/review → agentic_devtools-0.2.120/tests/unit/cli/testing}/__init__.py +0 -0
  2485. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/conftest.py +0 -0
  2486. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test__infer_test_file_from_source.py +0 -0
  2487. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test__try_get_workspace_root.py +0 -0
  2488. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_async_wrappers.py +0 -0
  2489. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_create_test_file_parser.py +0 -0
  2490. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_get_workspace_root.py +0 -0
  2491. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_run_subprocess_with_streaming.py +0 -0
  2492. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_run_tests.py +0 -0
  2493. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_run_tests_file.py +0 -0
  2494. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_run_tests_file_sync.py +0 -0
  2495. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_run_tests_pattern.py +0 -0
  2496. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_run_tests_quick.py +0 -0
  2497. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_run_tests_quick_sync.py +0 -0
  2498. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/testing/test_run_tests_sync.py +0 -0
  2499. {agentic_devtools-0.2.118/tests/unit/orchestration/review/graph_builder → agentic_devtools-0.2.120/tests/unit/cli/vpn}/__init__.py +0 -0
  2500. {agentic_devtools-0.2.118/tests/unit/orchestration/review/nodes → agentic_devtools-0.2.120/tests/unit/cli/vpn/commands}/__init__.py +0 -0
  2501. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/vpn/commands/test_vpn_run_cmd.py +0 -0
  2502. {agentic_devtools-0.2.118/tests/unit/orchestration/review/preflight → agentic_devtools-0.2.120/tests/unit/cli/vpn/runner}/__init__.py +0 -0
  2503. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/vpn/runner/test__detect_vpn_requirement_from_command.py +0 -0
  2504. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/vpn/runner/test__execute_command.py +0 -0
  2505. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/vpn/runner/test_run_with_vpn_context.py +0 -0
  2506. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/vpn/runner/test_vpnrequirement.py +0 -0
  2507. {agentic_devtools-0.2.118/tests/unit/orchestration/review/runner → agentic_devtools-0.2.120/tests/unit/cli/vscode_tasks}/__init__.py +0 -0
  2508. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/vscode_tasks/test_remove_auto_start_task.py +0 -0
  2509. {agentic_devtools-0.2.118/tests/unit/orchestration/runner → agentic_devtools-0.2.120/tests/unit/cli/workflows}/__init__.py +0 -0
  2510. {agentic_devtools-0.2.118/tests/unit/orchestration/state_schema → agentic_devtools-0.2.120/tests/unit/cli/workflows/advancement}/__init__.py +0 -0
  2511. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_branch_pushed.py +0 -0
  2512. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_commit.py +0 -0
  2513. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_jira_comment.py +0 -0
  2514. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_jira_issue_retrieved.py +0 -0
  2515. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_pr_creation.py +0 -0
  2516. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_pr_review.py +0 -0
  2517. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/applied_suggestions/__init__.py +0 -0
  2518. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/applied_suggestions/test_appliedsuggestionentry.py +0 -0
  2519. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/applied_suggestions/test_appliedsuggestionsstate.py +0 -0
  2520. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/applied_suggestions/test_get_applied_suggestions_file_path.py +0 -0
  2521. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/applied_suggestions/test_load_applied_suggestions_state.py +0 -0
  2522. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/applied_suggestions/test_load_from_branch.py +0 -0
  2523. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/applied_suggestions/test_save_applied_suggestions_state.py +0 -0
  2524. {agentic_devtools-0.2.118/tests/unit/prompts → agentic_devtools-0.2.120/tests/unit/cli/workflows/base}/__init__.py +0 -0
  2525. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/base/test__state_key_to_variable_name.py +0 -0
  2526. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/base/test_advance_workflow_step.py +0 -0
  2527. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/base/test_clear_state_for_workflow_initiation.py +0 -0
  2528. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/base/test_collect_variables_from_state.py +0 -0
  2529. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/base/test_initiate_workflow.py +0 -0
  2530. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/base/test_validate_required_state.py +0 -0
  2531. {agentic_devtools-0.2.118/tests/unit/prompts/loader → agentic_devtools-0.2.120/tests/unit/cli/workflows/checklist}/__init__.py +0 -0
  2532. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/conftest.py +0 -0
  2533. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/test_checklist.py +0 -0
  2534. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/test_checklistitem.py +0 -0
  2535. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/test_get_checklist.py +0 -0
  2536. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/test_get_checklist_file_path.py +0 -0
  2537. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/test_initialize_checklist.py +0 -0
  2538. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/test_mark_items_completed.py +0 -0
  2539. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/test_parse_completed_items_arg.py +0 -0
  2540. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/checklist/test_save_checklist.py +0 -0
  2541. {agentic_devtools-0.2.118/tests/unit/skill_injector → agentic_devtools-0.2.120/tests/unit/cli/workflows/commands}/__init__.py +0 -0
  2542. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/conftest.py +0 -0
  2543. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__copy_review_state_to_apply_suggestions.py +0 -0
  2544. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__effective_argv.py +0 -0
  2545. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__ensure_bootstrap_identity.py +0 -0
  2546. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__execute_retrieve_step.py +0 -0
  2547. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__fetch_issue_for_prompt.py +0 -0
  2548. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__format_auto_setup_success_message.py +0 -0
  2549. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__format_jira_issue_comments.py +0 -0
  2550. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__format_jira_issue_prompt_fields.py +0 -0
  2551. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__parse_bool_interactive.py +0 -0
  2552. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test__stringify_jira_text_value.py +0 -0
  2553. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_advance_pull_request_review_workflow.py +0 -0
  2554. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_advance_work_on_jira_issue_workflow.py +0 -0
  2555. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_advance_workflow_cmd.py +0 -0
  2556. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_create_checklist_cmd.py +0 -0
  2557. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_engine_langchain_routing.py +0 -0
  2558. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_get_workflow_cmd.py +0 -0
  2559. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_apply_pull_request_review_suggestions_workflow.py +0 -0
  2560. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_break_down_issue_into_subtasks_workflow.py +0 -0
  2561. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_create_jira_epic_workflow.py +0 -0
  2562. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_create_jira_issue_workflow.py +0 -0
  2563. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_create_jira_subtask_workflow.py +0 -0
  2564. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_optimize_issue_for_ai_agent_workflow.py +0 -0
  2565. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_pr_merge_orchestrator_workflow.py +0 -0
  2566. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_pull_request_review_workflow.py +0 -0
  2567. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_update_jira_issue_workflow.py +0 -0
  2568. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_initiate_work_on_jira_issue_workflow.py +0 -0
  2569. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_notify_workflow_event.py +0 -0
  2570. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_setup_worktree_background_cmd.py +0 -0
  2571. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_show_checklist_cmd.py +0 -0
  2572. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/commands/test_update_checklist_cmd.py +0 -0
  2573. {agentic_devtools-0.2.118/tests/unit/state → agentic_devtools-0.2.120/tests/unit/cli/workflows/engine_resolution}/__init__.py +0 -0
  2574. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/engine_resolution/test_resolve_review_engine.py +0 -0
  2575. {agentic_devtools-0.2.118/tests/unit/submission_manager → agentic_devtools-0.2.120/tests/unit/cli/workflows/manager}/__init__.py +0 -0
  2576. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test__build_command_hint.py +0 -0
  2577. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test__check_required_tasks_status.py +0 -0
  2578. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test__render_failure_prompt.py +0 -0
  2579. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test__render_step_prompt.py +0 -0
  2580. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test__render_waiting_prompt.py +0 -0
  2581. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test_get_next_step.py +0 -0
  2582. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test_get_next_workflow_prompt.py +0 -0
  2583. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test_get_next_workflow_prompt_cmd.py +0 -0
  2584. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test_get_workflow_definition.py +0 -0
  2585. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test_nextpromptresult.py +0 -0
  2586. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test_notify_workflow_event.py +0 -0
  2587. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/manager/test_promptstatus.py +0 -0
  2588. {agentic_devtools-0.2.118/tests/unit/submission_processor → agentic_devtools-0.2.120/tests/unit/cli/workflows/preflight}/__init__.py +0 -0
  2589. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/preflight/test_check_worktree_and_branch.py +0 -0
  2590. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/preflight/test_generate_setup_instructions.py +0 -0
  2591. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/preflight/test_get_current_git_branch.py +0 -0
  2592. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/preflight/test_get_git_repo_root.py +0 -0
  2593. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/preflight/test_perform_auto_setup.py +0 -0
  2594. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/preflight/test_preflightresult.py +0 -0
  2595. {agentic_devtools-0.2.118/tests/unit/task_state → agentic_devtools-0.2.120/tests/unit/cli/workflows/worktree_setup}/__init__.py +0 -0
  2596. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__cleanup_pending_auto_start_marker.py +0 -0
  2597. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__detect_git_root.py +0 -0
  2598. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__detect_python_scripts_dir.py +0 -0
  2599. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__focus_vscode_window.py +0 -0
  2600. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__maybe_inject_auto_start_before_vscode.py +0 -0
  2601. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__print_agent_instructions_block.py +0 -0
  2602. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__prompt_file_relative_path.py +0 -0
  2603. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__propagate_agdt_cache.py +0 -0
  2604. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__resolve_state_context_in_worktree.py +0 -0
  2605. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__run_auto_execute_command.py +0 -0
  2606. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__setup_worktree_from_state.py +0 -0
  2607. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__shell_quote.py +0 -0
  2608. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_apply_pr_suggestions.py +0 -0
  2609. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_create_jira_epic.py +0 -0
  2610. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_create_jira_issue.py +0 -0
  2611. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_create_jira_subtask.py +0 -0
  2612. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_pr_review.py +0 -0
  2613. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_update_jira_issue.py +0 -0
  2614. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_work_on_jira_issue.py +0 -0
  2615. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_workflow.py +0 -0
  2616. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__try_terminal_send_fallback.py +0 -0
  2617. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__wait_for_prompt_file.py +0 -0
  2618. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__workflow_prompt_filenames.py +0 -0
  2619. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__workflow_start_prompts.py +0 -0
  2620. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test__write_pending_auto_start_marker.py +0 -0
  2621. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_check_worktree_exists.py +0 -0
  2622. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_create_placeholder_and_setup_worktree.py +0 -0
  2623. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_create_placeholder_issue.py +0 -0
  2624. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_create_worktree.py +0 -0
  2625. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_find_workspace_file.py +0 -0
  2626. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_generate_workflow_branch_name.py +0 -0
  2627. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_get_ai_agent_continuation_prompt.py +0 -0
  2628. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_get_current_branch.py +0 -0
  2629. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_get_main_repo_root.py +0 -0
  2630. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_get_repos_parent_dir.py +0 -0
  2631. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_get_worktree_continuation_prompt.py +0 -0
  2632. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_inject_auto_start_task.py +0 -0
  2633. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_inject_git_path_settings.py +0 -0
  2634. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_inject_python_path_settings.py +0 -0
  2635. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_inject_task_permission_settings.py +0 -0
  2636. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_is_in_worktree.py +0 -0
  2637. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_is_vscode_available.py +0 -0
  2638. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_open_vscode_workspace.py +0 -0
  2639. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_placeholderissueresult.py +0 -0
  2640. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_run_worktree_setup_script.py +0 -0
  2641. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_setup_worktree_environment.py +0 -0
  2642. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_setup_worktree_in_background_sync.py +0 -0
  2643. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_start_worktree_setup_background.py +0 -0
  2644. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_switch_to_main_branch.py +0 -0
  2645. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_worktreesetupresult.py +0 -0
  2646. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/cli/workflows/worktree_setup/test_worktreestatecontext.py +0 -0
  2647. {agentic_devtools-0.2.118/tests/unit/tools → agentic_devtools-0.2.120/tests/unit/config}/__init__.py +0 -0
  2648. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/config/test_load_platform_config.py +0 -0
  2649. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/config/test_load_repo_config.py +0 -0
  2650. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/config/test_load_review_focus_areas.py +0 -0
  2651. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/config/test_save_platform_config.py +0 -0
  2652. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/conftest.py +0 -0
  2653. {agentic_devtools-0.2.118/tests/unit/tools/azure_devops → agentic_devtools-0.2.120/tests/unit/context}/__init__.py +0 -0
  2654. {agentic_devtools-0.2.118/tests/unit/tools/git → agentic_devtools-0.2.120/tests/unit/context/models}/__init__.py +0 -0
  2655. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context/models/test_agentcontext.py +0 -0
  2656. {agentic_devtools-0.2.118/tests/unit/tools/jira → agentic_devtools-0.2.120/tests/unit/context/nodes}/__init__.py +0 -0
  2657. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context/nodes/test_retrieve_context_node.py +0 -0
  2658. {agentic_devtools-0.2.118/tests/workflows → agentic_devtools-0.2.120/tests/unit/context/retriever}/__init__.py +0 -0
  2659. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context/retriever/test_issuecontextretriever.py +0 -0
  2660. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_budgetresult.py +0 -0
  2661. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_collapse_whitespace.py +0 -0
  2662. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_contextbudgeterror.py +0 -0
  2663. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_enforce_context_budget.py +0 -0
  2664. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_hard_truncate.py +0 -0
  2665. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_reductionstage.py +0 -0
  2666. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_remove_image_references.py +0 -0
  2667. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_strip_markdown_formatting.py +0 -0
  2668. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/context_budget/test_validate_content_shape.py +0 -0
  2669. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_cross_platform_behavior.py +0 -0
  2670. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_file_lock_error.py +0 -0
  2671. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_lock_file.py +0 -0
  2672. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_lock_functions.py +0 -0
  2673. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_locked_file.py +0 -0
  2674. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_locked_file_edge_cases.py +0 -0
  2675. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_locked_state_file.py +0 -0
  2676. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_unix_file_locking.py +0 -0
  2677. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_unlock_file.py +0 -0
  2678. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/file_locking/test_windows_file_locking.py +0 -0
  2679. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/mcp/server/test__load_azure_devops_config.py +0 -0
  2680. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/mcp/server/test__load_jira_config.py +0 -0
  2681. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/mcp/server/test_create_mcp_server.py +0 -0
  2682. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/mcp/server/test_main.py +0 -0
  2683. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/checkpointing/test_get_checkpointer.py +0 -0
  2684. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/graph_builder/test_build_work_on_issue_graph.py +0 -0
  2685. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test__utc_now.py +0 -0
  2686. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_checklist_creation_node.py +0 -0
  2687. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_commit_node.py +0 -0
  2688. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_completion_node.py +0 -0
  2689. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_get_mermaid_diagram.py +0 -0
  2690. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_implementation_node.py +0 -0
  2691. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_implementation_review_node.py +0 -0
  2692. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_initiate_node.py +0 -0
  2693. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_planning_gate_node.py +0 -0
  2694. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_planning_node.py +0 -0
  2695. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_pull_request_node.py +0 -0
  2696. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_route_after_implementation.py +0 -0
  2697. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_route_after_initiate.py +0 -0
  2698. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_route_after_plan.py +0 -0
  2699. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_route_after_verify.py +0 -0
  2700. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_setup_node.py +0 -0
  2701. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/pilot_workflow/test_verification_node.py +0 -0
  2702. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/graph_builder/test_build_pr_review_graph.py +0 -0
  2703. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/nodes/test_complete_node.py +0 -0
  2704. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/nodes/test_fetch_pr_details_node.py +0 -0
  2705. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/nodes/test_review_file_node.py +0 -0
  2706. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/nodes/test_scaffold_node.py +0 -0
  2707. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/nodes/test_summarize_node.py +0 -0
  2708. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/preflight/test_validate_langchain_dependencies.py +0 -0
  2709. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/runner/test__record_failed_session.py +0 -0
  2710. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/runner/test__record_session.py +0 -0
  2711. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/review/runner/test_run_langchain_review.py +0 -0
  2712. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/runner/test_run_langchain_workflow.py +0 -0
  2713. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/state_schema/test_workonissueevent.py +0 -0
  2714. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/orchestration/state_schema/test_workonissuestate.py +0 -0
  2715. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/conftest.py +0 -0
  2716. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_get_prompts_dir.py +0 -0
  2717. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_get_required_variables.py +0 -0
  2718. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_get_temp_output_dir.py +0 -0
  2719. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_get_template_filename.py +0 -0
  2720. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_get_template_path.py +0 -0
  2721. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_load_and_render_prompt.py +0 -0
  2722. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_load_ci_template.py +0 -0
  2723. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_load_prompt_template.py +0 -0
  2724. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_log_prompt_with_save_notice.py +0 -0
  2725. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_pr_review_file_review_prompt_rendering.py +0 -0
  2726. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_pr_review_pull_request_overview_prompt_rendering.py +0 -0
  2727. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_save_generated_prompt.py +0 -0
  2728. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_silentundefined.py +0 -0
  2729. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_substitute_variables.py +0 -0
  2730. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_substitute_variables_syntax_error.py +0 -0
  2731. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_template_validation_error.py +0 -0
  2732. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/prompts/loader/test_validate_template_variables.py +0 -0
  2733. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test__derive_fallback_description_from_markdown.py +0 -0
  2734. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test__ensure_github_gitignore_unignores_agdt.py +0 -0
  2735. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test__extract_description.py +0 -0
  2736. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test__flatten_filename.py +0 -0
  2737. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test__generate_readme.py +0 -0
  2738. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test__get_source_dir.py +0 -0
  2739. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test__list_md_files.py +0 -0
  2740. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test__parse_frontmatter.py +0 -0
  2741. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/skill_injector/test_inject_skills.py +0 -0
  2742. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test__get_git_email.py +0 -0
  2743. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test__get_or_refresh_identity.py +0 -0
  2744. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test__read_identity_cache.py +0 -0
  2745. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test__resolve_identity.py +0 -0
  2746. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test__sync_bootstrap_for_context_key.py +0 -0
  2747. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test__update_bootstrap_worktree_key.py +0 -0
  2748. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test__write_identity_cache.py +0 -0
  2749. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_clear_state.py +0 -0
  2750. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_clear_workflow_state.py +0 -0
  2751. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_delete_pin_file.py +0 -0
  2752. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_delete_value.py +0 -0
  2753. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_all_keys.py +0 -0
  2754. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_bootstrap_state.py +0 -0
  2755. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_pull_request_id.py +0 -0
  2756. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_pypi_dry_run.py +0 -0
  2757. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_pypi_package_name.py +0 -0
  2758. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_pypi_repository.py +0 -0
  2759. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_pypi_version.py +0 -0
  2760. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_state_dir.py +0 -0
  2761. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_state_file_path.py +0 -0
  2762. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_thread_id.py +0 -0
  2763. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_value.py +0 -0
  2764. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_get_workflow_state.py +0 -0
  2765. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_is_dry_run.py +0 -0
  2766. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_is_safe_dir_segment.py +0 -0
  2767. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_is_workflow_active.py +0 -0
  2768. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_load_state.py +0 -0
  2769. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_load_state_locked.py +0 -0
  2770. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_read_and_validate_pin_file.py +0 -0
  2771. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_refresh_pin_file_ttl.py +0 -0
  2772. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_save_state.py +0 -0
  2773. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_save_state_locked.py +0 -0
  2774. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_bootstrap_state.py +0 -0
  2775. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_context_value.py +0 -0
  2776. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_dry_run.py +0 -0
  2777. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_pull_request_id.py +0 -0
  2778. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_pypi_dry_run.py +0 -0
  2779. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_pypi_package_name.py +0 -0
  2780. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_pypi_repository.py +0 -0
  2781. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_pypi_version.py +0 -0
  2782. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_resolve_thread.py +0 -0
  2783. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_thread_id.py +0 -0
  2784. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_value.py +0 -0
  2785. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_set_workflow_state.py +0 -0
  2786. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_should_resolve_thread.py +0 -0
  2787. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_update_workflow_context.py +0 -0
  2788. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_update_workflow_step.py +0 -0
  2789. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_workflow_state_integration.py +0 -0
  2790. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/state/test_write_pin_file.py +0 -0
  2791. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_manager/test_create_submission_manager.py +0 -0
  2792. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_manager/test_faileditemsummary.py +0 -0
  2793. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_manager/test_failurereport.py +0 -0
  2794. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_manager/test_submissionitem.py +0 -0
  2795. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_manager/test_submissionmanager.py +0 -0
  2796. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_manager/test_submissionstatus.py +0 -0
  2797. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_manager/test_transientsubmissionerror.py +0 -0
  2798. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_processor/conftest.py +0 -0
  2799. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_processor/test__get_attribution_params.py +0 -0
  2800. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_processor/test__validate_suggestions.py +0 -0
  2801. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_processor/test_create_review_processor.py +0 -0
  2802. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/submission_processor/test_process_submission.py +0 -0
  2803. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test__update_task_in_all_tasks.py +0 -0
  2804. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_add_task.py +0 -0
  2805. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_background_task.py +0 -0
  2806. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_cleanup_expired_tasks.py +0 -0
  2807. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_duration_seconds.py +0 -0
  2808. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_from_dict_invalid_status.py +0 -0
  2809. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_active_tasks.py +0 -0
  2810. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_all_tasks.py +0 -0
  2811. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_all_tasks_file_path.py +0 -0
  2812. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_background_tasks.py +0 -0
  2813. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_background_tasks_dir.py +0 -0
  2814. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_failed_most_recent_per_command.py +0 -0
  2815. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_incomplete_most_recent_per_command.py +0 -0
  2816. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_logs_dir.py +0 -0
  2817. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_most_recent_tasks_per_command.py +0 -0
  2818. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_other_incomplete_tasks.py +0 -0
  2819. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_recent_tasks.py +0 -0
  2820. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_task_by_id.py +0 -0
  2821. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_task_from_all_tasks.py +0 -0
  2822. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_get_tasks_by_status.py +0 -0
  2823. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_is_expired.py +0 -0
  2824. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_print_task_tracking_info.py +0 -0
  2825. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_remove_task.py +0 -0
  2826. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_save_background_tasks.py +0 -0
  2827. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_sort_tasks.py +0 -0
  2828. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_task_lifecycle.py +0 -0
  2829. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_task_status.py +0 -0
  2830. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/task_state/test_update_task.py +0 -0
  2831. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/azure_devops/test__escape_for_cmd.py +0 -0
  2832. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/azure_devops/test__get_requests.py +0 -0
  2833. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/azure_devops/test_add_pull_request_comment.py +0 -0
  2834. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/azure_devops/test_add_reviewer.py +0 -0
  2835. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/azure_devops/test_create_pull_request.py +0 -0
  2836. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/azure_devops/test_reply_to_pull_request_thread.py +0 -0
  2837. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/azure_devops/test_update_review_narrative.py +0 -0
  2838. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test__capture.py +0 -0
  2839. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test__run_op.py +0 -0
  2840. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test_amend_commit.py +0 -0
  2841. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test_create_commit.py +0 -0
  2842. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test_force_push.py +0 -0
  2843. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test_get_recent_changes.py +0 -0
  2844. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test_publish_branch.py +0 -0
  2845. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test_push.py +0 -0
  2846. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test_save_work.py +0 -0
  2847. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/git/test_stage_changes.py +0 -0
  2848. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/jira/test__fetch_remote_links.py +0 -0
  2849. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/jira/test_add_comment.py +0 -0
  2850. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/jira/test_create_epic.py +0 -0
  2851. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/jira/test_create_issue.py +0 -0
  2852. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/jira/test_create_subtask.py +0 -0
  2853. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/unit/tools/jira/test_fetch_issue_context.py +0 -0
  2854. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/vpn/test_vpn_commands.py +0 -0
  2855. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/vpn/test_vpn_runner.py +0 -0
  2856. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/workflows/conftest.py +0 -0
  2857. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/workflows/test_copilot_generate.py +0 -0
  2858. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/workflows/test_enforce_budget.py +0 -0
  2859. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/workflows/test_fix_markdown_deterministic.py +0 -0
  2860. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/workflows/test_minimized_ci_workflows.py +0 -0
  2861. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/workflows/test_workflow_end_to_end.py +0 -0
  2862. {agentic_devtools-0.2.118 → agentic_devtools-0.2.120}/tests/workflows/test_wrap_markdown_lines.py +0 -0
@@ -0,0 +1,3819 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # generate-spec-from-issue.sh - Generate a full speckit planning artifact suite
4
+ #
5
+ # Runs the complete speckit pipeline: specify → clarify → checklist → plan →
6
+ # tasks → analyze → markdownlint validation. Each phase invokes the Copilot
7
+ # SDK via copilot_generate.py.
8
+ #
9
+ # When --phase <N> is provided, runs only the specified phase (1-5) and its
10
+ # markdownlint validation. Phase mapping:
11
+ # 1 → specify (spec.md)
12
+ # 2 → clarify + checklist (spec.md, checklists/requirements.md)
13
+ # 3 → plan (plan.md + optional artifacts)
14
+ # 4 → tasks (tasks.md)
15
+ # 5 → analyze (analysis-report.md)
16
+ #
17
+ # When --phase is omitted, runs all phases sequentially (backward compatible).
18
+ #
19
+ # Usage: generate-spec-from-issue.sh [--phase <1-5>] [--max-retries <N>]
20
+ #
21
+ # Environment Variables (required):
22
+ # ISSUE_NUMBER - The GitHub issue number
23
+ # ISSUE_TITLE - The issue title
24
+ # ISSUE_BODY - The issue body/description
25
+ # ISSUE_URL - The issue URL
26
+ # SHORT_NAME - Sanitized short name for branch/directory
27
+ # COPILOT_GITHUB_TOKEN - Provided by the workflow via GitHub App token
28
+ #
29
+ # Environment Variables (optional):
30
+ # COPILOT_MODEL - Model to use via the Copilot SDK (default: claude-opus-4.6)
31
+ # COPILOT_TIMEOUT - Seconds to wait for a Copilot SDK response (default: 600).
32
+ # Plan, Tasks, and Analyze phases override this to 900.
33
+ # SPEC_BASE_PATH - Base path for specs (default: specs)
34
+ # AGDT_PLAN_CONTEXT_BUDGET - Context budget in characters for the plan phase
35
+ # (default: 32000). If the spec content exceeds this
36
+ # limit, deterministic reduction is applied before
37
+ # calling the LLM.
38
+ # MARKDOWNLINT_MAX_ITERATIONS - Maximum number of markdownlint validation/
39
+ # remediation iterations (default: 5). Phase 7
40
+ # retries up to this limit before failing.
41
+ # SPECKIT_COPILOT_CLI_ON_STALL - Enable recovery layers (Layer 3-5) on stall
42
+ # detection (default: true). Set to "false" to
43
+ # disable and fail immediately on stall.
44
+ # SPECKIT_CRITICAL_GATE_REMEDIATION - Enable/disable CRITICAL analysis gate
45
+ # remediation (default: true). When true,
46
+ # the gate attempts multi-layer LLM-based
47
+ # remediation before failing.
48
+ # SPECKIT_CRITICAL_GATE_MAX_RETRIES - Max retries for Layer 1 (standard LLM
49
+ # remediation) of CRITICAL gate (default: 2).
50
+ #
51
+ # Outputs:
52
+ # GITHUB_OUTPUT: branch_name, spec_file, issue_number, spec_dir
53
+
54
+ set -euo pipefail
55
+
56
+ # ---------------------------------------------------------------------------
57
+ # Argument parsing: optional --phase <1-5>
58
+ # ---------------------------------------------------------------------------
59
+ PHASE=""
60
+ MAX_RETRIES=""
61
+ while [[ $# -gt 0 ]]; do
62
+ case "$1" in
63
+ --phase)
64
+ PHASE="${2:-}"
65
+ if [[ -z "$PHASE" ]]; then
66
+ echo "Error: --phase requires a value (1-5)" >&2
67
+ exit 1
68
+ fi
69
+ if [[ ! "$PHASE" =~ ^[1-5]$ ]]; then
70
+ echo "Error: --phase must be 1-5 (got '$PHASE')" >&2
71
+ exit 1
72
+ fi
73
+ shift 2
74
+ ;;
75
+ --max-retries)
76
+ MAX_RETRIES="${2:-}"
77
+ if [[ -z "$MAX_RETRIES" ]]; then
78
+ echo "Error: --max-retries requires a value" >&2
79
+ exit 1
80
+ fi
81
+ if [[ ! "$MAX_RETRIES" =~ ^[0-9]+$ ]]; then
82
+ echo "Error: --max-retries must be a non-negative integer (got '$MAX_RETRIES')" >&2
83
+ exit 1
84
+ fi
85
+ shift 2
86
+ ;;
87
+ *)
88
+ echo "Error: Unknown argument '$1'" >&2
89
+ exit 1
90
+ ;;
91
+ esac
92
+ done
93
+
94
+ # Validate required environment variables
95
+ : "${ISSUE_NUMBER:?ISSUE_NUMBER is required}"
96
+ : "${ISSUE_TITLE:?ISSUE_TITLE is required}"
97
+ : "${SHORT_NAME:?SHORT_NAME is required}"
98
+
99
+ : "${COPILOT_GITHUB_TOKEN:?COPILOT_GITHUB_TOKEN is required (provided by workflow via GitHub App token)}"
100
+
101
+ ISSUE_BODY="${ISSUE_BODY:-}"
102
+ ISSUE_URL="${ISSUE_URL:-}"
103
+ COPILOT_MODEL="${COPILOT_MODEL:-claude-opus-4.6}"
104
+ SPEC_BASE_PATH="${SPEC_BASE_PATH:-specs}"
105
+ MARKDOWNLINT_MAX_ITERATIONS="${MARKDOWNLINT_MAX_ITERATIONS:-5}"
106
+ # Validate as a positive base-10 integer; fall back to default on bad input
107
+ # (e.g., non-numeric strings or octal-looking values like "08").
108
+ if ! [[ "$MARKDOWNLINT_MAX_ITERATIONS" =~ ^[0-9]+$ ]] || (( 10#$MARKDOWNLINT_MAX_ITERATIONS <= 0 )); then
109
+ echo "Warning: MARKDOWNLINT_MAX_ITERATIONS='$MARKDOWNLINT_MAX_ITERATIONS' is not a valid positive integer. Using default (5)." >&2
110
+ MARKDOWNLINT_MAX_ITERATIONS=5
111
+ fi
112
+ # Maximum prompt size in characters for per-file LLM remediation (NFR-004).
113
+ # Estimated token count = ceil(char_count / 4); 32000 chars ≈ 8000 tokens.
114
+ MARKDOWNLINT_PROMPT_MAX_CHARS=32000
115
+ # Pin markdownlint-cli2 version to prevent output format changes from breaking
116
+ # the parser. Update this AND .github/workflows/copilot-setup-steps.yml together.
117
+ MARKDOWNLINT_CLI2_VERSION="0.17.2"
118
+ # Enable/disable the enhanced recovery layers (Layer 3: multi-turn SDK remediation,
119
+ # Layer 4: alternate LLM remediation) on stall detection. Set to "false" to disable.
120
+ SPECKIT_COPILOT_CLI_ON_STALL="${SPECKIT_COPILOT_CLI_ON_STALL:-true}"
121
+ # Enable/disable CRITICAL analysis gate remediation. When enabled, the gate
122
+ # attempts LLM-based remediation before failing. Set to "false" to disable.
123
+ SPECKIT_CRITICAL_GATE_REMEDIATION="${SPECKIT_CRITICAL_GATE_REMEDIATION:-true}"
124
+ # Maximum retries for Layer 1 (standard LLM remediation) of the CRITICAL gate.
125
+ SPECKIT_CRITICAL_GATE_MAX_RETRIES="${SPECKIT_CRITICAL_GATE_MAX_RETRIES:-2}"
126
+ # Validate as a non-negative base-10 integer; fall back to default on bad input.
127
+ if ! [[ "$SPECKIT_CRITICAL_GATE_MAX_RETRIES" =~ ^[0-9]+$ ]]; then
128
+ echo "Warning: SPECKIT_CRITICAL_GATE_MAX_RETRIES='$SPECKIT_CRITICAL_GATE_MAX_RETRIES' is not a valid non-negative integer. Using default (2)." >&2
129
+ SPECKIT_CRITICAL_GATE_MAX_RETRIES=2
130
+ fi
131
+
132
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
133
+ REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
134
+
135
+ # Source the CRITICAL analysis gate library (FR-009)
136
+ # shellcheck source=check-analysis-gate.sh
137
+ source "$SCRIPT_DIR/check-analysis-gate.sh"
138
+
139
+ # Source shared retry library
140
+ # shellcheck source=lib/retry.sh
141
+ source "$SCRIPT_DIR/lib/retry.sh"
142
+
143
+ # Source Phase 1 spec validation library (FR-001, #1505)
144
+ # shellcheck source=lib/spec-validation.sh
145
+ source "$SCRIPT_DIR/lib/spec-validation.sh"
146
+
147
+ # ---------------------------------------------------------------------------
148
+ # Validate ISSUE_NUMBER is a positive integer (FR-011)
149
+ # ---------------------------------------------------------------------------
150
+ if [[ ! "$ISSUE_NUMBER" =~ ^[1-9][0-9]*$ ]]; then
151
+ echo "Error: ISSUE_NUMBER must be a positive integer (got '$ISSUE_NUMBER')" >&2
152
+ exit 1
153
+ fi
154
+
155
+ echo "=== SpecKit: Generating Full Planning Artifact Suite ==="
156
+ echo "Issue: #$ISSUE_NUMBER - $ISSUE_TITLE"
157
+ echo "Model: $COPILOT_MODEL"
158
+
159
+ # Function to get the next feature number (legacy autoincrement, kept for
160
+ # potential fallback use). Only counts directories/branches that match the
161
+ # legacy 3-digit prefix pattern ^[0-9]{3}- so that issue-numbered directories
162
+ # with non-3-digit prefixes (e.g. 42-foo, 1176-bar) do not inflate the
163
+ # autoincrement counter (FR-007). Note: 3-digit issue numbers (100–999) will
164
+ # still match the legacy pattern and be counted — this is an accepted overlap
165
+ # since the autoincrement function is only used as a fallback.
166
+ get_next_feature_number() {
167
+ local highest=0
168
+
169
+ # Check existing specs directories — only legacy 3-digit prefixed dirs
170
+ if [[ -d "$REPO_ROOT/$SPEC_BASE_PATH" ]]; then
171
+ for dir in "$REPO_ROOT/$SPEC_BASE_PATH"/*; do
172
+ [[ -d "$dir" ]] || continue
173
+ dirname=$(basename "$dir")
174
+ # Only match legacy 3-digit prefixed directories (FR-007)
175
+ echo "$dirname" | grep -q '^[0-9]\{3\}-' || continue
176
+ number=$(echo "$dirname" | grep -o '^[0-9]\{3\}')
177
+ number=$((10#$number))
178
+ if [[ $number -gt $highest ]]; then
179
+ highest=$number
180
+ fi
181
+ done
182
+ fi
183
+
184
+ # Check branches — already correctly filters ^[0-9]{3}-
185
+ branches=$(git branch -a 2>/dev/null || echo "")
186
+ if [[ -n "$branches" ]]; then
187
+ while IFS= read -r branch; do
188
+ clean_branch=$(echo "$branch" | sed 's/^[* ]*//; s|^remotes/[^/]*/||')
189
+ if echo "$clean_branch" | grep -q '^[0-9]\{3\}-'; then
190
+ number=$(echo "$clean_branch" | grep -o '^[0-9]\{3\}' || echo "0")
191
+ number=$((10#$number))
192
+ if [[ $number -gt $highest ]]; then
193
+ highest=$number
194
+ fi
195
+ fi
196
+ done <<< "$branches"
197
+ fi
198
+
199
+ echo $((highest + 1))
200
+ }
201
+
202
+ # ---------------------------------------------------------------------------
203
+ # Collision detection & directory reuse (FR-004, FR-012, FR-015)
204
+ #
205
+ # Use the GitHub issue number directly as the spec directory prefix instead
206
+ # of autoincrementing. If a directory for this issue already exists, reuse
207
+ # it (even if the issue title — and therefore SHORT_NAME — has changed).
208
+ # ---------------------------------------------------------------------------
209
+ EXISTING_DIRS=()
210
+
211
+ shopt -s nullglob
212
+ for dir in "$REPO_ROOT/$SPEC_BASE_PATH"/${ISSUE_NUMBER}-*; do
213
+ if [[ -d "$dir" ]]; then
214
+ EXISTING_DIRS+=("$dir")
215
+ fi
216
+ done
217
+ shopt -u nullglob
218
+
219
+ if (( ${#EXISTING_DIRS[@]} > 1 )); then
220
+ echo "Error: Found multiple existing spec directories for issue #$ISSUE_NUMBER:" >&2
221
+ for dir in "${EXISTING_DIRS[@]}"; do
222
+ echo " - $(basename "$dir")" >&2
223
+ done
224
+ echo "Refusing to choose one directory non-deterministically. Remove or rename the extra directories and retry." >&2
225
+ exit 1
226
+ fi
227
+
228
+ EXISTING_DIR=""
229
+ if (( ${#EXISTING_DIRS[@]} == 1 )); then
230
+ EXISTING_DIR="${EXISTING_DIRS[0]}"
231
+ fi
232
+
233
+ if [[ -n "$EXISTING_DIR" ]]; then
234
+ # FR-015: For 3-digit issue numbers (100-999), the prefix overlaps with
235
+ # the legacy ^[0-9]{3}- namespace. Verify that the candidate directory
236
+ # actually belongs to this issue by checking for a Source Issue marker.
237
+ if [[ ${#ISSUE_NUMBER} -eq 3 ]]; then
238
+ SOURCE_ISSUE_FOUND=false
239
+ for artifact in "$EXISTING_DIR/checklists/requirements.md" "$EXISTING_DIR/spec.md"; do
240
+ if [[ -f "$artifact" ]] && grep -Eq "\*\*Source Issue\*\*.*#${ISSUE_NUMBER}([^0-9]|$)" "$artifact"; then
241
+ SOURCE_ISSUE_FOUND=true
242
+ break
243
+ fi
244
+ done
245
+ if [[ "$SOURCE_ISSUE_FOUND" != "true" ]]; then
246
+ echo "Error: Found existing directory '$(basename "$EXISTING_DIR")' but it does not contain a matching Source Issue marker for #$ISSUE_NUMBER." >&2
247
+ echo "This may be an unrelated legacy directory. Refusing to reuse." >&2
248
+ exit 1
249
+ fi
250
+ fi
251
+
252
+ # Reuse existing directory (FR-012: stable identity even if title changed)
253
+ EXISTING_DIRNAME=$(basename "$EXISTING_DIR")
254
+ BRANCH_NAME="$EXISTING_DIRNAME"
255
+ SPEC_DIR="$EXISTING_DIR"
256
+ echo "Reusing existing spec directory: $EXISTING_DIRNAME"
257
+ else
258
+ # Create new directory with raw issue number prefix (FR-001)
259
+ BRANCH_NAME="${ISSUE_NUMBER}-${SHORT_NAME}"
260
+ SPEC_DIR="$REPO_ROOT/$SPEC_BASE_PATH/$BRANCH_NAME"
261
+ fi
262
+ SPEC_FILE="$SPEC_BASE_PATH/$(basename "$SPEC_DIR")/spec.md"
263
+
264
+ echo "Branch: $BRANCH_NAME"
265
+ echo "Spec Directory: $SPEC_DIR"
266
+
267
+ # Create spec directory structure
268
+ mkdir -p "$SPEC_DIR"
269
+ mkdir -p "$SPEC_DIR/checklists"
270
+ mkdir -p "$SPEC_DIR/contracts"
271
+
272
+ # Copy spec-directory markdownlint config override (stricter than root —
273
+ # enforces MD041 without the front_matter_title exemption since specs
274
+ # never use front matter).
275
+ # Compute the correct relative path to repo-root .markdownlint.json based on
276
+ # the actual depth of SPEC_DIR, so this works for any SPEC_BASE_PATH depth.
277
+ # NOTE: The root .markdownlint-cli2.jsonc has a "config" section, which
278
+ # disables per-directory .markdownlint.json discovery. Phase 7 lint calls
279
+ # therefore run with cwd=$spec_dir so markdownlint-cli2 does NOT find the
280
+ # root .markdownlint-cli2.jsonc, falling back to markdownlint's own
281
+ # per-file directory-based config resolution that honours this override.
282
+ _mdlint_template="$SCRIPT_DIR/templates/spec-markdownlint.json"
283
+ if [[ -f "$_mdlint_template" ]]; then
284
+ _spec_rel="${SPEC_DIR#"$REPO_ROOT/"}"
285
+ _depth=$(echo "$_spec_rel" | tr '/' '\n' | wc -l)
286
+ _extends_prefix=""
287
+ for (( _i=0; _i<_depth; _i++ )); do _extends_prefix="../$_extends_prefix"; done
288
+ _extends_path="${_extends_prefix}.markdownlint.json"
289
+ sed "s|\"extends\": \"../../.markdownlint.json\"|\"extends\": \"${_extends_path}\"|" \
290
+ "$_mdlint_template" > "$SPEC_DIR/.markdownlint.json"
291
+ fi
292
+
293
+ # ---------------------------------------------------------------------------
294
+ # Retry helper — provided by shared library (lib/retry.sh)
295
+ # Usage: call_with_retry <max_attempts> <initial_delay_seconds> <command...>
296
+ # ---------------------------------------------------------------------------
297
+
298
+ # ---------------------------------------------------------------------------
299
+ # call_llm <prompt_text>
300
+ #
301
+ # Generic LLM invocation via the Copilot SDK. Sends the prompt to
302
+ # copilot_generate.py and prints the response to stdout.
303
+ # Returns non-zero on empty/failed response.
304
+ # ---------------------------------------------------------------------------
305
+ call_llm() {
306
+ local prompt="$1"
307
+ local response=""
308
+
309
+ _call_api() {
310
+ response=$(printf '%s' "$prompt" | python "$SCRIPT_DIR/copilot_generate.py")
311
+ local exit_code=$?
312
+ if [[ $exit_code -ne 0 ]]; then
313
+ return "$exit_code"
314
+ fi
315
+ if [[ -z "$response" ]]; then
316
+ echo "Empty response from LLM (copilot_generate.py produced no output)." >&2
317
+ return 1
318
+ fi
319
+ return 0
320
+ }
321
+
322
+ if ! call_with_retry 3 5 _call_api; then
323
+ return 1
324
+ fi
325
+
326
+ printf '%s' "$response"
327
+ }
328
+
329
+ # ---------------------------------------------------------------------------
330
+ # append_model_footer <file>
331
+ #
332
+ # Appends a standard model-attribution footer to an artifact file.
333
+ # Idempotent: strips any existing footer before appending.
334
+ # ---------------------------------------------------------------------------
335
+ append_model_footer() {
336
+ local file="$1"
337
+ local tmp_footer_file="${file}.footer.tmp"
338
+ # Strip any existing footer to avoid duplication (only at end of file)
339
+ local content
340
+ content=$(_strip_footer_from_text "$(cat "$file")")
341
+ rm -f "$tmp_footer_file"
342
+ if ! printf '%s\n\n---\n*Generated by Copilot SDK (%s)*\n' "$content" "$COPILOT_MODEL" > "$tmp_footer_file"; then
343
+ echo "Error: Failed to write footer to temporary file: $tmp_footer_file" >&2
344
+ rm -f "$tmp_footer_file"
345
+ return 1
346
+ fi
347
+ if ! mv "$tmp_footer_file" "$file"; then
348
+ echo "Error: Failed to move file with footer into place: $file" >&2
349
+ rm -f "$tmp_footer_file"
350
+ return 1
351
+ fi
352
+ }
353
+
354
+ # ---------------------------------------------------------------------------
355
+ # strip_model_footer <text>
356
+ #
357
+ # Removes the model-attribution footer from artifact content before feeding
358
+ # it into an LLM prompt, so footers don't pollute the context or duplicate.
359
+ # Prints the stripped content to stdout.
360
+ # ---------------------------------------------------------------------------
361
+ strip_model_footer() {
362
+ _strip_footer_from_text "$1"
363
+ }
364
+
365
+ # ---------------------------------------------------------------------------
366
+ # _strip_footer_from_text <text>
367
+ #
368
+ # Internal helper: removes a trailing model-attribution footer from text.
369
+ # The sed pattern is anchored to end-of-string ($), so markdown horizontal
370
+ # rules (---) elsewhere in the content are preserved.
371
+ # ---------------------------------------------------------------------------
372
+ _strip_footer_from_text() {
373
+ local text="$1"
374
+ # Remove trailing model-attribution footer: blank line(s) + --- + attribution line.
375
+ # The sed substitution only matches at the end of text ($), so markdown horizontal
376
+ # rules (---) elsewhere in the content are preserved. When no footer is present
377
+ # the substitution is a no-op and the text passes through unchanged.
378
+ # Note: use [[:space:]] instead of \s for POSIX ERE portability (GNU sed treats \s as literal 's')
379
+ printf '%s' "$text" | sed -E ':a;N;$!ba;s/\n*\n---\n\*Generated by Copilot SDK \([^)]*\)\*[[:space:]]*$//'
380
+ }
381
+
382
+ # ========================== Markdownlint Validation ==========================
383
+
384
+ # ---------------------------------------------------------------------------
385
+ # log_file_header <phase_label> <filepath>
386
+ #
387
+ # Logs the first 3 lines of a generated file to stderr for quick preamble
388
+ # detection. If the file is empty, logs "(empty)" instead.
389
+ # ---------------------------------------------------------------------------
390
+ log_file_header() {
391
+ local phase_label="$1"
392
+ local filepath="$2"
393
+ local filename
394
+ filename=$(basename "$filepath")
395
+ if [[ ! -s "$filepath" ]]; then
396
+ echo "[$phase_label] First lines of $filename: (empty)" >&2
397
+ return 0
398
+ fi
399
+ local first_lines
400
+ first_lines=$(head -n 3 "$filepath" | awk 'BEGIN { sep = "" } { printf "%s%s", sep, $0; sep = " | " }')
401
+ echo "[$phase_label] First lines of $filename: $first_lines" >&2
402
+ }
403
+
404
+ # ---------------------------------------------------------------------------
405
+ # check_npx_available
406
+ #
407
+ # Guards against missing npx. Returns 0 if npx is available, 1 otherwise
408
+ # with an actionable error message to stderr.
409
+ # ---------------------------------------------------------------------------
410
+ check_npx_available() {
411
+ if ! command -v npx &>/dev/null; then
412
+ echo "Error: npx is not available. Install Node.js/npm to enable markdownlint validation." >&2
413
+ return 1
414
+ fi
415
+ return 0
416
+ }
417
+
418
+ # ---------------------------------------------------------------------------
419
+ # _join_continuation_lines <raw_output>
420
+ #
421
+ # Pre-processes raw markdownlint output to join continuation lines back onto
422
+ # the preceding violation line. markdownlint-cli2 v0.22+ can wrap long
423
+ # [Context: ...] descriptions onto separate lines. A "violation start line"
424
+ # is any line matching ^.+\.md:[0-9]+ (file path followed by : and a line number).
425
+ # Subsequent lines that do NOT match that pattern are appended to the previous
426
+ # violation line separated by a single space, except for known markdownlint
427
+ # metadata/footer lines and blank separators, which act as boundaries.
428
+ # ---------------------------------------------------------------------------
429
+ _join_continuation_lines() {
430
+ local raw="$1"
431
+ [[ -z "$raw" ]] && return 0
432
+ printf '%s\n' "$raw" | awk '
433
+ function flush_buf() {
434
+ if (buf != "") {
435
+ print buf
436
+ buf = ""
437
+ }
438
+ }
439
+ /^.+\.md:[0-9]+/ {
440
+ flush_buf()
441
+ buf = $0
442
+ next
443
+ }
444
+ /^[[:space:]]*$/ {
445
+ flush_buf()
446
+ next
447
+ }
448
+ /^markdownlint-cli2/ || /^Finding:/ || /^Linting:/ || /^Summary:/ {
449
+ flush_buf()
450
+ next
451
+ }
452
+ {
453
+ if (buf != "") buf = buf " " $0
454
+ }
455
+ END {
456
+ flush_buf()
457
+ }
458
+ '
459
+ }
460
+
461
+ # ---------------------------------------------------------------------------
462
+ # _count_raw_violations <raw_output>
463
+ #
464
+ # Fallback violation counter: counts lines matching ^.+\.md:[0-9]+ in the raw
465
+ # markdownlint output. Used only for logging when parse_markdownlint_output
466
+ # returns 0 violations despite a non-zero lint exit code.
467
+ # ---------------------------------------------------------------------------
468
+ _count_raw_violations() {
469
+ local raw="$1"
470
+ [[ -z "$raw" ]] && { echo "0"; return 0; }
471
+ local count
472
+ count=$(printf '%s\n' "$raw" | grep -cE '^.+\.md:[0-9]+' || true)
473
+ echo "$count"
474
+ }
475
+
476
+ # ---------------------------------------------------------------------------
477
+ # parse_markdownlint_output <raw_output>
478
+ #
479
+ # Parses markdownlint-cli2 stdout/stderr output into structured violation
480
+ # records. Each output line is in the format:
481
+ # filename:line:col rule/alias description
482
+ # Prints one record per line as tab-separated: filename\tline\tcol\trule\tdescription
483
+ # ---------------------------------------------------------------------------
484
+ parse_markdownlint_output() {
485
+ local raw="$1"
486
+ if [[ -z "$raw" ]]; then
487
+ return 0
488
+ fi
489
+ # Match lines like: path/file.md:10:1 MD013/line-length Expected: ...
490
+ # or: path/file.md:10:1 error MD013/line-length Expected: ...
491
+ # or: path/file.md:10 MD013/line-length Expected: ...
492
+ # markdownlint-cli2 v0.22+ inserts "error"/"warning" between location and rule
493
+ _join_continuation_lines "$raw" | while IFS= read -r line; do
494
+ # Skip empty lines and summary/metadata lines
495
+ [[ -z "$line" ]] && continue
496
+ [[ "$line" =~ ^markdownlint-cli2 ]] && continue
497
+ [[ "$line" =~ ^Finding: ]] && continue
498
+ [[ "$line" =~ ^Linting: ]] && continue
499
+ [[ "$line" =~ ^Summary: ]] && continue
500
+ # Pattern with col and severity: filename:line:col [error|warning] rule description
501
+ if [[ "$line" =~ ^(.+):([0-9]+):([0-9]+)[[:space:]]+(error|warning)[[:space:]]+([A-Z]+[0-9]+/[^[:space:]]+)[[:space:]]+(.+)$ ]]; then
502
+ printf '%s\t%s\t%s\t%s\t%s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" "${BASH_REMATCH[5]}" "${BASH_REMATCH[6]}"
503
+ # Pattern with col, no severity: filename:line:col rule description
504
+ elif [[ "$line" =~ ^(.+):([0-9]+):([0-9]+)[[:space:]]+([A-Z]+[0-9]+/[^[:space:]]+)[[:space:]]+(.+)$ ]]; then
505
+ printf '%s\t%s\t%s\t%s\t%s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" "${BASH_REMATCH[4]}" "${BASH_REMATCH[5]}"
506
+ # Pattern without col, with severity: filename:line [error|warning] rule description
507
+ elif [[ "$line" =~ ^(.+):([0-9]+)[[:space:]]+(error|warning)[[:space:]]+([A-Z]+[0-9]+/[^[:space:]]+)[[:space:]]+(.+)$ ]]; then
508
+ printf '%s\t%s\t%s\t%s\t%s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "0" "${BASH_REMATCH[4]}" "${BASH_REMATCH[5]}"
509
+ # Pattern without col, no severity: filename:line rule description
510
+ elif [[ "$line" =~ ^(.+):([0-9]+)[[:space:]]+([A-Z]+[0-9]+/[^[:space:]]+)[[:space:]]+(.+)$ ]]; then
511
+ printf '%s\t%s\t%s\t%s\t%s\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "0" "${BASH_REMATCH[3]}" "${BASH_REMATCH[4]}"
512
+ else
513
+ # Explicit no-op: prevents unmatched lines from leaving a non-zero
514
+ # exit status on the if-elif chain, which with set -euo pipefail
515
+ # would propagate through the pipeline and abort the caller.
516
+ :
517
+ fi
518
+ done
519
+ return 0
520
+ }
521
+
522
+ # ---------------------------------------------------------------------------
523
+ # compute_violation_fingerprint <parsed_violations>
524
+ #
525
+ # Produces a deterministic fingerprint from parsed violations for stall
526
+ # detection. Uses filename, line, col, and rule (stable identity fields).
527
+ # Prints an md5sum hash to stdout.
528
+ # ---------------------------------------------------------------------------
529
+ compute_violation_fingerprint() {
530
+ local violations="$1"
531
+ if [[ -z "$violations" ]]; then
532
+ echo "empty"
533
+ return 0
534
+ fi
535
+ # Extract stable fields (filename, line, col, rule), sort, and hash
536
+ echo "$violations" | awk -F'\t' '{print $1, $2, $3, $4}' | sort | md5sum | awk '{print $1}'
537
+ }
538
+
539
+ # ---------------------------------------------------------------------------
540
+ # _is_valid_md_start <line>
541
+ #
542
+ # Returns 0 (true) if the given line looks like a valid markdown construct
543
+ # that could legitimately begin a file: heading, blockquote, list item,
544
+ # table row, link/image, fenced code, ordered list, setext underline, or
545
+ # HTML comment. Used by strip_llm_preamble to distinguish real content
546
+ # from conversational preamble.
547
+ #
548
+ # Defined at top level (not inside strip_llm_preamble) because bash
549
+ # function definitions are always global — nesting would pollute the
550
+ # caller's namespace just the same.
551
+ # ---------------------------------------------------------------------------
552
+ _is_valid_md_start() {
553
+ local line="$1"
554
+ [[ -z "$line" ]] && return 1
555
+ [[ "$line" =~ ^#{1,6}[[:space:]]+ ]] && return 0
556
+ [[ "$line" =~ ^\> ]] && return 0
557
+ [[ "$line" =~ ^-[[:space:]]+ ]] && return 0
558
+ [[ "$line" =~ ^\*[[:space:]]+ ]] && return 0
559
+ [[ "$line" =~ ^\+[[:space:]]+ ]] && return 0
560
+ [[ "$line" =~ ^\| ]] && return 0
561
+ [[ "$line" =~ ^\[ ]] && return 0
562
+ [[ "$line" =~ ^! ]] && return 0
563
+ [[ "$line" =~ ^\`\`\` ]] && return 0
564
+ [[ "$line" =~ ^[0-9]+\.[[:space:]]+ ]] && return 0
565
+ [[ "$line" =~ ^---+ ]] && return 0
566
+ [[ "$line" =~ ^===+ ]] && return 0
567
+ [[ "$line" == "<!--"* ]] && return 0
568
+ return 1
569
+ }
570
+
571
+ # ---------------------------------------------------------------------------
572
+ # strip_llm_preamble <llm_output> <original_first_line>
573
+ #
574
+ # Safety net that removes conversational preamble text that LLMs sometimes
575
+ # prepend to their output (e.g. "All 13 violations fixed — here's the
576
+ # corrected file:"). If the first line of the LLM output does not look
577
+ # like valid markdown, the function searches for the first heading line
578
+ # (# ...) when the original file started with a heading, or strips lines
579
+ # until a recognised markdown construct is found.
580
+ #
581
+ # Prints the cleaned content to stdout. If no preamble is detected, the
582
+ # output is identical to the input (no-op).
583
+ # ---------------------------------------------------------------------------
584
+ strip_llm_preamble() {
585
+ local llm_output="$1"
586
+ local original_first_line="${2:-}"
587
+ local _fl line
588
+
589
+ [[ -z "$llm_output" ]] && return 0
590
+
591
+ # Skip leading blank/whitespace-only lines to find the first non-empty line.
592
+ # A blank first line should not be treated as a valid markdown start.
593
+ local first_line=""
594
+ local skipped_blanks=false
595
+ while IFS= read -r _fl; do
596
+ if [[ "$_fl" =~ [^[:space:]] ]]; then
597
+ first_line="$_fl"
598
+ break
599
+ else
600
+ skipped_blanks=true
601
+ fi
602
+ done <<< "$llm_output"
603
+
604
+ # If the entire output is blank lines, return as-is
605
+ [[ -z "$first_line" ]] && { printf '%s' "$llm_output"; return 0; }
606
+
607
+ # If the first non-empty line is valid markdown...
608
+ if _is_valid_md_start "$first_line"; then
609
+ if [[ "$skipped_blanks" == true ]]; then
610
+ # Leading blank lines before valid markdown — trim them to avoid
611
+ # MD041 violations (the file must start with content, not blanks).
612
+ local trimmed=""
613
+ local found=false
614
+ while IFS= read -r line; do
615
+ if [[ "$found" == true ]]; then
616
+ trimmed+="$line"$'\n'
617
+ elif [[ "$line" =~ [^[:space:]] ]]; then
618
+ found=true
619
+ trimmed+="$line"$'\n'
620
+ fi
621
+ done <<< "$llm_output"
622
+ [[ -n "$trimmed" ]] && trimmed="${trimmed%$'\n'}"
623
+ printf '%s' "$trimmed"
624
+ else
625
+ # No leading blanks — return as-is
626
+ printf '%s' "$llm_output"
627
+ fi
628
+ return 0
629
+ fi
630
+
631
+ # Preamble detected — log a warning
632
+ echo "[Sanitize] ⚠ LLM preamble detected: \"$(printf '%.60s' "$first_line")...\" — stripping." >&2
633
+
634
+ # Strategy 1: If the original file started with a heading, find the first
635
+ # heading line in the LLM output and strip everything before it.
636
+ if [[ "$original_first_line" =~ ^#{1,6}[[:space:]]+ ]]; then
637
+ local found_heading=false
638
+ local result=""
639
+ while IFS= read -r line; do
640
+ if [[ "$found_heading" == true ]]; then
641
+ result+="$line"$'\n'
642
+ elif [[ "$line" =~ ^#{1,6}[[:space:]]+ ]]; then
643
+ found_heading=true
644
+ result+="$line"$'\n'
645
+ fi
646
+ done <<< "$llm_output"
647
+ if [[ "$found_heading" == true && -n "$result" ]]; then
648
+ # Remove trailing newline added by the loop
649
+ printf '%s' "${result%$'\n'}"
650
+ return 0
651
+ fi
652
+ fi
653
+
654
+ # Strategy 2: Find the first line that looks like valid markdown
655
+ local found_md=false
656
+ local result=""
657
+ while IFS= read -r line; do
658
+ if [[ "$found_md" == true ]]; then
659
+ result+="$line"$'\n'
660
+ elif _is_valid_md_start "$line"; then
661
+ found_md=true
662
+ result+="$line"$'\n'
663
+ fi
664
+ done <<< "$llm_output"
665
+ if [[ "$found_md" == true && -n "$result" ]]; then
666
+ printf '%s' "${result%$'\n'}"
667
+ return 0
668
+ fi
669
+
670
+ # Strategy 3: No valid markdown found — keep the LLM output unchanged
671
+ echo "[Sanitize] ⚠ Could not find valid markdown start in LLM output. Keeping LLM output unchanged." >&2
672
+ printf '%s' "$llm_output"
673
+ }
674
+
675
+ # ---------------------------------------------------------------------------
676
+ # ensure_heading_start <content> <default_heading>
677
+ #
678
+ # Ensures that <content> starts with a markdown heading (# ... through
679
+ # ###### ...). If the first non-empty line is already a heading, any
680
+ # leading blank lines are stripped so the output truly starts with the
681
+ # heading. Otherwise, <default_heading> is prepended with a blank line
682
+ # separator.
683
+ #
684
+ # Prints the (possibly modified) content to stdout.
685
+ # ---------------------------------------------------------------------------
686
+ ensure_heading_start() {
687
+ local content="$1"
688
+ local default_heading="${2:-# Document}"
689
+ [[ -z "$content" ]] && { printf '%s' "$default_heading"; return 0; }
690
+ local first_line=""
691
+ while IFS= read -r _fl; do
692
+ if [[ "$_fl" =~ [^[:space:]] ]]; then first_line="$_fl"; break; fi
693
+ done <<< "$content"
694
+ if [[ "$first_line" =~ ^#{1,6}[[:space:]]+ ]]; then
695
+ # Strip leading blank/whitespace-only lines so the output truly starts with the heading
696
+ local trimmed_h=""
697
+ local found_h=false
698
+ while IFS= read -r line; do
699
+ if [[ "$found_h" == true ]]; then
700
+ trimmed_h+="$line"$'\n'
701
+ elif [[ "$line" =~ [^[:space:]] ]]; then
702
+ found_h=true
703
+ trimmed_h+="$line"$'\n'
704
+ fi
705
+ done <<< "$content"
706
+ [[ -n "$trimmed_h" ]] && trimmed_h="${trimmed_h%$'\n'}"
707
+ printf '%s' "$trimmed_h"
708
+ else
709
+ echo "[Sanitize] ⚠ No heading found — prepending default: \"$default_heading\"" >&2
710
+ # Strip leading blank/whitespace-only lines before prepending heading
711
+ local trimmed=""
712
+ local found=false
713
+ while IFS= read -r line; do
714
+ if [[ "$found" == true ]]; then
715
+ trimmed+="$line"$'\n'
716
+ elif [[ "$line" =~ [^[:space:]] ]]; then
717
+ found=true
718
+ trimmed+="$line"$'\n'
719
+ fi
720
+ done <<< "$content"
721
+ [[ -n "$trimmed" ]] && trimmed="${trimmed%$'\n'}"
722
+ printf '%s\n\n%s' "$default_heading" "$trimmed"
723
+ fi
724
+ }
725
+
726
+ # ---------------------------------------------------------------------------
727
+ # wrap_long_lines_in_spec_dir <spec_dir> [max_line_length]
728
+ #
729
+ # Best-effort deterministic pass that wraps overlong prose / list items in
730
+ # all .md files under <spec_dir> to <max_line_length> characters (default
731
+ # 200, matching the MD013 config in .markdownlint-cli2.jsonc). Fenced code
732
+ # blocks, tables, indented code, YAML front matter, and headings are
733
+ # preserved verbatim.
734
+ #
735
+ # This step reduces MD013 violations before the downstream markdownlint
736
+ # validation loop kicks off LLM remediation — LLM output very commonly
737
+ # produces single-line paragraphs and list items that exceed the 200-char
738
+ # limit. Always returns 0 — this is a best-effort pass, not a gate.
739
+ # ---------------------------------------------------------------------------
740
+ wrap_long_lines_in_spec_dir() {
741
+ local spec_dir="$1"
742
+ local max_line_length="${2:-200}"
743
+ local -a md_files=()
744
+ while IFS= read -r -d '' file; do
745
+ md_files+=("$file")
746
+ done < <(find "$spec_dir" -name '*.md' -type f -print0)
747
+
748
+ if [[ ${#md_files[@]} -eq 0 ]]; then
749
+ return 0
750
+ fi
751
+
752
+ local py_bin=""
753
+ if command -v python3 &>/dev/null; then
754
+ py_bin=python3
755
+ elif command -v python &>/dev/null && python -c 'import sys; raise SystemExit(0 if sys.version_info[0] >= 3 else 1)' &>/dev/null; then
756
+ py_bin=python
757
+ else
758
+ echo "[Wrap] ⚠ no Python 3 interpreter available — skipping line-wrap pre-validation pass" >&2
759
+ return 0
760
+ fi
761
+
762
+ if ! "$py_bin" "$SCRIPT_DIR/wrap_markdown_lines.py" \
763
+ --quiet \
764
+ --max-line-length "$max_line_length" \
765
+ "${md_files[@]}"; then
766
+ echo "[Wrap] ⚠ wrap_markdown_lines.py exited non-zero — continuing" >&2
767
+ fi
768
+ return 0
769
+ }
770
+
771
+ # ---------------------------------------------------------------------------
772
+ # quick_markdown_sanity_check <spec_dir>
773
+ #
774
+ # Best-effort pre-validation pass over all .md files in <spec_dir>.
775
+ # Fixes deterministic issues (leading blank lines, long prose lines) and
776
+ # logs warnings for problems that require manual attention.
777
+ #
778
+ # Always returns 0 — this is a best-effort check, not a gate.
779
+ # ---------------------------------------------------------------------------
780
+ quick_markdown_sanity_check() {
781
+ local spec_dir="$1"
782
+ local file content first_line
783
+
784
+ while IFS= read -r -d '' file; do
785
+ # (a) Empty file — skip
786
+ if [[ ! -s "$file" ]]; then
787
+ echo "[Sanitize] ⚠ Empty file: $file — skipping" >&2
788
+ continue
789
+ fi
790
+
791
+ content=$(cat "$file")
792
+
793
+ # Treat whitespace-only files as empty. Command substitution strips
794
+ # trailing newlines, so blank files with only whitespace/newlines can
795
+ # appear empty here despite being non-zero bytes on disk.
796
+ if [[ ! "$content" =~ [^[:space:]] ]]; then
797
+ echo "[Sanitize] ⚠ Empty/blank file: $file — truncating and skipping" >&2
798
+ : > "$file"
799
+ continue
800
+ fi
801
+
802
+ # (b) Leading blank/whitespace-only lines — remove them
803
+ local trimmed=""
804
+ local found=false
805
+ while IFS= read -r line; do
806
+ if [[ "$found" == true ]]; then
807
+ trimmed+="$line"$'\n'
808
+ elif [[ "$line" =~ [^[:space:]] ]]; then
809
+ found=true
810
+ trimmed+="$line"$'\n'
811
+ fi
812
+ done <<< "$content"
813
+ [[ -n "$trimmed" ]] && trimmed="${trimmed%$'\n'}"
814
+
815
+ if [[ "$trimmed" != "$content" ]]; then
816
+ printf '%s\n' "$trimmed" > "$file"
817
+ content="$trimmed"
818
+ fi
819
+
820
+ # Find first non-blank line (treating whitespace-only as blank)
821
+ first_line=""
822
+ while IFS= read -r _fl; do
823
+ if [[ "$_fl" =~ [^[:space:]] ]]; then first_line="$_fl"; break; fi
824
+ done <<< "$content"
825
+
826
+ # (c) Starts with code fence — skip (no deterministic fix)
827
+ if [[ "$first_line" =~ ^\`\`\` ]]; then
828
+ echo "[Sanitize] ⚠ File starts with code fence: $file — skipping" >&2
829
+ continue
830
+ fi
831
+
832
+ # (d) First non-empty line is not a heading — log warning
833
+ if [[ ! "$first_line" =~ ^#{1,6}[[:space:]]+ ]]; then
834
+ echo "[Sanitize] ⚠ File does not start with a heading: $file" >&2
835
+ fi
836
+ done < <(find "$spec_dir" -name '*.md' -type f -print0)
837
+
838
+ # Wrap overlong prose lines after leading-blank removal so that files
839
+ # with leading whitespace before YAML front matter (---) are handled
840
+ # correctly — the wrapper only detects front matter on the very first
841
+ # line.
842
+ wrap_long_lines_in_spec_dir "$spec_dir"
843
+
844
+ return 0
845
+ }
846
+
847
+ # ---------------------------------------------------------------------------
848
+ # _run_enhanced_remediation <spec_dir> <affected_files...>
849
+ #
850
+ # Layer 3: Enhanced multi-turn SDK remediation. When the standard per-file
851
+ # LLM loop stalls, this function performs up to 3 sub-iterations of combined
852
+ # remediation: sends a richer prompt with ALL affected file contents + ALL
853
+ # remaining violations, writes corrections, then re-runs markdownlint to
854
+ # validate. Returns 0 if all violations are resolved, 1 otherwise.
855
+ # ---------------------------------------------------------------------------
856
+ _run_enhanced_remediation() {
857
+ local spec_dir="$1"
858
+ shift
859
+ local -a affected_files=("$@")
860
+
861
+ echo "[Phase 7] [Layer 3] Starting enhanced multi-turn remediation (${#affected_files[@]} file(s))..." >&2
862
+
863
+ local max_sub_iter=3
864
+ local sub_iter
865
+
866
+ for (( sub_iter=1; sub_iter<=max_sub_iter; sub_iter++ )); do
867
+ echo "[Phase 7] [Layer 3] Sub-iteration $sub_iter/$max_sub_iter" >&2
868
+
869
+ # Build combined prompt with all files and violations
870
+ local combined_content=""
871
+ local combined_violations=""
872
+
873
+ for af in "${affected_files[@]}"; do
874
+ [[ -f "$af" ]] || continue
875
+ local fc=""
876
+ fc=$(strip_model_footer "$(cat "$af")")
877
+ combined_content="$combined_content
878
+ ===FILE:$af===
879
+ $fc
880
+ "
881
+ # Get per-file violations
882
+ local file_lint=""
883
+ file_lint=$(cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs "$af" 2>&1) || true
884
+ if [[ -n "$file_lint" ]]; then
885
+ combined_violations="$combined_violations
886
+ ## Violations in $af
887
+ $file_lint
888
+ "
889
+ fi
890
+ done
891
+
892
+ if [[ -z "$combined_violations" ]]; then
893
+ echo "[Phase 7] [Layer 3] ✓ No violations remain after sub-iteration $((sub_iter - 1))." >&2
894
+ return 0
895
+ fi
896
+
897
+ local enhanced_prompt="You are a markdown lint fixer. Fix ALL markdownlint violations in the files below.
898
+
899
+ ## All remaining violations
900
+ $combined_violations
901
+
902
+ ## Rules
903
+ - Your response MUST contain the corrected content for EACH file, separated by delimiter lines
904
+ - Use EXACTLY this delimiter format: ===FILE:<filepath>===
905
+ - Output ONLY corrected markdown content after each delimiter — no commentary
906
+ - Do NOT add conversational preamble before the first delimiter
907
+ - For MD040 (fenced-code-language): add a language identifier (use 'text' if unsure)
908
+ - For MD056 (table-column-count): ensure all table rows have the same number of columns as the header
909
+ - For MD013 (line-length): break long lines at natural points to stay under 200 characters
910
+ - Preserve all content meaning and structure
911
+
912
+ ## Files to fix
913
+ $combined_content
914
+
915
+ ## CRITICAL
916
+ Start your response with ===FILE: delimiter. No preamble."
917
+
918
+ local prompt_len=${#enhanced_prompt}
919
+ if [[ $prompt_len -gt 64000 ]]; then
920
+ echo "[Phase 7] [Layer 3] Warning: Combined prompt too large ($prompt_len chars). Skipping." >&2
921
+ return 1
922
+ fi
923
+
924
+ local response=""
925
+ if ! response=$(call_llm "$enhanced_prompt"); then
926
+ echo "[Phase 7] [Layer 3] Warning: LLM call failed in sub-iteration $sub_iter." >&2
927
+ continue
928
+ fi
929
+
930
+ # Parse response and write files
931
+ # Helper: validate that a parsed path is in the affected_files allowlist
932
+ _is_allowed_file() {
933
+ local candidate="$1"
934
+ for allowed in "${affected_files[@]}"; do
935
+ [[ "$candidate" == "$allowed" ]] && return 0
936
+ done
937
+ return 1
938
+ }
939
+
940
+ local current_file="" current_content=""
941
+ while IFS= read -r line; do
942
+ if [[ "$line" =~ ^===FILE:(.+)===$ ]]; then
943
+ if [[ -n "$current_file" && -n "$current_content" ]]; then
944
+ local original_first_line=""
945
+ original_first_line=$(head -n 1 "$current_file" 2>/dev/null || echo "")
946
+ current_content=$(strip_llm_preamble "$current_content" "$original_first_line")
947
+ if [[ "$current_content" =~ [^[:space:]] ]]; then
948
+ printf '%s\n' "$current_content" > "$current_file"
949
+ append_model_footer "$current_file"
950
+ echo "[Phase 7] [Layer 3] ✓ Applied fix to $(basename "$current_file")" >&2
951
+ fi
952
+ fi
953
+ current_file="${BASH_REMATCH[1]}"
954
+ current_file="${current_file#"${current_file%%[![:space:]]*}"}"
955
+ current_file="${current_file%"${current_file##*[![:space:]]}"}"
956
+ # Validate path is in the affected_files allowlist
957
+ if ! _is_allowed_file "$current_file"; then
958
+ echo "[Phase 7] [Layer 3] ⚠ Skipping unrecognized path from model: $current_file" >&2
959
+ current_file=""
960
+ fi
961
+ current_content=""
962
+ else
963
+ if [[ -n "$current_file" ]]; then
964
+ current_content="${current_content:+$current_content
965
+ }$line"
966
+ fi
967
+ fi
968
+ done <<< "$response"
969
+ # Write last file
970
+ if [[ -n "$current_file" && -n "$current_content" ]]; then
971
+ local original_first_line=""
972
+ original_first_line=$(head -n 1 "$current_file" 2>/dev/null || echo "")
973
+ current_content=$(strip_llm_preamble "$current_content" "$original_first_line")
974
+ if [[ "$current_content" =~ [^[:space:]] ]]; then
975
+ printf '%s\n' "$current_content" > "$current_file"
976
+ append_model_footer "$current_file"
977
+ echo "[Phase 7] [Layer 3] ✓ Applied fix to $(basename "$current_file")" >&2
978
+ fi
979
+ fi
980
+
981
+ # Re-run lint to check
982
+ local lint_exit=0
983
+ (cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs "${affected_files[@]}" 2>&1) >/dev/null || lint_exit=$?
984
+
985
+ if [[ $lint_exit -eq 0 ]]; then
986
+ echo "[Phase 7] [Layer 3] ✓ All violations resolved after sub-iteration $sub_iter." >&2
987
+ return 0
988
+ fi
989
+ echo "[Phase 7] [Layer 3] Violations remain after sub-iteration $sub_iter — continuing." >&2
990
+ done
991
+
992
+ echo "[Phase 7] [Layer 3] ✗ Enhanced remediation exhausted ($max_sub_iter sub-iterations)." >&2
993
+ return 1
994
+ }
995
+
996
+ # ---------------------------------------------------------------------------
997
+ # _run_alternate_llm_remediation <spec_dir> <affected_files...>
998
+ #
999
+ # Layer 4: Alternate LLM remediation with distinct prompt strategy. Uses
1000
+ # call_llm with a differently structured prompt (focused on self-validation
1001
+ # instructions) to attempt fixes from a fresh angle. Returns 0 if all
1002
+ # violations resolved, 1 otherwise.
1003
+ #
1004
+ # Note: Despite the historical "Copilot CLI" name in logs, this layer uses
1005
+ # the SDK-based call_llm helper (not `gh copilot`) because the CLI does not
1006
+ # produce the ===FILE: delimited output required by the parser.
1007
+ # ---------------------------------------------------------------------------
1008
+ _run_alternate_llm_remediation() {
1009
+ local spec_dir="$1"
1010
+ shift
1011
+ local -a affected_files=("$@")
1012
+
1013
+ echo "[Phase 7] [Layer 4] Starting alternate LLM remediation (${#affected_files[@]} file(s))..." >&2
1014
+
1015
+ local max_attempts=3
1016
+ local attempt
1017
+
1018
+ for (( attempt=1; attempt<=max_attempts; attempt++ )); do
1019
+ echo "[Phase 7] [Layer 4] Attempt $attempt/$max_attempts" >&2
1020
+
1021
+ # Build structured prompt
1022
+ local file_contents=""
1023
+ local violations=""
1024
+
1025
+ for af in "${affected_files[@]}"; do
1026
+ [[ -f "$af" ]] || continue
1027
+ file_contents="$file_contents
1028
+ ===FILE:$af===
1029
+ $(cat "$af")
1030
+ "
1031
+ local file_lint=""
1032
+ file_lint=$(cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs "$af" 2>&1) || true
1033
+ if [[ -n "$file_lint" ]]; then
1034
+ violations="$violations
1035
+ $file_lint
1036
+ "
1037
+ fi
1038
+ done
1039
+
1040
+ if [[ -z "$violations" ]]; then
1041
+ echo "[Phase 7] [Layer 4] ✓ No violations remain." >&2
1042
+ return 0
1043
+ fi
1044
+
1045
+ local cli_prompt="Fix the following markdownlint violations in these markdown files.
1046
+
1047
+ VIOLATIONS:
1048
+ $violations
1049
+
1050
+ FILES:
1051
+ $file_contents
1052
+
1053
+ INSTRUCTIONS:
1054
+ 1. Fix all violations listed above
1055
+ 2. For MD040: add language identifier to bare code fences (use 'text' if unsure)
1056
+ 3. For MD056: ensure all table rows have same column count as header
1057
+ 4. For MD013: break long lines at natural points (under 200 chars)
1058
+ 5. Output ONLY the corrected file contents with ===FILE:<path>=== delimiters
1059
+ 6. Start your response with ===FILE: delimiter. No preamble."
1060
+
1061
+ # Guard: skip if prompt exceeds size limit (avoids timeouts when
1062
+ # Layer 3 already skipped for the same reason).
1063
+ local cli_prompt_len=${#cli_prompt}
1064
+ if [[ $cli_prompt_len -gt 64000 ]]; then
1065
+ echo "[Phase 7] [Layer 4] Warning: Combined prompt too large ($cli_prompt_len chars). Skipping." >&2
1066
+ return 1
1067
+ fi
1068
+
1069
+ local cli_response=""
1070
+ if ! cli_response=$(call_llm "$cli_prompt"); then
1071
+ echo "[Phase 7] [Layer 4] Warning: LLM call failed in attempt $attempt." >&2
1072
+ continue
1073
+ fi
1074
+
1075
+ # Helper: validate that a parsed path is in the affected_files allowlist
1076
+ _is_allowed_file_l4() {
1077
+ local candidate="$1"
1078
+ for allowed in "${affected_files[@]}"; do
1079
+ [[ "$candidate" == "$allowed" ]] && return 0
1080
+ done
1081
+ return 1
1082
+ }
1083
+
1084
+ # If response contains file delimiters, parse and apply
1085
+ if echo "$cli_response" | grep -q "^===FILE:"; then
1086
+ local current_file="" current_content=""
1087
+ while IFS= read -r line; do
1088
+ if [[ "$line" =~ ^===FILE:(.+)===$ ]]; then
1089
+ if [[ -n "$current_file" && -n "$current_content" ]]; then
1090
+ local original_first_line=""
1091
+ original_first_line=$(head -n 1 "$current_file" 2>/dev/null || echo "")
1092
+ current_content=$(strip_llm_preamble "$current_content" "$original_first_line")
1093
+ if [[ "$current_content" =~ [^[:space:]] ]]; then
1094
+ printf '%s\n' "$current_content" > "$current_file"
1095
+ append_model_footer "$current_file"
1096
+ fi
1097
+ fi
1098
+ current_file="${BASH_REMATCH[1]}"
1099
+ current_file="${current_file#"${current_file%%[![:space:]]*}"}"
1100
+ current_file="${current_file%"${current_file##*[![:space:]]}"}"
1101
+ # Validate path is in the affected_files allowlist
1102
+ if ! _is_allowed_file_l4 "$current_file"; then
1103
+ echo "[Phase 7] [Layer 4] ⚠ Skipping unrecognized path from model: $current_file" >&2
1104
+ current_file=""
1105
+ fi
1106
+ current_content=""
1107
+ else
1108
+ if [[ -n "$current_file" ]]; then
1109
+ current_content="${current_content:+$current_content
1110
+ }$line"
1111
+ fi
1112
+ fi
1113
+ done <<< "$cli_response"
1114
+ if [[ -n "$current_file" && -n "$current_content" ]]; then
1115
+ local original_first_line=""
1116
+ original_first_line=$(head -n 1 "$current_file" 2>/dev/null || echo "")
1117
+ current_content=$(strip_llm_preamble "$current_content" "$original_first_line")
1118
+ if [[ "$current_content" =~ [^[:space:]] ]]; then
1119
+ printf '%s\n' "$current_content" > "$current_file"
1120
+ append_model_footer "$current_file"
1121
+ fi
1122
+ fi
1123
+ fi
1124
+
1125
+ # Re-run lint to validate
1126
+ local lint_exit=0
1127
+ (cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs "${affected_files[@]}" 2>&1) >/dev/null || lint_exit=$?
1128
+
1129
+ if [[ $lint_exit -eq 0 ]]; then
1130
+ echo "[Phase 7] [Layer 4] ✓ All violations resolved after attempt $attempt." >&2
1131
+ return 0
1132
+ fi
1133
+ echo "[Phase 7] [Layer 4] Violations remain after attempt $attempt." >&2
1134
+ done
1135
+
1136
+ echo "[Phase 7] [Layer 4] ✗ Alternate LLM remediation exhausted ($max_attempts attempts)." >&2
1137
+ return 1
1138
+ }
1139
+
1140
+ # Source CRITICAL gate remediation library (FR-009)
1141
+ # shellcheck source=lib/critical-gate-remediation.sh
1142
+ source "$SCRIPT_DIR/lib/critical-gate-remediation.sh"
1143
+
1144
+ # Source clarify retry library (multi-layer clarify phase remediation)
1145
+ # shellcheck source=lib/clarify-retry.sh
1146
+ source "$SCRIPT_DIR/lib/clarify-retry.sh"
1147
+
1148
+ # ---------------------------------------------------------------------------
1149
+ # run_markdownlint_validation <spec_dir>
1150
+ #
1151
+ # Runs the markdownlint validation/remediation loop for markdown files in
1152
+ # the given spec directory. Attempts auto-fix first, then LLM remediation
1153
+ # if violations remain. Stops on clean result, stall detection, or max
1154
+ # iterations.
1155
+ #
1156
+ # Recovery layers (invoked on stall/exhaustion when SPECKIT_COPILOT_CLI_ON_STALL=true):
1157
+ # Layer 1: Deterministic fixers (MD040, MD056) — run before iteration loop
1158
+ # Layer 2: Standard per-file LLM remediation (existing iteration loop)
1159
+ # Layer 3: Enhanced multi-turn SDK remediation (_run_enhanced_remediation)
1160
+ # Layer 4: Alternate LLM remediation (_run_alternate_llm_remediation)
1161
+ # Layer 5: Graceful fallback — proceed with warning
1162
+ #
1163
+ # Returns 0 on success (all files lint-clean or graceful fallback).
1164
+ # ---------------------------------------------------------------------------
1165
+ run_markdownlint_validation() {
1166
+ local spec_dir="$1"
1167
+
1168
+ # Guard: check npx availability (EC5)
1169
+ if ! check_npx_available; then
1170
+ return 1
1171
+ fi
1172
+
1173
+ # Guard: check for markdown files (EC9 — empty spec directory)
1174
+ # Use find instead of bash glob to reliably discover nested .md files
1175
+ # without requiring shopt -s globstar (which is not enabled by default).
1176
+ local md_files=()
1177
+ while IFS= read -r -d '' f; do
1178
+ md_files+=("$f")
1179
+ done < <(find "$spec_dir" -name '*.md' -type f -print0)
1180
+
1181
+ if [[ ${#md_files[@]} -eq 0 ]]; then
1182
+ echo "[Phase 7] No markdown files found in $spec_dir — skipping validation." >&2
1183
+ echo "markdownlint_status=success" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1184
+ echo "markdownlint_iterations=0" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1185
+ echo "markdownlint_violations=0" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1186
+ return 0
1187
+ fi
1188
+
1189
+ # Layer 1: Deterministic fixers (MD040, MD056) — fast, 100% reliable
1190
+ echo "[Phase 7] [Layer 1] Running deterministic fixers (MD040, MD056)..." >&2
1191
+ python "$SCRIPT_DIR/fix_markdown_deterministic.py" "${md_files[@]}" || {
1192
+ echo "[Phase 7] [Layer 1] Warning: Deterministic fixer script failed (non-fatal)." >&2
1193
+ }
1194
+
1195
+ local max_iter="$MARKDOWNLINT_MAX_ITERATIONS"
1196
+ local prev_fingerprint=""
1197
+ local prev_violation_count=0
1198
+ local count_stall_streak=0
1199
+ local iteration=0
1200
+ local total_iterations=0
1201
+ local final_violation_count=0
1202
+ local last_lint_exit=1
1203
+ local stall_detected=false
1204
+
1205
+ echo "[Phase 7] Starting markdownlint validation (max $max_iter iterations, ${#md_files[@]} markdown files)" >&2
1206
+
1207
+ for (( iteration=1; iteration<=max_iter; iteration++ )); do
1208
+ total_iterations=$iteration
1209
+ echo "" >&2
1210
+ echo "[Phase 7] Iteration $iteration/$max_iter" >&2
1211
+
1212
+ # Step 1: Auto-fix pass (run from spec_dir so per-spec .markdownlint.json is discovered)
1213
+ echo "[Phase 7] Running markdownlint-cli2 --fix..." >&2
1214
+ (cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs --fix "${md_files[@]}") 2>&1 || true
1215
+
1216
+ # Step 2: Check-only pass — capture output (run from spec_dir)
1217
+ local lint_output=""
1218
+ local lint_exit=0
1219
+ lint_output=$(cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs "${md_files[@]}" 2>&1) || lint_exit=$?
1220
+ last_lint_exit=$lint_exit
1221
+
1222
+ # Persist raw lint output for CI debugging (append per iteration)
1223
+ {
1224
+ echo "--- Iteration $iteration ($(date -u +%Y-%m-%dT%H:%M:%SZ)) ---"
1225
+ echo "$lint_output"
1226
+ echo ""
1227
+ } >> "$spec_dir/.markdownlint-debug.log" || true
1228
+
1229
+ if [[ $lint_exit -eq 0 ]]; then
1230
+ echo "[Phase 7] ✓ All files lint-clean after auto-fix." >&2
1231
+ final_violation_count=0
1232
+ break
1233
+ fi
1234
+
1235
+ # Step 3: Parse remaining violations
1236
+ local parsed=""
1237
+ parsed=$(parse_markdownlint_output "$lint_output")
1238
+
1239
+ local violation_count=0
1240
+ if [[ -n "$parsed" ]]; then
1241
+ violation_count=$(printf '%s\n' "$parsed" | awk 'END{print NR}')
1242
+ fi
1243
+ final_violation_count=$violation_count
1244
+
1245
+ # Guard: lint failed but parser found no violations — attempt raw-output
1246
+ # LLM remediation instead of breaking out of the loop immediately.
1247
+ if [[ $violation_count -eq 0 ]]; then
1248
+ local raw_count=0
1249
+ raw_count=$(_count_raw_violations "$lint_output")
1250
+ echo "[Phase 7] ⚠ markdownlint exited $lint_exit but no violations could be parsed (raw count: ~$raw_count)." >&2
1251
+ echo "[Phase 7] Raw output:" >&2
1252
+ printf '%s\n' "$lint_output" | head -20 >&2
1253
+ echo "[Phase 7] Attempting raw-output LLM remediation..." >&2
1254
+
1255
+ # Extract file paths from raw output; fall back to all md_files
1256
+ local raw_affected_files=""
1257
+ raw_affected_files=$(printf '%s\n' "$lint_output" | grep -oE '^[^:]+\.md' | sort -u || true)
1258
+ if [[ -z "$raw_affected_files" ]]; then
1259
+ raw_affected_files=$(printf '%s\n' "${md_files[@]}")
1260
+ fi
1261
+
1262
+ local raw_remediation_applied=false
1263
+ while IFS= read -r target_file; do
1264
+ [[ -z "$target_file" ]] && continue
1265
+ [[ ! -f "$target_file" ]] && continue
1266
+
1267
+ local file_content=""
1268
+ file_content=$(cat "$target_file")
1269
+ local stripped_content=""
1270
+ stripped_content=$(strip_model_footer "$file_content")
1271
+ local original_first_line=""
1272
+ original_first_line=$(printf '%s' "$stripped_content" | head -n 1)
1273
+
1274
+ # Filter lint output to only lines relevant to the current target_file
1275
+ # to avoid inflating the prompt when multiple files are in the output.
1276
+ local filtered_lint_output=""
1277
+ filtered_lint_output=$(
1278
+ awk -v file="$target_file" '
1279
+ function is_target_start(line) {
1280
+ return index(line, file ":") == 1 || index(line, "./" file ":") == 1
1281
+ }
1282
+
1283
+ function is_violation_start(line) {
1284
+ return line ~ /^.+\.md:[0-9]+/
1285
+ }
1286
+
1287
+ function is_metadata_boundary(line) {
1288
+ return line ~ /^(markdownlint-cli2|markdownlint)([[:space:]:-]|$)/ ||
1289
+ line ~ /^Summary([[:space:]:-]|$)/ ||
1290
+ line ~ /^Lint(ing| results?)([[:space:]:-]|$)/ ||
1291
+ line ~ /^Finding:/
1292
+ }
1293
+
1294
+ is_target_start($0) {
1295
+ capture = 1
1296
+ print
1297
+ next
1298
+ }
1299
+
1300
+ capture && (is_violation_start($0) || is_metadata_boundary($0)) {
1301
+ capture = 0
1302
+ }
1303
+
1304
+ capture {
1305
+ print
1306
+ }
1307
+ ' <<< "$lint_output"
1308
+ )
1309
+
1310
+ if [[ -z "$filtered_lint_output" ]]; then
1311
+ filtered_lint_output="No file-specific markdownlint output could be extracted for $target_file from the combined markdownlint report. Fix only violations relevant to this file content."
1312
+ fi
1313
+
1314
+ local raw_prompt="You are a markdown lint fixer. The markdownlint tool reported violations but the output could not be parsed structurally. Fix all violations indicated in the raw linter output below.
1315
+
1316
+ ## Raw markdownlint output
1317
+ $filtered_lint_output
1318
+
1319
+ ## Rules
1320
+ - Your response MUST begin immediately with markdown content — no conversational preamble
1321
+ - Output ONLY the corrected markdown content, nothing else
1322
+ - Do NOT add commentary, explanations, or code fences around the output
1323
+ - Do NOT change the meaning or structure of the content beyond what is needed to fix the violations
1324
+ - Preserve all headings, lists, tables, and code blocks
1325
+
1326
+ ## File content to fix ($target_file)
1327
+ $stripped_content
1328
+
1329
+ ## CRITICAL
1330
+ Your response must begin with the actual markdown content."
1331
+
1332
+ local prompt_len=${#raw_prompt}
1333
+ if [[ $prompt_len -gt $MARKDOWNLINT_PROMPT_MAX_CHARS ]]; then
1334
+ echo "[Phase 7] Warning: Raw prompt for $target_file exceeds $MARKDOWNLINT_PROMPT_MAX_CHARS chars ($prompt_len). Skipping." >&2
1335
+ continue
1336
+ fi
1337
+
1338
+ local corrected=""
1339
+ if corrected=$(call_llm "$raw_prompt"); then
1340
+ if [[ -n "$corrected" ]]; then
1341
+ corrected=$(strip_llm_preamble "$corrected" "$original_first_line")
1342
+ if [[ "$corrected" =~ [^[:space:]] ]]; then
1343
+ printf '%s\n' "$corrected" > "$target_file"
1344
+ append_model_footer "$target_file"
1345
+ echo "[Phase 7] ✓ Raw LLM remediation applied to $(basename "$target_file")" >&2
1346
+ raw_remediation_applied=true
1347
+ else
1348
+ echo "[Phase 7] Warning: Raw LLM returned blank content for $(basename "$target_file"). Skipping." >&2
1349
+ fi
1350
+ fi
1351
+ else
1352
+ echo "[Phase 7] Warning: Raw LLM call failed for $(basename "$target_file")." >&2
1353
+ fi
1354
+ done <<< "$raw_affected_files"
1355
+
1356
+ if [[ "$raw_remediation_applied" == "true" ]]; then
1357
+ echo "[Phase 7] Raw remediation applied — continuing loop." >&2
1358
+ continue
1359
+ else
1360
+ echo "[Phase 7] Raw remediation failed for all files — breaking." >&2
1361
+ break
1362
+ fi
1363
+ fi
1364
+
1365
+ # Collect affected files
1366
+ local affected_files=""
1367
+ if [[ -n "$parsed" ]]; then
1368
+ affected_files=$(echo "$parsed" | awk -F'\t' '{print $1}' | sort -u)
1369
+ fi
1370
+ local affected_count=0
1371
+ if [[ -n "$affected_files" ]]; then
1372
+ affected_count=$(printf '%s\n' "$affected_files" | awk 'END{print NR}')
1373
+ fi
1374
+
1375
+ echo "[Phase 7] $violation_count violation(s) remaining in $affected_count file(s)" >&2
1376
+ if [[ -n "$affected_files" ]]; then
1377
+ echo "$affected_files" | while IFS= read -r af; do
1378
+ echo "[Phase 7] - $af" >&2
1379
+ done
1380
+ fi
1381
+
1382
+ # Step 4: Stall detection
1383
+ local current_fingerprint=""
1384
+ current_fingerprint=$(compute_violation_fingerprint "$parsed")
1385
+
1386
+ if [[ "$current_fingerprint" == "$prev_fingerprint" ]]; then
1387
+ echo "[Phase 7] ⚠ Stall detected — violations unchanged from previous iteration." >&2
1388
+ stall_detected=true
1389
+ break
1390
+ fi
1391
+
1392
+ # Secondary stall detection: if violation count has not decreased for
1393
+ # 2 consecutive iterations, the LLM is likely introducing new violations
1394
+ # at the same rate it fixes others (e.g. preamble causing MD041).
1395
+ if [[ $prev_violation_count -gt 0 && $violation_count -ge $prev_violation_count ]]; then
1396
+ count_stall_streak=$((count_stall_streak + 1))
1397
+ else
1398
+ count_stall_streak=0
1399
+ fi
1400
+ if [[ $count_stall_streak -ge 2 ]]; then
1401
+ echo "[Phase 7] ⚠ Stall detected — violation count has not decreased for $count_stall_streak consecutive iterations ($violation_count >= $prev_violation_count)." >&2
1402
+ stall_detected=true
1403
+ break
1404
+ fi
1405
+
1406
+ prev_fingerprint="$current_fingerprint"
1407
+ prev_violation_count=$violation_count
1408
+
1409
+ # Step 5-6: LLM remediation for each file with violations
1410
+ echo "[Phase 7] Running LLM remediation for $affected_count file(s)..." >&2
1411
+
1412
+ while IFS= read -r target_file; do
1413
+ [[ -z "$target_file" ]] && continue
1414
+
1415
+ # Gather violations for this specific file
1416
+ local file_violations=""
1417
+ file_violations=$(echo "$parsed" | awk -F'\t' -v f="$target_file" '$1 == f {printf "Line %s: %s %s\n", $2, $4, $5}')
1418
+
1419
+ if [[ -z "$file_violations" ]]; then
1420
+ continue
1421
+ fi
1422
+
1423
+ # Read file content and strip footer
1424
+ local file_content=""
1425
+ file_content=$(cat "$target_file")
1426
+ local stripped_content=""
1427
+ stripped_content=$(strip_model_footer "$file_content")
1428
+
1429
+ # Capture the original first line for preamble detection
1430
+ local original_first_line=""
1431
+ original_first_line=$(printf '%s' "$stripped_content" | head -n 1)
1432
+
1433
+ # Build per-file LLM prompt (enforce <8K tokens ≈ 32000 chars)
1434
+ # Conditionally include MD041 guidance only when that rule is violated
1435
+ local md041_rule=""
1436
+ if echo "$file_violations" | grep -q "MD041"; then
1437
+ md041_rule="
1438
+ - For MD041 (first-line-heading): ensure the file starts with a top-level heading (# Heading)"
1439
+ fi
1440
+
1441
+ local llm_prompt="You are a markdown lint fixer. Fix the following markdownlint violations in the markdown file below.
1442
+
1443
+ ## Violations to fix
1444
+ $file_violations
1445
+
1446
+ ## Rules
1447
+ - Your response MUST begin immediately with markdown content — no conversational preamble. Preserve the original first line unless a violation (e.g., MD041) requires changing it
1448
+ - Output ONLY the corrected markdown content, nothing else
1449
+ - Do NOT add commentary, explanations, or code fences around the output
1450
+ - Do NOT start your response with phrases like \"Here is\", \"All violations fixed\", \"I have\", \"Sure\", \"Certainly\", \"Good\", \"Updated\", or any other conversational text
1451
+ - Do NOT change the meaning or structure of the content beyond what is needed to fix the violations
1452
+ - Preserve all headings, lists, tables, and code blocks$md041_rule
1453
+ - For MD013 (line-length): break long lines at natural points (after punctuation, between clauses) to stay under 200 characters
1454
+ - For MD040 (fenced-code-language): add an appropriate language identifier to fenced code blocks
1455
+
1456
+ ## File content to fix
1457
+ $stripped_content
1458
+
1459
+ ## CRITICAL
1460
+ Your response must begin with the actual markdown content. The very first character of your response should be part of the file content (e.g., \`#\` for a heading, \`---\` for front matter, \`>\` for a blockquote). Any preamble or explanation will corrupt the file."
1461
+
1462
+ # Check prompt size (NFR-004: <8K tokens ≈ MARKDOWNLINT_PROMPT_MAX_CHARS chars)
1463
+ local prompt_len=${#llm_prompt}
1464
+ if [[ $prompt_len -gt $MARKDOWNLINT_PROMPT_MAX_CHARS ]]; then
1465
+ echo "[Phase 7] Warning: Prompt for $target_file exceeds $MARKDOWNLINT_PROMPT_MAX_CHARS chars ($prompt_len). Skipping LLM remediation for this file." >&2
1466
+ continue
1467
+ fi
1468
+
1469
+ # Call LLM
1470
+ local corrected=""
1471
+ if corrected=$(call_llm "$llm_prompt"); then
1472
+ if [[ -n "$corrected" ]]; then
1473
+ # Strip any conversational preamble the LLM may have prepended
1474
+ corrected=$(strip_llm_preamble "$corrected" "$original_first_line")
1475
+ if [[ "$corrected" =~ [^[:space:]] ]]; then
1476
+ printf '%s\n' "$corrected" > "$target_file"
1477
+ append_model_footer "$target_file"
1478
+ echo "[Phase 7] ✓ LLM remediation applied to $(basename "$target_file")" >&2
1479
+ else
1480
+ echo "[Phase 7] Warning: LLM returned blank or whitespace-only content for $(basename "$target_file") after preamble stripping. Skipping." >&2
1481
+ fi
1482
+ else
1483
+ echo "[Phase 7] Warning: LLM returned empty content for $(basename "$target_file"). Skipping." >&2
1484
+ fi
1485
+ else
1486
+ echo "[Phase 7] Warning: LLM call failed for $(basename "$target_file"). Continuing." >&2
1487
+ fi
1488
+ done <<< "$affected_files"
1489
+ done
1490
+
1491
+ # Summary logging
1492
+ echo "" >&2
1493
+ echo "[Phase 7] === Validation Summary ===" >&2
1494
+ echo "[Phase 7] Iterations run: $total_iterations/$max_iter" >&2
1495
+ echo "[Phase 7] Final violations: $final_violation_count" >&2
1496
+ echo "[Phase 7] Last lint exit code: $last_lint_exit" >&2
1497
+ if [[ "$stall_detected" == "true" ]]; then
1498
+ echo "[Phase 7] Stall detected: yes" >&2
1499
+ fi
1500
+
1501
+ # Return status — gate on actual lint exit code, not just parsed count.
1502
+ # This prevents silent success when lint fails but output can't be parsed.
1503
+ local markdownlint_status=""
1504
+ if [[ $last_lint_exit -eq 0 && $final_violation_count -eq 0 ]]; then
1505
+ echo "[Phase 7] Result: ✓ SUCCESS — all files lint-clean" >&2
1506
+ markdownlint_status="success"
1507
+ echo "markdownlint_status=$markdownlint_status" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1508
+ echo "markdownlint_iterations=$total_iterations" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1509
+ echo "markdownlint_violations=$final_violation_count" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1510
+ return 0
1511
+ fi
1512
+
1513
+ # Check unparseable output before exhaustion: when lint fails but no
1514
+ # violations were parsed, this is the most specific diagnosis regardless
1515
+ # of whether we also hit the iteration limit.
1516
+ if [[ $last_lint_exit -ne 0 && $final_violation_count -eq 0 ]]; then
1517
+ echo "[Phase 7] Result: ✗ FAILED — markdownlint exited $last_lint_exit but violations could not be parsed" >&2
1518
+ markdownlint_status="failed-unparseable"
1519
+ elif [[ "$stall_detected" == "true" ]]; then
1520
+ echo "[Phase 7] Result: ✗ FAILED — stall detected with $final_violation_count remaining violation(s)" >&2
1521
+ markdownlint_status="failed-stall"
1522
+ elif [[ $total_iterations -ge $max_iter && $final_violation_count -gt 0 ]]; then
1523
+ echo "[Phase 7] Result: ✗ FAILED — max iterations ($max_iter) exhausted with $final_violation_count remaining violation(s)" >&2
1524
+ markdownlint_status="failed-exhausted"
1525
+ else
1526
+ markdownlint_status="failed"
1527
+ fi
1528
+
1529
+ # --- Recovery Layers 3-5 (when enabled) ---
1530
+ # Use defaulted expansion so test harnesses sourcing only this section
1531
+ # under set -u do not abort with an unbound-variable error.
1532
+ if [[ "${SPECKIT_COPILOT_CLI_ON_STALL:-true}" == "true" && "$markdownlint_status" != "failed-unparseable" ]]; then
1533
+ echo "" >&2
1534
+ echo "[Phase 7] === Recovery Layers (SPECKIT_COPILOT_CLI_ON_STALL=true) ===" >&2
1535
+
1536
+ # Collect affected files for recovery layers
1537
+ local recovery_affected_files=()
1538
+ local recovery_lint_output=""
1539
+ recovery_lint_output=$(cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs "${md_files[@]}" 2>&1) || true
1540
+ local recovery_files_raw=""
1541
+ recovery_files_raw=$(printf '%s\n' "$recovery_lint_output" | grep -oE '^[^:]+\.md' | sort -u || true)
1542
+ if [[ -n "$recovery_files_raw" ]]; then
1543
+ while IFS= read -r rf; do
1544
+ [[ -n "$rf" && -f "$rf" ]] && recovery_affected_files+=("$rf")
1545
+ done <<< "$recovery_files_raw"
1546
+ fi
1547
+ # Fallback to all md_files if no specific files identified
1548
+ if [[ ${#recovery_affected_files[@]} -eq 0 ]]; then
1549
+ recovery_affected_files=("${md_files[@]}")
1550
+ fi
1551
+
1552
+ # Layer 3: Enhanced multi-turn SDK remediation
1553
+ if _run_enhanced_remediation "$spec_dir" "${recovery_affected_files[@]}"; then
1554
+ echo "[Phase 7] Result: ✓ SUCCESS — resolved via Layer 3 (enhanced remediation)" >&2
1555
+ echo "markdownlint_status=success" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1556
+ echo "markdownlint_iterations=$total_iterations" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1557
+ echo "markdownlint_violations=0" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1558
+ return 0
1559
+ fi
1560
+
1561
+ # Layer 4: Alternate LLM remediation
1562
+ if _run_alternate_llm_remediation "$spec_dir" "${recovery_affected_files[@]}"; then
1563
+ echo "[Phase 7] Result: ✓ SUCCESS — resolved via Layer 4 (alternate LLM)" >&2
1564
+ echo "markdownlint_status=success" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1565
+ echo "markdownlint_iterations=$total_iterations" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1566
+ echo "markdownlint_violations=0" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1567
+ return 0
1568
+ fi
1569
+
1570
+ # Layer 5: Graceful fallback — proceed with warning
1571
+ echo "" >&2
1572
+ echo "[Phase 7] [Layer 5] Graceful fallback — proceeding with remaining violations as warnings." >&2
1573
+ local remaining_violations=""
1574
+ local lint_rerun_exit=0
1575
+ remaining_violations=$(cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs "${md_files[@]}" 2>&1) || lint_rerun_exit=$?
1576
+ # Re-count actual remaining violations (final_violation_count may be stale
1577
+ # after Layers 3/4 partially reduced findings)
1578
+ local actual_remaining_count=0
1579
+ actual_remaining_count=$(printf '%s\n' "$remaining_violations" | grep -cE '^.+\.md:[0-9]+' || true)
1580
+ # Guard against tooling/config errors: if markdownlint exited non-zero
1581
+ # but we parsed zero violation lines, something else went wrong.
1582
+ if [[ $lint_rerun_exit -ne 0 && $actual_remaining_count -eq 0 ]]; then
1583
+ echo "[Phase 7] [Layer 5] ⚠ markdownlint exited $lint_rerun_exit but no parseable violations found — possible tooling error." >&2
1584
+ echo "[Phase 7] [Layer 5] Output: $remaining_violations" >&2
1585
+ echo "markdownlint_status=failed" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1586
+ echo "markdownlint_iterations=$total_iterations" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1587
+ echo "markdownlint_violations=0" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1588
+ return 1
1589
+ fi
1590
+ echo "[Phase 7] Remaining violations (warning-only): $actual_remaining_count" >&2
1591
+ printf '%s\n' "$remaining_violations" | head -50 >&2 || true
1592
+ echo "[Phase 7] Result: ⚠ WARNING-FALLBACK — $actual_remaining_count violation(s) remain as warnings" >&2
1593
+
1594
+ echo "markdownlint_status=warning-fallback" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1595
+ echo "markdownlint_iterations=$total_iterations" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1596
+ echo "markdownlint_violations=$actual_remaining_count" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1597
+ echo "markdownlint_remaining_violations<<EOF" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1598
+ printf '%s\n' "$remaining_violations" | sed "s|${spec_dir}/||g" | head -30 >> "${GITHUB_OUTPUT:-/dev/stdout}" || true
1599
+ echo "EOF" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1600
+ return 0
1601
+ fi
1602
+
1603
+ echo "markdownlint_status=$markdownlint_status" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1604
+ echo "markdownlint_iterations=$total_iterations" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1605
+ echo "markdownlint_violations=$final_violation_count" >> "${GITHUB_OUTPUT:-/dev/stdout}"
1606
+
1607
+ # Print remaining violations for actionable output (capped at 50 lines to
1608
+ # keep CI logs readable; full output is available via markdownlint re-run)
1609
+ echo "[Phase 7] Remaining violations:" >&2
1610
+ (cd "$spec_dir" && npx "markdownlint-cli2@${MARKDOWNLINT_CLI2_VERSION}" --no-globs "${md_files[@]}" 2>&1) | head -50 >&2 || true
1611
+
1612
+ return 1
1613
+ }
1614
+
1615
+ # ========================== Content Preservation =============================
1616
+ #
1617
+ # Shared validation contract for both CI and interactive modes.
1618
+ # These functions implement the three-layer protection model:
1619
+ # Layer 1: PREVENTION — Improved LLM prompt (see run_clarify_phase / run_checklist_phase)
1620
+ # Layer 2: DETECTION — Structural validation (validate_structural_integrity)
1621
+ # Layer 3: RECOVERY — Backup + restore (create_backup / restore_from_backup)
1622
+ #
1623
+ # Constants used by validate_structural_integrity:
1624
+ # MANDATORY_SECTIONS — Always required in every valid spec.md
1625
+ # REQUIREMENT_RETENTION_THRESHOLD — Minimum % of FR/NFR entries to retain (spec)
1626
+ # CHECKLIST_RETENTION_THRESHOLD — Minimum % of checklist items to retain
1627
+ #
1628
+ # See also: .github/agents/speckit.clarify.agent.md (interactive mode)
1629
+ # ============================================================================
1630
+
1631
+ # Always-mandatory sections in spec.md (FR-006)
1632
+ MANDATORY_SECTIONS=(
1633
+ "## Problem Statement"
1634
+ "## User Scenarios & Testing"
1635
+ "## Requirements"
1636
+ "## Success Criteria"
1637
+ )
1638
+
1639
+ # Retention thresholds (percentage, integer)
1640
+ REQUIREMENT_RETENTION_THRESHOLD=95
1641
+ CHECKLIST_RETENTION_THRESHOLD=100
1642
+
1643
+ # File size (bytes) at or above which a context-window truncation warning
1644
+ # is emitted to stderr during the clarification phase (FR-012).
1645
+ CONTEXT_WINDOW_WARNING_THRESHOLD="${CONTEXT_WINDOW_WARNING_THRESHOLD:-50000}"
1646
+
1647
+ # ---------------------------------------------------------------------------
1648
+ # create_backup <filepath>
1649
+ #
1650
+ # Creates a backup of <filepath> with collision-avoidance naming:
1651
+ # <filepath>.bak, <filepath>.bak.1, <filepath>.bak.2, ...
1652
+ # Aborts with OS-level error detail on write failure (FR-002).
1653
+ # Prints the backup path on stdout.
1654
+ # ---------------------------------------------------------------------------
1655
+ create_backup() {
1656
+ local filepath="$1"
1657
+ local backup_path="${filepath}.bak"
1658
+ local counter=1
1659
+
1660
+ while [[ -e "$backup_path" ]]; do
1661
+ backup_path="${filepath}.bak.${counter}"
1662
+ counter=$((counter + 1))
1663
+ done
1664
+
1665
+ local cp_error
1666
+
1667
+ if ! cp_error=$(cp "$filepath" "$backup_path" 2>&1); then
1668
+ echo "Error: Failed to create backup at '$backup_path': $cp_error" >&2
1669
+ return 1
1670
+ fi
1671
+
1672
+ printf '%s' "$backup_path"
1673
+ }
1674
+
1675
+ # ---------------------------------------------------------------------------
1676
+ # restore_from_backup <filepath> <backup_path>
1677
+ #
1678
+ # Restores the original file from a backup (FR-007).
1679
+ # ---------------------------------------------------------------------------
1680
+ restore_from_backup() {
1681
+ local filepath="$1"
1682
+ local backup_path="$2"
1683
+ local cp_error
1684
+
1685
+ if [[ ! -f "$backup_path" ]]; then
1686
+ echo "Error: Backup file '$backup_path' does not exist" >&2
1687
+ return 1
1688
+ fi
1689
+
1690
+ if ! cp_error=$(cp "$backup_path" "$filepath" 2>&1); then
1691
+ echo "Error: Failed to restore '$filepath' from backup '$backup_path': $cp_error" >&2
1692
+ return 1
1693
+ fi
1694
+ }
1695
+
1696
+ # ---------------------------------------------------------------------------
1697
+ # count_requirement_entries <filepath>
1698
+ #
1699
+ # Counts unique FR-### / NFR-### requirement IDs in the spec. When a
1700
+ # "## Requirements" section exists, only that section is scanned; otherwise the
1701
+ # full file is scanned as a fallback. This supports bullets, paragraphs,
1702
+ # headings, and table-based requirement formats.
1703
+ # Returns count on stdout.
1704
+ # ---------------------------------------------------------------------------
1705
+ count_requirement_entries() {
1706
+ local filepath="$1"
1707
+
1708
+ if [[ ! -f "$filepath" ]]; then
1709
+ echo "0"
1710
+ return 0
1711
+ fi
1712
+
1713
+ # Extract the Requirements section (or full file if none exists), then
1714
+ # use grep -oE to find unique FR-###/NFR-### IDs. This avoids the
1715
+ # non-POSIX awk match(..., ..., capture_array) form that fails on
1716
+ # macOS/BSD awk.
1717
+ local scoped_lines count
1718
+ scoped_lines=$(
1719
+ awk '
1720
+ BEGIN { in_req = 0; saw_req = 0 }
1721
+ /^[[:space:]]*##[[:space:]]+Requirements([[:space:]]*$|[[:space:][:punct:]].*)/ {
1722
+ in_req = 1; saw_req = 1
1723
+ }
1724
+ saw_req && in_req && /^[[:space:]]*##[[:space:]]+/ && $0 !~ /^[[:space:]]*##[[:space:]]+Requirements([[:space:]]*$|[[:space:][:punct:]].*)/ {
1725
+ in_req = 0
1726
+ }
1727
+ { if (!saw_req || in_req) print }
1728
+ ' "$filepath" 2>/dev/null || printf ''
1729
+ )
1730
+
1731
+ if [[ -z "$scoped_lines" ]]; then
1732
+ echo "0"
1733
+ return 0
1734
+ fi
1735
+
1736
+ count=$(printf '%s\n' "$scoped_lines" | grep -oE '(^|[^[:alnum:]_])(FR|NFR)-[0-9]+' | grep -oE '(FR|NFR)-[0-9]+' | sort -u | wc -l) || true
1737
+ echo "${count:-0}"
1738
+ }
1739
+
1740
+ # ---------------------------------------------------------------------------
1741
+ # count_checklist_items <filepath>
1742
+ #
1743
+ # Counts Markdown task list items: - [ ], - [x], - [X]
1744
+ # Returns count on stdout.
1745
+ # ---------------------------------------------------------------------------
1746
+ count_checklist_items() {
1747
+ local filepath="$1"
1748
+ local count
1749
+ count=$(grep -cE '^- \[([xX]| )\] ' "$filepath" 2>/dev/null) || true
1750
+ echo "${count:-0}"
1751
+ }
1752
+
1753
+ # ---------------------------------------------------------------------------
1754
+ # extract_section_headings <filepath>
1755
+ #
1756
+ # Extracts ## headings, strips trailing *(mandatory)* annotations and trims
1757
+ # whitespace. Returns one heading per line on stdout.
1758
+ # ---------------------------------------------------------------------------
1759
+ extract_section_headings() {
1760
+ local filepath="$1"
1761
+ { grep -E '^## ' "$filepath" 2>/dev/null || true; } | sed -E 's/[[:space:]]*\*\(mandatory\)\*[[:space:]]*$//' | sed 's/[[:space:]]*$//'
1762
+ }
1763
+
1764
+ # ---------------------------------------------------------------------------
1765
+ # validate_structural_integrity <original_file> <candidate_file> [--type spec|checklist]
1766
+ #
1767
+ # Compares a candidate output against the original file to ensure structural
1768
+ # integrity is preserved.
1769
+ #
1770
+ # For --type spec (default):
1771
+ # - All mandatory sections must be present
1772
+ # - All original section headings must be preserved
1773
+ # - Requirement entry count must be >= ceil(0.95 * original_count)
1774
+ #
1775
+ # For --type checklist:
1776
+ # - All original section headings must be preserved
1777
+ # - Checklist item count must be >= original_count
1778
+ #
1779
+ # Skips retention check when original count is 0.
1780
+ # Prints specific failure reasons to stderr (NFR-002).
1781
+ # Returns 0 on pass, 1 on fail.
1782
+ # ---------------------------------------------------------------------------
1783
+ validate_structural_integrity() {
1784
+ local original_file="$1"
1785
+ local candidate_file="$2"
1786
+ local file_type="spec"
1787
+
1788
+ # Parse optional --type argument
1789
+ shift 2
1790
+ while [[ $# -gt 0 ]]; do
1791
+ case "$1" in
1792
+ --type)
1793
+ if [[ -z "${2:-}" ]]; then
1794
+ echo "Error: --type requires a value" >&2
1795
+ return 1
1796
+ fi
1797
+ case "$2" in
1798
+ spec|checklist)
1799
+ file_type="$2"
1800
+ ;;
1801
+ *)
1802
+ echo "Error: --type must be 'spec' or 'checklist' (got '$2')" >&2
1803
+ return 1
1804
+ ;;
1805
+ esac
1806
+ shift 2
1807
+ ;;
1808
+ *)
1809
+ echo "Error: Unknown argument '$1'" >&2
1810
+ return 1
1811
+ ;;
1812
+ esac
1813
+ done
1814
+
1815
+ local failed=0
1816
+
1817
+ # --- Mandatory sections check (spec only) ---
1818
+ # Use extracted headings (line-anchored) to avoid false positives from TOC/links
1819
+ if [[ "$file_type" == "spec" ]]; then
1820
+ local candidate_headings_for_mandatory
1821
+ candidate_headings_for_mandatory=$(extract_section_headings "$candidate_file")
1822
+ for section in "${MANDATORY_SECTIONS[@]}"; do
1823
+ local normalized_section
1824
+ normalized_section=$(echo "$section" | sed -E 's/[[:space:]]*\*\(mandatory\)\*[[:space:]]*$//' | sed 's/[[:space:]]*$//')
1825
+ if ! echo "$candidate_headings_for_mandatory" | grep -qxF "$normalized_section"; then
1826
+ echo "Validation FAILED: mandatory section missing: '$normalized_section'" >&2
1827
+ failed=1
1828
+ fi
1829
+ done
1830
+ fi
1831
+
1832
+ # --- All original section headings preserved ---
1833
+ local original_headings candidate_headings
1834
+ original_headings=$(extract_section_headings "$original_file")
1835
+ candidate_headings=$(extract_section_headings "$candidate_file")
1836
+
1837
+ while IFS= read -r heading; do
1838
+ [[ -z "$heading" ]] && continue
1839
+ if ! echo "$candidate_headings" | grep -qxF "$heading"; then
1840
+ echo "Validation FAILED: original section heading missing: '$heading'" >&2
1841
+ failed=1
1842
+ fi
1843
+ done <<< "$original_headings"
1844
+
1845
+ # --- Retention check ---
1846
+ if [[ "$file_type" == "spec" ]]; then
1847
+ local original_count candidate_count threshold
1848
+ original_count=$(count_requirement_entries "$original_file")
1849
+ candidate_count=$(count_requirement_entries "$candidate_file")
1850
+
1851
+ if [[ "$original_count" -gt 0 ]]; then
1852
+ # Integer ceiling: ceil(threshold% * N) = (threshold * N + (100-1)) / 100
1853
+ threshold=$(( (REQUIREMENT_RETENTION_THRESHOLD * original_count + 99) / 100 ))
1854
+ if [[ "$candidate_count" -lt "$threshold" ]]; then
1855
+ echo "Validation FAILED: requirement count dropped from $original_count to $candidate_count (threshold: $threshold, ${REQUIREMENT_RETENTION_THRESHOLD}%)" >&2
1856
+ failed=1
1857
+ fi
1858
+ fi
1859
+ elif [[ "$file_type" == "checklist" ]]; then
1860
+ local original_count candidate_count
1861
+ original_count=$(count_checklist_items "$original_file")
1862
+ candidate_count=$(count_checklist_items "$candidate_file")
1863
+
1864
+ if [[ "$original_count" -gt 0 ]]; then
1865
+ local threshold
1866
+ threshold=$(( (CHECKLIST_RETENTION_THRESHOLD * original_count + 99) / 100 ))
1867
+ if [[ "$candidate_count" -lt "$threshold" ]]; then
1868
+ echo "Validation FAILED: checklist item count dropped from $original_count to $candidate_count (threshold: $threshold, ${CHECKLIST_RETENTION_THRESHOLD}% retention required)" >&2
1869
+ failed=1
1870
+ fi
1871
+ fi
1872
+ fi
1873
+
1874
+ return "$failed"
1875
+ }
1876
+
1877
+ # ---------------------------------------------------------------------------
1878
+ # safe_write_with_validation <original_file> <candidate_content> [--type spec|checklist]
1879
+ #
1880
+ # Orchestrates the full safe-write flow:
1881
+ # 1. Create backup of original (FR-002)
1882
+ # 2. Write candidate to <original_file>.tmp
1883
+ # 3. Run validate_structural_integrity
1884
+ # 4. On pass: mv .tmp original (atomic POSIX rename)
1885
+ # 5. On fail: remove .tmp, leave original unchanged, report errors (FR-007)
1886
+ #
1887
+ # Returns 0 on success, non-zero on any failure (validation, backup, I/O, or
1888
+ # atomic replace).
1889
+ # ---------------------------------------------------------------------------
1890
+ safe_write_with_validation() {
1891
+ local original_file="$1"
1892
+ local candidate_content="$2"
1893
+ shift 2
1894
+ local extra_args=("$@")
1895
+
1896
+ local tmp_file="${original_file}.tmp"
1897
+
1898
+ # Step 1: Create backup
1899
+ local backup_path
1900
+ backup_path=$(create_backup "$original_file") || {
1901
+ echo "Error: Backup creation failed for '$original_file'. Aborting write." >&2
1902
+ return 1
1903
+ }
1904
+ echo "Backup created: $backup_path" >&2
1905
+
1906
+ # Step 2: Write candidate to .tmp
1907
+ printf '%s\n' "$candidate_content" > "$tmp_file" || {
1908
+ echo "Error: Failed to write candidate to '$tmp_file'" >&2
1909
+ rm -f "$tmp_file"
1910
+ rm -f "$backup_path"
1911
+ return 1
1912
+ }
1913
+
1914
+ # Step 3: Validate
1915
+ if validate_structural_integrity "$original_file" "$tmp_file" "${extra_args[@]}"; then
1916
+ # Step 4: Atomic replace
1917
+ mv "$tmp_file" "$original_file" || {
1918
+ echo "Error: Atomic replace failed. Restoring from backup." >&2
1919
+ restore_from_backup "$original_file" "$backup_path"
1920
+ rm -f "$tmp_file"
1921
+ return 1
1922
+ }
1923
+ # Remove backup after successful replace to prevent .bak files from being committed
1924
+ rm -f "$backup_path"
1925
+ echo "Validation passed. File updated: $original_file" >&2
1926
+ return 0
1927
+ else
1928
+ # Step 5: Validation failed — leave original unchanged
1929
+ rm -f "$tmp_file"
1930
+ echo "Validation FAILED. Original file preserved: $original_file" >&2
1931
+ echo "Backup available at: $backup_path" >&2
1932
+ return 1
1933
+ fi
1934
+ }
1935
+
1936
+ # ---------------------------------------------------------------------------
1937
+ # capture_missing_mandatory_sections <original_file> <candidate_content>
1938
+ #
1939
+ # Compares the candidate content against the MANDATORY_SECTIONS array and
1940
+ # returns (prints to stdout) a comma-separated list of missing section names.
1941
+ # Used by run_clarify_phase() to build retry feedback for the LLM.
1942
+ # ---------------------------------------------------------------------------
1943
+ capture_missing_mandatory_sections() {
1944
+ local original_file="$1"
1945
+ local candidate_content="$2"
1946
+ local tmp_check
1947
+ tmp_check=$(mktemp "${original_file}.missing_check.XXXXXX") || {
1948
+ echo "Error: capture_missing_mandatory_sections: failed to create temp file near ${original_file}" >&2
1949
+ return 1
1950
+ }
1951
+ if ! printf '%s\n' "$candidate_content" > "$tmp_check"; then
1952
+ echo "Error: capture_missing_mandatory_sections: failed to write candidate content to $tmp_check" >&2
1953
+ rm -f "$tmp_check"
1954
+ return 1
1955
+ fi
1956
+ local candidate_headings
1957
+ candidate_headings=$(extract_section_headings "$tmp_check")
1958
+ local missing=""
1959
+ for section in "${MANDATORY_SECTIONS[@]}"; do
1960
+ local normalized
1961
+ normalized=$(echo "$section" | sed -E 's/[[:space:]]*\*\(mandatory\)\*[[:space:]]*$//' | sed 's/[[:space:]]*$//')
1962
+ if ! echo "$candidate_headings" | grep -qxF "$normalized"; then
1963
+ missing="${missing}${missing:+, }${normalized}"
1964
+ fi
1965
+ done
1966
+ rm -f "$tmp_check"
1967
+ printf '%s' "$missing"
1968
+ }
1969
+
1970
+ # ========================== Phase Functions ==================================
1971
+
1972
+ # ---------------------------------------------------------------------------
1973
+ # run_specify_phase
1974
+ #
1975
+ # Constructs the specify prompt and calls call_llm.
1976
+ # Prints the generated spec content to stdout.
1977
+ # ---------------------------------------------------------------------------
1978
+ run_specify_phase() {
1979
+ # Load the spec template
1980
+ local template_file="$REPO_ROOT/.specify/presets/agdt-templates/templates/spec-template.md"
1981
+ local spec_template=""
1982
+ if [[ -f "$template_file" ]]; then
1983
+ spec_template=$(cat "$template_file")
1984
+ fi
1985
+
1986
+ local mandatory_heading_lines=""
1987
+ local section
1988
+ for section in "${MANDATORY_SECTIONS[@]}"; do
1989
+ mandatory_heading_lines="${mandatory_heading_lines}- ${section}"$'\n'
1990
+ done
1991
+
1992
+ local prompt
1993
+ prompt="You are a specification writer. Create a feature specification based on the following GitHub issue.
1994
+
1995
+ ## Issue Details
1996
+ - **Issue Number**: #$ISSUE_NUMBER
1997
+ - **Issue URL**: $ISSUE_URL
1998
+ - **Title**: $ISSUE_TITLE
1999
+
2000
+ ## Issue Description
2001
+ $ISSUE_BODY
2002
+
2003
+ ## Instructions
2004
+ 1. Create a complete feature specification following the template structure
2005
+ 2. Include user stories with priorities (P1, P2, P3)
2006
+ 3. Define functional and non-functional requirements
2007
+ 4. Include acceptance scenarios in Given/When/Then format
2008
+ 5. Add a \"Source Issue\" field at the top with: #$ISSUE_NUMBER ($ISSUE_URL)
2009
+ 6. Keep the specification focused on WHAT and WHY, not HOW
2010
+ 7. Make reasonable assumptions where details are missing
2011
+ 8. Limit [NEEDS CLARIFICATION] markers to maximum 3 critical items
2012
+ 9. Include ALL mandatory section headings as level-2 markdown headings (##), exactly as shown below:
2013
+ ${mandatory_heading_lines}
2014
+
2015
+ ## Template Reference
2016
+ $spec_template
2017
+
2018
+ Generate the specification now. Output ONLY the specification content, no commentary, no code fences. Start with the header and metadata section.
2019
+
2020
+ CRITICAL: Your output MUST begin with a markdown heading on the very first line.
2021
+ WRONG: \"Spec created at specs/...\"
2022
+ WRONG: \"Here is the updated specification...\"
2023
+ WRONG: \"Certainly! Here is...\"
2024
+ CORRECT: \"# Spec: Feature Name\"
2025
+ Do NOT include any conversational preamble before the heading."
2026
+
2027
+ call_llm "$prompt"
2028
+ }
2029
+
2030
+ # ---------------------------------------------------------------------------
2031
+ # run_specify_phase_with_feedback
2032
+ #
2033
+ # Variant of run_specify_phase that includes structured feedback from a
2034
+ # previous failed validation attempt. Uses SPECIFY_RETRY_FEEDBACK and
2035
+ # SPECIFY_FAILED_OUTPUT global variables when set.
2036
+ # ---------------------------------------------------------------------------
2037
+ run_specify_phase_with_feedback() {
2038
+ if [[ -z "${SPECIFY_RETRY_FEEDBACK:-}" ]]; then
2039
+ run_specify_phase
2040
+ return $?
2041
+ fi
2042
+
2043
+ # Load the spec template
2044
+ local template_file="$REPO_ROOT/.specify/presets/agdt-templates/templates/spec-template.md"
2045
+ local spec_template=""
2046
+ if [[ -f "$template_file" ]]; then
2047
+ spec_template=$(cat "$template_file")
2048
+ fi
2049
+
2050
+ local mandatory_heading_lines=""
2051
+ local section
2052
+ for section in "${MANDATORY_SECTIONS[@]}"; do
2053
+ mandatory_heading_lines="${mandatory_heading_lines}- ${section}"$'\n'
2054
+ done
2055
+
2056
+ local prompt
2057
+ prompt="You are a specification writer. Your previous attempt failed structural validation. You MUST fix ALL issues listed below.
2058
+
2059
+ ## Issue Details
2060
+ - **Issue Number**: #$ISSUE_NUMBER
2061
+ - **Issue URL**: $ISSUE_URL
2062
+ - **Title**: $ISSUE_TITLE
2063
+
2064
+ ## Issue Description
2065
+ $ISSUE_BODY
2066
+
2067
+ ${SPECIFY_RETRY_FEEDBACK}
2068
+
2069
+ ## Your Previous (Invalid) Output
2070
+ ${SPECIFY_FAILED_OUTPUT:-}
2071
+
2072
+ ## Instructions
2073
+ 1. Create a COMPLETE feature specification — not a summary or outline
2074
+ 2. Include user stories with priorities (P1, P2, P3) — each with Given/When/Then scenarios
2075
+ 3. Define at least ${MIN_FUNCTIONAL_REQUIREMENTS} functional requirements (FR-### format)
2076
+ 4. Include at least ${MIN_USER_STORIES} user stories (### User Story headings)
2077
+ 5. Success criteria (SC-### format) must contain measurable targets (numbers, percentages)
2078
+ 6. Write detailed prose — do NOT use bullet points for everything
2079
+ 7. Add a \"Source Issue\" field at the top with: #$ISSUE_NUMBER ($ISSUE_URL)
2080
+ 8. Keep the specification focused on WHAT and WHY, not HOW
2081
+ 9. Include ALL mandatory section headings as level-2 markdown headings (##), exactly as shown below:
2082
+ ${mandatory_heading_lines}
2083
+
2084
+ ## Template Reference
2085
+ $spec_template
2086
+
2087
+ CRITICAL: Your output MUST begin with a markdown heading on the very first line.
2088
+ Do NOT include any conversational preamble before the heading."
2089
+
2090
+ call_llm "$prompt"
2091
+ }
2092
+
2093
+ # ---------------------------------------------------------------------------
2094
+ # run_specify_phase_with_validation_retries
2095
+ #
2096
+ # Runs Phase 1 specify with structural validation retries and structured
2097
+ # feedback. Validation failures consume retry budget; operational failures do
2098
+ # not consume retry budget.
2099
+ #
2100
+ # Stdout: Valid specification content
2101
+ # Returns:
2102
+ # 0 = success
2103
+ # 1 = validation retries exhausted or operational failure cap reached
2104
+ # ---------------------------------------------------------------------------
2105
+ run_specify_phase_with_validation_retries() {
2106
+ local specify_retry_count=0
2107
+ local specify_operational_failures=0
2108
+ local specify_last_failures=""
2109
+ local last_operational_reason=""
2110
+ local validation_rc=0
2111
+
2112
+ while [[ "$specify_retry_count" -lt "$SPECIFY_MAX_RETRIES" ]]; do
2113
+ SPEC_CONTENT=$(run_specify_phase_with_feedback) || {
2114
+ echo "[Specify] LLM call failed (operational failure, not counting as retry)" >&2
2115
+ specify_operational_failures=$((specify_operational_failures + 1))
2116
+ last_operational_reason="LLM call failed"
2117
+ if [[ "$specify_operational_failures" -ge "$SPECIFY_MAX_OPERATIONAL_FAILURES" ]]; then
2118
+ break
2119
+ fi
2120
+ continue
2121
+ }
2122
+ if [[ -z "$SPEC_CONTENT" ]]; then
2123
+ echo "[Specify] LLM returned empty content (operational failure, not counting as retry)" >&2
2124
+ specify_operational_failures=$((specify_operational_failures + 1))
2125
+ last_operational_reason="LLM returned empty content"
2126
+ if [[ "$specify_operational_failures" -ge "$SPECIFY_MAX_OPERATIONAL_FAILURES" ]]; then
2127
+ break
2128
+ fi
2129
+ continue
2130
+ fi
2131
+ SPEC_CONTENT=$(strip_llm_preamble "$SPEC_CONTENT" "# ")
2132
+ if [[ -z "${SPEC_CONTENT//[[:space:]]/}" ]]; then
2133
+ echo "[Specify] LLM returned only whitespace after preamble stripping (operational failure)" >&2
2134
+ specify_operational_failures=$((specify_operational_failures + 1))
2135
+ last_operational_reason="LLM returned whitespace after preamble stripping"
2136
+ if [[ "$specify_operational_failures" -ge "$SPECIFY_MAX_OPERATIONAL_FAILURES" ]]; then
2137
+ break
2138
+ fi
2139
+ continue
2140
+ fi
2141
+ SPEC_CONTENT=$(ensure_heading_start "$SPEC_CONTENT" "# Spec: $ISSUE_TITLE")
2142
+
2143
+ # Validate structural quality
2144
+ if specify_last_failures=$(_validate_spec_content "$SPEC_CONTENT"); then
2145
+ unset SPECIFY_RETRY_FEEDBACK SPECIFY_FAILED_OUTPUT 2>/dev/null || true
2146
+ printf '%s' "$SPEC_CONTENT"
2147
+ return 0
2148
+ else
2149
+ validation_rc=$?
2150
+ if [[ "$validation_rc" -eq 2 ]]; then
2151
+ echo "[Specify] Structural validation could not run (operational failure, not counting as retry)" >&2
2152
+ specify_operational_failures=$((specify_operational_failures + 1))
2153
+ last_operational_reason="structural validation could not run"
2154
+ if [[ "$specify_operational_failures" -ge "$SPECIFY_MAX_OPERATIONAL_FAILURES" ]]; then
2155
+ break
2156
+ fi
2157
+ continue
2158
+ fi
2159
+ fi
2160
+
2161
+ # Reset only after a non-operational iteration so consecutive rc=2
2162
+ # validation failures can still reach the operational-failure cap.
2163
+ specify_operational_failures=0
2164
+
2165
+ specify_retry_count=$((specify_retry_count + 1))
2166
+ if [[ "$specify_retry_count" -lt "$SPECIFY_MAX_RETRIES" ]]; then
2167
+ echo "[Specify] Validation failed (attempt ${specify_retry_count}/${SPECIFY_MAX_RETRIES}), retrying with structured feedback..." >&2
2168
+ local feedback
2169
+ feedback=$(_build_structured_specify_feedback "/dev/null" "$specify_last_failures")
2170
+ SPECIFY_RETRY_FEEDBACK="$feedback"
2171
+ SPECIFY_FAILED_OUTPUT="$SPEC_CONTENT"
2172
+ else
2173
+ echo "[Specify] Validation failed — all ${SPECIFY_MAX_RETRIES} retries exhausted" >&2
2174
+ fi
2175
+ done
2176
+
2177
+ unset SPECIFY_RETRY_FEEDBACK SPECIFY_FAILED_OUTPUT 2>/dev/null || true
2178
+ if [[ "$specify_operational_failures" -ge "$SPECIFY_MAX_OPERATIONAL_FAILURES" ]]; then
2179
+ echo "Error: Specify phase encountered ${specify_operational_failures} consecutive operational failures (limit: ${SPECIFY_MAX_OPERATIONAL_FAILURES})." >&2
2180
+ echo "Last operational failure: ${last_operational_reason}" >&2
2181
+ else
2182
+ echo "Error: Specify phase failed structural validation after ${SPECIFY_MAX_RETRIES} attempts." >&2
2183
+ echo "Failures:" >&2
2184
+ printf '%s\n' "$specify_last_failures" >&2
2185
+ fi
2186
+ return 1
2187
+ }
2188
+
2189
+ # ---------------------------------------------------------------------------
2190
+ # run_clarify_phase
2191
+ #
2192
+ # Reads the current spec.md, asks the LLM to perform an autonomous
2193
+ # clarification pass, and overwrites spec.md with the updated content.
2194
+ # ---------------------------------------------------------------------------
2195
+ run_clarify_phase() {
2196
+ local spec_file="$SPEC_DIR/spec.md"
2197
+
2198
+ # --- Pre-flight checks (FR-009) ---
2199
+ if [[ ! -f "$spec_file" ]]; then
2200
+ echo "Error: spec.md does not exist at '$spec_file'. Run the specify phase first." >&2
2201
+ return 1
2202
+ fi
2203
+ if [[ ! -s "$spec_file" ]]; then
2204
+ echo "Error: spec.md is empty (0 bytes) at '$spec_file'. Run the specify phase first." >&2
2205
+ return 1
2206
+ fi
2207
+
2208
+ # --- File size warning (FR-012) ---
2209
+ local file_size
2210
+ file_size=$(wc -c < "$spec_file")
2211
+ if [[ "$file_size" -ge "$CONTEXT_WINDOW_WARNING_THRESHOLD" ]]; then
2212
+ echo "Warning: spec.md is ${file_size} bytes (≥${CONTEXT_WINDOW_WARNING_THRESHOLD}B). Potential context-window truncation risk." >&2
2213
+ fi
2214
+
2215
+ local spec_content
2216
+ spec_content=$(strip_model_footer "$(cat "$spec_file")")
2217
+
2218
+ # --- Collect baseline metrics for LLM cross-reference ---
2219
+ local section_headings requirement_count
2220
+ section_headings=$(extract_section_headings "$spec_file")
2221
+ requirement_count=$(count_requirement_entries "$spec_file")
2222
+
2223
+ local today
2224
+ today=$(date +%Y-%m-%d)
2225
+
2226
+ local prompt
2227
+ prompt="You are an autonomous specification clarifier. Below is a feature specification. Your task is to:
2228
+
2229
+ CRITICAL PRESERVATION RULES:
2230
+ - You MUST output the COMPLETE specification with ALL sections intact
2231
+ - Do NOT summarize, truncate, or omit any section
2232
+ - Every section heading from the input MUST appear in your output
2233
+ - Every FR-### and NFR-### entry MUST be preserved unless explicitly merged
2234
+ - Replace [NEEDS CLARIFICATION] markers in-place with resolved answers
2235
+ - Append a ## Clarifications section (or add to existing) with session Q&A
2236
+
2237
+ CROSS-REFERENCE CHECKLIST (verify before finalizing your output):
2238
+ The original specification contains the following section headings — ALL must appear in your output:
2239
+ $section_headings
2240
+ The original specification contains $requirement_count requirement entries (FR-### / NFR-###).
2241
+ Your output must retain at least 95% of these entries.
2242
+
2243
+ INSTRUCTIONS:
2244
+ 1. Perform a structured ambiguity scan across these categories:
2245
+ - Functional Scope & Behavior
2246
+ - Domain & Data Model
2247
+ - Interaction & UX Flow
2248
+ - Non-Functional Quality Attributes
2249
+ - Integration & External Dependencies
2250
+ - Edge Cases & Failure Handling
2251
+ - Constraints & Tradeoffs
2252
+ - Terminology & Consistency
2253
+
2254
+ 2. Generate up to 5 clarification questions. For each question, determine the recommended answer based on best practices and the context of the specification.
2255
+
2256
+ 3. Immediately auto-accept all recommended answers (do NOT wait for human input).
2257
+
2258
+ 4. Embed the questions and accepted answers in a \`## Clarifications\` section (placed after the overview/introduction section) with:
2259
+ - A \`### Session $today\` subheading
2260
+ - Bullet points in this format: \`- Q: <question> → A: <accepted answer>\`
2261
+
2262
+ 5. Apply each accepted answer to the appropriate section of the specification:
2263
+ - Functional answers → Functional Requirements section
2264
+ - UX/actor answers → User Stories section
2265
+ - Data shape answers → Key Entities / Data Model section
2266
+ - Non-functional answers → Non-Functional Requirements (convert vague terms to measurable metrics)
2267
+ - Edge case answers → Edge Cases section
2268
+ - Terminology answers → Normalize terminology across the entire spec
2269
+
2270
+ 6. If no critical ambiguities are detected, add a \`## Clarifications\` section with:
2271
+ \`### Session $today\`
2272
+ \`- No critical ambiguities detected.\`
2273
+
2274
+ Output the COMPLETE updated specification content. Output ONLY the spec content, no commentary, no code fences.
2275
+
2276
+ ## Current Specification
2277
+ $spec_content
2278
+
2279
+ CRITICAL: Your output MUST begin with a markdown heading on the very first line.
2280
+ WRONG: \"Spec created at specs/...\"
2281
+ WRONG: \"Here is the updated specification...\"
2282
+ WRONG: \"Certainly! Here is...\"
2283
+ CORRECT: \"# Spec: Feature Name\"
2284
+ Do NOT include any conversational preamble before the heading."
2285
+
2286
+ # --- LLM call with multi-layer validation retry ---
2287
+ # Layer 1: Targeted feedback retries with stall detection
2288
+ # Layer 2: Incremental patching (_run_clarify_incremental_patch)
2289
+ # Layer 3: Alternate prompt strategy (_run_clarify_alternate_strategy)
2290
+ # Layer 4: Graceful degradation (preserve original, return 0)
2291
+ local clarify_attempt=0
2292
+ local clarify_max_retries="$CLARIFY_MAX_RETRIES"
2293
+ local clarify_retry_feedback=""
2294
+ local result
2295
+ local clarify_status="pending"
2296
+ local prev_fingerprint=""
2297
+ local clarify_layer_used=""
2298
+
2299
+ # Save original spec content for Layer 4 fallback and Layer 2/3
2300
+ local original_spec_content="$spec_content"
2301
+ # Track the last invalid candidate from Layer 1 for use as Layer 2 patch base
2302
+ local last_failed_candidate=""
2303
+
2304
+ # ── Early guard: skip all remediation when budget is 0 ──────────────
2305
+ if [[ "$clarify_max_retries" -le 0 ]]; then
2306
+ echo "[Clarify] All layers skipped (SPECKIT_CLARIFY_MAX_RETRIES=0) — preserving original spec.md" >&2
2307
+ clarify_status="warning-fallback"
2308
+ clarify_layer_used="layer4"
2309
+ echo "clarify_status=$clarify_status" >> "${GITHUB_OUTPUT:-/dev/stdout}"
2310
+ echo "clarify_layer_used=$clarify_layer_used" >> "${GITHUB_OUTPUT:-/dev/stdout}"
2311
+ return 0
2312
+ fi
2313
+
2314
+ # ── Layer 1: Targeted Feedback ──────────────────────────────────────
2315
+ echo "[Clarify] [Layer 1] Targeted feedback retries (max $clarify_max_retries)" >&2
2316
+
2317
+ clarify_attempt=0
2318
+ local _l1_op_failures=0
2319
+ while true; do
2320
+ # Build prompt (with retry feedback if set)
2321
+ local full_prompt="$prompt"
2322
+ if [[ -n "$clarify_retry_feedback" ]]; then
2323
+ full_prompt="RETRY CONTEXT — PREVIOUS ATTEMPT FAILED VALIDATION:
2324
+ ${clarify_retry_feedback}
2325
+ You MUST fix ALL of the above issues in your output this time.
2326
+
2327
+ ${prompt}"
2328
+ fi
2329
+
2330
+ local llm_rc=0
2331
+ result=$(call_llm "$full_prompt") || llm_rc=$?
2332
+ if [[ "$llm_rc" -ne 0 ]]; then
2333
+ _l1_op_failures=$((_l1_op_failures + 1))
2334
+ echo "[Clarify] [Layer 1] LLM call failed (operational error, rc=$llm_rc) — failure $_l1_op_failures/3" >&2
2335
+ if [[ "$_l1_op_failures" -ge 3 ]]; then
2336
+ echo "[Clarify] [Layer 1] Too many operational failures — escalating" >&2
2337
+ break
2338
+ fi
2339
+ continue # Retry without consuming retry budget
2340
+ fi
2341
+ if [[ -z "$result" ]]; then
2342
+ _l1_op_failures=$((_l1_op_failures + 1))
2343
+ echo "[Clarify] [Layer 1] LLM returned empty content — failure $_l1_op_failures/3" >&2
2344
+ if [[ "$_l1_op_failures" -ge 3 ]]; then
2345
+ echo "[Clarify] [Layer 1] Too many operational failures — escalating" >&2
2346
+ break
2347
+ fi
2348
+ continue # Retry without consuming retry budget
2349
+ fi
2350
+ result=$(strip_llm_preamble "$result" "# ")
2351
+ if [[ -z "${result//[[:space:]]/}" ]]; then
2352
+ _l1_op_failures=$((_l1_op_failures + 1))
2353
+ echo "[Clarify] [Layer 1] LLM returned blank content after preamble stripping — failure $_l1_op_failures/3" >&2
2354
+ if [[ "$_l1_op_failures" -ge 3 ]]; then
2355
+ echo "[Clarify] [Layer 1] Too many operational failures — escalating" >&2
2356
+ break
2357
+ fi
2358
+ continue # Retry without consuming retry budget
2359
+ fi
2360
+ result=$(ensure_heading_start "$result" "# Spec: $ISSUE_TITLE")
2361
+
2362
+ # LLM produced usable content — reset operational failure counter
2363
+ _l1_op_failures=0
2364
+
2365
+ # --- Diagnostic logging before validation ---
2366
+ local _diag_tmp
2367
+ if ! _diag_tmp=$(mktemp "${spec_file}.diag.XXXXXX.tmp"); then
2368
+ echo "Error: Clarify phase failed to create a diagnostic temp file for validation logging" >&2
2369
+ return 1
2370
+ fi
2371
+ if ! printf '%s\n' "$result" > "$_diag_tmp"; then
2372
+ rm -f "$_diag_tmp"
2373
+ echo "Error: Clarify phase failed to write diagnostic content to temporary file '$_diag_tmp'" >&2
2374
+ return 1
2375
+ fi
2376
+ echo "[Clarify] [Layer 1] Candidate section headings:" >&2
2377
+ extract_section_headings "$_diag_tmp" >&2 || true
2378
+ log_file_header "Clarify" "$_diag_tmp" || true
2379
+ rm -f "$_diag_tmp"
2380
+
2381
+ # --- Pre-validation with full structural integrity check ---
2382
+ local _preval_tmp _preval_err validation_failure_reasons
2383
+ _preval_tmp=$(mktemp "${spec_file}.preval.XXXXXX") || {
2384
+ echo "Error: Clarify phase failed to create temp file for pre-validation" >&2
2385
+ return 1
2386
+ }
2387
+ _preval_err=$(mktemp "${spec_file}.preval.err.XXXXXX") || {
2388
+ rm -f "$_preval_tmp"
2389
+ echo "Error: Clarify phase failed to create temp file for validation diagnostics" >&2
2390
+ return 1
2391
+ }
2392
+ if ! printf '%s\n' "$result" > "$_preval_tmp"; then
2393
+ rm -f "$_preval_tmp" "$_preval_err"
2394
+ echo "Error: Clarify phase failed to write candidate for pre-validation" >&2
2395
+ return 1
2396
+ fi
2397
+
2398
+ if validate_structural_integrity "$spec_file" "$_preval_tmp" --type spec 2>"$_preval_err"; then
2399
+ rm -f "$_preval_tmp" "$_preval_err"
2400
+ # Validation passed — attempt safe write
2401
+ clarify_retry_feedback=""
2402
+ if safe_write_with_validation "$spec_file" "$result" --type spec; then
2403
+ clarify_status="success"
2404
+ clarify_layer_used="layer1"
2405
+ echo "[Clarify] [Layer 1] ✓ Validation passed" >&2
2406
+ break 2>/dev/null || true # Exit Layer 1 retry loop
2407
+ fi
2408
+ echo "Error: Failed to persist validated Clarify phase output to $spec_file. Original spec.md preserved." >&2
2409
+ return 1
2410
+ fi
2411
+
2412
+ # Validation failed — build structured feedback
2413
+ validation_failure_reasons="$(sed '/^[[:space:]]*$/d' "$_preval_err" || true)"
2414
+ if [[ -z "$validation_failure_reasons" ]]; then
2415
+ validation_failure_reasons="Structural integrity validation failed without detailed diagnostics."
2416
+ fi
2417
+
2418
+ # Track last failed candidate for Layer 2 patch base
2419
+ last_failed_candidate="$result"
2420
+
2421
+ # Stall detection: compare fingerprints
2422
+ local current_fingerprint
2423
+ current_fingerprint=$(_compute_clarify_validation_fingerprint "$spec_file" "$_preval_tmp")
2424
+ rm -f "$_preval_tmp" "$_preval_err"
2425
+
2426
+ if [[ -n "$prev_fingerprint" && "$current_fingerprint" == "$prev_fingerprint" ]]; then
2427
+ echo "[Clarify] [Layer 1] Stall detected — validation fingerprint unchanged, escalating to Layer 2" >&2
2428
+ break
2429
+ fi
2430
+ prev_fingerprint="$current_fingerprint"
2431
+
2432
+ # Build structured retry feedback
2433
+ local _struct_tmp
2434
+ _struct_tmp=$(mktemp "${spec_file}.struct.XXXXXX") || {
2435
+ echo "Error: Clarify phase failed to create temp file for structured feedback" >&2
2436
+ return 1
2437
+ }
2438
+ if ! printf '%s\n' "$result" > "$_struct_tmp"; then
2439
+ rm -f "$_struct_tmp"
2440
+ echo "[Clarify] [Layer 1] Failed to write candidate for structured feedback — treating as operational failure" >&2
2441
+ _l1_op_failures=$((_l1_op_failures + 1))
2442
+ if [[ "$_l1_op_failures" -ge 3 ]]; then
2443
+ echo "[Clarify] [Layer 1] Too many operational failures — escalating" >&2
2444
+ break
2445
+ fi
2446
+ continue # Retry without consuming retry budget
2447
+ fi
2448
+ local structured_feedback
2449
+ structured_feedback=$(_build_structured_clarify_feedback "$spec_file" "$_struct_tmp")
2450
+ rm -f "$_struct_tmp"
2451
+
2452
+ if [[ -n "$structured_feedback" ]]; then
2453
+ clarify_retry_feedback="The previous Clarify response failed structural validation. Fix these specific issues:
2454
+ ${structured_feedback}
2455
+ Raw validation errors:
2456
+ ${validation_failure_reasons}"
2457
+ else
2458
+ clarify_retry_feedback=$'The previous Clarify response failed structural validation. Fix these issues and regenerate the complete response:\n'"$validation_failure_reasons"
2459
+ fi
2460
+
2461
+ clarify_attempt=$((clarify_attempt + 1))
2462
+ if [[ "$clarify_attempt" -gt "$clarify_max_retries" ]]; then
2463
+ echo "[Clarify] [Layer 1] Exhausted ($clarify_max_retries retries)" >&2
2464
+ break
2465
+ fi
2466
+
2467
+ echo "[Clarify] [Layer 1] Retry $clarify_attempt/$clarify_max_retries — validation failed. Reasons: $validation_failure_reasons" >&2
2468
+ done
2469
+
2470
+ # Check if Layer 1 succeeded
2471
+ if [[ "$clarify_status" == "success" ]]; then
2472
+ # Layer 1 succeeded — skip remaining layers
2473
+ :
2474
+ else
2475
+ # Clear stale feedback before Layer 2
2476
+ clarify_retry_feedback=""
2477
+
2478
+ # ── Layer 2: Incremental Patching ────────────────────────────────
2479
+ echo "[Clarify] [Layer 2] Incremental patching (max $clarify_max_retries retries)" >&2
2480
+
2481
+ local _l2_op_failures=0
2482
+ local _l2_exit_reason="exhausted"
2483
+ for (( clarify_attempt=1; clarify_attempt<=clarify_max_retries + 1; clarify_attempt++ )); do
2484
+ echo "[Clarify] [Layer 2] Attempt $clarify_attempt/$((clarify_max_retries + 1))" >&2
2485
+
2486
+ # Build validation failures text from last failed candidate (or original)
2487
+ local _l2_tmp _l2_failures _l2_patch_base
2488
+ _l2_patch_base="${last_failed_candidate:-$original_spec_content}"
2489
+ _l2_tmp=$(mktemp "${spec_file}.l2.XXXXXX") || {
2490
+ _l2_op_failures=$((_l2_op_failures + 1))
2491
+ echo "[Clarify] [Layer 2] Failed to create temp file (operational failure $_l2_op_failures/3)" >&2
2492
+ if [[ "$_l2_op_failures" -ge 3 ]]; then
2493
+ echo "[Clarify] [Layer 2] Too many operational failures — escalating" >&2
2494
+ _l2_exit_reason="operational"
2495
+ break
2496
+ fi
2497
+ clarify_attempt=$((clarify_attempt - 1)) # Don't consume retry budget
2498
+ continue # Retry without consuming retry budget
2499
+ }
2500
+ if ! printf '%s\n' "$_l2_patch_base" > "$_l2_tmp"; then
2501
+ rm -f "$_l2_tmp"
2502
+ _l2_op_failures=$((_l2_op_failures + 1))
2503
+ echo "[Clarify] [Layer 2] Failed to write patch base to temp file (operational failure $_l2_op_failures/3)" >&2
2504
+ if [[ "$_l2_op_failures" -ge 3 ]]; then
2505
+ echo "[Clarify] [Layer 2] Too many operational failures — escalating" >&2
2506
+ _l2_exit_reason="operational"
2507
+ break
2508
+ fi
2509
+ clarify_attempt=$((clarify_attempt - 1)) # Don't consume retry budget
2510
+ continue
2511
+ fi
2512
+ _l2_failures=$(_build_structured_clarify_feedback "$spec_file" "$_l2_tmp" 2>/dev/null || true)
2513
+ rm -f "$_l2_tmp"
2514
+
2515
+ if [[ -z "$_l2_failures" ]]; then
2516
+ # No failures detected — try with last result
2517
+ _l2_failures="Missing mandatory sections or heading structure issues detected."
2518
+ fi
2519
+
2520
+ local patch_rc=0
2521
+ local patched_result=""
2522
+ patched_result=$(_run_clarify_incremental_patch "$spec_file" "$_l2_patch_base" "$_l2_failures") || patch_rc=$?
2523
+
2524
+ if [[ "$patch_rc" -eq 2 ]]; then
2525
+ _l2_op_failures=$((_l2_op_failures + 1))
2526
+ echo "[Clarify] [Layer 2] Operational failure ($_l2_op_failures) — not counting as retry" >&2
2527
+ if [[ "$_l2_op_failures" -ge 3 ]]; then
2528
+ echo "[Clarify] [Layer 2] Too many operational failures — escalating" >&2
2529
+ _l2_exit_reason="operational"
2530
+ break
2531
+ fi
2532
+ clarify_attempt=$((clarify_attempt - 1)) # Don't consume retry budget
2533
+ continue
2534
+ fi
2535
+
2536
+ # Non-operational outcome — reset consecutive operational failure counter
2537
+ _l2_op_failures=0
2538
+
2539
+ if [[ "$patch_rc" -eq 0 && -n "$patched_result" ]]; then
2540
+ patched_result=$(ensure_heading_start "$patched_result" "# Spec: $ISSUE_TITLE")
2541
+ if safe_write_with_validation "$spec_file" "$patched_result" --type spec; then
2542
+ clarify_status="success-layer2"
2543
+ clarify_layer_used="layer2"
2544
+ echo "[Clarify] [Layer 2] ✓ Incremental patching succeeded after attempt $clarify_attempt" >&2
2545
+ break
2546
+ fi
2547
+ # safe_write_with_validation failed after _run_clarify_incremental_patch
2548
+ # already validated the content — this is an I/O/persistence error, not
2549
+ # a validation failure. Fail fast rather than consuming retry budget.
2550
+ echo "Error: [Clarify] [Layer 2] Persistence failure writing validated content to $spec_file. Original spec.md preserved." >&2
2551
+ return 1
2552
+ fi
2553
+
2554
+ echo "[Clarify] [Layer 2] Attempt $clarify_attempt failed" >&2
2555
+ done
2556
+
2557
+ if [[ "$clarify_status" != "success-layer2" ]]; then
2558
+ if [[ "$_l2_exit_reason" == "operational" ]]; then
2559
+ echo "[Clarify] [Layer 2] Escalating due to repeated operational failures" >&2
2560
+ else
2561
+ echo "[Clarify] [Layer 2] Exhausted ($clarify_max_retries retries)" >&2
2562
+ fi
2563
+
2564
+ # Clear stale feedback before Layer 3
2565
+ clarify_retry_feedback=""
2566
+
2567
+ # ── Layer 3: Alternate Prompt Strategy ──────────────────────────
2568
+ echo "[Clarify] [Layer 3] Alternate prompt strategy (max $clarify_max_retries retries)" >&2
2569
+
2570
+ local _l3_op_failures=0
2571
+ local _l3_exit_reason="exhausted"
2572
+ for (( clarify_attempt=1; clarify_attempt<=clarify_max_retries + 1; clarify_attempt++ )); do
2573
+ echo "[Clarify] [Layer 3] Attempt $clarify_attempt/$((clarify_max_retries + 1))" >&2
2574
+
2575
+ local alt_rc=0
2576
+ local alt_result=""
2577
+ alt_result=$(_run_clarify_alternate_strategy "$spec_file" "$original_spec_content" "$section_headings" "$requirement_count") || alt_rc=$?
2578
+
2579
+ if [[ "$alt_rc" -eq 2 ]]; then
2580
+ _l3_op_failures=$((_l3_op_failures + 1))
2581
+ echo "[Clarify] [Layer 3] Operational failure ($_l3_op_failures) — not counting as retry" >&2
2582
+ if [[ "$_l3_op_failures" -ge 3 ]]; then
2583
+ echo "[Clarify] [Layer 3] Too many operational failures — escalating" >&2
2584
+ _l3_exit_reason="operational"
2585
+ break
2586
+ fi
2587
+ clarify_attempt=$((clarify_attempt - 1)) # Don't consume retry budget
2588
+ continue
2589
+ fi
2590
+
2591
+ # Non-operational outcome — reset consecutive operational failure counter
2592
+ _l3_op_failures=0
2593
+
2594
+ if [[ "$alt_rc" -eq 0 && -n "$alt_result" ]]; then
2595
+ alt_result=$(ensure_heading_start "$alt_result" "# Spec: $ISSUE_TITLE")
2596
+ if safe_write_with_validation "$spec_file" "$alt_result" --type spec; then
2597
+ clarify_status="success-layer3"
2598
+ clarify_layer_used="layer3"
2599
+ echo "[Clarify] [Layer 3] ✓ Alternate strategy succeeded after attempt $clarify_attempt" >&2
2600
+ break
2601
+ fi
2602
+ # safe_write_with_validation failed after _run_clarify_alternate_strategy
2603
+ # already validated the content — this is an I/O/persistence error, not
2604
+ # a validation failure. Fail fast rather than consuming retry budget.
2605
+ echo "Error: [Clarify] [Layer 3] Persistence failure writing validated content to $spec_file. Original spec.md preserved." >&2
2606
+ return 1
2607
+ fi
2608
+
2609
+ echo "[Clarify] [Layer 3] Attempt $clarify_attempt failed" >&2
2610
+ done
2611
+
2612
+ if [[ "$clarify_status" != "success-layer3" ]]; then
2613
+ if [[ "$_l3_exit_reason" == "operational" ]]; then
2614
+ echo "[Clarify] [Layer 3] Escalating due to repeated operational failures" >&2
2615
+ else
2616
+ echo "[Clarify] [Layer 3] Exhausted ($clarify_max_retries retries)" >&2
2617
+ fi
2618
+
2619
+ # ── Layer 4: Graceful Degradation ───────────────────────────
2620
+ echo "[Clarify] [Layer 4] Graceful degradation — preserving original spec.md" >&2
2621
+ echo "[Clarify] WARNING-FALLBACK: All remediation layers exhausted. Original spec.md preserved." >&2
2622
+ clarify_status="warning-fallback"
2623
+ clarify_layer_used="layer4"
2624
+ fi
2625
+ fi
2626
+ fi
2627
+
2628
+ # Write clarify_status and clarify_layer_used to GITHUB_OUTPUT
2629
+ echo "clarify_status=$clarify_status" >> "${GITHUB_OUTPUT:-/dev/stdout}"
2630
+ echo "clarify_layer_used=$clarify_layer_used" >> "${GITHUB_OUTPUT:-/dev/stdout}"
2631
+
2632
+ # If graceful degradation, return 0 without modifying the spec
2633
+ if [[ "$clarify_status" == "warning-fallback" ]]; then
2634
+ return 0
2635
+ fi
2636
+
2637
+ # --- Post-write: append model footer only after successful validation ---
2638
+ append_model_footer "$spec_file"
2639
+
2640
+ # --- Post-write: ensure ## Clarifications section exists (FR-005) ---
2641
+ if ! grep -q '^## Clarifications' "$spec_file"; then
2642
+ echo "Warning: LLM output missing ## Clarifications section. Appending minimal entry." >&2
2643
+ # Insert before the model footer using the same safe write path to avoid
2644
+ # destructive overwrites of the validated spec.
2645
+ local content updated_content
2646
+ content=$(strip_model_footer "$(cat "$spec_file")")
2647
+ updated_content=$(printf '%s\n\n## Clarifications\n\n### Session %s\n\n- Autonomous clarification pass completed. See inline updates for details.\n' "$content" "$today")
2648
+ if ! safe_write_with_validation "$spec_file" "$updated_content" --type spec; then
2649
+ echo "Error: Failed to safely append missing ## Clarifications section. Original spec.md preserved." >&2
2650
+ return 1
2651
+ fi
2652
+ append_model_footer "$spec_file"
2653
+ fi
2654
+
2655
+ # --- Post-write: warn about remaining [NEEDS CLARIFICATION] markers ---
2656
+ local remaining_markers
2657
+ remaining_markers=$(grep -c '\[NEEDS CLARIFICATION\]' "$spec_file" 2>/dev/null || echo "0")
2658
+ if [[ "$remaining_markers" -gt 0 ]]; then
2659
+ echo "Warning: $remaining_markers [NEEDS CLARIFICATION] marker(s) remain in spec.md after clarification." >&2
2660
+ fi
2661
+ }
2662
+
2663
+ # ---------------------------------------------------------------------------
2664
+ # run_checklist_phase
2665
+ #
2666
+ # Generates an LLM-based specification quality checklist tailored to the
2667
+ # actual spec content. Writes to checklists/requirements.md.
2668
+ # ---------------------------------------------------------------------------
2669
+ run_checklist_phase() {
2670
+ local spec_content
2671
+ spec_content=$(strip_model_footer "$(cat "$SPEC_DIR/spec.md")")
2672
+
2673
+ local checklist_file="$SPEC_DIR/checklists/requirements.md"
2674
+ local existing_checklist=false
2675
+
2676
+ # --- Conditional pre-flight: only apply backup/validation if file exists ---
2677
+ if [[ -f "$checklist_file" ]] && [[ -s "$checklist_file" ]]; then
2678
+ existing_checklist=true
2679
+ fi
2680
+
2681
+ local checklist_preservation_rules=""
2682
+ if [[ "$existing_checklist" == "true" ]]; then
2683
+ local existing_content
2684
+ existing_content=$(strip_model_footer "$(cat "$checklist_file")")
2685
+ local existing_item_count
2686
+ existing_item_count=$(count_checklist_items "$checklist_file")
2687
+ local existing_headings
2688
+ existing_headings=$(extract_section_headings "$checklist_file")
2689
+
2690
+ checklist_preservation_rules="
2691
+ CRITICAL PRESERVATION RULES:
2692
+ - An existing checklist already exists with $existing_item_count checklist items
2693
+ - You MUST preserve ALL existing checklist items (- [ ] and - [x] and - [X] items)
2694
+ - You MUST preserve ALL existing section headings
2695
+ - You MAY add new checklist items, but you MUST NOT remove or omit any existing ones
2696
+ - Every section heading from the existing checklist MUST appear in your output
2697
+
2698
+ EXISTING CHECKLIST CROSS-REFERENCE:
2699
+ Section headings to preserve:
2700
+ $existing_headings
2701
+ Existing checklist item count: $existing_item_count (ALL must be retained)
2702
+
2703
+ EXISTING CHECKLIST CONTENT:
2704
+ $existing_content
2705
+ "
2706
+ fi
2707
+
2708
+ local prompt
2709
+ prompt="Generate a specification quality checklist for the following feature specification.
2710
+ $checklist_preservation_rules
2711
+ The checklist must follow this structure:
2712
+
2713
+ # Specification Quality Checklist: [Feature Name from the spec]
2714
+
2715
+ **Purpose**: Validate specification completeness before proceeding to planning
2716
+ **Created**: $(date +%Y-%m-%d)
2717
+ **Feature**: [spec.md](../spec.md)
2718
+ **Source Issue**: #$ISSUE_NUMBER
2719
+
2720
+ ## Content Quality
2721
+ - [ ] CHK001 [Specific check derived from the spec content about user value focus]
2722
+ - [ ] CHK002 [Specific check about user story format]
2723
+ - [ ] CHK003 [Specific check about priority assignment]
2724
+ - [ ] CHK004 [Specific check about no implementation details in requirements]
2725
+
2726
+ ## Requirement Completeness
2727
+ - [ ] CHK005 [Specific check about testability of user stories]
2728
+ - [ ] CHK006 [Specific check about edge case documentation]
2729
+ - [ ] CHK007 [Specific check about acceptance scenario format]
2730
+ - [ ] CHK008 [Specific check about measurable success criteria]
2731
+ - [ ] CHK009 [Specific check about scope boundaries]
2732
+ - [ ] CHK010 [Specific check about dependencies and assumptions]
2733
+
2734
+ ## Feature Readiness
2735
+ - [ ] CHK011 [Specific check about functional requirements having acceptance criteria]
2736
+ - [ ] CHK012 [Specific check about user scenario coverage]
2737
+ - [ ] CHK013 [Specific check about measurable outcomes in success criteria]
2738
+ - [ ] CHK014 [Specific check about no implementation details leaking into spec]
2739
+
2740
+ ## Notes
2741
+ - This checklist was generated from the specification content for issue #$ISSUE_NUMBER
2742
+ - Items marked incomplete require spec updates before proceeding to planning
2743
+
2744
+ Make each checklist item SPECIFIC to the actual content of this specification — reference specific user stories, requirements, or sections by name where appropriate. Do NOT use generic placeholder text.
2745
+
2746
+ Output ONLY the markdown checklist, no commentary, no code fences.
2747
+
2748
+ ## Specification Content
2749
+ $spec_content
2750
+
2751
+ CRITICAL: Your output MUST begin with a markdown heading on the very first line.
2752
+ WRONG: \"Spec created at specs/...\"
2753
+ WRONG: \"Here is the updated specification...\"
2754
+ WRONG: \"Certainly! Here is...\"
2755
+ CORRECT: \"# Specification Quality Checklist: Feature Name\"
2756
+ Do NOT include any conversational preamble before the heading."
2757
+
2758
+ local result
2759
+ result=$(call_llm "$prompt") || return 1
2760
+ if [[ -z "$result" ]]; then
2761
+ echo "Error: Checklist phase returned empty content" >&2
2762
+ return 1
2763
+ fi
2764
+ result=$(strip_llm_preamble "$result" "# ")
2765
+ if [[ -z "${result//[[:space:]]/}" ]]; then
2766
+ echo "Error: Checklist phase returned blank content after preamble stripping" >&2
2767
+ return 1
2768
+ fi
2769
+ result=$(ensure_heading_start "$result" "# Specification Quality Checklist")
2770
+
2771
+ if [[ "$existing_checklist" == "true" ]]; then
2772
+ # --- Safe write with validation for existing checklist ---
2773
+ if ! safe_write_with_validation "$checklist_file" "$result" --type checklist; then
2774
+ echo "Error: Checklist phase output failed structural validation. Original checklist preserved." >&2
2775
+ return 1
2776
+ fi
2777
+ else
2778
+ # --- First-time creation: no baseline to compare, but still write safely ---
2779
+ local tmp_checklist_file="${checklist_file}.tmp"
2780
+ rm -f "$tmp_checklist_file"
2781
+ if ! printf '%s\n' "$result" > "$tmp_checklist_file"; then
2782
+ echo "Error: Failed to write initial checklist to temporary file: $tmp_checklist_file" >&2
2783
+ rm -f "$tmp_checklist_file"
2784
+ return 1
2785
+ fi
2786
+ if ! mv "$tmp_checklist_file" "$checklist_file"; then
2787
+ echo "Error: Failed to move initial checklist into place: $checklist_file" >&2
2788
+ rm -f "$tmp_checklist_file"
2789
+ return 1
2790
+ fi
2791
+ fi
2792
+
2793
+ append_model_footer "$checklist_file"
2794
+ }
2795
+
2796
+ # ---------------------------------------------------------------------------
2797
+ # _derive_plan_artifact_heading <filename>
2798
+ #
2799
+ # Maps a plan-phase artifact filename to an appropriate default heading.
2800
+ # Prints the heading to stdout.
2801
+ # ---------------------------------------------------------------------------
2802
+ _derive_plan_artifact_heading() {
2803
+ local file="$1"
2804
+ case "$file" in
2805
+ plan.md) echo "# Implementation Plan" ;;
2806
+ research.md) echo "# Technical Research" ;;
2807
+ data-model.md) echo "# Data Model" ;;
2808
+ quickstart.md) echo "# Quick Start Guide" ;;
2809
+ contracts/*.md) echo "# API Contract: $(basename "$file" .md)" ;;
2810
+ *) echo "# $(basename "$file" .md)" ;;
2811
+ esac
2812
+ }
2813
+
2814
+ # ---------------------------------------------------------------------------
2815
+ # run_plan_phase
2816
+ #
2817
+ # Generates plan.md and optional artifacts (research.md, data-model.md,
2818
+ # contracts/*, quickstart.md) using artifact delimiters.
2819
+ #
2820
+ # Context budget enforcement: before calling the LLM, the spec content is
2821
+ # passed through the Python budget module to ensure it fits within the
2822
+ # configured context budget (default: 32,000 chars, override via
2823
+ # AGDT_PLAN_CONTEXT_BUDGET). If the content is too large, deterministic
2824
+ # reduction stages are applied (strip markdown → remove images → collapse
2825
+ # whitespace → hard truncate → summary-only).
2826
+ # ---------------------------------------------------------------------------
2827
+ run_plan_phase() {
2828
+ local spec_content
2829
+ spec_content=$(strip_model_footer "$(cat "$SPEC_DIR/spec.md")")
2830
+
2831
+ # --- Context budget enforcement ---
2832
+ local budget_args=()
2833
+ local budget_value="${AGDT_PLAN_CONTEXT_BUDGET:-}"
2834
+ if [[ -n "$budget_value" ]]; then
2835
+ # Validate that the value is a positive integer (strip leading zeros to avoid octal)
2836
+ if [[ "$budget_value" =~ ^[0-9]+$ ]] && (( 10#$budget_value > 0 )); then
2837
+ budget_args+=(--budget "$budget_value")
2838
+ else
2839
+ echo "Warning: AGDT_PLAN_CONTEXT_BUDGET='$budget_value' is not a valid positive integer. Using default." >&2
2840
+ fi
2841
+ fi
2842
+
2843
+ local budget_stderr_file
2844
+ budget_stderr_file=$(mktemp /tmp/budget_stderr.XXXXXX) || {
2845
+ echo "Error: Failed to create temp file for budget stderr capture." >&2
2846
+ return 1
2847
+ }
2848
+ local budget_content=""
2849
+ local budget_exit_code=0
2850
+ budget_content=$(printf '%s' "$spec_content" | python "$SCRIPT_DIR/enforce_budget.py" "${budget_args[@]}" 2>"$budget_stderr_file") || budget_exit_code=$?
2851
+ local budget_stderr=""
2852
+ budget_stderr=$(cat "$budget_stderr_file" 2>/dev/null || echo "")
2853
+ rm -f "$budget_stderr_file"
2854
+
2855
+ if [[ $budget_exit_code -ne 0 ]]; then
2856
+ echo "Error: Context budget enforcement failed for plan phase." >&2
2857
+ if [[ -n "$budget_stderr" ]]; then
2858
+ echo "$budget_stderr" >&2
2859
+ fi
2860
+ return 1
2861
+ fi
2862
+
2863
+ # Emit budget diagnostics
2864
+ if [[ -n "$budget_stderr" ]]; then
2865
+ echo "$budget_stderr" >&2
2866
+ fi
2867
+
2868
+ # Use budget-compliant content for the prompt
2869
+ spec_content="$budget_content"
2870
+
2871
+ local prompt
2872
+ prompt="You are a technical implementation planner. Based on the following feature specification, produce a comprehensive implementation plan.
2873
+
2874
+ Your output must contain multiple artifacts separated by delimiter lines. Use EXACTLY this delimiter format on its own line:
2875
+ ===ARTIFACT:<filename>===
2876
+
2877
+ You MUST produce at least:
2878
+ - plan.md — the main implementation plan
2879
+
2880
+ You SHOULD also produce these artifacts when relevant:
2881
+ - research.md — technical research and decisions (produce this if there are unknowns, technology choices, or best practices to evaluate)
2882
+ - data-model.md — data entity definitions (produce this if the feature involves data entities, state, or persistence)
2883
+ - quickstart.md — quick-start guide for developers picking up this feature
2884
+
2885
+ You MAY produce contract files if the feature involves API endpoints:
2886
+ - contracts/<name>.md — API contract definitions (one per major API area)
2887
+
2888
+ ## Plan Structure (plan.md)
2889
+ Follow this structure:
2890
+ 1. **Technical Context** — technology stack, key dependencies, architecture decisions
2891
+ 2. **Research Summary** — reference research.md if produced; list key decisions made
2892
+ 3. **Design Overview** — high-level architecture for this feature
2893
+ 4. **Implementation Phases** — ordered phases with clear deliverables
2894
+ 5. **Risk Assessment** — potential risks and mitigations
2895
+ 6. **Dependencies** — external and internal dependencies
2896
+
2897
+ ## Research Structure (research.md)
2898
+ For each topic researched:
2899
+ - **Decision**: [choice made]
2900
+ - **Rationale**: [why chosen]
2901
+ - **Alternatives considered**: [what else was evaluated]
2902
+
2903
+ ## Data Model Structure (data-model.md)
2904
+ For each entity:
2905
+ - Entity name, fields, types, validation rules
2906
+ - Relationships between entities
2907
+ - State transitions (if applicable)
2908
+
2909
+ ## Output Format
2910
+ Start each artifact with its delimiter line. Example:
2911
+ ===ARTIFACT:plan.md===
2912
+ (plan content here)
2913
+ ===ARTIFACT:research.md===
2914
+ (research content here)
2915
+
2916
+ Output ONLY the artifact content with delimiters. No commentary outside artifacts, no code fences around the entire output.
2917
+
2918
+ ## Markdown Formatting Rules
2919
+ - ALWAYS include a language identifier on fenced code blocks (e.g., \`\`\`python, \`\`\`bash, \`\`\`text). NEVER use bare \`\`\` without a language.
2920
+ - In markdown tables, ensure EVERY row has the SAME number of columns as the header row. Pad with empty cells if needed.
2921
+ - Keep lines under 200 characters where possible; break at natural points (after punctuation, between clauses).
2922
+
2923
+ ## Feature Specification
2924
+ $spec_content
2925
+
2926
+ CRITICAL: Each artifact MUST begin with a markdown heading on the very first line after its delimiter.
2927
+ WRONG: \"Here is the plan...\"
2928
+ WRONG: \"Certainly! Here is...\"
2929
+ CORRECT: \"# Implementation Plan\"
2930
+ Do NOT include any conversational preamble before the heading in any artifact."
2931
+
2932
+ local response
2933
+ response=$(call_llm "$prompt") || return 1
2934
+
2935
+ # Parse artifacts from delimiter-separated response
2936
+ local current_file=""
2937
+ local current_content=""
2938
+
2939
+ while IFS= read -r line; do
2940
+ if [[ "$line" =~ ^===ARTIFACT:(.+)===$ ]]; then
2941
+ # Write previous artifact if any
2942
+ if [[ -n "$current_file" && -n "$current_content" ]]; then
2943
+ local _plan_heading
2944
+ _plan_heading=$(_derive_plan_artifact_heading "$current_file")
2945
+ current_content=$(strip_llm_preamble "$current_content" "# ")
2946
+ if [[ -z "${current_content//[[:space:]]/}" ]]; then
2947
+ echo "[Sanitize] ⚠ Plan artifact '$current_file' is blank after preamble stripping — skipping" >&2
2948
+ else
2949
+ current_content=$(ensure_heading_start "$current_content" "$_plan_heading")
2950
+ # Ensure parent directory exists (for contracts/ subdirectory)
2951
+ mkdir -p "$SPEC_DIR/$(dirname "$current_file")"
2952
+ printf '%s\n' "$current_content" > "$SPEC_DIR/$current_file"
2953
+ append_model_footer "$SPEC_DIR/$current_file"
2954
+ echo " → Wrote $current_file"
2955
+ fi
2956
+ fi
2957
+ # Trim leading/trailing whitespace from captured filename
2958
+ current_file="${BASH_REMATCH[1]}"
2959
+ current_file="${current_file#"${current_file%%[![:space:]]*}"}"
2960
+ current_file="${current_file%"${current_file##*[![:space:]]}"}"
2961
+ # Validate filename: reject path traversal, absolute paths,
2962
+ # trailing slashes (directory paths), and characters outside
2963
+ # the expected alphanumeric + ._-/ set
2964
+ if [[ "$current_file" == /* || "$current_file" == *..* || -z "$current_file" ]]; then
2965
+ echo "Warning: Skipping invalid artifact filename: $current_file" >&2
2966
+ current_file=""
2967
+ elif [[ "$current_file" == */ ]]; then
2968
+ echo "Warning: Skipping directory-path artifact filename: $current_file" >&2
2969
+ current_file=""
2970
+ elif [[ ! "$current_file" =~ ^[A-Za-z0-9._/-]+$ ]]; then
2971
+ echo "Warning: Skipping artifact filename with invalid characters: $current_file" >&2
2972
+ current_file=""
2973
+ elif [[ -d "$SPEC_DIR/$current_file" ]]; then
2974
+ echo "Warning: Skipping artifact filename that collides with existing directory: $current_file" >&2
2975
+ current_file=""
2976
+ fi
2977
+ current_content=""
2978
+ else
2979
+ if [[ -n "$current_file" ]]; then
2980
+ if [[ -n "$current_content" ]]; then
2981
+ current_content="$current_content
2982
+ $line"
2983
+ else
2984
+ current_content="$line"
2985
+ fi
2986
+ fi
2987
+ fi
2988
+ done <<< "$response"
2989
+
2990
+ # Write the last artifact
2991
+ if [[ -n "$current_file" && -n "$current_content" ]]; then
2992
+ local _plan_heading_last
2993
+ _plan_heading_last=$(_derive_plan_artifact_heading "$current_file")
2994
+ current_content=$(strip_llm_preamble "$current_content" "# ")
2995
+ if [[ -z "${current_content//[[:space:]]/}" ]]; then
2996
+ echo "[Sanitize] ⚠ Plan artifact '$current_file' is blank after preamble stripping — skipping" >&2
2997
+ else
2998
+ current_content=$(ensure_heading_start "$current_content" "$_plan_heading_last")
2999
+ mkdir -p "$SPEC_DIR/$(dirname "$current_file")"
3000
+ printf '%s\n' "$current_content" > "$SPEC_DIR/$current_file"
3001
+ append_model_footer "$SPEC_DIR/$current_file"
3002
+ echo " → Wrote $current_file"
3003
+ fi
3004
+ fi
3005
+
3006
+ # Verify plan.md was produced and is non-empty (required artifact)
3007
+ if [[ ! -s "$SPEC_DIR/plan.md" ]]; then
3008
+ echo "Error: Plan phase did not produce a non-empty plan.md" >&2
3009
+ return 1
3010
+ fi
3011
+ }
3012
+
3013
+ # ---------------------------------------------------------------------------
3014
+ # run_tasks_phase
3015
+ #
3016
+ # Generates tasks.md from spec.md, plan.md, and any supporting artifacts.
3017
+ # ---------------------------------------------------------------------------
3018
+ run_tasks_phase() {
3019
+ local spec_content plan_content
3020
+ spec_content=$(strip_model_footer "$(cat "$SPEC_DIR/spec.md")")
3021
+ plan_content=$(strip_model_footer "$(cat "$SPEC_DIR/plan.md")")
3022
+
3023
+ # Include optional supporting artifacts if they exist
3024
+ local extra_context=""
3025
+ if [[ -f "$SPEC_DIR/research.md" ]]; then
3026
+ extra_context="$extra_context
3027
+
3028
+ ## Research Context
3029
+ $(strip_model_footer "$(cat "$SPEC_DIR/research.md")")"
3030
+ fi
3031
+ if [[ -f "$SPEC_DIR/data-model.md" ]]; then
3032
+ extra_context="$extra_context
3033
+
3034
+ ## Data Model Context
3035
+ $(strip_model_footer "$(cat "$SPEC_DIR/data-model.md")")"
3036
+ fi
3037
+ # Include API contracts so tasks can reference endpoints
3038
+ local contract_file
3039
+ if [[ -d "$SPEC_DIR/contracts" ]]; then
3040
+ for contract_file in "$SPEC_DIR"/contracts/*.md; do
3041
+ [[ -f "$contract_file" ]] || continue
3042
+ extra_context="$extra_context
3043
+
3044
+ ## API Contract: $(basename -- "$contract_file")
3045
+ $(strip_model_footer "$(cat "$contract_file")")"
3046
+ done
3047
+ fi
3048
+ if [[ -f "$SPEC_DIR/quickstart.md" ]]; then
3049
+ extra_context="$extra_context
3050
+
3051
+ ## Quickstart Context
3052
+ $(strip_model_footer "$(cat "$SPEC_DIR/quickstart.md")")"
3053
+ fi
3054
+
3055
+ local prompt
3056
+ prompt="You are a task breakdown specialist. Based on the following specification and implementation plan, generate a comprehensive task list.
3057
+
3058
+ ## Task Format Rules
3059
+ Each task must follow this EXACT format:
3060
+ \`\`\`
3061
+ - [ ] [TaskID] [P?] [Story?] Description with file path
3062
+ \`\`\`
3063
+ Where:
3064
+ - **Task ID**: Sequential (T001, T002, ...) in execution order
3065
+ - **[P] marker**: Include ONLY if the task is parallelizable (works on different files, no blocking dependencies)
3066
+ - **[Story] label**: [US1], [US2], etc. mapping to spec user stories. Setup/Foundational tasks have NO story label. User story tasks MUST have a story label.
3067
+ - **Description**: Clear action with exact file path where applicable
3068
+
3069
+ ## Phase Structure
3070
+ Organize tasks into these phases:
3071
+ 1. **Phase 1: Setup** — Project initialization, scaffolding (no story labels)
3072
+ 2. **Phase 2: Foundational** — Blocking prerequisites that must complete before user stories (no story labels)
3073
+ 3. **Phase 3+: User Stories** — One phase per user story in priority order (P1, P2, P3...)
3074
+ - Within each story: Tests → Models → Services → Endpoints → Integration
3075
+ 4. **Final Phase: Polish & Cross-Cutting** — Documentation, cleanup, integration tests (no story labels)
3076
+
3077
+ ## Rules
3078
+ - Map each task to the user story it serves
3079
+ - Mark dependencies between tasks
3080
+ - Tasks from API contracts → map to the user story the endpoint serves
3081
+ - Tasks from data model → map to the story(ies) that need the entity
3082
+ - Shared infrastructure → Setup or Foundational phase
3083
+
3084
+ Output ONLY the tasks.md content in markdown format. No commentary, no code fences around the entire output.
3085
+
3086
+ ## Markdown Formatting Rules
3087
+ - ALWAYS include a language identifier on fenced code blocks (e.g., \`\`\`bash, \`\`\`python, \`\`\`text). NEVER use bare \`\`\` without a language.
3088
+ - In markdown tables, ensure EVERY row has the SAME number of columns as the header row.
3089
+ - Keep lines under 200 characters where possible.
3090
+
3091
+ ## Feature Specification
3092
+ $spec_content
3093
+
3094
+ ## Implementation Plan
3095
+ $plan_content
3096
+ $extra_context
3097
+
3098
+ CRITICAL: Your output MUST begin with a markdown heading on the very first line.
3099
+ WRONG: \"Here are the tasks...\"
3100
+ WRONG: \"Certainly! Here is...\"
3101
+ CORRECT: \"# Tasks: Feature Name\"
3102
+ Do NOT include any conversational preamble before the heading."
3103
+
3104
+ # Append FR retry feedback if set by run_fr_validation_with_retry
3105
+ if [[ -n "${SPECKIT_FR_RETRY_FEEDBACK:-}" ]]; then
3106
+ prompt="$prompt
3107
+
3108
+ ## IMPORTANT: FR Coverage Feedback (Retry)
3109
+
3110
+ $SPECKIT_FR_RETRY_FEEDBACK
3111
+
3112
+ You MUST ensure that every FR identifier listed above appears at least once in the task descriptions."
3113
+ # Clear feedback after use so it doesn't persist across retries
3114
+ unset SPECKIT_FR_RETRY_FEEDBACK
3115
+ fi
3116
+
3117
+ # Append CRITICAL gate feedback if set by _run_critical_gate_remediation
3118
+ if [[ -n "${SPECKIT_CRITICAL_GATE_FEEDBACK:-}" ]]; then
3119
+ prompt="$prompt
3120
+
3121
+ ## IMPORTANT: CRITICAL Analysis Gate Feedback (Remediation)
3122
+
3123
+ $SPECKIT_CRITICAL_GATE_FEEDBACK
3124
+
3125
+ You MUST address ALL findings listed above. Failure to do so will cause the CRITICAL analysis gate to fail; in block mode the pipeline will abort."
3126
+ # Clear feedback after use so it doesn't persist across retries
3127
+ unset SPECKIT_CRITICAL_GATE_FEEDBACK
3128
+ fi
3129
+
3130
+ local result
3131
+ result=$(call_llm "$prompt") || return 1
3132
+ if [[ -z "$result" ]]; then
3133
+ echo "Error: Tasks phase returned empty content" >&2
3134
+ return 1
3135
+ fi
3136
+ result=$(strip_llm_preamble "$result" "# ")
3137
+ if [[ -z "${result//[[:space:]]/}" ]]; then
3138
+ echo "Error: Tasks phase returned blank content after sanitization" >&2
3139
+ return 1
3140
+ fi
3141
+ result=$(ensure_heading_start "$result" "# Task List")
3142
+ printf '%s\n' "$result" > "$SPEC_DIR/tasks.md"
3143
+ append_model_footer "$SPEC_DIR/tasks.md"
3144
+ }
3145
+
3146
+ # ---------------------------------------------------------------------------
3147
+ # Resolve FR validation retry budget (single source of truth)
3148
+ # Precedence: --max-retries CLI arg > SPECKIT_VALIDATE_MAX_RETRIES env > default 2
3149
+ # ---------------------------------------------------------------------------
3150
+ if [[ -n "$MAX_RETRIES" ]]; then
3151
+ FR_VALIDATION_MAX_RETRIES="$MAX_RETRIES"
3152
+ elif [[ -n "${SPECKIT_VALIDATE_MAX_RETRIES:-}" ]]; then
3153
+ if [[ "$SPECKIT_VALIDATE_MAX_RETRIES" =~ ^[0-9]+$ ]]; then
3154
+ FR_VALIDATION_MAX_RETRIES="$SPECKIT_VALIDATE_MAX_RETRIES"
3155
+ else
3156
+ echo "Warning: ignoring invalid SPECKIT_VALIDATE_MAX_RETRIES='$SPECKIT_VALIDATE_MAX_RETRIES'; using default 2" >&2
3157
+ FR_VALIDATION_MAX_RETRIES=2
3158
+ fi
3159
+ else
3160
+ FR_VALIDATION_MAX_RETRIES=2
3161
+ fi
3162
+
3163
+ # ---------------------------------------------------------------------------
3164
+ # Resolve clarify phase retry budget (independent of FR validation)
3165
+ # Precedence: SPECKIT_CLARIFY_MAX_RETRIES env > default 2
3166
+ # ---------------------------------------------------------------------------
3167
+ if [[ -n "${SPECKIT_CLARIFY_MAX_RETRIES:-}" ]]; then
3168
+ if [[ "$SPECKIT_CLARIFY_MAX_RETRIES" =~ ^[0-9]+$ ]]; then
3169
+ CLARIFY_MAX_RETRIES="$SPECKIT_CLARIFY_MAX_RETRIES"
3170
+ else
3171
+ echo "Warning: ignoring invalid SPECKIT_CLARIFY_MAX_RETRIES='$SPECKIT_CLARIFY_MAX_RETRIES'; using default 2" >&2
3172
+ CLARIFY_MAX_RETRIES=2
3173
+ fi
3174
+ else
3175
+ CLARIFY_MAX_RETRIES=2
3176
+ fi
3177
+
3178
+ # ---------------------------------------------------------------------------
3179
+ # run_fr_validation
3180
+ #
3181
+ # Calls the Python FR coverage validator and captures JSON output to
3182
+ # $SPEC_DIR/fr-coverage.json. Stderr is captured to a temp file and
3183
+ # cleaned up on exit. Returns the validator exit code:
3184
+ # 0 = all FRs covered (or no FRs found — warning)
3185
+ # 1 = uncovered FRs detected
3186
+ # 2 = operational error
3187
+ # ---------------------------------------------------------------------------
3188
+ run_fr_validation() {
3189
+ echo ""
3190
+ echo "=== FR Coverage Validation ==="
3191
+ local fr_rc=0
3192
+ local fr_stderr_log
3193
+ fr_stderr_log=$(mktemp)
3194
+ agdt-speckit-validate-frs \
3195
+ --spec-file "$SPEC_DIR/spec.md" \
3196
+ --tasks-file "$SPEC_DIR/tasks.md" \
3197
+ --json \
3198
+ --max-retries "$FR_VALIDATION_MAX_RETRIES" \
3199
+ > "$SPEC_DIR/fr-coverage.json" \
3200
+ 2> "$fr_stderr_log" || fr_rc=$?
3201
+
3202
+ if [[ "$fr_rc" -eq 0 ]]; then
3203
+ echo "✓ FR coverage validation passed"
3204
+ rm -f "$fr_stderr_log"
3205
+ elif [[ "$fr_rc" -eq 1 ]]; then
3206
+ echo "✗ FR coverage validation failed — uncovered FRs detected" >&2
3207
+ cat "$SPEC_DIR/fr-coverage.json" >&2
3208
+ rm -f "$fr_stderr_log"
3209
+ elif [[ "$fr_rc" -eq 2 ]]; then
3210
+ echo "Error: FR coverage validation encountered an operational error" >&2
3211
+ if [[ -s "$fr_stderr_log" ]]; then
3212
+ echo "Validator stderr:" >&2
3213
+ cat "$fr_stderr_log" >&2
3214
+ fi
3215
+ rm -f "$fr_stderr_log"
3216
+ else
3217
+ echo "Error: FR coverage validator returned unexpected exit code: $fr_rc" >&2
3218
+ if [[ -s "$fr_stderr_log" ]]; then
3219
+ echo "Validator stderr:" >&2
3220
+ cat "$fr_stderr_log" >&2
3221
+ fi
3222
+ rm -f "$fr_stderr_log"
3223
+ fi
3224
+ return "$fr_rc"
3225
+ }
3226
+
3227
+ # ---------------------------------------------------------------------------
3228
+ # run_test_coverage_validation
3229
+ #
3230
+ # Calls the Python E.2 test coverage validator and captures JSON output to
3231
+ # $SPEC_DIR/test-coverage.json. Always returns 0 (non-blocking):
3232
+ # Validator exit 0 = all FRs have test tasks (no findings) → file written
3233
+ # Validator exit 1 = findings present (flows into analyze phase) → file written
3234
+ # Validator exit 2 = operational error → file removed to avoid downstream parse failures
3235
+ # ---------------------------------------------------------------------------
3236
+ run_test_coverage_validation() {
3237
+ echo ""
3238
+ echo "=== E.2 Test Coverage Validation ==="
3239
+ local tc_rc=0
3240
+ local tc_stderr_log
3241
+ local tc_tmp_output
3242
+ tc_stderr_log=$(mktemp)
3243
+ tc_tmp_output=$(mktemp)
3244
+ agdt-speckit-test-coverage \
3245
+ --spec-file "$SPEC_DIR/spec.md" \
3246
+ --tasks-file "$SPEC_DIR/tasks.md" \
3247
+ --json \
3248
+ > "$tc_tmp_output" \
3249
+ 2> "$tc_stderr_log" || tc_rc=$?
3250
+
3251
+ if [[ "$tc_rc" -eq 0 ]]; then
3252
+ mv "$tc_tmp_output" "$SPEC_DIR/test-coverage.json"
3253
+ echo "✓ Test coverage validation passed — all FRs have test tasks"
3254
+ rm -f "$tc_stderr_log"
3255
+ elif [[ "$tc_rc" -eq 1 ]]; then
3256
+ mv "$tc_tmp_output" "$SPEC_DIR/test-coverage.json"
3257
+ echo "⚠ Test coverage findings detected (non-blocking)" >&2
3258
+ rm -f "$tc_stderr_log"
3259
+ elif [[ "$tc_rc" -eq 2 ]]; then
3260
+ echo "Error: Test coverage validation encountered an operational error" >&2
3261
+ if [[ -s "$tc_stderr_log" ]]; then
3262
+ echo "Validator stderr:" >&2
3263
+ cat "$tc_stderr_log" >&2
3264
+ fi
3265
+ rm -f "$tc_stderr_log" "$tc_tmp_output" "$SPEC_DIR/test-coverage.json"
3266
+ else
3267
+ echo "Error: Test coverage validator returned unexpected exit code: $tc_rc" >&2
3268
+ if [[ -s "$tc_stderr_log" ]]; then
3269
+ echo "Validator stderr:" >&2
3270
+ cat "$tc_stderr_log" >&2
3271
+ fi
3272
+ rm -f "$tc_stderr_log" "$tc_tmp_output" "$SPEC_DIR/test-coverage.json"
3273
+ fi
3274
+ # Non-blocking: always returns 0; findings flow into the analyze phase
3275
+ return 0
3276
+ }
3277
+
3278
+ # ---------------------------------------------------------------------------
3279
+ # run_fr_validation_with_retry
3280
+ #
3281
+ # Runs FR validation against the current tasks.md and retries only when
3282
+ # uncovered FRs are reported.
3283
+ # The initial run_tasks_phase happens before this function is called; on each
3284
+ # retry after a validation failure, this function extracts uncovered FRs from
3285
+ # JSON and re-invokes run_tasks_phase with an augmented prompt listing the
3286
+ # missing FRs, then validates again.
3287
+ # Uses FR_VALIDATION_MAX_RETRIES as the retry budget.
3288
+ # ---------------------------------------------------------------------------
3289
+ run_fr_validation_with_retry() {
3290
+ local attempt=0
3291
+ local fr_rc=0
3292
+
3293
+ while true; do
3294
+ fr_rc=0
3295
+ run_fr_validation || fr_rc=$?
3296
+
3297
+ if [[ "$fr_rc" -eq 0 ]]; then
3298
+ return 0
3299
+ elif [[ "$fr_rc" -ne 1 ]]; then
3300
+ echo "Error: FR validation encountered an operational error (exit code: $fr_rc)" >&2
3301
+ return 2
3302
+ fi
3303
+
3304
+ # fr_rc == 1: uncovered FRs
3305
+ attempt=$((attempt + 1))
3306
+ if [[ "$attempt" -gt "$FR_VALIDATION_MAX_RETRIES" ]]; then
3307
+ echo "Error: FR coverage validation failed after $FR_VALIDATION_MAX_RETRIES retry attempt(s)" >&2
3308
+ echo "Uncovered FRs remain:" >&2
3309
+ if [[ -f "$SPEC_DIR/fr-coverage.json" ]]; then
3310
+ python3 -c "
3311
+ import json, sys
3312
+ data = json.load(open(sys.argv[1]))
3313
+ for fr in data.get('uncovered', []):
3314
+ print(f' - {fr}', file=sys.stderr)
3315
+ " "$SPEC_DIR/fr-coverage.json" 1>&2 || true
3316
+ fi
3317
+ return 1
3318
+ fi
3319
+
3320
+ echo ""
3321
+ echo "=== FR Coverage Retry ($attempt/$FR_VALIDATION_MAX_RETRIES) ==="
3322
+
3323
+ # Extract uncovered FRs for the retry prompt
3324
+ local uncovered_list=""
3325
+ if [[ -f "$SPEC_DIR/fr-coverage.json" ]]; then
3326
+ uncovered_list=$(python3 -c "
3327
+ import json, sys
3328
+ data = json.load(open(sys.argv[1]))
3329
+ print(', '.join(data.get('uncovered', [])))
3330
+ " "$SPEC_DIR/fr-coverage.json" 2>/dev/null || echo "")
3331
+ fi
3332
+
3333
+ echo "Re-running tasks phase with feedback about uncovered FRs: $uncovered_list"
3334
+
3335
+ # Set retry context for the tasks phase
3336
+ export SPECKIT_FR_RETRY_FEEDBACK="The following functional requirements from spec.md are NOT covered by any task in tasks.md: $uncovered_list. Please regenerate tasks.md ensuring every FR has at least one corresponding task."
3337
+
3338
+ COPILOT_TIMEOUT=900 run_tasks_phase || {
3339
+ echo "Error: Tasks phase failed during FR coverage retry" >&2
3340
+ return 1
3341
+ }
3342
+ done
3343
+ }
3344
+
3345
+ # ---------------------------------------------------------------------------
3346
+ # run_analyze_phase
3347
+ #
3348
+ # Cross-artifact consistency analysis producing analysis-report.md.
3349
+ # ---------------------------------------------------------------------------
3350
+ run_analyze_phase() {
3351
+ local spec_content plan_content tasks_content
3352
+ spec_content=$(strip_model_footer "$(cat "$SPEC_DIR/spec.md")")
3353
+ plan_content=$(strip_model_footer "$(cat "$SPEC_DIR/plan.md")")
3354
+ tasks_content=$(strip_model_footer "$(cat "$SPEC_DIR/tasks.md")")
3355
+
3356
+ # Inject FR coverage data if available (produced by run_fr_validation)
3357
+ local fr_coverage_context=""
3358
+ if [[ -f "$SPEC_DIR/fr-coverage.json" ]]; then
3359
+ fr_coverage_context="
3360
+
3361
+ ## FR Coverage Data (Deterministic — Pre-Validated)
3362
+
3363
+ The following FR coverage data was produced by the deterministic FR validator
3364
+ (\`agdt-speckit-validate-frs\`). Report this data as-is in the Coverage Summary
3365
+ section. Do not re-evaluate FR coverage — use these results directly.
3366
+
3367
+ \`\`\`json
3368
+ $(cat "$SPEC_DIR/fr-coverage.json")
3369
+ \`\`\`
3370
+ "
3371
+ fi
3372
+
3373
+ # Inject test coverage data if available and non-empty (produced by run_test_coverage_validation)
3374
+ local test_coverage_context=""
3375
+ if [[ -s "$SPEC_DIR/test-coverage.json" ]]; then
3376
+ test_coverage_context="
3377
+
3378
+ ## E.2 Test Coverage Data (Deterministic — Pre-Validated)
3379
+
3380
+ The following test coverage data was produced by the deterministic E.2 validator
3381
+ (\`agdt-speckit-test-coverage\`). Report findings as-is in the E.2 Test Coverage
3382
+ section. Do not re-evaluate test coverage — use these results directly.
3383
+
3384
+ \`\`\`json
3385
+ $(cat "$SPEC_DIR/test-coverage.json")
3386
+ \`\`\`
3387
+ "
3388
+ fi
3389
+
3390
+ local prompt
3391
+ prompt="You are a specification quality analyst. Perform a cross-artifact consistency and quality analysis across the following specification, plan, and task list.
3392
+
3393
+ ## Detection Passes (run all seven, max 50 findings total)
3394
+
3395
+ | Pass | Focus |
3396
+ |------|-------|
3397
+ | **A. Duplication** | Near-duplicate requirements; mark lower-quality phrasing for consolidation |
3398
+ | **B. Ambiguity** | Vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria; unresolved placeholders (TODO, TKTK, ???) |
3399
+ | **C. Underspecification** | Requirements missing object/outcome; user stories missing acceptance criteria; tasks referencing undefined components |
3400
+ | **D. Constitution Alignment** | Missing mandated sections or quality gates |
3401
+ | **E. Coverage Gaps** | Requirements with zero tasks; tasks with no requirement mapping; non-functional requirements absent from tasks |
3402
+ | **F. Inconsistency** | Terminology drift; entities in plan but absent in spec; task ordering contradictions; conflicting requirements |
3403
+ | **G. Task Deduplication** | Duplicate, overlapping, or conflicting tasks in tasks.md (distinct from Category A which detects duplicate *requirements*) |
3404
+
3405
+ ### Category G: Task Deduplication Details
3406
+
3407
+ Compare tasks across three dimensions:
3408
+ 1. **Description similarity** — substantially same intent/outcome (not just keyword overlap)
3409
+ 2. **File path overlap** — majority (≥50%) of same files/directories targeted
3410
+ 3. **Code section overlap** — same function/class/method/section referenced
3411
+
3412
+ Classification and severity:
3413
+ - \`duplicate\` (same work, same scope) → CRITICAL
3414
+ - \`conflicting\` (contradictory outcomes) → CRITICAL
3415
+ - \`overlapping\` ≥2 dimensions match strongly → CRITICAL
3416
+ - \`overlapping\` exactly 1 dimension matches → HIGH
3417
+
3418
+ Grouping: Use transitive closure — if A overlaps B and B overlaps C, emit one finding for {A,B,C}. Highest severity wins.
3419
+
3420
+ Each finding must include: overlap_type, severity, task_ids (array of task ID strings, e.g. [\"T001\",\"T002\"]), dimensions (array of triggered dimension names from allowed values: \`description\`, \`file_path\`, \`code_section\`), rationale (≤500 chars).
3421
+
3422
+ Edge cases: Similar descriptions but different files → max HIGH; same file different sections → overlapping or no finding; broad-vs-narrow nesting → overlapping unless materially redundant; single-dimension evidence → max HIGH; contradictory verbs → conflicting.
3423
+
3424
+ Category G is READ-ONLY — do not merge/rewrite tasks. When Category G findings exist, emit a \`### Category G Structured Findings\` section after the findings table containing a valid JSON array of finding objects as raw JSON without Markdown code fences (schema: \`{id: string, overlap_type: \"duplicate\"|\"overlapping\"|\"conflicting\", severity: \"CRITICAL\"|\"HIGH\", task_ids: string[], dimensions: (\"description\"|\"file_path\"|\"code_section\")[], rationale: string}\`). The JSON array MUST be emitted directly — not wrapped in \`\`\`json fences — so downstream parsers can extract it without stripping fence markers.
3425
+
3426
+ ## Severity Levels
3427
+ - **CRITICAL**: Missing core artifact or zero-coverage requirement blocking baseline functionality; task deduplication — duplicate tasks, conflicting tasks, or multi-dimension overlap (≥2 dimensions)
3428
+ - **HIGH**: Duplicate/conflicting requirement; ambiguous security/performance; untestable acceptance criterion; task deduplication — single-dimension overlap
3429
+ - **MEDIUM**: Terminology drift; missing non-functional task coverage; underspecified edge case
3430
+ - **LOW**: Style/wording improvements; minor redundancy not affecting execution order
3431
+
3432
+ ## RESOLVED Finding Format Contract
3433
+ When a finding from a previous analysis has been addressed, change its Severity cell to:
3434
+ \`~~ORIGINAL_SEVERITY~~ → RESOLVED\`
3435
+
3436
+ This format is machine-parsed by the CRITICAL analysis gate. Examples:
3437
+ - CORRECT: \`| F-01 | ... | ~~CRITICAL~~ → RESOLVED | ... |\`
3438
+ - CORRECT: \`| F-02 | ... | ~~HIGH~~ → RESOLVED | ... |\`
3439
+ - INCORRECT: \`| F-01 | ... | ~~CRITICAL~~ | ... |\` (missing RESOLVED marker — gate treats as unresolved)
3440
+ - INCORRECT: \`| F-01 | ... | RESOLVED | ... |\` (missing strikethrough — gate cannot detect original severity)
3441
+
3442
+ ## Report Format
3443
+ Produce a compact Markdown analysis report with:
3444
+
3445
+ 1. **Findings Table**:
3446
+ | ID | Category | Severity | Location(s) | Summary | Recommendation |
3447
+ |----|----------|----------|-------------|---------|----------------|
3448
+
3449
+ 2. **Coverage Summary Table**:
3450
+ | Requirement Key | Has Task? | Task IDs | Notes |
3451
+ |----------------|-----------|----------|-------|
3452
+
3453
+ 3. **Metrics**:
3454
+ - Total Requirements
3455
+ - Total Tasks
3456
+ - Coverage %
3457
+ - Ambiguity Count
3458
+ - Requirement Duplication Count (Category A)
3459
+ - Critical Issues Count
3460
+ - Task Deduplication Finding Count
3461
+ - Task Deduplication by Type (duplicate / overlapping / conflicting)
3462
+ - Multi-Task Group Count (findings involving >2 tasks)
3463
+
3464
+ Output ONLY the analysis report in markdown format. No commentary, no code fences around the entire output.
3465
+
3466
+ ## Feature Specification
3467
+ $spec_content
3468
+
3469
+ ## Implementation Plan
3470
+ $plan_content
3471
+
3472
+ ## Task List
3473
+ $tasks_content
3474
+ $fr_coverage_context
3475
+ $test_coverage_context
3476
+ CRITICAL: Your output MUST begin with a markdown heading on the very first line.
3477
+ WRONG: \"Here is the analysis...\"
3478
+ WRONG: \"Certainly! Here is...\"
3479
+ CORRECT: \"# Analysis Report\"
3480
+ Do NOT include any conversational preamble before the heading."
3481
+
3482
+ local result
3483
+ result=$(call_llm "$prompt") || return 1
3484
+ if [[ -z "$result" ]]; then
3485
+ echo "Error: Analyze phase returned empty content" >&2
3486
+ return 1
3487
+ fi
3488
+ result=$(strip_llm_preamble "$result" "# ")
3489
+ if [[ -z "${result//[[:space:]]/}" ]]; then
3490
+ echo "Error: Analyze phase returned blank content after preamble removal" >&2
3491
+ return 1
3492
+ fi
3493
+ result=$(ensure_heading_start "$result" "# Analysis Report")
3494
+ printf '%s\n' "$result" > "$SPEC_DIR/analysis-report.md"
3495
+ append_model_footer "$SPEC_DIR/analysis-report.md"
3496
+ }
3497
+
3498
+ # ========================== Orchestration ====================================
3499
+
3500
+ # ---------------------------------------------------------------------------
3501
+ # run_single_phase <phase_number>
3502
+ #
3503
+ # Runs only the specified phase (1-5) and its markdownlint validation.
3504
+ # ---------------------------------------------------------------------------
3505
+ run_single_phase() {
3506
+ local phase="$1"
3507
+
3508
+ # Precondition checks: verify prerequisite artifacts exist for phases 2-5
3509
+ case "$phase" in
3510
+ 2)
3511
+ if [[ ! -f "$SPEC_DIR/spec.md" ]]; then
3512
+ echo "Error: $SPEC_DIR/spec.md not found. Phase 1 (specify) must be run first." >&2
3513
+ exit 1
3514
+ fi
3515
+ ;;
3516
+ 3)
3517
+ if [[ ! -f "$SPEC_DIR/spec.md" ]]; then
3518
+ echo "Error: $SPEC_DIR/spec.md not found. Phase 1 (specify) must be run first." >&2
3519
+ exit 1
3520
+ fi
3521
+ if [[ ! -f "$SPEC_DIR/checklists/requirements.md" ]]; then
3522
+ echo "Error: $SPEC_DIR/checklists/requirements.md not found. Phase 2 (clarify) must be run first." >&2
3523
+ exit 1
3524
+ fi
3525
+ ;;
3526
+ 4)
3527
+ if [[ ! -f "$SPEC_DIR/plan.md" ]]; then
3528
+ echo "Error: $SPEC_DIR/plan.md not found. Phase 3 (plan) must be run first." >&2
3529
+ exit 1
3530
+ fi
3531
+ ;;
3532
+ 5)
3533
+ if [[ ! -f "$SPEC_DIR/tasks.md" ]]; then
3534
+ echo "Error: $SPEC_DIR/tasks.md not found. Phase 4 (tasks) must be run first." >&2
3535
+ exit 1
3536
+ fi
3537
+ ;;
3538
+ esac
3539
+
3540
+ # Emit default gate outputs for non-analyze phases so downstream
3541
+ # workflow if: conditions evaluate correctly (FR-012, T026)
3542
+ case "$phase" in
3543
+ 1|2|3|4)
3544
+ echo "gate_result=pass" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3545
+ echo "critical_count=0" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3546
+ ;;
3547
+ esac
3548
+
3549
+ case "$phase" in
3550
+ 1)
3551
+ echo ""
3552
+ echo "=== Phase 1: Specify ==="
3553
+ SPEC_CONTENT=$(run_specify_phase_with_validation_retries) || exit 1
3554
+
3555
+ printf '%s\n' "$SPEC_CONTENT" > "$SPEC_DIR/spec.md"
3556
+ append_model_footer "$SPEC_DIR/spec.md"
3557
+ log_file_header "Phase 1" "$SPEC_DIR/spec.md"
3558
+ echo "✓ Phase 1 complete: spec.md"
3559
+
3560
+ echo ""
3561
+ echo "=== Markdownlint Validation ==="
3562
+ quick_markdown_sanity_check "$SPEC_DIR"
3563
+ run_markdownlint_validation "$SPEC_DIR" || { echo "Error: Markdownlint validation failed" >&2; exit 1; }
3564
+ echo "✓ Markdownlint validation complete"
3565
+ ;;
3566
+ 2)
3567
+ echo ""
3568
+ echo "=== Phase 2: Clarify + Checklist ==="
3569
+ run_clarify_phase || { echo "Error: Clarify phase failed after retries" >&2; exit 1; }
3570
+ log_file_header "Phase 2" "$SPEC_DIR/spec.md"
3571
+ echo "✓ Clarify complete: spec.md updated"
3572
+ run_checklist_phase || { echo "Error: Checklist phase failed after retries" >&2; exit 1; }
3573
+ log_file_header "Phase 2" "$SPEC_DIR/checklists/requirements.md"
3574
+ echo "✓ Checklist complete: checklists/requirements.md"
3575
+
3576
+ echo ""
3577
+ echo "=== Markdownlint Validation ==="
3578
+ quick_markdown_sanity_check "$SPEC_DIR"
3579
+ run_markdownlint_validation "$SPEC_DIR" || { echo "Error: Markdownlint validation failed" >&2; exit 1; }
3580
+ echo "✓ Markdownlint validation complete"
3581
+ ;;
3582
+ 3)
3583
+ echo ""
3584
+ echo "=== Phase 3: Plan ==="
3585
+ COPILOT_TIMEOUT=900 run_plan_phase || { echo "Error: Plan phase failed after retries" >&2; exit 1; }
3586
+ log_file_header "Phase 3" "$SPEC_DIR/plan.md"
3587
+ echo "✓ Phase 3 complete: plan.md (+ optional artifacts)"
3588
+
3589
+ echo ""
3590
+ echo "=== Markdownlint Validation ==="
3591
+ quick_markdown_sanity_check "$SPEC_DIR"
3592
+ run_markdownlint_validation "$SPEC_DIR" || { echo "Error: Markdownlint validation failed" >&2; exit 1; }
3593
+ echo "✓ Markdownlint validation complete"
3594
+ ;;
3595
+ 4)
3596
+ echo ""
3597
+ echo "=== Phase 4: Tasks ==="
3598
+ COPILOT_TIMEOUT=900 run_tasks_phase || { echo "Error: Tasks phase failed after retries" >&2; exit 1; }
3599
+ log_file_header "Phase 4" "$SPEC_DIR/tasks.md"
3600
+ echo "✓ Phase 4 complete: tasks.md"
3601
+
3602
+ # FR coverage validation gate with retry loop
3603
+ fr_validation_rc=0
3604
+ run_fr_validation_with_retry || fr_validation_rc=$?
3605
+ if [[ "$fr_validation_rc" -ne 0 ]]; then
3606
+ echo "Error: FR coverage validation failed — tasks PR blocked" >&2
3607
+ exit "$fr_validation_rc"
3608
+ fi
3609
+
3610
+ # E.2 Test coverage validation (non-blocking — findings flow to analyze)
3611
+ run_test_coverage_validation
3612
+
3613
+ echo ""
3614
+ echo "=== Markdownlint Validation ==="
3615
+ quick_markdown_sanity_check "$SPEC_DIR"
3616
+ run_markdownlint_validation "$SPEC_DIR" || { echo "Error: Markdownlint validation failed" >&2; exit 1; }
3617
+ echo "✓ Markdownlint validation complete"
3618
+ ;;
3619
+ 5)
3620
+ echo ""
3621
+ echo "=== Phase 5: Analyze ==="
3622
+ COPILOT_TIMEOUT=900 run_analyze_phase || { echo "Error: Analyze phase failed after retries" >&2; exit 1; }
3623
+ log_file_header "Phase 5" "$SPEC_DIR/analysis-report.md"
3624
+ echo "✓ Phase 5 complete: analysis-report.md"
3625
+
3626
+ # ── CRITICAL analysis gate (FR-009, phased path) ──────────
3627
+ echo ""
3628
+ echo "=== CRITICAL Analysis Gate ==="
3629
+ report_path="$SPEC_DIR/analysis-report.md"
3630
+ gate_mode="${SPECKIT_CRITICAL_GATE_MODE:-block}"
3631
+ gate_rc=0
3632
+ check_analysis_gate "$report_path" "$gate_mode" true || gate_rc=$?
3633
+
3634
+ if [[ "$gate_rc" -eq 10 ]]; then
3635
+ # Unresolved CRITICALs detected — attempt remediation
3636
+ if [[ "${SPECKIT_CRITICAL_GATE_REMEDIATION:-true}" == "true" ]]; then
3637
+ echo "=== CRITICAL Gate Remediation ===" >&2
3638
+ if _run_critical_gate_remediation "$SPEC_DIR" "$critical_findings_json"; then
3639
+ echo "✓ CRITICAL findings resolved via remediation (${critical_gate_remediation_layer:-unknown})" >&2
3640
+ echo "critical_gate_remediation_status=success-${critical_gate_remediation_layer:-layer1}" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3641
+ # Refresh gate outputs so downstream steps see gate_result=pass
3642
+ check_analysis_gate "$report_path" "$gate_mode" true >/dev/null 2>&1 || true
3643
+ else
3644
+ # Remediation failed — fall through to mode check
3645
+ echo "critical_gate_remediation_status=failed" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3646
+ if [[ "$gate_mode" == "draft" ]]; then
3647
+ echo "⚠ CRITICAL findings detected — draft mode: continuing to markdownlint" >&2
3648
+ else
3649
+ echo "Error: CRITICAL analysis gate failed — aborting (block mode)" >&2
3650
+ exit 1
3651
+ fi
3652
+ fi
3653
+ else
3654
+ echo "critical_gate_remediation_status=skipped" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3655
+ if [[ "$gate_mode" == "draft" ]]; then
3656
+ echo "⚠ CRITICAL findings detected — draft mode: continuing to markdownlint" >&2
3657
+ else
3658
+ echo "Error: CRITICAL analysis gate failed — aborting (block mode)" >&2
3659
+ exit 1
3660
+ fi
3661
+ fi
3662
+ elif [[ "$gate_rc" -eq 20 ]]; then
3663
+ echo "Error: CRITICAL analysis gate failed — report missing or malformed" >&2
3664
+ exit 1
3665
+ elif [[ "$gate_rc" -ne 0 ]]; then
3666
+ echo "Error: CRITICAL analysis gate failed — unexpected return code: $gate_rc" >&2
3667
+ exit 1
3668
+ fi
3669
+
3670
+ echo ""
3671
+ echo "=== Markdownlint Validation ==="
3672
+ quick_markdown_sanity_check "$SPEC_DIR"
3673
+ run_markdownlint_validation "$SPEC_DIR" || { echo "Error: Markdownlint validation failed" >&2; exit 1; }
3674
+ echo "✓ Markdownlint validation complete"
3675
+ ;;
3676
+ *)
3677
+ echo "Error: Unknown phase '$phase'" >&2
3678
+ exit 1
3679
+ ;;
3680
+ esac
3681
+ }
3682
+
3683
+ if [[ -n "$PHASE" ]]; then
3684
+ echo "=== SpecKit: Running Phase $PHASE Only ==="
3685
+ run_single_phase "$PHASE"
3686
+ else
3687
+ # Run all phases sequentially (backward compatible)
3688
+ echo ""
3689
+ echo "=== Phase 1/7: Specify ==="
3690
+ SPEC_CONTENT=$(run_specify_phase_with_validation_retries) || exit 1
3691
+
3692
+ printf '%s\n' "$SPEC_CONTENT" > "$SPEC_DIR/spec.md"
3693
+ append_model_footer "$SPEC_DIR/spec.md"
3694
+ log_file_header "Phase 1" "$SPEC_DIR/spec.md"
3695
+ echo "✓ Phase 1 complete: spec.md"
3696
+
3697
+ echo ""
3698
+ echo "=== Phase 2/7: Clarify ==="
3699
+ run_clarify_phase || { echo "Error: Clarify phase failed after retries" >&2; exit 1; }
3700
+ log_file_header "Phase 2" "$SPEC_DIR/spec.md"
3701
+ echo "✓ Phase 2 complete: spec.md updated with clarifications"
3702
+
3703
+ echo ""
3704
+ echo "=== Phase 3/7: Checklist ==="
3705
+ run_checklist_phase || { echo "Error: Checklist phase failed after retries" >&2; exit 1; }
3706
+ log_file_header "Phase 3" "$SPEC_DIR/checklists/requirements.md"
3707
+ echo "✓ Phase 3 complete: checklists/requirements.md"
3708
+
3709
+ echo ""
3710
+ echo "=== Phase 4/7: Plan ==="
3711
+ COPILOT_TIMEOUT=900 run_plan_phase || { echo "Error: Plan phase failed after retries" >&2; exit 1; }
3712
+ log_file_header "Phase 4" "$SPEC_DIR/plan.md"
3713
+ echo "✓ Phase 4 complete: plan.md (+ optional artifacts)"
3714
+
3715
+ echo ""
3716
+ echo "=== Phase 5/7: Tasks ==="
3717
+ COPILOT_TIMEOUT=900 run_tasks_phase || { echo "Error: Tasks phase failed after retries" >&2; exit 1; }
3718
+ log_file_header "Phase 5" "$SPEC_DIR/tasks.md"
3719
+ echo "✓ Phase 5 complete: tasks.md"
3720
+
3721
+ # FR coverage validation gate with retry loop (between tasks and analyze)
3722
+ fr_validation_rc=0
3723
+ run_fr_validation_with_retry || fr_validation_rc=$?
3724
+ if [[ "$fr_validation_rc" -ne 0 ]]; then
3725
+ echo "Error: FR coverage validation failed — tasks PR blocked" >&2
3726
+ exit "$fr_validation_rc"
3727
+ fi
3728
+
3729
+ # E.2 Test coverage validation (non-blocking — findings flow to analyze)
3730
+ run_test_coverage_validation
3731
+
3732
+ echo ""
3733
+ echo "=== Phase 6/7: Analyze ==="
3734
+ COPILOT_TIMEOUT=900 run_analyze_phase || { echo "Error: Analyze phase failed after retries" >&2; exit 1; }
3735
+ log_file_header "Phase 6" "$SPEC_DIR/analysis-report.md"
3736
+ echo "✓ Phase 6 complete: analysis-report.md"
3737
+
3738
+ # ── CRITICAL analysis gate (FR-009, monolithic path) ──────────
3739
+ echo ""
3740
+ echo "=== CRITICAL Analysis Gate ==="
3741
+ report_path="$SPEC_DIR/analysis-report.md"
3742
+ gate_mode="${SPECKIT_CRITICAL_GATE_MODE:-block}"
3743
+ gate_rc=0
3744
+ check_analysis_gate "$report_path" "$gate_mode" true || gate_rc=$?
3745
+
3746
+ if [[ "$gate_rc" -eq 10 ]]; then
3747
+ # Unresolved CRITICALs detected — attempt remediation
3748
+ if [[ "${SPECKIT_CRITICAL_GATE_REMEDIATION:-true}" == "true" ]]; then
3749
+ echo "=== CRITICAL Gate Remediation ===" >&2
3750
+ if _run_critical_gate_remediation "$SPEC_DIR" "$critical_findings_json"; then
3751
+ echo "✓ CRITICAL findings resolved via remediation (${critical_gate_remediation_layer:-unknown})" >&2
3752
+ echo "critical_gate_remediation_status=success-${critical_gate_remediation_layer:-layer1}" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3753
+ # Refresh gate outputs so downstream steps see gate_result=pass
3754
+ check_analysis_gate "$report_path" "$gate_mode" true >/dev/null 2>&1 || true
3755
+ else
3756
+ # Remediation failed — fall through to mode check
3757
+ echo "critical_gate_remediation_status=failed" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3758
+ if [[ "$gate_mode" == "draft" ]]; then
3759
+ echo "⚠ CRITICAL findings detected — draft mode: continuing to markdownlint" >&2
3760
+ else
3761
+ echo "Error: CRITICAL analysis gate failed — aborting (block mode)" >&2
3762
+ exit 1
3763
+ fi
3764
+ fi
3765
+ else
3766
+ echo "critical_gate_remediation_status=skipped" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3767
+ if [[ "$gate_mode" == "draft" ]]; then
3768
+ echo "⚠ CRITICAL findings detected — draft mode: continuing to markdownlint" >&2
3769
+ else
3770
+ echo "Error: CRITICAL analysis gate failed — aborting (block mode)" >&2
3771
+ exit 1
3772
+ fi
3773
+ fi
3774
+ elif [[ "$gate_rc" -eq 20 ]]; then
3775
+ echo "Error: CRITICAL analysis gate failed — report missing or malformed" >&2
3776
+ exit 1
3777
+ elif [[ "$gate_rc" -ne 0 ]]; then
3778
+ echo "Error: CRITICAL analysis gate failed — unexpected return code: $gate_rc" >&2
3779
+ exit 1
3780
+ fi
3781
+
3782
+ echo ""
3783
+ echo "=== Phase 7/7: Markdownlint Validation ==="
3784
+ quick_markdown_sanity_check "$SPEC_DIR"
3785
+ run_markdownlint_validation "$SPEC_DIR" || { echo "Error: Markdownlint validation failed — lint violations remain after remediation" >&2; exit 1; }
3786
+ echo "✓ Phase 7 complete: markdownlint validation finished"
3787
+ fi
3788
+
3789
+ # Output results (spec_dir as repo-relative path for portability)
3790
+ # Derive from SPEC_DIR by stripping REPO_ROOT prefix, so it stays correct
3791
+ # even if SPEC_BASE_PATH is set to an absolute-like path.
3792
+ if [[ "$SPEC_DIR" == "$REPO_ROOT"/* ]]; then
3793
+ SPEC_DIR_REL="${SPEC_DIR#"$REPO_ROOT"/}"
3794
+ else
3795
+ SPEC_DIR_REL="$SPEC_DIR"
3796
+ fi
3797
+ # Normalize to ensure SPEC_DIR_REL never starts with '/', even if SPEC_DIR was absolute.
3798
+ SPEC_DIR_REL="${SPEC_DIR_REL#/}"
3799
+ echo "branch_name=$BRANCH_NAME" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3800
+ echo "spec_file=$SPEC_FILE" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3801
+ echo "issue_number=$ISSUE_NUMBER" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3802
+ echo "spec_dir=$SPEC_DIR_REL" >> "${GITHUB_OUTPUT:-/dev/stdout}"
3803
+
3804
+ echo ""
3805
+ if [[ -n "$PHASE" ]]; then
3806
+ echo "=== Phase $PHASE Complete ==="
3807
+ else
3808
+ echo "=== Full Planning Artifact Suite Complete ==="
3809
+ fi
3810
+ echo "Branch: $BRANCH_NAME"
3811
+ echo "Spec File: $SPEC_FILE"
3812
+ echo "Spec Directory: $SPEC_DIR"
3813
+ echo ""
3814
+ echo "Artifacts produced:"
3815
+ shopt -s nullglob
3816
+ for f in "$SPEC_DIR"/*.md "$SPEC_DIR"/checklists/*.md "$SPEC_DIR"/contracts/*.md; do
3817
+ echo " - ${f#"$SPEC_DIR/"}"
3818
+ done
3819
+ shopt -u nullglob