agex-cli 0.26.1__tar.gz → 0.28.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.
- agex_cli-0.28.0/.devague/frames/devex-now-turns-a-push-into-continuous-pr-manageme.json +259 -0
- agex_cli-0.28.0/.devague/frames/every-devex-command-now-closes-with-a-deterministi.json +208 -0
- agex_cli-0.28.0/.devague/plans/devex-now-turns-a-push-into-continuous-pr-manageme.json +216 -0
- agex_cli-0.28.0/.devague/plans/every-devex-command-now-closes-with-a-deterministi.json +307 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.gitignore +9 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/CHANGELOG.md +30 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/CLAUDE.md +6 -2
- {agex_cli-0.26.1 → agex_cli-0.28.0}/PKG-INFO +1 -1
- agex_cli-0.28.0/docs/plans/2026-05-29-devex-now-turns-a-push-into-continuous-pr-manageme.md +50 -0
- agex_cli-0.28.0/docs/plans/2026-05-29-every-devex-command-now-closes-with-a-deterministi.md +92 -0
- agex_cli-0.28.0/docs/specs/2026-05-29-devex-now-turns-a-push-into-continuous-pr-manageme.md +67 -0
- agex_cli-0.28.0/docs/specs/2026-05-29-every-devex-command-now-closes-with-a-deterministi.md +56 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/pyproject.toml +1 -1
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/cli.py +80 -3
- agex_cli-0.28.0/src/devex/commands/doctor/assets/backends/acp.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/doctor/assets/backends/claude-code.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/doctor/assets/backends/codex.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/doctor/assets/backends/copilot.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/doctor/scripts/_footer.py +22 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/doctor/scripts/doctor.py +27 -1
- agex_cli-0.28.0/src/devex/commands/doctor/scripts/next_step.py +33 -0
- agex_cli-0.28.0/src/devex/commands/explain/assets/backends/acp.yaml +4 -0
- agex_cli-0.28.0/src/devex/commands/explain/assets/backends/claude-code.yaml +4 -0
- agex_cli-0.28.0/src/devex/commands/explain/assets/backends/codex.yaml +4 -0
- agex_cli-0.28.0/src/devex/commands/explain/assets/backends/copilot.yaml +4 -0
- agex_cli-0.28.0/src/devex/commands/explain/scripts/_footer.py +22 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/explain/scripts/explain.py +33 -5
- agex_cli-0.28.0/src/devex/commands/explain/scripts/next_step.py +46 -0
- agex_cli-0.28.0/src/devex/commands/gamify/assets/backends/acp.yaml +5 -0
- agex_cli-0.28.0/src/devex/commands/gamify/assets/backends/claude-code.yaml +5 -0
- agex_cli-0.28.0/src/devex/commands/gamify/assets/backends/codex.yaml +5 -0
- agex_cli-0.28.0/src/devex/commands/gamify/assets/backends/copilot.yaml +5 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/gamify/scripts/install.py +32 -13
- agex_cli-0.28.0/src/devex/commands/gamify/scripts/next_step.py +32 -0
- agex_cli-0.28.0/src/devex/commands/hook/assets/backends/acp.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/hook/assets/backends/claude-code.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/hook/assets/backends/codex.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/hook/assets/backends/copilot.yaml +3 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/hook/assets/table.md.j2 +2 -0
- agex_cli-0.28.0/src/devex/commands/hook/scripts/_footer.py +22 -0
- agex_cli-0.28.0/src/devex/commands/hook/scripts/next_step.py +20 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/hook/scripts/read.py +9 -1
- agex_cli-0.28.0/src/devex/commands/learn/assets/backends/acp.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/learn/assets/backends/claude-code.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/learn/assets/backends/codex.yaml +3 -0
- agex_cli-0.28.0/src/devex/commands/learn/assets/backends/copilot.yaml +3 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/menu.md.j2 +1 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/cicd/SKILL.md +2 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/gamify/SKILL.md +2 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/introspect/SKILL.md +2 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/levelup/SKILL.md +2 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/visualize/SKILL.md +2 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/scripts/learn.py +18 -2
- agex_cli-0.28.0/src/devex/commands/learn/scripts/next_step.py +21 -0
- agex_cli-0.28.0/src/devex/commands/overview/assets/backends/acp.yaml +9 -0
- agex_cli-0.28.0/src/devex/commands/overview/assets/backends/claude-code.yaml +9 -0
- agex_cli-0.28.0/src/devex/commands/overview/assets/backends/codex.yaml +9 -0
- agex_cli-0.28.0/src/devex/commands/overview/assets/backends/copilot.yaml +9 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/overview/assets/sections.md.j2 +2 -0
- agex_cli-0.28.0/src/devex/commands/overview/scripts/_footer.py +22 -0
- agex_cli-0.28.0/src/devex/commands/overview/scripts/next_step.py +20 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/overview/scripts/overview.py +11 -1
- agex_cli-0.28.0/src/devex/commands/pr/scripts/_footer.py +22 -0
- agex_cli-0.28.0/src/devex/commands/push/SKILL.md +104 -0
- agex_cli-0.28.0/src/devex/commands/push/assets/__init__.py +0 -0
- agex_cli-0.28.0/src/devex/commands/push/assets/backends/__init__.py +0 -0
- agex_cli-0.28.0/src/devex/commands/push/assets/backends/acp.yaml +7 -0
- agex_cli-0.28.0/src/devex/commands/push/assets/backends/claude-code.yaml +7 -0
- agex_cli-0.28.0/src/devex/commands/push/assets/backends/codex.yaml +7 -0
- agex_cli-0.28.0/src/devex/commands/push/assets/backends/copilot.yaml +7 -0
- agex_cli-0.28.0/src/devex/commands/push/scripts/__init__.py +0 -0
- agex_cli-0.28.0/src/devex/commands/push/scripts/push.py +155 -0
- agex_cli-0.28.0/src/devex/core/__init__.py +0 -0
- agex_cli-0.28.0/src/devex/core/assets/__init__.py +0 -0
- agex_cli-0.28.0/src/devex/core/assets/backends/__init__.py +1 -0
- agex_cli-0.28.0/src/devex/core/assets/backends/neutral.yaml +37 -0
- agex_cli-0.28.0/src/devex/core/footer.py +97 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/github.py +33 -0
- agex_cli-0.28.0/tests/__init__.py +0 -0
- agex_cli-0.28.0/tests/backends/__init__.py +0 -0
- agex_cli-0.28.0/tests/commands/__init__.py +0 -0
- agex_cli-0.28.0/tests/commands/pr/__init__.py +0 -0
- agex_cli-0.28.0/tests/commands/pr/fixtures/gh/.gitkeep +0 -0
- agex_cli-0.28.0/tests/commands/push/__init__.py +0 -0
- agex_cli-0.28.0/tests/commands/push/test_push.py +321 -0
- agex_cli-0.28.0/tests/commands/push/test_push_backends.py +112 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/test_doctor.py +96 -0
- agex_cli-0.28.0/tests/commands/test_explain.py +124 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/test_gamify.py +74 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/test_hook.py +74 -0
- agex_cli-0.28.0/tests/commands/test_learn.py +113 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/test_overview.py +46 -0
- agex_cli-0.28.0/tests/core/__init__.py +0 -0
- agex_cli-0.28.0/tests/core/test_footer.py +74 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_github.py +84 -0
- agex_cli-0.28.0/tests/fixtures/claude-code/empty/.gitkeep +0 -0
- agex_cli-0.28.0/tests/test_cli_dispatch.py +199 -0
- agex_cli-0.28.0/tests/test_cli_smoke.py +32 -0
- agex_cli-0.28.0/tests/test_footer_guarantee.py +608 -0
- agex_cli-0.28.0/tests/test_footer_hints.py +324 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/uv.lock +1 -1
- agex_cli-0.26.1/src/devex/commands/overview/assets/backends/acp.yaml +0 -7
- agex_cli-0.26.1/src/devex/commands/overview/assets/backends/claude-code.yaml +0 -7
- agex_cli-0.26.1/src/devex/commands/overview/assets/backends/codex.yaml +0 -7
- agex_cli-0.26.1/src/devex/commands/overview/assets/backends/copilot.yaml +0 -7
- agex_cli-0.26.1/src/devex/commands/pr/scripts/_footer.py +0 -32
- agex_cli-0.26.1/tests/commands/test_explain.py +0 -31
- agex_cli-0.26.1/tests/commands/test_learn.py +0 -55
- agex_cli-0.26.1/tests/test_cli_dispatch.py +0 -84
- agex_cli-0.26.1/tests/test_cli_smoke.py +0 -12
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/agent-config/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/cicd/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/communicate/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/think/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/think/scripts/think.sh +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.flake8 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.github/workflows/publish.yml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.github/workflows/test.yml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/.python-version +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/LICENSE +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/README.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/culture.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/docs/skill-sources.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/docs/superpowers/plans/2026-04-18-agex-v0.1.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/docs/superpowers/plans/2026-05-10-agex-pr.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/docs/superpowers/specs/2026-04-18-agex-design.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/docs/superpowers/specs/2026-04-26-agex-doctor.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/docs/superpowers/specs/2026-05-10-agex-pr-design.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/sonar-project.properties +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/__main__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/acp/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/acp/probe.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/capabilities/acp.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/capabilities/claude-code.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/capabilities/codex.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/capabilities/copilot.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/claude_code/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/claude_code/probe.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/codex/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/codex/probe.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/copilot/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/backends/copilot/probe.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/doctor/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/doctor/__init__.py +0 -0
- {agex_cli-0.26.1/src/devex/commands/doctor/scripts → agex_cli-0.28.0/src/devex/commands/doctor/assets/backends}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/doctor/assets/report.md.j2 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/doctor/references/design.md +0 -0
- {agex_cli-0.26.1/src/devex/commands/explain → agex_cli-0.28.0/src/devex/commands/doctor/scripts}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/explain/SKILL.md +0 -0
- {agex_cli-0.26.1/src/devex/commands/explain/scripts → agex_cli-0.28.0/src/devex/commands/explain}/__init__.py +0 -0
- {agex_cli-0.26.1/src/devex/commands/gamify → agex_cli-0.28.0/src/devex/commands/explain/assets/backends}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/explain/assets/topics/devex.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/explain/references/.gitkeep +0 -0
- {agex_cli-0.26.1/src/devex/commands/gamify → agex_cli-0.28.0/src/devex/commands/explain}/scripts/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/gamify/SKILL.md +0 -0
- {agex_cli-0.26.1/src/devex/commands/hook → agex_cli-0.28.0/src/devex/commands/gamify}/__init__.py +0 -0
- {agex_cli-0.26.1/src/devex/commands/hook/scripts → agex_cli-0.28.0/src/devex/commands/gamify/assets/backends}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/gamify/assets/hooks/claude-code.json +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/gamify/references/.gitkeep +0 -0
- {agex_cli-0.26.1/src/devex/commands/learn → agex_cli-0.28.0/src/devex/commands/gamify/scripts}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/hook/SKILL.md +0 -0
- {agex_cli-0.26.1/src/devex/commands/learn/scripts → agex_cli-0.28.0/src/devex/commands/hook}/__init__.py +0 -0
- {agex_cli-0.26.1/src/devex/commands/overview → agex_cli-0.28.0/src/devex/commands/hook/assets/backends}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/hook/references/.gitkeep +0 -0
- {agex_cli-0.26.1/src/devex/commands/overview → agex_cli-0.28.0/src/devex/commands/hook}/scripts/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/hook/scripts/write.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/SKILL.md +0 -0
- {agex_cli-0.26.1/src/devex/commands/pr → agex_cli-0.28.0/src/devex/commands/learn}/__init__.py +0 -0
- {agex_cli-0.26.1/src/devex/commands/pr/assets → agex_cli-0.28.0/src/devex/commands/learn/assets/backends}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/gamify/assets/skill-template/claude-code/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/introspect/assets/skill-template/claude-code/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/levelup/assets/skill-template/claude-code/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/assets/topics/visualize/assets/skill-template/claude-code/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/learn/references/.gitkeep +0 -0
- {agex_cli-0.26.1/src/devex/commands/pr/assets/backends → agex_cli-0.28.0/src/devex/commands/learn/scripts}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/overview/SKILL.md +0 -0
- {agex_cli-0.26.1/src/devex/commands/pr/assets/rules → agex_cli-0.28.0/src/devex/commands/overview}/__init__.py +0 -0
- {agex_cli-0.26.1/src/devex/commands/pr/assets/templates → agex_cli-0.28.0/src/devex/commands/overview/assets}/__init__.py +0 -0
- {agex_cli-0.26.1/src/devex/commands/pr/scripts → agex_cli-0.28.0/src/devex/commands/overview/assets/backends}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/overview/references/.gitkeep +0 -0
- {agex_cli-0.26.1/src/devex/core → agex_cli-0.28.0/src/devex/commands/overview/scripts}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/SKILL.md +0 -0
- {agex_cli-0.26.1/tests → agex_cli-0.28.0/src/devex/commands/pr}/__init__.py +0 -0
- {agex_cli-0.26.1/tests/backends → agex_cli-0.28.0/src/devex/commands/pr/assets}/__init__.py +0 -0
- {agex_cli-0.26.1/tests/commands → agex_cli-0.28.0/src/devex/commands/pr/assets/backends}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/backends/acp.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/backends/claude-code.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/backends/codex.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/backends/copilot.yaml +0 -0
- {agex_cli-0.26.1/tests/commands/pr → agex_cli-0.28.0/src/devex/commands/pr/assets/rules}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/rules/lint_rules.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/rules/next_step_rules.py +0 -0
- {agex_cli-0.26.1/tests/core → agex_cli-0.28.0/src/devex/commands/pr/assets/templates}/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/templates/delta.md.j2 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/templates/lint_result.md.j2 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/templates/pr_await_detached.md.j2 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/templates/pr_briefing.md.j2 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/templates/pr_open_result.md.j2 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/templates/pr_reply_result.md.j2 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/assets/templates/pr_review_result.md.j2 +0 -0
- /agex_cli-0.26.1/tests/commands/pr/fixtures/gh/.gitkeep → /agex_cli-0.28.0/src/devex/commands/pr/scripts/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/_await_worker.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/_deploy.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/_detach.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/_journal.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/_qodo.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/_readiness.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/_sonar.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/await_.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/delta.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/lint.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/open_.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/read.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/reply.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/commands/pr/scripts/review.py +0 -0
- /agex_cli-0.26.1/tests/fixtures/claude-code/empty/.gitkeep → /agex_cli-0.28.0/src/devex/commands/push/__init__.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/_jsonl.py +0 -0
- {agex_cli-0.26.1/src/devex/commands/pr/assets/templates → agex_cli-0.28.0/src/devex/core/assets}/footer.md.j2 +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/backend.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/capabilities.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/config.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/hook_io.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/journal.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/paths.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/prog.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/render.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/src/devex/core/skill_loader.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tester-agents/claude/.claude/settings.json +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tester-agents/claude/.claude/skills +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tester-agents/claude/CLAUDE.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tester-agents/claude/README.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tester-agents/claude/culture.yaml +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/backends/test_claude_code_probe.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/backends/test_stub_probes.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/fixtures/gh/pr_checks_42.json +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/fixtures/gh/pr_comments_42.json +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/fixtures/gh/qodo_summary_comment.html +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/fixtures/journals/dogfood_40.jsonl +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_await.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_await_detach.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_delta.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_deploy.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_footer.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_lint.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_lint_rules.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_open.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_qodo.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_read.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_readiness.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_reply.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/pr/test_review.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/commands/test_prog_propagation.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_backend.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_capabilities.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_config.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_hook_io.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_journal.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_paths.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_prog.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_render.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_resolve_backend.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_skill_loader.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/core/test_version_lookup.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/fixtures/claude-code/malformed/.claude/hooks.json +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/fixtures/claude-code/malformed/.claude/settings.json +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/fixtures/claude-code/malformed/.claude/skills/bad/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/fixtures/claude-code/malformed/.claude/skills/broken-yaml/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/fixtures/claude-code/typical/.claude/hooks.json +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/fixtures/claude-code/typical/.claude/settings.json +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/fixtures/claude-code/typical/.claude/skills/example/SKILL.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/fixtures/claude-code/typical/CLAUDE.md +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/test_cli_errors.py +0 -0
- {agex_cli-0.26.1 → agex_cli-0.28.0}/tests/test_skill_md_consistency.py +0 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "devex-now-turns-a-push-into-continuous-pr-manageme",
|
|
3
|
+
"title": "devex now turns a push into continuous PR management: when you push commits to a branch that already has an open PR, devex automatically enters the same review-readiness wait a new PR gets (the ~3-minute poll), so follow-up commits get triaged without a manual step \u2014 and a push to a branch with no PR stays an ordinary push.",
|
|
4
|
+
"schema_version": 1,
|
|
5
|
+
"status": "exported",
|
|
6
|
+
"created": "2026-05-29T11:17:22Z",
|
|
7
|
+
"updated": "2026-05-29T11:31:35Z",
|
|
8
|
+
"claims": [
|
|
9
|
+
{
|
|
10
|
+
"id": "c1",
|
|
11
|
+
"kind": "announcement",
|
|
12
|
+
"text": "devex now turns a push into continuous PR management: when you push commits to a branch that already has an open PR, devex automatically enters the same review-readiness wait a new PR gets (the ~3-minute poll), so follow-up commits get triaged without a manual step \u2014 and a push to a branch with no PR stays an ordinary push.",
|
|
13
|
+
"origin": "user",
|
|
14
|
+
"status": "confirmed",
|
|
15
|
+
"honesty_conditions": [
|
|
16
|
+
{
|
|
17
|
+
"id": "h4",
|
|
18
|
+
"text": "Shipped behavior is exactly: push current branch; if it has an open PR, enter the new-PR-style ~180s readiness wait and render the delta; else plain push + a notice.",
|
|
19
|
+
"status": "confirmed"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"hard_questions": [
|
|
23
|
+
{
|
|
24
|
+
"id": "q3",
|
|
25
|
+
"text": "Does the command also 'git commit' (commit-push) or only 'git push' already-committed work? The user is unsure ('commit-pushing / just pushing').",
|
|
26
|
+
"resolved": true,
|
|
27
|
+
"blocking": false
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"links": []
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "c2",
|
|
34
|
+
"kind": "audience",
|
|
35
|
+
"text": "An agent (or human via an agent) running devex inside a repo mid-PR, who has just committed follow-up changes on a branch that already has an open PR and wants CI/review feedback picked up automatically.",
|
|
36
|
+
"origin": "llm",
|
|
37
|
+
"status": "confirmed",
|
|
38
|
+
"honesty_conditions": [
|
|
39
|
+
{
|
|
40
|
+
"id": "h5",
|
|
41
|
+
"text": "The primary caller is an agent in an automated PR loop; the command needs no interactive input to choose the managed-vs-plain path.",
|
|
42
|
+
"status": "confirmed"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"hard_questions": [],
|
|
46
|
+
"links": []
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "c3",
|
|
50
|
+
"kind": "after_state",
|
|
51
|
+
"text": "Pushing follow-up commits to a branch with an open PR automatically enters the same review-readiness wait a new PR gets (~3-minute poll), with no separate manual 'pr await' / 'pr read --wait' step.",
|
|
52
|
+
"origin": "llm",
|
|
53
|
+
"status": "confirmed",
|
|
54
|
+
"honesty_conditions": [
|
|
55
|
+
{
|
|
56
|
+
"id": "h6",
|
|
57
|
+
"text": "Post-push triage takes zero extra commands: the wait + delta render are part of the single 'devex push' invocation.",
|
|
58
|
+
"status": "confirmed"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"hard_questions": [
|
|
62
|
+
{
|
|
63
|
+
"id": "q2",
|
|
64
|
+
"text": "Is the wait blocking the agent session (like --delayed-read) or detached (like --detached-await/await --detach)? Continuous management argues for detached + later --check.",
|
|
65
|
+
"resolved": true,
|
|
66
|
+
"blocking": false
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
"links": []
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"id": "c4",
|
|
73
|
+
"kind": "before_state",
|
|
74
|
+
"text": "Today there is no push command. After pushing, the agent must remember to manually run 'pr await' / 'pr read --wait' to re-enter triage \u2014 easy to forget, so continuous PR management silently breaks.",
|
|
75
|
+
"origin": "llm",
|
|
76
|
+
"status": "confirmed",
|
|
77
|
+
"honesty_conditions": [
|
|
78
|
+
{
|
|
79
|
+
"id": "h7",
|
|
80
|
+
"text": "Verified today: 'devex pr' has no push subcommand and no top-level push exists; re-entering triage requires a manual 'pr await' / 'pr read --wait'.",
|
|
81
|
+
"status": "confirmed"
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"hard_questions": [],
|
|
85
|
+
"links": []
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "c5",
|
|
89
|
+
"kind": "why_it_matters",
|
|
90
|
+
"text": "Continuous PR management: every push, like every new PR, deterministically lands the agent back in the triage loop instead of leaving fresh CI/Sonar/review feedback unwatched.",
|
|
91
|
+
"origin": "llm",
|
|
92
|
+
"status": "confirmed",
|
|
93
|
+
"honesty_conditions": [
|
|
94
|
+
{
|
|
95
|
+
"id": "h8",
|
|
96
|
+
"text": "Determinism: identical branch/PR state always routes to the same path (managed vs plain); no backend or branch auto-detection.",
|
|
97
|
+
"status": "confirmed"
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"hard_questions": [],
|
|
101
|
+
"links": []
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "c6",
|
|
105
|
+
"kind": "success_signal",
|
|
106
|
+
"text": "After a push on a PR branch, the agent ends up holding the post-push review delta (CI + Sonar + threads) without issuing a second command.",
|
|
107
|
+
"origin": "llm",
|
|
108
|
+
"status": "confirmed",
|
|
109
|
+
"honesty_conditions": [
|
|
110
|
+
{
|
|
111
|
+
"id": "h9",
|
|
112
|
+
"text": "Observable: one 'devex push' on a PR branch ends with the post-push CI/Sonar/threads delta on stdout, exit code reflecting the quality gate.",
|
|
113
|
+
"status": "confirmed"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"hard_questions": [],
|
|
117
|
+
"links": []
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "c7",
|
|
121
|
+
"kind": "boundary",
|
|
122
|
+
"text": "Not a general git porcelain: the push path is the minimum to land commits on the remote; devex does not grow into a git front-end (no rebase/merge/stash/branch management).",
|
|
123
|
+
"origin": "llm",
|
|
124
|
+
"status": "confirmed",
|
|
125
|
+
"honesty_conditions": [
|
|
126
|
+
{
|
|
127
|
+
"id": "h10",
|
|
128
|
+
"text": "Scope cap: the only git mutation devex performs is 'git push' of the current branch \u2014 no rebase/merge/stash/branch/commit.",
|
|
129
|
+
"status": "confirmed"
|
|
130
|
+
}
|
|
131
|
+
],
|
|
132
|
+
"hard_questions": [],
|
|
133
|
+
"links": []
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "c8",
|
|
137
|
+
"kind": "non_goal",
|
|
138
|
+
"text": "When the branch has no open PR, devex does NOT open one \u2014 that stays an explicit 'pr open'. The push case with no PR is out of the PR-management path.",
|
|
139
|
+
"origin": "llm",
|
|
140
|
+
"status": "confirmed",
|
|
141
|
+
"honesty_conditions": [],
|
|
142
|
+
"hard_questions": [],
|
|
143
|
+
"links": []
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"id": "c9",
|
|
147
|
+
"kind": "requirement",
|
|
148
|
+
"text": "The command must detect whether the current branch has an open PR (via gh) BEFORE deciding whether to enter the wait \u2014 the PR-management path is gated on PR existence, never auto-detected away from the user's branch.",
|
|
149
|
+
"origin": "llm",
|
|
150
|
+
"status": "confirmed",
|
|
151
|
+
"honesty_conditions": [
|
|
152
|
+
{
|
|
153
|
+
"id": "h1",
|
|
154
|
+
"text": "Open-PR detection is a single 'gh pr view --json' style call on the current branch; no PR => exit 0 with a plain-push (or notice) path, never an error.",
|
|
155
|
+
"status": "confirmed"
|
|
156
|
+
}
|
|
157
|
+
],
|
|
158
|
+
"hard_questions": [],
|
|
159
|
+
"links": []
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"id": "c10",
|
|
163
|
+
"kind": "requirement",
|
|
164
|
+
"text": "The default post-push wait is ~180s (3 minutes), matching 'pr open --delayed-read' (pr read --wait 180), not pr await's 1800s default \u2014 overridable via a flag.",
|
|
165
|
+
"origin": "llm",
|
|
166
|
+
"status": "confirmed",
|
|
167
|
+
"honesty_conditions": [
|
|
168
|
+
{
|
|
169
|
+
"id": "h2",
|
|
170
|
+
"text": "The 180s default is exposed as an overridable flag (e.g. --max-wait) and documented as matching the new-PR delayed read.",
|
|
171
|
+
"status": "confirmed"
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
"hard_questions": [],
|
|
175
|
+
"links": []
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"id": "c11",
|
|
179
|
+
"kind": "decision",
|
|
180
|
+
"text": "The command lives under the existing 'pr' namespace as 'devex pr push' (continuous PR management is a pr concern), rather than a top-level 'devex push'.",
|
|
181
|
+
"origin": "llm",
|
|
182
|
+
"status": "rejected",
|
|
183
|
+
"honesty_conditions": [],
|
|
184
|
+
"hard_questions": [
|
|
185
|
+
{
|
|
186
|
+
"id": "q1",
|
|
187
|
+
"text": "risk: Naming as 'pr push' is odd when no PR exists (you'd 'pr push' a branch that has no PR) \u2014 top-level 'devex push' may read better for the plain-push case.",
|
|
188
|
+
"resolved": true,
|
|
189
|
+
"blocking": false
|
|
190
|
+
}
|
|
191
|
+
],
|
|
192
|
+
"links": []
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"id": "c12",
|
|
196
|
+
"kind": "assumption",
|
|
197
|
+
"text": "It reuses the existing readiness machinery \u2014 pr await --detach/--check and/or pr read --wait \u2014 rather than introducing a second poller implementation.",
|
|
198
|
+
"origin": "llm",
|
|
199
|
+
"status": "confirmed",
|
|
200
|
+
"honesty_conditions": [],
|
|
201
|
+
"hard_questions": [],
|
|
202
|
+
"links": []
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"id": "c13",
|
|
206
|
+
"kind": "requirement",
|
|
207
|
+
"text": "Performing 'git push' of the current branch is a NEW class of side effect for devex (push-only; no commit); it requires an explicit carve-out added to design-invariant #4, alongside the existing pr-namespace network/sleep exceptions.",
|
|
208
|
+
"origin": "llm",
|
|
209
|
+
"status": "confirmed",
|
|
210
|
+
"honesty_conditions": [
|
|
211
|
+
{
|
|
212
|
+
"id": "h3",
|
|
213
|
+
"text": "design-invariant #4 in CLAUDE.md is amended to name 'git push' as an allowed side effect of 'devex push', with the same explicitness as the existing gh/sleep carve-out \u2014 otherwise the feature violates a non-negotiable invariant.",
|
|
214
|
+
"status": "confirmed"
|
|
215
|
+
}
|
|
216
|
+
],
|
|
217
|
+
"hard_questions": [],
|
|
218
|
+
"links": []
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "c14",
|
|
222
|
+
"kind": "decision",
|
|
223
|
+
"text": "Top-level 'devex push' (not 'devex pr push'): reads naturally for the no-PR 'just push' case and conditionally enters PR management when an open PR exists.",
|
|
224
|
+
"origin": "llm",
|
|
225
|
+
"status": "confirmed",
|
|
226
|
+
"honesty_conditions": [],
|
|
227
|
+
"hard_questions": [],
|
|
228
|
+
"links": []
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"id": "c15",
|
|
232
|
+
"kind": "decision",
|
|
233
|
+
"text": "Push-only: pushes already-committed work; devex does NOT stage or commit. Commit-push is out of scope for v0.1.",
|
|
234
|
+
"origin": "llm",
|
|
235
|
+
"status": "confirmed",
|
|
236
|
+
"honesty_conditions": [],
|
|
237
|
+
"hard_questions": [],
|
|
238
|
+
"links": []
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"id": "c16",
|
|
242
|
+
"kind": "decision",
|
|
243
|
+
"text": "After-push wait is BLOCKING ~180s (mirrors 'pr open --delayed-read' = 'pr read --wait 180'), not detached; --max-wait overrides. Resolves q2.",
|
|
244
|
+
"origin": "llm",
|
|
245
|
+
"status": "confirmed",
|
|
246
|
+
"honesty_conditions": [],
|
|
247
|
+
"hard_questions": [],
|
|
248
|
+
"links": []
|
|
249
|
+
}
|
|
250
|
+
],
|
|
251
|
+
"open_vagueness": [
|
|
252
|
+
{
|
|
253
|
+
"id": "v1",
|
|
254
|
+
"text": "RESOLVED (push-only, c15): commit-push (stage+commit) is out of scope for v0.1; 'devex push' strictly pushes already-committed work.",
|
|
255
|
+
"kind": "out_of_scope",
|
|
256
|
+
"claim_id": "c15"
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "every-devex-command-now-closes-with-a-deterministi",
|
|
3
|
+
"title": "Every devex command now closes with a deterministic, per-backend Next step micro-prompt telling the running agent exactly how to continue \u2014 the pr namespace footer convention becomes a cross-command guarantee.",
|
|
4
|
+
"schema_version": 1,
|
|
5
|
+
"status": "exported",
|
|
6
|
+
"created": "2026-05-29T14:19:33Z",
|
|
7
|
+
"updated": "2026-05-29T15:05:05Z",
|
|
8
|
+
"claims": [
|
|
9
|
+
{
|
|
10
|
+
"id": "c1",
|
|
11
|
+
"kind": "announcement",
|
|
12
|
+
"text": "Every devex command now closes with a deterministic, per-backend Next step micro-prompt telling the running agent exactly how to continue \u2014 the pr namespace footer convention becomes a cross-command guarantee.",
|
|
13
|
+
"origin": "user",
|
|
14
|
+
"status": "confirmed",
|
|
15
|
+
"honesty_conditions": [
|
|
16
|
+
{
|
|
17
|
+
"id": "h4",
|
|
18
|
+
"text": "Every command path that reaches stdout terminates in exactly one Next step footer block \u2014 the guarantee is total, not best-effort \u2014 verified by a test that runs every non-silent command and asserts a trailing footer.",
|
|
19
|
+
"status": "confirmed"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"hard_questions": [],
|
|
23
|
+
"links": []
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "c2",
|
|
27
|
+
"kind": "audience",
|
|
28
|
+
"text": "Autonomous coding agents (claude-code, codex, copilot, acp backends) that invoke devex commands non-interactively and must pick their next move without an LLM in the loop.",
|
|
29
|
+
"origin": "llm",
|
|
30
|
+
"status": "confirmed",
|
|
31
|
+
"honesty_conditions": [
|
|
32
|
+
{
|
|
33
|
+
"id": "h6",
|
|
34
|
+
"text": "Every footer hint is phrased as an actionable instruction to the running agent (an imperative naming a concrete next command/move), never human-facing prose \u2014 asserted by a test/lint on hint form.",
|
|
35
|
+
"status": "confirmed"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"hard_questions": [],
|
|
39
|
+
"links": []
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "c3",
|
|
43
|
+
"kind": "after_state",
|
|
44
|
+
"text": "Every non-silent devex command (explain, learn, overview, doctor, gamify, hook read, plus the existing pr namespace) ends its markdown with a Next step footer naming a concrete next move, so the agent never has to infer what to run next.",
|
|
45
|
+
"origin": "llm",
|
|
46
|
+
"status": "confirmed",
|
|
47
|
+
"honesty_conditions": [
|
|
48
|
+
{
|
|
49
|
+
"id": "h3",
|
|
50
|
+
"text": "For each non-silent command there is a deterministic mapping from its observable end-state to exactly one rule_key, so the footer is reproducible across identical inputs.",
|
|
51
|
+
"status": "confirmed"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"hard_questions": [],
|
|
55
|
+
"links": []
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "c4",
|
|
59
|
+
"kind": "before_state",
|
|
60
|
+
"text": "Today only the pr namespace ends with a Next step footer. explain, learn, overview, doctor and hook read end at EOF; gamify install has a one-off ad-hoc Next line. After every other command the agent must guess the next move.",
|
|
61
|
+
"origin": "llm",
|
|
62
|
+
"status": "confirmed",
|
|
63
|
+
"honesty_conditions": [
|
|
64
|
+
{
|
|
65
|
+
"id": "h7",
|
|
66
|
+
"text": "A snapshot test of current non-pr command output confirms none emits a Next step footer today, so the gap this feature closes is demonstrated, not assumed.",
|
|
67
|
+
"status": "confirmed"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"hard_questions": [],
|
|
71
|
+
"links": []
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "c5",
|
|
75
|
+
"kind": "why_it_matters",
|
|
76
|
+
"text": "devex exists to give autonomous agents deterministic guidance. A command that ends without a next-move prompt leaves a decision gap the agent fills by guessing \u2014 non-deterministic behaviour in a tool whose whole premise is determinism. A closing micro-prompt makes the command surface self-chaining.",
|
|
77
|
+
"origin": "llm",
|
|
78
|
+
"status": "confirmed",
|
|
79
|
+
"honesty_conditions": [
|
|
80
|
+
{
|
|
81
|
+
"id": "h8",
|
|
82
|
+
"text": "The footer is fully determined by command inputs plus project state with zero LLM/network/random input \u2014 identical inputs always yield an identical footer, asserted by a reproducibility test.",
|
|
83
|
+
"status": "confirmed"
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"hard_questions": [],
|
|
87
|
+
"links": []
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "c6",
|
|
91
|
+
"kind": "boundary",
|
|
92
|
+
"text": "Out of scope: rewriting command body content; LLM-generated footers; adding a footer to deliberately-silent commands such as hook write which emits empty stdout; and auto-executing the suggested command \u2014 the footer is a prompt, not an action, so no new side effects are introduced.",
|
|
93
|
+
"origin": "llm",
|
|
94
|
+
"status": "confirmed",
|
|
95
|
+
"honesty_conditions": [
|
|
96
|
+
{
|
|
97
|
+
"id": "h9",
|
|
98
|
+
"text": "After the change hook write still emits empty stdout and no command gains a new network/file-write/sleep side effect from the footer \u2014 verified by the existing side-effect/invariant tests staying green.",
|
|
99
|
+
"status": "confirmed"
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"hard_questions": [],
|
|
103
|
+
"links": []
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "c7",
|
|
107
|
+
"kind": "success_signal",
|
|
108
|
+
"text": "A test asserts every non-silent command stdout ends with the footer block, and that each backend YAML defines a hint for every rule key its command can emit, so there is no missing-hint KeyError at runtime.",
|
|
109
|
+
"origin": "llm",
|
|
110
|
+
"status": "confirmed",
|
|
111
|
+
"honesty_conditions": [
|
|
112
|
+
{
|
|
113
|
+
"id": "h10",
|
|
114
|
+
"text": "Both guard tests (every-command-ends-with-a-footer; every reachable rule_key has a hint) exist, run in CI, and fail loudly when a command or rule_key is added without a hint.",
|
|
115
|
+
"status": "confirmed"
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"hard_questions": [],
|
|
119
|
+
"links": []
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "c8",
|
|
123
|
+
"kind": "requirement",
|
|
124
|
+
"text": "The footer-rendering machinery now under commands/pr (the _footer renderer, the rule_key plus context decision pattern, and footer.md.j2) is promoted to core so every command shares one implementation.",
|
|
125
|
+
"origin": "llm",
|
|
126
|
+
"status": "confirmed",
|
|
127
|
+
"honesty_conditions": [
|
|
128
|
+
{
|
|
129
|
+
"id": "h1",
|
|
130
|
+
"text": "After the machinery moves to core, the pr namespace footers are byte-identical and every existing pr footer test passes unchanged (pure relocation, no behaviour change).",
|
|
131
|
+
"status": "confirmed"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"hard_questions": [],
|
|
135
|
+
"links": []
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "c9",
|
|
139
|
+
"kind": "requirement",
|
|
140
|
+
"text": "Each non-pr command gains a small next-step decision function returning rule_key plus context, and a hints block in its per-command assets/backends/backend.yaml, mirroring how the pr namespace is structured.",
|
|
141
|
+
"origin": "llm",
|
|
142
|
+
"status": "confirmed",
|
|
143
|
+
"honesty_conditions": [
|
|
144
|
+
{
|
|
145
|
+
"id": "h2",
|
|
146
|
+
"text": "One enumerating test walks every (command, backend, reachable rule_key) triple and fails if any hint string is missing, proving coverage rather than assuming it.",
|
|
147
|
+
"status": "confirmed"
|
|
148
|
+
}
|
|
149
|
+
],
|
|
150
|
+
"hard_questions": [],
|
|
151
|
+
"links": []
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "c10",
|
|
155
|
+
"kind": "requirement",
|
|
156
|
+
"text": "Backend-agnostic commands that do not take --agent today (explain, doctor) must still end with a coherent Next step footer.",
|
|
157
|
+
"origin": "llm",
|
|
158
|
+
"status": "confirmed",
|
|
159
|
+
"honesty_conditions": [
|
|
160
|
+
{
|
|
161
|
+
"id": "h5",
|
|
162
|
+
"text": "With --agent provided, explain/doctor render that backend's hint; with it omitted they render a neutral hint from a shared default; both paths are test-covered so the optional flag never yields a missing or empty footer.",
|
|
163
|
+
"status": "confirmed"
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"hard_questions": [
|
|
167
|
+
{
|
|
168
|
+
"id": "q1",
|
|
169
|
+
"text": "How do explain and doctor (no --agent flag today) emit a per-backend Next step footer? (a) add optional --agent, neutral footer when omitted; (b) stay agnostic, emit one neutral footer with no per-backend phrasing; (c) make --agent required on them too, breaking their agnostic contract.",
|
|
170
|
+
"resolved": false,
|
|
171
|
+
"blocking": false
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
"links": []
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "c11",
|
|
178
|
+
"kind": "decision",
|
|
179
|
+
"text": "Reuse the existing mechanism unchanged \u2014 rule_key plus context resolved against a per-backend hints YAML and rendered through footer.md.j2 as a Next step block under a horizontal rule \u2014 rather than inventing a new footer format.",
|
|
180
|
+
"origin": "llm",
|
|
181
|
+
"status": "confirmed",
|
|
182
|
+
"honesty_conditions": [],
|
|
183
|
+
"hard_questions": [],
|
|
184
|
+
"links": []
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"id": "c12",
|
|
188
|
+
"kind": "non_goal",
|
|
189
|
+
"text": "This is not a generalized workflow or command-graph engine; the footer suggests a single sensible next move, it does not model, validate or enforce a sequence of commands.",
|
|
190
|
+
"origin": "llm",
|
|
191
|
+
"status": "confirmed",
|
|
192
|
+
"honesty_conditions": [],
|
|
193
|
+
"hard_questions": [],
|
|
194
|
+
"links": []
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"id": "c13",
|
|
198
|
+
"kind": "decision",
|
|
199
|
+
"text": "explain and doctor gain an OPTIONAL --agent flag: when provided the footer uses that backend's hints YAML, when omitted a backend-neutral footer is emitted from a shared default. Existing flagless calls keep working unchanged (non-breaking). [resolves q1, user choice]",
|
|
200
|
+
"origin": "user",
|
|
201
|
+
"status": "confirmed",
|
|
202
|
+
"honesty_conditions": [],
|
|
203
|
+
"hard_questions": [],
|
|
204
|
+
"links": []
|
|
205
|
+
}
|
|
206
|
+
],
|
|
207
|
+
"open_vagueness": []
|
|
208
|
+
}
|