devex-cli 0.31.0__tar.gz → 0.32.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.
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/recall/SKILL.md +1 -1
- devex_cli-0.32.0/.devague/frames/devex-now-closes-the-developer-experience-loop-it.json +268 -0
- devex_cli-0.32.0/.devague/plans/devex-now-closes-the-developer-experience-loop-it.json +287 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.gitignore +6 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/CHANGELOG.md +16 -2
- {devex_cli-0.31.0 → devex_cli-0.32.0}/CLAUDE.md +13 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/PKG-INFO +13 -1
- {devex_cli-0.31.0 → devex_cli-0.32.0}/README.md +12 -0
- devex_cli-0.32.0/docs/advise-loop.md +208 -0
- devex_cli-0.32.0/docs/plans/2026-07-01-devex-now-closes-the-developer-experience-loop-it.md +85 -0
- devex_cli-0.32.0/docs/specs/2026-07-01-devex-now-closes-the-developer-experience-loop-it.md +67 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/pyproject.toml +1 -1
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/cli.py +19 -0
- devex_cli-0.32.0/src/devex/commands/advise/SKILL.md +65 -0
- devex_cli-0.32.0/src/devex/commands/advise/assets/backends/acp.yaml +5 -0
- devex_cli-0.32.0/src/devex/commands/advise/assets/backends/claude-code.yaml +5 -0
- devex_cli-0.32.0/src/devex/commands/advise/assets/backends/codex.yaml +5 -0
- devex_cli-0.32.0/src/devex/commands/advise/assets/backends/copilot.yaml +5 -0
- devex_cli-0.32.0/src/devex/commands/advise/assets/templates/advise.md.j2 +67 -0
- devex_cli-0.32.0/src/devex/commands/advise/scripts/_capability.py +85 -0
- devex_cli-0.32.0/src/devex/commands/advise/scripts/_coverage.py +171 -0
- devex_cli-0.32.0/src/devex/commands/advise/scripts/_footer.py +23 -0
- devex_cli-0.32.0/src/devex/commands/advise/scripts/_trail.py +129 -0
- devex_cli-0.32.0/src/devex/commands/advise/scripts/_usage.py +286 -0
- devex_cli-0.32.0/src/devex/commands/advise/scripts/advise.py +78 -0
- devex_cli-0.32.0/src/devex/commands/advise/scripts/next_step.py +192 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/assets/backends/acp.yaml +1 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/assets/backends/claude-code.yaml +1 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/assets/backends/codex.yaml +1 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/assets/backends/copilot.yaml +1 -0
- devex_cli-0.32.0/src/devex/commands/hook/scripts/next_step.py +37 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/assets/backends/acp.yaml +1 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/assets/backends/claude-code.yaml +1 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/assets/backends/codex.yaml +1 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/assets/backends/copilot.yaml +1 -0
- devex_cli-0.32.0/src/devex/commands/overview/scripts/next_step.py +34 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/scripts/overview.py +17 -1
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/_jsonl.py +10 -1
- devex_cli-0.32.0/tests/commands/advise/__init__.py +0 -0
- devex_cli-0.32.0/tests/commands/advise/test_advise.py +328 -0
- devex_cli-0.32.0/tests/commands/advise/test_capability.py +150 -0
- devex_cli-0.32.0/tests/commands/advise/test_coverage.py +187 -0
- devex_cli-0.32.0/tests/commands/advise/test_guarantees.py +370 -0
- devex_cli-0.32.0/tests/commands/advise/test_trail.py +335 -0
- devex_cli-0.32.0/tests/commands/advise/test_usage.py +401 -0
- devex_cli-0.32.0/tests/commands/pr/__init__.py +0 -0
- devex_cli-0.32.0/tests/commands/pr/fixtures/gh/.gitkeep +0 -0
- devex_cli-0.32.0/tests/commands/push/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/test_hook.py +45 -3
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/test_overview.py +40 -1
- devex_cli-0.32.0/tests/core/__init__.py +0 -0
- devex_cli-0.32.0/tests/core/test_jsonl.py +31 -0
- devex_cli-0.32.0/tests/fixtures/claude-code/empty/.gitkeep +0 -0
- devex_cli-0.32.0/tests/fixtures/coverage/empty/.gitkeep +0 -0
- devex_cli-0.32.0/tests/fixtures/coverage/malformed/coverage.xml +6 -0
- devex_cli-0.32.0/tests/fixtures/coverage/typical/coverage.xml +44 -0
- devex_cli-0.32.0/tests/test_advise_loop.py +295 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/test_footer_guarantee.py +48 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/test_footer_hints.py +1 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/uv.lock +1 -1
- devex_cli-0.31.0/src/devex/commands/hook/scripts/next_step.py +0 -20
- devex_cli-0.31.0/src/devex/commands/overview/scripts/next_step.py +0 -20
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/agent-config/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/ask-colleague/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/ask-colleague/prompts/explore.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/ask-colleague/prompts/review.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/ask-colleague/prompts/write.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/ask-colleague/scripts/ask-colleague.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/cicd/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/communicate/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/recall/scripts/recall.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/remember/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/remember/scripts/remember.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/think/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/think/scripts/think.sh +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.devague/frames/devex-now-reads-qodo-pr-review-findings-structural.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.devague/frames/devex-now-turns-a-push-into-continuous-pr-manageme.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.devague/frames/every-devex-command-now-closes-with-a-deterministi.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.devague/plans/devex-now-reads-qodo-pr-review-findings-structural.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.devague/plans/devex-now-turns-a-push-into-continuous-pr-manageme.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.devague/plans/every-devex-command-now-closes-with-a-deterministi.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.flake8 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.github/workflows/publish.yml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.github/workflows/test.yml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.markdownlint-cli2.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.pre-commit-config.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/.python-version +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/LICENSE +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/culture.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/plans/2026-05-29-devex-now-turns-a-push-into-continuous-pr-manageme.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/plans/2026-05-29-every-devex-command-now-closes-with-a-deterministi.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/plans/2026-06-19-devex-now-reads-qodo-pr-review-findings-structural.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/skill-sources.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/specs/2026-05-29-devex-now-turns-a-push-into-continuous-pr-manageme.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/specs/2026-05-29-every-devex-command-now-closes-with-a-deterministi.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/specs/2026-06-19-devex-now-reads-qodo-pr-review-findings-structural.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/superpowers/plans/2026-04-18-agex-v0.1.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/superpowers/plans/2026-05-10-agex-pr.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/superpowers/specs/2026-04-18-agex-design.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/superpowers/specs/2026-04-26-agex-doctor.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/docs/superpowers/specs/2026-05-10-agex-pr-design.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/sonar-project.properties +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/__main__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/acp/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/acp/probe.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/capabilities/acp.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/capabilities/claude-code.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/capabilities/codex.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/capabilities/copilot.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/claude_code/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/claude_code/probe.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/codex/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/codex/probe.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/copilot/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/backends/copilot/probe.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/doctor → devex_cli-0.32.0/src/devex/commands/advise}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/doctor/assets/backends → devex_cli-0.32.0/src/devex/commands/advise/assets}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/doctor/scripts → devex_cli-0.32.0/src/devex/commands/advise/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/explain → devex_cli-0.32.0/src/devex/commands/advise/assets/templates}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/explain/assets/backends → devex_cli-0.32.0/src/devex/commands/advise/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/explain/scripts → devex_cli-0.32.0/src/devex/commands/doctor}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/gamify → devex_cli-0.32.0/src/devex/commands/doctor/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/assets/backends/acp.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/assets/backends/claude-code.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/assets/backends/codex.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/assets/backends/copilot.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/assets/report.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/references/design.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/gamify/assets/backends → devex_cli-0.32.0/src/devex/commands/doctor/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/scripts/_footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/scripts/doctor.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/doctor/scripts/next_step.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/gamify/scripts → devex_cli-0.32.0/src/devex/commands/explain}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/hook → devex_cli-0.32.0/src/devex/commands/explain/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/assets/backends/acp.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/assets/backends/claude-code.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/assets/backends/codex.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/assets/backends/copilot.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/assets/topics/devex.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/references/.gitkeep +0 -0
- {devex_cli-0.31.0/src/devex/commands/hook/assets/backends → devex_cli-0.32.0/src/devex/commands/explain/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/scripts/_footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/scripts/explain.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/explain/scripts/next_step.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/hook/scripts → devex_cli-0.32.0/src/devex/commands/gamify}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/learn → devex_cli-0.32.0/src/devex/commands/gamify/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/assets/backends/acp.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/assets/backends/claude-code.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/assets/backends/codex.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/assets/backends/copilot.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/assets/hooks/claude-code.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/references/.gitkeep +0 -0
- {devex_cli-0.31.0/src/devex/commands/learn/assets/backends → devex_cli-0.32.0/src/devex/commands/gamify/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/scripts/install.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/gamify/scripts/next_step.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/learn/scripts → devex_cli-0.32.0/src/devex/commands/hook}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/overview → devex_cli-0.32.0/src/devex/commands/hook/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/assets/table.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/references/.gitkeep +0 -0
- {devex_cli-0.31.0/src/devex/commands/overview/assets → devex_cli-0.32.0/src/devex/commands/hook/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/scripts/_footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/scripts/read.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/hook/scripts/write.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/overview/assets/backends → devex_cli-0.32.0/src/devex/commands/learn}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/overview/scripts → devex_cli-0.32.0/src/devex/commands/learn/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/backends/acp.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/backends/claude-code.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/backends/codex.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/backends/copilot.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/menu.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/cicd/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/gamify/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/gamify/assets/skill-template/claude-code/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/introspect/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/introspect/assets/skill-template/claude-code/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/levelup/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/levelup/assets/skill-template/claude-code/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/visualize/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/assets/topics/visualize/assets/skill-template/claude-code/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/references/.gitkeep +0 -0
- {devex_cli-0.31.0/src/devex/commands/pr → devex_cli-0.32.0/src/devex/commands/learn/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/scripts/learn.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/learn/scripts/next_step.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/pr/assets → devex_cli-0.32.0/src/devex/commands/overview}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/pr/assets/backends → devex_cli-0.32.0/src/devex/commands/overview/assets}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/pr/assets/rules → devex_cli-0.32.0/src/devex/commands/overview/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/assets/sections.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/references/.gitkeep +0 -0
- {devex_cli-0.31.0/src/devex/commands/pr/assets/templates → devex_cli-0.32.0/src/devex/commands/overview/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/overview/scripts/_footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/pr/scripts → devex_cli-0.32.0/src/devex/commands/pr}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/push → devex_cli-0.32.0/src/devex/commands/pr/assets}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/push/assets → devex_cli-0.32.0/src/devex/commands/pr/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/backends/acp.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/backends/claude-code.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/backends/codex.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/backends/copilot.yaml +0 -0
- {devex_cli-0.31.0/src/devex/commands/push/assets/backends → devex_cli-0.32.0/src/devex/commands/pr/assets/rules}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/rules/lint_rules.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/rules/next_step_rules.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/push/scripts → devex_cli-0.32.0/src/devex/commands/pr/assets/templates}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/templates/delta.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/templates/lint_result.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/templates/pr_await_detached.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/templates/pr_briefing.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/templates/pr_open_result.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/templates/pr_reply_result.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/assets/templates/pr_review_result.md.j2 +0 -0
- {devex_cli-0.31.0/src/devex/commands/reviewer → devex_cli-0.32.0/src/devex/commands/pr/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_await_worker.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_deploy.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_detach.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_journal.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_qodo.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_readiness.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_sonar.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/_webhook.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/await_.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/delta.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/lint.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/open_.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/read.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/reply.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/pr/scripts/review.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/push/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/commands/reviewer/assets → devex_cli-0.32.0/src/devex/commands/push}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/reviewer/assets/backends → devex_cli-0.32.0/src/devex/commands/push/assets}/__init__.py +0 -0
- {devex_cli-0.31.0/src/devex/commands/reviewer/scripts → devex_cli-0.32.0/src/devex/commands/push/assets/backends}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/push/assets/backends/acp.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/push/assets/backends/claude-code.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/push/assets/backends/codex.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/push/assets/backends/copilot.yaml +0 -0
- {devex_cli-0.31.0/src/devex/core → devex_cli-0.32.0/src/devex/commands/push/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/push/scripts/push.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/SKILL.md +0 -0
- {devex_cli-0.31.0/src/devex/core/assets → devex_cli-0.32.0/src/devex/commands/reviewer}/__init__.py +0 -0
- {devex_cli-0.31.0/tests → devex_cli-0.32.0/src/devex/commands/reviewer/assets}/__init__.py +0 -0
- {devex_cli-0.31.0/tests → devex_cli-0.32.0/src/devex/commands/reviewer/assets}/backends/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/backends/acp.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/backends/claude-code.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/backends/codex.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/backends/copilot.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/config.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/failed.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/review_list.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/review_resolve.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/rules.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/assets/unsupported.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/references/.gitkeep +0 -0
- {devex_cli-0.31.0/tests/commands → devex_cli-0.32.0/src/devex/commands/reviewer/scripts}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/scripts/_footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/scripts/next_step.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/commands/reviewer/scripts/reviewer.py +0 -0
- {devex_cli-0.31.0/tests/commands/pr → devex_cli-0.32.0/src/devex/core}/__init__.py +0 -0
- {devex_cli-0.31.0/tests/commands/push → devex_cli-0.32.0/src/devex/core/assets}/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/assets/backends/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/assets/backends/neutral.yaml +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/assets/footer.md.j2 +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/backend.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/capabilities.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/config.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/github.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/hook_io.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/journal.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/paths.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/prog.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/qodo.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/render.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/skill_loader.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/src/devex/core/webhook.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tester-agents/claude/.claude/settings.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tester-agents/claude/.claude/skills +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tester-agents/claude/CLAUDE.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tester-agents/claude/README.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tester-agents/claude/culture.yaml +0 -0
- {devex_cli-0.31.0/tests/core → devex_cli-0.32.0/tests}/__init__.py +0 -0
- /devex_cli-0.31.0/tests/commands/pr/fixtures/gh/.gitkeep → /devex_cli-0.32.0/tests/backends/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/backends/test_claude_code_probe.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/backends/test_stub_probes.py +0 -0
- /devex_cli-0.31.0/tests/fixtures/claude-code/empty/.gitkeep → /devex_cli-0.32.0/tests/commands/__init__.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/fixtures/gh/pr_checks_42.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/fixtures/gh/pr_comments_42.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/fixtures/gh/qodo_summary_comment.html +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/fixtures/journals/dogfood_40.jsonl +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_await.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_await_detach.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_briefing_findings.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_delta.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_deploy.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_lint.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_lint_rules.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_open.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_qodo.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_read.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_readiness.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_reply.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_review.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/pr/test_webhook_helper.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/push/test_push.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/push/test_push_backends.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/test_doctor.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/test_explain.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/test_gamify.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/test_learn.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/test_prog_propagation.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/commands/test_reviewer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/conftest.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_backend.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_capabilities.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_config.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_footer.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_github.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_hook_io.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_journal.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_paths.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_prog.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_qodo_adapter.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_render.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_resolve_backend.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_skill_loader.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_version_lookup.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_webhook.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/core/test_webhook_live.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/fixtures/claude-code/malformed/.claude/hooks.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/fixtures/claude-code/malformed/.claude/settings.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/fixtures/claude-code/malformed/.claude/skills/bad/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/fixtures/claude-code/malformed/.claude/skills/broken-yaml/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/fixtures/claude-code/typical/.claude/hooks.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/fixtures/claude-code/typical/.claude/settings.json +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/fixtures/claude-code/typical/.claude/skills/example/SKILL.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/fixtures/claude-code/typical/CLAUDE.md +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/test_cli_dispatch.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/test_cli_errors.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/test_cli_smoke.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/test_packaging_qodo_extra.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/test_reviewer_invariant_docs.py +0 -0
- {devex_cli-0.31.0 → devex_cli-0.32.0}/tests/test_skill_md_consistency.py +0 -0
|
@@ -81,7 +81,7 @@ Every `recall` hit carries a `signal` field (float in `[0, 1]`). The signal
|
|
|
81
81
|
blends **multiplicatively** into the lexical/vector score so recently-created
|
|
82
82
|
and frequently-recalled records surface ahead of stale ones. The formula:
|
|
83
83
|
|
|
84
|
-
```
|
|
84
|
+
```text
|
|
85
85
|
access_bonus = min(0.5, recall_count * 0.05)
|
|
86
86
|
age_factor = 1 / (1 + days_since_creation * 0.01)
|
|
87
87
|
staleness = days_since_last_recall * 0.01
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "devex-now-closes-the-developer-experience-loop-it",
|
|
3
|
+
"title": "devex now closes the developer-experience loop: it measures coverage, learns from the agent's tracked performance, turns that learning into advice, structures work into assessable units, and lets an agent run non-touch \u2014 assess, decide where it can, and continue \u2014 with full introspection for humans and agents.",
|
|
4
|
+
"schema_version": 1,
|
|
5
|
+
"status": "exported",
|
|
6
|
+
"created": "2026-07-01T23:37:04Z",
|
|
7
|
+
"updated": "2026-07-01T23:52:19Z",
|
|
8
|
+
"claims": [
|
|
9
|
+
{
|
|
10
|
+
"id": "c1",
|
|
11
|
+
"kind": "announcement",
|
|
12
|
+
"text": "devex now closes the developer-experience loop: it measures coverage, learns from the agent's tracked performance, turns that learning into advice, structures work into assessable units, and lets an agent run non-touch \u2014 assess, decide where it can, and continue \u2014 with full introspection for humans and agents.",
|
|
13
|
+
"origin": "user",
|
|
14
|
+
"status": "confirmed",
|
|
15
|
+
"honesty_conditions": [
|
|
16
|
+
{
|
|
17
|
+
"id": "h7",
|
|
18
|
+
"text": "One release demonstrates the full loop in this repo: a coverage measurement exists, a deterministic aggregation learns from it, an advice briefing renders it, and an agent continues from it non-touch \u2014 each step verified by tests",
|
|
19
|
+
"status": "confirmed"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"hard_questions": [
|
|
23
|
+
{
|
|
24
|
+
"id": "q1",
|
|
25
|
+
"text": "Is this one shippable feature or a roadmap of five or six? What is the smallest slice that proves the loop closes (measure, learn, advise, continue)?",
|
|
26
|
+
"resolved": false,
|
|
27
|
+
"blocking": false
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"links": []
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "c2",
|
|
34
|
+
"kind": "audience",
|
|
35
|
+
"text": "Autonomous coding agents operating devex day-to-day, and the humans supervising them who need introspection into what the agent did and why",
|
|
36
|
+
"origin": "llm",
|
|
37
|
+
"status": "confirmed",
|
|
38
|
+
"honesty_conditions": [
|
|
39
|
+
{
|
|
40
|
+
"id": "h8",
|
|
41
|
+
"text": "The slice serves both audiences concretely: the agent consumes the briefing mid-session to pick its next move, and a human can read the same markdown after the fact and understand what happened and why",
|
|
42
|
+
"status": "confirmed"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"hard_questions": [],
|
|
46
|
+
"links": []
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "c3",
|
|
50
|
+
"kind": "before_state",
|
|
51
|
+
"text": "devex briefs and advises per command (footers, lessons, gamify hooks) but nothing closes the loop: hook events are written yet barely read back, advice is static per-backend YAML, and an agent still stops for a human between steps",
|
|
52
|
+
"origin": "llm",
|
|
53
|
+
"status": "confirmed",
|
|
54
|
+
"honesty_conditions": [
|
|
55
|
+
{
|
|
56
|
+
"id": "h9",
|
|
57
|
+
"text": "The before-state is verifiable in today's code: hook events are written but only hook read renders them (no shipped command aggregates them into advice), and footer hints are static per-backend YAML",
|
|
58
|
+
"status": "confirmed"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"hard_questions": [],
|
|
62
|
+
"links": []
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "c4",
|
|
66
|
+
"kind": "after_state",
|
|
67
|
+
"text": "An agent runs a work session end-to-end non-touch: devex tells it what is covered and what is not, learns from its tracked performance, advises the next move, and the agent assesses, decides where it can, and continues \u2014 while humans can introspect the whole trail",
|
|
68
|
+
"origin": "llm",
|
|
69
|
+
"status": "confirmed",
|
|
70
|
+
"honesty_conditions": [
|
|
71
|
+
{
|
|
72
|
+
"id": "h1",
|
|
73
|
+
"text": "A full non-touch cycle is demonstrable in this repo: the agent uses only devex output (footers, advice, briefings) to pick each next step, with no human prompt between starting work and merge-readiness",
|
|
74
|
+
"status": "confirmed"
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"hard_questions": [
|
|
78
|
+
{
|
|
79
|
+
"id": "q2",
|
|
80
|
+
"text": "Where is the line between 'decides where it can' and decisions that must stay with the human \u2014 who defines that policy, devex or the agent's own skill?",
|
|
81
|
+
"resolved": false,
|
|
82
|
+
"blocking": false
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"links": []
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "c5",
|
|
89
|
+
"kind": "why_it_matters",
|
|
90
|
+
"text": "Agent time is cheapest when uninterrupted \u2014 every unnecessary human touch is a stall; deterministic advice grounded in the agent's own usage data raises quality without adding LLM calls",
|
|
91
|
+
"origin": "llm",
|
|
92
|
+
"status": "confirmed",
|
|
93
|
+
"honesty_conditions": [
|
|
94
|
+
{
|
|
95
|
+
"id": "h10",
|
|
96
|
+
"text": "The value claim costs nothing to honor: the advice path adds zero LLM calls and no new side-effect classes (pure reads), so any quality gain is free at runtime",
|
|
97
|
+
"status": "confirmed"
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"hard_questions": [],
|
|
101
|
+
"links": []
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "c6",
|
|
105
|
+
"kind": "boundary",
|
|
106
|
+
"text": "devex stays a non-agentic deterministic-markdown CLI: no LLM calls, no auto-detection, markdown only; 'learning' means deterministic aggregation of tracked events, never model inference; devex advises the next move but never executes it",
|
|
107
|
+
"origin": "llm",
|
|
108
|
+
"status": "confirmed",
|
|
109
|
+
"honesty_conditions": [
|
|
110
|
+
{
|
|
111
|
+
"id": "h2",
|
|
112
|
+
"text": "Every 'learning' or 'advice' output is reproducible byte-for-byte from the same event journal \u2014 deterministic aggregation, no LLM call, verified by a guard test like the footer guarantee",
|
|
113
|
+
"status": "confirmed"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"hard_questions": [],
|
|
117
|
+
"links": []
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "c7",
|
|
121
|
+
"kind": "success_signal",
|
|
122
|
+
"text": "An agent completes a branch-to-merge-ready cycle with zero human touches except final review, and devex can show from tracked events what it advised and what the agent actually did",
|
|
123
|
+
"origin": "llm",
|
|
124
|
+
"status": "confirmed",
|
|
125
|
+
"honesty_conditions": [
|
|
126
|
+
{
|
|
127
|
+
"id": "h3",
|
|
128
|
+
"text": "The introspection trail exists as a readable artifact: devex can render what it advised at each step and what event followed, from .devex/data alone",
|
|
129
|
+
"status": "confirmed"
|
|
130
|
+
}
|
|
131
|
+
],
|
|
132
|
+
"hard_questions": [],
|
|
133
|
+
"links": []
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "c8",
|
|
137
|
+
"kind": "assumption",
|
|
138
|
+
"text": "The existing hook event stream (devex hook write/read) is rich enough to learn performance from, or can be extended cheaply",
|
|
139
|
+
"origin": "llm",
|
|
140
|
+
"status": "confirmed",
|
|
141
|
+
"honesty_conditions": [
|
|
142
|
+
{
|
|
143
|
+
"id": "h4",
|
|
144
|
+
"text": "A concrete list exists of which decisions the advice layer needs to make and which event fields each one requires \u2014 and the gap between that and today's hook schema is enumerated",
|
|
145
|
+
"status": "confirmed"
|
|
146
|
+
}
|
|
147
|
+
],
|
|
148
|
+
"hard_questions": [],
|
|
149
|
+
"links": []
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"id": "c9",
|
|
153
|
+
"kind": "open_question",
|
|
154
|
+
"text": "Whether 'coverage' means test-coverage briefings, command-by-backend capability coverage, or usage coverage of devex features by the agent",
|
|
155
|
+
"origin": "llm",
|
|
156
|
+
"status": "rejected",
|
|
157
|
+
"honesty_conditions": [],
|
|
158
|
+
"hard_questions": [],
|
|
159
|
+
"links": []
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"id": "c10",
|
|
163
|
+
"kind": "decision",
|
|
164
|
+
"text": "Coverage means three surfaces: usage coverage (which devex features the agent exercises, from hook events), test-coverage briefings (the project's coverage surfaced to the agent), and capability coverage (command-by-backend matrix). Raising devex's own repo test coverage is NOT this feature.",
|
|
165
|
+
"origin": "user",
|
|
166
|
+
"status": "confirmed",
|
|
167
|
+
"honesty_conditions": [],
|
|
168
|
+
"hard_questions": [],
|
|
169
|
+
"links": []
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "c11",
|
|
173
|
+
"kind": "decision",
|
|
174
|
+
"text": "Scope is one release with a single loop-closing slice proving measure, learn, advise, continue; each of the six threads contributes only what that slice needs, the rest parks as follow-ups.",
|
|
175
|
+
"origin": "user",
|
|
176
|
+
"status": "confirmed",
|
|
177
|
+
"honesty_conditions": [],
|
|
178
|
+
"hard_questions": [],
|
|
179
|
+
"links": []
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"id": "c12",
|
|
183
|
+
"kind": "decision",
|
|
184
|
+
"text": "Performance learning is layered: start with deterministic aggregation of already-tracked usage events, then extend the schema toward work outcomes (PR cycles, review findings) already journaled under .devex/data/pr/.",
|
|
185
|
+
"origin": "user",
|
|
186
|
+
"status": "confirmed",
|
|
187
|
+
"honesty_conditions": [],
|
|
188
|
+
"hard_questions": [],
|
|
189
|
+
"links": []
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"id": "c13",
|
|
193
|
+
"kind": "requirement",
|
|
194
|
+
"text": "The slice reads only existing or adjacent data sources \u2014 the .devex/data journals, the capability matrix, and the project's coverage report when present \u2014 and emits one deterministic markdown briefing telling the agent what is unused, untested, or unsupported, plus the recommended next move",
|
|
195
|
+
"origin": "llm",
|
|
196
|
+
"status": "confirmed",
|
|
197
|
+
"honesty_conditions": [
|
|
198
|
+
{
|
|
199
|
+
"id": "h5",
|
|
200
|
+
"text": "With an empty journal, no coverage report, and a bare repo, the briefing still renders exit-0 with a useful notice (unsupported-is-success); with fixed inputs it is byte-for-byte reproducible",
|
|
201
|
+
"status": "confirmed"
|
|
202
|
+
}
|
|
203
|
+
],
|
|
204
|
+
"hard_questions": [],
|
|
205
|
+
"links": []
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"id": "c14",
|
|
209
|
+
"kind": "requirement",
|
|
210
|
+
"text": "The slice's output composes with the existing Next-step footer system so a non-touch agent can chain from any command into the advice loop and back to work without a human prompt",
|
|
211
|
+
"origin": "llm",
|
|
212
|
+
"status": "confirmed",
|
|
213
|
+
"honesty_conditions": [
|
|
214
|
+
{
|
|
215
|
+
"id": "h6",
|
|
216
|
+
"text": "A guard test proves the advice output ends with exactly one Next-step footer, and at least one existing command's footer routes into the advice loop",
|
|
217
|
+
"status": "confirmed"
|
|
218
|
+
}
|
|
219
|
+
],
|
|
220
|
+
"hard_questions": [],
|
|
221
|
+
"links": []
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"id": "c15",
|
|
225
|
+
"kind": "decision",
|
|
226
|
+
"text": "devex never encodes the human-vs-agent decision policy: it emits advice; the agent's harness owns which decisions need human sign-off",
|
|
227
|
+
"origin": "llm",
|
|
228
|
+
"status": "confirmed",
|
|
229
|
+
"honesty_conditions": [],
|
|
230
|
+
"hard_questions": [],
|
|
231
|
+
"links": []
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"id": "c16",
|
|
235
|
+
"kind": "decision",
|
|
236
|
+
"text": "For this slice, structured work is emergent (footers + journal + advice loop); a dedicated work/session noun parks as a follow-up",
|
|
237
|
+
"origin": "llm",
|
|
238
|
+
"status": "confirmed",
|
|
239
|
+
"honesty_conditions": [],
|
|
240
|
+
"hard_questions": [],
|
|
241
|
+
"links": []
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"id": "c17",
|
|
245
|
+
"kind": "non_goal",
|
|
246
|
+
"text": "No new side-effect classes: the slice is read-only (journal reads, matrix reads, coverage-report reads); it does not write state, spawn processes, or open sockets",
|
|
247
|
+
"origin": "llm",
|
|
248
|
+
"status": "confirmed",
|
|
249
|
+
"honesty_conditions": [],
|
|
250
|
+
"hard_questions": [],
|
|
251
|
+
"links": []
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"open_vagueness": [
|
|
255
|
+
{
|
|
256
|
+
"id": "v1",
|
|
257
|
+
"text": "Exact aggregation schema for performance metrics (what counts as a measurement unit: command invocations, PR cycles, review findings, time-to-merge)",
|
|
258
|
+
"kind": "unknown_nonblocking",
|
|
259
|
+
"claim_id": null
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"id": "v2",
|
|
263
|
+
"text": "Whether 'structured work' needs a new noun (e.g. devex work / session) or is an emergent property of footers plus journal",
|
|
264
|
+
"kind": "follow_up",
|
|
265
|
+
"claim_id": null
|
|
266
|
+
}
|
|
267
|
+
]
|
|
268
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "devex-now-closes-the-developer-experience-loop-it",
|
|
3
|
+
"title": "devex now closes the developer-experience loop: it measures coverage, learns from the agent's tracked performance, turns that learning into advice, structures work into assessable units, and lets an agent run non-touch \u2014 assess, decide where it can, and continue \u2014 with full introspection for humans and agents.",
|
|
4
|
+
"frame_slug": "devex-now-closes-the-developer-experience-loop-it",
|
|
5
|
+
"schema_version": 1,
|
|
6
|
+
"status": "exported",
|
|
7
|
+
"created": "2026-07-01T23:53:26Z",
|
|
8
|
+
"updated": "2026-07-01T23:57:26Z",
|
|
9
|
+
"targets": [
|
|
10
|
+
{
|
|
11
|
+
"id": "c1",
|
|
12
|
+
"kind": "announcement",
|
|
13
|
+
"text": "devex now closes the developer-experience loop: it measures coverage, learns from the agent's tracked performance, turns that learning into advice, structures work into assessable units, and lets an agent run non-touch \u2014 assess, decide where it can, and continue \u2014 with full introspection for humans and agents."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "h7",
|
|
17
|
+
"kind": "honesty",
|
|
18
|
+
"text": "One release demonstrates the full loop in this repo: a coverage measurement exists, a deterministic aggregation learns from it, an advice briefing renders it, and an agent continues from it non-touch \u2014 each step verified by tests"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "c2",
|
|
22
|
+
"kind": "audience",
|
|
23
|
+
"text": "Autonomous coding agents operating devex day-to-day, and the humans supervising them who need introspection into what the agent did and why"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "h8",
|
|
27
|
+
"kind": "honesty",
|
|
28
|
+
"text": "The slice serves both audiences concretely: the agent consumes the briefing mid-session to pick its next move, and a human can read the same markdown after the fact and understand what happened and why"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "c3",
|
|
32
|
+
"kind": "before_state",
|
|
33
|
+
"text": "devex briefs and advises per command (footers, lessons, gamify hooks) but nothing closes the loop: hook events are written yet barely read back, advice is static per-backend YAML, and an agent still stops for a human between steps"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "h9",
|
|
37
|
+
"kind": "honesty",
|
|
38
|
+
"text": "The before-state is verifiable in today's code: hook events are written but only hook read renders them (no shipped command aggregates them into advice), and footer hints are static per-backend YAML"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "c4",
|
|
42
|
+
"kind": "after_state",
|
|
43
|
+
"text": "An agent runs a work session end-to-end non-touch: devex tells it what is covered and what is not, learns from its tracked performance, advises the next move, and the agent assesses, decides where it can, and continues \u2014 while humans can introspect the whole trail"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "h1",
|
|
47
|
+
"kind": "honesty",
|
|
48
|
+
"text": "A full non-touch cycle is demonstrable in this repo: the agent uses only devex output (footers, advice, briefings) to pick each next step, with no human prompt between starting work and merge-readiness"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "c5",
|
|
52
|
+
"kind": "why_it_matters",
|
|
53
|
+
"text": "Agent time is cheapest when uninterrupted \u2014 every unnecessary human touch is a stall; deterministic advice grounded in the agent's own usage data raises quality without adding LLM calls"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "h10",
|
|
57
|
+
"kind": "honesty",
|
|
58
|
+
"text": "The value claim costs nothing to honor: the advice path adds zero LLM calls and no new side-effect classes (pure reads), so any quality gain is free at runtime"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "c6",
|
|
62
|
+
"kind": "boundary",
|
|
63
|
+
"text": "devex stays a non-agentic deterministic-markdown CLI: no LLM calls, no auto-detection, markdown only; 'learning' means deterministic aggregation of tracked events, never model inference; devex advises the next move but never executes it"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "h2",
|
|
67
|
+
"kind": "honesty",
|
|
68
|
+
"text": "Every 'learning' or 'advice' output is reproducible byte-for-byte from the same event journal \u2014 deterministic aggregation, no LLM call, verified by a guard test like the footer guarantee"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "c7",
|
|
72
|
+
"kind": "success_signal",
|
|
73
|
+
"text": "An agent completes a branch-to-merge-ready cycle with zero human touches except final review, and devex can show from tracked events what it advised and what the agent actually did"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "h3",
|
|
77
|
+
"kind": "honesty",
|
|
78
|
+
"text": "The introspection trail exists as a readable artifact: devex can render what it advised at each step and what event followed, from .devex/data alone"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "c13",
|
|
82
|
+
"kind": "requirement",
|
|
83
|
+
"text": "The slice reads only existing or adjacent data sources \u2014 the .devex/data journals, the capability matrix, and the project's coverage report when present \u2014 and emits one deterministic markdown briefing telling the agent what is unused, untested, or unsupported, plus the recommended next move"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "h5",
|
|
87
|
+
"kind": "honesty",
|
|
88
|
+
"text": "With an empty journal, no coverage report, and a bare repo, the briefing still renders exit-0 with a useful notice (unsupported-is-success); with fixed inputs it is byte-for-byte reproducible"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "c14",
|
|
92
|
+
"kind": "requirement",
|
|
93
|
+
"text": "The slice's output composes with the existing Next-step footer system so a non-touch agent can chain from any command into the advice loop and back to work without a human prompt"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "h6",
|
|
97
|
+
"kind": "honesty",
|
|
98
|
+
"text": "A guard test proves the advice output ends with exactly one Next-step footer, and at least one existing command's footer routes into the advice loop"
|
|
99
|
+
}
|
|
100
|
+
],
|
|
101
|
+
"tasks": [
|
|
102
|
+
{
|
|
103
|
+
"id": "t1",
|
|
104
|
+
"summary": "Usage-coverage aggregation: deterministic module (commands/advise/scripts/_usage.py) that reads the .devex/data event journal and derives per-command counts, unused commands (vs the CLI's own command registry, not a hardcoded list), and last activity",
|
|
105
|
+
"origin": "llm",
|
|
106
|
+
"status": "confirmed",
|
|
107
|
+
"acceptance_criteria": [
|
|
108
|
+
"Given a fixed fixture journal, the aggregation result is identical across runs (test asserts equality of rendered output)",
|
|
109
|
+
"An empty or missing journal yields a well-formed 'no usage data yet' result with exit 0, not an error",
|
|
110
|
+
"The unused-command list is derived from the argparse command registry so a future command appears without editing the module"
|
|
111
|
+
],
|
|
112
|
+
"deps": [],
|
|
113
|
+
"covers": [
|
|
114
|
+
"c3",
|
|
115
|
+
"h9",
|
|
116
|
+
"c13",
|
|
117
|
+
"h2"
|
|
118
|
+
]
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "t2",
|
|
122
|
+
"summary": "Test-coverage briefing reader: parse the project's coverage report (Cobertura coverage.xml) when present into overall percentage plus the N least-covered files (commands/advise/scripts/_coverage.py, stdlib XML only)",
|
|
123
|
+
"origin": "llm",
|
|
124
|
+
"status": "confirmed",
|
|
125
|
+
"acceptance_criteria": [
|
|
126
|
+
"A fixture coverage.xml produces a deterministic summary (overall %, least-covered files) across runs",
|
|
127
|
+
"Absent or malformed coverage.xml renders an unsupported-is-success notice section, exit 0"
|
|
128
|
+
],
|
|
129
|
+
"deps": [],
|
|
130
|
+
"covers": [
|
|
131
|
+
"c13",
|
|
132
|
+
"h5"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "t3",
|
|
137
|
+
"summary": "Capability-coverage section: from the existing capability matrix, render which commands are supported/unsupported for the given backend (commands/advise/scripts/_capability.py)",
|
|
138
|
+
"origin": "llm",
|
|
139
|
+
"status": "confirmed",
|
|
140
|
+
"acceptance_criteria": [
|
|
141
|
+
"For each of the four backends the section lists supported and unsupported commands consistent with core/capabilities.py",
|
|
142
|
+
"Output is deterministic and matrix-driven \u2014 no hardcoded command names"
|
|
143
|
+
],
|
|
144
|
+
"deps": [],
|
|
145
|
+
"covers": [
|
|
146
|
+
"c13"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "t4",
|
|
151
|
+
"summary": "The devex advise command: new skill-folder (commands/advise/ with SKILL.md, scripts/advise.py, assets/templates/advise.md.j2) + cli.py routing with required --agent; composes the usage, test-coverage, and capability sections into one deterministic markdown briefing ending in a recommended next move",
|
|
152
|
+
"origin": "llm",
|
|
153
|
+
"status": "confirmed",
|
|
154
|
+
"acceptance_criteria": [
|
|
155
|
+
"uv run devex advise --agent claude-code renders one briefing with usage-coverage, test-coverage, and capability-coverage sections plus a recommended next move",
|
|
156
|
+
"In a bare repo (no journal, no coverage.xml) the briefing still renders exit 0 with useful unsupported-is-success notices per section",
|
|
157
|
+
"devex explain advise renders the SKILL.md (skill-folder contract holds)"
|
|
158
|
+
],
|
|
159
|
+
"deps": [
|
|
160
|
+
"t1",
|
|
161
|
+
"t2",
|
|
162
|
+
"t3"
|
|
163
|
+
],
|
|
164
|
+
"covers": [
|
|
165
|
+
"c1",
|
|
166
|
+
"c4",
|
|
167
|
+
"c13",
|
|
168
|
+
"h5"
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "t5",
|
|
173
|
+
"summary": "Footer wiring both directions: advise gets scripts/next_step.py + hints for all four backends (assets/backends/{claude-code,codex,copilot,acp}.yaml), and at least one existing command's footer (hook read and overview) routes into devex advise",
|
|
174
|
+
"origin": "llm",
|
|
175
|
+
"status": "confirmed",
|
|
176
|
+
"acceptance_criteria": [
|
|
177
|
+
"tests/test_footer_guarantee.py passes with advise included: exactly one deterministic footer, no new side effects",
|
|
178
|
+
"tests/test_footer_hints.py passes: every reachable (advise, backend, rule_key) has an agent-imperative hint",
|
|
179
|
+
"hook read's and overview's footers recommend devex advise under a deterministic rule (e.g. when tracked events exist)"
|
|
180
|
+
],
|
|
181
|
+
"deps": [
|
|
182
|
+
"t4"
|
|
183
|
+
],
|
|
184
|
+
"covers": [
|
|
185
|
+
"c14",
|
|
186
|
+
"h6",
|
|
187
|
+
"c4"
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"id": "t6",
|
|
192
|
+
"summary": "Introspection trail: a briefing section (and/or hook read enhancement) rendering, from .devex/data alone, the recent event sequence with the advice that applied at each step \u2014 readable by a human after the fact",
|
|
193
|
+
"origin": "llm",
|
|
194
|
+
"status": "confirmed",
|
|
195
|
+
"acceptance_criteria": [
|
|
196
|
+
"Given a fixture journal, the trail renders each event with the advised next move that followed, in plain human-readable markdown",
|
|
197
|
+
"The trail is derived from .devex/data alone \u2014 test runs with network and subprocess access stubbed out"
|
|
198
|
+
],
|
|
199
|
+
"deps": [
|
|
200
|
+
"t4"
|
|
201
|
+
],
|
|
202
|
+
"covers": [
|
|
203
|
+
"c2",
|
|
204
|
+
"h8",
|
|
205
|
+
"c7",
|
|
206
|
+
"h3"
|
|
207
|
+
]
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"id": "t7",
|
|
211
|
+
"summary": "Determinism and read-only guard tests for the advise path: prove the boundary holds \u2014 zero LLM calls, no new side-effect classes, byte-for-byte reproducible output",
|
|
212
|
+
"origin": "llm",
|
|
213
|
+
"status": "confirmed",
|
|
214
|
+
"acceptance_criteria": [
|
|
215
|
+
"A test proves advise output is byte-for-byte identical across two runs over the same fixture inputs",
|
|
216
|
+
"A test proves advise writes nothing (filesystem snapshot of .devex unchanged), spawns no subprocess, and opens no socket"
|
|
217
|
+
],
|
|
218
|
+
"deps": [
|
|
219
|
+
"t4"
|
|
220
|
+
],
|
|
221
|
+
"covers": [
|
|
222
|
+
"c5",
|
|
223
|
+
"h10",
|
|
224
|
+
"c6",
|
|
225
|
+
"h2"
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"id": "t8",
|
|
230
|
+
"summary": "Non-touch loop demo + docs: a walkthrough (docs/) of the closed loop and an integration test that walks the footer chain \u2014 every recommended next command exists, runs exit 0, and the chain reaches advise and returns to work without human input",
|
|
231
|
+
"origin": "llm",
|
|
232
|
+
"status": "confirmed",
|
|
233
|
+
"acceptance_criteria": [
|
|
234
|
+
"An integration test follows footers from overview through hook read into advise and asserts each recommended command parses and runs exit 0 against a fixture repo",
|
|
235
|
+
"A docs walkthrough shows the full cycle (measure, learn, advise, continue) with real command output, readable by agent and human",
|
|
236
|
+
"CLAUDE.md and README gain an advise section consistent with the shipped behavior"
|
|
237
|
+
],
|
|
238
|
+
"deps": [
|
|
239
|
+
"t5",
|
|
240
|
+
"t6",
|
|
241
|
+
"t7"
|
|
242
|
+
],
|
|
243
|
+
"covers": [
|
|
244
|
+
"c1",
|
|
245
|
+
"h7",
|
|
246
|
+
"h1",
|
|
247
|
+
"c7",
|
|
248
|
+
"c4",
|
|
249
|
+
"c2"
|
|
250
|
+
]
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"id": "t9",
|
|
254
|
+
"summary": "Release mechanics: version-bump minor in pyproject.toml, CHANGELOG entry, full suite green (uv run pytest), PR via devex pr open",
|
|
255
|
+
"origin": "llm",
|
|
256
|
+
"status": "confirmed",
|
|
257
|
+
"acceptance_criteria": [
|
|
258
|
+
"version-check CI job passes (pyproject version differs from main; CHANGELOG has the new section)",
|
|
259
|
+
"Full test suite passes locally before the PR opens"
|
|
260
|
+
],
|
|
261
|
+
"deps": [
|
|
262
|
+
"t8"
|
|
263
|
+
],
|
|
264
|
+
"covers": []
|
|
265
|
+
}
|
|
266
|
+
],
|
|
267
|
+
"risks": [
|
|
268
|
+
{
|
|
269
|
+
"id": "r1",
|
|
270
|
+
"text": "Cobertura coverage.xml is the assumed coverage format; lcov / .coverage-SQLite readers are follow-ups",
|
|
271
|
+
"kind": "follow_up",
|
|
272
|
+
"task_id": null
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"id": "r2",
|
|
276
|
+
"text": "Outcome-layer learning (PR cycles, review findings from .devex/data/pr/) is the decided second layer \u2014 explicitly not in this slice",
|
|
277
|
+
"kind": "follow_up",
|
|
278
|
+
"task_id": null
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"id": "r3",
|
|
282
|
+
"text": "A dedicated work/session noun for structured work parked as follow-up in the frame (v2); revisit after the slice ships",
|
|
283
|
+
"kind": "follow_up",
|
|
284
|
+
"task_id": null
|
|
285
|
+
}
|
|
286
|
+
]
|
|
287
|
+
}
|
|
@@ -211,6 +211,12 @@ __marimo__/
|
|
|
211
211
|
.devex/data/
|
|
212
212
|
.agex/data/
|
|
213
213
|
|
|
214
|
+
# Test fixtures deliberately named coverage.xml (commands/advise's
|
|
215
|
+
# test-coverage reader, tests/commands/advise/test_coverage.py) -- un-ignore
|
|
216
|
+
# despite the blanket `coverage.xml` rule above, which is meant only for the
|
|
217
|
+
# real build artifact at the repo root.
|
|
218
|
+
!tests/fixtures/coverage/**/coverage.xml
|
|
219
|
+
|
|
214
220
|
# Worktrees
|
|
215
221
|
.worktrees/
|
|
216
222
|
|
|
@@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.32.0] - 2026-07-02
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `devex advise` — the loop-closing briefing: usage coverage (journal aggregation vs the CLI registry), test-coverage briefing (Cobertura coverage.xml reader), capability coverage (per-backend matrix flags), an introspection trail (recent events + the advice that applied, from .devex/data alone), and a recommended next move — deterministic, read-only, zero LLM calls, with per-backend Next-step footers for all four backends
|
|
15
|
+
- Footer routing into the advice loop: `hook read` (events present, rule `hook_read_advise`) and `overview` (project configured, rule `overview_advise`) now recommend `devex advise`
|
|
16
|
+
- Non-touch loop integration test (`tests/test_advise_loop.py`) walking the footer chain overview → advise → gamify → learn, plus determinism/read-only guard tests (`tests/commands/advise/test_guarantees.py`)
|
|
17
|
+
- Docs: `docs/advise-loop.md` walkthrough (measure → learn → advise → continue), CLAUDE.md + README sections; spec + plan under `docs/specs/` / `docs/plans/` (devague frame `devex-now-closes-the-developer-experience-loop-it`)
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- `.gitignore`: narrow negation so `tests/fixtures/coverage/**/coverage.xml` fixtures are trackable despite the blanket `coverage.xml` rule
|
|
22
|
+
- Usage/trail readers under `devex advise` no longer crash on a stray or non-slug file under `.devex/data` (`ValueError` from the stream-name validator is now skipped) or on an unreadable/non-UTF-8 journal file (`core._jsonl.load_lines` degrades to `[]` on `OSError`/`UnicodeDecodeError`), preserving the command's read-only, always-exit-0 contract
|
|
23
|
+
|
|
8
24
|
## [0.31.0] - 2026-06-23
|
|
9
25
|
|
|
10
26
|
### Added
|
|
@@ -25,8 +41,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
25
41
|
eidetic-cli checkout with `uv`). Propagated by rollout-cli's `eidetic-memory`
|
|
26
42
|
recipe.
|
|
27
43
|
|
|
28
|
-
## [Unreleased]
|
|
29
|
-
|
|
30
44
|
## [0.30.1] - 2026-06-19
|
|
31
45
|
|
|
32
46
|
### Added
|
|
@@ -72,6 +72,19 @@ Spec: `docs/superpowers/specs/2026-05-10-agex-pr-design.md`. Plan: `docs/superpo
|
|
|
72
72
|
|
|
73
73
|
Spec: `docs/specs/2026-06-19-devex-now-reads-qodo-pr-review-findings-structural.md`. Plan: `docs/plans/2026-06-19-devex-now-reads-qodo-pr-review-findings-structural.md`.
|
|
74
74
|
|
|
75
|
+
## `devex advise` — the loop-closing briefing (v0.31.0+)
|
|
76
|
+
|
|
77
|
+
`devex advise --agent <backend>` closes the developer-experience loop: it **measures** three coverage surfaces, **learns** from the agent's tracked usage (deterministic aggregation — never model inference), **advises** one next move, and its footer lets the agent **continue** non-touch. One deterministic markdown briefing, read-only, zero LLM calls. Skill-folder: `commands/advise/` (`SKILL.md` + `scripts/advise.py` + `assets/templates/advise.md.j2`), routed in `cli.py` with a required `--agent`.
|
|
78
|
+
|
|
79
|
+
- **Three coverage surfaces** (the section headings, in order): **Usage coverage** (`scripts/_usage.py` — which devex commands the agent has exercised, from the `.devex/data` journal; the command set is introspected from the CLI's own argparse registry via `registry_commands()`, never hardcoded), **Test coverage** (`scripts/_coverage.py` — Cobertura `coverage.xml` overall line-rate + least-covered files, stdlib XML only), and **Capability coverage** (`scripts/_capability.py` — supported/unsupported capability flags for the backend, from `core/capabilities.py`). Raising devex's *own* repo test coverage is explicitly not this feature.
|
|
80
|
+
- **The introspection trail** (`scripts/_trail.py`, t6) — a fourth section replaying the recent event sequence with the *usage-only* advice that applied at each step, from `.devex/data` alone (h3: a human-readable after-the-fact record). It replays only the usage-only slice because test-coverage state is never journaled event-by-event; the live decision and the trail share one `usage_only_next_step()` so "what usage says" can't be defined two ways.
|
|
81
|
+
- **One decision, consumed twice.** `scripts/next_step.py:advise_next_step(usage, coverage)` returns the single `(rule_key, context)` that drives both the in-body "Recommended next move" line and the trailing "Next step:" footer, so they can't diverge. Rule keys (`RULE_KEYS`, priority order): `no_tracking` (empty journal → install tracking via `gamify`), `unused_commands` (some commands never exercised → try one; `example` is the first unused command other than `advise` itself), `no_coverage` (usage complete but no `coverage.xml`), `all_covered` (nothing flagged). Per-backend footer phrasing under `commands/advise/assets/backends/<backend>.yaml`; body/trail phrasing beside the decision in `next_step.py`.
|
|
82
|
+
- **Routing into advise (both directions closed).** `hook read`'s footer (`hook_read_advise`) routes into `devex advise` once events are tracked, and `overview`'s footer (`overview_advise`) routes into it once the project is configured — so an agent chains overview/hook-read → advise → next command with no human prompt. The non-touch chain is proven executably by `tests/test_advise_loop.py` (walks footers overview → advise → gamify → learn → …, each hop exit 0 + exactly one footer) plus the doc walkthrough `docs/advise-loop.md`.
|
|
83
|
+
- **Boundary — read-only, adds NO new side-effect class.** advise reads the journal, matrix, and `coverage.xml`; it writes nothing, spawns nothing, opens no socket, and deliberately does **not** call `ensure_init()` (reading usage must never create `.devex/`). Empty journal / missing coverage / bare repo all render exit 0 with per-section unsupported-is-success notices (invariant #5). Output is byte-for-byte reproducible (guard tests in `tests/commands/advise/test_guarantees.py`). Because it is pure-read, the "Side effects only in …" invariant above is unchanged.
|
|
84
|
+
- **Out of scope (parked follow-ups).** Outcome-layer learning (PR cycles / review findings under `.devex/data/pr/`) is the decided *second* layer, not this slice; non-Cobertura coverage readers (lcov, `.coverage` SQLite) are follow-ups; a dedicated `work` / `session` noun for structured work stays a follow-up (structured work is emergent from footers + journal + advise for now).
|
|
85
|
+
|
|
86
|
+
Spec: `docs/specs/2026-07-01-devex-now-closes-the-developer-experience-loop-it.md`. Plan: `docs/plans/2026-07-01-devex-now-closes-the-developer-experience-loop-it.md`.
|
|
87
|
+
|
|
75
88
|
## Conventions worth following
|
|
76
89
|
|
|
77
90
|
- **Resource loading: use `importlib.resources.files(...)` and treat the result as a `Traversable`.** Call `.joinpath()` / `.is_file()` / `.read_text(encoding="utf-8")` directly. Wrap with `importlib.resources.as_file()` only when a third-party API needs a real `pathlib.Path`. Do NOT do `Path(str(files(...)))` — it's not zipapp/PEX safe.
|