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.
- coderio-0.6.0/.github/PULL_REQUEST_TEMPLATE.md +8 -0
- {coderio-0.4.4 → coderio-0.6.0}/.github/workflows/ci.yml +27 -6
- coderio-0.6.0/.github/workflows/release.yml +189 -0
- coderio-0.6.0/.gitignore +64 -0
- {coderio-0.4.4 → coderio-0.6.0}/CHANGELOG.md +392 -1
- {coderio-0.4.4 → coderio-0.6.0}/CONTRIBUTING.md +40 -5
- {coderio-0.4.4 → coderio-0.6.0}/PKG-INFO +67 -21
- {coderio-0.4.4 → coderio-0.6.0}/README.md +55 -11
- coderio-0.6.0/README_en.md +149 -0
- coderio-0.6.0/ROADMAP.md +62 -0
- coderio-0.6.0/ROADMAP_en.md +83 -0
- coderio-0.6.0/demo.gif +0 -0
- coderio-0.6.0/docs/CONFIG.md +224 -0
- {coderio-0.4.4 → coderio-0.6.0}/docs/coderio-architecture.md +70 -87
- coderio-0.6.0/docs/images/confirm-menu.svg +190 -0
- coderio-0.6.0/docs/images/harness-warn.svg +190 -0
- coderio-0.6.0/docs/images/todo-panel.svg +192 -0
- coderio-0.6.0/docs/live-eval/results-2026-09-21-water18-0910.json +236 -0
- coderio-0.6.0/docs/live-eval/results-2026-09-21-water18-0910.md +69 -0
- coderio-0.6.0/docs/live-eval/results-2026-09-23-step-3.7-flash.json +231 -0
- coderio-0.6.0/docs/live-eval/results-2026-09-23-step-3.7-flash.md +31 -0
- coderio-0.6.0/docs/live-eval/results-2026-09-24-step-3.7-flash.json +19 -0
- coderio-0.6.0/docs/live-eval/results-2026-09-24-step-3.7-flash.md +30 -0
- {coderio-0.4.4 → coderio-0.6.0}/pyproject.toml +32 -7
- coderio-0.6.0/scripts/architecture/check.py +307 -0
- coderio-0.6.0/scripts/live_eval/__init__.py +29 -0
- coderio-0.6.0/scripts/live_eval/run.py +305 -0
- coderio-0.6.0/scripts/live_eval/tasks.py +418 -0
- {coderio-0.4.4 → coderio-0.6.0}/scripts/verify_deepagent_live.py +3 -3
- {coderio-0.4.4 → coderio-0.6.0}/scripts/verify_harness_live.py +4 -5
- coderio-0.6.0/src/coderio/agent/_content.py +61 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/_deepagents_compat.py +49 -18
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/command_review.py +9 -4
- coderio-0.6.0/src/coderio/agent/deep_loop.py +1446 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/harness.py +258 -28
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/harness_middleware.py +198 -78
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/hooks.py +69 -17
- coderio-0.6.0/src/coderio/agent/microcompact.py +119 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/permission_middleware.py +3 -2
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/plan_artifact.py +70 -2
- coderio-0.6.0/src/coderio/agent/project_instructions.py +164 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/prompts.py +4 -10
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/skill_tool.py +20 -9
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/stream.py +4 -4
- coderio-0.6.0/src/coderio/agent/sync_only.py +28 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/app.py +11 -1
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/commands.py +25 -6
- coderio-0.6.0/src/coderio/cli/credentials.py +152 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/multimodal.py +46 -11
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/onboarding.py +46 -40
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/providers.py +10 -4
- coderio-0.6.0/src/coderio/cli/render.py +17 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/repl.py +135 -10
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/run_cmd.py +50 -25
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/stream.py +0 -12
- coderio-0.6.0/src/coderio/cli/stream_controller.py +560 -0
- coderio-0.6.0/src/coderio/cli/tui.py +1052 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/tui_onboarding.py +82 -43
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/tui_runtime.py +30 -23
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/tui_widgets.py +53 -8
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/__init__.py +0 -2
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/loader.py +24 -12
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/models.py +16 -32
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/trust.py +112 -74
- coderio-0.6.0/src/coderio/llm/factory.py +343 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/mcp_loader.py +25 -1
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/session/message.py +20 -3
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/session/store.py +88 -58
- coderio-0.6.0/src/coderio/tools/__init__.py +55 -0
- coderio-0.6.0/src/coderio/tools/base.py +40 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/bash.py +3 -1
- coderio-0.6.0/src/coderio/tools/checkpoint.py +178 -0
- coderio-0.6.0/src/coderio/tools/command_policy.py +868 -0
- coderio-0.6.0/src/coderio/tools/confirm_diff.py +162 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/grep_tool.py +30 -3
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/multi_edit.py +30 -4
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/permission.py +51 -11
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/read_file.py +18 -2
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/sandbox_runner.py +30 -6
- coderio-0.6.0/src/coderio/tools/taxonomy.py +122 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/web_fetch.py +77 -38
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/win_job.py +32 -12
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/win_sandbox.py +284 -130
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_deep_integration.py +155 -41
- coderio-0.6.0/tests/agent/test_deep_loop_unit.py +810 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_deepagents_compat.py +35 -42
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_harness.py +262 -1
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_harness_middleware.py +223 -1
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_hooks.py +86 -10
- coderio-0.6.0/tests/agent/test_live_script_contract.py +94 -0
- coderio-0.6.0/tests/agent/test_microcompact.py +113 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_perf_baseline.py +9 -6
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_plan_artifact.py +6 -2
- coderio-0.6.0/tests/agent/test_production_seam.py +479 -0
- coderio-0.6.0/tests/agent/test_project_instructions.py +201 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_skill_tool.py +19 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_stream.py +0 -9
- coderio-0.6.0/tests/agent/test_sync_only_middleware.py +64 -0
- coderio-0.6.0/tests/agent/test_usage_normalization.py +178 -0
- coderio-0.6.0/tests/cli/test_app_commands.py +246 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_commands.py +45 -2
- coderio-0.6.0/tests/cli/test_credentials.py +181 -0
- coderio-0.6.0/tests/cli/test_credentials_backup_permissions.py +29 -0
- coderio-0.6.0/tests/cli/test_gate_builder.py +101 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_live_thinking.py +3 -2
- coderio-0.6.0/tests/cli/test_multimodal.py +151 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_onboarding.py +50 -0
- coderio-0.6.0/tests/cli/test_onboarding_wizard.py +96 -0
- coderio-0.6.0/tests/cli/test_providers.py +238 -0
- coderio-0.6.0/tests/cli/test_render.py +7 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_repl_loop.py +13 -5
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_run_cmd.py +29 -12
- coderio-0.6.0/tests/cli/test_stream_controller.py +75 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_truncation.py +1 -1
- coderio-0.6.0/tests/cli/test_tui_gate_fail_closed.py +43 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_onboarding.py +61 -3
- coderio-0.6.0/tests/cli/test_tui_runtime_screens.py +330 -0
- coderio-0.6.0/tests/cli/test_tui_startup.py +422 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_widgets.py +118 -1
- coderio-0.6.0/tests/cli/test_ux_features.py +264 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/config/test_loader.py +0 -33
- {coderio-0.4.4 → coderio-0.6.0}/tests/config/test_trust.py +41 -1
- coderio-0.6.0/tests/e2e/test_cli_e2e.py +150 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/llm/test_factory.py +32 -0
- coderio-0.6.0/tests/llm/test_resolved_model_name.py +45 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/session/test_message.py +23 -0
- coderio-0.6.0/tests/session/test_store.py +334 -0
- coderio-0.6.0/tests/test_architecture_policy.py +82 -0
- coderio-0.6.0/tests/test_live_eval.py +374 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/test_mcp_loader.py +23 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/test_p0_stability.py +11 -3
- {coderio-0.4.4 → coderio-0.6.0}/tests/test_seams.py +11 -9
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_checkpoint.py +139 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_command_policy.py +383 -0
- coderio-0.6.0/tests/tools/test_command_policy_golden.py +126 -0
- coderio-0.6.0/tests/tools/test_confirm_diff.py +212 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_file_tools.py +28 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_grep_tool.py +42 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_multi_edit.py +50 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_permission.py +104 -6
- coderio-0.6.0/tests/tools/test_posix_process_tree.py +51 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_sandbox.py +120 -4
- coderio-0.6.0/tests/tools/test_web.py +267 -0
- coderio-0.6.0/tests/tools/test_web_fetch.py +134 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_win_job.py +56 -0
- {coderio-0.4.4 → coderio-0.6.0}/uv.lock +10 -10
- coderio-0.4.4/.github/workflows/release.yml +0 -122
- coderio-0.4.4/.gitignore +0 -41
- coderio-0.4.4/README_en.md +0 -107
- coderio-0.4.4/src/coderio/agent/deep_loop.py +0 -960
- coderio-0.4.4/src/coderio/cli/credentials.py +0 -70
- coderio-0.4.4/src/coderio/cli/render.py +0 -28
- coderio-0.4.4/src/coderio/cli/tui.py +0 -1332
- coderio-0.4.4/src/coderio/llm/factory.py +0 -164
- coderio-0.4.4/src/coderio/tools/__init__.py +0 -94
- coderio-0.4.4/src/coderio/tools/base.py +0 -55
- coderio-0.4.4/src/coderio/tools/checkpoint.py +0 -105
- coderio-0.4.4/src/coderio/tools/command_policy.py +0 -434
- coderio-0.4.4/tests/agent/test_deep_loop_unit.py +0 -454
- coderio-0.4.4/tests/cli/test_credentials.py +0 -39
- coderio-0.4.4/tests/cli/test_multimodal.py +0 -79
- coderio-0.4.4/tests/cli/test_providers.py +0 -65
- coderio-0.4.4/tests/cli/test_render.py +0 -30
- coderio-0.4.4/tests/cli/test_tui_startup.py +0 -222
- coderio-0.4.4/tests/cli/test_ux_features.py +0 -125
- coderio-0.4.4/tests/session/test_store.py +0 -216
- coderio-0.4.4/tests/tools/test_web.py +0 -72
- coderio-0.4.4/tests/tools/test_web_fetch.py +0 -65
- {coderio-0.4.4 → coderio-0.6.0}/.github/dependabot.yml +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/LICENSE +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/THIRD_PARTY_LICENSES.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/custom_agents.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/agent/state.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/custom_commands.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/mcp_cmd.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/skills_cmd.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/cli/tui_screens.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/config/bootstrap.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/llm/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/llm/probe.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/session/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/bundled/executing-plans/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/LICENSE +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/README.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/clarifying-questions/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/clarifying-questions/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/code-review/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/code-review/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/commit-message/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/commit-message/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/debugging/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/debugging/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/error-handling/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/error-handling/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/lion-writing-skills/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/lion-writing-skills/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/naming/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/naming/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/onboarding-unknown-codebase/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/spec-writing/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/spec-writing/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/task-breakdown/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/task-breakdown/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/testing/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/testing/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/verify-and-fix/SKILL.md +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/lion-skills/skills/verify-and-fix/evals/evals.json +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/models.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/parser.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/skills/store.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/edit_file.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/glob_tool.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/linux_sandbox.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/list_dir.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/note.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/todo.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/web_search.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/src/coderio/tools/write_file.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/conftest.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_command_review.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_custom_agents.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_deep_loop.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_prompts.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/agent/test_state.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_app.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_command_menu.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_custom_commands.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_input_isolation.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_mcp_cmd.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_onboarding_logic.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_repl_reset.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_skills_cmd.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_status_bar.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_stream.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_picker.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_runtime.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/cli/test_tui_screens.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/config/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/config/test_bootstrap.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/config/test_models.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/conftest.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/e2e/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/llm/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/llm/test_probe.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/session/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/skills/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/skills/test_bundled.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/skills/test_parser.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/skills/test_skill_tools.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/skills/test_store.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/test_repl.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/test_version.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/__init__.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_bash.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_concrete_gates.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_edit_prefix.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_glob_tool.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_list_dir.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_note.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_registry.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_search_tools.py +0 -0
- {coderio-0.4.4 → coderio-0.6.0}/tests/tools/test_todo.py +0 -0
|
@@ -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
|
-
#
|
|
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
|
coderio-0.6.0/.gitignore
ADDED
|
@@ -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
|