coderio 0.4.4__tar.gz → 0.6.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 (270) hide show
  1. coderio-0.6.0/.github/PULL_REQUEST_TEMPLATE.md +8 -0
  2. {coderio-0.4.4 → coderio-0.6.0}/.github/workflows/ci.yml +27 -6
  3. coderio-0.6.0/.github/workflows/release.yml +189 -0
  4. coderio-0.6.0/.gitignore +64 -0
  5. {coderio-0.4.4 → coderio-0.6.0}/CHANGELOG.md +392 -1
  6. {coderio-0.4.4 → coderio-0.6.0}/CONTRIBUTING.md +40 -5
  7. {coderio-0.4.4 → coderio-0.6.0}/PKG-INFO +67 -21
  8. {coderio-0.4.4 → coderio-0.6.0}/README.md +55 -11
  9. coderio-0.6.0/README_en.md +149 -0
  10. coderio-0.6.0/ROADMAP.md +62 -0
  11. coderio-0.6.0/ROADMAP_en.md +83 -0
  12. coderio-0.6.0/demo.gif +0 -0
  13. coderio-0.6.0/docs/CONFIG.md +224 -0
  14. {coderio-0.4.4 → coderio-0.6.0}/docs/coderio-architecture.md +70 -87
  15. coderio-0.6.0/docs/images/confirm-menu.svg +190 -0
  16. coderio-0.6.0/docs/images/harness-warn.svg +190 -0
  17. coderio-0.6.0/docs/images/todo-panel.svg +192 -0
  18. coderio-0.6.0/docs/live-eval/results-2026-09-21-water18-0910.json +236 -0
  19. coderio-0.6.0/docs/live-eval/results-2026-09-21-water18-0910.md +69 -0
  20. coderio-0.6.0/docs/live-eval/results-2026-09-23-step-3.7-flash.json +231 -0
  21. coderio-0.6.0/docs/live-eval/results-2026-09-23-step-3.7-flash.md +31 -0
  22. coderio-0.6.0/docs/live-eval/results-2026-09-24-step-3.7-flash.json +19 -0
  23. coderio-0.6.0/docs/live-eval/results-2026-09-24-step-3.7-flash.md +30 -0
  24. {coderio-0.4.4 → coderio-0.6.0}/pyproject.toml +32 -7
  25. coderio-0.6.0/scripts/architecture/check.py +307 -0
  26. coderio-0.6.0/scripts/live_eval/__init__.py +29 -0
  27. coderio-0.6.0/scripts/live_eval/run.py +305 -0
  28. coderio-0.6.0/scripts/live_eval/tasks.py +418 -0
  29. {coderio-0.4.4 → coderio-0.6.0}/scripts/verify_deepagent_live.py +3 -3
  30. {coderio-0.4.4 → coderio-0.6.0}/scripts/verify_harness_live.py +4 -5
  31. coderio-0.6.0/src/coderio/agent/_content.py +61 -0
  32. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/_deepagents_compat.py +49 -18
  33. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/command_review.py +9 -4
  34. coderio-0.6.0/src/coderio/agent/deep_loop.py +1446 -0
  35. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/harness.py +258 -28
  36. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/harness_middleware.py +198 -78
  37. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/hooks.py +69 -17
  38. coderio-0.6.0/src/coderio/agent/microcompact.py +119 -0
  39. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/permission_middleware.py +3 -2
  40. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/plan_artifact.py +70 -2
  41. coderio-0.6.0/src/coderio/agent/project_instructions.py +164 -0
  42. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/prompts.py +4 -10
  43. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/skill_tool.py +20 -9
  44. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/stream.py +4 -4
  45. coderio-0.6.0/src/coderio/agent/sync_only.py +28 -0
  46. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/app.py +11 -1
  47. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/commands.py +25 -6
  48. coderio-0.6.0/src/coderio/cli/credentials.py +152 -0
  49. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/multimodal.py +46 -11
  50. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/onboarding.py +46 -40
  51. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/providers.py +10 -4
  52. coderio-0.6.0/src/coderio/cli/render.py +17 -0
  53. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/repl.py +135 -10
  54. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/run_cmd.py +50 -25
  55. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/stream.py +0 -12
  56. coderio-0.6.0/src/coderio/cli/stream_controller.py +560 -0
  57. coderio-0.6.0/src/coderio/cli/tui.py +1052 -0
  58. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/tui_onboarding.py +82 -43
  59. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/tui_runtime.py +30 -23
  60. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/tui_widgets.py +53 -8
  61. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/__init__.py +0 -2
  62. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/loader.py +24 -12
  63. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/models.py +16 -32
  64. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/trust.py +112 -74
  65. coderio-0.6.0/src/coderio/llm/factory.py +343 -0
  66. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/mcp_loader.py +25 -1
  67. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/session/message.py +20 -3
  68. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/session/store.py +88 -58
  69. coderio-0.6.0/src/coderio/tools/__init__.py +55 -0
  70. coderio-0.6.0/src/coderio/tools/base.py +40 -0
  71. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/bash.py +3 -1
  72. coderio-0.6.0/src/coderio/tools/checkpoint.py +178 -0
  73. coderio-0.6.0/src/coderio/tools/command_policy.py +868 -0
  74. coderio-0.6.0/src/coderio/tools/confirm_diff.py +162 -0
  75. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/grep_tool.py +30 -3
  76. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/multi_edit.py +30 -4
  77. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/permission.py +51 -11
  78. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/read_file.py +18 -2
  79. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/sandbox_runner.py +30 -6
  80. coderio-0.6.0/src/coderio/tools/taxonomy.py +122 -0
  81. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/web_fetch.py +77 -38
  82. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/win_job.py +32 -12
  83. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/win_sandbox.py +284 -130
  84. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_deep_integration.py +155 -41
  85. coderio-0.6.0/tests/agent/test_deep_loop_unit.py +810 -0
  86. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_deepagents_compat.py +35 -42
  87. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_harness.py +262 -1
  88. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_harness_middleware.py +223 -1
  89. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_hooks.py +86 -10
  90. coderio-0.6.0/tests/agent/test_live_script_contract.py +94 -0
  91. coderio-0.6.0/tests/agent/test_microcompact.py +113 -0
  92. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_perf_baseline.py +9 -6
  93. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_plan_artifact.py +6 -2
  94. coderio-0.6.0/tests/agent/test_production_seam.py +479 -0
  95. coderio-0.6.0/tests/agent/test_project_instructions.py +201 -0
  96. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_skill_tool.py +19 -0
  97. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_stream.py +0 -9
  98. coderio-0.6.0/tests/agent/test_sync_only_middleware.py +64 -0
  99. coderio-0.6.0/tests/agent/test_usage_normalization.py +178 -0
  100. coderio-0.6.0/tests/cli/test_app_commands.py +246 -0
  101. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_commands.py +45 -2
  102. coderio-0.6.0/tests/cli/test_credentials.py +181 -0
  103. coderio-0.6.0/tests/cli/test_credentials_backup_permissions.py +29 -0
  104. coderio-0.6.0/tests/cli/test_gate_builder.py +101 -0
  105. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_live_thinking.py +3 -2
  106. coderio-0.6.0/tests/cli/test_multimodal.py +151 -0
  107. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_onboarding.py +50 -0
  108. coderio-0.6.0/tests/cli/test_onboarding_wizard.py +96 -0
  109. coderio-0.6.0/tests/cli/test_providers.py +238 -0
  110. coderio-0.6.0/tests/cli/test_render.py +7 -0
  111. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_repl_loop.py +13 -5
  112. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_run_cmd.py +29 -12
  113. coderio-0.6.0/tests/cli/test_stream_controller.py +75 -0
  114. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_truncation.py +1 -1
  115. coderio-0.6.0/tests/cli/test_tui_gate_fail_closed.py +43 -0
  116. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_onboarding.py +61 -3
  117. coderio-0.6.0/tests/cli/test_tui_runtime_screens.py +330 -0
  118. coderio-0.6.0/tests/cli/test_tui_startup.py +422 -0
  119. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_widgets.py +118 -1
  120. coderio-0.6.0/tests/cli/test_ux_features.py +264 -0
  121. {coderio-0.4.4 → coderio-0.6.0}/tests/config/test_loader.py +0 -33
  122. {coderio-0.4.4 → coderio-0.6.0}/tests/config/test_trust.py +41 -1
  123. coderio-0.6.0/tests/e2e/test_cli_e2e.py +150 -0
  124. {coderio-0.4.4 → coderio-0.6.0}/tests/llm/test_factory.py +32 -0
  125. coderio-0.6.0/tests/llm/test_resolved_model_name.py +45 -0
  126. {coderio-0.4.4 → coderio-0.6.0}/tests/session/test_message.py +23 -0
  127. coderio-0.6.0/tests/session/test_store.py +334 -0
  128. coderio-0.6.0/tests/test_architecture_policy.py +82 -0
  129. coderio-0.6.0/tests/test_live_eval.py +374 -0
  130. {coderio-0.4.4 → coderio-0.6.0}/tests/test_mcp_loader.py +23 -0
  131. {coderio-0.4.4 → coderio-0.6.0}/tests/test_p0_stability.py +11 -3
  132. {coderio-0.4.4 → coderio-0.6.0}/tests/test_seams.py +11 -9
  133. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_checkpoint.py +139 -0
  134. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_command_policy.py +383 -0
  135. coderio-0.6.0/tests/tools/test_command_policy_golden.py +126 -0
  136. coderio-0.6.0/tests/tools/test_confirm_diff.py +212 -0
  137. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_file_tools.py +28 -0
  138. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_grep_tool.py +42 -0
  139. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_multi_edit.py +50 -0
  140. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_permission.py +104 -6
  141. coderio-0.6.0/tests/tools/test_posix_process_tree.py +51 -0
  142. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_sandbox.py +120 -4
  143. coderio-0.6.0/tests/tools/test_web.py +267 -0
  144. coderio-0.6.0/tests/tools/test_web_fetch.py +134 -0
  145. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_win_job.py +56 -0
  146. {coderio-0.4.4 → coderio-0.6.0}/uv.lock +10 -10
  147. coderio-0.4.4/.github/workflows/release.yml +0 -122
  148. coderio-0.4.4/.gitignore +0 -41
  149. coderio-0.4.4/README_en.md +0 -107
  150. coderio-0.4.4/src/coderio/agent/deep_loop.py +0 -960
  151. coderio-0.4.4/src/coderio/cli/credentials.py +0 -70
  152. coderio-0.4.4/src/coderio/cli/render.py +0 -28
  153. coderio-0.4.4/src/coderio/cli/tui.py +0 -1332
  154. coderio-0.4.4/src/coderio/llm/factory.py +0 -164
  155. coderio-0.4.4/src/coderio/tools/__init__.py +0 -94
  156. coderio-0.4.4/src/coderio/tools/base.py +0 -55
  157. coderio-0.4.4/src/coderio/tools/checkpoint.py +0 -105
  158. coderio-0.4.4/src/coderio/tools/command_policy.py +0 -434
  159. coderio-0.4.4/tests/agent/test_deep_loop_unit.py +0 -454
  160. coderio-0.4.4/tests/cli/test_credentials.py +0 -39
  161. coderio-0.4.4/tests/cli/test_multimodal.py +0 -79
  162. coderio-0.4.4/tests/cli/test_providers.py +0 -65
  163. coderio-0.4.4/tests/cli/test_render.py +0 -30
  164. coderio-0.4.4/tests/cli/test_tui_startup.py +0 -222
  165. coderio-0.4.4/tests/cli/test_ux_features.py +0 -125
  166. coderio-0.4.4/tests/session/test_store.py +0 -216
  167. coderio-0.4.4/tests/tools/test_web.py +0 -72
  168. coderio-0.4.4/tests/tools/test_web_fetch.py +0 -65
  169. {coderio-0.4.4 → coderio-0.6.0}/.github/dependabot.yml +0 -0
  170. {coderio-0.4.4 → coderio-0.6.0}/LICENSE +0 -0
  171. {coderio-0.4.4 → coderio-0.6.0}/THIRD_PARTY_LICENSES.md +0 -0
  172. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/__init__.py +0 -0
  173. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/__init__.py +0 -0
  174. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/custom_agents.py +0 -0
  175. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/state.py +0 -0
  176. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/__init__.py +0 -0
  177. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/custom_commands.py +0 -0
  178. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/mcp_cmd.py +0 -0
  179. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/skills_cmd.py +0 -0
  180. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/tui_screens.py +0 -0
  181. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/bootstrap.py +0 -0
  182. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/llm/__init__.py +0 -0
  183. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/llm/probe.py +0 -0
  184. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/session/__init__.py +0 -0
  185. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/__init__.py +0 -0
  186. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/bundled/executing-plans/SKILL.md +0 -0
  187. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/LICENSE +0 -0
  188. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/README.md +0 -0
  189. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/clarifying-questions/SKILL.md +0 -0
  190. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/clarifying-questions/evals/evals.json +0 -0
  191. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/code-review/SKILL.md +0 -0
  192. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/code-review/evals/evals.json +0 -0
  193. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/commit-message/SKILL.md +0 -0
  194. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/commit-message/evals/evals.json +0 -0
  195. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/debugging/SKILL.md +0 -0
  196. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/debugging/evals/evals.json +0 -0
  197. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/error-handling/SKILL.md +0 -0
  198. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/error-handling/evals/evals.json +0 -0
  199. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/lion-writing-skills/SKILL.md +0 -0
  200. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/lion-writing-skills/evals/evals.json +0 -0
  201. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/naming/SKILL.md +0 -0
  202. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/naming/evals/evals.json +0 -0
  203. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/SKILL.md +0 -0
  204. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/evals/evals.json +0 -0
  205. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/spec-writing/SKILL.md +0 -0
  206. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/spec-writing/evals/evals.json +0 -0
  207. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/task-breakdown/SKILL.md +0 -0
  208. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/task-breakdown/evals/evals.json +0 -0
  209. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/testing/SKILL.md +0 -0
  210. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/testing/evals/evals.json +0 -0
  211. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/verify-and-fix/SKILL.md +0 -0
  212. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/verify-and-fix/evals/evals.json +0 -0
  213. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/models.py +0 -0
  214. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/parser.py +0 -0
  215. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/store.py +0 -0
  216. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/edit_file.py +0 -0
  217. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/glob_tool.py +0 -0
  218. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/linux_sandbox.py +0 -0
  219. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/list_dir.py +0 -0
  220. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/note.py +0 -0
  221. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/todo.py +0 -0
  222. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/web_search.py +0 -0
  223. {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/write_file.py +0 -0
  224. {coderio-0.4.4 → coderio-0.6.0}/tests/__init__.py +0 -0
  225. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/__init__.py +0 -0
  226. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/conftest.py +0 -0
  227. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_command_review.py +0 -0
  228. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_custom_agents.py +0 -0
  229. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_deep_loop.py +0 -0
  230. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_prompts.py +0 -0
  231. {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_state.py +0 -0
  232. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/__init__.py +0 -0
  233. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_app.py +0 -0
  234. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_command_menu.py +0 -0
  235. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_custom_commands.py +0 -0
  236. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_input_isolation.py +0 -0
  237. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_mcp_cmd.py +0 -0
  238. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_onboarding_logic.py +0 -0
  239. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_repl_reset.py +0 -0
  240. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_skills_cmd.py +0 -0
  241. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_status_bar.py +0 -0
  242. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_stream.py +0 -0
  243. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_picker.py +0 -0
  244. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_runtime.py +0 -0
  245. {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_screens.py +0 -0
  246. {coderio-0.4.4 → coderio-0.6.0}/tests/config/__init__.py +0 -0
  247. {coderio-0.4.4 → coderio-0.6.0}/tests/config/test_bootstrap.py +0 -0
  248. {coderio-0.4.4 → coderio-0.6.0}/tests/config/test_models.py +0 -0
  249. {coderio-0.4.4 → coderio-0.6.0}/tests/conftest.py +0 -0
  250. {coderio-0.4.4 → coderio-0.6.0}/tests/e2e/__init__.py +0 -0
  251. {coderio-0.4.4 → coderio-0.6.0}/tests/llm/__init__.py +0 -0
  252. {coderio-0.4.4 → coderio-0.6.0}/tests/llm/test_probe.py +0 -0
  253. {coderio-0.4.4 → coderio-0.6.0}/tests/session/__init__.py +0 -0
  254. {coderio-0.4.4 → coderio-0.6.0}/tests/skills/__init__.py +0 -0
  255. {coderio-0.4.4 → coderio-0.6.0}/tests/skills/test_bundled.py +0 -0
  256. {coderio-0.4.4 → coderio-0.6.0}/tests/skills/test_parser.py +0 -0
  257. {coderio-0.4.4 → coderio-0.6.0}/tests/skills/test_skill_tools.py +0 -0
  258. {coderio-0.4.4 → coderio-0.6.0}/tests/skills/test_store.py +0 -0
  259. {coderio-0.4.4 → coderio-0.6.0}/tests/test_repl.py +0 -0
  260. {coderio-0.4.4 → coderio-0.6.0}/tests/test_version.py +0 -0
  261. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/__init__.py +0 -0
  262. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_bash.py +0 -0
  263. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_concrete_gates.py +0 -0
  264. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_edit_prefix.py +0 -0
  265. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_glob_tool.py +0 -0
  266. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_list_dir.py +0 -0
  267. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_note.py +0 -0
  268. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_registry.py +0 -0
  269. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_search_tools.py +0 -0
  270. {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_todo.py +0 -0
@@ -0,0 +1,8 @@
1
+ ## What changed and why
2
+
3
+ <!-- One focused change per PR. -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] Tests pass (`pytest -q`)
8
+ - [ ] I agree to the [Contribution terms](../CONTRIBUTING.md#contribution-terms)
@@ -1,5 +1,10 @@
1
1
  name: CI
2
2
 
3
+ # Action SHAs are pinned to full commits (external review 2026-09-05, P1-3):
4
+ # mutable tags held write/OIDC permissions, so an upstream re-point would
5
+ # widen the supply-chain attack surface. Bump via a PR that updates the SHA
6
+ # (and its version comment) together.
7
+
3
8
  on:
4
9
  push:
5
10
  branches: [main]
@@ -10,8 +15,8 @@ jobs:
10
15
  lint:
11
16
  runs-on: ubuntu-latest
12
17
  steps:
13
- - uses: actions/checkout@v7
14
- - uses: actions/setup-python@v7
18
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
19
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
15
20
  with:
16
21
  python-version: "3.12"
17
22
  - name: Install ruff
@@ -40,7 +45,7 @@ jobs:
40
45
  PYTHONUTF8: "1"
41
46
 
42
47
  steps:
43
- - uses: actions/checkout@v7
48
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
44
49
 
45
50
  # uv replaces pip for dependency installation (2026-08-14 migration).
46
51
  # uv.lock is a first-class lockfile for both uv and Dependabot: CI gets
@@ -48,7 +53,7 @@ jobs:
48
53
  # constraints AND regenerates uv.lock in its PRs — the two mechanisms
49
54
  # cooperate instead of fighting (the bare requirements-dev.txt approach
50
55
  # had Dependabot produce internally-inconsistent updates; see PR #6).
51
- - uses: astral-sh/setup-uv@v7
56
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
52
57
  with:
53
58
  python-version: ${{ matrix.python-version }}
54
59
  enable-cache: true
@@ -67,9 +72,11 @@ jobs:
67
72
 
68
73
  - name: Audit dependencies for known vulnerabilities
69
74
  # Scans installed packages against the PyPI advisory database.
70
- # Non-blocking (continue-on-error) — reports issues without failing CI.
75
+ # BLOCKING since 2026-08-28 (audit finding: continue-on-error made the
76
+ # scan decorative — known CVEs could never turn CI red). If a flagged
77
+ # vuln is a false positive / unfixable, add an explicit --ignore-vuln
78
+ # with a comment rather than re-adding continue-on-error.
71
79
  shell: bash
72
- continue-on-error: true
73
80
  run: |
74
81
  uv pip install pip-audit
75
82
  uv run pip-audit
@@ -86,6 +93,20 @@ jobs:
86
93
  run: |
87
94
  uv run python -m pytest -q --cov=coderio --cov-report=term-missing --cov-fail-under=75
88
95
 
96
+ - name: MCP extra smoke (install + loader import)
97
+ # The mcp extra was never installed in CI (audit 2026-09-04 P1-17):
98
+ # `load_mcp_tools_sync` — the code path behind README's "MCP support"
99
+ # — was never executed anywhere, in tests or CI. Install the extra
100
+ # from the frozen lock and at least run the loader test module
101
+ # against the real adapters package. One matrix leg is enough (the
102
+ # loader is pure Python; this step exists so the import path can't
103
+ # rot silently).
104
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
105
+ run: |
106
+ uv sync --frozen --extra dev --extra mcp
107
+ uv run python -c "from coderio.mcp_loader import load_mcp_tools_sync; print('mcp loader import OK')"
108
+ uv run python -m pytest tests/test_mcp_loader.py -q
109
+
89
110
  - name: Type check (mypy)
90
111
  # HARD GATE for clean modules. pyproject.toml's [[tool.mypy.overrides]]
91
112
  # lists modules with known type issues (ignore_errors=true) — each is a
@@ -0,0 +1,189 @@
1
+ name: Release
2
+
3
+ # Triggered by pushing a tag like v0.4.0. Builds wheel + sdist, runs the test
4
+ # suite, verifies both artifacts in a clean venv, publishes to PyPI (Trusted
5
+ # Publishing, no token) and attaches both to a GitHub Release.
6
+ #
7
+ # To cut a release:
8
+ # git tag v0.4.0
9
+ # git push origin v0.4.0
10
+ #
11
+ # PyPI publishing uses Trusted Publishing (OIDC). One-time setup (repo owner):
12
+ # pypi.org → Account settings → Publishing → Add a new pending publisher:
13
+ # PyPI project name: coderio
14
+ # Owner: Lion-1209 / Repository: coderio
15
+ # Workflow name: release.yml / Environment: pypi
16
+ # Then create the "pypi" environment in the repo (Settings → Environments).
17
+
18
+ # Action SHAs are pinned to full commits (external review 2026-09-05, P1-3):
19
+ # mutable tags held write/OIDC permissions, so an upstream re-point would
20
+ # widen the supply-chain attack surface. Bump via a PR that updates the SHA
21
+ # (and its version comment) together.
22
+
23
+ on:
24
+ push:
25
+ tags:
26
+ - "v*"
27
+
28
+ permissions:
29
+ contents: write # needed to create the release + upload assets
30
+
31
+ jobs:
32
+ # Test gate: a tag is a release — it must not ship broken code. The CI
33
+ # workflow covers pushes/PRs, but a tag could be cut from a commit that
34
+ # predates a fix; this gate makes the release itself fail loudly instead.
35
+ test:
36
+ # Runs on ubuntu AND windows: windows-latest is the priority platform and
37
+ # a tag could otherwise ship a Windows-only regression (2026-08-28 audit).
38
+ strategy:
39
+ fail-fast: false
40
+ matrix:
41
+ os: [ubuntu-latest, windows-latest]
42
+ runs-on: ${{ matrix.os }}
43
+ env:
44
+ # Mirror ci.yml: Windows runners default to cp1252 and CJK output
45
+ # crashes with UnicodeEncodeError (audit finding #11).
46
+ PYTHONIOENCODING: utf-8
47
+ PYTHONUTF8: "1"
48
+ steps:
49
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
50
+ - uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
51
+ with:
52
+ python-version: "3.12"
53
+ enable-cache: true
54
+ - name: Run test suite
55
+ run: |
56
+ uv sync --frozen --extra dev
57
+ uv run python -m pytest -q
58
+
59
+ release:
60
+ needs: test
61
+ runs-on: ubuntu-latest
62
+ steps:
63
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
64
+
65
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
66
+ with:
67
+ python-version: "3.12"
68
+
69
+ - name: Verify tag matches package version
70
+ # External review (2026-09-05, P2-2): nothing stopped a mistyped tag
71
+ # (v0.5.1) from publishing artifacts still named 0.5.0. Gate 1 of 2:
72
+ # tag ↔ pyproject.toml.
73
+ run: |
74
+ TAG_VERSION="${GITHUB_REF_NAME#v}"
75
+ PYPROJECT_VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
76
+ echo "tag=${TAG_VERSION} pyproject=${PYPROJECT_VERSION}"
77
+ if [ "$TAG_VERSION" != "$PYPROJECT_VERSION" ]; then
78
+ echo "::error::tag v${TAG_VERSION} does not match pyproject.toml version ${PYPROJECT_VERSION}"
79
+ exit 1
80
+ fi
81
+
82
+ - name: Build wheel + sdist
83
+ run: |
84
+ pip install build
85
+ python -m build
86
+
87
+ - name: Verify wheel METADATA matches tag
88
+ # Gate 2 of 2: the built artifact itself carries the right version
89
+ # (tag ↔ pyproject ↔ wheel METADATA, external review 2026-09-05).
90
+ run: |
91
+ TAG_VERSION="${GITHUB_REF_NAME#v}"
92
+ WHEEL_VERSION=$(python -c "
93
+ import glob, re, zipfile
94
+ whl = glob.glob('dist/*.whl')[0]
95
+ with zipfile.ZipFile(whl) as z:
96
+ meta = next(n for n in z.namelist() if n.endswith('METADATA'))
97
+ text = z.read(meta).decode('utf-8')
98
+ print(re.search(r'^Version: (.+)$', text, re.MULTILINE).group(1))
99
+ ")
100
+ echo "wheel METADATA=${WHEEL_VERSION}"
101
+ if [ "$TAG_VERSION" != "$WHEEL_VERSION" ]; then
102
+ echo "::error::wheel METADATA version ${WHEEL_VERSION} does not match tag v${TAG_VERSION}"
103
+ exit 1
104
+ fi
105
+
106
+ - name: Verify wheel in clean venv (full deps)
107
+ # Install the wheel WITH all dependencies (not --no-deps) to verify
108
+ # the full user install path. Then run --help + import the deepagents
109
+ # engine + verify bundled skills. This catches missing deps that the
110
+ # old --no-deps + manual 5-package approach missed.
111
+ run: |
112
+ python -m venv /tmp/wheel-test-venv
113
+ /tmp/wheel-test-venv/bin/pip install dist/*.whl
114
+ /tmp/wheel-test-venv/bin/coderio --help
115
+ /tmp/wheel-test-venv/bin/coderio run --help
116
+ # Verify the deepagents engine imports (the production path).
117
+ /tmp/wheel-test-venv/bin/python -c "
118
+ from coderio.agent.deep_loop import run_deep_agent
119
+ from coderio.agent.harness_middleware import HarnessMiddleware
120
+ from coderio.agent.permission_middleware import PermissionMiddleware
121
+ from coderio.cli.tui import CoderioTUI
122
+ print('deepagents engine imports OK')
123
+ "
124
+ # Verify bundled skills are importable from the installed package.
125
+ /tmp/wheel-test-venv/bin/python -c "
126
+ from coderio.skills.store import load_skill_store
127
+ from pathlib import Path
128
+ import coderio
129
+ pkg = Path(coderio.__file__).parent / 'skills'
130
+ store = load_skill_store(pkg, 0, None)
131
+ assert len(store.names()) > 0, 'no bundled skills found'
132
+ print(f'{len(store.names())} bundled skills OK')
133
+ "
134
+
135
+ - name: Verify sdist installs
136
+ # sdist is the source-of-truth artifact; verify it installs and runs
137
+ # too (a broken sdist — missing files, bad metadata — only shows up
138
+ # at install time).
139
+ run: |
140
+ python -m venv /tmp/sdist-test-venv
141
+ /tmp/sdist-test-venv/bin/pip install dist/*.tar.gz
142
+ /tmp/sdist-test-venv/bin/coderio --help
143
+
144
+ - name: Create GitHub Release + attach artifacts
145
+ # Restored (2026-08-28 audit #3): the artifact refactor
146
+ # accidentally dropped Release creation while the header still
147
+ # promised it. dist/ is still in this job's workspace; the publish
148
+ # job downloads the same artifacts separately.
149
+ uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3
150
+ with:
151
+ generate_release_notes: true
152
+ files: |
153
+ dist/*.whl
154
+ dist/*.tar.gz
155
+
156
+ - name: Upload verified artifacts for publishing
157
+ # Pass the EXACT artifacts that were verified in the clean venvs to
158
+ # the publish job — the old flow REBUILT in publish-pypi, so PyPI
159
+ # could receive a different byte stream than the one verified above
160
+ # (2026-08-28 audit: non-deterministic build gap).
161
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
162
+ with:
163
+ name: dist
164
+ path: |
165
+ dist/*.whl
166
+ dist/*.tar.gz
167
+ if-no-files-found: error
168
+ retention-days: 3
169
+
170
+ publish-pypi:
171
+ # PyPI via Trusted Publishing (OIDC) — no API token to manage or leak.
172
+ # Requires the one-time pending-publisher setup described at the top.
173
+ needs: release
174
+ runs-on: ubuntu-latest
175
+ environment: pypi
176
+ permissions:
177
+ id-token: write # OIDC token for Trusted Publishing
178
+ steps:
179
+ - name: Download verified artifacts
180
+ # No rebuild: publish EXACTLY the wheel/sdist verified in the release
181
+ # job (2026-08-28 audit fix). No checkout needed either.
182
+ uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
183
+ with:
184
+ name: dist
185
+ path: dist
186
+ - name: Publish to PyPI
187
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
188
+ with:
189
+ attestations: true
@@ -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