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