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.
- devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/checklists/requirements.md +34 -0
- devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/data-model.md +87 -0
- devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/plan.md +74 -0
- devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/quickstart.md +64 -0
- devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/research.md +75 -0
- devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/spec.md +163 -0
- devflow_cli-2.2.0/.specify/specs/020-migrate-speckit/tasks.md +193 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/CLAUDE.md +6 -3
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/PKG-INFO +2 -2
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/README.md +1 -1
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/cli-reference.md +38 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/pyproject.toml +1 -1
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/__init__.py +12 -1
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/cli.py +2 -0
- devflow_cli-2.2.0/src/devflow_cli/commands/migrate_speckit.py +219 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/state.py +69 -1
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/conftest.py +14 -0
- devflow_cli-2.2.0/tests/test_cmd_migrate_speckit.py +282 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_state.py +132 -1
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.analyze.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.checklist.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.clarify.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.constitution.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.implement.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.specify.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.taskstoissues.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.github/workflows/ci.yml +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.github/workflows/release.yml +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.gitignore +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/init-options.json +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/memory/constitution.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/common.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/setup-plan.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/contracts/cli-init.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/data-model.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/contracts/cli-regen.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/contracts/cli-status-staleness.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/data-model.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/data-model.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/contracts/cli-commands.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/data-model.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/contracts/cli-upgrade.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/data-model.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/data-model.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/010-flexible-pipeline/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/011-cursor-support/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/012-fix-critical-bugs/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/013-align-truth-sources/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/quickstart.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/014-enforce-state-machine/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/015-fix-review-contradiction/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/016-harden-state-machine/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/017-fix-robustness-issues/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/018-fix-final-robustness/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/data-model.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/specs/019-quality-hardening/tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/agent-file-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/checklist-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/constitution-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/plan-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template-brownfield.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template-greenfield.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template-microservices.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/.specify/templates/tasks-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/CHANGELOG.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/CONTRIBUTING.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/LICENSE +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/agents/devflow-autofix.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/agents/devflow-review.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.analyze.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.checklist.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.clarify.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.constitution.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.context.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.contracts.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.docs.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.extension.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.implement.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.init.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.metrics.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.plan.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.regen.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.research.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.review-impl.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.review-spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.review-tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.spec.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.status.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.sync-linear.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.tasks-to-issues.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/commands/devflow.tasks.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/commands-reference.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/cursor-guide.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/guides/brownfield.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/guides/greenfield.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/guides/microservices.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/index.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/pipeline.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/docs/spec-driven.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/README.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/catalog.community.json +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/catalog.json +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/template/example-command.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/extensions/template/example-extension.json +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/__init__.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/check.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/context.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/export_cmd.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/extension.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/feature.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/init_cmd.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/migrate_cmd.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/regen.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/rollback.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/status.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/upgrade_cmd.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/__init__.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/catalog.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/git.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/hooks.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/installer.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/manifest.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/scanner.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/staleness.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/validators.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/__init__.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/console.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/paths.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/strings.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/agent-context-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/analyze-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklist-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklists/api.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklists/requirements.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklists/security.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/checklists/ux.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/clarify-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/constitution-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/README-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/api-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/components-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/interfaces-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts/services-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/contracts-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/data-model-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/devflow-hooks-template.yml +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/docs-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/export/copilot-instructions-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/export/cursor-rules-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/extension-manifest-template.json +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/plan-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/quickstart-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/research-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/review-impl-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/review-spec-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/review-tasks-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/spec-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/templates/tasks-template.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/fixtures/agents/mock-agent.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/fixtures/commands/mock-command.md +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/fixtures/mock-catalog.json +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/fixtures/mock-state.json +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/run-tests.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test-community-catalog.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test-helpers.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test-template-variants.sh +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_catalog.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_check.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_context.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_extension.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_feature.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_init.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_migrate.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_regen.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_status.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_cmd_upgrade.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_context.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_e2e_pipeline.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_git.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_hooks.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_installer.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_integration.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_manifest.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_paths.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_rollback.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_scanner.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_staleness.py +0 -0
- {devflow_cli-2.0.0 → devflow_cli-2.2.0}/tests/test_validators.py +0 -0
- {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).
|