devflow-cli 1.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-1.0.0 → devflow_cli-2.2.0}/.gitignore +1 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/memory/constitution.md +11 -1
- devflow_cli-2.2.0/.specify/specs/010-flexible-pipeline/checklists/requirements.md +36 -0
- devflow_cli-2.2.0/.specify/specs/010-flexible-pipeline/plan.md +139 -0
- devflow_cli-2.2.0/.specify/specs/010-flexible-pipeline/quickstart.md +38 -0
- devflow_cli-2.2.0/.specify/specs/010-flexible-pipeline/research.md +26 -0
- devflow_cli-2.2.0/.specify/specs/010-flexible-pipeline/spec.md +155 -0
- devflow_cli-2.2.0/.specify/specs/010-flexible-pipeline/tasks.md +126 -0
- devflow_cli-2.2.0/.specify/specs/011-cursor-support/checklists/requirements.md +36 -0
- devflow_cli-2.2.0/.specify/specs/011-cursor-support/plan.md +97 -0
- devflow_cli-2.2.0/.specify/specs/011-cursor-support/quickstart.md +30 -0
- devflow_cli-2.2.0/.specify/specs/011-cursor-support/research.md +20 -0
- devflow_cli-2.2.0/.specify/specs/011-cursor-support/spec.md +134 -0
- devflow_cli-2.2.0/.specify/specs/011-cursor-support/tasks.md +93 -0
- devflow_cli-2.2.0/.specify/specs/012-fix-critical-bugs/checklists/requirements.md +36 -0
- devflow_cli-2.2.0/.specify/specs/012-fix-critical-bugs/plan.md +129 -0
- devflow_cli-2.2.0/.specify/specs/012-fix-critical-bugs/research.md +58 -0
- devflow_cli-2.2.0/.specify/specs/012-fix-critical-bugs/spec.md +197 -0
- devflow_cli-2.2.0/.specify/specs/012-fix-critical-bugs/tasks.md +187 -0
- devflow_cli-2.2.0/.specify/specs/013-align-truth-sources/checklists/requirements.md +36 -0
- devflow_cli-2.2.0/.specify/specs/013-align-truth-sources/plan.md +224 -0
- devflow_cli-2.2.0/.specify/specs/013-align-truth-sources/quickstart.md +49 -0
- devflow_cli-2.2.0/.specify/specs/013-align-truth-sources/spec.md +213 -0
- devflow_cli-2.2.0/.specify/specs/013-align-truth-sources/tasks.md +206 -0
- devflow_cli-2.2.0/.specify/specs/014-enforce-state-machine/checklists/requirements.md +35 -0
- devflow_cli-2.2.0/.specify/specs/014-enforce-state-machine/plan.md +223 -0
- devflow_cli-2.2.0/.specify/specs/014-enforce-state-machine/quickstart.md +44 -0
- devflow_cli-2.2.0/.specify/specs/014-enforce-state-machine/spec.md +195 -0
- devflow_cli-2.2.0/.specify/specs/014-enforce-state-machine/tasks.md +211 -0
- devflow_cli-2.2.0/.specify/specs/015-fix-review-contradiction/checklists/requirements.md +35 -0
- devflow_cli-2.2.0/.specify/specs/015-fix-review-contradiction/plan.md +131 -0
- devflow_cli-2.2.0/.specify/specs/015-fix-review-contradiction/research.md +27 -0
- devflow_cli-2.2.0/.specify/specs/015-fix-review-contradiction/spec.md +153 -0
- devflow_cli-2.2.0/.specify/specs/015-fix-review-contradiction/tasks.md +111 -0
- devflow_cli-2.2.0/.specify/specs/016-harden-state-machine/checklists/requirements.md +35 -0
- devflow_cli-2.2.0/.specify/specs/016-harden-state-machine/plan.md +118 -0
- devflow_cli-2.2.0/.specify/specs/016-harden-state-machine/research.md +27 -0
- devflow_cli-2.2.0/.specify/specs/016-harden-state-machine/spec.md +120 -0
- devflow_cli-2.2.0/.specify/specs/016-harden-state-machine/tasks.md +96 -0
- devflow_cli-2.2.0/.specify/specs/017-fix-robustness-issues/checklists/requirements.md +35 -0
- devflow_cli-2.2.0/.specify/specs/017-fix-robustness-issues/plan.md +159 -0
- devflow_cli-2.2.0/.specify/specs/017-fix-robustness-issues/research.md +27 -0
- devflow_cli-2.2.0/.specify/specs/017-fix-robustness-issues/spec.md +150 -0
- devflow_cli-2.2.0/.specify/specs/017-fix-robustness-issues/tasks.md +111 -0
- devflow_cli-2.2.0/.specify/specs/019-quality-hardening/checklists/requirements.md +36 -0
- devflow_cli-2.2.0/.specify/specs/019-quality-hardening/data-model.md +52 -0
- devflow_cli-2.2.0/.specify/specs/019-quality-hardening/plan.md +178 -0
- devflow_cli-2.2.0/.specify/specs/019-quality-hardening/research.md +29 -0
- devflow_cli-2.2.0/.specify/specs/019-quality-hardening/spec.md +173 -0
- devflow_cli-2.2.0/.specify/specs/019-quality-hardening/tasks.md +192 -0
- 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.2.0/.specify/templates/spec-template-brownfield.md +127 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/CHANGELOG.md +37 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/CLAUDE.md +17 -4
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/PKG-INFO +6 -7
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/README.md +5 -5
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/agents/devflow-autofix.md +3 -3
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/agents/devflow-review.md +2 -2
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.clarify.md +1 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.constitution.md +2 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.md +32 -6
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.regen.md +5 -5
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.review-tasks.md +1 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.spec.md +1 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.status.md +6 -5
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/docs/cli-reference.md +83 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/docs/commands-reference.md +1 -1
- devflow_cli-2.2.0/docs/cursor-guide.md +75 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/docs/guides/greenfield.md +2 -2
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/docs/index.md +2 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/docs/pipeline.md +52 -2
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/pyproject.toml +1 -2
- devflow_cli-2.2.0/src/devflow_cli/__init__.py +78 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/cli.py +4 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/check.py +0 -16
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/context.py +8 -3
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/feature.py +17 -12
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/init_cmd.py +33 -11
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/migrate_cmd.py +6 -11
- devflow_cli-2.2.0/src/devflow_cli/commands/migrate_speckit.py +219 -0
- devflow_cli-2.2.0/src/devflow_cli/commands/rollback.py +53 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/status.py +43 -25
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/upgrade_cmd.py +4 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/git.py +11 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/installer.py +17 -17
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/scanner.py +5 -1
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/staleness.py +35 -10
- devflow_cli-2.2.0/src/devflow_cli/core/state.py +366 -0
- devflow_cli-2.2.0/src/devflow_cli/core/validators.py +182 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/paths.py +8 -13
- devflow_cli-2.2.0/src/devflow_cli/utils/strings.py +13 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/conftest.py +14 -0
- devflow_cli-2.2.0/tests/test_cmd_context.py +41 -0
- devflow_cli-2.2.0/tests/test_cmd_migrate_speckit.py +282 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_cmd_status.py +15 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_cmd_upgrade.py +40 -0
- devflow_cli-2.2.0/tests/test_context.py +45 -0
- devflow_cli-2.2.0/tests/test_e2e_pipeline.py +295 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_git.py +13 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_installer.py +67 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_integration.py +108 -0
- devflow_cli-2.2.0/tests/test_paths.py +42 -0
- devflow_cli-2.2.0/tests/test_rollback.py +497 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_scanner.py +25 -0
- devflow_cli-2.2.0/tests/test_staleness.py +258 -0
- devflow_cli-2.2.0/tests/test_state.py +771 -0
- devflow_cli-2.2.0/tests/test_validators.py +355 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/uv.lock +0 -79
- devflow_cli-1.0.0/scripts/check-prerequisites.ps1 +0 -125
- devflow_cli-1.0.0/scripts/check-prerequisites.sh +0 -129
- devflow_cli-1.0.0/scripts/devflow-cli.ps1 +0 -227
- devflow_cli-1.0.0/scripts/devflow-cli.sh +0 -256
- devflow_cli-1.0.0/scripts/devflow-extension.ps1 +0 -267
- devflow_cli-1.0.0/scripts/devflow-extension.sh +0 -390
- devflow_cli-1.0.0/scripts/export-agents.sh +0 -130
- devflow_cli-1.0.0/scripts/setup-feature.ps1 +0 -75
- devflow_cli-1.0.0/scripts/setup-feature.sh +0 -75
- devflow_cli-1.0.0/scripts/update-agent-context.ps1 +0 -162
- devflow_cli-1.0.0/scripts/update-agent-context.sh +0 -325
- devflow_cli-1.0.0/scripts/validate-hooks.ps1 +0 -71
- devflow_cli-1.0.0/scripts/validate-hooks.sh +0 -81
- devflow_cli-1.0.0/src/devflow_cli/__init__.py +0 -51
- devflow_cli-1.0.0/src/devflow_cli/core/state.py +0 -69
- devflow_cli-1.0.0/tests/test-devflow-cli.sh +0 -134
- devflow_cli-1.0.0/tests/test-devflow-extension.sh +0 -143
- devflow_cli-1.0.0/tests/test-setup-feature.sh +0 -121
- devflow_cli-1.0.0/tests/test_staleness.py +0 -119
- devflow_cli-1.0.0/tests/test_state.py +0 -63
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.analyze.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.checklist.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.clarify.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.constitution.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.implement.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.specify.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.claude/commands/speckit.taskstoissues.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.github/workflows/ci.yml +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.github/workflows/release.yml +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/init-options.json +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/common.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/setup-plan.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/contracts/cli-init.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/data-model.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/001-cli-init-options/tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/contracts/cli-regen.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/contracts/cli-status-staleness.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/data-model.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/002-cascade-regen/tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/data-model.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/quickstart.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/003-usecase-guides/tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/contracts/cli-commands.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/data-model.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/quickstart.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/004-specify-central-directory/tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/quickstart.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/005-implement-subphases/tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/contracts/cli-upgrade.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/data-model.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/quickstart.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/006-template-upgrade/tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/data-model.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/quickstart.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/007-project-documentation/tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/quickstart.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/008-hardening-bugs/tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/quickstart.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/specs/009-ci-pypi/tasks.md +0 -0
- /devflow_cli-1.0.0/.specify/templates/spec-template-brownfield.md → /devflow_cli-2.2.0/.specify/specs/018-fix-final-robustness/spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/templates/agent-file-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/templates/checklist-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/templates/constitution-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/templates/plan-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template-greenfield.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template-microservices.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/templates/spec-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/.specify/templates/tasks-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/CONTRIBUTING.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/LICENSE +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.analyze.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.checklist.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.context.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.contracts.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.docs.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.extension.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.implement.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.init.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.metrics.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.plan.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.research.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.review-impl.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.review-spec.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.sync-linear.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.tasks-to-issues.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/commands/devflow.tasks.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/docs/guides/brownfield.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/docs/guides/microservices.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/docs/spec-driven.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/extensions/EXTENSION-API-REFERENCE.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/extensions/EXTENSION-DEVELOPMENT-GUIDE.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/extensions/README.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/extensions/catalog.community.json +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/extensions/catalog.json +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/extensions/template/example-command.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/extensions/template/example-extension.json +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/__init__.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/export_cmd.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/extension.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/commands/regen.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/__init__.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/catalog.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/hooks.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/core/manifest.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/__init__.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/src/devflow_cli/utils/console.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/agent-context-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/analyze-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/checklist-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/checklists/api.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/checklists/requirements.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/checklists/security.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/checklists/ux.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/clarify-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/constitution-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/contracts/README-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/contracts/api-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/contracts/components-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/contracts/interfaces-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/contracts/services-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/contracts-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/data-model-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/devflow-hooks-template.yml +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/docs-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/export/copilot-instructions-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/export/cursor-rules-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/extension-manifest-template.json +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/plan-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/quickstart-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/research-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/review-impl-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/review-spec-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/review-tasks-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/spec-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/templates/tasks-template.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/fixtures/agents/mock-agent.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/fixtures/commands/mock-command.md +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/fixtures/mock-catalog.json +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/fixtures/mock-state.json +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/run-tests.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test-community-catalog.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test-helpers.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test-template-variants.sh +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_catalog.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_cmd_check.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_cmd_extension.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_cmd_feature.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_cmd_init.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_cmd_migrate.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_cmd_regen.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_hooks.py +0 -0
- {devflow_cli-1.0.0 → devflow_cli-2.2.0}/tests/test_manifest.py +0 -0
|
@@ -159,7 +159,7 @@ prévaut. Un conflit détecté DOIT être résolu avant progression.
|
|
|
159
159
|
- La complexité ajoutée DOIT être justifiée explicitement ;
|
|
160
160
|
la charge de la preuve incombe à celui qui ajoute la complexité.
|
|
161
161
|
|
|
162
|
-
**Version**: 1.
|
|
162
|
+
**Version**: 1.3.0 | **Ratified**: 2026-03-15 | **Last Amended**: 2026-03-20
|
|
163
163
|
|
|
164
164
|
### Amendment Log
|
|
165
165
|
|
|
@@ -167,3 +167,13 @@ prévaut. Un conflit détecté DOIT être résolu avant progression.
|
|
|
167
167
|
`docs/features/{{ISSUE_ID}}/` vers `.specify/specs/{{NAME}}/`.
|
|
168
168
|
Justification: alignement avec spec-kit, decouplage documentation/specs.
|
|
169
169
|
Migration: fallback triple + commande `devflow migrate`.
|
|
170
|
+
- **1.2.0** (2026-03-15): Principe III amendé — ajout exception mode
|
|
171
|
+
fast pour les review gates. Les gates restent obligatoires en mode
|
|
172
|
+
full. Justification: réduction overhead pour features simples
|
|
173
|
+
(bug fix, documentation, spike). Filet de sécurité: pre-commit review.
|
|
174
|
+
- **1.3.0** (2026-03-20): Principe III amendé — retrait exception mode
|
|
175
|
+
fast pour les review gates. Les gates sont désormais obligatoires
|
|
176
|
+
quel que soit le mode. Justification: l'exception créait une
|
|
177
|
+
contradiction architecturale (reviews dans OPTIONAL_STEPS vs
|
|
178
|
+
contrainte "Ne jamais sauter une review"). Filet de sécurité
|
|
179
|
+
additionnel: pre-commit review toujours actif.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Specification Quality Checklist: Pipeline flexible avec étapes optionnelles
|
|
2
|
+
|
|
3
|
+
**Purpose**: Validate specification completeness and quality before proceeding to planning
|
|
4
|
+
**Created**: 2026-03-15
|
|
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 is ready for `/speckit.plan`.
|
|
35
|
+
- Constitution Principe IV (rétrocompatibilité) est le garde-fou principal : les state.json existants restent valides.
|
|
36
|
+
- Les review gates (review-spec, review-tasks, review-impl) sont optionnelles en mode fast mais le pre-commit review reste actif.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Implementation Plan: Pipeline flexible avec étapes optionnelles
|
|
2
|
+
|
|
3
|
+
**Branch**: `010-flexible-pipeline` | **Date**: 2026-03-15 | **Spec**: [spec.md](./spec.md)
|
|
4
|
+
**Input**: Feature specification from `/specs/010-flexible-pipeline/spec.md`
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
|
|
8
|
+
Rendre le pipeline devflow flexible en distinguant étapes obligatoires (`spec`, `plan`, `tasks`, `implement`) et optionnelles (`clarify`, `review-spec`, `research`, `contracts`, `review-tasks`, `review-impl`, `docs`). Ajouter un mode `fast` (4 étapes) à `devflow feature --fast`. Amender la constitution Principe III pour autoriser le skip des review gates en mode fast.
|
|
9
|
+
|
|
10
|
+
## Technical Context
|
|
11
|
+
|
|
12
|
+
**Language/Version**: Python 3.11
|
|
13
|
+
**Primary Dependencies**: typer, rich
|
|
14
|
+
**Storage**: state.json (fichier local)
|
|
15
|
+
**Testing**: pytest (115+ tests)
|
|
16
|
+
**Target Platform**: macOS, Linux (CLI)
|
|
17
|
+
**Project Type**: CLI toolkit
|
|
18
|
+
**Constraints**: Rétrocompatibilité totale state.json (Principe IV)
|
|
19
|
+
**Scale/Scope**: 4 fichiers Python modifiés + 2 fichiers doc modifiés + 1 amendement constitution
|
|
20
|
+
|
|
21
|
+
## Constitution Check
|
|
22
|
+
|
|
23
|
+
| Principe | Statut | Justification |
|
|
24
|
+
|----------|--------|---------------|
|
|
25
|
+
| I. Spec-Driven Development | PASS | spec.md validée et clarifiée |
|
|
26
|
+
| II. Pipeline Séquentiel | PASS | l'ordre est préservé — seules certaines étapes sont sautées, pas réordonnées |
|
|
27
|
+
| III. Gates de Review | AMENDEMENT REQUIS | Les review gates deviennent optionnelles en mode fast. Clarification acceptée : le pre-commit review reste comme filet de sécurité. L'amendement est une tâche explicite (FR-009). |
|
|
28
|
+
| IV. Rétrocompatibilité | PASS | FR-008 : state.json sans `mode` = `full` par défaut |
|
|
29
|
+
| V. Simplicité (YAGNI) | PASS | ajout minimal (`mode` + `skippedSteps` dans state.json, `--fast` dans feature) |
|
|
30
|
+
| VI. Testabilité | PASS | tests existants protègent le mode full, nouveaux tests pour le mode fast |
|
|
31
|
+
| VII. Intégration Linear | PASS | étapes sautées ne sont pas traversées, mapping inchangé |
|
|
32
|
+
|
|
33
|
+
**Verdict** : PASS avec amendement constitution Principe III.
|
|
34
|
+
|
|
35
|
+
## Project Structure
|
|
36
|
+
|
|
37
|
+
### Source Code (fichiers à modifier)
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
src/devflow_cli/
|
|
41
|
+
├── __init__.py # FR-001 : OPTIONAL_STEPS constant
|
|
42
|
+
├── core/
|
|
43
|
+
│ └── state.py # FR-003, FR-005 : mode + skippedSteps dans FeatureState
|
|
44
|
+
├── commands/
|
|
45
|
+
│ └── feature.py # FR-004 : option --fast
|
|
46
|
+
└── (status.py lu par commande status — pas de modification directe si Rich formatting suffisant)
|
|
47
|
+
|
|
48
|
+
commands/
|
|
49
|
+
└── devflow.md # FR-002 : orchestrateur propose skip
|
|
50
|
+
|
|
51
|
+
docs/
|
|
52
|
+
└── pipeline.md # FR-007 : étapes optionnelles marquées
|
|
53
|
+
|
|
54
|
+
.specify/memory/
|
|
55
|
+
└── constitution.md # FR-009 : amendement Principe III
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Design Decisions
|
|
59
|
+
|
|
60
|
+
### DD-001 : Constante OPTIONAL_STEPS dans __init__.py
|
|
61
|
+
|
|
62
|
+
**Décision** : ajouter `OPTIONAL_STEPS = {"clarify", "review-spec", "research", "contracts", "review-tasks", "review-impl", "docs"}` à côté de `STEPS`.
|
|
63
|
+
|
|
64
|
+
**Rationale** : source de vérité unique pour distinguer obligatoire vs optionnel. Utilisé par l'orchestrateur, le status, et la documentation.
|
|
65
|
+
|
|
66
|
+
### DD-002 : Champ `mode` dans state.json
|
|
67
|
+
|
|
68
|
+
**Décision** : ajouter `mode: str = "full"` dans `FeatureState`. Valeurs possibles : `"full"` | `"fast"`.
|
|
69
|
+
|
|
70
|
+
**Rationale** : le mode détermine quelles étapes sont requises. En `fast`, seules `spec`, `plan`, `tasks`, `implement` (+ `done` terminal) sont requises. En `full`, toutes les 13 étapes.
|
|
71
|
+
|
|
72
|
+
### DD-003 : Champ `skippedSteps` dans state.json
|
|
73
|
+
|
|
74
|
+
**Décision** : ajouter `skippedSteps: list[str] = []` dans `FeatureState`.
|
|
75
|
+
|
|
76
|
+
**Rationale** : distinguer "pas encore fait" de "explicitement sauté". Permet à `devflow status` d'afficher la progression correctement.
|
|
77
|
+
|
|
78
|
+
### DD-004 : `total_steps` dynamique
|
|
79
|
+
|
|
80
|
+
**Décision** : `total_steps` dans `FeatureState` retourne `len(STEPS) - len(skippedSteps)` au lieu de `len(STEPS)` fixe.
|
|
81
|
+
|
|
82
|
+
**Rationale** : la progression affichée doit refléter le nombre d'étapes réellement requises, pas le total théorique.
|
|
83
|
+
|
|
84
|
+
### DD-005 : Mode fast = skip automatique dans l'orchestrateur
|
|
85
|
+
|
|
86
|
+
**Décision** : quand `mode == "fast"`, l'orchestrateur (`/devflow`) saute automatiquement les étapes optionnelles sans demander. En mode `full`, il propose le skip avec confirmation.
|
|
87
|
+
|
|
88
|
+
**Rationale** : le mode fast est opt-in explicite — pas besoin de re-confirmer chaque skip.
|
|
89
|
+
|
|
90
|
+
### DD-006 : Amendement constitution minimaliste
|
|
91
|
+
|
|
92
|
+
**Décision** : ajouter une exception au Principe III : "En mode fast (`state.json: mode = "fast"`), les review gates sont optionnelles. Le pre-commit review (`pre-commit-review` agent) reste actif comme filet de sécurité."
|
|
93
|
+
|
|
94
|
+
**Rationale** : amendement mineur (MINOR version bump), pas de suppression de principe.
|
|
95
|
+
|
|
96
|
+
## Changements par fichier
|
|
97
|
+
|
|
98
|
+
### `__init__.py` (FR-001)
|
|
99
|
+
|
|
100
|
+
Ajouter après `STEPS` :
|
|
101
|
+
```python
|
|
102
|
+
OPTIONAL_STEPS = {"clarify", "review-spec", "research", "contracts", "review-tasks", "review-impl", "docs"}
|
|
103
|
+
FAST_STEPS = ["spec", "plan", "tasks", "implement", "done"]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### `state.py` (FR-003, FR-005)
|
|
107
|
+
|
|
108
|
+
Ajouter à `FeatureState` :
|
|
109
|
+
- `mode: str = "full"`
|
|
110
|
+
- `skippedSteps: list[str] = field(default_factory=list)`
|
|
111
|
+
- Modifier `total_steps` → `len(STEPS) - len(self.skippedSteps)`
|
|
112
|
+
|
|
113
|
+
### `feature.py` (FR-004)
|
|
114
|
+
|
|
115
|
+
Ajouter option `--fast` :
|
|
116
|
+
- `fast: bool = typer.Option(False, "--fast", help="Mode minimal (4 étapes)")`
|
|
117
|
+
- Si `fast=True`, passer `mode="fast"` à `create_state()`
|
|
118
|
+
- Modifier `create_state()` pour accepter un paramètre `mode`
|
|
119
|
+
|
|
120
|
+
### `commands/devflow.md` (FR-002)
|
|
121
|
+
|
|
122
|
+
Mettre à jour l'orchestrateur pour :
|
|
123
|
+
- Lire `mode` depuis state.json
|
|
124
|
+
- En mode fast : sauter automatiquement les étapes dans `OPTIONAL_STEPS`
|
|
125
|
+
- En mode full : proposer le skip des étapes optionnelles avec confirmation
|
|
126
|
+
|
|
127
|
+
### `docs/pipeline.md` (FR-007)
|
|
128
|
+
|
|
129
|
+
Ajouter une colonne "Obligatoire" au tableau des étapes et une section "Mode fast".
|
|
130
|
+
|
|
131
|
+
### `.specify/memory/constitution.md` (FR-009)
|
|
132
|
+
|
|
133
|
+
Amender Principe III : ajout exception mode fast. Bump version 1.1.0 → 1.2.0 (MINOR).
|
|
134
|
+
|
|
135
|
+
## Complexity Tracking
|
|
136
|
+
|
|
137
|
+
| Violation | Why Needed | Simpler Alternative Rejected Because |
|
|
138
|
+
|-----------|------------|-------------------------------------|
|
|
139
|
+
| Amendement constitution Principe III | Mode fast nécessite skip des review gates | Garder les gates obligatoires en fast = 7 étapes minimum, annule l'intérêt du mode fast |
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Quickstart: Pipeline flexible avec étapes optionnelles
|
|
2
|
+
|
|
3
|
+
**Feature**: 010-flexible-pipeline
|
|
4
|
+
**Date**: 2026-03-15
|
|
5
|
+
|
|
6
|
+
## Ordre d'exécution
|
|
7
|
+
|
|
8
|
+
1. **`__init__.py`** — ajouter `OPTIONAL_STEPS` et `FAST_STEPS` (fondation)
|
|
9
|
+
2. **`state.py`** — ajouter `mode` + `skippedSteps` + `total_steps` dynamique
|
|
10
|
+
3. **`feature.py`** — ajouter `--fast` option + passer mode à create_state
|
|
11
|
+
4. **`commands/devflow.md`** — orchestrateur : skip auto en fast, proposition en full
|
|
12
|
+
5. **`constitution.md`** — amendement Principe III
|
|
13
|
+
6. **`docs/pipeline.md`** — marquer étapes optionnelles
|
|
14
|
+
|
|
15
|
+
## Validation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Tests existants passent toujours
|
|
19
|
+
pytest tests/ -v
|
|
20
|
+
|
|
21
|
+
# Test mode fast
|
|
22
|
+
devflow feature TEST-FAST --fast
|
|
23
|
+
# Vérifier state.json contient mode: "fast"
|
|
24
|
+
|
|
25
|
+
# Test status en mode fast
|
|
26
|
+
devflow status
|
|
27
|
+
# Vérifier progression sur 4 étapes (pas 13)
|
|
28
|
+
|
|
29
|
+
# Test rétrocompat
|
|
30
|
+
# Prendre un state.json existant sans champ mode → doit fonctionner en mode full
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Points d'attention
|
|
34
|
+
|
|
35
|
+
- `create_state()` doit accepter un paramètre `mode` optionnel sans casser les appels existants
|
|
36
|
+
- `FeatureState.__dataclass_fields__` filtrage dans `read_state()` gère automatiquement les nouveaux champs (absent = default)
|
|
37
|
+
- L'amendement constitution doit bumper la version (1.1.0 → 1.2.0 MINOR)
|
|
38
|
+
- Les tests existants utilisent `create_state(path, issue_id)` sans `mode` — doivent continuer de fonctionner
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Research: Pipeline flexible avec étapes optionnelles
|
|
2
|
+
|
|
3
|
+
**Feature**: 010-flexible-pipeline
|
|
4
|
+
**Date**: 2026-03-15
|
|
5
|
+
|
|
6
|
+
## Décisions
|
|
7
|
+
|
|
8
|
+
### R-001 : Représentation du mode dans state.json
|
|
9
|
+
|
|
10
|
+
**Décision** : champ `mode` avec valeurs `"full"` | `"fast"`, défaut `"full"`.
|
|
11
|
+
|
|
12
|
+
**Rationale** : simple, extensible (on pourrait ajouter `"custom"` plus tard), rétrocompatible (state.json sans `mode` = `"full"`).
|
|
13
|
+
|
|
14
|
+
**Alternatives** : liste des étapes requises dans state.json — trop verbeux, risque de désynchronisation avec `STEPS`.
|
|
15
|
+
|
|
16
|
+
### R-002 : Skip explicite vs implicite
|
|
17
|
+
|
|
18
|
+
**Décision** : en mode fast, le skip est automatique (implicite). En mode full, le skip est proposé par l'orchestrateur (explicite avec confirmation).
|
|
19
|
+
|
|
20
|
+
**Rationale** : le mode fast est un choix délibéré au `devflow feature --fast` — pas besoin de re-confirmer. En mode full, le skip est une exception qui mérite attention.
|
|
21
|
+
|
|
22
|
+
### R-003 : Impact sur `devflow status`
|
|
23
|
+
|
|
24
|
+
**Décision** : `total_steps` dynamique basé sur `len(STEPS) - len(skippedSteps)`. Les étapes sautées sont affichées avec un marqueur visuel distinct (ex: `⊘` ou `[skipped]`).
|
|
25
|
+
|
|
26
|
+
**Rationale** : la barre de progression doit refléter la réalité. Un 4/13 qui devrait être 4/4 est trompeur.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Feature Specification: Pipeline flexible avec étapes optionnelles
|
|
2
|
+
|
|
3
|
+
**Feature Branch**: `010-flexible-pipeline`
|
|
4
|
+
**Created**: 2026-03-15
|
|
5
|
+
**Status**: Draft
|
|
6
|
+
**Project Type**: Brownfield
|
|
7
|
+
**Input**: Réduire l'overhead du pipeline devflow en rendant certaines étapes optionnelles et en ajoutant un mode "fast" pour les features simples.
|
|
8
|
+
|
|
9
|
+
## Clarifications
|
|
10
|
+
|
|
11
|
+
### Session 2026-03-15
|
|
12
|
+
|
|
13
|
+
- Q: Review gates en mode fast vs Constitution Principe III (NON-NÉGOCIABLE) ? → A: Review gates optionnelles en mode fast, obligatoires en mode full. Le mode fast est un trade-off assumé (vitesse vs rigueur). Le pre-commit review reste comme filet de sécurité. Nécessite un amendement mineur de la constitution (Principe III : ajout d'une exception pour le mode fast).
|
|
14
|
+
- Q: Étapes `constitution` et `done` — obligatoires ou optionnelles ? → A: `constitution` est un pré-requis projet (hors pipeline feature), `done` est un état terminal automatique. Ni l'un ni l'autre ne sont dans les listes obligatoire/optionnel — ils sont hors scope du mode fast/full.
|
|
15
|
+
|
|
16
|
+
## Comportement existant
|
|
17
|
+
|
|
18
|
+
### État actuel
|
|
19
|
+
|
|
20
|
+
Le pipeline devflow impose 13 étapes séquentielles obligatoires :
|
|
21
|
+
`constitution → spec → clarify → review-spec → research → plan → contracts → tasks → review-tasks → implement → review-impl → docs → done`
|
|
22
|
+
|
|
23
|
+
Le `state.json` enregistre `currentStep` et `completedSteps`. L'orchestrateur (`/devflow`) vérifie que chaque étape est complétée avant de passer à la suivante.
|
|
24
|
+
|
|
25
|
+
**Tolérance implicite existante** : la commande `/devflow` (orchestrateur) reconnaît déjà que certaines étapes peuvent être absentes de `completedSteps` sans bloquer :
|
|
26
|
+
- `clarify` absent quand `currentStep` >= `review-spec`
|
|
27
|
+
- `research` absent quand `currentStep` >= `plan`
|
|
28
|
+
- `contracts` absent quand `currentStep` >= `tasks`
|
|
29
|
+
|
|
30
|
+
La constitution (Principe IV) impose que les `state.json` sans `clarify`, `research` ou `contracts` dans `completedSteps` restent valides.
|
|
31
|
+
|
|
32
|
+
### Flux existants
|
|
33
|
+
|
|
34
|
+
1. **Flux complet** : un développeur exécute les 13 commandes dans l'ordre. Chaque commande produit un artefact et fait avancer `currentStep`.
|
|
35
|
+
2. **Flux avec skip implicite** : un développeur saute `clarify` ou `research` en passant directement à l'étape suivante. L'orchestrateur tolère mais ne guide pas explicitement.
|
|
36
|
+
|
|
37
|
+
### Dépendances identifiées
|
|
38
|
+
|
|
39
|
+
- **`__init__.py:STEPS`** : liste ordonnée des 13 étapes, utilisée par `state.py` et l'orchestrateur
|
|
40
|
+
- **`state.py:FeatureState`** : structure du state.json, `total_steps` calculé depuis `STEPS`
|
|
41
|
+
- **`commands/devflow.md`** : orchestrateur qui lit `currentStep` et décide la prochaine commande
|
|
42
|
+
- **Constitution Principe IV** : rétrocompatibilité des state.json sans étapes optionnelles
|
|
43
|
+
- **Constitution Principe II** : pipeline séquentiel obligatoire (doit être respecté même en mode fast)
|
|
44
|
+
|
|
45
|
+
### Limitations connues
|
|
46
|
+
|
|
47
|
+
- Aucune commande pour sauter explicitement une étape — le skip est implicite et non documenté
|
|
48
|
+
- Pas de mode "fast" ou "minimal" pour les features simples (bug fix, documentation, spike)
|
|
49
|
+
- L'utilisateur ne sait pas quelles étapes sont optionnelles vs obligatoires
|
|
50
|
+
- Le `total_steps` dans `state.py` compte toujours 13 même si des étapes sont sautées — la progression affichée est trompeuse
|
|
51
|
+
|
|
52
|
+
## Impact sur l'existant
|
|
53
|
+
|
|
54
|
+
### Composants affectés
|
|
55
|
+
|
|
56
|
+
- **`__init__.py`** : ajout de la notion d'étapes optionnelles (modifié)
|
|
57
|
+
- **`state.py`** : adaptation de `total_steps` pour exclure les étapes sautées (modifié)
|
|
58
|
+
- **`commands/devflow.md`** : orchestrateur mis à jour pour proposer le skip d'étapes optionnelles (modifié)
|
|
59
|
+
- **Documentation** : `docs/pipeline.md` et `README.md` mis à jour pour refléter la flexibilité (modifié)
|
|
60
|
+
|
|
61
|
+
### Risques de régression
|
|
62
|
+
|
|
63
|
+
- **state.json existants** : aucun risque — les state.json sans étapes optionnelles restent valides (Principe IV)
|
|
64
|
+
- **Pipeline séquentiel** : les étapes obligatoires (spec, plan, tasks, implement) ne peuvent pas être sautées — le risque est de permettre un skip trop permissif. Atténuation : les review gates restent obligatoires par défaut.
|
|
65
|
+
- **Linear mapping** : les étapes sautées ne doivent pas casser la synchronisation Linear. Atténuation : sauter une étape ne change pas le mapping, elle n'est simplement pas traversée.
|
|
66
|
+
|
|
67
|
+
### Stratégie de migration
|
|
68
|
+
|
|
69
|
+
Rétrocompatible. Les state.json existants restent valides. Le mode "fast" est opt-in (pas de changement de comportement par défaut). Les features en cours ne sont pas affectées.
|
|
70
|
+
|
|
71
|
+
## User Scenarios & Testing
|
|
72
|
+
|
|
73
|
+
### User Story 1 — Sauter une étape optionnelle explicitement (Priority: P1)
|
|
74
|
+
|
|
75
|
+
Un développeur travaille sur un bug fix simple. Après la spec, il veut passer directement au plan sans exécuter `clarify` ni `review-spec`. L'orchestrateur lui propose de sauter les étapes optionnelles.
|
|
76
|
+
|
|
77
|
+
**Why this priority** : c'est le cas d'usage le plus fréquent — la majorité des features ne nécessitent pas toutes les 13 étapes.
|
|
78
|
+
|
|
79
|
+
**Independent Test** : exécuter `/devflow` après `spec`, vérifier que les étapes optionnelles sont proposées comme skip-ables.
|
|
80
|
+
|
|
81
|
+
**Acceptance Scenarios** :
|
|
82
|
+
|
|
83
|
+
1. **Given** une feature dont `currentStep` est `clarify`, **When** le développeur exécute `/devflow`, **Then** l'orchestrateur propose de sauter `clarify` (optionnel) ou de l'exécuter.
|
|
84
|
+
2. **Given** un développeur qui choisit de sauter `clarify`, **When** le skip est confirmé, **Then** `currentStep` avance à `review-spec` (ou la prochaine étape non-sautée) et `clarify` est marqué comme `skipped` dans le state.json.
|
|
85
|
+
3. **Given** une feature avec des étapes sautées, **When** `devflow status` est exécuté, **Then** les étapes sautées sont affichées distinctement des étapes complétées.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### User Story 2 — Lancer une feature en mode fast (Priority: P1)
|
|
90
|
+
|
|
91
|
+
Un développeur veut créer une feature avec un pipeline minimal (4 étapes : spec → plan → tasks → implement). Il ne veut pas être guidé à travers les 13 étapes.
|
|
92
|
+
|
|
93
|
+
**Why this priority** : réduit l'overhead de 13 à 4 étapes pour les features simples, répondant directement à la critique "waterfall déguisé".
|
|
94
|
+
|
|
95
|
+
**Independent Test** : créer une feature en mode fast et vérifier que seules 4 étapes sont requises.
|
|
96
|
+
|
|
97
|
+
**Acceptance Scenarios** :
|
|
98
|
+
|
|
99
|
+
1. **Given** un développeur qui exécute `devflow feature KS-456 --fast`, **When** la feature est créée, **Then** le state.json contient un champ indiquant le mode fast et seules les étapes `spec`, `plan`, `tasks`, `implement` sont requises.
|
|
100
|
+
2. **Given** une feature en mode fast, **When** le développeur exécute `/devflow`, **Then** l'orchestrateur ne propose que les 4 étapes (pas clarify, research, contracts, review gates, docs).
|
|
101
|
+
3. **Given** une feature en mode fast, **When** `devflow status` est exécuté, **Then** la progression est calculée sur 4 étapes (pas 13).
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
### User Story 3 — Voir clairement quelles étapes sont obligatoires vs optionnelles (Priority: P2)
|
|
106
|
+
|
|
107
|
+
Un nouvel utilisateur de devflow consulte la documentation ou exécute `devflow status`. Il veut comprendre quelles étapes il doit absolument faire et lesquelles il peut sauter.
|
|
108
|
+
|
|
109
|
+
**Why this priority** : sans cette visibilité, l'utilisateur ne sait pas qu'il peut sauter des étapes.
|
|
110
|
+
|
|
111
|
+
**Independent Test** : exécuter `devflow status` et vérifier que les étapes optionnelles sont marquées distinctement.
|
|
112
|
+
|
|
113
|
+
**Acceptance Scenarios** :
|
|
114
|
+
|
|
115
|
+
1. **Given** un développeur qui consulte `docs/pipeline.md`, **When** il lit la documentation, **Then** chaque étape est marquée comme obligatoire ou optionnelle.
|
|
116
|
+
2. **Given** un développeur qui exécute `devflow status KS-123`, **When** le statut s'affiche, **Then** les étapes optionnelles sont visuellement distinctes (couleur, icône ou label).
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
### Edge Cases
|
|
121
|
+
|
|
122
|
+
- Que se passe-t-il si un développeur saute `review-spec` en mode full ? Les review gates sont obligatoires en mode full — le skip nécessite un avertissement explicite. En mode fast, les review gates sont automatiquement sautées.
|
|
123
|
+
- Que se passe-t-il si un développeur en mode fast veut revenir au mode complet mid-feature ? Le mode doit pouvoir être changé à tout moment (le state.json enregistre le mode, pas les étapes futures).
|
|
124
|
+
- Que se passe-t-il si un state.json existant n'a pas de champ `mode` ? Le mode par défaut est `full` (13 étapes) — rétrocompatibilité Principe IV.
|
|
125
|
+
- Que se passe-t-il si toutes les review gates sont sautées en mode fast ? Le commit `/review` (pre-commit) reste actif comme filet de sécurité.
|
|
126
|
+
|
|
127
|
+
## Requirements
|
|
128
|
+
|
|
129
|
+
### Functional Requirements
|
|
130
|
+
|
|
131
|
+
- **FR-001** : Le système DOIT distinguer les étapes obligatoires et optionnelles du pipeline. Étapes obligatoires : `spec`, `plan`, `tasks`, `implement`. Étapes optionnelles : `clarify`, `review-spec`, `research`, `contracts`, `review-tasks`, `review-impl`, `docs`. Note : `constitution` est un pré-requis projet (hors pipeline feature) et `done` est un état terminal automatique — ni l'un ni l'autre ne sont concernés par le mode fast/full.
|
|
132
|
+
- **FR-002** : L'orchestrateur (`/devflow`) DOIT proposer de sauter les étapes optionnelles quand elles sont la prochaine étape courante.
|
|
133
|
+
- **FR-003** : Le state.json DOIT enregistrer les étapes sautées (champ `skippedSteps` ou marqueur dans `completedSteps`).
|
|
134
|
+
- **FR-004** : La commande `devflow feature` DOIT accepter une option `--fast` qui configure le mode minimal (4 étapes obligatoires uniquement).
|
|
135
|
+
- **FR-005** : Le state.json DOIT supporter un champ `mode` (`full` | `fast`) avec valeur par défaut `full` pour les state.json existants.
|
|
136
|
+
- **FR-006** : La commande `devflow status` DOIT afficher la progression en fonction du mode (4 ou 13 étapes) et distinguer visuellement les étapes sautées.
|
|
137
|
+
- **FR-007** : La documentation (`docs/pipeline.md`) DOIT indiquer clairement quelles étapes sont optionnelles.
|
|
138
|
+
- **FR-008** : Les state.json existants sans champ `mode` DOIVENT rester valides et fonctionner en mode `full` par défaut (Principe IV constitution).
|
|
139
|
+
- **FR-009** : La constitution DOIT être amendée (Principe III) pour autoriser le skip des review gates en mode fast, avec mention explicite que le pre-commit review reste actif comme filet de sécurité.
|
|
140
|
+
|
|
141
|
+
### Key Entities
|
|
142
|
+
|
|
143
|
+
- **Mode de pipeline** : `full` (13 étapes, par défaut) ou `fast` (4 étapes : spec, plan, tasks, implement).
|
|
144
|
+
- **Étape optionnelle** : étape qui peut être sautée sans bloquer la progression du pipeline.
|
|
145
|
+
- **Étape sautée** : étape optionnelle qui a été explicitement ignorée par le développeur.
|
|
146
|
+
|
|
147
|
+
## Success Criteria
|
|
148
|
+
|
|
149
|
+
### Measurable Outcomes
|
|
150
|
+
|
|
151
|
+
- **SC-001** : Un développeur peut compléter une feature en mode fast en 4 étapes au lieu de 13 — vérifié par test end-to-end.
|
|
152
|
+
- **SC-002** : `devflow status` affiche la progression correcte selon le mode (4/4 en fast, X/13 en full) — vérifié par test.
|
|
153
|
+
- **SC-003** : Les state.json existants (sans champ `mode`) continuent de fonctionner sans modification — vérifié par les 115+ tests existants.
|
|
154
|
+
- **SC-004** : La documentation pipeline indique clairement les étapes optionnelles — vérifié par lecture.
|
|
155
|
+
- **SC-005** : No regression — les 115+ tests existants passent sans modification.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Tasks: Pipeline flexible avec étapes optionnelles
|
|
2
|
+
|
|
3
|
+
**Input**: Design documents from `/specs/010-flexible-pipeline/`
|
|
4
|
+
**Prerequisites**: plan.md (required), spec.md (required), research.md, quickstart.md
|
|
5
|
+
|
|
6
|
+
**Tests**: Non demandés explicitement — tests de non-régression couverts par la suite existante (115+). Un test pour le mode fast est ajouté dans Polish.
|
|
7
|
+
|
|
8
|
+
**Organization**: Les constantes (`__init__.py`) et le modèle (`state.py`) sont foundational. Les user stories dépendent de cette fondation.
|
|
9
|
+
|
|
10
|
+
## Format: `[T-XXX] [P?] [PX] [USX] Description — Réf: FR-XXX`
|
|
11
|
+
|
|
12
|
+
- **[P]**: Can run in parallel (different files, no dependencies)
|
|
13
|
+
- **[PX]**: Priorité de la user story
|
|
14
|
+
- **[USX]**: Which user story this task belongs to
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Phase 1: Setup
|
|
19
|
+
|
|
20
|
+
**Purpose**: Aucun setup nécessaire.
|
|
21
|
+
|
|
22
|
+
**Checkpoint**: N/A
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Phase 2: Foundational (constantes + modèle state.json)
|
|
27
|
+
|
|
28
|
+
**Purpose**: Ajouter `OPTIONAL_STEPS`, `FAST_STEPS` dans `__init__.py` et `mode` + `skippedSteps` dans `FeatureState`. Ces changements sont prérequis pour toutes les user stories.
|
|
29
|
+
|
|
30
|
+
**⚠️ CRITICAL**: `feature.py`, l'orchestrateur et `status` dépendent tous de ces constantes et du modèle.
|
|
31
|
+
|
|
32
|
+
- [x] [T-001] Ajouter les constantes `OPTIONAL_STEPS` et `FAST_STEPS` dans src/devflow_cli/__init__.py — Réf: FR-001. Ajouter après `STEPS` : `OPTIONAL_STEPS = {"clarify", "review-spec", "research", "contracts", "review-tasks", "review-impl", "docs"}` (set pour lookup O(1)) et `FAST_STEPS = ["spec", "plan", "tasks", "implement", "done"]` (liste ordonnée). Vérifier que `set(FAST_STEPS) | OPTIONAL_STEPS | {"constitution"}` == `set(STEPS) | {"constitution"}` (cohérence).
|
|
33
|
+
- [x] [T-002] Ajouter `mode` et `skippedSteps` dans `FeatureState` de src/devflow_cli/core/state.py — Réf: FR-003, FR-005. Ajouter deux champs au dataclass : `mode: str = "full"` et `skippedSteps: list[str] = field(default_factory=list)`. Modifier la property `total_steps` pour retourner `len(STEPS) - len(self.skippedSteps)` au lieu de `len(STEPS)`. Modifier `create_state()` pour accepter un paramètre optionnel `mode: str = "full"` et le passer au constructeur `FeatureState`. Vérifier que `read_state()` fonctionne avec des state.json existants sans ces champs (le filtrage `__dataclass_fields__` + valeurs par défaut gère ça automatiquement).
|
|
34
|
+
|
|
35
|
+
**Checkpoint**: `pytest tests/test_state.py -v` passe. `python -c "from devflow_cli import OPTIONAL_STEPS, FAST_STEPS; print(OPTIONAL_STEPS)"` fonctionne.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Phase 3: User Story 1 — Sauter une étape optionnelle explicitement (Priority: P1)
|
|
40
|
+
|
|
41
|
+
**Goal**: L'orchestrateur `/devflow` propose de sauter les étapes optionnelles en mode full.
|
|
42
|
+
|
|
43
|
+
**Independent Test**: Exécuter `/devflow` après spec, vérifier que clarify est proposé comme skip-able.
|
|
44
|
+
|
|
45
|
+
- [x] [T-003] [P1] [US1] Mettre à jour l'orchestrateur dans commands/devflow.md pour proposer le skip des étapes optionnelles — Réf: FR-002. Dans la section de détermination de la prochaine commande, ajouter la logique : si `currentStep` est dans `OPTIONAL_STEPS` ET `mode == "full"`, proposer à l'utilisateur de sauter l'étape ou de l'exécuter. Si l'utilisateur choisit de sauter : ajouter l'étape à `skippedSteps` dans state.json, ajouter à `completedSteps`, avancer `currentStep` à la prochaine étape non-sautée, et afficher un message confirmant le skip. En mode `fast` : sauter automatiquement sans demander.
|
|
46
|
+
|
|
47
|
+
**Checkpoint**: Relire `commands/devflow.md` et vérifier la logique de skip est documentée pour les deux modes.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Phase 4: User Story 2 — Lancer une feature en mode fast (Priority: P1)
|
|
52
|
+
|
|
53
|
+
**Goal**: `devflow feature KS-456 --fast` crée une feature en mode fast (4 étapes).
|
|
54
|
+
|
|
55
|
+
**Independent Test**: `devflow feature TEST-FAST --fast` → state.json contient `mode: "fast"`.
|
|
56
|
+
|
|
57
|
+
- [x] [T-004] [P1] [US2] Ajouter l'option `--fast` à la commande `feature()` dans src/devflow_cli/commands/feature.py — Réf: FR-004. Ajouter le paramètre `fast: bool = typer.Option(False, "--fast", help="Mode minimal (4 étapes : spec, plan, tasks, implement)")`. Passer `mode="fast" if fast else "full"` à `create_state()`. Afficher le mode dans le récapitulatif final (ex: `Mode : fast (4 étapes)`).
|
|
58
|
+
|
|
59
|
+
**Checkpoint**: `devflow feature TEST-FAST --fast` crée un state.json avec `"mode": "fast"`. `devflow feature TEST-FULL` crée un state.json avec `"mode": "full"`.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Phase 5: User Story 3 — Visibilité obligatoire vs optionnel (Priority: P2)
|
|
64
|
+
|
|
65
|
+
**Goal**: `devflow status` et `docs/pipeline.md` distinguent clairement les étapes obligatoires et optionnelles.
|
|
66
|
+
|
|
67
|
+
**Independent Test**: `devflow status` affiche la progression sur 4 étapes en mode fast, 13 en mode full.
|
|
68
|
+
|
|
69
|
+
- [x] [T-005] [P] [P2] [US3] Mettre à jour docs/pipeline.md pour marquer les étapes optionnelles — Réf: FR-007. Ajouter une colonne "Requis" au tableau de chaque étape : "Obligatoire" pour spec/plan/tasks/implement, "Optionnel" pour les autres. Ajouter une section "## Mode fast" en bas décrivant le pipeline minimal (4 étapes) et comment l'activer (`devflow feature --fast`).
|
|
70
|
+
- [x] [T-006] [P] [P2] [US3] Amender la constitution Principe III dans .specify/memory/constitution.md — Réf: FR-009. Ajouter après le paragraphe des review gates : "**Exception mode fast** : en mode fast (`state.json: mode = "fast"`), les review gates sont optionnelles. Le pre-commit review (`pre-commit-review` agent) reste actif comme filet de sécurité." Bumper la version de 1.1.0 à 1.2.0. Ajouter une entrée dans l'Amendment Log.
|
|
71
|
+
- [x] [T-010] [P2] [US3] Adapter l'affichage de `devflow status` pour distinguer les étapes sautées dans src/devflow_cli/commands/status.py — Réf: FR-006. Lire `skippedSteps` depuis le state.json. Pour chaque étape dans le récapitulatif, si elle est dans `skippedSteps`, afficher un marqueur visuel `[dim]⊘ skipped[/dim]` (Rich) au lieu de `[ ] pending`. La barre de progression doit utiliser `total_steps` (dynamique, déjà calculé par T-002) pour refléter le nombre d'étapes réellement requises. En mode fast, afficher `Mode : fast (4 étapes)` dans l'en-tête du statut.
|
|
72
|
+
|
|
73
|
+
**Checkpoint**: `docs/pipeline.md` contient une section "Mode fast". `constitution.md` version 1.2.0 avec exception mode fast.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Phase 6: Polish & Cross-Cutting Concerns
|
|
78
|
+
|
|
79
|
+
**Purpose**: Tests de non-régression + test mode fast + CHANGELOG.
|
|
80
|
+
|
|
81
|
+
- [x] [T-007] Ajouter un test pour le mode fast dans tests/test_state.py — Vérifier que `create_state(path, "TEST", mode="fast")` produit un state.json avec `mode: "fast"` et que `total_steps` retourne 13 (pas de skippedSteps encore). Vérifier que `create_state(path, "TEST")` sans mode produit `mode: "full"` (rétrocompat).
|
|
82
|
+
- [x] [T-008] Exécuter la suite de tests complète — Réf: FR-008, SC-005. `pytest tests/ -v` → 115+ tests passent, 0 régression. Compter le total (doit être > 115).
|
|
83
|
+
- [x] [T-009] Mettre à jour CHANGELOG.md — Ajouter entrée pour cette feature (pipeline flexible, mode fast, étapes optionnelles, amendement constitution).
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Dependencies & Execution Order
|
|
88
|
+
|
|
89
|
+
### Phase Dependencies
|
|
90
|
+
|
|
91
|
+
- **Foundational (Phase 2)** : T-001 et T-002 séquentiels (T-002 importe depuis T-001)
|
|
92
|
+
- **US1 (Phase 3)** : T-003 dépend de T-001 + T-002 (utilise OPTIONAL_STEPS et mode)
|
|
93
|
+
- **US2 (Phase 4)** : T-004 dépend de T-002 (create_state avec mode)
|
|
94
|
+
- **US3 (Phase 5)** : T-005, T-006 indépendants — peuvent commencer dès Phase 2 terminée. T-010 dépend de T-002 (skippedSteps dans state.py)
|
|
95
|
+
- **Polish (Phase 6)** : T-007, T-008, T-009 après toutes les phases
|
|
96
|
+
|
|
97
|
+
### Parallel Opportunities
|
|
98
|
+
|
|
99
|
+
- **Phase 5** : T-005 (docs), T-006 (constitution) et T-010 (status.py) sont parallèles (fichiers distincts)
|
|
100
|
+
- **Phase 3+4** : T-003 (commande markdown) et T-004 (Python) sont parallèles si Phase 2 terminée
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Implementation Strategy
|
|
105
|
+
|
|
106
|
+
### MVP First (User Story 2)
|
|
107
|
+
|
|
108
|
+
1. T-001 + T-002 (fondation)
|
|
109
|
+
2. T-004 (--fast dans feature.py)
|
|
110
|
+
3. **STOP and VALIDATE** : `devflow feature TEST --fast` → state.json avec `mode: "fast"` ?
|
|
111
|
+
|
|
112
|
+
### Incremental Delivery
|
|
113
|
+
|
|
114
|
+
1. T-001 + T-002 → constantes + modèle
|
|
115
|
+
2. T-003 + T-004 → orchestrateur skip + --fast (en parallèle)
|
|
116
|
+
3. T-005 + T-006 → docs + constitution (en parallèle)
|
|
117
|
+
4. T-007 + T-008 + T-009 → tests + validation + CHANGELOG
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Notes
|
|
122
|
+
|
|
123
|
+
- `create_state()` doit garder sa signature compatible (paramètre `mode` optionnel avec défaut "full")
|
|
124
|
+
- Le filtrage `__dataclass_fields__` dans `read_state()` gère automatiquement les state.json sans `mode`/`skippedSteps`
|
|
125
|
+
- L'orchestrateur `devflow.md` est un fichier markdown (commande Claude Code) — pas de tests unitaires possibles, validation par relecture
|
|
126
|
+
- L'amendement constitution est un MINOR bump (ajout d'exception, pas de suppression de principe)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Specification Quality Checklist: Support Cursor
|
|
2
|
+
|
|
3
|
+
**Purpose**: Validate specification completeness and quality before proceeding to planning
|
|
4
|
+
**Created**: 2026-03-15
|
|
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 is ready for `/speckit.plan`.
|
|
35
|
+
- Le support Cursor est minimal viable — pas de commandes slash natives Cursor, mais des rules .mdc avec le workflow complet.
|
|
36
|
+
- devflow context cursor et devflow export cursor fonctionnent déjà — cette feature comble le gap de devflow init --ai cursor.
|