devex-cli 0.26.0__tar.gz → 0.26.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. {devex_cli-0.26.0 → devex_cli-0.26.1}/.github/workflows/test.yml +41 -0
  2. {devex_cli-0.26.0 → devex_cli-0.26.1}/CHANGELOG.md +10 -0
  3. {devex_cli-0.26.0 → devex_cli-0.26.1}/CLAUDE.md +3 -3
  4. {devex_cli-0.26.0 → devex_cli-0.26.1}/PKG-INFO +1 -1
  5. {devex_cli-0.26.0 → devex_cli-0.26.1}/pyproject.toml +16 -1
  6. {devex_cli-0.26.0 → devex_cli-0.26.1}/sonar-project.properties +6 -7
  7. {devex_cli-0.26.0 → devex_cli-0.26.1}/uv.lock +1 -1
  8. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/agent-config/SKILL.md +0 -0
  9. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  10. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/agent-config/scripts/show.sh +0 -0
  11. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  12. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  13. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/cicd/SKILL.md +0 -0
  14. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  15. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/communicate/SKILL.md +0 -0
  16. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  17. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  18. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  19. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  20. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  21. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  22. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  23. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  24. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/run-tests/SKILL.md +0 -0
  25. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  26. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
  27. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  28. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  29. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  30. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/think/SKILL.md +0 -0
  31. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/think/scripts/think.sh +0 -0
  32. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/version-bump/SKILL.md +0 -0
  33. {devex_cli-0.26.0 → devex_cli-0.26.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
  34. {devex_cli-0.26.0 → devex_cli-0.26.1}/.flake8 +0 -0
  35. {devex_cli-0.26.0 → devex_cli-0.26.1}/.github/workflows/publish.yml +0 -0
  36. {devex_cli-0.26.0 → devex_cli-0.26.1}/.gitignore +0 -0
  37. {devex_cli-0.26.0 → devex_cli-0.26.1}/.python-version +0 -0
  38. {devex_cli-0.26.0 → devex_cli-0.26.1}/LICENSE +0 -0
  39. {devex_cli-0.26.0 → devex_cli-0.26.1}/README.md +0 -0
  40. {devex_cli-0.26.0 → devex_cli-0.26.1}/culture.yaml +0 -0
  41. {devex_cli-0.26.0 → devex_cli-0.26.1}/docs/skill-sources.md +0 -0
  42. {devex_cli-0.26.0 → devex_cli-0.26.1}/docs/superpowers/plans/2026-04-18-agex-v0.1.md +0 -0
  43. {devex_cli-0.26.0 → devex_cli-0.26.1}/docs/superpowers/plans/2026-05-10-agex-pr.md +0 -0
  44. {devex_cli-0.26.0 → devex_cli-0.26.1}/docs/superpowers/specs/2026-04-18-agex-design.md +0 -0
  45. {devex_cli-0.26.0 → devex_cli-0.26.1}/docs/superpowers/specs/2026-04-26-agex-doctor.md +0 -0
  46. {devex_cli-0.26.0 → devex_cli-0.26.1}/docs/superpowers/specs/2026-05-10-agex-pr-design.md +0 -0
  47. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/__init__.py +0 -0
  48. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/__main__.py +0 -0
  49. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/__init__.py +0 -0
  50. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/acp/__init__.py +0 -0
  51. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/acp/probe.py +0 -0
  52. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/capabilities/acp.yaml +0 -0
  53. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/capabilities/claude-code.yaml +0 -0
  54. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/capabilities/codex.yaml +0 -0
  55. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/capabilities/copilot.yaml +0 -0
  56. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/claude_code/__init__.py +0 -0
  57. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/claude_code/probe.py +0 -0
  58. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/codex/__init__.py +0 -0
  59. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/codex/probe.py +0 -0
  60. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/copilot/__init__.py +0 -0
  61. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/backends/copilot/probe.py +0 -0
  62. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/cli.py +0 -0
  63. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/__init__.py +0 -0
  64. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/doctor/SKILL.md +0 -0
  65. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/doctor/__init__.py +0 -0
  66. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/doctor/assets/report.md.j2 +0 -0
  67. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/doctor/references/design.md +0 -0
  68. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/doctor/scripts/__init__.py +0 -0
  69. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/doctor/scripts/doctor.py +0 -0
  70. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/explain/SKILL.md +0 -0
  71. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/explain/__init__.py +0 -0
  72. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/explain/assets/topics/devex.md +0 -0
  73. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/explain/references/.gitkeep +0 -0
  74. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/explain/scripts/__init__.py +0 -0
  75. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/explain/scripts/explain.py +0 -0
  76. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/gamify/SKILL.md +0 -0
  77. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/gamify/__init__.py +0 -0
  78. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/gamify/assets/hooks/claude-code.json +0 -0
  79. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/gamify/references/.gitkeep +0 -0
  80. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/gamify/scripts/__init__.py +0 -0
  81. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/gamify/scripts/install.py +0 -0
  82. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/hook/SKILL.md +0 -0
  83. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/hook/__init__.py +0 -0
  84. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/hook/assets/table.md.j2 +0 -0
  85. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/hook/references/.gitkeep +0 -0
  86. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/hook/scripts/__init__.py +0 -0
  87. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/hook/scripts/read.py +0 -0
  88. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/hook/scripts/write.py +0 -0
  89. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/SKILL.md +0 -0
  90. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/__init__.py +0 -0
  91. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/menu.md.j2 +0 -0
  92. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/cicd/SKILL.md +0 -0
  93. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/gamify/SKILL.md +0 -0
  94. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/gamify/assets/skill-template/claude-code/SKILL.md +0 -0
  95. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/introspect/SKILL.md +0 -0
  96. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/introspect/assets/skill-template/claude-code/SKILL.md +0 -0
  97. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/levelup/SKILL.md +0 -0
  98. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/levelup/assets/skill-template/claude-code/SKILL.md +0 -0
  99. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/visualize/SKILL.md +0 -0
  100. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/assets/topics/visualize/assets/skill-template/claude-code/SKILL.md +0 -0
  101. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/references/.gitkeep +0 -0
  102. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/scripts/__init__.py +0 -0
  103. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/learn/scripts/learn.py +0 -0
  104. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/SKILL.md +0 -0
  105. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/__init__.py +0 -0
  106. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/assets/backends/acp.yaml +0 -0
  107. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/assets/backends/claude-code.yaml +0 -0
  108. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/assets/backends/codex.yaml +0 -0
  109. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/assets/backends/copilot.yaml +0 -0
  110. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/assets/sections.md.j2 +0 -0
  111. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/references/.gitkeep +0 -0
  112. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/scripts/__init__.py +0 -0
  113. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/overview/scripts/overview.py +0 -0
  114. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/SKILL.md +0 -0
  115. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/__init__.py +0 -0
  116. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/__init__.py +0 -0
  117. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/backends/__init__.py +0 -0
  118. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/backends/acp.yaml +0 -0
  119. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/backends/claude-code.yaml +0 -0
  120. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/backends/codex.yaml +0 -0
  121. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/backends/copilot.yaml +0 -0
  122. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/rules/__init__.py +0 -0
  123. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/rules/lint_rules.py +0 -0
  124. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/rules/next_step_rules.py +0 -0
  125. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/__init__.py +0 -0
  126. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/delta.md.j2 +0 -0
  127. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/footer.md.j2 +0 -0
  128. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/lint_result.md.j2 +0 -0
  129. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/pr_await_detached.md.j2 +0 -0
  130. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/pr_briefing.md.j2 +0 -0
  131. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/pr_open_result.md.j2 +0 -0
  132. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/pr_reply_result.md.j2 +0 -0
  133. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/assets/templates/pr_review_result.md.j2 +0 -0
  134. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/__init__.py +0 -0
  135. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/_await_worker.py +0 -0
  136. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/_deploy.py +0 -0
  137. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/_detach.py +0 -0
  138. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/_footer.py +0 -0
  139. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/_journal.py +0 -0
  140. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/_qodo.py +0 -0
  141. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/_readiness.py +0 -0
  142. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/_sonar.py +0 -0
  143. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/await_.py +0 -0
  144. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/delta.py +0 -0
  145. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/lint.py +0 -0
  146. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/open_.py +0 -0
  147. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/read.py +0 -0
  148. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/reply.py +0 -0
  149. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/commands/pr/scripts/review.py +0 -0
  150. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/__init__.py +0 -0
  151. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/_jsonl.py +0 -0
  152. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/backend.py +0 -0
  153. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/capabilities.py +0 -0
  154. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/config.py +0 -0
  155. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/github.py +0 -0
  156. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/hook_io.py +0 -0
  157. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/journal.py +0 -0
  158. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/paths.py +0 -0
  159. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/prog.py +0 -0
  160. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/render.py +0 -0
  161. {devex_cli-0.26.0 → devex_cli-0.26.1}/src/devex/core/skill_loader.py +0 -0
  162. {devex_cli-0.26.0 → devex_cli-0.26.1}/tester-agents/claude/.claude/settings.json +0 -0
  163. {devex_cli-0.26.0 → devex_cli-0.26.1}/tester-agents/claude/.claude/skills +0 -0
  164. {devex_cli-0.26.0 → devex_cli-0.26.1}/tester-agents/claude/CLAUDE.md +0 -0
  165. {devex_cli-0.26.0 → devex_cli-0.26.1}/tester-agents/claude/README.md +0 -0
  166. {devex_cli-0.26.0 → devex_cli-0.26.1}/tester-agents/claude/culture.yaml +0 -0
  167. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/__init__.py +0 -0
  168. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/backends/__init__.py +0 -0
  169. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/backends/test_claude_code_probe.py +0 -0
  170. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/backends/test_stub_probes.py +0 -0
  171. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/__init__.py +0 -0
  172. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/__init__.py +0 -0
  173. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/fixtures/gh/.gitkeep +0 -0
  174. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/fixtures/gh/pr_checks_42.json +0 -0
  175. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/fixtures/gh/pr_comments_42.json +0 -0
  176. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/fixtures/gh/qodo_summary_comment.html +0 -0
  177. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/fixtures/journals/dogfood_40.jsonl +0 -0
  178. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_await.py +0 -0
  179. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_await_detach.py +0 -0
  180. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_delta.py +0 -0
  181. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_deploy.py +0 -0
  182. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_footer.py +0 -0
  183. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_lint.py +0 -0
  184. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_lint_rules.py +0 -0
  185. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_open.py +0 -0
  186. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_qodo.py +0 -0
  187. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_read.py +0 -0
  188. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_readiness.py +0 -0
  189. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_reply.py +0 -0
  190. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/pr/test_review.py +0 -0
  191. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/test_doctor.py +0 -0
  192. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/test_explain.py +0 -0
  193. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/test_gamify.py +0 -0
  194. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/test_hook.py +0 -0
  195. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/test_learn.py +0 -0
  196. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/test_overview.py +0 -0
  197. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/commands/test_prog_propagation.py +0 -0
  198. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/__init__.py +0 -0
  199. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_backend.py +0 -0
  200. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_capabilities.py +0 -0
  201. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_config.py +0 -0
  202. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_github.py +0 -0
  203. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_hook_io.py +0 -0
  204. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_journal.py +0 -0
  205. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_paths.py +0 -0
  206. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_prog.py +0 -0
  207. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_render.py +0 -0
  208. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_resolve_backend.py +0 -0
  209. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_skill_loader.py +0 -0
  210. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/core/test_version_lookup.py +0 -0
  211. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/empty/.gitkeep +0 -0
  212. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/malformed/.claude/hooks.json +0 -0
  213. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/malformed/.claude/settings.json +0 -0
  214. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/malformed/.claude/skills/bad/SKILL.md +0 -0
  215. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/malformed/.claude/skills/broken-yaml/SKILL.md +0 -0
  216. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/typical/.claude/hooks.json +0 -0
  217. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/typical/.claude/settings.json +0 -0
  218. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/typical/.claude/skills/example/SKILL.md +0 -0
  219. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/fixtures/claude-code/typical/CLAUDE.md +0 -0
  220. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/test_cli_dispatch.py +0 -0
  221. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/test_cli_errors.py +0 -0
  222. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/test_cli_smoke.py +0 -0
  223. {devex_cli-0.26.0 → devex_cli-0.26.1}/tests/test_skill_md_consistency.py +0 -0
@@ -23,6 +23,47 @@ jobs:
23
23
  - run: uv pip install -e ".[dev]"
24
24
  - run: uv run pytest
25
25
 
26
+ # --------------------------------------------------------------------------
27
+ # SonarCloud CI-based analysis + coverage. SonarCloud is no longer in
28
+ # Automatic Analysis mode (the two modes are mutually exclusive), so this job
29
+ # is the sole analysis path: it generates coverage.xml (with repo-relative
30
+ # paths via pyproject [tool.coverage.run] so Sonar can match files) and runs
31
+ # the scanner, which
32
+ # reads sonar-project.properties (projectKey / organization / reportPaths)
33
+ # and the SONAR_TOKEN repo secret. Runs on PRs (new-code decoration) and on
34
+ # pushes to main (baseline). fetch-depth: 0 gives Sonar the full history it
35
+ # needs for accurate new-code / blame attribution.
36
+ # --------------------------------------------------------------------------
37
+ sonarcloud:
38
+ name: SonarCloud
39
+ runs-on: ubuntu-latest
40
+ # Promote a *presence flag* (not the secret) to job env so the scan step
41
+ # can gate on it — `secrets.*` isn't allowed in `if:`. Lets forks /
42
+ # token-less runs skip the scan rather than hard-fail. (Pattern from the
43
+ # sibling agentfront repo, whose CI-based SonarCloud scan is green.)
44
+ env:
45
+ SONAR_TOKEN_PRESENT: ${{ secrets.SONAR_TOKEN != '' }}
46
+ steps:
47
+ - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
48
+ with:
49
+ fetch-depth: 0
50
+ - uses: astral-sh/setup-uv@caf0cab7a618c569241d31dcd442f54681755d39 # v3
51
+ - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5
52
+ with:
53
+ python-version: "3.12"
54
+ - run: uv venv
55
+ - run: uv pip install -e ".[dev]"
56
+ - run: uv run pytest --cov=src/devex --cov-report=xml --cov-report=term
57
+ # Pinned to v6 to match the sibling agentfront repo's working scan.
58
+ # The v7+/v8 scanner engine 404s on `api.sonarcloud.io/analysis/analyses`
59
+ # against SonarQube Cloud; v6 posts to sonarcloud.io directly.
60
+ - name: SonarCloud Scan
61
+ if: env.SONAR_TOKEN_PRESENT == 'true'
62
+ uses: SonarSource/sonarqube-scan-action@fd88b7d7ccbaefd23d8f36f73b59db7a3d246602 # v6
63
+ env:
64
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
65
+ SONAR_HOST_URL: https://sonarcloud.io
66
+
26
67
  # --------------------------------------------------------------------------
27
68
  # Enforces that every PR touching code (src/, tests/, pyproject.toml) also
28
69
  # bumps the version in pyproject.toml. Without this, a merge to main that
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.26.1] - 2026-05-29
11
+
12
+ ### Added
13
+
14
+ - SonarCloud CI-based analysis + coverage upload: a `sonarcloud` job in test.yml runs `pytest --cov` and the SHA-pinned `sonarqube-scan-action` (v6), reading `sonar-project.properties` + the `SONAR_TOKEN` secret. Coverage config lives in `pyproject.toml [tool.coverage.run]` (`relative_files` so coverage.xml paths map to `sonar.sources=src`).
15
+
16
+ ### Changed
17
+
18
+ - SonarCloud moved from Automatic Analysis to CI-based analysis (the two are mutually exclusive); project now under the `agentculture` org. Updated CLAUDE.md / sonar-project.properties notes accordingly.
19
+
10
20
  ## [0.26.0] - 2026-05-29
11
21
 
12
22
  ### Added
@@ -78,15 +78,15 @@ uv run devex --version
78
78
  uv run devex explain devex
79
79
  uv run devex explain explain
80
80
 
81
- # Coverage (matches what build.yml runs; SonarCloud reads this file)
81
+ # Coverage (matches the `sonarcloud` job in test.yml; SonarCloud reads coverage.xml)
82
82
  uv run pytest --cov=src/devex --cov-report=xml --cov-report=term
83
83
  ```
84
84
 
85
85
  ## CI surface
86
86
 
87
- - `.github/workflows/test.yml` — matrix: 3 OS × 4 Python (3.10–3.13) running `uv run pytest`. Also runs a `version-check` job on PRs that fails (with a sticky `<!-- version-check -->` comment) when `pyproject.toml`'s version on the PR matches the one on `main` and any code file under `src/` / `tests/` / `pyproject.toml` changed. Docs-only PRs skip the check.
87
+ - `.github/workflows/test.yml` — matrix: 3 OS × 4 Python (3.10–3.13) running `uv run pytest`. Also runs (1) a `sonarcloud` job that generates `coverage.xml` (`pytest --cov`, repo-relative paths via `pyproject [tool.coverage.run]`) and runs the SHA-pinned `sonarqube-scan-action` (needs the `SONAR_TOKEN` repo secret); and (2) a `version-check` job on PRs that fails (with a sticky `<!-- version-check -->` comment) when `pyproject.toml`'s version on the PR matches the one on `main` and any code file under `src/` / `tests/` / `pyproject.toml` changed. Docs-only PRs skip the version check.
88
88
  - `.github/workflows/publish.yml` — builds sdist + wheel. PRs publish a per-PR dev version to TestPyPI (sticky install-command comment); pushes to `main` publish the stable version to TestPyPI (canary), then an `autotag` job pushes `v<version>` if missing, which gates the inline `publish-pypi` + `github-release` jobs. No manual tagging — bumping `pyproject.toml` is the release signal.
89
- - SonarCloud is configured as **Automatic Analysis** on the repo (no CI workflow). Coverage and quality are read by SonarCloud directly.
89
+ - SonarCloud runs in **CI-based analysis** mode (Automatic Analysis is off — the two are mutually exclusive). The `sonarcloud` job in `test.yml` uploads coverage + triggers the scan via `sonarqube-scan-action`, reading `sonar-project.properties` and the `SONAR_TOKEN` secret. The quality gate decorates PRs and gates merges.
90
90
  - All third-party actions are **pinned to full commit SHAs** with trailing `# vN` comments (rule `githubactions:S7637`). Keep new actions pinned the same way.
91
91
 
92
92
  ## SonarCloud notes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devex-cli
3
- Version: 0.26.0
3
+ Version: 0.26.1
4
4
  Summary: Agent-operated developer-experience CLI — deterministic per-backend markdown briefings for autonomous agents.
5
5
  Project-URL: Homepage, https://culture.dev/devex/
6
6
  Project-URL: Repository, https://github.com/agentculture/devex
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devex-cli"
3
- version = "0.26.0"
3
+ version = "0.26.1"
4
4
  description = "Agent-operated developer-experience CLI — deterministic per-backend markdown briefings for autonomous agents."
5
5
  authors = [{name = "Ori Nachum"}]
6
6
  license = {text = "MIT"}
@@ -45,6 +45,21 @@ packages = ["src/devex"]
45
45
  testpaths = ["tests"]
46
46
  addopts = "-n auto -v"
47
47
 
48
+ [tool.coverage.run]
49
+ source = ["src/devex"]
50
+ # Emit repo-relative paths in coverage.xml so SonarCloud maps them to
51
+ # sonar.sources=src (absolute / .venv paths fail to map → empty coverage).
52
+ relative_files = true
53
+
54
+ [tool.coverage.report]
55
+ show_missing = true
56
+ fail_under = 60
57
+ exclude_lines = [
58
+ "pragma: no cover",
59
+ "if __name__ == .__main__.",
60
+ "if TYPE_CHECKING:",
61
+ ]
62
+
48
63
  [tool.black]
49
64
  line-length = 100
50
65
 
@@ -1,5 +1,5 @@
1
1
  sonar.projectKey=agentculture_devex
2
- sonar.organization=orinachum
2
+ sonar.organization=agentculture
3
3
 
4
4
  # Displayed in SonarCloud UI
5
5
  sonar.projectName=devex
@@ -12,12 +12,11 @@ sonar.sourceEncoding=UTF-8
12
12
  # Python: target versions (matches CI matrix)
13
13
  sonar.python.version=3.10, 3.11, 3.12, 3.13
14
14
 
15
- # Coverage report path. SonarCloud runs in Automatic Analysis mode (no
16
- # CI-based scansee PR #20). Automatic Analysis doesn't upload
17
- # pytest-cov output; this key remains so that if/when we ever revisit
18
- # coverage delivery, the file path is already declared. The bugs /
19
- # vulnerabilities / code-smells portion of the analysis works without
20
- # coverage and is what gates the PR quality gate today.
15
+ # Coverage report path. SonarCloud now runs in CI-based analysis mode
16
+ # (Automatic Analysis is OFF the two are mutually exclusive). The `sonarcloud`
17
+ # job in .github/workflows/test.yml runs `pytest --cov` (repo-relative paths
18
+ # via pyproject [tool.coverage.run], so Sonar can match files) and the
19
+ # sonarqube-scan-action uploads this report. Requires the SONAR_TOKEN repo secret.
21
20
  sonar.python.coverage.reportPaths=coverage.xml
22
21
 
23
22
  # S5496 triggers on render_string() because it renders a Jinja template with a
@@ -202,7 +202,7 @@ toml = [
202
202
 
203
203
  [[package]]
204
204
  name = "devex-cli"
205
- version = "0.26.0"
205
+ version = "0.26.1"
206
206
  source = { editable = "." }
207
207
  dependencies = [
208
208
  { name = "jinja2" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes