devflow-cli 2.0.0__tar.gz → 2.2.0__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 (287) hide show
  1. devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/checklists/requirements.md +34 -0
  2. devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/data-model.md +87 -0
  3. devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/plan.md +74 -0
  4. devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/quickstart.md +64 -0
  5. devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/research.md +75 -0
  6. devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/spec.md +163 -0
  7. devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/tasks.md +193 -0
  8. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/CLAUDE.md +6 -3
  9. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/PKG-INFO +2 -2
  10. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/README.md +1 -1
  11. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/cli-reference.md +38 -0
  12. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/pyproject.toml +1 -1
  13. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/__init__.py +12 -1
  14. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/cli.py +2 -0
  15. devflow_cli-2.2.0/src/devflow_cli/commands/migrate_speckit.py +219 -0
  16. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/state.py +69 -1
  17. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/conftest.py +14 -0
  18. devflow_cli-2.2.0/tests/test_cmd_migrate_speckit.py +282 -0
  19. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_state.py +132 -1
  20. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.analyze.md +0 -0
  21. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.checklist.md +0 -0
  22. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.clarify.md +0 -0
  23. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.constitution.md +0 -0
  24. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.implement.md +0 -0
  25. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.plan.md +0 -0
  26. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.specify.md +0 -0
  27. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.tasks.md +0 -0
  28. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.taskstoissues.md +0 -0
  29. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.github/workflows/ci.yml +0 -0
  30. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.github/workflows/release.yml +0 -0
  31. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.gitignore +0 -0
  32. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/init-options.json +0 -0
  33. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/memory/constitution.md +0 -0
  34. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  35. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/common.sh +0 -0
  36. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/create-new-feature.sh +0 -0
  37. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/setup-plan.sh +0 -0
  38. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/update-agent-context.sh +0 -0
  39. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/checklists/requirements.md +0 -0
  40. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/contracts/cli-init.md +0 -0
  41. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/data-model.md +0 -0
  42. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/plan.md +0 -0
  43. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/research.md +0 -0
  44. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/spec.md +0 -0
  45. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/tasks.md +0 -0
  46. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/checklists/requirements.md +0 -0
  47. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/contracts/cli-regen.md +0 -0
  48. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/contracts/cli-status-staleness.md +0 -0
  49. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/data-model.md +0 -0
  50. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/plan.md +0 -0
  51. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/research.md +0 -0
  52. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/spec.md +0 -0
  53. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/tasks.md +0 -0
  54. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/checklists/requirements.md +0 -0
  55. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/data-model.md +0 -0
  56. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/plan.md +0 -0
  57. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/quickstart.md +0 -0
  58. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/research.md +0 -0
  59. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/spec.md +0 -0
  60. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/tasks.md +0 -0
  61. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/checklists/requirements.md +0 -0
  62. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/contracts/cli-commands.md +0 -0
  63. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/data-model.md +0 -0
  64. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/plan.md +0 -0
  65. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/quickstart.md +0 -0
  66. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/research.md +0 -0
  67. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/spec.md +0 -0
  68. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/tasks.md +0 -0
  69. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/checklists/requirements.md +0 -0
  70. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/plan.md +0 -0
  71. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/quickstart.md +0 -0
  72. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/research.md +0 -0
  73. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/spec.md +0 -0
  74. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/tasks.md +0 -0
  75. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/checklists/requirements.md +0 -0
  76. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/contracts/cli-upgrade.md +0 -0
  77. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/data-model.md +0 -0
  78. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/plan.md +0 -0
  79. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/quickstart.md +0 -0
  80. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/research.md +0 -0
  81. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/spec.md +0 -0
  82. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/tasks.md +0 -0
  83. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/checklists/requirements.md +0 -0
  84. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/data-model.md +0 -0
  85. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/plan.md +0 -0
  86. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/quickstart.md +0 -0
  87. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/research.md +0 -0
  88. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/spec.md +0 -0
  89. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/tasks.md +0 -0
  90. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/checklists/requirements.md +0 -0
  91. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/plan.md +0 -0
  92. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/quickstart.md +0 -0
  93. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/research.md +0 -0
  94. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/spec.md +0 -0
  95. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/tasks.md +0 -0
  96. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/checklists/requirements.md +0 -0
  97. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/plan.md +0 -0
  98. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/quickstart.md +0 -0
  99. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/research.md +0 -0
  100. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/spec.md +0 -0
  101. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/tasks.md +0 -0
  102. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/checklists/requirements.md +0 -0
  103. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/plan.md +0 -0
  104. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/quickstart.md +0 -0
  105. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/research.md +0 -0
  106. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/spec.md +0 -0
  107. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/tasks.md +0 -0
  108. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/checklists/requirements.md +0 -0
  109. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/plan.md +0 -0
  110. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/quickstart.md +0 -0
  111. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/research.md +0 -0
  112. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/spec.md +0 -0
  113. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/tasks.md +0 -0
  114. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/checklists/requirements.md +0 -0
  115. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/plan.md +0 -0
  116. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/research.md +0 -0
  117. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/spec.md +0 -0
  118. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/tasks.md +0 -0
  119. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/checklists/requirements.md +0 -0
  120. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/plan.md +0 -0
  121. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/quickstart.md +0 -0
  122. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/spec.md +0 -0
  123. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/tasks.md +0 -0
  124. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/checklists/requirements.md +0 -0
  125. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/plan.md +0 -0
  126. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/quickstart.md +0 -0
  127. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/spec.md +0 -0
  128. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/tasks.md +0 -0
  129. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/checklists/requirements.md +0 -0
  130. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/plan.md +0 -0
  131. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/research.md +0 -0
  132. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/spec.md +0 -0
  133. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/tasks.md +0 -0
  134. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/checklists/requirements.md +0 -0
  135. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/plan.md +0 -0
  136. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/research.md +0 -0
  137. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/spec.md +0 -0
  138. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/tasks.md +0 -0
  139. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/checklists/requirements.md +0 -0
  140. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/plan.md +0 -0
  141. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/research.md +0 -0
  142. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/spec.md +0 -0
  143. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/tasks.md +0 -0
  144. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/018-fix-final-robustness/spec.md +0 -0
  145. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/checklists/requirements.md +0 -0
  146. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/data-model.md +0 -0
  147. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/plan.md +0 -0
  148. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/research.md +0 -0
  149. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/spec.md +0 -0
  150. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/tasks.md +0 -0
  151. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/agent-file-template.md +0 -0
  152. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/checklist-template.md +0 -0
  153. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/constitution-template.md +0 -0
  154. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/plan-template.md +0 -0
  155. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template-brownfield.md +0 -0
  156. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template-greenfield.md +0 -0
  157. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template-microservices.md +0 -0
  158. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template.md +0 -0
  159. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/tasks-template.md +0 -0
  160. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/CHANGELOG.md +0 -0
  161. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/CONTRIBUTING.md +0 -0
  162. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/LICENSE +0 -0
  163. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/agents/devflow-autofix.md +0 -0
  164. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/agents/devflow-review.md +0 -0
  165. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.analyze.md +0 -0
  166. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.checklist.md +0 -0
  167. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.clarify.md +0 -0
  168. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.constitution.md +0 -0
  169. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.context.md +0 -0
  170. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.contracts.md +0 -0
  171. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.docs.md +0 -0
  172. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.extension.md +0 -0
  173. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.implement.md +0 -0
  174. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.init.md +0 -0
  175. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.md +0 -0
  176. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.metrics.md +0 -0
  177. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.plan.md +0 -0
  178. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.regen.md +0 -0
  179. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.research.md +0 -0
  180. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.review-impl.md +0 -0
  181. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.review-spec.md +0 -0
  182. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.review-tasks.md +0 -0
  183. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.spec.md +0 -0
  184. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.status.md +0 -0
  185. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.sync-linear.md +0 -0
  186. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.tasks-to-issues.md +0 -0
  187. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.tasks.md +0 -0
  188. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/commands-reference.md +0 -0
  189. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/cursor-guide.md +0 -0
  190. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/guides/brownfield.md +0 -0
  191. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/guides/greenfield.md +0 -0
  192. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/guides/microservices.md +0 -0
  193. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/index.md +0 -0
  194. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/pipeline.md +0 -0
  195. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/spec-driven.md +0 -0
  196. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/EXTENSION-API-REFERENCE.md +0 -0
  197. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
  198. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/README.md +0 -0
  199. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/catalog.community.json +0 -0
  200. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/catalog.json +0 -0
  201. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/template/example-command.md +0 -0
  202. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/template/example-extension.json +0 -0
  203. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/__init__.py +0 -0
  204. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/check.py +0 -0
  205. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/context.py +0 -0
  206. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/export_cmd.py +0 -0
  207. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/extension.py +0 -0
  208. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/feature.py +0 -0
  209. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/init_cmd.py +0 -0
  210. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/migrate_cmd.py +0 -0
  211. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/regen.py +0 -0
  212. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/rollback.py +0 -0
  213. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/status.py +0 -0
  214. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/upgrade_cmd.py +0 -0
  215. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/__init__.py +0 -0
  216. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/catalog.py +0 -0
  217. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/git.py +0 -0
  218. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/hooks.py +0 -0
  219. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/installer.py +0 -0
  220. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/manifest.py +0 -0
  221. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/scanner.py +0 -0
  222. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/staleness.py +0 -0
  223. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/validators.py +0 -0
  224. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/__init__.py +0 -0
  225. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/console.py +0 -0
  226. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/paths.py +0 -0
  227. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/strings.py +0 -0
  228. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/agent-context-template.md +0 -0
  229. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/analyze-template.md +0 -0
  230. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklist-template.md +0 -0
  231. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklists/api.md +0 -0
  232. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklists/requirements.md +0 -0
  233. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklists/security.md +0 -0
  234. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklists/ux.md +0 -0
  235. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/clarify-template.md +0 -0
  236. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/constitution-template.md +0 -0
  237. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/README-template.md +0 -0
  238. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/api-template.md +0 -0
  239. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/components-template.md +0 -0
  240. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/interfaces-template.md +0 -0
  241. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/services-template.md +0 -0
  242. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts-template.md +0 -0
  243. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/data-model-template.md +0 -0
  244. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/devflow-hooks-template.yml +0 -0
  245. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/docs-template.md +0 -0
  246. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/export/copilot-instructions-template.md +0 -0
  247. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/export/cursor-rules-template.md +0 -0
  248. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/extension-manifest-template.json +0 -0
  249. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/plan-template.md +0 -0
  250. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/quickstart-template.md +0 -0
  251. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/research-template.md +0 -0
  252. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/review-impl-template.md +0 -0
  253. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/review-spec-template.md +0 -0
  254. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/review-tasks-template.md +0 -0
  255. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/spec-template.md +0 -0
  256. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/tasks-template.md +0 -0
  257. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/fixtures/agents/mock-agent.md +0 -0
  258. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/fixtures/commands/mock-command.md +0 -0
  259. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/fixtures/mock-catalog.json +0 -0
  260. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/fixtures/mock-state.json +0 -0
  261. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/run-tests.sh +0 -0
  262. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test-community-catalog.sh +0 -0
  263. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test-helpers.sh +0 -0
  264. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test-template-variants.sh +0 -0
  265. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_catalog.py +0 -0
  266. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_check.py +0 -0
  267. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_context.py +0 -0
  268. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_extension.py +0 -0
  269. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_feature.py +0 -0
  270. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_init.py +0 -0
  271. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_migrate.py +0 -0
  272. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_regen.py +0 -0
  273. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_status.py +0 -0
  274. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_upgrade.py +0 -0
  275. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_context.py +0 -0
  276. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_e2e_pipeline.py +0 -0
  277. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_git.py +0 -0
  278. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_hooks.py +0 -0
  279. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_installer.py +0 -0
  280. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_integration.py +0 -0
  281. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_manifest.py +0 -0
  282. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_paths.py +0 -0
  283. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_rollback.py +0 -0
  284. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_scanner.py +0 -0
  285. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_staleness.py +0 -0
  286. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_validators.py +0 -0
  287. {devflow_cli-2.0.0 → devflow_cli-2.2.0}/uv.lock +0 -0
@@ -0,0 +1,34 @@
1
+ # Specification Quality Checklist: Migration speckit vers devflow
2
+
3
+ **Purpose**: Validate specification completeness and quality before proceeding to planning
4
+ **Created**: 2026-03-20
5
+ **Feature**: [spec.md](../spec.md)
6
+
7
+ ## Content Quality
8
+
9
+ - [x] No implementation details (languages, frameworks, APIs)
10
+ - [x] Focused on user value and business needs
11
+ - [x] Written for non-technical stakeholders
12
+ - [x] All mandatory sections completed
13
+
14
+ ## Requirement Completeness
15
+
16
+ - [x] No [NEEDS CLARIFICATION] markers remain
17
+ - [x] Requirements are testable and unambiguous
18
+ - [x] Success criteria are measurable
19
+ - [x] Success criteria are technology-agnostic (no implementation details)
20
+ - [x] All acceptance scenarios are defined
21
+ - [x] Edge cases are identified
22
+ - [x] Scope is clearly bounded
23
+ - [x] Dependencies and assumptions identified
24
+
25
+ ## Feature Readiness
26
+
27
+ - [x] All functional requirements have clear acceptance criteria
28
+ - [x] User scenarios cover primary flows
29
+ - [x] Feature meets measurable outcomes defined in Success Criteria
30
+ - [x] No implementation details leak into specification
31
+
32
+ ## Notes
33
+
34
+ - All items pass. Spec ready for `/devflow.clarify` or `/devflow.plan`.
@@ -0,0 +1,87 @@
1
+ # Data Model: Migration speckit vers devflow
2
+
3
+ **Feature**: 020-migrate-speckit | **Date**: 2026-03-20
4
+
5
+ ## Entités
6
+
7
+ ### SpeckitState (lecture seule — JSON brut)
8
+
9
+ Un `state.json` au format speckit, lu directement depuis le fichier (pas via `read_state()` qui normalise).
10
+
11
+ | Champ | Type | Obligatoire | Description |
12
+ |-------|------|-------------|-------------|
13
+ | `issueId` | string | Oui | Identifiant de la feature |
14
+ | `currentStep` | string | Oui | Étape courante (vocabulaire speckit) |
15
+ | `completedSteps` | string[] | Oui | Étapes complétées (vocabulaire speckit) |
16
+ | `createdAt` | string | Non | Date de création ISO |
17
+ | `updatedAt` | string | Non | Date de mise à jour ISO |
18
+
19
+ **Critère d'identification** : absence du champ `reviewIterations` dans le JSON brut.
20
+
21
+ **Valeurs possibles de `currentStep`** : `specify`, `clarify`, `plan`, `tasks`, `checklist`, `analyze`, `implement`.
22
+
23
+ ### FeatureState (existant — cible de conversion)
24
+
25
+ Défini dans `src/devflow_cli/core/state.py`. Champs ajoutés lors de la conversion :
26
+
27
+ | Champ | Valeur post-conversion |
28
+ |-------|----------------------|
29
+ | `currentStep` | Mappé selon table (ex: `specify` → `spec`) |
30
+ | `completedSteps` | Mappées + étapes devflow intermédiaires injectées |
31
+ | `stepTimestamps` | `{}` (pas de données source) |
32
+ | `reviewIterations` | `{gate: 0}` pour chaque gate auto-validée |
33
+ | `mode` | `"full"` |
34
+ | `skippedSteps` | `[]` |
35
+
36
+ ### StepMapping (constante)
37
+
38
+ Dictionnaire statique défini dans `state.py`.
39
+
40
+ ```python
41
+ SPECKIT_STEP_MAP = {
42
+ "specify": "spec",
43
+ "clarify": "clarify",
44
+ "plan": "plan",
45
+ "tasks": "tasks",
46
+ "implement": "implement",
47
+ }
48
+
49
+ SPECKIT_IGNORED_STEPS = {"checklist", "analyze"}
50
+ ```
51
+
52
+ ### MigrationReport (sortie CLI)
53
+
54
+ | Champ | Type | Description |
55
+ |-------|------|-------------|
56
+ | `migrated` | int | Nombre de features converties |
57
+ | `skipped` | int | Nombre de features déjà devflow (idempotent) |
58
+ | `errors` | int | Nombre de features en erreur |
59
+ | `details` | list[MigrationDetail] | Détail par feature |
60
+
61
+ ### MigrationDetail
62
+
63
+ | Champ | Type | Description |
64
+ |-------|------|-------------|
65
+ | `feature_dir` | string | Nom du dossier feature |
66
+ | `issue_id` | string | Identifiant de la feature |
67
+ | `status` | string | `"migrated"`, `"skipped"`, `"error"` |
68
+ | `from_step` | string | Étape speckit originale |
69
+ | `to_step` | string | Étape devflow après conversion |
70
+ | `message` | string | Message d'erreur si applicable |
71
+
72
+ ## Relations
73
+
74
+ ```
75
+ SpeckitState --(conversion)--> FeatureState
76
+ via StepMapping (constante)
77
+ produit MigrationDetail (rapport)
78
+
79
+ MigrationDetail[] --> MigrationReport (agrégé par la commande CLI)
80
+ ```
81
+
82
+ ## Règles de validation
83
+
84
+ 1. Un `state.json` sans `issueId` ou `currentStep` est invalide → erreur, feature skippée.
85
+ 2. Un `currentStep` non présent dans `SPECKIT_STEP_MAP` ni dans `SPECKIT_IGNORED_STEPS` → erreur si pas dans STEPS devflow non plus.
86
+ 3. Un `state.json` avec `reviewIterations` déjà présent → skip (idempotent). — Réf: FR-005
87
+ 4. Les `completedSteps` sont filtrées : `checklist` et `analyze` sont retirées, les étapes valides sont mappées. — Réf: FR-002
@@ -0,0 +1,74 @@
1
+ # Implementation Plan: Migration speckit vers devflow
2
+
3
+ **Branch**: `020-migrate-speckit` | **Date**: 2026-03-20 | **Spec**: [spec.md](spec.md)
4
+ **Input**: Feature specification from `/specs/020-migrate-speckit/spec.md`
5
+
6
+ ## Summary
7
+
8
+ Ajouter une commande `devflow migrate-speckit` qui détecte les features speckit (state.json sans `reviewIterations`), convertit leur state.json vers le format devflow (mapping d'étapes + injection des review gates auto-validées), crée une constitution starter si absente, et propose un nettoyage optionnel des commandes/templates speckit.
9
+
10
+ ## Technical Context
11
+
12
+ **Language/Version**: Python 3.11+
13
+ **Primary Dependencies**: Typer (>=0.12), Rich (>=13), hashlib (stdlib)
14
+ **Storage**: Fichiers locaux (state.json, constitution.md, templates)
15
+ **Testing**: pytest avec fixtures isolées (répertoires temporaires)
16
+ **Target Platform**: macOS, Linux
17
+ **Project Type**: CLI
18
+ **Performance Goals**: <5s pour 10 features (SC-004)
19
+ **Constraints**: Non-destructive, backup .bak obligatoire, idempotent
20
+ **Scale/Scope**: Projets avec 1-50 features speckit
21
+
22
+ ## Constitution Check
23
+
24
+ *GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.*
25
+
26
+ | Principe | Statut | Justification |
27
+ |----------|--------|---------------|
28
+ | I. Spec-Driven | PASS | Spec complète avec 7 clarifications, user stories, acceptance scenarios |
29
+ | II. Pipeline Séquentiel | PASS | La migration convertit les state.json pour respecter le pipeline devflow |
30
+ | III. Gates de Review | PASS | Les gates manquantes sont auto-validées avec `reviewIterations: 0` — cohérent avec la rétrocompatibilité |
31
+ | IV. Rétrocompatibilité | PASS | Backup .bak, dry-run, artefacts markdown inchangés, idempotent |
32
+ | V. Simplicité (YAGNI) | PASS | Nouvelle commande + 1 fonction de conversion dans state.py, pas de nouvelle abstraction |
33
+ | VI. Testabilité | PASS | Tests pytest avec fixtures speckit temporaires, pattern existant dans test_cmd_migrate.py |
34
+ | VII. Intégration Linear | N/A | La migration ne touche pas Linear — le mapping STEP_LINEAR_MAPPING existant s'applique post-migration |
35
+
36
+ ## Project Structure
37
+
38
+ ### Documentation (this feature)
39
+
40
+ ```text
41
+ specs/020-migrate-speckit/
42
+ ├── plan.md # This file
43
+ ├── research.md # Phase 0 output
44
+ ├── data-model.md # Phase 1 output
45
+ ├── quickstart.md # Phase 1 output
46
+ └── tasks.md # Phase 2 output (/speckit.tasks)
47
+ ```
48
+
49
+ ### Source Code (repository root)
50
+
51
+ ```text
52
+ src/devflow_cli/
53
+ ├── __init__.py # +SPECKIT_STEP_MAP, SPECKIT_IGNORED_STEPS
54
+ ├── cli.py # +1 commande enregistrée (migrate_speckit)
55
+ ├── commands/
56
+ │ ├── migrate_cmd.py # Existant (migration legacy docs/features/)
57
+ │ └── migrate_speckit.py # NOUVEAU — commande migrate-speckit
58
+ ├── core/
59
+ │ ├── state.py # +convert_speckit_state(), +is_speckit_state()
60
+ │ └── manifest.py # Réutilisé pour checksums templates (--clean-speckit)
61
+ └── utils/
62
+ └── console.py # Réutilisé (ok, info, warn, fail, header)
63
+
64
+ tests/
65
+ ├── conftest.py # +fixture mock_speckit_state
66
+ ├── test_cmd_migrate_speckit.py # NOUVEAU — tests commande
67
+ └── test_state.py # +tests conversion speckit
68
+ ```
69
+
70
+ **Structure Decision**: Single project existant. Nouveau fichier `commands/migrate_speckit.py` pour la commande, fonctions de conversion ajoutées dans `core/state.py`. Pas de nouveau module — réutilisation maximale du code existant.
71
+
72
+ ## Complexity Tracking
73
+
74
+ Aucune violation de simplicité. Tous les composants suivent les patterns existants (commande Typer + fonctions core + tests pytest).
@@ -0,0 +1,64 @@
1
+ # Quickstart: Migration speckit vers devflow
2
+
3
+ **Feature**: 020-migrate-speckit | **Date**: 2026-03-20
4
+
5
+ ## Prérequis
6
+
7
+ - Python 3.11+
8
+ - devflow installé (`pip install -e ".[dev]"`)
9
+ - Projet avec des features speckit dans `.specify/specs/`
10
+
11
+ ## Usage
12
+
13
+ ### 1. Prévisualiser la migration
14
+
15
+ ```bash
16
+ devflow migrate-speckit --dry-run
17
+ ```
18
+
19
+ Affiche un rapport de ce qui serait converti sans modifier aucun fichier.
20
+
21
+ ### 2. Exécuter la migration
22
+
23
+ ```bash
24
+ devflow migrate-speckit
25
+ ```
26
+
27
+ Convertit tous les `state.json` speckit en format devflow :
28
+ - Crée un backup `.bak` de chaque state.json
29
+ - Mappe les étapes (`specify` → `spec`)
30
+ - Injecte les étapes devflow manquantes (review gates, etc.)
31
+ - Crée une constitution starter si absente
32
+
33
+ ### 3. Nettoyer les résidus speckit
34
+
35
+ ```bash
36
+ devflow migrate-speckit --clean-speckit
37
+ ```
38
+
39
+ Supprime les commandes `speckit.*.md` de `~/.claude/commands/` et les templates speckit non personnalisés de `.specify/templates/`.
40
+
41
+ ### 4. Vérifier le résultat
42
+
43
+ ```bash
44
+ devflow status
45
+ ```
46
+
47
+ ## Développement
48
+
49
+ ### Lancer les tests
50
+
51
+ ```bash
52
+ pytest tests/test_cmd_migrate_speckit.py tests/test_state.py -v
53
+ ```
54
+
55
+ ### Fichiers modifiés
56
+
57
+ | Fichier | Modification |
58
+ |---------|-------------|
59
+ | `src/devflow_cli/cli.py` | Enregistrement commande `migrate-speckit` |
60
+ | `src/devflow_cli/commands/migrate_speckit.py` | Nouvelle commande |
61
+ | `src/devflow_cli/core/state.py` | `is_speckit_state()`, `convert_speckit_state()` |
62
+ | `tests/test_cmd_migrate_speckit.py` | Tests commande |
63
+ | `tests/test_state.py` | Tests conversion |
64
+ | `tests/conftest.py` | Fixture `mock_speckit_state` |
@@ -0,0 +1,75 @@
1
+ # Research: Migration speckit vers devflow
2
+
3
+ **Feature**: 020-migrate-speckit | **Date**: 2026-03-20
4
+
5
+ ## R1: Mapping complet des étapes speckit → devflow
6
+
7
+ **Decision**: Mapping direct 1:1 pour les 5 étapes communes, ignorance des 2 étapes speckit-only, injection des étapes devflow intermédiaires.
8
+
9
+ **Rationale**: Le pipeline speckit (7 étapes) est un sous-ensemble fonctionnel du pipeline devflow (13 étapes). Les étapes communes ont la même sémantique, seul le nom `specify` change en `spec`. Les étapes `checklist` et `analyze` n'ont pas d'équivalent devflow et ne produisent pas d'artefacts critiques.
10
+
11
+ **Table de mapping**:
12
+
13
+ | Étape speckit | Étape devflow | Action |
14
+ |---------------|---------------|--------|
15
+ | `specify` | `spec` | Renommer |
16
+ | `clarify` | `clarify` | Conserver tel quel |
17
+ | `plan` | `plan` | Conserver tel quel |
18
+ | `tasks` | `tasks` | Conserver tel quel |
19
+ | `checklist` | — | Ignorer (pas d'équivalent devflow) |
20
+ | `analyze` | — | Ignorer (pas d'équivalent devflow) |
21
+ | `implement` | `implement` | Conserver tel quel |
22
+
23
+ **Étapes devflow injectées** (auto-validées si déjà dépassées) :
24
+
25
+ | Étape devflow | Injectée après | Condition |
26
+ |---------------|----------------|-----------|
27
+ | `constitution` | — | Toujours injectée en premier |
28
+ | `review-spec` | `clarify` | Si `plan` ou ultérieur est complété |
29
+ | `research` | `review-spec` | Si `plan` ou ultérieur est complété |
30
+ | `contracts` | `plan` | Si `tasks` ou ultérieur est complété |
31
+ | `review-tasks` | `tasks` | Si `implement` ou ultérieur est complété |
32
+ | `review-impl` | `implement` | Si `implement` est complété |
33
+ | `docs` | `review-impl` | Si `implement` est complété |
34
+ | `done` | `docs` | Jamais auto-injecté |
35
+
36
+ **Alternatives considered**:
37
+ - Mapping interactif (demander à l'utilisateur pour chaque étape) — rejeté car complexe et le mapping est déterministe.
38
+ - Conserver `checklist`/`analyze` dans un champ `legacySteps` — rejeté car ajoute de la complexité sans valeur.
39
+
40
+ ## R2: Détection fiable d'un state.json speckit
41
+
42
+ **Decision**: Critère principal = absence du champ `reviewIterations` dans le JSON brut.
43
+
44
+ **Rationale**: Le champ `reviewIterations` est exclusif au format devflow. Un state.json speckit ne contient que `issueId`, `currentStep`, `completedSteps`, et potentiellement `createdAt`/`updatedAt`. La fonction `read_state()` actuelle ignore silencieusement les champs inconnus et ajoute des defaults — donc un state.json speckit chargé via `read_state()` aurait `reviewIterations: {}`, ce qui est aussi la valeur par défaut d'un state devflow. Il faut donc lire le JSON brut.
45
+
46
+ **Critères secondaires** (pour confirmation) :
47
+ - `currentStep` contient une valeur speckit-only (`specify`, `checklist`, `analyze`)
48
+ - Absence du champ `mode`
49
+ - `completedSteps` contient `specify` au lieu de `spec`
50
+
51
+ **Alternatives considered**:
52
+ - Champ `version` dans state.json — absent des deux formats, nécessiterait une migration de tous les states existants.
53
+ - Heuristique sur les artefacts présents — fragile, un projet devflow peut aussi avoir peu d'artefacts.
54
+
55
+ ## R3: Stratégie de backup et idempotence
56
+
57
+ **Decision**: Backup `.bak` avant modification + détection idempotente via `reviewIterations` présent dans le JSON brut.
58
+
59
+ **Rationale**: Le pattern `.bak` est simple et ne nécessite pas de dépendance. L'idempotence est gratuite : si `reviewIterations` existe dans le JSON brut, le state est déjà au format devflow → skip.
60
+
61
+ **Alternatives considered**:
62
+ - Backup dans un sous-dossier `.migration-backup/` — sur-ingénierie pour un backup ponctuel.
63
+ - Checksum de l'état pré-migration — complexe et inutile puisque le `.bak` suffit.
64
+
65
+ ## R4: Nettoyage templates avec protection des personnalisations
66
+
67
+ **Decision**: Utiliser `compute_file_hash()` de `manifest.py` pour comparer les checksums des templates installés avec les originaux speckit connus.
68
+
69
+ **Rationale**: Le module `manifest.py` fournit déjà `compute_file_hash()` (SHA-256). Il suffit de maintenir une liste des checksums originaux des templates speckit standards (ou de les calculer depuis les fichiers sources speckit s'ils sont disponibles dans le projet).
70
+
71
+ **Approche pratique** : Comme les templates speckit originaux ne sont pas forcément disponibles dans le projet cible, on adopte une approche simplifiée — supprimer uniquement les fichiers qui correspondent au pattern `speckit*` ou aux noms connus des templates speckit standards. Pour les templates au nom générique (ex: `spec-template.md`), comparer avec les templates devflow — si identiques, supprimer ; sinon, avertir.
72
+
73
+ **Alternatives considered**:
74
+ - Suppression aveugle de tout `.specify/templates/` — risque de perte de personnalisations.
75
+ - Manifeste speckit embarqué — sur-ingénierie, les checksums suffisent.
@@ -0,0 +1,163 @@
1
+ # Feature Specification: Migration speckit vers devflow
2
+
3
+ **Feature Branch**: `020-migrate-speckit`
4
+ **Created**: 2026-03-20
5
+ **Status**: Draft
6
+ **Project Type**: Brownfield
7
+ **Input**: Commande devflow migrate-speckit pour convertir les anciens projets speckit en projets devflow
8
+
9
+ ## Clarifications
10
+
11
+ ### Session 2026-03-20
12
+
13
+ - Q: Comment gérer les review gates manquantes lors de la conversion speckit → devflow ? → A: Auto-valider les gates manquantes (marquer complétées avec `reviewIterations: 0`)
14
+ - Q: Quel critère discrimine un state.json speckit d'un state.json devflow ? → A: Absence du champ `reviewIterations` (exclusif à devflow)
15
+ - Q: Que couvre le nettoyage `--clean-speckit` ? → A: Commandes `~/.claude/commands/speckit.*.md` + templates `.specify/templates/` du projet courant
16
+ - Q: Quel type de constitution créer si absente ? → A: Template générique (identique à `devflow init --with-constitution`)
17
+ - Q: Quel mapping complet appliquer pour les 7 étapes speckit vers les 13 étapes devflow ? → A: Mapping direct 1:1 (`specify→spec`, `clarify→clarify`, `plan→plan`, `tasks→tasks`, `implement→implement`), `checklist` et `analyze` ignorés (non présents dans devflow), étapes devflow intermédiaires (review gates, research, contracts, docs, done) injectées comme auto-validées si déjà dépassées.
18
+ - Q: Mode batch ou interactif pour la migration multi-features ? → A: Batch automatique — toutes les features migrées d'un coup avec rapport final récapitulatif.
19
+ - Q: Comment gérer les templates personnalisés lors du `--clean-speckit` ? → A: Comparer les checksums avec les originaux speckit — supprimer les non-modifiés, avertir et conserver les personnalisés.
20
+
21
+ ## Comportement existant
22
+
23
+ ### État actuel
24
+
25
+ devflow dispose d'une commande `devflow migrate` qui convertit les features depuis `docs/features/` (ancien emplacement legacy) vers `.specify/specs/`. Cependant, cette commande ne gère que le changement de répertoire — elle ne convertit **pas** un projet utilisant le workflow speckit (commandes `/speckit.*`, templates speckit, structure speckit) vers le workflow devflow complet.
26
+
27
+ Un projet speckit typique contient :
28
+ - Des commandes `/speckit.*` installées globalement dans `~/.claude/commands/`
29
+ - Des templates dans `.specify/templates/` (format speckit)
30
+ - Des artefacts dans `.specify/specs/` avec un pipeline 7 étapes (specify → clarify → plan → tasks → checklist → analyze → implement)
31
+ - Des `state.json` sans les champs `mode`, `skippedSteps`, ni les étapes devflow (`review-spec`, `research`, `contracts`, `review-tasks`, `review-impl`, `docs`, `done`)
32
+ - Pas de constitution formalisée dans `.specify/memory/constitution.md`
33
+
34
+ ### Flux existants
35
+
36
+ 1. **Migration legacy (existante)** : `devflow migrate` détecte les features dans `docs/features/`, demande un short-name pour chacune, et les déplace vers `.specify/specs/` avec numérotation auto-incrémentée.
37
+ 2. **Init devflow (existante)** : `devflow init --here` installe les commandes/agents/templates devflow dans `~/.claude/` et crée la structure `.specify/` si absente.
38
+
39
+ ### Dépendances identifiées
40
+
41
+ - **`src/devflow_cli/commands/migrate_cmd.py`** : commande migrate existante, à étendre ou à compléter
42
+ - **`src/devflow_cli/core/state.py`** : `FeatureState`, `read_state`, `write_state` — doit gérer la conversion de format
43
+ - **`src/devflow_cli/core/installer.py`** : non utilisé directement — la création constitution est réimplémentée dans la commande migrate-speckit
44
+ - **`src/devflow_cli/utils/paths.py`** : résolution des chemins features (fallback triple)
45
+
46
+ ### Limitations connues
47
+
48
+ - `devflow migrate` ne gère que le déplacement `docs/features/` → `.specify/specs/`, pas la conversion de workflow
49
+ - Les `state.json` speckit sont lisibles par devflow (rétrocompatibilité) mais leur `currentStep` peut référencer des étapes inexistantes dans le pipeline devflow (ex: `specify` au lieu de `spec`)
50
+ - Les projets speckit n'ont pas de gates de review dans leur historique — impossible de reconstruire `reviewIterations`
51
+ - Les commandes `/speckit.*` restent installées globalement après migration, ce qui peut créer de la confusion
52
+
53
+ ## Impact sur l'existant
54
+
55
+ ### Composants affectés
56
+
57
+ - **`cli.py`** : ajout de la commande `migrate-speckit` (nouvelle commande enregistrée)
58
+ - **`state.py`** : ajout d'une fonction de conversion `state.json` speckit → devflow
59
+ - **`installer.py`** : potentiellement réutilisé pour installer les templates devflow dans le projet cible
60
+
61
+ ### Risques de régression
62
+
63
+ - **state.json corrompus** : la conversion doit être non-destructive — créer un backup avant modification. Mitigation : option `--dry-run` disponible, backup automatique `.bak`
64
+ - **Confusion commandes** : les commandes `/speckit.*` et `/devflow.*` coexisteront dans `~/.claude/commands/`. Mitigation : avertir l'utilisateur, proposer le nettoyage optionnel
65
+
66
+ ### Stratégie de migration
67
+
68
+ La migration est **opt-in et non-destructive** :
69
+ 1. Backup des `state.json` avant conversion (`.bak`)
70
+ 2. Mode `--dry-run` pour prévisualiser les changements
71
+ 3. Rétrocompatibilité préservée — les artefacts convertis restent lisibles par speckit
72
+ 4. Proposition optionnelle de nettoyage des commandes speckit
73
+
74
+ ## User Scenarios & Testing
75
+
76
+ ### User Story 1 - Convertir un projet speckit existant (Priority: P1)
77
+
78
+ Un développeur utilisant speckit sur un projet existant veut passer au workflow devflow pour bénéficier des gates de review, du rollback, et de l'intégration Linear. Il lance `devflow migrate-speckit` dans son projet et obtient un projet devflow fonctionnel.
79
+
80
+ **Why this priority** : C'est le cas d'usage principal — sans cette conversion, l'utilisateur doit recréer manuellement toutes ses features.
81
+
82
+ **Independent Test** : Créer un répertoire temporaire avec une structure speckit (state.json speckit, artefacts), lancer la migration, vérifier que le state.json est converti et que `devflow status` fonctionne.
83
+
84
+ **Acceptance Scenarios** :
85
+
86
+ 1. **Given** un projet avec `.specify/specs/001-my-feature/state.json` au format speckit (currentStep: `plan`, completedSteps: `["specify", "clarify", "plan"]`), **When** l'utilisateur lance `devflow migrate-speckit`, **Then** le `state.json` est converti avec `currentStep: "plan"`, `completedSteps: ["constitution", "spec", "clarify", "review-spec", "plan"]`, les champs `stepTimestamps`, `reviewIterations`, `mode: "full"` et `skippedSteps` sont ajoutés, et un backup `.bak` est créé.
87
+
88
+ 2. **Given** un projet speckit sans `.specify/memory/constitution.md`, **When** l'utilisateur lance `devflow migrate-speckit`, **Then** la commande crée une constitution starter et avertit l'utilisateur de la personnaliser.
89
+
90
+ 3. **Given** un projet speckit avec plusieurs features à différentes étapes, **When** l'utilisateur lance `devflow migrate-speckit`, **Then** toutes les features sont migrées en batch automatique avec un rapport final récapitulatif (nombre migrées, skippées, erreurs).
91
+
92
+ ---
93
+
94
+ ### User Story 2 - Prévisualiser la migration (Priority: P1)
95
+
96
+ Un développeur veut vérifier ce que la migration va changer avant de l'exécuter.
97
+
98
+ **Why this priority** : La confiance dans l'outil passe par la transparence — un dry-run est essentiel pour l'adoption.
99
+
100
+ **Independent Test** : Lancer `devflow migrate-speckit --dry-run`, vérifier qu'aucun fichier n'est modifié et que le rapport est affiché.
101
+
102
+ **Acceptance Scenarios** :
103
+
104
+ 1. **Given** un projet speckit avec 3 features, **When** l'utilisateur lance `devflow migrate-speckit --dry-run`, **Then** un rapport affiche pour chaque feature : l'étape actuelle, l'étape cible après conversion, les champs ajoutés, et aucun fichier n'est modifié.
105
+
106
+ ---
107
+
108
+ ### User Story 3 - Nettoyer les commandes speckit (Priority: P2)
109
+
110
+ Après la migration, l'utilisateur veut supprimer les commandes `/speckit.*` de `~/.claude/commands/` pour éviter la confusion.
111
+
112
+ **Why this priority** : Confort d'usage — pas critique pour le fonctionnement, mais réduit la confusion.
113
+
114
+ **Independent Test** : Lancer la migration avec `--clean-speckit`, vérifier que les fichiers `speckit.*.md` sont supprimés de `~/.claude/commands/`.
115
+
116
+ **Acceptance Scenarios** :
117
+
118
+ 1. **Given** un projet migré et des commandes `/speckit.*` dans `~/.claude/commands/`, **When** l'utilisateur lance `devflow migrate-speckit --clean-speckit`, **Then** les fichiers `speckit.*.md` sont supprimés de `~/.claude/commands/` et un rapport liste les fichiers supprimés.
119
+
120
+ 2. **Given** un projet migré, **When** l'utilisateur lance `devflow migrate-speckit` sans `--clean-speckit`, **Then** un message informe que les commandes speckit sont toujours présentes et propose d'utiliser `--clean-speckit`.
121
+
122
+ ---
123
+
124
+ ### Edge Cases
125
+
126
+ - Que se passe-t-il si le `state.json` est déjà au format devflow ? La migration le détecte et le skip (idempotent).
127
+ - Que se passe-t-il si le `state.json` est corrompu ou illisible ? Un warning est affiché, la feature est skippée, les autres features sont traitées.
128
+ - Que se passe-t-il si le projet n'a aucune feature speckit ? Un message "Aucune feature speckit détectée" est affiché.
129
+ - Que se passe-t-il si une feature speckit est à l'étape `implement` ? Les étapes de review manquantes sont marquées comme implicitement validées (`reviewIterations: 0`) pour ne pas bloquer le pipeline.
130
+
131
+ ## Requirements
132
+
133
+ ### Functional Requirements
134
+
135
+ - **FR-001** : Le système DOIT détecter les features speckit en scannant les `state.json` dans `.specify/specs/` et en identifiant l'absence du champ `reviewIterations` (critère discriminant principal).
136
+ - **FR-002** : Le système DOIT convertir le mapping d'étapes speckit → devflow selon la table : `specify→spec`, `clarify→clarify`, `plan→plan`, `tasks→tasks`, `implement→implement`. Les étapes speckit `checklist` et `analyze` sont ignorées (non présentes dans devflow). Les étapes devflow intermédiaires manquantes (review gates, research, contracts, docs, done) sont injectées comme auto-validées avec `reviewIterations: 0` si l'utilisateur les a déjà dépassées.
137
+ - **FR-003** : Le système DOIT créer un backup `.bak` de chaque `state.json` avant modification.
138
+ - **FR-004** : Le système DOIT supporter un mode `--dry-run` qui affiche le plan de migration sans modifier de fichiers.
139
+ - **FR-005** : Le système DOIT être idempotent — relancer la migration sur un projet déjà migré ne produit aucun changement.
140
+ - **FR-006** : Le système DOIT détecter l'absence de `.specify/memory/constitution.md` et créer une constitution starter via le template générique (identique à `devflow init --with-constitution`), puis avertir l'utilisateur de la personnaliser.
141
+ - **FR-007** : Le système DOIT afficher un rapport final avec le nombre de features migrées, skippées et en erreur.
142
+ - **FR-008** : Le système DOIT supporter `--clean-speckit` pour supprimer les commandes `~/.claude/commands/speckit.*.md` et les templates `.specify/templates/` du projet courant. Les templates personnalisés (checksum différent de l'original speckit) sont conservés avec un avertissement.
143
+
144
+ ### Key Entities
145
+
146
+ - **SpeckitState** : un `state.json` au format speckit — identifiable par l'absence du champ `reviewIterations`.
147
+ - **StepMapping** : correspondance entre les étapes speckit et devflow : `specify→spec`, `clarify→clarify`, `plan→plan`, `tasks→tasks`, `implement→implement`. Les étapes `checklist` et `analyze` sont ignorées. Les étapes devflow intermédiaires sont injectées comme auto-validées si déjà dépassées.
148
+
149
+ ## Success Criteria
150
+
151
+ ### Measurable Outcomes
152
+
153
+ - **SC-001** : 100% des features speckit valides sont converties avec succès en une seule exécution.
154
+ - **SC-002** : Après migration, `devflow status` affiche correctement toutes les features converties avec leur étape actuelle.
155
+ - **SC-003** : No regression — les commandes existantes (`devflow feature`, `devflow status`, `devflow migrate`, `devflow rollback`) continuent de fonctionner identiquement après l'ajout de `migrate-speckit`.
156
+ - **SC-004** : La migration complète d'un projet avec 10 features prend moins de 5 secondes.
157
+
158
+ ## Assumptions
159
+
160
+ - Les projets speckit utilisent la structure `.specify/specs/` (pas un emplacement custom).
161
+ - Les `state.json` speckit suivent le format `FeatureState` existant (au minimum `issueId`, `currentStep`, `completedSteps`).
162
+ - Les artefacts markdown (spec.md, plan.md, tasks.md) sont compatibles entre speckit et devflow — seul le `state.json` nécessite une conversion.
163
+ - Les commandes speckit sont dans `~/.claude/commands/speckit.*.md` (emplacement standard).