devflow-cli 3.0.0__tar.gz → 3.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.idea/workspace.xml +2 -3
  2. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/CHANGELOG.md +7 -0
  3. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/PKG-INFO +1 -1
  4. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/pyproject.toml +1 -1
  5. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/__init__.py +1 -1
  6. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/adapters/agents.py +17 -0
  7. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/adaptive.py +7 -1
  8. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/activity_contracts.py +37 -6
  9. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/adaptive_runner.py +34 -13
  10. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/remediation.py +11 -0
  11. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/validators.py +1 -1
  12. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_activity_contracts.py +39 -0
  13. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_agent_adapters.py +15 -0
  14. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_validators.py +16 -0
  15. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.ai/mcp/mcp.json +0 -0
  16. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.analyze.md +0 -0
  17. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.checklist.md +0 -0
  18. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.clarify.md +0 -0
  19. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.constitution.md +0 -0
  20. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.implement.md +0 -0
  21. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.plan.md +0 -0
  22. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.specify.md +0 -0
  23. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.tasks.md +0 -0
  24. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.claude/commands/speckit.taskstoissues.md +0 -0
  25. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.githooks/post-checkout +0 -0
  26. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.githooks/post-merge +0 -0
  27. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.github/workflows/ci.yml +0 -0
  28. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.github/workflows/release.yml +0 -0
  29. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.gitignore +0 -0
  30. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.idea/.gitignore +0 -0
  31. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.idea/devflow.iml +0 -0
  32. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.idea/misc.xml +0 -0
  33. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.idea/modules.xml +0 -0
  34. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.idea/vcs.xml +0 -0
  35. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/init-options.json +0 -0
  36. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/memory/constitution.md +0 -0
  37. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  38. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/scripts/bash/common.sh +0 -0
  39. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/scripts/bash/create-new-feature.sh +0 -0
  40. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/scripts/bash/setup-plan.sh +0 -0
  41. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/scripts/bash/update-agent-context.sh +0 -0
  42. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/001-cli-init-options/checklists/requirements.md +0 -0
  43. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/001-cli-init-options/contracts/cli-init.md +0 -0
  44. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/001-cli-init-options/data-model.md +0 -0
  45. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/001-cli-init-options/plan.md +0 -0
  46. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/001-cli-init-options/research.md +0 -0
  47. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/001-cli-init-options/spec.md +0 -0
  48. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/001-cli-init-options/tasks.md +0 -0
  49. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/002-cascade-regen/checklists/requirements.md +0 -0
  50. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/002-cascade-regen/contracts/cli-regen.md +0 -0
  51. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/002-cascade-regen/contracts/cli-status-staleness.md +0 -0
  52. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/002-cascade-regen/data-model.md +0 -0
  53. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/002-cascade-regen/plan.md +0 -0
  54. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/002-cascade-regen/research.md +0 -0
  55. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/002-cascade-regen/spec.md +0 -0
  56. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/002-cascade-regen/tasks.md +0 -0
  57. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/003-usecase-guides/checklists/requirements.md +0 -0
  58. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/003-usecase-guides/data-model.md +0 -0
  59. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/003-usecase-guides/plan.md +0 -0
  60. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/003-usecase-guides/quickstart.md +0 -0
  61. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/003-usecase-guides/research.md +0 -0
  62. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/003-usecase-guides/spec.md +0 -0
  63. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/003-usecase-guides/tasks.md +0 -0
  64. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/004-specify-central-directory/checklists/requirements.md +0 -0
  65. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/004-specify-central-directory/contracts/cli-commands.md +0 -0
  66. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/004-specify-central-directory/data-model.md +0 -0
  67. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/004-specify-central-directory/plan.md +0 -0
  68. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/004-specify-central-directory/quickstart.md +0 -0
  69. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/004-specify-central-directory/research.md +0 -0
  70. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/004-specify-central-directory/spec.md +0 -0
  71. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/004-specify-central-directory/tasks.md +0 -0
  72. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/005-implement-subphases/checklists/requirements.md +0 -0
  73. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/005-implement-subphases/plan.md +0 -0
  74. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/005-implement-subphases/quickstart.md +0 -0
  75. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/005-implement-subphases/research.md +0 -0
  76. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/005-implement-subphases/spec.md +0 -0
  77. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/005-implement-subphases/tasks.md +0 -0
  78. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/006-template-upgrade/checklists/requirements.md +0 -0
  79. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/006-template-upgrade/contracts/cli-upgrade.md +0 -0
  80. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/006-template-upgrade/data-model.md +0 -0
  81. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/006-template-upgrade/plan.md +0 -0
  82. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/006-template-upgrade/quickstart.md +0 -0
  83. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/006-template-upgrade/research.md +0 -0
  84. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/006-template-upgrade/spec.md +0 -0
  85. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/006-template-upgrade/tasks.md +0 -0
  86. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/007-project-documentation/checklists/requirements.md +0 -0
  87. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/007-project-documentation/data-model.md +0 -0
  88. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/007-project-documentation/plan.md +0 -0
  89. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/007-project-documentation/quickstart.md +0 -0
  90. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/007-project-documentation/research.md +0 -0
  91. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/007-project-documentation/spec.md +0 -0
  92. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/007-project-documentation/tasks.md +0 -0
  93. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/008-hardening-bugs/checklists/requirements.md +0 -0
  94. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/008-hardening-bugs/plan.md +0 -0
  95. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/008-hardening-bugs/quickstart.md +0 -0
  96. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/008-hardening-bugs/research.md +0 -0
  97. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/008-hardening-bugs/spec.md +0 -0
  98. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/008-hardening-bugs/tasks.md +0 -0
  99. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/009-ci-pypi/checklists/requirements.md +0 -0
  100. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/009-ci-pypi/plan.md +0 -0
  101. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/009-ci-pypi/quickstart.md +0 -0
  102. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/009-ci-pypi/research.md +0 -0
  103. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/009-ci-pypi/spec.md +0 -0
  104. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/009-ci-pypi/tasks.md +0 -0
  105. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/010-flexible-pipeline/checklists/requirements.md +0 -0
  106. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/010-flexible-pipeline/plan.md +0 -0
  107. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/010-flexible-pipeline/quickstart.md +0 -0
  108. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/010-flexible-pipeline/research.md +0 -0
  109. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/010-flexible-pipeline/spec.md +0 -0
  110. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/010-flexible-pipeline/tasks.md +0 -0
  111. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/011-cursor-support/checklists/requirements.md +0 -0
  112. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/011-cursor-support/plan.md +0 -0
  113. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/011-cursor-support/quickstart.md +0 -0
  114. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/011-cursor-support/research.md +0 -0
  115. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/011-cursor-support/spec.md +0 -0
  116. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/011-cursor-support/tasks.md +0 -0
  117. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/012-fix-critical-bugs/checklists/requirements.md +0 -0
  118. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/012-fix-critical-bugs/plan.md +0 -0
  119. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/012-fix-critical-bugs/research.md +0 -0
  120. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/012-fix-critical-bugs/spec.md +0 -0
  121. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/012-fix-critical-bugs/tasks.md +0 -0
  122. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/013-align-truth-sources/checklists/requirements.md +0 -0
  123. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/013-align-truth-sources/plan.md +0 -0
  124. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/013-align-truth-sources/quickstart.md +0 -0
  125. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/013-align-truth-sources/spec.md +0 -0
  126. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/013-align-truth-sources/tasks.md +0 -0
  127. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/014-enforce-state-machine/checklists/requirements.md +0 -0
  128. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/014-enforce-state-machine/plan.md +0 -0
  129. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/014-enforce-state-machine/quickstart.md +0 -0
  130. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/014-enforce-state-machine/spec.md +0 -0
  131. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/014-enforce-state-machine/tasks.md +0 -0
  132. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/015-fix-review-contradiction/checklists/requirements.md +0 -0
  133. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/015-fix-review-contradiction/plan.md +0 -0
  134. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/015-fix-review-contradiction/research.md +0 -0
  135. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/015-fix-review-contradiction/spec.md +0 -0
  136. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/015-fix-review-contradiction/tasks.md +0 -0
  137. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/016-harden-state-machine/checklists/requirements.md +0 -0
  138. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/016-harden-state-machine/plan.md +0 -0
  139. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/016-harden-state-machine/research.md +0 -0
  140. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/016-harden-state-machine/spec.md +0 -0
  141. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/016-harden-state-machine/tasks.md +0 -0
  142. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/017-fix-robustness-issues/checklists/requirements.md +0 -0
  143. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/017-fix-robustness-issues/plan.md +0 -0
  144. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/017-fix-robustness-issues/research.md +0 -0
  145. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/017-fix-robustness-issues/spec.md +0 -0
  146. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/017-fix-robustness-issues/tasks.md +0 -0
  147. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/018-fix-final-robustness/spec.md +0 -0
  148. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/019-quality-hardening/checklists/requirements.md +0 -0
  149. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/019-quality-hardening/data-model.md +0 -0
  150. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/019-quality-hardening/plan.md +0 -0
  151. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/019-quality-hardening/research.md +0 -0
  152. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/019-quality-hardening/spec.md +0 -0
  153. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/019-quality-hardening/tasks.md +0 -0
  154. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/020-migrate-speckit/checklists/requirements.md +0 -0
  155. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/020-migrate-speckit/data-model.md +0 -0
  156. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/020-migrate-speckit/plan.md +0 -0
  157. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/020-migrate-speckit/quickstart.md +0 -0
  158. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/020-migrate-speckit/research.md +0 -0
  159. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/020-migrate-speckit/spec.md +0 -0
  160. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/020-migrate-speckit/tasks.md +0 -0
  161. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/021-review-iterations/checklists/requirements.md +0 -0
  162. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/021-review-iterations/plan.md +0 -0
  163. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/021-review-iterations/research.md +0 -0
  164. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/021-review-iterations/spec.md +0 -0
  165. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/021-review-iterations/tasks.md +0 -0
  166. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/022-fix-regen-command/checklists/requirements.md +0 -0
  167. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/022-fix-regen-command/plan.md +0 -0
  168. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/022-fix-regen-command/research.md +0 -0
  169. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/022-fix-regen-command/spec.md +0 -0
  170. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/022-fix-regen-command/tasks.md +0 -0
  171. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/023-add-logging/checklists/requirements.md +0 -0
  172. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/023-add-logging/plan.md +0 -0
  173. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/023-add-logging/research.md +0 -0
  174. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/023-add-logging/spec.md +0 -0
  175. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/023-add-logging/tasks.md +0 -0
  176. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/024-validate-constants/checklists/requirements.md +0 -0
  177. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/024-validate-constants/plan.md +0 -0
  178. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/024-validate-constants/research.md +0 -0
  179. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/024-validate-constants/spec.md +0 -0
  180. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/024-validate-constants/tasks.md +0 -0
  181. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/025-harden-tests/checklists/requirements.md +0 -0
  182. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/025-harden-tests/plan.md +0 -0
  183. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/025-harden-tests/research.md +0 -0
  184. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/025-harden-tests/spec.md +0 -0
  185. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/025-harden-tests/tasks.md +0 -0
  186. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/027-pipeline-auto-execution/checklists/requirements.md +0 -0
  187. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/027-pipeline-auto-execution/contracts/orchestrator-contract.md +0 -0
  188. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/027-pipeline-auto-execution/data-model.md +0 -0
  189. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/027-pipeline-auto-execution/plan.md +0 -0
  190. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/027-pipeline-auto-execution/quickstart.md +0 -0
  191. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/027-pipeline-auto-execution/research.md +0 -0
  192. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/027-pipeline-auto-execution/spec.md +0 -0
  193. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/specs/027-pipeline-auto-execution/tasks.md +0 -0
  194. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/agent-file-template.md +0 -0
  195. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/checklist-template.md +0 -0
  196. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/constitution-template.md +0 -0
  197. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/plan-template.md +0 -0
  198. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/spec-template-brownfield.md +0 -0
  199. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/spec-template-greenfield.md +0 -0
  200. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/spec-template-microservices.md +0 -0
  201. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/spec-template.md +0 -0
  202. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/.specify/templates/tasks-template.md +0 -0
  203. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/CLAUDE.md +0 -0
  204. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/CONTRIBUTING.md +0 -0
  205. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/LICENSE +0 -0
  206. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/README.md +0 -0
  207. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/commands/devflow.context.md +0 -0
  208. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/commands/devflow.extension.md +0 -0
  209. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/commands/devflow.init.md +0 -0
  210. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/commands/devflow.md +0 -0
  211. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/commands/devflow.regen.md +0 -0
  212. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/commands/devflow.status.md +0 -0
  213. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/activity-contracts.md +0 -0
  214. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/cli-reference.md +0 -0
  215. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/commands-reference.md +0 -0
  216. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/cursor-guide.md +0 -0
  217. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/guides/brownfield.md +0 -0
  218. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/guides/greenfield.md +0 -0
  219. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/guides/microservices.md +0 -0
  220. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/index.md +0 -0
  221. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/pipeline-reference.generated.md +0 -0
  222. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/pipeline.md +0 -0
  223. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/docs/spec-driven.md +0 -0
  224. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  225. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/extensions/catalog.community.json +0 -0
  226. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/extensions/catalog.json +0 -0
  227. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/extensions/template/example-command.md +0 -0
  228. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/extensions/template/example-extension.json +0 -0
  229. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/adapters/__init__.py +0 -0
  230. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/adapters/linear.py +0 -0
  231. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/cli.py +0 -0
  232. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/__init__.py +0 -0
  233. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/assess.py +0 -0
  234. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/check.py +0 -0
  235. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/context.py +0 -0
  236. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/docs_sync.py +0 -0
  237. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/export_cmd.py +0 -0
  238. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/extension.py +0 -0
  239. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/feature.py +0 -0
  240. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/hooks_cmd.py +0 -0
  241. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/init_cmd.py +0 -0
  242. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/linear.py +0 -0
  243. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/migrate_cmd.py +0 -0
  244. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/stale.py +0 -0
  245. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/status.py +0 -0
  246. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/traceability.py +0 -0
  247. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/upgrade_cmd.py +0 -0
  248. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/commands/verify.py +0 -0
  249. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/__init__.py +0 -0
  250. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/adaptive_workflow.py +0 -0
  251. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/assessment.py +0 -0
  252. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/automatic_evidence.py +0 -0
  253. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/catalog.py +0 -0
  254. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/contract_schemas.py +0 -0
  255. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/docgen.py +0 -0
  256. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/git.py +0 -0
  257. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/hooks.py +0 -0
  258. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/installer.py +0 -0
  259. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/manifest.py +0 -0
  260. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/operational.py +0 -0
  261. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/redaction.py +0 -0
  262. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/scanner.py +0 -0
  263. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/staleness.py +0 -0
  264. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/traceability.py +0 -0
  265. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/verification.py +0 -0
  266. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/waivers.py +0 -0
  267. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/worklog.py +0 -0
  268. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/core/worktree_snapshot.py +0 -0
  269. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/schemas/activity-contract-v1.schema.json +0 -0
  270. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/schemas/activity-result-v1.schema.json +0 -0
  271. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/schemas/assessment-v1.schema.json +0 -0
  272. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/schemas/workflow-state-v2.schema.json +0 -0
  273. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/utils/__init__.py +0 -0
  274. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/utils/console.py +0 -0
  275. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/utils/logging.py +0 -0
  276. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/utils/paths.py +0 -0
  277. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/src/devflow_cli/utils/strings.py +0 -0
  278. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/agent-context-template.md +0 -0
  279. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/constitution-template.md +0 -0
  280. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/contracts/README-template.md +0 -0
  281. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/contracts/api-template.md +0 -0
  282. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/contracts/components-template.md +0 -0
  283. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/contracts/interfaces-template.md +0 -0
  284. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/contracts/services-template.md +0 -0
  285. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/contracts-template.md +0 -0
  286. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/data-model-template.md +0 -0
  287. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/devflow-hooks-template.yml +0 -0
  288. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/extension-manifest-template.json +0 -0
  289. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/plan-template.md +0 -0
  290. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/quickstart-template.md +0 -0
  291. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/research-template.md +0 -0
  292. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/spec-template.md +0 -0
  293. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/templates/tasks-template.md +0 -0
  294. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/conftest.py +0 -0
  295. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/fixtures/agents/mock-agent.md +0 -0
  296. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/fixtures/commands/mock-command.md +0 -0
  297. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/fixtures/mock-catalog.json +0 -0
  298. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/run-tests.sh +0 -0
  299. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test-helpers.sh +0 -0
  300. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test-template-variants.sh +0 -0
  301. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_adaptive_runner.py +0 -0
  302. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_adaptive_workflow.py +0 -0
  303. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_assessment.py +0 -0
  304. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_automatic_evidence.py +0 -0
  305. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_bash_runner.py +0 -0
  306. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_catalog.py +0 -0
  307. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_adaptive.py +0 -0
  308. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_assess.py +0 -0
  309. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_check.py +0 -0
  310. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_context.py +0 -0
  311. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_docs_sync.py +0 -0
  312. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_extension.py +0 -0
  313. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_feature.py +0 -0
  314. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_hooks.py +0 -0
  315. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_init.py +0 -0
  316. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_linear.py +0 -0
  317. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_migrate.py +0 -0
  318. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_stale.py +0 -0
  319. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_status.py +0 -0
  320. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_traceability.py +0 -0
  321. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_upgrade.py +0 -0
  322. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_cmd_verify.py +0 -0
  323. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_constants.py +0 -0
  324. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_context.py +0 -0
  325. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_contract_schemas.py +0 -0
  326. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_docgen.py +0 -0
  327. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_git.py +0 -0
  328. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_hooks.py +0 -0
  329. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_installer.py +0 -0
  330. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_integration.py +0 -0
  331. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_linear_adapter.py +0 -0
  332. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_linear_order.py +0 -0
  333. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_logging.py +0 -0
  334. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_manifest.py +0 -0
  335. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_paths.py +0 -0
  336. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_paths_project_root.py +0 -0
  337. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_scanner.py +0 -0
  338. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_staleness.py +0 -0
  339. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_traceability.py +0 -0
  340. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_verification.py +0 -0
  341. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_version.py +0 -0
  342. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_waivers.py +0 -0
  343. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_wheel_adaptive_acceptance.py +0 -0
  344. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_wheel_install.py +0 -0
  345. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_worklog.py +0 -0
  346. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/tests/test_worktree_snapshot.py +0 -0
  347. {devflow_cli-3.0.0 → devflow_cli-3.0.1}/uv.lock +0 -0
@@ -5,8 +5,7 @@
5
5
  </component>
6
6
  <component name="ChangeListManager">
7
7
  <list default="true" id="4d5164b1-14ff-40b3-8f55-b6f2c3abff01" name="Changes" comment="">
8
- <change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
9
- <change beforePath="$PROJECT_DIR$/src/devflow_cli/utils/paths.py" beforeDir="false" afterPath="$PROJECT_DIR$/src/devflow_cli/utils/paths.py" afterDir="false" />
8
+ <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
10
9
  </list>
11
10
  <option name="SHOW_DIALOG" value="false" />
12
11
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -241,7 +240,7 @@
241
240
  <option name="presentableId" value="Default" />
242
241
  <updated>1786957258019</updated>
243
242
  <workItem from="1786957259143" duration="1286000" />
244
- <workItem from="1787262300781" duration="880000" />
243
+ <workItem from="1787262300781" duration="3274000" />
245
244
  </task>
246
245
  <servers />
247
246
  </component>
@@ -5,6 +5,13 @@ Tous les changements notables de ce projet sont documentés dans ce fichier.
5
5
  Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/),
6
6
  et ce projet adhère au [Semantic Versioning](https://semver.org/lang/fr/).
7
7
 
8
+ ## [3.0.1] - 2026-08-25
9
+
10
+ ### Fixed
11
+
12
+ - Les réouvertures auditées sont transmises explicitement aux contrats d'activité et les preuves de pré-vol archivées deviennent des entrées d'implémentation.
13
+ - Codex signale désormais distinctement une réponse finale structurée absente lorsque `--output-last-message` est vide, sans permettre de transition implicite.
14
+
8
15
  ## [3.0.0] - 2026-08-25
9
16
 
10
17
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: devflow-cli
3
- Version: 3.0.0
3
+ Version: 3.0.1
4
4
  Summary: Spec-Driven Development workflow CLI
5
5
  Project-URL: Homepage, https://github.com/sopequenoteck/devflow
6
6
  Project-URL: Repository, https://github.com/sopequenoteck/devflow
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "devflow-cli"
7
- version = "3.0.0"
7
+ version = "3.0.1"
8
8
  description = "Spec-Driven Development workflow CLI"
9
9
  requires-python = ">=3.11"
10
10
  license = {text = "MIT"}
@@ -1,6 +1,6 @@
1
1
  """devflow CLI — workflow de développement adaptatif."""
2
2
 
3
- VERSION = "3.0.0"
3
+ VERSION = "3.0.1"
4
4
 
5
5
  SUPPORTED_AGENTS = ["claude-code", "codex", "cursor"]
6
6
 
@@ -230,6 +230,23 @@ class CodexAdapter(AgentAdapter):
230
230
  command.append(prompt)
231
231
  return command
232
232
 
233
+ def _structured_payload(self, stdout: str, output_file: Path) -> object:
234
+ """Lit la reponse finale Codex et distingue son absence d'un JSON invalide."""
235
+ if output_file.is_file():
236
+ payload = output_file.read_text(encoding="utf-8")
237
+ if payload.strip():
238
+ return json.loads(payload)
239
+ raise ValueError(
240
+ "Codex a termine sans reponse finale structuree "
241
+ "(--output-last-message est vide)"
242
+ )
243
+ if stdout.strip():
244
+ return json.loads(stdout)
245
+ raise ValueError(
246
+ "Codex n'a pas produit de reponse finale structuree "
247
+ "ni de sortie standard exploitable"
248
+ )
249
+
233
250
 
234
251
  class CursorAdapter(AgentAdapter):
235
252
  name = "cursor"
@@ -32,7 +32,11 @@ from devflow_cli.core.worktree_snapshot import changed_paths, snapshot_worktree
32
32
  from devflow_cli.core.automatic_evidence import run_automatic_verification
33
33
  from devflow_cli.core.worklog import refresh_worklog, safe_refresh_worklog
34
34
  from devflow_cli.core.waivers import create_validation_waiver
35
- from devflow_cli.core.remediation import carried_changed_files, reopen_activity
35
+ from devflow_cli.core.remediation import (
36
+ carried_changed_files,
37
+ is_reopened_activity,
38
+ reopen_activity,
39
+ )
36
40
  from devflow_cli.core.contract_schemas import diagnose_contract_file
37
41
  from devflow_cli.core.operational import ExitCode, exit_code_for_run_reason
38
42
  from devflow_cli.adapters.agents import get_agent_adapter
@@ -193,6 +197,8 @@ def contract(
193
197
  assessment.to_dict(),
194
198
  feature_path,
195
199
  carried_changed_files(feature_dir, state.currentActivity),
200
+ reopened=is_reopened_activity(feature_dir, state.currentActivity),
201
+ preflight_evidence=(feature_dir / "preflight-evidence.md").is_file(),
196
202
  )
197
203
  except ValueError as exc:
198
204
  fail(f"Impossible de generer le contrat : {exc}")
@@ -97,11 +97,27 @@ class ActivityResult:
97
97
  return payload
98
98
 
99
99
 
100
+ def document_artifact_name(activity: str, *, reopened: bool = False) -> str:
101
+ """Retourne l'artefact unique attendu pour une activite documentaire."""
102
+ if activity == "plan" and reopened:
103
+ return "preflight-evidence.md"
104
+ return DOCUMENT_ARTIFACTS[activity]
105
+
106
+
107
+ def contract_is_reopened_plan(contract: ActivityContract) -> bool:
108
+ return (
109
+ contract.activity == "plan"
110
+ and f"{contract.featurePath}/reopen-log.json" in contract.inputs
111
+ )
112
+
113
+
100
114
  def build_activity_contract(
101
115
  state: AdaptiveWorkflowState,
102
116
  assessment: dict[str, Any],
103
117
  feature_path: str,
104
118
  carried_changed_files: list[str] | None = None,
119
+ reopened: bool = False,
120
+ preflight_evidence: bool = False,
105
121
  ) -> ActivityContract:
106
122
  """Construit le contrat de l'activite courante sans notion d'agent."""
107
123
  activity = state.currentActivity
@@ -126,7 +142,7 @@ def build_activity_contract(
126
142
  "Signaler tout blocage au lieu de contourner une validation.",
127
143
  ]
128
144
  if activity in DOCUMENT_ACTIVITIES:
129
- artifact_name = DOCUMENT_ARTIFACTS[activity]
145
+ artifact_name = document_artifact_name(activity, reopened=reopened)
130
146
  allowed_actions = ["read", "write", "execute"]
131
147
  constraints = [
132
148
  *common_constraints,
@@ -134,6 +150,11 @@ def build_activity_contract(
134
150
  "Produire un artefact complet sans placeholder ni section vide.",
135
151
  "Declarer uniquement cet artefact dans changedFiles.",
136
152
  ]
153
+ if activity == "plan" and reopened:
154
+ constraints.append(
155
+ "Archiver les faits, la source, la reproductibilite et les limites connues "
156
+ "dans preflight-evidence.md, sans y recopier de donnees sensibles."
157
+ )
137
158
  completion_criteria = [
138
159
  f"{artifact_name} existe et respecte la structure devflow.",
139
160
  "Le contenu est coherent avec l'objectif et les artefacts en entree.",
@@ -301,8 +322,18 @@ def build_activity_contract(
301
322
  f"{feature_path}/assessment.json",
302
323
  f"{feature_path}/workflow-state.json",
303
324
  ]
304
- if activity == "implement" and carried_changed_files:
325
+ if reopened:
305
326
  inputs.append(f"{feature_path}/reopen-log.json")
327
+ constraints.append(
328
+ "Cette execution suit une reouverture auditee : lire reopen-log.json et corriger explicitement le motif qui y est consigne."
329
+ )
330
+ if activity == "plan" and reopened:
331
+ inputs.append(f"{feature_path}/plan.md")
332
+ if activity == "implement" and preflight_evidence:
333
+ inputs.append(f"{feature_path}/preflight-evidence.md")
334
+ constraints.append(
335
+ "Prendre en compte la preuve de pre-vol archivee et ne pas la presenter comme absente."
336
+ )
306
337
  if activity == "implement" and state.profile == "standard":
307
338
  inputs.append(f"{feature_path}/prepare-result.json")
308
339
  if state.profile == "deep":
@@ -351,6 +382,8 @@ def build_activity_contract(
351
382
  if activity == "rollback-check":
352
383
  inputs.append(f"{feature_path}/review-result.json")
353
384
 
385
+ expected_output = _result_schema(activity)
386
+
354
387
  return ActivityContract(
355
388
  schemaVersion=ACTIVITY_CONTRACT_SCHEMA_VERSION,
356
389
  contractId=f"{state.issueId}:{state.profile}:{activity}:v1",
@@ -364,7 +397,7 @@ def build_activity_contract(
364
397
  constraints=constraints,
365
398
  completionCriteria=completion_criteria,
366
399
  requiredEvidence=required_evidence,
367
- expectedOutput=_result_schema(activity),
400
+ expectedOutput=expected_output,
368
401
  )
369
402
 
370
403
 
@@ -432,9 +465,7 @@ def parse_activity_result(payload: dict[str, Any], contract: ActivityContract) -
432
465
  if contract.activity == "prepare" and status == "completed" and not validation_plan:
433
466
  raise ValueError("prepare complete requiert un plan de validation")
434
467
  if contract.activity in DOCUMENT_ACTIVITIES and status == "completed":
435
- expected_artifact = (
436
- f"{contract.featurePath}/{DOCUMENT_ARTIFACTS[contract.activity]}"
437
- )
468
+ expected_artifact = f"{contract.featurePath}/{document_artifact_name(contract.activity, reopened=contract_is_reopened_plan(contract))}"
438
469
  if changed_files != [expected_artifact]:
439
470
  raise ValueError(
440
471
  f"{contract.activity} doit declarer uniquement {expected_artifact}"
@@ -14,6 +14,8 @@ from devflow_cli.core.activity_contracts import (
14
14
  ActivityResult,
15
15
  DOCUMENT_ARTIFACTS,
16
16
  build_activity_contract,
17
+ contract_is_reopened_plan,
18
+ document_artifact_name,
17
19
  parse_activity_result,
18
20
  write_activity_contract,
19
21
  )
@@ -30,7 +32,7 @@ from devflow_cli.core.traceability import analyze_traceability
30
32
  from devflow_cli.core.validators import validate_artifact
31
33
  from devflow_cli.core.verification import ValidationCommand, validate_command_policy
32
34
  from devflow_cli.core.waivers import is_protected_validation
33
- from devflow_cli.core.remediation import carried_changed_files
35
+ from devflow_cli.core.remediation import carried_changed_files, is_reopened_activity
34
36
 
35
37
 
36
38
  @dataclass(frozen=True)
@@ -81,7 +83,12 @@ def run_current_activity(
81
83
  try:
82
84
  carried = carried_changed_files(feature_dir, state.currentActivity)
83
85
  contract = build_activity_contract(
84
- state, assessment.to_dict(), feature_path, carried
86
+ state,
87
+ assessment.to_dict(),
88
+ feature_path,
89
+ carried,
90
+ reopened=is_reopened_activity(feature_dir, state.currentActivity),
91
+ preflight_evidence=(feature_dir / "preflight-evidence.md").is_file(),
85
92
  )
86
93
  except ValueError as exc:
87
94
  return AdaptiveRunOutcome(
@@ -176,7 +183,9 @@ def run_current_activity(
176
183
  result,
177
184
  )
178
185
  if contract.activity in DOCUMENT_ARTIFACTS:
179
- artifact_name = DOCUMENT_ARTIFACTS[contract.activity]
186
+ artifact_name = document_artifact_name(
187
+ contract.activity, reopened=contract_is_reopened_plan(contract)
188
+ )
180
189
  expected = f"{feature_path}/{artifact_name}"
181
190
  allowed_declared = not declared or declared == [expected]
182
191
  allowed_observed = not observed or observed == [expected]
@@ -193,17 +202,29 @@ def run_current_activity(
193
202
  result,
194
203
  )
195
204
  if contract.activity in DOCUMENT_ARTIFACTS and result.status == "completed":
196
- artifact_name = DOCUMENT_ARTIFACTS[contract.activity]
197
- validator_name = (
198
- f"critical-{contract.activity}"
199
- if contract.profile == "critical"
200
- and contract.activity in {"research", "contracts"}
201
- else contract.activity
202
- )
203
- validation = validate_artifact(
204
- validator_name, feature_dir / artifact_name
205
+ artifact_name = document_artifact_name(
206
+ contract.activity, reopened=contract_is_reopened_plan(contract)
205
207
  )
206
- if not validation.valid:
208
+ if artifact_name == "preflight-evidence.md":
209
+ try:
210
+ if not (feature_dir / artifact_name).read_text(encoding="utf-8").strip():
211
+ raise OSError("artefact vide")
212
+ except OSError as exc:
213
+ return AdaptiveRunOutcome(
214
+ "invalid-artifact", contract.activity, contract.activity, str(exc), result
215
+ )
216
+ validation = None
217
+ else:
218
+ validator_name = (
219
+ f"critical-{contract.activity}"
220
+ if contract.profile == "critical"
221
+ and contract.activity in {"research", "contracts"}
222
+ else contract.activity
223
+ )
224
+ validation = validate_artifact(
225
+ validator_name, feature_dir / artifact_name
226
+ )
227
+ if validation is not None and not validation.valid:
207
228
  return AdaptiveRunOutcome(
208
229
  "invalid-artifact",
209
230
  contract.activity,
@@ -82,6 +82,17 @@ def carried_changed_files(feature_dir: Path, activity: str) -> list[str]:
82
82
  return sorted(set(files))
83
83
 
84
84
 
85
+ def is_reopened_activity(feature_dir: Path, activity: str) -> bool:
86
+ """Indique si l'activite courante provient de la derniere reouverture auditee."""
87
+ try:
88
+ payload = json.loads((feature_dir / "reopen-log.json").read_text(encoding="utf-8"))
89
+ entries = payload["entries"]
90
+ entry = entries[-1]
91
+ except (OSError, json.JSONDecodeError, KeyError, IndexError, TypeError):
92
+ return False
93
+ return entry.get("targetActivity") == activity
94
+
95
+
85
96
  def _read_log(path: Path, issue_id: str) -> dict:
86
97
  if not path.exists():
87
98
  return {"schemaVersion": 1, "issueId": issue_id, "entries": []}
@@ -42,7 +42,7 @@ ARTIFACT_RULES: dict[str, dict] = {
42
42
  "spec": {
43
43
  "required_section_groups": [
44
44
  ["User Scenarios & Testing", "User Stories"],
45
- ["Requirements"],
45
+ ["Requirements", "Exigences"],
46
46
  ["Success Criteria"],
47
47
  ],
48
48
  "min_size": 50,
@@ -101,6 +101,20 @@ def test_implement_contract_is_agent_neutral() -> None:
101
101
  assert evidence_schema["additionalProperties"] is False
102
102
 
103
103
 
104
+ def test_reopened_activity_contract_exposes_the_audit_log() -> None:
105
+ state = create_quick_workflow(_assessment())
106
+
107
+ contract = build_activity_contract(
108
+ state,
109
+ _assessment(),
110
+ ".specify/specs/001-test",
111
+ reopened=True,
112
+ )
113
+
114
+ assert ".specify/specs/001-test/reopen-log.json" in contract.inputs
115
+ assert "reouverture auditee" in " ".join(contract.constraints)
116
+
117
+
104
118
  def test_output_schema_declares_a_type_for_every_property() -> None:
105
119
  state = create_quick_workflow(_assessment())
106
120
  contract = build_activity_contract(state, _assessment(), ".specify/specs/001-test")
@@ -331,6 +345,31 @@ def test_implement_contract_delegates_external_gate_to_local_verify() -> None:
331
345
  assert any("locale verify" in item for item in contract.constraints)
332
346
 
333
347
 
348
+ def test_implement_contract_exposes_archived_preflight_evidence() -> None:
349
+ state = create_quick_workflow(_assessment())
350
+ contract = build_activity_contract(
351
+ state,
352
+ _assessment(),
353
+ ".specify/specs/001-test",
354
+ preflight_evidence=True,
355
+ )
356
+
357
+ assert ".specify/specs/001-test/preflight-evidence.md" in contract.inputs
358
+ assert any("preuve de pre-vol" in item for item in contract.constraints)
359
+
360
+
361
+ def test_reopened_plan_requires_the_preflight_evidence_file() -> None:
362
+ assessment = _critical_assessment()
363
+ state = create_adaptive_workflow(assessment)
364
+ for activity in ("risk-assessment", "spec", "research", "contracts"):
365
+ complete_activity(state, activity)
366
+ contract = build_activity_contract(
367
+ state, assessment, ".specify/specs/001-critical", reopened=True,
368
+ )
369
+
370
+ assert contract.constraints[5].endswith("/preflight-evidence.md; ne modifier aucun autre fichier.")
371
+
372
+
334
373
  def test_review_contract_uses_verified_evidence_without_rebuilding() -> None:
335
374
  assessment = _critical_assessment()
336
375
  state = create_adaptive_workflow(assessment)
@@ -161,6 +161,21 @@ def test_codex_verify_contract_can_use_read_only_sandbox(tmp_path: Path) -> None
161
161
  assert command[command.index("--sandbox") + 1] == "read-only"
162
162
 
163
163
 
164
+ def test_codex_structured_execution_explains_an_empty_last_message(tmp_path: Path) -> None:
165
+ schema = tmp_path / "schema.json"
166
+ output = tmp_path / "output.json"
167
+ schema.write_text(json.dumps({"type": "object"}))
168
+ output.write_text("")
169
+ completed = subprocess.CompletedProcess([], 0, "", "")
170
+
171
+ with patch("subprocess.run", return_value=completed):
172
+ result = CodexAdapter().execute_structured("prompt", tmp_path, 10, schema, output)
173
+
174
+ assert result.returncode == 1
175
+ assert "--output-last-message est vide" in result.stderr
176
+ assert not output.exists()
177
+
178
+
164
179
  def test_cursor_manual_does_not_force_edits() -> None:
165
180
  command = CursorAdapter().build_command("review", "manual")
166
181
 
@@ -59,6 +59,22 @@ def test_validate_spec_accepts_french_template_heading(tmp_path: Path) -> None:
59
59
  assert result.valid is True
60
60
 
61
61
 
62
+ def test_validate_spec_accepts_french_exigences_heading(tmp_path: Path) -> None:
63
+ """Une spec rédigée naturellement en français respecte le contrat."""
64
+ spec = tmp_path / "spec.md"
65
+ spec.write_text(
66
+ SPEC_VALID.replace("User Scenarios & Testing", "User Stories").replace(
67
+ "Requirements", "Exigences fonctionnelles"
68
+ ),
69
+ encoding="utf-8",
70
+ )
71
+
72
+ result = validate_artifact("spec", spec)
73
+
74
+ assert result.valid is True
75
+ assert result.issues == []
76
+
77
+
62
78
  def test_validate_spec_empty(tmp_path: Path) -> None:
63
79
  """spec.md de 0 octets → invalide avec issue empty_content."""
64
80
  spec = tmp_path / "spec.md"
File without changes
File without changes
File without changes