coderio 0.4.3__tar.gz → 0.5.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.
Files changed (238) hide show
  1. {coderio-0.4.3 → coderio-0.5.0}/.github/workflows/ci.yml +25 -7
  2. {coderio-0.4.3 → coderio-0.5.0}/.github/workflows/release.yml +39 -9
  3. coderio-0.5.0/.gitignore +64 -0
  4. {coderio-0.4.3 → coderio-0.5.0}/CHANGELOG.md +260 -1
  5. {coderio-0.4.3 → coderio-0.5.0}/CONTRIBUTING.md +11 -5
  6. coderio-0.5.0/PKG-INFO +193 -0
  7. {coderio-0.4.3 → coderio-0.5.0}/README.md +58 -10
  8. coderio-0.5.0/README_en.md +149 -0
  9. coderio-0.5.0/ROADMAP.md +64 -0
  10. coderio-0.5.0/ROADMAP_en.md +83 -0
  11. coderio-0.5.0/demo.gif +0 -0
  12. coderio-0.5.0/docs/CONFIG.md +223 -0
  13. {coderio-0.4.3 → coderio-0.5.0}/docs/coderio-architecture.md +82 -93
  14. coderio-0.5.0/docs/images/confirm-menu.svg +190 -0
  15. coderio-0.5.0/docs/images/harness-warn.svg +190 -0
  16. coderio-0.5.0/docs/images/todo-panel.svg +192 -0
  17. {coderio-0.4.3 → coderio-0.5.0}/pyproject.toml +23 -8
  18. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/_deepagents_compat.py +6 -20
  19. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/command_review.py +9 -4
  20. coderio-0.5.0/src/coderio/agent/custom_agents.py +94 -0
  21. coderio-0.5.0/src/coderio/agent/deep_loop.py +1242 -0
  22. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/harness.py +166 -29
  23. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/harness_middleware.py +81 -39
  24. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/hooks.py +65 -8
  25. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/permission_middleware.py +3 -2
  26. coderio-0.5.0/src/coderio/agent/plan_artifact.py +198 -0
  27. coderio-0.5.0/src/coderio/agent/project_instructions.py +164 -0
  28. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/prompts.py +6 -11
  29. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/skill_tool.py +20 -9
  30. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/stream.py +4 -4
  31. coderio-0.5.0/src/coderio/agent/sync_only.py +28 -0
  32. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/app.py +6 -0
  33. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/commands.py +58 -8
  34. coderio-0.5.0/src/coderio/cli/credentials.py +147 -0
  35. coderio-0.5.0/src/coderio/cli/custom_commands.py +150 -0
  36. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/multimodal.py +8 -2
  37. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/onboarding.py +46 -40
  38. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/providers.py +10 -4
  39. coderio-0.5.0/src/coderio/cli/render.py +17 -0
  40. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/repl.py +117 -7
  41. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/run_cmd.py +37 -24
  42. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/stream.py +0 -12
  43. coderio-0.5.0/src/coderio/cli/stream_controller.py +550 -0
  44. coderio-0.5.0/src/coderio/cli/tui.py +1043 -0
  45. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/tui_onboarding.py +71 -38
  46. coderio-0.5.0/src/coderio/cli/tui_runtime.py +371 -0
  47. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/tui_widgets.py +53 -8
  48. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/config/__init__.py +0 -2
  49. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/config/loader.py +12 -11
  50. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/config/models.py +11 -32
  51. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/config/trust.py +28 -5
  52. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/llm/factory.py +10 -9
  53. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/mcp_loader.py +17 -1
  54. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/session/message.py +19 -1
  55. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/session/store.py +40 -13
  56. coderio-0.5.0/src/coderio/skills/parser.py +77 -0
  57. coderio-0.5.0/src/coderio/tools/__init__.py +55 -0
  58. coderio-0.5.0/src/coderio/tools/base.py +40 -0
  59. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/bash.py +3 -1
  60. coderio-0.5.0/src/coderio/tools/checkpoint.py +178 -0
  61. coderio-0.5.0/src/coderio/tools/command_policy.py +864 -0
  62. coderio-0.5.0/src/coderio/tools/confirm_diff.py +162 -0
  63. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/edit_file.py +5 -0
  64. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/multi_edit.py +34 -4
  65. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/permission.py +4 -2
  66. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/sandbox_runner.py +9 -0
  67. coderio-0.5.0/src/coderio/tools/taxonomy.py +122 -0
  68. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/web_fetch.py +29 -3
  69. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/win_job.py +32 -12
  70. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/win_sandbox.py +116 -4
  71. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/write_file.py +6 -1
  72. coderio-0.5.0/tests/agent/test_custom_agents.py +190 -0
  73. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_deep_integration.py +28 -41
  74. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_deep_loop_unit.py +246 -11
  75. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_deepagents_compat.py +0 -42
  76. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_harness.py +115 -0
  77. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_harness_middleware.py +74 -1
  78. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_hooks.py +86 -10
  79. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_perf_baseline.py +9 -6
  80. coderio-0.5.0/tests/agent/test_plan_artifact.py +184 -0
  81. coderio-0.5.0/tests/agent/test_production_seam.py +479 -0
  82. coderio-0.5.0/tests/agent/test_project_instructions.py +201 -0
  83. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_skill_tool.py +19 -0
  84. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_stream.py +0 -9
  85. coderio-0.5.0/tests/agent/test_sync_only_middleware.py +64 -0
  86. coderio-0.5.0/tests/cli/test_app_commands.py +246 -0
  87. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_commands.py +43 -0
  88. coderio-0.5.0/tests/cli/test_credentials.py +181 -0
  89. coderio-0.5.0/tests/cli/test_custom_commands.py +327 -0
  90. coderio-0.5.0/tests/cli/test_gate_builder.py +75 -0
  91. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_live_thinking.py +3 -2
  92. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_multimodal.py +24 -0
  93. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_onboarding.py +50 -0
  94. coderio-0.5.0/tests/cli/test_render.py +7 -0
  95. coderio-0.5.0/tests/cli/test_stream_controller.py +75 -0
  96. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_truncation.py +1 -1
  97. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_tui_onboarding.py +61 -3
  98. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_tui_picker.py +1 -1
  99. coderio-0.5.0/tests/cli/test_tui_runtime.py +138 -0
  100. coderio-0.5.0/tests/cli/test_tui_runtime_screens.py +330 -0
  101. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_tui_startup.py +157 -5
  102. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_tui_widgets.py +118 -1
  103. coderio-0.5.0/tests/cli/test_ux_features.py +264 -0
  104. {coderio-0.4.3 → coderio-0.5.0}/tests/config/test_loader.py +0 -33
  105. {coderio-0.4.3 → coderio-0.5.0}/tests/config/test_trust.py +41 -1
  106. coderio-0.5.0/tests/e2e/test_cli_e2e.py +150 -0
  107. {coderio-0.4.3 → coderio-0.5.0}/tests/llm/test_factory.py +32 -0
  108. {coderio-0.4.3 → coderio-0.5.0}/tests/session/test_message.py +23 -0
  109. {coderio-0.4.3 → coderio-0.5.0}/tests/session/test_store.py +83 -2
  110. {coderio-0.4.3 → coderio-0.5.0}/tests/test_seams.py +671 -0
  111. coderio-0.5.0/tests/tools/test_checkpoint.py +457 -0
  112. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_command_policy.py +383 -0
  113. coderio-0.5.0/tests/tools/test_confirm_diff.py +212 -0
  114. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_multi_edit.py +50 -0
  115. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_sandbox.py +120 -4
  116. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_web_fetch.py +28 -0
  117. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_win_job.py +56 -0
  118. {coderio-0.4.3 → coderio-0.5.0}/uv.lock +4 -4
  119. coderio-0.4.3/.gitignore +0 -41
  120. coderio-0.4.3/PKG-INFO +0 -148
  121. coderio-0.4.3/README_en.md +0 -103
  122. coderio-0.4.3/src/coderio/agent/deep_loop.py +0 -845
  123. coderio-0.4.3/src/coderio/cli/credentials.py +0 -70
  124. coderio-0.4.3/src/coderio/cli/render.py +0 -28
  125. coderio-0.4.3/src/coderio/cli/tui.py +0 -1586
  126. coderio-0.4.3/src/coderio/skills/parser.py +0 -50
  127. coderio-0.4.3/src/coderio/tools/__init__.py +0 -94
  128. coderio-0.4.3/src/coderio/tools/base.py +0 -55
  129. coderio-0.4.3/src/coderio/tools/command_policy.py +0 -434
  130. coderio-0.4.3/tests/cli/test_credentials.py +0 -39
  131. coderio-0.4.3/tests/cli/test_render.py +0 -30
  132. coderio-0.4.3/tests/cli/test_ux_features.py +0 -124
  133. {coderio-0.4.3 → coderio-0.5.0}/.github/dependabot.yml +0 -0
  134. {coderio-0.4.3 → coderio-0.5.0}/LICENSE +0 -0
  135. {coderio-0.4.3 → coderio-0.5.0}/THIRD_PARTY_LICENSES.md +0 -0
  136. {coderio-0.4.3 → coderio-0.5.0}/scripts/verify_deepagent_live.py +0 -0
  137. {coderio-0.4.3 → coderio-0.5.0}/scripts/verify_harness_live.py +0 -0
  138. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/__init__.py +0 -0
  139. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/__init__.py +0 -0
  140. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/agent/state.py +0 -0
  141. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/__init__.py +0 -0
  142. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/mcp_cmd.py +0 -0
  143. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/skills_cmd.py +0 -0
  144. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/cli/tui_screens.py +0 -0
  145. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/config/bootstrap.py +0 -0
  146. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/llm/__init__.py +0 -0
  147. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/llm/probe.py +0 -0
  148. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/session/__init__.py +0 -0
  149. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/__init__.py +0 -0
  150. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/bundled/executing-plans/SKILL.md +0 -0
  151. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/LICENSE +0 -0
  152. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/README.md +0 -0
  153. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/clarifying-questions/SKILL.md +0 -0
  154. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/clarifying-questions/evals/evals.json +0 -0
  155. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/code-review/SKILL.md +0 -0
  156. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/code-review/evals/evals.json +0 -0
  157. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/commit-message/SKILL.md +0 -0
  158. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/commit-message/evals/evals.json +0 -0
  159. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/debugging/SKILL.md +0 -0
  160. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/debugging/evals/evals.json +0 -0
  161. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/error-handling/SKILL.md +0 -0
  162. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/error-handling/evals/evals.json +0 -0
  163. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/lion-writing-skills/SKILL.md +0 -0
  164. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/lion-writing-skills/evals/evals.json +0 -0
  165. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/naming/SKILL.md +0 -0
  166. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/naming/evals/evals.json +0 -0
  167. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/SKILL.md +0 -0
  168. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/evals/evals.json +0 -0
  169. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/spec-writing/SKILL.md +0 -0
  170. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/spec-writing/evals/evals.json +0 -0
  171. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/task-breakdown/SKILL.md +0 -0
  172. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/task-breakdown/evals/evals.json +0 -0
  173. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/testing/SKILL.md +0 -0
  174. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/testing/evals/evals.json +0 -0
  175. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/verify-and-fix/SKILL.md +0 -0
  176. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/lion-skills/skills/verify-and-fix/evals/evals.json +0 -0
  177. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/models.py +0 -0
  178. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/skills/store.py +0 -0
  179. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/glob_tool.py +0 -0
  180. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/grep_tool.py +0 -0
  181. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/linux_sandbox.py +0 -0
  182. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/list_dir.py +0 -0
  183. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/note.py +0 -0
  184. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/read_file.py +0 -0
  185. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/todo.py +0 -0
  186. {coderio-0.4.3 → coderio-0.5.0}/src/coderio/tools/web_search.py +0 -0
  187. {coderio-0.4.3 → coderio-0.5.0}/tests/__init__.py +0 -0
  188. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/__init__.py +0 -0
  189. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/conftest.py +0 -0
  190. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_command_review.py +0 -0
  191. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_deep_loop.py +0 -0
  192. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_prompts.py +0 -0
  193. {coderio-0.4.3 → coderio-0.5.0}/tests/agent/test_state.py +0 -0
  194. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/__init__.py +0 -0
  195. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_app.py +0 -0
  196. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_command_menu.py +0 -0
  197. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_input_isolation.py +0 -0
  198. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_mcp_cmd.py +0 -0
  199. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_onboarding_logic.py +0 -0
  200. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_providers.py +0 -0
  201. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_repl_loop.py +0 -0
  202. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_repl_reset.py +0 -0
  203. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_run_cmd.py +0 -0
  204. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_skills_cmd.py +0 -0
  205. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_status_bar.py +0 -0
  206. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_stream.py +0 -0
  207. {coderio-0.4.3 → coderio-0.5.0}/tests/cli/test_tui_screens.py +0 -0
  208. {coderio-0.4.3 → coderio-0.5.0}/tests/config/__init__.py +0 -0
  209. {coderio-0.4.3 → coderio-0.5.0}/tests/config/test_bootstrap.py +0 -0
  210. {coderio-0.4.3 → coderio-0.5.0}/tests/config/test_models.py +0 -0
  211. {coderio-0.4.3 → coderio-0.5.0}/tests/conftest.py +0 -0
  212. {coderio-0.4.3 → coderio-0.5.0}/tests/e2e/__init__.py +0 -0
  213. {coderio-0.4.3 → coderio-0.5.0}/tests/llm/__init__.py +0 -0
  214. {coderio-0.4.3 → coderio-0.5.0}/tests/llm/test_probe.py +0 -0
  215. {coderio-0.4.3 → coderio-0.5.0}/tests/session/__init__.py +0 -0
  216. {coderio-0.4.3 → coderio-0.5.0}/tests/skills/__init__.py +0 -0
  217. {coderio-0.4.3 → coderio-0.5.0}/tests/skills/test_bundled.py +0 -0
  218. {coderio-0.4.3 → coderio-0.5.0}/tests/skills/test_parser.py +0 -0
  219. {coderio-0.4.3 → coderio-0.5.0}/tests/skills/test_skill_tools.py +0 -0
  220. {coderio-0.4.3 → coderio-0.5.0}/tests/skills/test_store.py +0 -0
  221. {coderio-0.4.3 → coderio-0.5.0}/tests/test_mcp_loader.py +0 -0
  222. {coderio-0.4.3 → coderio-0.5.0}/tests/test_p0_stability.py +0 -0
  223. {coderio-0.4.3 → coderio-0.5.0}/tests/test_repl.py +0 -0
  224. {coderio-0.4.3 → coderio-0.5.0}/tests/test_version.py +0 -0
  225. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/__init__.py +0 -0
  226. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_bash.py +0 -0
  227. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_concrete_gates.py +0 -0
  228. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_edit_prefix.py +0 -0
  229. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_file_tools.py +0 -0
  230. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_glob_tool.py +0 -0
  231. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_grep_tool.py +0 -0
  232. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_list_dir.py +0 -0
  233. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_note.py +0 -0
  234. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_permission.py +0 -0
  235. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_registry.py +0 -0
  236. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_search_tools.py +0 -0
  237. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_todo.py +0 -0
  238. {coderio-0.4.3 → coderio-0.5.0}/tests/tools/test_web.py +0 -0
@@ -67,22 +67,40 @@ jobs:
67
67
 
68
68
  - name: Audit dependencies for known vulnerabilities
69
69
  # Scans installed packages against the PyPI advisory database.
70
- # Non-blocking (continue-on-error) — reports issues without failing CI.
70
+ # BLOCKING since 2026-08-28 (audit finding: continue-on-error made the
71
+ # scan decorative — known CVEs could never turn CI red). If a flagged
72
+ # vuln is a false positive / unfixable, add an explicit --ignore-vuln
73
+ # with a comment rather than re-adding continue-on-error.
71
74
  shell: bash
72
- continue-on-error: true
73
75
  run: |
74
76
  uv pip install pip-audit
75
77
  uv run pip-audit
76
78
 
77
79
  - name: Run tests with coverage
78
80
  # Enforces a coverage floor so coverage can't silently regress.
79
- # The 70% floor is conservative (current baseline is ~75%) — it catches
80
- # gross regressions (a module losing its tests) without failing on
81
- # minor fluctuations. pyproject.toml's [tool.coverage.report]
82
- # fail_under=60 is the local-dev default; CI enforces the stricter 70%.
81
+ # Measured baseline 2026-08-24: 82% total (weakest: sandbox_runner 43%
82
+ # — POSIX-only branches skip on Windows). The 75% floor keeps real
83
+ # headroom for platform variance while catching gross regressions
84
+ # (a module losing its tests). pyproject.toml's
85
+ # [tool.coverage.report] fail_under=60 is the local-dev default;
86
+ # CI enforces the stricter 75%.
83
87
  shell: bash
84
88
  run: |
85
- uv run python -m pytest -q --cov=coderio --cov-report=term-missing --cov-fail-under=70
89
+ uv run python -m pytest -q --cov=coderio --cov-report=term-missing --cov-fail-under=75
90
+
91
+ - name: MCP extra smoke (install + loader import)
92
+ # The mcp extra was never installed in CI (audit 2026-09-04 P1-17):
93
+ # `load_mcp_tools_sync` — the code path behind README's "MCP support"
94
+ # — was never executed anywhere, in tests or CI. Install the extra
95
+ # from the frozen lock and at least run the loader test module
96
+ # against the real adapters package. One matrix leg is enough (the
97
+ # loader is pure Python; this step exists so the import path can't
98
+ # rot silently).
99
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
100
+ run: |
101
+ uv sync --frozen --extra dev --extra mcp
102
+ uv run python -c "from coderio.mcp_loader import load_mcp_tools_sync; print('mcp loader import OK')"
103
+ uv run python -m pytest tests/test_mcp_loader.py -q
86
104
 
87
105
  - name: Type check (mypy)
88
106
  # HARD GATE for clean modules. pyproject.toml's [[tool.mypy.overrides]]
@@ -28,7 +28,18 @@ jobs:
28
28
  # workflow covers pushes/PRs, but a tag could be cut from a commit that
29
29
  # predates a fix; this gate makes the release itself fail loudly instead.
30
30
  test:
31
- runs-on: ubuntu-latest
31
+ # Runs on ubuntu AND windows: windows-latest is the priority platform and
32
+ # a tag could otherwise ship a Windows-only regression (2026-08-28 audit).
33
+ strategy:
34
+ fail-fast: false
35
+ matrix:
36
+ os: [ubuntu-latest, windows-latest]
37
+ runs-on: ${{ matrix.os }}
38
+ env:
39
+ # Mirror ci.yml: Windows runners default to cp1252 and CJK output
40
+ # crashes with UnicodeEncodeError (audit finding #11).
41
+ PYTHONIOENCODING: utf-8
42
+ PYTHONUTF8: "1"
32
43
  steps:
33
44
  - uses: actions/checkout@v7
34
45
  - uses: astral-sh/setup-uv@v7
@@ -94,10 +105,30 @@ jobs:
94
105
  /tmp/sdist-test-venv/bin/coderio --help
95
106
 
96
107
  - name: Create GitHub Release + attach artifacts
108
+ # Restored (2026-08-28 audit #3): the artifact refactor
109
+ # accidentally dropped Release creation while the header still
110
+ # promised it. dist/ is still in this job's workspace; the publish
111
+ # job downloads the same artifacts separately.
97
112
  uses: softprops/action-gh-release@v3
98
113
  with:
99
114
  generate_release_notes: true
100
- files: dist/*.whl dist/*.tar.gz
115
+ files: |
116
+ dist/*.whl
117
+ dist/*.tar.gz
118
+
119
+ - name: Upload verified artifacts for publishing
120
+ # Pass the EXACT artifacts that were verified in the clean venvs to
121
+ # the publish job — the old flow REBUILT in publish-pypi, so PyPI
122
+ # could receive a different byte stream than the one verified above
123
+ # (2026-08-28 audit: non-deterministic build gap).
124
+ uses: actions/upload-artifact@v4
125
+ with:
126
+ name: dist
127
+ path: |
128
+ dist/*.whl
129
+ dist/*.tar.gz
130
+ if-no-files-found: error
131
+ retention-days: 3
101
132
 
102
133
  publish-pypi:
103
134
  # PyPI via Trusted Publishing (OIDC) — no API token to manage or leak.
@@ -108,14 +139,13 @@ jobs:
108
139
  permissions:
109
140
  id-token: write # OIDC token for Trusted Publishing
110
141
  steps:
111
- - uses: actions/checkout@v7
112
- - uses: actions/setup-python@v7
142
+ - name: Download verified artifacts
143
+ # No rebuild: publish EXACTLY the wheel/sdist verified in the release
144
+ # job (2026-08-28 audit fix). No checkout needed either.
145
+ uses: actions/download-artifact@v4
113
146
  with:
114
- python-version: "3.12"
115
- - name: Build (same commit as the verified artifacts)
116
- run: |
117
- pip install build
118
- python -m build
147
+ name: dist
148
+ path: dist
119
149
  - name: Publish to PyPI
120
150
  uses: pypa/gh-action-pypi-publish@release/v1
121
151
  with:
@@ -0,0 +1,64 @@
1
+ # OS
2
+ .DS_Store
3
+ Thumbs.db
4
+ desktop.ini
5
+
6
+ # IDE / Editor
7
+ .vscode/
8
+ .idea/
9
+ *.swp
10
+ *.swo
11
+
12
+ # Node
13
+ node_modules/
14
+ npm-debug.log*
15
+ yarn-debug.log*
16
+ yarn-error.log*
17
+
18
+ # Python
19
+ __pycache__/
20
+ *.py[cod]
21
+ .venv/
22
+ venv/
23
+ *.egg-info/
24
+ build/
25
+ dist/
26
+
27
+ # Testing / linting
28
+ .pytest_cache/
29
+ .mypy_cache/
30
+ .coverage
31
+ coverage.xml
32
+ htmlcov/
33
+
34
+ # coderio user data (project-local layer)
35
+ .coderio/
36
+
37
+ # Misc
38
+ *.log
39
+ .tmp/
40
+ tmp/
41
+ .zcode/
42
+
43
+ # zcode workspace instructions — local only, not part of the project
44
+ /AGENTS.md
45
+ /AGENTS_EXAMPLE.md
46
+
47
+ # Local audit/analysis artifacts — single-maintainer working notes (2026-09-02
48
+ # review: 34 untracked items at repo root). Files stay on disk; git just
49
+ # stops listing them. Delete manually when no longer wanted.
50
+ /coderio-*analysis*.md
51
+ /coderio-optimization-checklist-*.md
52
+ /coderio-latest-test-report-*.md
53
+ /coderio-detailed-analysis-*.md
54
+ /coderio-project-analysis.md
55
+ /coderio-vs-mainstream-agents-*.md
56
+ /juejin-post-*.md
57
+ /_test_subagent/
58
+ /docs/blog/
59
+ /hello.py
60
+ /test.py
61
+
62
+ # Local screenshots / assets at the repo root (not shipped docs images)
63
+ /*.png
64
+ !/docs/images/*.png
@@ -6,6 +6,259 @@ All notable changes to coderio are documented here. The format follows
6
6
  `pyproject.toml`'s `[project].version` — `coderio.__version__` reads it via
7
7
  `importlib.metadata`.
8
8
 
9
+ ## [0.5.0] — 2026-09-04
10
+
11
+ ### Security — 2026-09-04 third-party audit batch (P0; each fix re-verified by an independent adversarial round, mutation-tested, and runtime-audited)
12
+
13
+ An external third-party audit (report committed as `PROJECT_REVIEW_2026-09-04.md`)
14
+ found five confirmed issues and three seam breaks where the implementation was
15
+ weaker than the documentation's promise. All fixed and double-checked:
16
+
17
+ - **P0-1 · command blacklist leaked plain (non-obfuscated) footguns.**
18
+ `${HOME}` brace expansion, any drive letter (`Remove-Item -Recurse D:\`,
19
+ `rd /s /q D:\data`) and UNC targets, PowerShell home spellings
20
+ (`$USERPROFILE` / `$env:USERPROFILE` / `%USERPROFILE%`), the documented
21
+ symbolic chmod modes (`a+rwx`, `ugo+rwx`) plus `7777`/`1777` supersets,
22
+ PowerShell `Stop-Computer`/`Restart-Computer`, `diskutil partitionDisk` /
23
+ `apfs delete*`, the `cp`/`shred`/`wipefs` raw-device family, named-function
24
+ fork bombs (`bomb(){ bomb|bomb & }; bomb`, newline-call variant), and the
25
+ `Remove-Item` pipeline form (`ls D:\ | ri -r`) — all blocked now. One false
26
+ positive fixed in the same pass: `git rm -r D:\proj` was caught by an alias
27
+ match at any token position; the PowerShell branch now matches only at the
28
+ segment head.
29
+ - **P0-2 · web_fetch SSRF: shared-address ranges leaked.** `is_global`
30
+ depends on the CPython version (CVE-2024-4032 reclassified several ranges in
31
+ 3.11.9/3.12.3), so on older 3.11 patch releases the Aliyun internal metadata
32
+ service (`100.100.200.200`, the classic SSRF payout) was fetchable. Explicit
33
+ CIDR blocks for 100.64/10, 192.0.0.0/24, 192.88.99.0/24, 198.18.0.0/15 —
34
+ version-independent — plus the `is_global` catch-all for everything else.
35
+ - **P0-3 · VerifyGate counted `echo foo.py` as verification.** The
36
+ file-reference branch required only that the command MENTION a written file.
37
+ Now the segment must actually run it: an interpreter/runner head
38
+ (`python src/foo.py`, `uv run …`), the file itself as the command
39
+ (`./foo.py`), or a known verifier — with shell wrappers unwrapped first
40
+ (`bash -c 'echo foo.py'` is an echo), inline-code flags closing the segment
41
+ (`python -c "print('foo.py')"`, incl. `python -u -c`), and Windows
42
+ `.exe` spellings normalized. `cat`/`git diff`/`ls` mentions never verify.
43
+ - **P0-4 · credentials: non-atomic write + corrupt file silently wiped keys.**
44
+ A crash mid-write truncated the TOML, `read_credentials` treated corrupt
45
+ files as empty, and the next save persisted that emptiness — every stored
46
+ key gone. Writes are now atomic (PID-unique temp file, permission-
47
+ restricted before key bytes land, `os.replace`); a corrupt file is backed up
48
+ to `.corrupt` before being rebuilt; `UnicodeDecodeError` (non-UTF-8
49
+ corruption) is caught explicitly — it previously crashed /setup outright.
50
+ - **P0-5 · the Windows session lock was not mutually exclusive.**
51
+ `msvcrt.locking` locks at the current position and an append-mode handle
52
+ starts at open-time EOF — a holder appending under the lock grew the file,
53
+ so a later opener locked a different byte and both processes "held" the
54
+ lock (reproduced before the fix). The mutex is now byte [0,1) via
55
+ `seek(0)`; appends still land at the never-locked EOF; unlock targets the
56
+ range actually held.
57
+ - **P0-6 · default-config execute could hang forever (Windows).** The plain
58
+ path used `subprocess.run(timeout=...)`, whose Windows timeout kills only
59
+ the direct child — grandchildren kept the pipes open and `communicate()`
60
+ waited for EOF indefinitely (the exact bug `tools/bash.py` had fixed; the
61
+ production path regressed it). Now Popen + `taskkill /T /F` tree kill (Job
62
+ fallback) + bounded reap, returning exit 124 at ~timeout; the old Job-at-
63
+ kill-time approach in `win_job` never contained pre-existing grandchildren.
64
+ - **P0-7 · the documented `Z_API_KEY` path guaranteed an auth failure.**
65
+ Onboarding skip and the headless error both say "set Z_API_KEY", but
66
+ `_pick_api_key("anthropic")` read only `ANTHROPIC_API_KEY` — and every
67
+ coding-plan provider is anthropic-kind. `Z_API_KEY` now falls through
68
+ (Anthropic's own variable keeps precedence).
69
+
70
+ ### Fixed — P1 behavior defects + P2 hygiene (2026-09-04, same audit)
71
+
72
+ - **P1-8** the bash probe cache was one class-level value: the first
73
+ instance's result shadowed every other instance's `[tools].bash_shell`
74
+ config for the whole process. Now keyed by the configured shell.
75
+ - **P1-9** `activate_skill` returned only "Activated skill: X" — the playbook
76
+ body reached the system prompt one turn LATER (the docstring's
77
+ `on_activate_skill` callback never existed). The body now rides the tool
78
+ result (same-turn context), and re-activation re-supplies it (recovery
79
+ after context compaction).
80
+ - **P1-10** PLAN mode wrote files: every successful `write_todos` mirrored
81
+ arbitrary todo content to `<project>/.coderio/plan.md` — bypassing the
82
+ read-only contract and `/undo`. Suppressed under a PLAN gate (todos still
83
+ work in memory); the PlanGate nudge no longer advertises the mirror there.
84
+ - **P1-11** sandbox degradation is visible and honest: a degraded run
85
+ (Linux without bubblewrap) prefixes `[sandbox unavailable: …]` to the tool
86
+ output, and `auto_allow_if_sandboxed` now works only where the sandbox
87
+ actually provides a boundary — on macOS / Linux-without-bwrap / Linux job
88
+ mode it is disabled with a printed reason instead of yielding "zero
89
+ isolation + zero confirmation".
90
+ - **P1-12** checkpoint `/undo` could silently restore an OLDER state: budget
91
+ eviction had no floor, so a newest snapshot over budget evicted itself.
92
+ The newest entry is now eviction-proof; files over the whole budget are
93
+ skipped with a warning; the multi-instance lost-update boundary is
94
+ documented.
95
+ - **P1-13** TUI wedge: `worker.cancel()` landing between submit and thread
96
+ start finished the worker without running its `finally`, leaving
97
+ `_is_running` stuck True (every submit refused until restart). The stale
98
+ state is now detected and cleared (one resubmit); the in-flight guard is
99
+ not weakened, and `action_interrupt` no longer claims cancel() can unblock
100
+ a running thread.
101
+ - **P1-14** the repo trust gate now covers `.coderio/commands/` and
102
+ `.coderio/agents/` — prompt templates injected into the model verbatim
103
+ deserve the same first-use confirmation as skills. NOTE for existing users:
104
+ repos that ship these directories will re-prompt once (trust is
105
+ content-keyed).
106
+ - **P1-15** explicit sync-only middleware contract: all four production
107
+ middlewares inherit `SyncOnlyMiddleware`, and a contract test pins that no
108
+ async surface is defined (an overriding `aafter_model` was tested and
109
+ breaks even the sync path — langgraph wires the node differently).
110
+ - **P1-18** multimodal prompts were `str(list)`'d in three places — hook
111
+ rejection persisted base64 garbage into the session (prompt text lost),
112
+ `/export` leaked image blobs into markdown, and the TUI encoded every
113
+ image twice per message. New `session.message.text_of_content` is the
114
+ single text view; `build_user_content` accepts pre-extracted images.
115
+ - **P1-19** `win_sandbox` now checks `assign_to_job`'s return value (a
116
+ failure previously meant no resource caps and a dead timeout tree-kill,
117
+ silently); the `cmd /c` quoting/`$VAR` divergence between sandboxed and
118
+ plain runs is documented in the module docstring and README. Found during
119
+ the release gate itself: when the restricted-token launch dies during
120
+ initialization (NTSTATUS 0xC0000142 family with zero output — observed on
121
+ a windows-latest runner image roll), `run_sandboxed` now degrades to a
122
+ visibly-marked plain run instead of returning a mysterious crash code.
123
+ - **P2 hygiene**: `neutralize_base_prompt` removed (deepagents 0.7.6
124
+ deprecated `BASE_AGENT_PROMPT` with zero internal consumption — the call
125
+ was a no-op that raised a LangChainDeprecationWarning every startup);
126
+ dead `render_markdown`/`render_error`/`render_tool_call` and the ghost
127
+ `on_truncated` protocol method removed; factory's duplicate custom-provider
128
+ branch collapsed; `HookSpec` caches its compiled matcher (was a fresh
129
+ re.compile per tool call per hook); hook `communicate` failures kill and
130
+ reap the child; model-facing `timeout` args bounded (web_fetch ≤ 600s,
131
+ bash ≤ 3600s).
132
+ - **docs**: the architecture doc no longer describes the removed hand-written
133
+ loop (`run_step`/`_execute_turn` pseudocode), the deleted `[context]`
134
+ config section, or the `_invoke_tool` error-grading table; the data-flow
135
+ chapter follows the real deepagents middleware path; README/README_en
136
+ dropped the "auto-compaction (60% window trigger)" claim (no such knob);
137
+ the third-party report itself is committed as
138
+ `PROJECT_REVIEW_2026-09-04.md`.
139
+ - **CI**: new `MCP extra smoke` leg (ubuntu/py3.12) installs the mcp extra
140
+ from the frozen lock and runs the loader tests against real adapters —
141
+ `load_mcp_tools_sync` had never been executed by any test or CI job.
142
+ Surfaced (and fixed) a pre-existing mypy error that only appears with the
143
+ py.typed adapters installed.
144
+
145
+ ### Added — 2026-09-03 review batch
146
+ - **Confirm diff preview**: CONFIRM-mode prompts for write_file / edit_file /
147
+ multi_edit render a unified diff of the change (matching the real tool
148
+ semantics: replace_all, multi-match failure, multi_edit all-or-nothing).
149
+ - **hooks environment whitelist**: hook subprocesses get CODERIO_* +
150
+ exec-resolution + temp/locale vars instead of the full os.environ.
151
+ - **credentials hardening**: ACL-restricted before key bytes hit the disk;
152
+ icacls failures logged; corrupt credentials file no longer crashes /setup.
153
+ - **AGENTS.md walk boundary**: falls back to the enclosing GIT root for
154
+ repos without coderio config (subdirectory launches keep nearest-wins).
155
+ - **concurrent-submission guard** + interruptible permission wait + escaped
156
+ model-name retry in onboarding (`m` = change model) + `--version` flag.
157
+ - ROADMAP.md / ROADMAP_en.md added (maintenance status, Now/Next/Later,
158
+ non-goals).
159
+
160
+ ### Fixed — audit-driven hardening (2026-08-28 + 2026-09-02 review batches)
161
+ - **Command blacklist**: rebuilt segment/token parsing (multi-line, wrapper
162
+ shells incl. path-qualified and sudo-prefixed, PowerShell/cmd variants);
163
+ xargs-into-recursive-rm with flags in any position; `find -delete`/
164
+ `-exec rm` dangerous-root set widened to any absolute path, ~, $HOME, globs
165
+ (the `rm -rf /etc` blocked / `find /etc -delete` leaked double standard).
166
+ - **Instruction injection**: the AGENTS.md walk is bounded at the launch dir
167
+ even when no workspace_root is configured (a parent directory's AGENTS.md
168
+ could previously leak into every project launched from below it).
169
+ - **Hooks**: subprocess environment is now a whitelist (CODERIO_* + exec
170
+ resolution + temp/locale) instead of a full os.environ copy — repo hooks
171
+ can no longer read environment secrets; hooks stdout contract documented
172
+ (raw stdout injects for SessionStart/UserPromptSubmit, no JSON parsing).
173
+ - **Credentials**: the file is created and ACL-restricted BEFORE any key
174
+ bytes hit the disk (write-then-restrict window closed); icacls failures
175
+ are logged; a missing Windows username skips inheritance-stripping
176
+ instead of producing a file nobody can read.
177
+ - **TUI/engine**: a turn in flight no longer accepts a second submission
178
+ (concurrent engine threads interleaved session writes); Esc now breaks a
179
+ pending permission-prompt wait (previously blocked up to 120s); interrupt
180
+ drops the thread checkpoint (dangling tool_calls state) — now regression
181
+ tested.
182
+ - **run**: timeout path logs why the daemon thread survives and how
183
+ `[tools].sandbox_mode = "job"` reaps the process tree; headless stdout
184
+ writes survive interpreter teardown.
185
+
186
+ ### Changed — structure (P2 decomposition, behavior-preserving)
187
+ - `run_deep_agent` decomposed: `TurnSpec` dataclass (15 kwargs → 1 spec),
188
+ `build_middleware/build_backend/build_subagents` builders, module-level
189
+ `make_shell_backend` factory; body ≤80 lines, behavior pinned by the
190
+ existing suite + adversarial equivalence review.
191
+ - `CoderioTUI` (1380 → 983 lines): StreamHandler protocol, agent-thread
192
+ state, render queue and confirmation wait extracted to
193
+ `cli/stream_controller.py`; every bare `except: pass` in tui.py now logs.
194
+ - `build_turn_spec` in cli/repl.py is the single CommandPolicy/TurnSpec
195
+ construction path for headless and TUI runs (was two field-identical
196
+ copies).
197
+ - Tool-name registry (`tools/taxonomy.py`) is now the literal single source:
198
+ web_search registered, permission/harness literals re-pointed, the two
199
+ bash→execute prose regexes merged, the shim removed.
200
+ - tests/e2e filled (5 black-box CLI tests); app.py coverage 36%→95%,
201
+ tui_runtime.py 35%→96%.
202
+
203
+ ### Added
204
+ - AGENTS.md / CLAUDE.md project instructions injected into the system
205
+ prompt (nearest-wins, bounded at the project root / git root).
206
+ - Tool-name registry `tools/taxonomy.py` — one definition of engine/harness
207
+ names and categories (was 6+ drifting ad-hoc copies, the root cause of
208
+ several recorded P0s).
209
+ - `--version` flag.
210
+ - docs/CONFIG.md — full config.toml field reference, hooks syntax,
211
+ .mcp.json fields, custom agents/commands, trust mechanism.
212
+
213
+ ### Deprecated / Removed
214
+ - Removed half-demolished relics: [context] config section, RichStream,
215
+ phase-timeline dead branches, to_langchain_tools passthrough (P2-8 batch).
216
+ - README: removed the Claude Code / aider comparison table; honest
217
+ macOS-sandbox disclosure added to Known limitations.
218
+
219
+ ## [0.4.4] — 2026-08-24
220
+
221
+ ### Added — extensibility & safety-of-agency features (each adversarially reviewed, mutation-verified)
222
+ - **Custom slash commands**: `.coderio/commands/*.md` (project layer overrides user layer)
223
+ turn prompt templates into `/commands` with `$ARGUMENTS` substitution and optional
224
+ frontmatter descriptions. Built-ins can never be shadowed — exact matches refused at
225
+ expansion, case variants dropped at discovery (Windows case-insensitive-FS spoof
226
+ surface). Bodies route straight to the engine, never re-enter built-in dispatch: a
227
+ repo file with body `/mode full` cannot flip the permission gate.
228
+ - **Custom subagents**: `.coderio/agents/*.md` define personas invokable via
229
+ `task(subagent_type=...)`. Persona-only customization — every assembled spec rides
230
+ the same PLAN-gated read-only middleware stack as the built-in research agent;
231
+ reserved names dropped at discovery AND re-filtered at wiring time. Adversarially
232
+ verified end-to-end: write tools physically unbound, nested task() blocked on three
233
+ independent layers.
234
+ - **File checkpoints + `/undo`**: every structured write (write_file/edit_file/
235
+ multi_edit) snapshots the target's pre-write state; `/undo` reverts step by step.
236
+ multi_edit is one undo step; error paths consume no depth; failed restores re-push
237
+ for retry; bounded at 50 entries / 64MB; deliberately survives /clear. Shell-side
238
+ writes (redirects) bypass it — OS sandboxing is the layer for that class.
239
+ - **Plan artifact**: the todo list mirrors to `<project>/.coderio/plan.md` after every
240
+ successful write_todos; user edits between messages are adopted at next turn start
241
+ (human override wins) with an injected note so the model doesn't execute a stale plan.
242
+
243
+ ### Fixed
244
+ - Three prompt surfaces (PlanGate nudge, CompletionGate force-continue, CODE-workflow)
245
+ directed the model to coderio's legacy `todo()` tool whose store is an orphan the
246
+ gates never check — completion instructions could loop forever. All now point at
247
+ `write_todos`, the canonical surface.
248
+ - Custom-command discovery anchor joined at the caller after a runtime audit caught
249
+ production loading zero commands while globbing root-level *.md files as agents.
250
+ - Subagent discovery anchors walk up to the project root like skills/config/trust
251
+ (launching from a repo subdirectory previously missed project-layer definitions).
252
+ - Frontmatter descriptions are truncated to 1024 chars and control-char-stripped —
253
+ a 90KB description previously reached the main model verbatim every turn.
254
+
255
+ ### Changed
256
+ - CI coverage floor raised 70% → 75% against a measured 82% baseline (gate verified
257
+ to trip); stale coverage comments corrected.
258
+ - tui.py decomposed (1627 → 1332 lines): input dispatch + session lifecycle extracted
259
+ to testable TuiRuntime; behavior verified statement-equivalent by AST diff + real
260
+ Textual input-routing tests.
261
+
9
262
  ## [0.4.3] — 2026-08-21
10
263
 
11
264
  ### Security — P1/P2 hardening (audit-verified, adversarial + mutation tested)
@@ -563,7 +816,13 @@ All notable changes to coderio are documented here. The format follows
563
816
  - Rich stream UI + Textual TUI with foldable thinking.
564
817
  - jsonl session persistence with compression truncation.
565
818
 
566
- [Unreleased]: https://github.com/Lion-1209/coderio/compare/v0.3.0...HEAD
819
+ [Unreleased]: https://github.com/Lion-1209/coderio/compare/v0.5.0...HEAD
820
+ [0.5.0]: https://github.com/Lion-1209/coderio/compare/v0.4.4...v0.5.0
821
+ [0.4.4]: https://github.com/Lion-1209/coderio/releases/tag/v0.4.4
822
+ [0.4.3]: https://github.com/Lion-1209/coderio/releases/tag/v0.4.3
823
+ [0.4.2]: https://github.com/Lion-1209/coderio/releases/tag/v0.4.2
824
+ [0.4.1]: https://github.com/Lion-1209/coderio/releases/tag/v0.4.1
825
+ [0.4.0]: https://github.com/Lion-1209/coderio/releases/tag/v0.4.0
567
826
  [0.3.0]: https://github.com/Lion-1209/coderio/releases/tag/v0.3.0
568
827
  [0.2.0]: https://github.com/Lion-1209/coderio/releases/tag/v0.2.0
569
828
  [0.1.0]: https://github.com/Lion-1209/coderio/releases/tag/v0.1.0
@@ -6,16 +6,22 @@ Thanks for your interest in contributing! This guide covers the basics.
6
6
 
7
7
  ## Development setup
8
8
 
9
+ The project uses [uv](https://docs.astral.sh/uv/) for dependency management
10
+ (locked via `uv.lock`, same as CI). Python 3.11+ required.
11
+
9
12
  ```bash
10
13
  git clone <repo-url> coderio
11
14
  cd coderio
12
- python -m venv .venv
15
+ uv sync --frozen # creates .venv from the lockfile
16
+ uv run pytest -q # run anything inside the managed venv
17
+ ```
13
18
 
14
- # Windows (Git Bash)
15
- .venv/Scripts/python.exe -m pip install -e ".[dev]"
19
+ With the venv activated (`.venv/Scripts/activate` on Windows,
20
+ `.venv/bin/activate` elsewhere) the plain commands work too:
16
21
 
17
- # Linux / macOS
18
- .venv/bin/python -m pip install -e ".[dev]"
22
+ ```bash
23
+ python -m pytest -q
24
+ python -m ruff check src tests
19
25
  ```
20
26
 
21
27
  Set your API key: