agentic-devtools 0.2.118__tar.gz → 0.2.119__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.
- agentic_devtools-0.2.119/.github/scripts/speckit-trigger/generate-spec-from-issue.sh +3819 -0
- agentic_devtools-0.2.119/.github/scripts/speckit-trigger/lib/spec-validation.sh +597 -0
- agentic_devtools-0.2.119/.github/scripts/speckit-trigger/test_spec_validation.sh +1112 -0
- agentic_devtools-0.2.119/.github/scripts/speckit-trigger/test_specify_retry.sh +395 -0
- agentic_devtools-0.2.119/.github/workflows/ai-pr-loop.yml +115 -0
- agentic_devtools-0.2.119/PKG-INFO +959 -0
- agentic_devtools-0.2.119/agentic_devtools/_version.py +24 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/actionable_checks.py +12 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/commands.py +220 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/orchestrator.py +1781 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/__init__.py +28 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/__init__.py +21 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/approve.py +153 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/dispatch_repair.py +202 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/guards.py +120 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/merge.py +198 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/publish.py +120 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/request_review.py +111 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/resolve_threads.py +163 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/actions/squash.py +112 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/base.py +40 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/command.py +155 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/models.py +65 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/runner.py +209 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/session_detector.py +78 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/snapshot.py +321 -0
- agentic_devtools-0.2.119/agentic_devtools/cli/ci/pipeline/summary.py +305 -0
- agentic_devtools-0.2.119/specs/1505-structural-validation-and-retry/tasks.md +148 -0
- agentic_devtools-0.2.119/specs/1519-auto-push-force-lease/fr-coverage.json +1 -0
- agentic_devtools-0.2.119/specs/1519-auto-push-force-lease/tasks.md +91 -0
- agentic_devtools-0.2.119/specs/1519-auto-push-force-lease/test-coverage.json +183 -0
- agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/.markdownlint.json +4 -0
- agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/analysis-report.md +170 -0
- agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/checklists/requirements.md +46 -0
- agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/fr-coverage.json +1 -0
- agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/plan.md +214 -0
- agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/spec.md +346 -0
- agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/tasks.md +171 -0
- agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/test-coverage.json +288 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/commands/test_ai_pr_loop_command.py +145 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_actionable_checks.py +127 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/approve/test_approveaction.py +150 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/dispatch_repair/test_dispatchrepairaction.py +183 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/guards/test_guardsaction.py +126 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/merge/test_mergeaction.py +234 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/publish/test_publishaction.py +108 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/request_review/test_requestreviewaction.py +105 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/resolve_threads/test_resolvethreadsaction.py +175 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/squash/test_squashaction.py +96 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/command/test__determine_exit_code.py +105 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/command/test_run_ai_pr_loop_v2.py +116 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/models/test_actiondecision.py +26 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/models/test_actionresult.py +36 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/models/test_pipelinerunsummary.py +33 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/runner/test_run_pipeline.py +506 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/session_detector/test_is_copilot_session_active.py +67 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/snapshot/test_build_pr_state_snapshot.py +284 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/snapshot/test_derivedstate.py +37 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/snapshot/test_prstatesnapshot.py +43 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/summary/test_collapse_prior_summaries.py +203 -0
- agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/summary/test_render_summary_comment.py +180 -0
- agentic_devtools-0.2.119/tests/unit/orchestration/review/graph_builder/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/orchestration/review/nodes/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/orchestration/review/preflight/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/orchestration/review/runner/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/orchestration/runner/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/orchestration/state_schema/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/prompts/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/prompts/loader/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/skill_injector/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/state/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/submission_manager/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/submission_processor/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/task_state/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/tools/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/tools/azure_devops/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/tools/git/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/unit/tools/jira/__init__.py +0 -0
- agentic_devtools-0.2.119/tests/workflows/__init__.py +0 -0
- agentic_devtools-0.2.118/.github/scripts/speckit-trigger/generate-spec-from-issue.sh +0 -3666
- agentic_devtools-0.2.118/.github/workflows/ai-pr-loop.yml +0 -114
- agentic_devtools-0.2.118/PKG-INFO +0 -959
- agentic_devtools-0.2.118/agentic_devtools/_version.py +0 -24
- agentic_devtools-0.2.118/agentic_devtools/cli/ci/commands.py +0 -203
- agentic_devtools-0.2.118/agentic_devtools/cli/ci/orchestrator.py +0 -1789
- agentic_devtools-0.2.118/specs/1505-structural-validation-and-retry/tasks.md +0 -139
- agentic_devtools-0.2.118/tests/unit/cli/ci/commands/test_ai_pr_loop_command.py +0 -110
- agentic_devtools-0.2.118/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_actionable_checks.py +0 -125
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.devcontainer/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.devcontainer/devcontainer.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/ISSUE_TEMPLATE/speckit-test.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/MARKDOWN_LINTING.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.add-jira-comment.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.add-pull-request-comment.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.add-users-to-project-role-batch.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.add-users-to-project-role.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.address-copilot-review.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.address-copilot-review.ci-repair.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.address-copilot-review.evaluate-and-respond.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.advance-workflow.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.analyze-workflow.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.apply-pr-suggestions.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.approve-file.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.approve-pull-request.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.autonomous-issue-refinement.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.azure-context-current.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.azure-context-ensure-login.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.azure-context-status.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.azure-context-use.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.break-down-issue-into-subtasks.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.check-user-exists.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.check-users-exist.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.clear-workflow.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.clear.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.confirm-suggestion-addressed.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.copilot-auto-start.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-agdt-bug-issue.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-agdt-documentation-issue.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-agdt-feature-issue.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-agdt-issue.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-agdt-task-issue.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-checklist.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-epic.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-issue.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-issues-from-analysis.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-jira-epic.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-jira-subtask.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-pipeline.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-pull-request.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.create-subtask.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.delete.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.find-role-id-by-name.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get-jira-issue.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get-next-workflow-prompt.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get-pipeline-id.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get-project-role-details.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get-pull-request-details.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get-pull-request-threads.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get-run-details.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get-workflow.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.get.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.git-force-push.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.git-publish.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.git-push.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.git-save-work.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.git-stage.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.git-sync.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.list-pipelines.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.list-project-roles.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.mark-file-reviewed.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.mark-pull-request-draft.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.network-status.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.optimize-issue-for-ai-agent.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.parse-jira-error-report.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.pr-merge-execute.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.pr-merge-manager.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.publish-pull-request.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.pull-request-review.completion.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.pull-request-review.decision.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.pull-request-review.file-review.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.pull-request-review.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.query-app-insights.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.query-fabric-dap-errors.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.query-fabric-dap-provisioning.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.query-fabric-dap-timeline.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.reject-suggestion-resolution.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.release-pypi.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.reply-to-pull-request-thread.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.request-changes-with-suggestion.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.request-changes.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.resolve-merge-conflicts.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.resolve-thread.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.review.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.run-e2e-tests-fabric.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.run-e2e-tests-synapse.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.run-wb-patch.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.set.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.setup-certs.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.setup-check.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.setup-copilot-cli.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.setup-gh-cli.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.setup-worktree-background.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.setup.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.show-checklist.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.show-other-incomplete-tasks.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.show.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.squash-commits.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.submit-file-review.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.task-log.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.task-status.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.task-wait.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.tasks-clean.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.tasks.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.test-file.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.test-pattern.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.test-quick.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.test.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.update-checklist.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.update-jira-issue.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.update-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.update-pipeline.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.vpn-off.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.vpn-on.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.vpn-run.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.vpn-status.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.wait-for-run.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.checklist-creation.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.commit.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.completion.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.implementation-review.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.implementation.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.initiate.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.planning.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.pull-request.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.retrieve.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.setup.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/agdt.work-on-jira-issue.verification.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/copilot-instructions.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/security-scan.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/senior-python-developer.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.analyze.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.checklist.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.clarify.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.constitution.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.implement.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.plan.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.specify.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.tasks.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/agents/speckit.taskstoissues.agent.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/ai-pr-loop-config.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/copilot-instructions.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.add-jira-comment.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.add-pull-request-comment.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.add-users-to-project-role-batch.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.add-users-to-project-role.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.address-copilot-review.ci-repair.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.address-copilot-review.evaluate-and-respond.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.address-copilot-review.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.advance-workflow.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.analyze-workflow.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.apply-pr-suggestions.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.approve-file.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.approve-pull-request.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.autonomous-issue-refinement.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.azure-context-current.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.azure-context-ensure-login.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.azure-context-status.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.azure-context-use.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.break-down-issue-into-subtasks.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.check-user-exists.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.check-users-exist.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.clear-workflow.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.clear.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.confirm-suggestion-addressed.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.copilot-auto-start.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-agdt-bug-issue.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-agdt-documentation-issue.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-agdt-feature-issue.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-agdt-issue.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-agdt-task-issue.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-checklist.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-epic.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-issue.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-issues-from-analysis.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-jira-epic.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-jira-subtask.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-pipeline.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-pull-request.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.create-subtask.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.delete.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.find-role-id-by-name.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get-jira-issue.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get-next-workflow-prompt.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get-pipeline-id.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get-project-role-details.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get-pull-request-details.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get-pull-request-threads.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get-run-details.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get-workflow.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.get.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.git-force-push.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.git-publish.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.git-push.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.git-save-work.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.git-stage.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.git-sync.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.list-pipelines.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.list-project-roles.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.mark-file-reviewed.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.mark-pull-request-draft.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.network-status.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.optimize-issue-for-ai-agent.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.parse-jira-error-report.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.pr-merge-manager.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.publish-pull-request.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.pull-request-review.completion.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.pull-request-review.decision.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.pull-request-review.file-review.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.pull-request-review.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.query-app-insights.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.query-fabric-dap-errors.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.query-fabric-dap-provisioning.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.query-fabric-dap-timeline.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.reject-suggestion-resolution.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.release-pypi.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.reply-to-pull-request-thread.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.request-changes-with-suggestion.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.request-changes.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.resolve-merge-conflicts.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.resolve-thread.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.review.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.run-e2e-tests-fabric.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.run-e2e-tests-synapse.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.run-wb-patch.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.set.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.setup-certs.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.setup-check.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.setup-copilot-cli.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.setup-gh-cli.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.setup-worktree-background.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.setup.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.show-checklist.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.show-other-incomplete-tasks.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.show.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.squash-commits.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.submit-file-review.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.task-log.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.task-status.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.task-wait.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.tasks-clean.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.tasks.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.test-file.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.test-pattern.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.test-quick.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.test.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.update-checklist.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.update-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.update-jira-issue.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.update-pipeline.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.vpn-off.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.vpn-on.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.vpn-run.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.vpn-status.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.wait-for-run.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.checklist-creation.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.commit.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.completion.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.implementation-review.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.implementation.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.initiate.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.planning.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.pull-request.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.retrieve.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.setup.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/agdt.work-on-jira-issue.verification.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.analyze.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.checklist.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.clarify.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.constitution.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.implement.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.plan.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.specify.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.tasks.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/check-analysis-gate-cli.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/check-analysis-gate.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/check-idempotency.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/copilot_generate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/create-spec-pr.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/enforce_budget.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fix_markdown_deterministic.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-dynamic-header.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-empty.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-formatting-variants.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-malformed-no-table.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-metrics-zero-but-table-critical.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-mixed-resolved-unresolved.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-no-criticals.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-remediated.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-strikethrough-no-resolved.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-with-criticals.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/analysis-report-with-resolved-criticals.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/content-preservation/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/content-preservation/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/long-line.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/missing-heading.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/fixtures/trailing-whitespace.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/lib/clarify-retry.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/lib/critical-gate-remediation.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/lib/retry.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/post-issue-comment.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/sanitize-branch-name.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/templates/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/templates/already-processed.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/templates/completed.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/templates/failed.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/templates/spec-markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/templates/started.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/test_check_analysis_gate.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/test_clarify_retry.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/test_content_preservation.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/test_critical_gate_remediation.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/test_markdownlint_validation.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/test_sc004_regression.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/tests/test_retry_lib.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/validate-label.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/scripts/speckit-trigger/wrap_markdown_lines.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/copilot-review-gate.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/copilot-setup-steps.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/lint.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/publish.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/release.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/scripts/check-release-exists.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/scripts/get-next-version.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/security-scan-on-merge.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/speckit-implement-trigger.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/speckit-issue-trigger.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/speckit-packages.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/speckit-phase-progression.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/squash-wait-scheduler.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/synthetic-copilot-review.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/test.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/workflow-approval-monitor.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.github/workflows/workflow-tests.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.gitignore +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.markdownlint-cli2.jsonc +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.push-trigger +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/SDD_QUICK_REFERENCE.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/config.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/analyze.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/checklist.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/clarify.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/constitution.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/implement.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/specify.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/commands/taskstoissues.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/extension.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/bash/check-prerequisites.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/bash/common.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/bash/create-new-feature.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/bash/setup-plan.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/bash/update-agent-context.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/powershell/check-prerequisites.ps1 +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/powershell/common.ps1 +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/powershell/create-new-feature.ps1 +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/powershell/setup-plan.ps1 +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/extensions/agdt-workflows/scripts/powershell/update-agent-context.ps1 +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/memory/constitution.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/memory/markdown-rules.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/presets/agdt-templates/preset.yml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/presets/agdt-templates/templates/agent-file-template.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/presets/agdt-templates/templates/checklist-template.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/presets/agdt-templates/templates/plan-template.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/presets/agdt-templates/templates/spec-template.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/presets/agdt-templates/templates/tasks-template.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.specify/presets/agdt-templates/templates/vscode-settings.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/.work-folder-info +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/AUDIT-LOG.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/CHANGELOG.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/COMMIT_CONVENTION.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/CONTRIBUTING.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/LICENSE +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/PR_DESCRIPTION.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/PR_INSTRUCTIONS.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/PR_MERGE_INSTRUCTIONS_PYTHON.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/RELEASING.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/SECURITY_SCANNING.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/SOLUTION_SUMMARY.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/SPEC_DRIVEN_DEVELOPMENT.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/_bundled_skills/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/_bundled_skills/agents/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/_bundled_skills/prompts/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/_bundled_skills/workflow-analysis/SKILL.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/adapters/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/adapters/base.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/adapters/github_adapter.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/adapters/jira_adapter.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/adapters/markdown_adapter.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/agdt_gitignore.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/background_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/activity_log.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/analysis/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/analysis/context_resolver.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/analysis/external_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/analysis/identity_scanner.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure/app_insights_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure/auth.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure/config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_context/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_context/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_context/config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_context/management.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/approve_files.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/async_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/auth.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/batch_review_helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/file_review_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/classification.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/convergence.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/identity.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/models.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/orchestrator.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/repair.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/reporting.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/finalization/verification.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/mark_reviewed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/marker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/pipeline_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/pr_summary_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/pull_request_details_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/request_changes_batch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_attribution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_jira.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_models_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_prompts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_scaffold.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/review_templates.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/run_details_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/status_cascade.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/suggestion_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/suggestion_verification.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/verdict_protocol.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/azure_devops/vpn_toggle.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/cert_utils.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/ado_provider.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/evaluator/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/evaluator/actions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/evaluator/classifier.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/evaluator/command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/evaluator/diff_heuristic.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/evaluator/lock.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/evaluator/models.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/evaluator/snapshot.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/exceptions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/github_provider.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/guards.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/models.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/provider.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/retry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/ci/speckit_trigger.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/config/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/config/project_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/copilot/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/copilot/auto_start.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/copilot/session.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/git/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/git/agdt_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/git/async_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/git/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/git/core.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/git/diff.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/git/operations.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/async_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/copilot_review_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/issue_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/pr_approve.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/pr_checks_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/pr_merge.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/pr_poll_ready.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/pr_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/repo_resolution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/request_copilot_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/rerun_checks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/resolve_review_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/review_reply.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/github/state_helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/adf.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/async_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/async_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/comment_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/create_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/formatting.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/get_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/parse_error_report.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/role_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/state_helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/update_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/jira/vpn_wrapper.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/network/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/network/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/network/detection.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/release/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/release/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/release/helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/review/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/review/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/review/config_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/review/consolidate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/review/dispatch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/review/status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/runner.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/copilot_cli_installer.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/dependency_checker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/gh_cli_installer.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/gitignore_negations.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/platform_detection.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/pr_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/atomic_write.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/complete_setup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/configured_setup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/constants.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/gitignore_updater.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/legacy_migration.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/repo_specific.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/required_setup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/script_generators/root_entry_point.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/shell_profile.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/templates/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/templates/review-pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/templates/work-on-issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/version_guard.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/setup/workflow_templates.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/cross_ref.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_e2/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_e2/constants.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_e2/coverage_mapper.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_e2/models.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_e2/reporter.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_e2/spec_parser.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_e2/task_classifier.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_e2/validator.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/classifier.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/constants.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/extractors/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/extractors/base.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/extractors/python_extractor.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/intent_detector.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/inventory.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/matcher.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/models.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/reference_extractor.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/pass_g/reporter.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/validate_checklists.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/speckit/validate_frs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/subprocess_utils.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/tasks/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/tasks/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/testing.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/vpn/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/vpn/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/vpn/runner.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/vscode_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/advancement.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/applied_suggestions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/base.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/checklist.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/engine_resolution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/manager.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/preflight.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/cli/workflows/worktree_setup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/context/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/context/models.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/context/nodes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/context/retriever.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/context_budget.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/file_locking.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/mcp/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/mcp/server.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/checkpointing.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/graph_builder.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/pilot_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/review/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/review/graph_builder.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/review/nodes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/review/preflight.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/review/runner.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/review/state_schema.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/runner.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/orchestration/state_schema.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/apply-pull-request-review-suggestions/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/break-down-issue-into-subtasks/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/ci/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/ci/exhausted-comment.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/ci/merge-failed-comment.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/ci/ready-no-merge-comment.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/ci/timeout-comment.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/create-jira-epic/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/create-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/create-jira-subtask/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/loader.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/optimize-issue-for-ai-agent/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/pr-merge-orchestrator/default-init-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/pull-request-review/default-completion-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/pull-request-review/default-decision-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/pull-request-review/default-file-review-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/pull-request-review/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/pull-request-review/default-pull-request-overview-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/update-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/update-jira-issue/default-make-updates-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-checklist-creation-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-commit-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-completion-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-implementation-review-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-initiate-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-planning-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-pull-request-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-retrieve-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-setup-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/prompts/work-on-jira-issue/default-verification-prompt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/skill_injector.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/submission_manager.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/submission_processor.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/task_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/tools/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/tools/azure_devops.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/tools/git.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/agentic_devtools/tools/jira.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/01-introduction-and-goals.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/02-architecture-constraints.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/03-system-context.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/04-solution-strategy.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/05-building-blocks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/06-runtime-view.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/07-deployment-view.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/08-cross-cutting-concepts.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/09-architecture-decisions.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/10-quality-requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/11-risks-and-technical-debt.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/12-glossary.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/analysis/001-orchestration-framework-evaluation.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-001-state-management-single-json-file.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-002-parameterless-command-pattern.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-003-background-task-execution.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-004-multi-worktree-support.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-005-workflow-state-machine-pattern.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-006-mermaid-diagrams.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-007-argparse-cli.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-008-pyproject-toml.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-009-dynamic-versioning-git-tags.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-010-azure-devops-primary.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-011-test-coverage-requirement.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-012-cross-platform-file-locking.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/architecture-decisions/ADR-013-orchestration-framework-selection.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/ci-secrets.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/copilot-commands.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/mcp-server.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/speckit-migration-inventory.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/state-keys.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/docs/workflow-prompts.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/pipelines/ai-review-stage.yaml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/pyproject.toml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/scripts/check-pr-test-coverage.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/scripts/check-pr-test-coverage.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/scripts/run-pr-checks.sh +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/scripts/scaffold_tests.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/scripts/validate_test_structure.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/scripts/verify-agent-coverage.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-add-workflow-step-agents/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-add-workflow-step-agents/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-add-workflow-step-agents/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-add-workflow-step-agents/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-pypi-wheel-release/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-pypi-wheel-release/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-pypi-wheel-release/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-pypi-wheel-release/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-separate-docs/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-separate-docs/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-separate-docs/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-separate-docs/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-workflow-step-skills/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/001-workflow-step-skills/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/002-github-action-speckit-trigger/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/002-github-action-speckit-trigger/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/002-github-action-speckit-trigger/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/002-github-action-speckit-trigger/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/002-github-action-speckit-trigger/workflow-sequence-diagram.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/003-comprehensive-e2e-smoke-tests/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/003-comprehensive-e2e-smoke-tests/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/003-e2e-smoke-tests-cli/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/005-resolve-test-suite-warnings/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/005-resolve-test-suite-warnings/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/005-resolve-test-suite-warnings/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/005-resolve-test-suite-warnings/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/005-resolve-test-suite-warnings/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1175-plan-phase-fails-large/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1175-plan-phase-fails-large/checklists/checklist.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1175-plan-phase-fails-large/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1175-plan-phase-fails-large/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1175-plan-phase-fails-large/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1175-plan-phase-fails-large/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1176-use-issue-number-speckit/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1176-use-issue-number-speckit/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1176-use-issue-number-speckit/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1176-use-issue-number-speckit/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1176-use-issue-number-speckit/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1179-enhance-agdt-analyze-workflow/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1179-enhance-agdt-analyze-workflow/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1179-enhance-agdt-analyze-workflow/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1179-enhance-agdt-analyze-workflow/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1179-enhance-agdt-analyze-workflow/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/checklists/checklist.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1180-split-state-directory-during/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1191-speckit-pipeline-markdownlint-validation/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1191-speckit-pipeline-markdownlint-validation/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1191-speckit-pipeline-markdownlint-validation/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1191-speckit-pipeline-markdownlint-validation/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1191-speckit-pipeline-markdownlint-validation/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1193-speckit-pipeline-enforce-line/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1193-speckit-pipeline-enforce-line/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1193-speckit-pipeline-enforce-line/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1193-speckit-pipeline-enforce-line/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1193-speckit-pipeline-enforce-line/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1194-speckit-prompts-require-language/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1194-speckit-prompts-require-language/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1194-speckit-prompts-require-language/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1194-speckit-prompts-require-language/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1194-speckit-prompts-require-language/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1194-speckit-prompts-require-language/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1195-speckit-clarification-step-overwrites/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1195-speckit-clarification-step-overwrites/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1195-speckit-clarification-step-overwrites/checklists/checklist.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1195-speckit-clarification-step-overwrites/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1195-speckit-clarification-step-overwrites/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1195-speckit-clarification-step-overwrites/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1195-speckit-clarification-step-overwrites/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1196-speckit-pipeline-auto-request/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1196-speckit-pipeline-auto-request/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1196-speckit-pipeline-auto-request/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1196-speckit-pipeline-auto-request/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1196-speckit-pipeline-auto-request/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1196-speckit-pipeline-auto-request/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1197-speckit-pipeline-gate-creation/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1197-speckit-pipeline-gate-creation/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1197-speckit-pipeline-gate-creation/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1197-speckit-pipeline-gate-creation/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1197-speckit-pipeline-gate-creation/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1197-speckit-pipeline-gate-creation/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1198-speckit-prompts-require-phase/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1198-speckit-prompts-require-phase/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1198-speckit-prompts-require-phase/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1198-speckit-prompts-require-phase/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1198-speckit-prompts-require-phase/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1198-speckit-prompts-require-phase/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1198-speckit-prompts-require-phase/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1199-speckit-pipeline-validate-all/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1199-speckit-pipeline-validate-all/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1199-speckit-pipeline-validate-all/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1199-speckit-pipeline-validate-all/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1199-speckit-pipeline-validate-all/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1199-speckit-pipeline-validate-all/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1200-speckit-prompts-use-anchor/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1200-speckit-prompts-use-anchor/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1200-speckit-prompts-use-anchor/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1200-speckit-prompts-use-anchor/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1200-speckit-prompts-use-anchor/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1200-speckit-prompts-use-anchor/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1201-speckit-pipeline-task-deduplication/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1201-speckit-pipeline-task-deduplication/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1201-speckit-pipeline-task-deduplication/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1201-speckit-pipeline-task-deduplication/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1201-speckit-pipeline-task-deduplication/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1201-speckit-pipeline-task-deduplication/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1201-speckit-pipeline-task-deduplication/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/fixtures/sc-001/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/fixtures/sc-001/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1202-speckit-pipeline-validate-each/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1203-speckit-pipeline-validate-checklist/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1203-speckit-pipeline-validate-checklist/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1203-speckit-pipeline-validate-checklist/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1203-speckit-pipeline-validate-checklist/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1203-speckit-pipeline-validate-checklist/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1203-speckit-pipeline-validate-checklist/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1203-speckit-pipeline-validate-checklist/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1204-speckit-pipeline-cross-reference/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1204-speckit-pipeline-cross-reference/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1204-speckit-pipeline-cross-reference/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1204-speckit-pipeline-cross-reference/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1204-speckit-pipeline-cross-reference/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1204-speckit-pipeline-cross-reference/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1204-speckit-pipeline-cross-reference/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1215-fix-remove-invalid-yes/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1215-fix-remove-invalid-yes/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1215-fix-remove-invalid-yes/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1215-fix-remove-invalid-yes/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1215-fix-remove-invalid-yes/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1215-fix-remove-invalid-yes/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1258-use-pat-copilot-review/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1258-use-pat-copilot-review/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1258-use-pat-copilot-review/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1258-use-pat-copilot-review/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1258-use-pat-copilot-review/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1258-use-pat-copilot-review/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1270-finalize-review-workflow-automatic/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1270-finalize-review-workflow-automatic/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1270-finalize-review-workflow-automatic/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1270-finalize-review-workflow-automatic/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1270-finalize-review-workflow-automatic/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1270-finalize-review-workflow-automatic/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1270-finalize-review-workflow-automatic/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1270-finalize-review-workflow-automatic/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1283-update-workflow-use-github/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1283-update-workflow-use-github/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1283-update-workflow-use-github/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1283-update-workflow-use-github/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1283-update-workflow-use-github/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1283-update-workflow-use-github/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1283-update-workflow-use-github/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1300-bug-agdt-copilot-auto/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1300-bug-agdt-copilot-auto/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1300-bug-agdt-copilot-auto/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1300-bug-agdt-copilot-auto/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1300-bug-agdt-copilot-auto/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1300-bug-agdt-copilot-auto/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1300-bug-agdt-copilot-auto/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1322-restructure-setup-dev-tools/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1322-restructure-setup-dev-tools/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1322-restructure-setup-dev-tools/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1322-restructure-setup-dev-tools/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1322-restructure-setup-dev-tools/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1322-restructure-setup-dev-tools/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1322-restructure-setup-dev-tools/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1322-restructure-setup-dev-tools/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1324-pin-agentic-devtools-version/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1324-pin-agentic-devtools-version/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1324-pin-agentic-devtools-version/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1324-pin-agentic-devtools-version/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1324-pin-agentic-devtools-version/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1324-pin-agentic-devtools-version/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1324-pin-agentic-devtools-version/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1324-pin-agentic-devtools-version/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1326-improve-error-handling-and/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1326-improve-error-handling-and/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1326-improve-error-handling-and/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1326-improve-error-handling-and/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1326-improve-error-handling-and/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1326-improve-error-handling-and/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1326-improve-error-handling-and/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1326-improve-error-handling-and/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1359-loop-automated-agentic-handling/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1359-loop-automated-agentic-handling/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1359-loop-automated-agentic-handling/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1359-loop-automated-agentic-handling/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1359-loop-automated-agentic-handling/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1359-loop-automated-agentic-handling/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1359-loop-automated-agentic-handling/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1359-loop-automated-agentic-handling/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1364-fix-speckit-label-operations/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1364-fix-speckit-label-operations/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1364-fix-speckit-label-operations/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1364-fix-speckit-label-operations/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1364-fix-speckit-label-operations/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1364-fix-speckit-label-operations/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1364-fix-speckit-label-operations/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1364-fix-speckit-label-operations/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1391-fix-request-copilot-review/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1391-fix-request-copilot-review/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1391-fix-request-copilot-review/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1391-fix-request-copilot-review/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1391-fix-request-copilot-review/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1391-fix-request-copilot-review/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1391-fix-request-copilot-review/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1391-fix-request-copilot-review/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1393-blocker-workflow-approval-required/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1393-blocker-workflow-approval-required/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1393-blocker-workflow-approval-required/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1393-blocker-workflow-approval-required/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1393-blocker-workflow-approval-required/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1393-blocker-workflow-approval-required/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1393-blocker-workflow-approval-required/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1393-blocker-workflow-approval-required/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1400-extract-workflow-logic-yaml/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1400-extract-workflow-logic-yaml/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1400-extract-workflow-logic-yaml/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1400-extract-workflow-logic-yaml/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1400-extract-workflow-logic-yaml/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1400-extract-workflow-logic-yaml/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1400-extract-workflow-logic-yaml/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1400-extract-workflow-logic-yaml/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1408-migrate-native-spec-kit/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1408-migrate-native-spec-kit/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1408-migrate-native-spec-kit/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1408-migrate-native-spec-kit/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1408-migrate-native-spec-kit/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1408-migrate-native-spec-kit/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1408-migrate-native-spec-kit/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1408-migrate-native-spec-kit/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1428-implement-langchain-based-pull/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1428-implement-langchain-based-pull/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1428-implement-langchain-based-pull/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1428-implement-langchain-based-pull/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1428-implement-langchain-based-pull/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1428-implement-langchain-based-pull/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1428-implement-langchain-based-pull/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1428-implement-langchain-based-pull/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/data-model.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/quickstart.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/research.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1430-langchain-based-work-issue/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1432-standardize-copilot-review-response/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1432-standardize-copilot-review-response/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1432-standardize-copilot-review-response/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1432-standardize-copilot-review-response/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1432-standardize-copilot-review-response/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1432-standardize-copilot-review-response/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1432-standardize-copilot-review-response/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1432-standardize-copilot-review-response/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1435-second-pat-agdt-approver/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1435-second-pat-agdt-approver/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1435-second-pat-agdt-approver/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1435-second-pat-agdt-approver/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1435-second-pat-agdt-approver/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1435-second-pat-agdt-approver/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1435-second-pat-agdt-approver/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1435-second-pat-agdt-approver/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1444-monorepo-spec-kit-strategy/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1444-monorepo-spec-kit-strategy/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1444-monorepo-spec-kit-strategy/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1444-monorepo-spec-kit-strategy/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/checklists/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1486-post-agent-copilot-review/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/checklists/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1503-improve-copilot-review-finalization/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1505-structural-validation-and-retry/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1505-structural-validation-and-retry/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1505-structural-validation-and-retry/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1505-structural-validation-and-retry/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1505-structural-validation-and-retry/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1505-structural-validation-and-retry/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1505-structural-validation-and-retry/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/analysis-report.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/checklists/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1509-spec-loop-complete-state/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/checklists/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/data-model.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/fr-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/quickstart.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/research.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/tasks.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1515-agdt-setup-generates-corrupted/test-coverage.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1517-shared-review-threads-across/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1517-shared-review-threads-across/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1517-shared-review-threads-across/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1517-shared-review-threads-across/data-model.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1517-shared-review-threads-across/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1517-shared-review-threads-across/quickstart.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1517-shared-review-threads-across/research.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1517-shared-review-threads-across/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1518-thread-title-formatting-subsequent/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1518-thread-title-formatting-subsequent/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1518-thread-title-formatting-subsequent/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1518-thread-title-formatting-subsequent/data-model.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1518-thread-title-formatting-subsequent/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1518-thread-title-formatting-subsequent/quickstart.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1518-thread-title-formatting-subsequent/research.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1518-thread-title-formatting-subsequent/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1519-auto-push-force-lease/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1519-auto-push-force-lease/checklists/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1519-auto-push-force-lease/checklists/requirements.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1519-auto-push-force-lease/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1519-auto-push-force-lease/plan.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1519-auto-push-force-lease/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1523-review-all-files-every/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1523-review-all-files-every/checklists/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1523-review-all-files-every/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1523-review-all-files-every/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1525-parallel-safe-state-isolated/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1525-parallel-safe-state-isolated/checklists/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1525-parallel-safe-state-isolated/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1525-parallel-safe-state-isolated/spec.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1527-consolidate-speckit-issue-trigger/.markdownlint.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1527-consolidate-speckit-issue-trigger/checklists/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1527-consolidate-speckit-issue-trigger/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/1527-consolidate-speckit-issue-trigger/spec.md +0 -0
- /agentic_devtools-0.2.118/tests/unit/__init__.py → /agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/checklists/.gitkeep +0 -0
- /agentic_devtools-0.2.118/tests/unit/adapters/__init__.py → /agentic_devtools-0.2.119/specs/1559-refactor-loop-into-idempotent/contracts/.gitkeep +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/specs/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_context/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_context/test_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_context/test_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_context/test_management.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_async_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_auth.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_commands_api.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_commands_dry_run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_file_review_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_mark_reviewed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_pipeline_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_pr_summary_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_pull_request_details_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_review_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_run_details_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/azure_devops/test_vpn_toggle.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/cli/test_azure_app_insights_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/cli/test_azure_auth.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/cli/test_azure_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/fixtures/cassettes/azure_devops_create_pr.yaml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/fixtures/cassettes/jira_add_comment.yaml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/fixtures/cassettes/jira_get_issue.yaml +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/test_azure_devops_commands_e2e.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/test_git_commands_e2e.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/test_jira_commands_e2e.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/e2e_smoke/test_speckit_packages_e2e.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/README.md +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/golden_issues_labeled.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/golden_pull_request.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/golden_pull_request_review.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/golden_workflow_run.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/issue_comment_created.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/issues_labeled.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/pull_request_opened.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/pull_request_review_submitted.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/pull_request_synchronize.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/fixtures/ci_events/workflow_run_completed.json +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/network/test_detection.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/network/test_network_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_file_review_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_file_review_queue_management.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_git_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_git_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_git_core.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_git_diff.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_git_operations.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_git_utilities.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_no_scripts_temp_references.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_release_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_release_helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_release_integration.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_scaffold_tests.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_validate_test_structure.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/test_version.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/adapters/__init__ → agentic_devtools-0.2.119/tests/unit}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/adapters/github_adapter → agentic_devtools-0.2.119/tests/unit/adapters/__init__}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/adapters/__init__/test_get_adapter.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/adapters/base → agentic_devtools-0.2.119/tests/unit/adapters}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/adapters/jira_adapter → agentic_devtools-0.2.119/tests/unit/adapters/base}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/adapters/base/test_issueadapter.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/adapters/markdown_adapter → agentic_devtools-0.2.119/tests/unit/adapters/github_adapter}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/adapters/github_adapter/test_githubissuesadapter.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/agdt_gitignore → agentic_devtools-0.2.119/tests/unit/adapters/jira_adapter}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/adapters/jira_adapter/test_jiraadapter.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/background_tasks → agentic_devtools-0.2.119/tests/unit/adapters/markdown_adapter}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/adapters/markdown_adapter/test_markdownadapter.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli → agentic_devtools-0.2.119/tests/unit/agdt_gitignore}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/agdt_gitignore/test_ensure_agdt_gitignore.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/activity_log → agentic_devtools-0.2.119/tests/unit/background_tasks}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/background_tasks/test_cleanup_old_logs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/background_tasks/test_create_log_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/background_tasks/test_get_task_log_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/background_tasks/test_run_function_in_background.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/background_tasks/test_run_in_background.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/background_tasks/test_wait_for_task.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/analysis → agentic_devtools-0.2.119/tests/unit/cli}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/analysis/context_resolver → agentic_devtools-0.2.119/tests/unit/cli/activity_log}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/activity_log/test_activity_log.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/activity_log/test_activity_log_entry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/activity_log/test_get_activity_log_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/activity_log/test_load_activity_log.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/activity_log/test_load_from_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/activity_log/test_save_activity_log.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/analysis/external_context → agentic_devtools-0.2.119/tests/unit/cli/analysis}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/analysis/identity_scanner → agentic_devtools-0.2.119/tests/unit/cli/analysis/context_resolver}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/context_resolver/test_list_worktree_state_dirs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/context_resolver/test_resolve_analysis_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/context_resolver/test_resolve_analysis_context_edge_cases.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/context_resolver/test_resolve_analysis_context_errors.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure → agentic_devtools-0.2.119/tests/unit/cli/analysis/external_context}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/external_context/test__discover_worktrees.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/external_context/test__read_log_excerpt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/external_context/test_build_external_context_field.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/external_context/test_collect_external_context.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure/app_insights_commands → agentic_devtools-0.2.119/tests/unit/cli/analysis/identity_scanner}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/identity_scanner/test_format_evidence_prefix.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/identity_scanner/test_list_identity_directories.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/identity_scanner/test_scan_identity_logs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/identity_scanner/test_scan_identity_logs_determinism.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/analysis/identity_scanner/test_scan_identity_logs_performance.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure/auth → agentic_devtools-0.2.119/tests/unit/cli/azure}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure/config → agentic_devtools-0.2.119/tests/unit/cli/azure/app_insights_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/app_insights_commands/test_query_app_insights.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/app_insights_commands/test_query_app_insights_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_errors.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_errors_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_provisioning.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_provisioning_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_timeline.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/app_insights_commands/test_query_fabric_dap_timeline_async.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_context → agentic_devtools-0.2.119/tests/unit/cli/azure/auth}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/auth/test_detect_account_type.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/auth/test_ensure_azure_account.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/auth/test_get_current_azure_account.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/auth/test_is_aza_account.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/auth/test_switch_azure_account.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/auth/test_verify_azure_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_context/commands → agentic_devtools-0.2.119/tests/unit/cli/azure/config}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/config/test_get_account_for_environment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure/config/test_get_app_insights_config.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_context/config → agentic_devtools-0.2.119/tests/unit/cli/azure_context}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_context/management → agentic_devtools-0.2.119/tests/unit/cli/azure_context/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/commands/test_azure_context_current_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/commands/test_azure_context_ensure_login_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/commands/test_azure_context_status_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/commands/test_azure_context_use_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops → agentic_devtools-0.2.119/tests/unit/cli/azure_context/config}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/config/test_get_context_config.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/approve_files → agentic_devtools-0.2.119/tests/unit/cli/azure_context/management}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/management/test_check_login_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/management/test_ensure_logged_in.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/management/test_get_context_env.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/management/test_get_current_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/management/test_run_with_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/management/test_show_all_contexts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_context/management/test_switch_context.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/async_commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/auth → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/approve_files}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/approve_files/test_approve_files_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/batch_review_helpers → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/async_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/_helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test__require_int_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_add_pull_request_comment_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_add_pull_request_comment_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_approve_file_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_approve_file_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_approve_pull_request_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_approve_pull_request_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_checkout_and_sync_branch_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_confirm_suggestion_addressed_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_create_pipeline_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_create_pull_request_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_create_pull_request_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_generate_review_prompts_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_get_pipeline_id_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_details_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_threads_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_get_pull_request_threads_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_get_run_details_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_list_pipelines_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_lookup_jira_issue_from_pr_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_lookup_pr_from_jira_issue_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_mark_file_reviewed_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_mark_pull_request_draft_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_publish_pull_request_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_reject_suggestion_resolution_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_reply_to_pull_request_thread_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_reply_to_pull_request_thread_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_request_changes_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_request_changes_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_request_changes_with_suggestion_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_request_changes_with_suggestion_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_resolve_thread_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_resolve_thread_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_run_e2e_tests_fabric_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_run_e2e_tests_synapse_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_run_wb_patch_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_setup_pull_request_review_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_submit_reviews_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_submit_reviews_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_update_pipeline_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/async_commands/test_wait_for_run_async.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/auth}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/auth/test_get_auth_headers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/auth/test_get_pat.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/config → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/batch_review_helpers}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/batch_review_helpers/test__is_empty_or_whitespace.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/batch_review_helpers/test__validate_suggestion_fields.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/batch_review_helpers/test_resolve_batch_reviews.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/batch_review_helpers/test_validate_batch_reviews.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/file_review_commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test__extract_issue_key_from_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_add_pull_request_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_approve_pull_request.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_create_pull_request.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_get_pull_request_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_mark_pull_request_draft.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_parse_bool_from_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_publish_pull_request.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_reply_to_pull_request_thread.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_require_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_resolve_thread.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/commands/test_update_review_narrative.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/config}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/config/test__parse_azure_devops_context_from_remote_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/config/test_azure_devops_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/config/test_constants.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/config/test_get_azure_devops_context_from_git_remote.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/config/test_get_repository_name_from_git_remote.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/conftest.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/classification → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/file_review_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test__complete_active_session.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test__get_attribution_params.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test__get_queue_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test__process_file_parallel.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test__update_queue_after_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test__validate_suggestion_fields.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test_approve_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test_get_queue_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test_print_next_file_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test_request_changes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test_request_changes_with_suggestion.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test_submit_reviews.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/file_review_commands/test_trigger_in_progress_for_file.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/convergence → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/identity → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization/classification}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/classification/test__extract_first_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/classification/test__get_author_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/classification/test__process_thread_first_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/classification/test__scan_activity_log_replies.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/classification/test_classify_eligible_comments.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/models → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization/convergence}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/convergence/test__compute_activity_log_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/convergence/test__compute_file_summary_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/convergence/test__compute_overall_summary_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/convergence/test_check_convergence.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/convergence/test_compute_expected_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/convergence/test_normalize_for_comparison.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/orchestrator → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization/identity}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/identity/test_resolve_pat_identity.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/repair → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization/models}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/models/test_comment_key.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/models/test_finalizationreport.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/reporting → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization/orchestrator}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/orchestrator/test__build_report.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/orchestrator/test__check_timeout.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/orchestrator/test__collect_all_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/orchestrator/test__count_eligible.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/orchestrator/test__fetch_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/orchestrator/test_run_finalization_pass.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/finalization/verification → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization/repair}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/repair/test__cascade_overall_summary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/repair/test__complete_activity_log.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/repair/test__patch_file_thread_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/repair/test__targeted_repair_activity_log.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/repair/test_batch_repair_pass.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/repair/test_targeted_repair.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/helpers → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization/reporting}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/reporting/test_build_finalization_report.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/mark_reviewed → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/finalization/verification}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/verification/test__collect_all_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/verification/test__fetch_comment_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/finalization/verification/test_verify_convergence.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/marker → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/helpers}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test__get_repository_id_via_rest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_build_thread_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_convert_to_pull_request_title.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_find_jira_issue_from_pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_find_pr_from_jira_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_find_pull_request_by_issue_key.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_get_pull_request_changed_files.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_get_pull_request_details.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_get_pull_request_source_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_get_repository_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_parse_bool_from_state_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_parse_json_response.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_patch_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_patch_thread_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_print_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_require_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_require_requests.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_resolve_review_artifact_dir_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_resolve_thread_by_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/helpers/test_verify_az_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/pipeline_commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/mark_reviewed}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/mark_reviewed/test_cachedreviewercontext.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/mark_reviewed/test_fetch_reviewer_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/mark_reviewed/test_mark_file_reviewed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/mark_reviewed/test_mark_file_reviewed_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/mark_reviewed/test_normalize_repo_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/mark_reviewed/test_set_batch_context.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/pr_summary_commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/marker}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/marker/test__get_first_comment_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/marker/test_build_marker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/marker/test_classify_agdt_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/marker/test_filter_agdt_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/marker/test_has_agdt_marker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/marker/test_parse_marker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/marker/test_strip_marker_line.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/pull_request_details_commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/pipeline_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pipeline_commands/test_create_pipeline.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pipeline_commands/test_get_pipeline_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pipeline_commands/test_list_pipelines.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pipeline_commands/test_run_e2e_tests_fabric.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pipeline_commands/test_run_e2e_tests_synapse.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pipeline_commands/test_run_wb_patch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pipeline_commands/test_update_pipeline.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/request_changes_batch → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/pr_summary_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pr_summary_commands/test_generate_overarching_pr_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pr_summary_commands/test_generate_overarching_pr_comments_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_attribution → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/pull_request_details_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_change_tracking_id_for_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_current_user_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_iteration_change_tracking_map.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_iteration_changes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_details.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_iterations.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_pull_request_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_reviewer_payload.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_get_viewed_files_via_contribution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_invoke_ado_rest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/pull_request_details_commands/test_invoke_ado_rest_post.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/request_changes_batch}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/request_changes_batch/test_request_changes_batch_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_config → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_attribution}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_attribution/test_build_commit_file_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_attribution/test_build_commit_folder_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_attribution/test_build_commit_pr_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_attribution/test_format_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_attribution/test_get_model_icon.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_attribution/test_render_attribution_line.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_attribution/test_should_use_emoji.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_helpers → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_build_reviewed_paths_set.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_checkout_and_sync_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_convert_to_prompt_filename.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_extract_jira_issue_key_from_title.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_fetch_and_display_jira_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_fetch_pull_request_basic_info.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_filter_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_generate_review_prompts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_get_jira_issue_key_from_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_get_linked_pull_request_from_jira.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_get_pull_request_id_from_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_get_root_folder.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_get_threads_for_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_normalize_repo_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_print_review_instructions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_scaffold_threads_for_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_setup_pull_request_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_commands/test_write_file_prompt.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_jira → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_config}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_config/test__matches_pattern.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_config/test__parse_int_field.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_config/test_compute_mechanical_consensus.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_config/test_default_review_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_config/test_filter_files.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_config/test_load_review_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_config/test_resolve_trigger_overrides.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_config/test_reviewconfig.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_models_config → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_helpers}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_build_full_file_content_section.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_build_reviewed_paths_set.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_convert_to_prompt_filename.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_extract_jira_issue_key_from_title.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_filter_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_get_agdt_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_get_language_from_extension.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_get_root_folder.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_get_threads_for_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_is_binary_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_normalize_repo_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_helpers/test_resolve_repository_root.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_prompts → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_jira}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test__get_jira_ssl_verify.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_display_jira_issue_summary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_extract_linked_pr_from_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_extract_pr_id_from_development_panel.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_fetch_and_display_jira_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_fetch_development_panel_prs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_fetch_jira_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_get_jira_credentials.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_get_linked_pull_request_from_jira.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_jira/test_get_pr_from_development_panel.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_scaffold → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_models_config}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_models_config/test_ensure_default_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_models_config/test_load_review_models_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_models_config/test_reviewmodelsconfig.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_state → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_prompts}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_prompts/test_build_file_prompt_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_prompts/test_generate_review_prompts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_prompts/test_generate_review_prompts_edge_cases.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_prompts/test_get_prompts_output_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_prompts/test_print_review_instructions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_prompts/test_write_file_prompt.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/review_templates → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_scaffold}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__append_path_to_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__build_pr_base_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__check_session_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__create_session.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__demote_main_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__format_activity_log_entry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__fresh_scaffold.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__get_file_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__get_folder_for_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__get_thread_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__incremental_rescaffold.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__mark_stale_sessions_failed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__patch_comment_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__post_activity_log_entry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__post_reply.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__post_thread.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__print_dry_run_plan.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__update_activity_log_comment_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test__validate_with_git_diff.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test_detect_file_changes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test_filechangeresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test_scaffold_idempotency_scenarios.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_scaffold/test_scaffold_review_threads.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/run_details_commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_state}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test__atomic_write_json.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test__get_lock_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_add_suggestion_to_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_clear_suggestions_for_re_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_compute_aggregate_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_fileentry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_fileentry_multi_model.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_folderentry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_foldergroup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_get_file_entry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_get_folder_entry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_get_review_state_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_load_from_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_load_review_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_locking_behavior.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_modelverdict.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_normalize_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_overallsummary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_read_modify_write_review_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_reviewsession.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_reviewstate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_reviewstate_multi_model.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_reviewstatus.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_save_review_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_skippedfile.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_suggestionentry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_sync_review_state_from_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_update_file_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_state/test_validate_and_deserialize.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/status_cascade → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/review_templates}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_templates/test_build_discussion_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_templates/test_render_file_summary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_templates/test_render_model_review_progress_table.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/review_templates/test_render_overall_summary.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/suggestion_commands → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/run_details_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_build_run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_build_timeline.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_failed_job_logs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_pipeline_run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_fetch_task_log.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_get_failed_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_get_run_details.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_get_run_details_impl.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_is_run_finished.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_print_failed_logs_summary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_print_parameters.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_print_summary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_save_json.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_save_log_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_wait_for_run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/run_details_commands/test_wait_for_run_impl.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/suggestion_verification → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/status_cascade}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/status_cascade/test_cascade_overall_summary_update.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/status_cascade/test_cascade_status_update.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/status_cascade/test_derive_overall_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/status_cascade/test_execute_cascade.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/status_cascade/test_patch_operation.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/verdict_protocol → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/suggestion_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_commands/test_confirm_suggestion_addressed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_commands/test_reject_suggestion_resolution.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/azure_devops/vpn_toggle → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/suggestion_verification}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_verification/test_categorize_all_suggestions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_verification/test_fetch_threads_lookup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_verification/test_has_unaddressed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_verification/test_partition_results.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_verification/test_render_abort_summary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_verification/test_render_unaddressed_thread_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_verification/test_suggestionverificationresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/suggestion_verification/test_verify_previous_suggestions.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/cert_utils → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/verdict_protocol}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/verdict_protocol/test_compute_file_effective_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/verdict_protocol/test_evaluate_consolidation_need.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/verdict_protocol/test_initialize_model_verdicts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/verdict_protocol/test_record_verdict.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/verdict_protocol/test_render_consolidation_decision.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/verdict_protocol/test_render_reviewer_addendum.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci → agentic_devtools-0.2.119/tests/unit/cli/azure_devops/vpn_toggle}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_check_network_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_connect_vpn.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_disconnect_vpn.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_ensure_jira_vpn_access.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_get_corporate_network_test_host.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_get_vpn_hostnames.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_get_vpn_url_from_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_is_on_corporate_network.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_is_pulse_secure_installed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_is_vpn_connected.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_reconnect_vpn.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_smart_connect_vpn.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_off_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_off_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_on_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_on_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_status_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/azure_devops/vpn_toggle/test_vpn_status_cmd.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/ado_provider → agentic_devtools-0.2.119/tests/unit/cli/cert_utils}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/cert_utils/test__print_ssl_error_help.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/cert_utils/test_count_certificates_in_pem.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/cert_utils/test_ensure_ca_bundle.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/cert_utils/test_ensure_ca_bundle_force.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/cert_utils/test_fetch_certificate_chain_openssl.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/cert_utils/test_fetch_certificate_chain_ssl.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/cert_utils/test_get_ssl_verify.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/cert_utils/test_ssl_request_with_retry.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/commands → agentic_devtools-0.2.119/tests/unit/cli/ci}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator → agentic_devtools-0.2.119/tests/unit/cli/ci/ado_provider}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/ado_provider/test_azuredevopsprovider.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/actions → agentic_devtools-0.2.119/tests/unit/cli/ci/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/commands/test_ai_pr_loop_command_missing_dep.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/commands/test_ci_paths_golden_smoke.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/commands/test_feature_flag.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/commands/test_speckit_trigger_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/classifier → agentic_devtools-0.2.119/tests/unit/cli/ci/evaluator}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/command → agentic_devtools-0.2.119/tests/unit/cli/ci/evaluator/actions}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/actions/test_agentic_fallback.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/actions/test_dispatch_action.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/actions/test_no_action.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/actions/test_synthesize_sentinel.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/actions/test_trigger_re_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/actions/test_verify_and_resolve.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/diff_heuristic → agentic_devtools-0.2.119/tests/unit/cli/ci/evaluator/classifier}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/classifier/test_classify_post_agent_state.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/lock → agentic_devtools-0.2.119/tests/unit/cli/ci/evaluator/command}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/command/test_evaluate_post_agent_state_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/models → agentic_devtools-0.2.119/tests/unit/cli/ci/evaluator/diff_heuristic}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/diff_heuristic/test_check_lines_modified.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/evaluator/snapshot → agentic_devtools-0.2.119/tests/unit/cli/ci/evaluator/lock}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/lock/test__get_writer_token.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/lock/test_acquire_lock.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/lock/test_check_lock_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/lock/test_release_lock.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/exceptions → agentic_devtools-0.2.119/tests/unit/cli/ci/evaluator/models}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/models/test_commentinfo.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/models/test_evaluationresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/models/test_postagentaction.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/models/test_postagentclassification.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/models/test_postagentsnapshot.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/models/test_threadinfo.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/github_provider → agentic_devtools-0.2.119/tests/unit/cli/ci/evaluator/snapshot}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/snapshot/test__get_latest_agent_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/snapshot/test__get_review_thread_statuses.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/snapshot/test__has_evaluator_sentinel_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/evaluator/snapshot/test_build_snapshot.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/guards → agentic_devtools-0.2.119/tests/unit/cli/ci/exceptions}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/exceptions/test_malformedeventerror.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/exceptions/test_providerratelimiterror.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/models → agentic_devtools-0.2.119/tests/unit/cli/ci/github_provider}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__build_comment_verification_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__build_repair_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__build_verification_context_diff.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__clean_sdk_commit_message.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__generate_commit_message_via_sdk.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__has_existing_addressed_reply.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__list_addressed_reply_parent_comment_ids.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__parse_paginated_json.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__resolve_conflicted_file_content_via_sdk.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__resolve_rebase_conflicts_via_sdk.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test__verify_comment_via_sdk.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_approve_pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_finalize_post_repair.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_find_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_get_check_annotations.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_get_commit_range_diff.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_get_pr_diff.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_get_pr_metadata.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_list_check_runs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_list_issue_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_list_pr_files.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_list_pr_issue_events.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_list_review_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_list_review_thread_states.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_list_reviews.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_merge_pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_parse_event.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_parse_event_label.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_post_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_publish_pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_request_reviewer.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_retry_integration.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_squash_before_publish.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/github_provider/test_update_comment.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/orchestrator → agentic_devtools-0.2.119/tests/unit/cli/ci/guards}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/guards/test_check_cycle_limit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/guards/test_check_deduplication.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/guards/test_check_docker_files.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/guards/test_check_exclusion_labels.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/guards/test_check_fork_pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/guards/test_check_privileged_paths.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/guards/test_get_dedup_writer_token.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/guards/test_squash_wait_marker.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/patch_handler → agentic_devtools-0.2.119/tests/unit/cli/ci/models}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_checkrunstatus.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_commentresolution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_copilot_reviewer_login.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_eventpayload.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_finalizationresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_prmetadata.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_repairdecision.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_reviewcommentinfo.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_reviewinfo.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/models/test_verificationverdict.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/provider → agentic_devtools-0.2.119/tests/unit/cli/ci/orchestrator}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test__dispatch_repair.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test__emit_decision_summary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test__evaluate_repair_decision.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test__get_copilot_review_request_skip_reason.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test__latest_copilot_review_on_head.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test__normalize_review_body.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test__parse_iso8601_timestamp.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_blocked.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_malformed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_no_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test_run_ai_pr_loop_ready.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/orchestrator/test_squash_wait_flow.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/retry → agentic_devtools-0.2.119/tests/unit/cli/ci/patch_handler}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/ci/speckit_trigger → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/config → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/config/project_config → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/approve}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/copilot → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/dispatch_repair}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/copilot/auto_start → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/guards}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/copilot/session → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/merge}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/git → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/publish}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/git/agdt_branch → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/request_review}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/git/async_commands → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/resolve_threads}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/git/commands → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/actions/squash}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/git/core → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/command}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/git/diff → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/models}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/git/operations → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/runner}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/session_detector}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/async_commands → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/snapshot}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/copilot_review_status → agentic_devtools-0.2.119/tests/unit/cli/ci/pipeline/summary}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/issue_commands → agentic_devtools-0.2.119/tests/unit/cli/ci/provider}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/provider/test_ciplatformprovider.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/provider/test_ciplatformprovider_integration.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/pr_approve → agentic_devtools-0.2.119/tests/unit/cli/ci/retry}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/retry/test_retry_with_backoff.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/pr_checks_status → agentic_devtools-0.2.119/tests/unit/cli/ci/speckit_trigger}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/ci/speckit_trigger/test_process_speckit_label_event.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/pr_merge → agentic_devtools-0.2.119/tests/unit/cli/config}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/pr_poll_ready → agentic_devtools-0.2.119/tests/unit/cli/config/project_config}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/config/project_config/test__get_config_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/config/project_config/test_get_project_config_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/config/project_config/test_load_project_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/config/project_config/test_save_project_config.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/pr_state → agentic_devtools-0.2.119/tests/unit/cli/copilot}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/repo_resolution → agentic_devtools-0.2.119/tests/unit/cli/copilot/auto_start}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/auto_start/test__is_retryable_win_error.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/auto_start/test__is_run_triggered.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/auto_start/test__mark_run_triggered.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/auto_start/test__read_model_from_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/auto_start/test__run_copilot_with_retry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/auto_start/test__unmark_run_triggered.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/auto_start/test_copilot_auto_start_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/auto_start/test_retry_autostart_cmd.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/request_copilot_review → agentic_devtools-0.2.119/tests/unit/cli/copilot/session}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test__build_copilot_args.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test__emit_log_marker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test__get_copilot_binary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test__get_jsonl_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test_build_copilot_args.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test_copilotsessionresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test_get_default_copilot_model.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test_is_gh_copilot_available.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/copilot/session/test_start_copilot_session.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/rerun_checks → agentic_devtools-0.2.119/tests/unit/cli/git}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/resolve_review_threads → agentic_devtools-0.2.119/tests/unit/cli/git/agdt_branch}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__branch_exists_locally.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__branch_exists_remotely.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__discover_workflow_files.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__fetch_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__get_parent_sha.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__get_repo_root.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__has_matching_run_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__read_commit_message.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__read_tree_for_commit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__reset_dirty.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test__run_plumbing.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_build_tree.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_create_commit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_gitplumbingerror.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_hash_object.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_is_dirty.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_load_workflow_artifacts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_mark_dirty.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_persist_if_dirty.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_persist_workflow_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_persistresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_push_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_read_blob.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_read_branch_tree.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_resolve_worktree_key.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/agdt_branch/test_update_ref.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/review_reply → agentic_devtools-0.2.119/tests/unit/cli/git/async_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/async_commands/_helpers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/async_commands/test_amend_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/async_commands/test_commit_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/async_commands/test_force_push_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/async_commands/test_publish_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/async_commands/test_push_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/async_commands/test_stage_async.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/github/state_helpers → agentic_devtools-0.2.119/tests/unit/cli/git/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test__get_issue_key_from_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test__mark_checklist_items_completed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test__sync_with_main.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test__trigger_implementation_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test_amend_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test_commit_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test_force_push_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test_publish_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test_push_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/commands/test_stage_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/conftest.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira → agentic_devtools-0.2.119/tests/unit/cli/git/core}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/core/test_get_bool_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/core/test_get_commit_message.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/core/test_get_current_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/core/test_run_git.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/core/test_temp_message_file.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/adf → agentic_devtools-0.2.119/tests/unit/cli/git/diff}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test__is_diff_file_header.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_addedline.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_addedlinesinfo.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_diffentry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_difflinesinfo.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_get_added_lines_info.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_get_diff_entries.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_get_diff_lines_info.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_get_diff_patch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_get_removed_lines_info.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_normalize_ref_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_removedline.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_removedlinesinfo.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/diff/test_sync_git_ref.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/async_commands → agentic_devtools-0.2.119/tests/unit/cli/git/operations}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_amend_commit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_branch_has_commits_ahead_of_main.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_branchsafetycheckresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_check_branch_safe_to_recreate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_checkout_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_checkoutresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_create_commit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_delete_local_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_fetch_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_fetch_main.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_force_push.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_get_commits_behind_main.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_get_files_changed_on_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_get_last_commit_message.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_get_short_commit_hash.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_has_local_changes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_last_commit_contains_issue_key.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_local_branch_matches_origin.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_publish_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_push.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_rebase_onto_main.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_rebaseresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_rename_local_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_reset_branch_to_origin.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_should_amend_instead_of_commit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/git/operations/test_stage_changes.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/async_status → agentic_devtools-0.2.119/tests/unit/cli/github}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/comment_commands → agentic_devtools-0.2.119/tests/unit/cli/github/async_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_bug_issue_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_bug_issue_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_documentation_issue_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_documentation_issue_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_feature_issue_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_feature_issue_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_issue_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_issue_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_task_issue_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/async_commands/test_create_agdt_task_issue_async_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/config → agentic_devtools-0.2.119/tests/unit/cli/github/copilot_review_status}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/copilot_review_status/test__classify_review_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/copilot_review_status/test__count_inline_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/copilot_review_status/test__count_suppressed_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/copilot_review_status/test__fetch_reviews_for_pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/copilot_review_status/test__select_latest_copilot_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/copilot_review_status/test_copilot_review_status_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/copilot_review_status/test_get_copilot_review_status.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/create_commands → agentic_devtools-0.2.119/tests/unit/cli/github/issue_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test__append_related_issues.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test__append_terminal_log.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test__build_gh_create_args.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test__check_gh_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test__get_environment_info.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test__gh_supports_issue_type.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test_create_agdt_bug_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test_create_agdt_documentation_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test_create_agdt_feature_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test_create_agdt_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/issue_commands/test_create_agdt_task_issue.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/formatting → agentic_devtools-0.2.119/tests/unit/cli/github/pr_approve}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_approve/test__check_gh_available.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_approve/test__resolve_current_user.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_approve/test__submit_approval.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_approve/test__validate_repo_format.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_approve/test__verify_approval.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_approve/test_approve_pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_approve/test_pr_approve_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/get_commands → agentic_devtools-0.2.119/tests/unit/cli/github/pr_checks_status}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_checks_status/test__classify_checks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_checks_status/test__fetch_check_suites.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_checks_status/test__fetch_pr_checks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_checks_status/test__normalize_repo.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_checks_status/test__reconcile_results.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_checks_status/test__verify_check_suites.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_checks_status/test_get_pr_checks_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_checks_status/test_pr_checks_status_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/helpers → agentic_devtools-0.2.119/tests/unit/cli/github/pr_merge}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_merge/test__check_gh_available.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_merge/test__classify_merge_error.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_merge/test__execute_merge.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_merge/test__verify_merge.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_merge/test_merge_pr.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_merge/test_pr_merge_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/parse_error_report → agentic_devtools-0.2.119/tests/unit/cli/github/pr_poll_ready}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_poll_ready/test__evaluate_iteration.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_poll_ready/test__should_rerun_checks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_poll_ready/test_poll_pr_ready.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_poll_ready/test_pr_poll_ready_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/role_commands → agentic_devtools-0.2.119/tests/unit/cli/github/pr_state}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_state/test__evaluate_terminal_condition.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_state/test__fetch_pr_with_retry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_state/test_get_pr_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/pr_state/test_pr_state_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/state_helpers → agentic_devtools-0.2.119/tests/unit/cli/github/repo_resolution}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/repo_resolution/test__repo_from_git_remote.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/repo_resolution/test__resolve_repo_from_git_remote.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/repo_resolution/test__validate_repo_format.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/repo_resolution/test_resolve_github_repo.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/update_commands → agentic_devtools-0.2.119/tests/unit/cli/github/request_copilot_review}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/request_copilot_review/test__check_login_in_response.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/request_copilot_review/test__check_reviewer_in_reviews.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/request_copilot_review/test__login_matches.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/request_copilot_review/test__post_review_request.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/request_copilot_review/test__verify_reviewer_requested.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/request_copilot_review/test_request_copilot_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/request_copilot_review/test_request_copilot_review_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/jira/vpn_wrapper → agentic_devtools-0.2.119/tests/unit/cli/github/rerun_checks}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/rerun_checks/test__fetch_workflow_runs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/rerun_checks/test__filter_failed_runs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/rerun_checks/test__rerun_single_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/rerun_checks/test_rerun_checks_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/rerun_checks/test_rerun_failed_checks.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/network → agentic_devtools-0.2.119/tests/unit/cli/github/resolve_review_threads}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/resolve_review_threads/test__fetch_review_comment_ids.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/resolve_review_threads/test__fetch_review_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/resolve_review_threads/test__map_comments_to_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/resolve_review_threads/test__resolve_and_verify.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/resolve_review_threads/test__resolve_thread.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/resolve_review_threads/test_resolve_review_threads.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/resolve_review_threads/test_resolve_review_threads_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/network/commands → agentic_devtools-0.2.119/tests/unit/cli/github/review_reply}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/review_reply/test__check_gh_available.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/review_reply/test__load_replies_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/review_reply/test__post_single_reply.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/review_reply/test__retry_failed_replies.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/review_reply/test__validate_reply_entries.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/review_reply/test__verify_replies.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/review_reply/test_reply_to_review_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/review_reply/test_reply_to_review_comments_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/network/detection → agentic_devtools-0.2.119/tests/unit/cli/github/state_helpers}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/state_helpers/test_get_issue_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/github/state_helpers/test_set_issue_value.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/release → agentic_devtools-0.2.119/tests/unit/cli/jira}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/release/commands → agentic_devtools-0.2.119/tests/unit/cli/jira/adf}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/adf/test__convert_adf_to_text.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/adf/test__process_adf_children.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/release/helpers → agentic_devtools-0.2.119/tests/unit/cli/jira/async_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_add_comment_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_add_comment_async_cli.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_add_users_to_project_role_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_add_users_to_project_role_batch_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_check_user_exists_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_check_users_exist_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_create_epic_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_create_issue_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_create_subtask_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_find_role_id_by_name_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_get_issue_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_get_project_role_details_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_list_project_roles_async.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_commands/test_update_issue_async.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/review → agentic_devtools-0.2.119/tests/unit/cli/jira/async_status}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_status/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/async_status/test_write_async_status.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/review/commands → agentic_devtools-0.2.119/tests/unit/cli/jira/comment_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/comment_commands/test_add_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/comment_commands/test_add_comment_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/review/config_commands → agentic_devtools-0.2.119/tests/unit/cli/jira/config}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/config/test_build_jira_issue_pattern.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/config/test_get_jira_auth_header.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/config/test_get_jira_base_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/config/test_get_jira_headers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/config/test_get_jira_project_keys.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/conftest.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/review/consolidate → agentic_devtools-0.2.119/tests/unit/cli/jira/create_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/create_commands/test_create_epic.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/create_commands/test_create_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/create_commands/test_create_issue_sync.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/create_commands/test_create_subtask.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/review/dispatch → agentic_devtools-0.2.119/tests/unit/cli/jira/formatting}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/formatting/test_build_user_story_description.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/formatting/test_format_bullet_list.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/formatting/test_merge_labels.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/review/status → agentic_devtools-0.2.119/tests/unit/cli/jira/get_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/get_commands/test__fetch_epic.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/get_commands/test__fetch_parent_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/get_commands/test__fetch_remote_links.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/get_commands/test_get_issue.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/runner → agentic_devtools-0.2.119/tests/unit/cli/jira/helpers}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__count_certificates_in_pem.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__ensure_jira_pem.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__fetch_certificate_chain_openssl.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__fetch_certificate_chain_ssl.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__get_repo_jira_pem_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__get_requests.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__get_ssl_verify.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__get_temp_jira_pem_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__parse_comma_separated.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/helpers/test__parse_multiline_string.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup → agentic_devtools-0.2.119/tests/unit/cli/jira/parse_error_report}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/parse_error_report/test_get_user_details.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/parse_error_report/test_get_user_details_api_calls.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/parse_error_report/test_parse_error_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/parse_error_report/test_parse_error_file_combined_errors.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/parse_error_report/test_parse_error_file_multiple_dataproducts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/parse_error_report/test_parse_jira_error_report_integration.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/commands → agentic_devtools-0.2.119/tests/unit/cli/jira/role_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_add_users_to_project_role.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_add_users_to_project_role_additional_cases.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_add_users_to_project_role_batch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_check_user_exists.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_check_user_exists_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_check_users_exist.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_check_users_exist_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_check_users_exist_command_paths.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_find_role_id_by_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_get_project_role_details.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_get_project_role_details_command_paths.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_list_project_roles.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_list_project_roles_command_paths.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_role_commands_error_handling.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/role_commands/test_role_id_extraction.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/copilot_cli_installer → agentic_devtools-0.2.119/tests/unit/cli/jira/state_helpers}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/state_helpers/test_get_jira_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/state_helpers/test_set_jira_value.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/dependency_checker → agentic_devtools-0.2.119/tests/unit/cli/jira/update_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/update_commands/test__build_update_payload.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/update_commands/test_update_issue.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/gh_cli_installer → agentic_devtools-0.2.119/tests/unit/cli/jira/vpn_wrapper}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context_decorator.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/jira/vpn_wrapper/test_with_jira_vpn_context_integration.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/gitignore_negations → agentic_devtools-0.2.119/tests/unit/cli/network}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/platform_detection → agentic_devtools-0.2.119/tests/unit/cli/network/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/network/commands/test_network_status_cmd.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/pr_workflow → agentic_devtools-0.2.119/tests/unit/cli/network/detection}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/network/detection/test_detect_network_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/network/detection/test_get_network_context_display.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators → agentic_devtools-0.2.119/tests/unit/cli/release}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/atomic_write → agentic_devtools-0.2.119/tests/unit/cli/release/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/release/commands/test_release_pypi_async.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/complete_setup → agentic_devtools-0.2.119/tests/unit/cli/release/helpers}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/release/helpers/test_build_distribution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/release/helpers/test_compute_sha256.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/release/helpers/test_normalize_package_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/release/helpers/test_pypi_version_exists.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/release/helpers/test_upload_distribution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/release/helpers/test_validate_distribution.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/configured_setup → agentic_devtools-0.2.119/tests/unit/cli/review}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/gitignore_updater → agentic_devtools-0.2.119/tests/unit/cli/review/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/commands/test_build_parser.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/commands/test_main.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/legacy_migration → agentic_devtools-0.2.119/tests/unit/cli/review/config_commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/config_commands/test__config_to_dict.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/config_commands/test__resolve_repo_root.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/config_commands/test_run_config_get.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/config_commands/test_run_config_validate.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/repo_specific → agentic_devtools-0.2.119/tests/unit/cli/review/consolidate}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/consolidate/test__apply_resolution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/consolidate/test__build_consolidation_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/consolidate/test__invoke_consolidator_model.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/consolidate/test__load_amendment_replies.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/consolidate/test_run_consolidate.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/required_setup → agentic_devtools-0.2.119/tests/unit/cli/review/dispatch}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/dispatch/test__check_files_need_consolidation.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/dispatch/test__invoke_consolidation.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/dispatch/test__invoke_reviewer.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/dispatch/test__print_dispatch_plan.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/dispatch/test_run_dispatch.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/script_generators/root_entry_point → agentic_devtools-0.2.119/tests/unit/cli/review/status}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/review/status/test_run_status.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/shell_profile → agentic_devtools-0.2.119/tests/unit/cli/runner}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/runner/test_command_map.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/runner/test_command_map_integrity.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/runner/test_main.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/runner/test_main_entry_point.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/runner/test_run_as_script.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/runner/test_run_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/version_guard → agentic_devtools-0.2.119/tests/unit/cli/setup}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/setup/workflow_templates → agentic_devtools-0.2.119/tests/unit/cli/setup/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__build_unified_ca_bundle.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__generate_setup_scripts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__persist_env_vars_to_profile.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__persist_single_var.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__prefetch_certs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__print_manual_instructions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__print_path_instructions_if_needed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__prompt_copilot_model.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__prompt_project_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__query_copilot_models.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test__valid_issue_adapters_fallback.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test_setup_certs_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test_setup_check_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test_setup_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test_setup_copilot_cli_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/commands/test_setup_gh_cli_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/conftest.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit → agentic_devtools-0.2.119/tests/unit/cli/setup/copilot_cli_installer}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/copilot_cli_installer/test_detect_platform_asset.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/copilot_cli_installer/test_download_and_install.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/copilot_cli_installer/test_get_copilot_cli_binary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/copilot_cli_installer/test_get_installed_version.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/copilot_cli_installer/test_get_latest_release_info.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/copilot_cli_installer/test_install_copilot_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/commands → agentic_devtools-0.2.119/tests/unit/cli/setup/dependency_checker}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/dependency_checker/test__find_binary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/dependency_checker/test__get_version.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/dependency_checker/test__run_version.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/dependency_checker/test_check_all_dependencies.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/dependency_checker/test_dependencystatus.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/dependency_checker/test_print_dependency_report.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/cross_ref → agentic_devtools-0.2.119/tests/unit/cli/setup/gh_cli_installer}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/gh_cli_installer/test_detect_platform_asset.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/gh_cli_installer/test_download_and_install.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/gh_cli_installer/test_get_gh_cli_binary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/gh_cli_installer/test_get_installed_version.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/gh_cli_installer/test_get_latest_release_info.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/gh_cli_installer/test_install_gh_cli.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2 → agentic_devtools-0.2.119/tests/unit/cli/setup/gitignore_negations}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/gitignore_negations/test__detect_newline.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/gitignore_negations/test_ensure_root_gitignore_negations.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/constants → agentic_devtools-0.2.119/tests/unit/cli/setup/platform_detection}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/platform_detection/test__get_origin_remote_url.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/platform_detection/test_confirm_and_override.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/platform_detection/test_detect_platforms.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/platform_detection/test_detectionresult.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/coverage_mapper → agentic_devtools-0.2.119/tests/unit/cli/setup/pr_workflow}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/pr_workflow/test__resolve_branch_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/pr_workflow/test_run_setup_with_pr_workflow.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/models → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/reporter → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators/atomic_write}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/atomic_write/test_concurrent_writes.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/spec_parser → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators/complete_setup}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/complete_setup/test_generate_complete_setup.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/task_classifier → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators/configured_setup}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/configured_setup/test_generate_configured_setup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/configured_setup/test_render_tool_installs.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_e2/validator → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators/gitignore_updater}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/gitignore_updater/test_update_gitignore.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators/legacy_migration}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/legacy_migration/test_detect_legacy.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/legacy_migration/test_migrate_content.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/classifier → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators/repo_specific}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/repo_specific/test_never_overwrite.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/constants → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators/required_setup}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/required_setup/test__site_packages_dirs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/required_setup/test_cleanup_artifacts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/required_setup/test_detect_corrupted_artifacts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/required_setup/test_generate_required_setup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/required_setup/test_install_package.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/required_setup/test_setup_git_hooks.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/extractors → agentic_devtools-0.2.119/tests/unit/cli/setup/script_generators/root_entry_point}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/script_generators/root_entry_point/test_generate_root_entry_point.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/extractors/base → agentic_devtools-0.2.119/tests/unit/cli/setup/shell_profile}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/shell_profile/test_detect_shell_profile.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/shell_profile/test_detect_shell_type.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/shell_profile/test_persist_env_var.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/shell_profile/test_persist_path_entry.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/extractors/python_extractor → agentic_devtools-0.2.119/tests/unit/cli/setup/version_guard}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/version_guard/test__fallback_compare.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/version_guard/test__segment_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/version_guard/test_check_version_guard.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/version_guard/test_compare_versions.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/intent_detector → agentic_devtools-0.2.119/tests/unit/cli/setup/workflow_templates}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/workflow_templates/test_generate_default_templates.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/workflow_templates/test_list_available_templates.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/setup/workflow_templates/test_template_info.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/inventory → agentic_devtools-0.2.119/tests/unit/cli/speckit}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/matcher → agentic_devtools-0.2.119/tests/unit/cli/speckit/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test__load_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test__parse_args.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test__run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_analyze.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_checklist.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_clarify.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_constitution.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_implement.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_plan.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_specify.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/commands/test_speckit_taskstoissues.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/models → agentic_devtools-0.2.119/tests/unit/cli/speckit/cross_ref}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/cross_ref/test_cross_ref_command.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/reference_extractor → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_e2}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/pass_g/reporter → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_e2/constants}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/constants/test_test_task_keywords.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/constants/test_test_type_keywords.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/validate_checklists → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_e2/coverage_mapper}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/coverage_mapper/test_evaluate_coverage.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/coverage_mapper/test_generate_task_scoped_findings.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/coverage_mapper/test_map_test_tasks_to_frs.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/speckit/validate_frs → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_e2/models}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/models/test_models.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/state → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_e2/reporter}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/reporter/test_render_findings.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/reporter/test_render_test_coverage_summary.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/subprocess_utils → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_e2/spec_parser}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/spec_parser/test__extract_priority_from_section.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/spec_parser/test_build_us_to_fr_mapping.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/spec_parser/test_extract_frs_with_priority.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/spec_parser/test_parse_user_story_sections.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/tasks → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_e2/task_classifier}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/task_classifier/test__build_multi_word_pattern.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/task_classifier/test_classify_test_types.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/task_classifier/test_detect_ambiguous_task.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/task_classifier/test_extract_task_fr_refs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/task_classifier/test_is_test_task.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/tasks/commands → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_e2/validator}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/validator/test__parse_tasks_from_content.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/validator/test__print_human_output.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/validator/test__safe_print.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/validator/test_test_coverage_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_e2/validator/test_validate_test_coverage.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/testing → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/vpn → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/classifier}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/classifier/test__check_partial_match.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/classifier/test__should_skip.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/classifier/test_classify_references.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/vpn/commands → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/constants}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/constants/test_disambiguation_margin.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/constants/test_high_confidence_threshold.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/constants/test_max_candidates_per_reference.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/constants/test_new_symbol_noun_markers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/constants/test_new_symbol_verb_markers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/constants/test_performance_warning_seconds.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/constants/test_protected_file_patterns.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/constants/test_suggestion_threshold.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/vpn/runner → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/extractors}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/vscode_tasks → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/extractors/base}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/extractors/base/test_symbolextractor.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/extractors/python_extractor}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/extractors/python_extractor/test__file_to_module_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/extractors/python_extractor/test__parse_project_scripts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/extractors/python_extractor/test_pythonextractor.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows/advancement → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/intent_detector}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/intent_detector/test_detect_new_symbol_intent.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/intent_detector/test_detect_new_symbol_intent_noun.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows/base → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/inventory}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/inventory/test_build_inventory.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/inventory/test_build_inventory_extended.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/inventory/test_symbolinventory.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows/checklist → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/matcher}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/matcher/test_classify_match_confidence.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/matcher/test_exact_match.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/matcher/test_fuzzy_match.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/matcher/test_fuzzy_match_extended.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows/commands → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/models}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/models/test_candidate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/models/test_finding.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/models/test_matchstatus.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/models/test_reference.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/models/test_referencekind.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows/engine_resolution → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/reference_extractor}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/reference_extractor/test_classify_reference_kind.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/reference_extractor/test_extract_references.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/reference_extractor/test_extract_references_extended.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows/manager → agentic_devtools-0.2.119/tests/unit/cli/speckit/pass_g/reporter}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/reporter/test_render_json.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/reporter/test_render_markdown.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/pass_g/reporter/test_reporter_edge_cases.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows/preflight → agentic_devtools-0.2.119/tests/unit/cli/speckit/validate_checklists}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test__print_human_output.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test__resolve_issue_number.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test__resolve_paths.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test__verify_source_issue_marker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test_aggregateresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test_classify_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test_count_checkboxes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test_remediate_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test_validate_checklists.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test_validate_checklists_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_checklists/test_validate_file.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/cli/workflows/worktree_setup → agentic_devtools-0.2.119/tests/unit/cli/speckit/validate_frs}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_frs/test__coerce_max_retries.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_frs/test__resolve_max_retries.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_frs/test_check_coverage.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_frs/test_extract_frs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_frs/test_sort_fr_ids.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_frs/test_validate_frs.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_frs/test_validate_frs_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/speckit/validate_frs/test_validationresult.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/config → agentic_devtools-0.2.119/tests/unit/cli/state}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/state/test_clear_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/state/test_clear_workflow_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/state/test_delete_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/state/test_get_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/state/test_get_workflow_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/state/test_set_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/state/test_show_cmd.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/context → agentic_devtools-0.2.119/tests/unit/cli/subprocess_utils}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/subprocess_utils/test_run_safe.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/subprocess_utils/test_run_safe_integration.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/context/models → agentic_devtools-0.2.119/tests/unit/cli/tasks}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/context/nodes → agentic_devtools-0.2.119/tests/unit/cli/tasks/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_handle_task_completed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_helper_functions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_list_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_safe_print_unicode_error.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_show_other_incomplete_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_task_command_integration.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_task_id_argument.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_task_log.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_task_log_line_limits.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_task_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_task_wait.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_task_wait_value_error_handling.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_tasks_clean.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/tasks/commands/test_try_advance_pr_review_to_decision.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/context/retriever → agentic_devtools-0.2.119/tests/unit/cli/testing}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test__infer_test_file_from_source.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test__try_get_workspace_root.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_async_wrappers.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_create_test_file_parser.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_get_workspace_root.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_run_subprocess_with_streaming.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_run_tests.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_run_tests_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_run_tests_file_sync.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_run_tests_pattern.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_run_tests_quick.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_run_tests_quick_sync.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/testing/test_run_tests_sync.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/context_budget → agentic_devtools-0.2.119/tests/unit/cli/vpn}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/file_locking → agentic_devtools-0.2.119/tests/unit/cli/vpn/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/vpn/commands/test_vpn_run_cmd.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/mcp → agentic_devtools-0.2.119/tests/unit/cli/vpn/runner}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/vpn/runner/test__detect_vpn_requirement_from_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/vpn/runner/test__execute_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/vpn/runner/test_run_with_vpn_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/vpn/runner/test_vpnrequirement.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/mcp/server → agentic_devtools-0.2.119/tests/unit/cli/vscode_tasks}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/vscode_tasks/test_remove_auto_start_task.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration → agentic_devtools-0.2.119/tests/unit/cli/workflows}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/checkpointing → agentic_devtools-0.2.119/tests/unit/cli/workflows/advancement}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_branch_pushed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_commit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_jira_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_jira_issue_retrieved.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_pr_creation.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/advancement/test_try_advance_workflow_after_pr_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/applied_suggestions/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/applied_suggestions/test_appliedsuggestionentry.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/applied_suggestions/test_appliedsuggestionsstate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/applied_suggestions/test_get_applied_suggestions_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/applied_suggestions/test_load_applied_suggestions_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/applied_suggestions/test_load_from_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/applied_suggestions/test_save_applied_suggestions_state.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/graph_builder → agentic_devtools-0.2.119/tests/unit/cli/workflows/base}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/base/test__state_key_to_variable_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/base/test_advance_workflow_step.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/base/test_clear_state_for_workflow_initiation.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/base/test_collect_variables_from_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/base/test_initiate_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/base/test_validate_required_state.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/pilot_workflow → agentic_devtools-0.2.119/tests/unit/cli/workflows/checklist}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/test_checklist.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/test_checklistitem.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/test_get_checklist.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/test_get_checklist_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/test_initialize_checklist.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/test_mark_items_completed.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/test_parse_completed_items_arg.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/checklist/test_save_checklist.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/review → agentic_devtools-0.2.119/tests/unit/cli/workflows/commands}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__copy_review_state_to_apply_suggestions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__effective_argv.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__ensure_bootstrap_identity.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__execute_retrieve_step.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__fetch_issue_for_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__format_auto_setup_success_message.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__format_jira_issue_comments.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__format_jira_issue_prompt_fields.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__parse_bool_interactive.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test__stringify_jira_text_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_advance_pull_request_review_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_advance_work_on_jira_issue_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_advance_workflow_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_create_checklist_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_engine_langchain_routing.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_get_workflow_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_apply_pull_request_review_suggestions_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_break_down_issue_into_subtasks_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_create_jira_epic_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_create_jira_issue_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_create_jira_subtask_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_optimize_issue_for_ai_agent_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_pr_merge_orchestrator_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_pull_request_review_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_update_jira_issue_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_initiate_work_on_jira_issue_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_notify_workflow_event.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_setup_worktree_background_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_show_checklist_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/commands/test_update_checklist_cmd.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/review/graph_builder → agentic_devtools-0.2.119/tests/unit/cli/workflows/engine_resolution}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/engine_resolution/test_resolve_review_engine.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/review/nodes → agentic_devtools-0.2.119/tests/unit/cli/workflows/manager}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test__build_command_hint.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test__check_required_tasks_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test__render_failure_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test__render_step_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test__render_waiting_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test_get_next_step.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test_get_next_workflow_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test_get_next_workflow_prompt_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test_get_workflow_definition.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test_nextpromptresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test_notify_workflow_event.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/manager/test_promptstatus.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/review → agentic_devtools-0.2.119/tests/unit/cli/workflows}/preflight/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/preflight/test_check_worktree_and_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/preflight/test_generate_setup_instructions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/preflight/test_get_current_git_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/preflight/test_get_git_repo_root.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/preflight/test_perform_auto_setup.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/preflight/test_preflightresult.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/review/runner → agentic_devtools-0.2.119/tests/unit/cli/workflows/worktree_setup}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__cleanup_pending_auto_start_marker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__detect_git_root.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__detect_python_scripts_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__focus_vscode_window.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__maybe_inject_auto_start_before_vscode.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__print_agent_instructions_block.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__prompt_file_relative_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__propagate_agdt_cache.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__resolve_state_context_in_worktree.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__run_auto_execute_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__setup_worktree_from_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__shell_quote.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_apply_pr_suggestions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_create_jira_epic.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_create_jira_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_create_jira_subtask.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_pr_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_update_jira_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_work_on_jira_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__start_copilot_session_for_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__try_terminal_send_fallback.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__wait_for_prompt_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__workflow_prompt_filenames.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__workflow_start_prompts.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test__write_pending_auto_start_marker.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_check_worktree_exists.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_create_placeholder_and_setup_worktree.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_create_placeholder_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_create_worktree.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_find_workspace_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_generate_workflow_branch_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_get_ai_agent_continuation_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_get_current_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_get_main_repo_root.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_get_repos_parent_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_get_worktree_continuation_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_inject_auto_start_task.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_inject_git_path_settings.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_inject_python_path_settings.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_inject_task_permission_settings.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_is_in_worktree.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_is_vscode_available.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_open_vscode_workspace.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_placeholderissueresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_run_worktree_setup_script.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_setup_worktree_environment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_setup_worktree_in_background_sync.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_start_worktree_setup_background.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_switch_to_main_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_worktreesetupresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/cli/workflows/worktree_setup/test_worktreestatecontext.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/runner → agentic_devtools-0.2.119/tests/unit/config}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/config/test_load_platform_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/config/test_load_repo_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/config/test_load_review_focus_areas.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/config/test_save_platform_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/conftest.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/orchestration/state_schema → agentic_devtools-0.2.119/tests/unit/context}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/prompts → agentic_devtools-0.2.119/tests/unit/context/models}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context/models/test_agentcontext.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/prompts/loader → agentic_devtools-0.2.119/tests/unit/context/nodes}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context/nodes/test_retrieve_context_node.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/skill_injector → agentic_devtools-0.2.119/tests/unit/context/retriever}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context/retriever/test_issuecontextretriever.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/state → agentic_devtools-0.2.119/tests/unit/context_budget}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_budgetresult.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_collapse_whitespace.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_contextbudgeterror.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_enforce_context_budget.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_hard_truncate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_reductionstage.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_remove_image_references.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_strip_markdown_formatting.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/context_budget/test_validate_content_shape.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/submission_manager → agentic_devtools-0.2.119/tests/unit/file_locking}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_cross_platform_behavior.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_file_lock_error.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_lock_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_lock_functions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_locked_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_locked_file_edge_cases.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_locked_state_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_unix_file_locking.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_unlock_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/file_locking/test_windows_file_locking.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/submission_processor → agentic_devtools-0.2.119/tests/unit/mcp}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/task_state → agentic_devtools-0.2.119/tests/unit/mcp/server}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/mcp/server/test__load_azure_devops_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/mcp/server/test__load_jira_config.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/mcp/server/test_create_mcp_server.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/mcp/server/test_main.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/tools → agentic_devtools-0.2.119/tests/unit/orchestration}/__init__.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/tools/azure_devops → agentic_devtools-0.2.119/tests/unit/orchestration/checkpointing}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/checkpointing/test_get_checkpointer.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/tools/git → agentic_devtools-0.2.119/tests/unit/orchestration/graph_builder}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/graph_builder/test_build_work_on_issue_graph.py +0 -0
- {agentic_devtools-0.2.118/tests/unit/tools/jira → agentic_devtools-0.2.119/tests/unit/orchestration/pilot_workflow}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test__utc_now.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_checklist_creation_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_commit_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_completion_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_get_mermaid_diagram.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_implementation_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_implementation_review_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_initiate_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_planning_gate_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_planning_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_pull_request_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_route_after_implementation.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_route_after_initiate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_route_after_plan.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_route_after_verify.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_setup_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/pilot_workflow/test_verification_node.py +0 -0
- {agentic_devtools-0.2.118/tests/workflows → agentic_devtools-0.2.119/tests/unit/orchestration/review}/__init__.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/graph_builder/test_build_pr_review_graph.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/nodes/test_complete_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/nodes/test_fetch_pr_details_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/nodes/test_review_file_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/nodes/test_scaffold_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/nodes/test_summarize_node.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/preflight/test_validate_langchain_dependencies.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/runner/test__record_failed_session.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/runner/test__record_session.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/review/runner/test_run_langchain_review.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/runner/test_run_langchain_workflow.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/state_schema/test_workonissueevent.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/orchestration/state_schema/test_workonissuestate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_get_prompts_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_get_required_variables.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_get_temp_output_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_get_template_filename.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_get_template_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_load_and_render_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_load_ci_template.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_load_prompt_template.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_log_prompt_with_save_notice.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_pr_review_file_review_prompt_rendering.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_pr_review_pull_request_overview_prompt_rendering.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_save_generated_prompt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_silentundefined.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_substitute_variables.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_substitute_variables_syntax_error.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_template_validation_error.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/prompts/loader/test_validate_template_variables.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test__derive_fallback_description_from_markdown.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test__ensure_github_gitignore_unignores_agdt.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test__extract_description.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test__flatten_filename.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test__generate_readme.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test__get_source_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test__list_md_files.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test__parse_frontmatter.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/skill_injector/test_inject_skills.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test__get_git_email.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test__get_or_refresh_identity.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test__read_identity_cache.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test__resolve_identity.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test__sync_bootstrap_for_context_key.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test__update_bootstrap_worktree_key.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test__write_identity_cache.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_clear_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_clear_workflow_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_delete_pin_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_delete_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_all_keys.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_bootstrap_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_pull_request_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_pypi_dry_run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_pypi_package_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_pypi_repository.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_pypi_version.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_state_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_state_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_thread_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_get_workflow_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_is_dry_run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_is_safe_dir_segment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_is_workflow_active.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_load_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_load_state_locked.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_read_and_validate_pin_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_refresh_pin_file_ttl.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_save_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_save_state_locked.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_bootstrap_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_context_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_dry_run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_pull_request_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_pypi_dry_run.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_pypi_package_name.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_pypi_repository.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_pypi_version.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_resolve_thread.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_thread_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_value.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_set_workflow_state.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_should_resolve_thread.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_update_workflow_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_update_workflow_step.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_workflow_state_integration.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/state/test_write_pin_file.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_manager/test_create_submission_manager.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_manager/test_faileditemsummary.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_manager/test_failurereport.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_manager/test_submissionitem.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_manager/test_submissionmanager.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_manager/test_submissionstatus.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_manager/test_transientsubmissionerror.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_processor/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_processor/test__get_attribution_params.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_processor/test__validate_suggestions.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_processor/test_create_review_processor.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/submission_processor/test_process_submission.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test__update_task_in_all_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_add_task.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_background_task.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_cleanup_expired_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_duration_seconds.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_from_dict_invalid_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_active_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_all_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_all_tasks_file_path.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_background_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_background_tasks_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_failed_most_recent_per_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_incomplete_most_recent_per_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_logs_dir.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_most_recent_tasks_per_command.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_other_incomplete_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_recent_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_task_by_id.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_task_from_all_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_get_tasks_by_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_is_expired.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_print_task_tracking_info.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_remove_task.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_save_background_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_sort_tasks.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_task_lifecycle.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_task_status.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/task_state/test_update_task.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/azure_devops/test__escape_for_cmd.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/azure_devops/test__get_requests.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/azure_devops/test_add_pull_request_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/azure_devops/test_add_reviewer.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/azure_devops/test_create_pull_request.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/azure_devops/test_reply_to_pull_request_thread.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/azure_devops/test_update_review_narrative.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test__capture.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test__run_op.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test_amend_commit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test_create_commit.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test_force_push.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test_get_recent_changes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test_publish_branch.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test_push.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test_save_work.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/git/test_stage_changes.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/jira/test__fetch_remote_links.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/jira/test_add_comment.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/jira/test_create_epic.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/jira/test_create_issue.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/jira/test_create_subtask.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/unit/tools/jira/test_fetch_issue_context.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/vpn/test_vpn_commands.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/vpn/test_vpn_runner.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/workflows/conftest.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/workflows/test_copilot_generate.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/workflows/test_enforce_budget.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/workflows/test_fix_markdown_deterministic.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/workflows/test_minimized_ci_workflows.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/tests/workflows/test_workflow_end_to_end.py +0 -0
- {agentic_devtools-0.2.118 → agentic_devtools-0.2.119}/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
|