coderio 0.4.0__py3-none-any.whl

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 (97) hide show
  1. coderio/__init__.py +14 -0
  2. coderio/agent/__init__.py +5 -0
  3. coderio/agent/_deepagents_compat.py +139 -0
  4. coderio/agent/command_review.py +140 -0
  5. coderio/agent/deep_loop.py +758 -0
  6. coderio/agent/harness.py +768 -0
  7. coderio/agent/harness_middleware.py +293 -0
  8. coderio/agent/permission_middleware.py +52 -0
  9. coderio/agent/prompts.py +304 -0
  10. coderio/agent/skill_tool.py +70 -0
  11. coderio/agent/state.py +144 -0
  12. coderio/agent/stream.py +93 -0
  13. coderio/cli/__init__.py +0 -0
  14. coderio/cli/app.py +257 -0
  15. coderio/cli/commands.py +339 -0
  16. coderio/cli/credentials.py +70 -0
  17. coderio/cli/mcp_cmd.py +227 -0
  18. coderio/cli/multimodal.py +94 -0
  19. coderio/cli/onboarding.py +270 -0
  20. coderio/cli/providers.py +113 -0
  21. coderio/cli/render.py +28 -0
  22. coderio/cli/repl.py +189 -0
  23. coderio/cli/run_cmd.py +171 -0
  24. coderio/cli/skills_cmd.py +77 -0
  25. coderio/cli/stream.py +224 -0
  26. coderio/cli/tui.py +1584 -0
  27. coderio/cli/tui_onboarding.py +465 -0
  28. coderio/cli/tui_screens.py +334 -0
  29. coderio/cli/tui_widgets.py +453 -0
  30. coderio/config/__init__.py +21 -0
  31. coderio/config/bootstrap.py +38 -0
  32. coderio/config/loader.py +273 -0
  33. coderio/config/models.py +193 -0
  34. coderio/config/trust.py +136 -0
  35. coderio/llm/__init__.py +3 -0
  36. coderio/llm/factory.py +164 -0
  37. coderio/llm/probe.py +153 -0
  38. coderio/mcp_loader.py +274 -0
  39. coderio/session/__init__.py +3 -0
  40. coderio/session/message.py +79 -0
  41. coderio/session/store.py +244 -0
  42. coderio/skills/__init__.py +4 -0
  43. coderio/skills/bundled/executing-plans/SKILL.md +15 -0
  44. coderio/skills/lion-skills/LICENSE +21 -0
  45. coderio/skills/lion-skills/README.md +114 -0
  46. coderio/skills/lion-skills/skills/clarifying-questions/SKILL.md +119 -0
  47. coderio/skills/lion-skills/skills/clarifying-questions/evals/evals.json +40 -0
  48. coderio/skills/lion-skills/skills/code-review/SKILL.md +102 -0
  49. coderio/skills/lion-skills/skills/code-review/evals/evals.json +40 -0
  50. coderio/skills/lion-skills/skills/commit-message/SKILL.md +97 -0
  51. coderio/skills/lion-skills/skills/commit-message/evals/evals.json +20 -0
  52. coderio/skills/lion-skills/skills/debugging/SKILL.md +116 -0
  53. coderio/skills/lion-skills/skills/debugging/evals/evals.json +40 -0
  54. coderio/skills/lion-skills/skills/error-handling/SKILL.md +74 -0
  55. coderio/skills/lion-skills/skills/error-handling/evals/evals.json +20 -0
  56. coderio/skills/lion-skills/skills/lion-writing-skills/SKILL.md +85 -0
  57. coderio/skills/lion-skills/skills/lion-writing-skills/evals/evals.json +20 -0
  58. coderio/skills/lion-skills/skills/naming/SKILL.md +85 -0
  59. coderio/skills/lion-skills/skills/naming/evals/evals.json +20 -0
  60. coderio/skills/lion-skills/skills/onboarding-unknown-codebase/SKILL.md +95 -0
  61. coderio/skills/lion-skills/skills/onboarding-unknown-codebase/evals/evals.json +20 -0
  62. coderio/skills/lion-skills/skills/spec-writing/SKILL.md +154 -0
  63. coderio/skills/lion-skills/skills/spec-writing/evals/evals.json +40 -0
  64. coderio/skills/lion-skills/skills/task-breakdown/SKILL.md +134 -0
  65. coderio/skills/lion-skills/skills/task-breakdown/evals/evals.json +46 -0
  66. coderio/skills/lion-skills/skills/testing/SKILL.md +134 -0
  67. coderio/skills/lion-skills/skills/testing/evals/evals.json +40 -0
  68. coderio/skills/lion-skills/skills/verify-and-fix/SKILL.md +132 -0
  69. coderio/skills/lion-skills/skills/verify-and-fix/evals/evals.json +40 -0
  70. coderio/skills/models.py +66 -0
  71. coderio/skills/parser.py +50 -0
  72. coderio/skills/store.py +102 -0
  73. coderio/tools/__init__.py +94 -0
  74. coderio/tools/base.py +55 -0
  75. coderio/tools/bash.py +168 -0
  76. coderio/tools/command_policy.py +364 -0
  77. coderio/tools/edit_file.py +55 -0
  78. coderio/tools/glob_tool.py +21 -0
  79. coderio/tools/grep_tool.py +90 -0
  80. coderio/tools/linux_sandbox.py +196 -0
  81. coderio/tools/list_dir.py +58 -0
  82. coderio/tools/multi_edit.py +62 -0
  83. coderio/tools/note.py +72 -0
  84. coderio/tools/permission.py +214 -0
  85. coderio/tools/read_file.py +51 -0
  86. coderio/tools/sandbox_runner.py +113 -0
  87. coderio/tools/todo.py +71 -0
  88. coderio/tools/web_fetch.py +188 -0
  89. coderio/tools/web_search.py +49 -0
  90. coderio/tools/win_job.py +214 -0
  91. coderio/tools/win_sandbox.py +639 -0
  92. coderio/tools/write_file.py +25 -0
  93. coderio-0.4.0.dist-info/METADATA +490 -0
  94. coderio-0.4.0.dist-info/RECORD +97 -0
  95. coderio-0.4.0.dist-info/WHEEL +4 -0
  96. coderio-0.4.0.dist-info/entry_points.txt +2 -0
  97. coderio-0.4.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,490 @@
1
+ Metadata-Version: 2.5
2
+ Name: coderio
3
+ Version: 0.4.0
4
+ Summary: A skill-driven coding agent — structural harness, foldable thinking TUI, deepagents engine.
5
+ Author: coderio contributors
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Keywords: agent,ai-agent,cli,coding-agent,langchain,langgraph,llm,mcp,model-context-protocol,sandbox,skills,textual,tui
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: MacOS
13
+ Classifier: Operating System :: Microsoft :: Windows
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Software Development :: Code Generators
20
+ Requires-Python: >=3.11
21
+ Requires-Dist: ddgs>=4.0
22
+ Requires-Dist: deepagents>=0.6
23
+ Requires-Dist: httpx>=0.27
24
+ Requires-Dist: langchain-anthropic>=0.2
25
+ Requires-Dist: langchain-core>=0.3
26
+ Requires-Dist: langchain-openai>=0.2
27
+ Requires-Dist: langchain>=0.3
28
+ Requires-Dist: langgraph-checkpoint-sqlite>=2.0
29
+ Requires-Dist: langgraph>=0.2
30
+ Requires-Dist: pydantic>=2
31
+ Requires-Dist: rich>=13
32
+ Requires-Dist: textual>=0.40
33
+ Requires-Dist: tomli-w>=1.0
34
+ Requires-Dist: typer>=0.12
35
+ Provides-Extra: dev
36
+ Requires-Dist: build>=1.2; extra == 'dev'
37
+ Requires-Dist: mypy>=1.10; extra == 'dev'
38
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
39
+ Requires-Dist: pytest-cov>=4; extra == 'dev'
40
+ Requires-Dist: pytest>=8; extra == 'dev'
41
+ Requires-Dist: ruff>=0.16; extra == 'dev'
42
+ Provides-Extra: mcp
43
+ Requires-Dist: langchain-mcp-adapters>=0.3.2; extra == 'mcp'
44
+ Description-Content-Type: text/markdown
45
+
46
+ # coderio
47
+
48
+ [中文](README.md) | **English**
49
+
50
+ > A skill-driven coding agent — structural harness constraints, a foldable-thinking TUI, and a deepagents engine. Built on langchain + langgraph + deepagents + Lion-Skills. Windows-first, cross-platform.
51
+
52
+ ## Why this project
53
+
54
+ It started as a way to spend some free tokens and walk the full langchain stack while building an agent. Once the framework was up, a plain REPL + CLI felt uninspiring, so I built a TUI — and that part I'm genuinely happy with.
55
+
56
+ The framework has not been finely tuned; it's a demo built in spare time. It's open-sourced not as a product, but as a working reference for anyone using the langchain stack: how to wire the deepagents engine, how to build structural harness constraints, how to do streaming rendering in a TUI — the code is all here, it runs, take it and play.
57
+
58
+ > About the name: **coderio = code + rio** (not coder + io). My English name is Lion; I first tried "codelion" but it felt odd, so coderio it is.
59
+
60
+ ---
61
+
62
+ **coderio** is a skill-driven coding agent. Its skeleton is the [Lion-Skills](https://github.com/Lion-1209/Lion-Skills) suite (clarify → spec → task → execute → verify → commit workflow); coderio adds tools that actually get work done, a **harness layer** that enforces the workflow, and an interactive Textual TUI. The reference points are Claude Code / Codex / ZCode.
63
+
64
+ Core philosophy: **skills are the playbook, the harness is the discipline, tools are the hands.** Three layers, none substituting for another.
65
+
66
+ ---
67
+
68
+ ## Features
69
+
70
+ - **Harness four-gate hard constraints**: when the agent writes code but declares "done" without running it, the harness intercepts termination and force-continues the loop — not a prompt-level soft rule, but a system-level structural control based on tool-call ground truth. VerifyGate parses shell exit codes (both coderio's legacy format and deepagents' native format), so failing tests no longer count as "verified"; permission-denied runs don't either; non-code files (.md/.json/.yaml docs) are intelligently skipped; CompletionGate checks for pending todos.
71
+ - **Explicit state machine**: execution phase derived in real time (explore → plan → implement → verify → complete), shown in the status bar; per-turn phase timelines persist to the session for replay/debugging.
72
+ - **deepagents engine**: production engine built on [deepagents](https://github.com/langchain-ai/deepagents) with context management (offload + summarization), subagents (task tool, incl. a read-only research subagent), a filesystem backend, and persistent checkpoints (SqliteSaver). deepagents' default prompt is fully replaced — coderio's system prompt is the only one the model sees.
73
+ - **Persistent checkpoints**: graph state persists to sqlite across turns; only the new message is sent (no full-history replay), and SummarizationMiddleware's accumulated state is preserved correctly.
74
+ - **Automatic context compaction**: deepagents' SummarizationMiddleware triggers near 60% of the context window (configurable via `[context].trigger_ratio`) — old messages are offloaded to files + LLM-summarized.
75
+ - **Intent classification**: CODE / QA / ANALYZE intents are auto-detected (bilingual signal words); coding tasks go through the workflow, questions are answered directly.
76
+ - **Progressive disclosure**: skill bodies load on demand; the system prompt stays ~2K tokens instead of piling everything in.
77
+ - **Interactive TUI**: Textual terminal UI with foldable thinking (Ctrl+O), streaming output, a tool-call status bar (animated spinner + step + task phase + timer + per-turn token count), slash-command autocomplete, a collapsible TODO panel (live ✓/→/○ progress), a vertical permission menu (↑↓ + Enter), session management (`/resume` + Del to delete), visual pickers (`/mode` `/profile`), file-change visualization, task interruption (Esc / ⏹ button), and error recovery.
78
+ - **Tool error resilience**: failed tool calls become tool results fed back to the model for self-correction instead of crashing the turn; the bash tool kills the whole process tree on timeout (Windows Job Object).
79
+ - **File path isolation**: the deepagents backend's `virtual_mode` confines file tools (write_file/edit_file/read_file/ls/grep/glob) to the workspace root — the agent's `/foo.py` maps to `{workdir}/foo.py`.
80
+ - **Command review layer**: shell (execute) commands are not covered by virtual_mode, so an additional `CommandReviewMiddleware` layer applies a built-in blacklist (`rm -rf /`, `mkfs`, fork bombs, `dd of=/dev/`, shutdown — blocked even in FULL mode) plus user-extendable `blocked_commands`. This is not a real OS sandbox (obfuscated commands can bypass regex), but it stops the vast majority of accidental damage. `network_allowed = false` disables the web tools entirely (offline mode).
81
+ - **SSRF-protected web_fetch**: scheme allowlist (http/https only), private/loopback/link-local IP blocking (incl. cloud metadata endpoints), per-hop redirect validation, and a 1 MB response cap.
82
+ - **Multi-layer OS sandbox** (Linux real isolation): `sandbox_mode = "job" | "write"` — Job Object resource limits on Windows; bubblewrap namespace isolation on Linux (read-only root, read-write workspace, optional network cutoff, Claude-Code-compatible filesystem 4-tuple `allow_write`/`deny_write`/`deny_read`/`allow_read`).
83
+ - **MCP support**: connect external MCP servers via `.mcp.json` (Claude Code-compatible format); stdio and HTTP transports; project-level config overrides user-level. `coderio mcp` CLI manages entries; MCP tools are gated by the permission system like built-in tools.
84
+ - **Repo-config trust confirmation**: first time a repository's `.coderio/config.toml` or `.mcp.json` is seen, coderio shows what it contains (permission mode, base_url, MCP commands) and requires explicit confirmation — content-hashed, so upstream edits re-trigger the prompt. Cloning a hostile repo no longer means silent arbitrary code execution.
85
+ - **Multiple providers + named profiles**: Zhipu GLM / StepFun coding plans (Anthropic protocol) + OpenAI-compatible endpoints; multiple profiles with runtime `/profile` switching.
86
+ - **Headless mode**: `coderio run "task"` for one-shot, non-interactive runs (CI, scripting, benchmark harnesses).
87
+
88
+ ---
89
+
90
+ ## Quick start
91
+
92
+ ### Install
93
+
94
+ **Option 1: pip from PyPI (recommended)**
95
+
96
+ ```bash
97
+ pip install coderio
98
+ ```
99
+
100
+ **Option 2: from GitHub**
101
+
102
+ ```bash
103
+ pip install "coderio @ git+https://github.com/Lion-1209/coderio.git"
104
+ ```
105
+
106
+ **Option 3: Release wheel (offline/intranet)**
107
+
108
+ Download the latest `coderio-*.whl` from the [Releases page](https://github.com/Lion-1209/coderio/releases), then:
109
+
110
+ ```bash
111
+ pip install coderio-0.4.0-py3-none-any.whl
112
+ ```
113
+
114
+ **Option 4: from source (developers, uv recommended)**
115
+
116
+ ```bash
117
+ git clone https://github.com/Lion-1209/coderio.git
118
+ cd coderio
119
+
120
+ # uv (recommended — same as CI, deps locked in uv.lock)
121
+ uv sync --extra dev # creates .venv, installs exactly per uv.lock
122
+ uv run pytest -q # run commands via uv run
123
+
124
+ # or plain pip (does not read the lockfile; resolves latest compatible versions)
125
+ python -m venv .venv
126
+ .venv/Scripts/python.exe -m pip install -e ".[dev]" # Windows (Git Bash)
127
+ .venv/bin/python -m pip install -e ".[dev]" # Linux / macOS
128
+ ```
129
+
130
+ Requirements: Python 3.11+; on Windows, Git Bash must be installed (the shell tool depends on it).
131
+
132
+ **Dependency management**: CI installs exactly per [uv.lock](uv.lock) via `uv sync --frozen` (reproducible); Dependabot's weekly upgrade PRs update pyproject.toml and uv.lock together. After changing dependencies, run `uv lock` and commit both files.
133
+
134
+ **MCP support** (optional): install the MCP extra to connect external MCP servers:
135
+
136
+ ```bash
137
+ pip install "coderio[mcp]" # or: uv sync --extra dev --extra mcp
138
+ ```
139
+
140
+ Without the extra, coderio works normally — `.mcp.json` is silently ignored.
141
+
142
+ ### Configuration
143
+
144
+ The first interactive run triggers an onboarding wizard (pick provider, model, paste API key); config is written to `~/.coderio/config.toml` and `~/.coderio/credentials`. The wizard probes the model's context window and persists it, so compaction thresholds match the real model. Manual configuration:
145
+
146
+ ```bash
147
+ # ~/.coderio/config.toml
148
+ [model]
149
+ provider_id = "bigmodel_coding_plan" # Zhipu/StepFun/OpenAI/Anthropic/Ollama/custom
150
+ default = "glm-5.2"
151
+ context_limit = 128000 # (optional) auto-probed by onboarding; 0 = use the default below
152
+ max_output_tokens = 16384 # (optional) max tokens per reply, default 16384
153
+
154
+ [tools]
155
+ permission_mode = "confirm" # confirm | plan | auto_edit | full
156
+ workspace_root = "" # shell backend CWD (empty = launch dir); file-path isolation is handled by deepagents virtual_mode
157
+ blocked_commands = [] # extra blacklist regexes, e.g. ["git push --force", "npm publish"]
158
+ network_allowed = true # false = disable web_fetch/web_search + Linux sandbox network cutoff (--unshare-net)
159
+ whitelist_mode = false # true = unknown commands degrade to confirm (see "Sandbox" below)
160
+ allowed_commands = [] # extend the built-in whitelist, e.g. ["docker", "kubectl"]
161
+ sandbox_mode = "off" # off | job | write (see "Sandbox" below)
162
+ auto_allow_if_sandboxed = false # auto-approve execute when sandbox is active (Claude Code "autoAllowBashIfSandboxed")
163
+
164
+ # Optional: sandbox filesystem isolation (Linux bubblewrap only; Windows ignores it for now)
165
+ [tools.sandbox_filesystem]
166
+ allow_write = [] # extra writable paths (workspace is always writable), e.g. ["/tmp/build", "~/.cache"]
167
+ deny_write = [] # forced read-only paths (even inside workspace), e.g. [".git/hooks"]
168
+ deny_read = [] # unreadable paths, e.g. ["~/.ssh", "~/.aws/credentials", "~/.gnupg"]
169
+ allow_read = [] # holes punched inside deny_read, e.g. ["~/.ssh/known_hosts"]
170
+
171
+ [context]
172
+ enabled = true # long-session auto-compaction (on by default)
173
+ trigger_ratio = 0.6 # trigger at 60% of the context window
174
+ keep_recent = 8 # keep the most recent N messages verbatim
175
+ model_context_limit = 200000 # fallback when the profile has no probed context_limit
176
+ ```
177
+
178
+ **MCP configuration** (`.mcp.json`, Claude-Code-compatible):
179
+
180
+ Place `.mcp.json` in the project root (project scope) or `~/.coderio/mcp.json` (user scope). Configured servers and their tools load at startup:
181
+
182
+ ```json
183
+ {
184
+ "mcpServers": {
185
+ "filesystem": {
186
+ "command": "npx",
187
+ "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
188
+ },
189
+ "github": {
190
+ "type": "http",
191
+ "url": "https://api.githubcopilot.com/mcp/",
192
+ "headers": { "Authorization": "Bearer ghp_xxx" }
193
+ }
194
+ }
195
+ }
196
+ ```
197
+
198
+ - **stdio servers**: `{command, args, env?, cwd?, timeoutMs?, enabled?}` — spawn a local subprocess (e.g. npx-run server-filesystem)
199
+ - **HTTP servers**: `{type: "http", url, headers?, timeoutMs?, enabled?}` — connect to a remote MCP endpoint
200
+ - **SSE servers**: `{type: "sse", url, headers?, timeoutMs?, enabled?}`
201
+ - **type inference**: omit `type` — a `command` implies stdio, a `url` implies http
202
+ - Tool names are prefixed with the server name (e.g. `filesystem_read_file`), never colliding with built-in tools
203
+ - Failed servers are skipped with a warning — startup is never blocked
204
+ - Requires the MCP extra: `pip install "coderio[mcp]"`
205
+
206
+ Optional fields (ZCode-compatible):
207
+ - `enabled: false` — temporarily disable a server without removing its config
208
+ - `cwd` — stdio subprocess working directory (often needed for npx/node on Windows)
209
+ - `timeoutMs` — per-request timeout in ms; forwarded to the adapter as `timeout` (seconds)
210
+ - Legacy field aliases auto-migrate: `enable`→`enabled`, `environment`→`env`, `http_headers`→`headers`, `type:"remote"`→`http`
211
+
212
+ **CLI management** (`coderio mcp`):
213
+
214
+ ```bash
215
+ # Add a stdio server to the project .mcp.json
216
+ coderio mcp add filesystem --command npx --arg -y --arg @modelcontextprotocol/server-filesystem --arg /tmp
217
+
218
+ # Add an HTTP server to the user config
219
+ coderio mcp add github --type http --url https://api.githubcopilot.com/mcp/ --scope user
220
+
221
+ # List all configured servers (project + user)
222
+ coderio mcp list
223
+
224
+ # Remove a server
225
+ coderio mcp remove filesystem
226
+ ```
227
+
228
+ **MCP tool permissions**: MCP tool names containing `write`/`create`/`delete`/`execute`/`run`/`fetch`/`request` (and similar keywords) are treated as destructive by the permission system (rejected in PLAN, prompted in CONFIRM, allowed in FULL) — same as built-in tools. Read-only MCP tools (`read`/`get`/`list`/`query`) pass in all modes.
229
+
230
+ **Sandbox & command security** (defense in depth):
231
+
232
+ coderio applies multiple security layers to shell (`execute`) commands, lightest to heaviest:
233
+
234
+ | Layer | Mechanism | Config | Strength |
235
+ |---|---|---|---|
236
+ | 1. Blacklist | Regex-blocks destructive commands (`rm -rf /`, `mkfs`, fork bombs, ...), even in FULL mode | `[tools].blocked_commands` extends | Accident prevention; bypassable via base64/variables |
237
+ | 2. Whitelist | Unknown commands (not in the ~60 built-in dev commands) degrade to confirm | `[tools].whitelist_mode = true` | Stronger (unknown commands prompt); still bypassable |
238
+ | 3. OS sandbox | Kernel-level isolation — the process physically lacks the permission to write outside bounds | `[tools].sandbox_mode` | The real security boundary |
239
+
240
+ `sandbox_mode` levels:
241
+
242
+ - **`off`** (default): no OS sandbox; blacklist + whitelist only. Existing behavior.
243
+ - **`job`**: Windows Job Object / POSIX process group + resource limits (process-count cap prevents fork bombs) + reliable process-tree kill. No file isolation, but stops resource abuse.
244
+ - **`write`**: file-write isolation.
245
+ - **Linux**: ✅ **real isolation** — `bubblewrap` (`bwrap`), the same approach as Claude Code on Linux. Read-only root mount, read-write workspace, `--unshare-net` when `network_allowed=false`. Requires `apt install bubblewrap`.
246
+ - **Windows**: ⚠️ **currently equivalent to `job`**. The `CreateRestrictedToken` + `CreateProcessAsUserW` plumbing is in place, but on non-admin accounts the token is a no-op (verified: original and restricted tokens both have Medium integrity — identical write permissions). True isolation needs per-directory ACLs (~500 lines), tracked as future work. **Windows users currently have no OS-level write isolation** — use `job`; `write` provides no extra protection.
247
+
248
+ ```toml
249
+ # Recommended: job for daily dev (fork-bomb prevention + reliable cleanup)
250
+ # Linux users wanting real isolation: sandbox_mode = "write" (needs bubblewrap)
251
+ sandbox_mode = "job"
252
+ whitelist_mode = true
253
+ allowed_commands = ["docker", "kubectl"] # commands outside the whitelist trigger confirm
254
+
255
+ # Advanced: auto-approve shell commands when the sandbox is active (fewer prompts)
256
+ # This is Claude Code's "autoAllowBashIfSandboxed" design — the sandbox provides the
257
+ # real isolation boundary, so per-command prompts become noise. The blacklist still applies.
258
+ auto_allow_if_sandboxed = true
259
+ ```
260
+
261
+ **Permission-sandbox interplay** (Claude Code "autoAllowBashIfSandboxed" design):
262
+ - Default (`auto_allow_if_sandboxed = false`): even with the sandbox on, every execute still prompts (backward compatible)
263
+ - `true`: execute auto-approves when the sandbox is active — the sandbox is the boundary, prompts are noise
264
+ - **The blacklist always applies**: `rm -rf /` is blocked even under sandbox + auto_allow (CommandReviewMiddleware is independent of the permission gate)
265
+ - **PLAN mode is unaffected**: PLAN is always read-only; the sandbox doesn't change that contract
266
+
267
+ **Linux filesystem 4-tuple isolation** (`[tools.sandbox_filesystem]`, bubblewrap only):
268
+ ```toml
269
+ [tools.sandbox_filesystem]
270
+ # Keep secrets away from sandboxed processes (the real prompt-injection exfiltration threat)
271
+ deny_read = ["~/.ssh", "~/.aws/credentials", "~/.gnupg"]
272
+ allow_read = ["~/.ssh/known_hosts"] # punch a hole (SSH connection verification still works)
273
+ allow_write = ["/tmp/build", "~/.cache"] # extra writable paths
274
+ deny_write = [".git/hooks"] # forced read-only even inside the workspace
275
+ ```
276
+ Paths support `~` (home), `./` or bare (workspace-relative), `/abs` (absolute). The `deny_read` tmpfs blackhole **must** mount before the `allow_read` ro-bind (later bwrap mounts override earlier ones) — the code guarantees this order.
277
+
278
+ **Security model, honestly stated**:
279
+ - **The blacklist/whitelist are accident prevention, NOT adversarial defense.** They intercept unintended destructive commands (wrong paths, missed consequences) but are **not a security boundary** — variable expansion (`X=/; rm -rf $X`), base64 encoding, and shell composition (`ls ; curl ... | sh`) all bypass regex matching. Real adversarial protection comes from the OS sandbox (Linux bubblewrap / `write` mode) + permission prompts; use a VM for hostile code. Do not trust untrusted code just because "a blacklist is configured".
280
+ - `job` mode: resource limits + process control, not a permission sandbox.
281
+ - `write` on Linux: bubblewrap provides full namespace isolation (out of the box) + the filesystem 4-tuple for fine-grained control.
282
+ - `write` on Windows: **no actual isolation effect today** (token is a no-op); equivalent to `job`. Real isolation awaits the ACL work.
283
+ - Whitelist degradation: in CONFIRM/AUTO_EDIT modes, commands outside the whitelist **run but carry a `[whitelist]` annotation** in the result (so the model/user knows the command is outside the trusted set); PLAN hard-rejects; FULL allows silently.
284
+ - For **fully untrusted code**, use a VM (Windows Sandbox / Docker) — do not rely on this sandbox.
285
+
286
+ Supported providers:
287
+ | provider_id | Description | Protocol |
288
+ |---|---|---|
289
+ | `bigmodel_coding_plan` | Zhipu GLM Coding Plan | Anthropic |
290
+ | `stepfun_coding_plan` | StepFun Step Plan | Anthropic |
291
+ | `bigmodel_api` / `stepfun_api` | Zhipu/StepFun direct API key | Anthropic / OpenAI |
292
+ | `openai` | OpenAI direct | OpenAI |
293
+ | `anthropic` | Anthropic Claude direct | Anthropic |
294
+ | `ollama` | Local Ollama (no key) | OpenAI |
295
+ | `openai_custom` | any OpenAI-compatible endpoint | OpenAI |
296
+
297
+ API keys live in `~/.coderio/credentials` (POSIX 0600 / Windows icacls protected).
298
+
299
+ ### Running
300
+
301
+ ```bash
302
+ # Interactive TUI (Ctrl+O unfolds thinking, scrollable history, / autocomplete)
303
+ coderio
304
+ # or directly (Windows)
305
+ .venv/Scripts/python.exe -m coderio.cli.app
306
+ # (Linux / macOS)
307
+ .venv/bin/python -m coderio.cli.app
308
+
309
+ # Specify provider/model
310
+ coderio --provider bigmodel_coding_plan --model glm-5.2
311
+
312
+ # Headless one-shot run (CI / scripting / benchmarks)
313
+ coderio run "write a hello-world script and test it"
314
+ coderio run "fix the failing test in tests/foo.py" --quiet # final result only
315
+ coderio run "continue" --session-id <id> # resume a session
316
+
317
+ # Manage skills (install pulls from GitHub; needs git on PATH)
318
+ coderio skills list
319
+ coderio skills install
320
+ ```
321
+
322
+ ---
323
+
324
+ ## TUI commands
325
+
326
+ Inside the TUI, type `/` to trigger autocomplete:
327
+
328
+ | Command | Effect |
329
+ |------|------|
330
+ | `/help` | list all commands |
331
+ | `/exit` `/quit` | quit |
332
+ | `/config` | show current config (provider/model/mode) |
333
+ | `/mode` | switch permission mode (no arg opens a visual picker: confirm/plan/auto) |
334
+ | `/model <name>` | switch model at runtime |
335
+ | `/setup` | reconfigure provider/model (onboarding wizard, auto context-window probe) |
336
+ | `/profile` | switch saved config profiles (visual picker) |
337
+ | `/skills` | list skills (★ = activated) |
338
+ | `/cost` | show session token usage |
339
+ | `/clear` | reset context (fresh session) |
340
+ | `/sessions` | list recent sessions |
341
+ | `/resume` | resume a past session (↑↓ select, Enter resume, type to filter) |
342
+ | `/think` | unfold the latest turn's thinking |
343
+ | `/export [path]` | export the session to markdown |
344
+
345
+ **Shortcuts**:
346
+
347
+ | Key | Effect |
348
+ |------|------|
349
+ | `Ctrl+O` | unfold/fold the latest turn's thinking |
350
+ | `Esc` / `⏹ stop` | interrupt the running agent task (TUI stays up) |
351
+ | `↑↓` + `Enter` | command menu navigation (opens on `/`) |
352
+
353
+ Just type natural language to chat or assign coding tasks.
354
+
355
+ ---
356
+
357
+ ## Architecture
358
+
359
+ Layered monolith, dependencies flow downward:
360
+
361
+ ```
362
+ CLI (cli/) Typer app + Textual TUI + slash commands
363
+ │
364
+ Agent (agent/) deepagents engine + harness/permission middleware + prompt building
365
+ │
366
+ Capabilities tools/ · skills/ · llm/ · session/ · config/
367
+ ```
368
+
369
+ ### Engine: deepagents + coderio middleware
370
+
371
+ coderio uses deepagents as the engine (context management, subagents, filesystem backend) and layers middlewares on top:
372
+
373
+ | Middleware | Role |
374
+ |---|---|
375
+ | **HarnessMiddleware** | coderio's four-gate hard constraints (verify/completion/grounding/plan) — deepagents itself does not enforce verification |
376
+ | **PermissionMiddleware** | four permission tiers (plan/confirm/auto_edit/full) — controls which tools may execute |
377
+ | **CommandReviewMiddleware** | content-level review: built-in destructive-command blacklist (active even in FULL mode) + SSRF/network policies |
378
+
379
+ deepagents' default BASE_AGENT_PROMPT is neutralized — coderio's system prompt stands alone, no conflicts.
380
+
381
+ **Subagents**: built-in research subagent (read-only, physically isolated — cannot write or execute) + general-purpose (full tools, carrying the same Harness/Permission/CommandReview middleware as the main agent). The main agent delegates via the task tool; contexts are isolated.
382
+
383
+ The old ReAct engine has been removed — deepagents is the only engine.
384
+
385
+ ### The harness four gates (core)
386
+
387
+ | Gate | Strength | Mechanism |
388
+ |----|------|------|
389
+ | **VerifyGate** | hard, escalating | claims "done" after writing code without running it → intercepted, forced continuation; parses shell exit codes — **failing tests (non-zero) do not count as verified**; writing docs/configs (.md/.json/.yaml) doesn't trigger verification; releases after 2 interceptions + a red warning |
390
+ | **CompletionGate** | hard | claims "done" with pending todos → intercepted |
391
+ | **GroundingGate** | hard (CODE mode only) | after writing code, cites files never read via read_file → intercepted; **ANALYZE mode skips it** — mentioning filenames in an analysis is normal (based on a 105-session audit: 98.2% false-positive rate, never caught a real hallucinated citation) |
392
+ | **PlanGate** | soft nudge | writes code without a todo list → appends a nudge to the tool result |
393
+
394
+ ### Context governance
395
+
396
+ deepagents' SummarizationMiddleware manages context automatically:
397
+
398
+ | Mechanism | Trigger | Behavior |
399
+ |------|------|------|
400
+ | **offload** | tool input/output >20K tokens | large blocks saved to disk + pointer left, context preserved |
401
+ | **summarize** | tokens reach 60% of the window (configurable `trigger_ratio`) | old messages LLM-summarized + originals offloaded to `/conversation_history/` |
402
+ | **checkpoint** | every turn end | graph state persisted to sqlite; next turn sends only the new message |
403
+
404
+ ### Explicit state machine
405
+
406
+ The agent's execution phase is derived live and shown in the status bar (`step 3 · [implement] thinking · 12.4s`):
407
+
408
+ ```
409
+ explore (read_file/grep) → plan (first write, no todos) → implement (write + todos)
410
+ → verify (bash pytest) → complete
411
+ ```
412
+
413
+ Each turn's phase timeline persists to the session jsonl (`kind="phase_timeline"`) for replay/debugging, but stays invisible to the model (never pollutes context).
414
+
415
+ Full architecture: [`docs/coderio-architecture.md`](docs/coderio-architecture.md).
416
+
417
+ ---
418
+
419
+ ## Testing
420
+
421
+ ```bash
422
+ # Full unit test suite (~15s)
423
+ # Windows (Git Bash):
424
+ .venv/Scripts/python.exe -m pytest -q
425
+ # Linux / macOS:
426
+ .venv/bin/python -m pytest -q
427
+
428
+ # By module
429
+ .venv/Scripts/python.exe -m pytest tests/agent/ -v # Windows
430
+ .venv/bin/python -m pytest tests/agent/ -v # Linux / macOS
431
+
432
+ # Live verification (real model endpoint; requires ANTHROPIC_API_KEY)
433
+ # harness four gates against a real model:
434
+ ANTHROPIC_API_KEY=<key> .venv/Scripts/python.exe scripts/verify_harness_live.py # Windows
435
+ ANTHROPIC_API_KEY=<key> .venv/bin/python scripts/verify_harness_live.py # Linux / macOS
436
+ # deepagents engine integration:
437
+ ANTHROPIC_API_KEY=<key> .venv/Scripts/python.exe scripts/verify_deepagent_live.py # Windows
438
+ ```
439
+
440
+ Three test layers: unit tests (logic) + live verification (real integration) + manual experience testing.
441
+
442
+ ---
443
+
444
+ ## Tech stack
445
+
446
+ | Dependency | Purpose |
447
+ |------|------|
448
+ | langchain >=0.3 | agent foundation |
449
+ | langgraph >=0.2 | state-graph orchestration |
450
+ | langchain-anthropic >=0.2 | Zhipu/StepFun endpoints (Anthropic protocol) |
451
+ | textual >=0.40 | interactive TUI |
452
+ | rich >=13 | terminal rendering |
453
+ | typer >=0.12 | CLI framework |
454
+ | deepagents >=0.6 | production engine (context management, subagents, filesystem backend) |
455
+
456
+ ---
457
+
458
+ ## Project structure
459
+
460
+ ```
461
+ src/coderio/
462
+ ├── agent/ # deepagents engine, harness/permission middleware, prompts, stream protocol
463
+ ├── cli/ # Typer app, Textual TUI, slash commands, credentials/onboarding, headless run
464
+ ├── tools/ # tool set + permission gate + langchain adapters + sandbox
465
+ ├── skills/ # SkillStore 3-layer loading + Lion-Skills (bundled)
466
+ ├── config/ # 3-layer TOML config merge + repo trust
467
+ ├── session/ # jsonl session storage + resume
468
+ └── llm/ # model factory (provider registry)
469
+ ```
470
+
471
+ Lion-Skills ship as bundled skills (`src/coderio/skills/lion-skills/`) — no separate install needed.
472
+
473
+ ---
474
+
475
+ ## Known limitations
476
+
477
+ - **Windows encoding**: shell output under GBK locales has a built-in mitigation (`_WinLocalShellBackend` decodes bytes with errors='replace')
478
+ - **Windows write sandbox**: `sandbox_mode = "write"` is currently equivalent to `job` on Windows (documented above under Sandbox)
479
+
480
+ ---
481
+
482
+ ## Contributing
483
+
484
+ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md).
485
+
486
+ ---
487
+
488
+ ## License
489
+
490
+ MIT (see [LICENSE](LICENSE)). Bundled Lion-Skills are also MIT (see [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md)).
@@ -0,0 +1,97 @@
1
+ coderio/__init__.py,sha256=IBcx61GkSme78wZcxj2sOkaVOSLsDJyjPT0-FRH2XFo,686
2
+ coderio/mcp_loader.py,sha256=dK0BLvPbip636FQy_FSGTEmlp_BdT9N4CU0lu3GkMjw,10059
3
+ coderio/agent/__init__.py,sha256=dZQ7YPHC4JCSsJtJCI2C5s0Ing7fr8oaI6_jcveMEwE,255
4
+ coderio/agent/_deepagents_compat.py,sha256=q3xM_Y6wm2gcLZpE1y_1Y30QLyGYDnB-cF4IE-pqRvo,6175
5
+ coderio/agent/command_review.py,sha256=HSeUtKa9h9k7SeEHnI5OSpSh-th2amneJWX1L_3myns,7057
6
+ coderio/agent/deep_loop.py,sha256=Is5Lmj4n_3PdyV0eVK4k63F7lLUruKSSO0395m3u7ck,35859
7
+ coderio/agent/harness.py,sha256=UkxdvXqUUl-xLdqJj3sgzxlL16u_1tWYFndCXJMgL0s,36781
8
+ coderio/agent/harness_middleware.py,sha256=5t39aS0kfVNLoFdAljyxEzLT9nGWunfx59QL9DnQJX8,14616
9
+ coderio/agent/permission_middleware.py,sha256=MSeLJ2WK4rjw7X4xUxLojk7IMS07XyUjMFN2xsxMyzE,2113
10
+ coderio/agent/prompts.py,sha256=ZeXmmEAC2crDKsxBuQEAREIPmx8K2tVmv8G71940HzY,17769
11
+ coderio/agent/skill_tool.py,sha256=sdO-nYrac2c4oR-yS3rh8XKG7nfTXfChBDElukJlaLc,2743
12
+ coderio/agent/state.py,sha256=t9zkGTAk98NYam-zYLZ326hGSNPCx_KfQo1wZRTFliw,5568
13
+ coderio/agent/stream.py,sha256=oTtA16jmqD2t9gZWvE6qB1DfyaHPRuyp-Das3sHEq8A,3464
14
+ coderio/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ coderio/cli/app.py,sha256=1YbnMjTzj3jLZTXmoZBnaN3Y7hLUbvI4mGqjDvWt5-g,8960
16
+ coderio/cli/commands.py,sha256=2T_bMeyWhJ63FfKbobim0b-e0odpK4wTN2e_jyXlSKA,13934
17
+ coderio/cli/credentials.py,sha256=cv8GrBDuHDxU1gsvt91ZUT-8opq57FTCVfCCTLCJfR0,2298
18
+ coderio/cli/mcp_cmd.py,sha256=z7a6qp6c89ysT1fuHVzNQ03CvGfpqqQzt8tJrnHjyTo,7485
19
+ coderio/cli/multimodal.py,sha256=4KXat-d1jJZKfLRutfahQK03NzIdOaRbmaup_dGV-v4,3199
20
+ coderio/cli/onboarding.py,sha256=vIvVoWre0zwgZSc_8PwiTMmEfeAsoyhuMPiF06OrrS0,10891
21
+ coderio/cli/providers.py,sha256=pYGonvbjNTtPn62tUwPPNNVAuyZbg8zqZwtgXg2aydE,3525
22
+ coderio/cli/render.py,sha256=6HlDvoOi3bitq-2PPYUCkerKQzS6b7hsuY7fShHEvik,824
23
+ coderio/cli/repl.py,sha256=aEAaaRckV1WcyAkP7WE-RRnUVa_qFGbTuHUCo5U6Wo4,6995
24
+ coderio/cli/run_cmd.py,sha256=Q5nT9RZW5L__MCNeaAYhG3ht9vvfgX1uBw25CCXFa-A,6207
25
+ coderio/cli/skills_cmd.py,sha256=7BeahSELRqZR9akNXK6t3Bb4V73y0KJuX2OIePJbX4M,2423
26
+ coderio/cli/stream.py,sha256=flvENJ7-I-Osr5cZdBY08Hoe8h0dYzE8fAalPHNMTYc,8445
27
+ coderio/cli/tui.py,sha256=LdiraaS_r_ZkPEDj_4TM9Od_5dQ8XBBHtMkT-KZYqYU,70863
28
+ coderio/cli/tui_onboarding.py,sha256=c1ArjcOz1WjMwZ7H-pTyIJSeApoBTUe7xKIkp_ELVig,19598
29
+ coderio/cli/tui_screens.py,sha256=FphUhjWhm10YZfdifTY7d9O1nsKzUyVgB6LiXDsUkhc,13084
30
+ coderio/cli/tui_widgets.py,sha256=-PHP4nxgla_RnulmYiqPsoo0f6SKR-3G3iiUe5PboRM,19016
31
+ coderio/config/__init__.py,sha256=UkLeKyXEHfe2NqZpxS8d60SPaAI_neweOGnvmjvgbAM,362
32
+ coderio/config/bootstrap.py,sha256=Ug8alY6A-BQbyE4Cdwy1vibdyzzS-Ry0VBmCwtj-CG8,1165
33
+ coderio/config/loader.py,sha256=IMUSmr9RXlAQCOLLy3XViFksv8x0OrrwNM8pjuCq77Q,10749
34
+ coderio/config/models.py,sha256=PVOle3mGZl1KwP1MdbQAzDgRV4dp46i_62cKg0nIr9E,8778
35
+ coderio/config/trust.py,sha256=nVsXRvPUNcNCWCUhFgCYx-ANeoLlk2FpK2nuRe8EPMY,5720
36
+ coderio/llm/__init__.py,sha256=M6Xat7TaB5Lo3KEvqdsYbtv5Ksi4H2W5nssmwvVI73g,81
37
+ coderio/llm/factory.py,sha256=izaFfKSWE278Nx0u-zvXCbD6GGxG_lJMzkYEHbYmQOI,6570
38
+ coderio/llm/probe.py,sha256=ooWAlL0cU6rcU5kx_H6wXk2mm7ms-jFJK3UB5G1IpbI,5672
39
+ coderio/session/__init__.py,sha256=Cxi6gVbZG11jR0SyCyUT_EpKTz56gbJ8WwsO73X1zZg,89
40
+ coderio/session/message.py,sha256=uvjMxbUYtPwf-lk5mTZ_NAACLxVvO5QUI5HWV9K3pwg,2991
41
+ coderio/session/store.py,sha256=QDUyPc4mOYj42h3FcA__CZ-72QriVNlM_RjCNPY0Ec0,9892
42
+ coderio/skills/__init__.py,sha256=-pFpMNAURGF6ZlZ4z0qnTXlXV_mulwPXamlm_hqtQsI,132
43
+ coderio/skills/models.py,sha256=kufhhfi2jDDBuYaFmnQCB2ZiLnEcp3H29Ag8RgWP6WQ,2443
44
+ coderio/skills/parser.py,sha256=I8yiTkTOh7Dqb1TI6kWaa3b9rufl5wbxFmjLcKCInFo,1386
45
+ coderio/skills/store.py,sha256=j4JlGEtNxiPgd7LoNJ_Ma7HnlvkpxQpmKulL7M3yAhs,3669
46
+ coderio/skills/bundled/executing-plans/SKILL.md,sha256=NaG6teTm9NYMZIfzycJnyduNwzfQqdm2fWNWMf13r5s,681
47
+ coderio/skills/lion-skills/LICENSE,sha256=MpcHa7llf6sBOH_mzaHLaPxA9qt11JnxDqbkJS6Bfc8,1061
48
+ coderio/skills/lion-skills/README.md,sha256=goYuG18lO3AyR3GMNEes0jyggGqhCFToEHYcW_otNbA,5047
49
+ coderio/skills/lion-skills/skills/clarifying-questions/SKILL.md,sha256=DJutzNge4NlgCS9nrU119ippOdkK_ZK2FQvbDW5Yuf4,10568
50
+ coderio/skills/lion-skills/skills/clarifying-questions/evals/evals.json,sha256=HZoWAimIVIZiUnCfIK8m8l6yI93BGkoqtnUvXeqZl8g,3912
51
+ coderio/skills/lion-skills/skills/code-review/SKILL.md,sha256=1gpgBZcjJkiooGDu6XCp3l0gX9FLp25oSGmG6QxjmSw,8091
52
+ coderio/skills/lion-skills/skills/code-review/evals/evals.json,sha256=y6ftftk_xCWggzVcvwyfytZnfGL98mkemi-Ht0JxZLs,3772
53
+ coderio/skills/lion-skills/skills/commit-message/SKILL.md,sha256=gTedC9Pmx_52uYefvxrlF1dth45YinpBTl7SUK5M5bI,4236
54
+ coderio/skills/lion-skills/skills/commit-message/evals/evals.json,sha256=mqLa0sT9yQBvR4zTuCm1-GY3ekSvOZZxVRueIWMUYq0,889
55
+ coderio/skills/lion-skills/skills/debugging/SKILL.md,sha256=kLvI74dGzpONbCilYqYeAfABZFgbnfb8rxD9raR6-ms,9088
56
+ coderio/skills/lion-skills/skills/debugging/evals/evals.json,sha256=8mGV1m5lLyomxbD7zNt2fUVfnORChGt7YgdjAJnWz_w,4031
57
+ coderio/skills/lion-skills/skills/error-handling/SKILL.md,sha256=tbLc0MO66U_it3IeGWRBZv7DWRAmRuzW9YAJu8rPmJA,5022
58
+ coderio/skills/lion-skills/skills/error-handling/evals/evals.json,sha256=gdXBLvLNsudO6dChYA4feG65UilaQonpv04gPxmOfr8,1186
59
+ coderio/skills/lion-skills/skills/lion-writing-skills/SKILL.md,sha256=fANsRU7gLCnvw3xRfOEUjbBM8naz-KXd4naaYuJW7fg,5980
60
+ coderio/skills/lion-skills/skills/lion-writing-skills/evals/evals.json,sha256=DC1Vh6IHr7TsT5q5j4g51J5EncHZHJbUrc2ZdIhmrpc,865
61
+ coderio/skills/lion-skills/skills/naming/SKILL.md,sha256=a6E8-29vSqFRRNktiubbEEChsAXGhE_vbMBewjz6KBI,4548
62
+ coderio/skills/lion-skills/skills/naming/evals/evals.json,sha256=7V3V6h-78Mxof8qCxC5lThexqFob1s6JWcTYVYP-cBw,881
63
+ coderio/skills/lion-skills/skills/onboarding-unknown-codebase/SKILL.md,sha256=4cPg0_phJodUNvZSgIJ5dKOfC87E9SKgBX2W8QcJcYA,4851
64
+ coderio/skills/lion-skills/skills/onboarding-unknown-codebase/evals/evals.json,sha256=O2klgyXuF7xJ765IymwbCMVcLzH4FrV0YGr6uEauGbA,1064
65
+ coderio/skills/lion-skills/skills/spec-writing/SKILL.md,sha256=OOxWWXW5weBlYmhDYWjYzeBAguNsDcEJbrVWsA97ibA,12322
66
+ coderio/skills/lion-skills/skills/spec-writing/evals/evals.json,sha256=maqYgHYsg5pN0ZZ8JLu5w5nXG62cVjSs4JA7ZEPObro,4554
67
+ coderio/skills/lion-skills/skills/task-breakdown/SKILL.md,sha256=PQ6lkbKrQEy4WgepCkvamnYvIWaAPQ89ZO6G9YVbAtU,11217
68
+ coderio/skills/lion-skills/skills/task-breakdown/evals/evals.json,sha256=Ph1jlDgukA6Y0HwncezXQBNNEMss3_JIo93hfOS4NnI,4499
69
+ coderio/skills/lion-skills/skills/testing/SKILL.md,sha256=zxugv11K-1ihpHd1xrVvtE7zcMAf_iOg3gsLig3D5rU,9620
70
+ coderio/skills/lion-skills/skills/testing/evals/evals.json,sha256=vqNj1S5iiS9JfyyOo9lpVw_IulmjdgXnOwDjxettdrQ,4107
71
+ coderio/skills/lion-skills/skills/verify-and-fix/SKILL.md,sha256=10wOZRBQhsNeRPnDlf4OfSZjXimOOYmQYb-ZAeJPnIg,10453
72
+ coderio/skills/lion-skills/skills/verify-and-fix/evals/evals.json,sha256=W2nrGFJ4hcyr64O4vCW263sRPNr5j3ABg0QUYdEY7Uk,4565
73
+ coderio/tools/__init__.py,sha256=WauD3S1KrsaUn1Bsr9RZaCzx4m_PpdWn9qPEESv8keo,2898
74
+ coderio/tools/base.py,sha256=cSDh5gBb4WfAh5mE5WhlefsMl4vMd707SkW-O4pMS58,2220
75
+ coderio/tools/bash.py,sha256=zk2CvYhc5NpXrsocTk_3VcJXgO71RP_ExwBAb4nC7DA,7142
76
+ coderio/tools/command_policy.py,sha256=2gHsBfRizkSjI1iGq5oFZ87KfPKsGk3RtGQq_acBHxs,14753
77
+ coderio/tools/edit_file.py,sha256=iFVblW_RFFwC8Wet9q9786cHsrcGanFB9vw0lTJCggA,2308
78
+ coderio/tools/glob_tool.py,sha256=xZJnzZDa_XdTmrpS8Tu68LP6ATVxFgBZvptcv7DeINc,649
79
+ coderio/tools/grep_tool.py,sha256=ye54L7d1X_kTkd899D_hu2j4BoWfhcObTtMH0vPEM-c,3158
80
+ coderio/tools/linux_sandbox.py,sha256=5S2qfAQqUfDRPZNeLUytnzZ6BpO-wTodKcRYQqOJMhE,8089
81
+ coderio/tools/list_dir.py,sha256=2lxeGh1VrEg_6IGN1GQdH3bjiCc-p44UPcascSEs_j4,1976
82
+ coderio/tools/multi_edit.py,sha256=Mxxqofl4kjp1BnqjM58bcigDqfH0JCM1n6kgb2pNjZ0,2714
83
+ coderio/tools/note.py,sha256=wYZNDLNdBLPuR1cB8u6b9qRZx1w2IyhsFiUzZXf15xA,2983
84
+ coderio/tools/permission.py,sha256=04vOO2z2irYQTEfmpNHmd90j4SGyiOC1yutjXRo-_Iw,8886
85
+ coderio/tools/read_file.py,sha256=2oItLmw9vaB-SYhiDFVYrhMAPJ7p7CUJ1JWUxF4fCLI,2006
86
+ coderio/tools/sandbox_runner.py,sha256=YpUxHDXFxpSJZVqfUny7dbswy5G4y_g8XRz-3wCH9ac,4928
87
+ coderio/tools/todo.py,sha256=fU0cAvl1eB_hLu2i03NA-SC9h7zaLKE0s505x84NPh8,2320
88
+ coderio/tools/web_fetch.py,sha256=sWhS0MulWtjfTg8WJ9oeFhVHKxaMtmgMki7-7uXe0Is,7928
89
+ coderio/tools/web_search.py,sha256=bFoNtmqrh3JvBGvpo6xTSiE5II-FuiP51bMxZV9emUo,1856
90
+ coderio/tools/win_job.py,sha256=dYCKlSEvXWi33Q-VftNCBbKZE2_ltp_uHx0yIXHn1MI,8501
91
+ coderio/tools/win_sandbox.py,sha256=4rrInelwDLDo8IGkWjiFT_b_Gormn2nQf6ASYgWFoSE,27382
92
+ coderio/tools/write_file.py,sha256=KVLZ1_G0VBIxC9ejBtezXRSHL2gDT4eZTO9mVQk3U-o,761
93
+ coderio-0.4.0.dist-info/METADATA,sha256=YgT1R5IZHEq1iRWS7iGpcQctF47HkGZI9NbHR0gU2w4,27793
94
+ coderio-0.4.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
95
+ coderio-0.4.0.dist-info/entry_points.txt,sha256=W7UKP7W8NlMloF1mvi86WGUshWmfMPBVjrYSOSNwkPw,55
96
+ coderio-0.4.0.dist-info/licenses/LICENSE,sha256=_Hx31iGkyJzw0_BcBPl2jLuPuJxeFg2MS6FVfWyN7aw,1077
97
+ coderio-0.4.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ coderio = coderio.cli.app:main_entry
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 coderio contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.