one-code-extension 0.3.0 → 0.4.0

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 (119) hide show
  1. package/README.md +189 -94
  2. package/docs/guide/README.md +3 -2
  3. package/docs/guide/bring-your-claude-code-setup.md +7 -5
  4. package/docs/guide/configuration.md +7 -5
  5. package/docs/guide/differences-from-claude-code.md +25 -14
  6. package/docs/guide/doctor.md +5 -3
  7. package/docs/guide/hooks.md +20 -6
  8. package/docs/guide/installation.md +62 -12
  9. package/docs/guide/permissions-modes-and-auto-mode.md +46 -28
  10. package/docs/guide/providers-and-models.md +12 -10
  11. package/docs/guide/reference.md +9 -4
  12. package/docs/guide/sessions-and-context.md +23 -3
  13. package/docs/guide/skills-plugins-and-mcp.md +7 -5
  14. package/docs/guide/subagents-and-workflows.md +13 -11
  15. package/docs/guide/tasks-and-background-work.md +10 -8
  16. package/docs/guide/terminal-interface.md +7 -5
  17. package/docs/guide/tools.md +29 -5
  18. package/docs/guide/troubleshooting.md +26 -14
  19. package/docs/guide/windows.md +184 -0
  20. package/extensions/auto-mode/actions.ts +3 -1
  21. package/extensions/auto-mode/paths.ts +21 -23
  22. package/extensions/auto-mode/safety-floor.ts +44 -6
  23. package/extensions/auto-mode/shell-analysis.ts +25 -10
  24. package/extensions/auto-mode/transcript.ts +15 -5
  25. package/extensions/background/index.ts +83 -34
  26. package/extensions/background/monitor-batch.ts +7 -5
  27. package/extensions/background/wakeup.ts +18 -24
  28. package/extensions/bash/background.ts +19 -10
  29. package/extensions/bash/guards.ts +36 -16
  30. package/extensions/bash/index.ts +36 -166
  31. package/extensions/branding/index.ts +35 -4
  32. package/extensions/btw/index.ts +207 -0
  33. package/extensions/btw/panel.ts +179 -0
  34. package/extensions/btw/prompt.ts +45 -0
  35. package/extensions/clear/index.ts +15 -0
  36. package/extensions/compaction/fit.ts +9 -6
  37. package/extensions/doctor/build.ts +22 -2
  38. package/extensions/doctor/dependencies.ts +63 -31
  39. package/extensions/doctor/fix-prompt.ts +12 -4
  40. package/extensions/doctor/index.ts +1 -0
  41. package/extensions/doctor/models.ts +2 -1
  42. package/extensions/doctor/report.ts +2 -3
  43. package/extensions/doctor/update-lookup.ts +19 -11
  44. package/extensions/effort/index.ts +2 -1
  45. package/extensions/footer/footer-line.ts +19 -0
  46. package/extensions/footer/index.ts +25 -5
  47. package/extensions/hooks/executor.ts +84 -18
  48. package/extensions/hooks/index.ts +1 -0
  49. package/extensions/hooks/matcher.ts +23 -9
  50. package/extensions/hooks/settings.ts +15 -0
  51. package/extensions/lib/branch-restore.ts +12 -0
  52. package/extensions/lib/claude-context.ts +2 -3
  53. package/extensions/lib/claude-settings.ts +19 -0
  54. package/extensions/lib/command-launch.ts +71 -0
  55. package/extensions/lib/deferred.ts +173 -33
  56. package/extensions/lib/git.ts +16 -0
  57. package/extensions/lib/keys.ts +38 -0
  58. package/extensions/lib/local-command.ts +112 -0
  59. package/extensions/lib/model-facts.generated.json +263 -68
  60. package/extensions/lib/model-policy.ts +13 -0
  61. package/extensions/lib/model-tier.ts +16 -5
  62. package/extensions/lib/notifications.ts +547 -53
  63. package/extensions/lib/paths.ts +130 -2
  64. package/extensions/lib/pi-ai-estimate.ts +57 -26
  65. package/extensions/lib/pi-version.ts +1 -1
  66. package/extensions/lib/process-tree.ts +131 -5
  67. package/extensions/lib/reminders.ts +80 -27
  68. package/extensions/lib/scratchpad.ts +11 -10
  69. package/extensions/lib/shell-spawn.ts +298 -0
  70. package/extensions/lib/shell-tool.ts +252 -0
  71. package/extensions/lib/shell-tools.ts +13 -0
  72. package/extensions/lib/side-call.ts +76 -0
  73. package/extensions/lib/tui-render.ts +62 -11
  74. package/extensions/lib/update-check.mjs +155 -0
  75. package/extensions/lib/usage-bus.ts +1 -1
  76. package/extensions/lib/which.ts +62 -0
  77. package/extensions/lib/worktree-channel.ts +18 -0
  78. package/extensions/lib/worktree-isolation.ts +2 -1
  79. package/extensions/lsp/client.ts +14 -3
  80. package/extensions/lsp/index.ts +12 -5
  81. package/extensions/lsp/install-hints.ts +33 -3
  82. package/extensions/lsp/plugin-servers.ts +2 -2
  83. package/extensions/lsp/servers.ts +29 -7
  84. package/extensions/mcp/index.ts +3 -2
  85. package/extensions/memory/entries.ts +9 -6
  86. package/extensions/memory/index.ts +3 -2
  87. package/extensions/memory/open-external.ts +4 -1
  88. package/extensions/model-default/index.ts +21 -2
  89. package/extensions/permissions/index.ts +57 -28
  90. package/extensions/permissions/matcher.ts +120 -33
  91. package/extensions/permissions/modes.ts +14 -6
  92. package/extensions/permissions/powershell-rules.ts +549 -0
  93. package/extensions/permissions/session-grant.ts +9 -9
  94. package/extensions/plugins/index.ts +3 -2
  95. package/extensions/plugins/install/install.ts +1 -1
  96. package/extensions/powershell/description.ts +139 -0
  97. package/extensions/powershell/guards.ts +91 -0
  98. package/extensions/powershell/index.ts +89 -0
  99. package/extensions/powershell/policy.ts +91 -0
  100. package/extensions/recap/index.ts +10 -24
  101. package/extensions/recap/prompt.ts +3 -3
  102. package/extensions/session-title/index.ts +120 -0
  103. package/extensions/session-title/title.ts +111 -0
  104. package/extensions/skill/index.ts +40 -18
  105. package/extensions/skill/invoke.ts +1 -0
  106. package/extensions/subagents/hand-back-review.ts +10 -12
  107. package/extensions/subagents/index.ts +221 -78
  108. package/extensions/subagents/model-select.ts +75 -7
  109. package/extensions/system-prompt/environment.ts +14 -1
  110. package/extensions/system-reminder/index.ts +9 -0
  111. package/extensions/tasks/index.ts +2 -1
  112. package/extensions/tool-search/index.ts +41 -20
  113. package/extensions/workflow/agent-session.ts +6 -4
  114. package/extensions/workflow/index.ts +28 -5
  115. package/extensions/worktree/guards.ts +5 -4
  116. package/extensions/worktree/index.ts +15 -2
  117. package/extensions/worktree/rewrite.ts +17 -0
  118. package/package.json +7 -4
  119. package/types/app.d.ts +18 -2
@@ -1,5 +1,7 @@
1
1
  # Check your setup with doctor
2
2
 
3
+ [← One Code user guide](README.md)
4
+
3
5
  `/doctor` is One Code's health check, modelled on Claude Code's. It measures
4
6
  your setup, reports what a session will use, and can have the model repair
5
7
  the findings.
@@ -18,7 +20,7 @@ the findings.
18
20
  ## What the report contains
19
21
 
20
22
  1. **Installation.** Whether you run the bundled app or the extension on
21
- your own pi, the pi version and whether it is in the tested range, the
23
+ your own pi, the pi version and whether it's in the tested range, the
22
24
  Node version and platform, pi's agent directory, One Code's state
23
25
  directory, where Claude Code configuration is read from, and whether a
24
26
  newer One Code is available.
@@ -47,12 +49,12 @@ Findings are listed first, errors before warnings, each with a suggested
47
49
  fix. The report is "ready" when at least one provider works, a model is
48
50
  selected, and there are no errors.
49
51
 
50
- In the panel, press **f** to run the checkup on the report you are reading.
52
+ In the panel, press **f** to run the checkup on the report you're reading.
51
53
 
52
54
  ## Model presets
53
55
 
54
56
  A preset sets the main model, the subagent model, and the classifier model
55
- together, from the provider you are connected to. Only current-generation,
57
+ together, from the provider you're connected to. Only current-generation,
56
58
  priced models that support tool calls are considered.
57
59
 
58
60
  | Preset | Main model | Subagents | Classifier |
@@ -1,5 +1,7 @@
1
1
  # Hooks
2
2
 
3
+ [← One Code user guide](README.md)
4
+
3
5
  Hooks are shell commands that run at fixed points in a session. One Code
4
6
  runs Claude Code's command hooks from your existing settings files, with
5
7
  the same input, output, and exit-code contract, so hooks you wrote for
@@ -39,8 +41,8 @@ Only command hooks are supported. Hook entries of type `http`, `prompt`, or
39
41
  | `PostCompact` | After context compaction, with the summary. |
40
42
 
41
43
  Claude Code's `Notification`, `SubagentStop`, and `PermissionRequest`
42
- events are not supported. pi has no event that carries the notification
43
- concept, and the other two are not implemented.
44
+ events aren't supported. pi has no event that carries the notification
45
+ concept, and the other two aren't implemented.
44
46
 
45
47
  Hooks also run inside subagents: a `PreToolUse` hook that blocks a command
46
48
  blocks it in a subagent too.
@@ -55,7 +57,7 @@ The hook's standard input is a JSON object with these fields:
55
57
  | Field | Present | Meaning |
56
58
  |---|---|---|
57
59
  | `session_id` | Always | The session id. |
58
- | `transcript_path` | Always | The session file, or an empty string when there is none. |
60
+ | `transcript_path` | Always | The session file, or an empty string when there's none. |
59
61
  | `cwd` | Always | The working directory. |
60
62
  | `hook_event_name` | Always | The event name from the table. |
61
63
  | `tool_name`, `tool_input` | Tool events | The tool and its arguments. Tool names are One Code's names; see [Claude Code tool names](tools.md#claude-code-tool-names). |
@@ -90,7 +92,7 @@ Envelope fields honored in a JSON result:
90
92
  |---|---|
91
93
  | `continue: false` | Blocks, with `stopReason` as the reason. |
92
94
  | `decision: "block"` | Blocks, with `reason` as the reason. |
93
- | `hookSpecificOutput.permissionDecision` | `"deny"` and `"ask"` both block, with `permissionDecisionReason`. `"allow"` is read but never honored; a hook cannot pre-approve an action, and the permission gate still runs. |
95
+ | `hookSpecificOutput.permissionDecision` | `"deny"` and `"ask"` both block, with `permissionDecisionReason`. `"allow"` is read but never honored; a hook can't pre-approve an action, and the permission gate still runs. |
94
96
  | `hookSpecificOutput.updatedInput` | Replaces the tool's input (`PreToolUse`). |
95
97
  | `hookSpecificOutput.updatedToolResult` | Replaces the tool's result (`PostToolUse`). |
96
98
  | `hookSpecificOutput.additionalContext` | Adds text to the model's context. |
@@ -105,5 +107,17 @@ Set `CC_HOOKS_DEBUG=1` before launching to print each hook dispatch and its
105
107
  outcome to stderr. Decisions are also appended to
106
108
  `~/.onecode/hooks/hooks-decisions.jsonl` while the variable is set.
107
109
 
108
- Hooks run through `/bin/sh`. On native Windows this path does not exist,
109
- which is one reason native Windows is unsupported; use WSL.
110
+ ## Which shell runs a hook
111
+
112
+ Hooks run in bash, as in Claude Code: `/bin/bash` on macOS and Linux, Git
113
+ Bash on Windows (`CLAUDE_CODE_GIT_BASH_PATH` points at a different bash;
114
+ a value that isn't a bash or sh binary is ignored with a warning). A hook
115
+ can ask for PowerShell instead with Claude Code's `shell` field:
116
+
117
+ ```json
118
+ { "type": "command", "command": "Get-Content $env:TEMP\\hook.log", "shell": "powershell" }
119
+ ```
120
+
121
+ On a Windows machine without Git for Windows, hooks default to PowerShell.
122
+ Matchers accept `Bash|PowerShell` and `Bash,PowerShell` to cover both shell
123
+ tools. See [Windows](windows.md).
@@ -1,19 +1,24 @@
1
1
  # Install One Code
2
2
 
3
+ [← One Code user guide](README.md)
4
+
3
5
  One Code ships as two npm packages from one repository. Choose the one that
4
6
  fits how you already work.
5
7
 
6
8
  | You | Install | What you get |
7
9
  |---|---|---|
8
10
  | New to this, or you want the simplest setup | `npm install -g @one-ai/one-code` | The bundled app: its own `onecode` command, a pinned version of the pi coding agent inside it, and its state kept in `~/.onecode`. It coexists with any `pi` you already have. |
11
+ | On Windows without Node.js | `powershell -c "irm https://raw.githubusercontent.com/IsuruMaduranga/one-code/master/install.ps1 \| iex"` | The bundled app, with Node.js fetched for you when the machine has none. See [Install on Windows](#install-on-windows). |
9
12
  | Already running [pi](https://github.com/earendil-works/pi) | `pi install npm:one-code-extension` | The extensions only. They run on your existing pi. One Code's own state still goes to `~/.onecode`; pi's own files stay under your pi agent directory (`~/.pi/agent`). |
10
13
 
11
14
  ## Requirements
12
15
 
13
16
  - Node.js 22.19 or later. The app refuses to start on older versions,
14
17
  because pi crashes at import time there.
15
- - macOS or Linux. Windows Subsystem for Linux (WSL) works the same way.
16
- Native Windows is untested and unsupported.
18
+ - macOS, Linux, or Windows. Windows Subsystem for Linux (WSL) works like
19
+ Linux. On native Windows, One Code takes Claude Code's shape: Git for
20
+ Windows is recommended but optional, and PowerShell is the primary shell
21
+ tool. See [Windows](windows.md) for what is verified and what isn't.
17
22
  - `git`. Optional: `rg` (ripgrep) for faster search, the GitHub CLI for the
18
23
  pull-request marker in the footer, and a language server for your
19
24
  language (see
@@ -27,7 +32,7 @@ cd your-project
27
32
  onecode
28
33
  ```
29
34
 
30
- On the first run there is no provider yet: the banner shows `model none`.
35
+ On the first run there's no provider yet: the banner shows `model none`.
31
36
  Run `/login` inside One Code to connect a provider, or set a provider key
32
37
  in your environment before launching. For a free option, see
33
38
  [Providers and models](providers-and-models.md).
@@ -36,15 +41,55 @@ The first run also seeds pi's settings under `~/.onecode/agent/` with the
36
41
  `onecode` theme, quiet startup, and full-screen mode. It never overrides a
37
42
  value you change later.
38
43
 
44
+ ## Install on Windows
45
+
46
+ Open Windows Terminal or PowerShell and run:
47
+
48
+ ```powershell
49
+ powershell -c "irm https://raw.githubusercontent.com/IsuruMaduranga/one-code/master/install.ps1 | iex"
50
+ ```
51
+
52
+ The script looks for Node.js 22.19 or later on your PATH. When there is
53
+ none, it downloads the current Node LTS for your CPU from nodejs.org as a
54
+ zip, checks it against nodejs.org's published checksums, unpacks it under
55
+ `%LOCALAPPDATA%\onecode\node`, and adds that folder to your user PATH.
56
+ Nothing is installed system-wide and no Windows installer runs. It then
57
+ runs `npm install -g @one-ai/one-code` and makes sure the `onecode` command
58
+ is on your PATH. Open a new terminal afterwards so it sees the PATH change.
59
+
60
+ The script also tells you when `git` is missing. One Code runs without it,
61
+ but Git for Windows gives you the branch in the footer, `/init`, worktrees,
62
+ and a bash tool for the model next to PowerShell. Install it with
63
+ `winget install --id Git.Git -e`, or set `ONECODE_INSTALL_GIT=1` before
64
+ running the script to have it do that for you.
65
+
66
+ If you already have Node.js 22.19 or later, the plain npm command works the
67
+ same on Windows as anywhere else:
68
+
69
+ ```powershell
70
+ npm install -g @one-ai/one-code
71
+ ```
72
+
73
+ The script's knobs are environment variables, because a piped script
74
+ cannot take parameters: `ONECODE_INSTALL_NODE=1` downloads the standalone
75
+ Node even when one exists, `ONECODE_NODE_VERSION` pins the version it
76
+ downloads, and `ONECODE_NO_PATH_UPDATE=1` leaves your PATH alone and prints
77
+ what to add. Read the script before running it if you like; it is the
78
+ `install.ps1` at the root of the repository.
79
+
80
+ Windows Subsystem for Linux (WSL) is Linux: use the npm or Homebrew route
81
+ inside the distribution. For what works on native Windows, see
82
+ [Windows](windows.md).
83
+
39
84
  ## Install with Homebrew
40
85
 
41
86
  Homebrew installs Node for you, so this route has no separate Node step:
42
87
 
43
88
  ```bash
44
- brew install isurumaduranga/one-ai/one-code
89
+ brew install isurumaduranga/one-ai/onecode
45
90
  ```
46
91
 
47
- The formula is named `one-code`; the command it installs is `onecode`.
92
+ The formula and the command it installs are both named `onecode`.
48
93
  Homebrew refuses npm packages published less than a day ago, so a release
49
94
  becomes installable this way about a day after it appears on npm.
50
95
 
@@ -57,12 +102,12 @@ pi install npm:one-code-extension
57
102
  ```
58
103
 
59
104
  Use `pi` in place of `onecode` for every command in this guide. The
60
- extension is tested against pi 0.83 through 0.85 and warns at startup when
105
+ extension is tested against pi 0.83 through 0.86 and warns at startup when
61
106
  your pi is outside that range. Full-screen mode is opt-in on your own pi;
62
107
  see [Full-screen mode and themes](configuration.md#full-screen-mode-and-themes).
63
108
 
64
109
  A few interface refinements are applied only by the bundled app, because
65
- they patch pi internals the extension API cannot reach: a clean exit that
110
+ they patch pi internals the extension API can't reach: a clean exit that
66
111
  erases the screen in regular mode, and suppression of pi's "Operation
67
112
  aborted" line when you interrupt a reply. Everything else is identical.
68
113
 
@@ -97,10 +142,13 @@ notice with the matching upgrade command when a newer version exists:
97
142
 
98
143
  ```bash
99
144
  npm install -g @one-ai/one-code # npm installs
100
- brew upgrade one-code # Homebrew installs
145
+ brew upgrade onecode # Homebrew installs
101
146
  ```
102
147
 
103
- Set `ONECODE_NO_UPDATE_CHECK=1` to skip the check; `--offline` skips it too.
148
+ A Homebrew install sees the notice a day after the npm release, because
149
+ Homebrew refuses packages younger than that and `brew upgrade` would find
150
+ nothing sooner. Set `ONECODE_NO_UPDATE_CHECK=1` to skip the check;
151
+ `--offline` skips it too.
104
152
  On your own pi, update with `pi update --extensions`.
105
153
 
106
154
  Both packages are released together with the same version number.
@@ -108,12 +156,14 @@ Both packages are released together with the same version number.
108
156
  ## Uninstall
109
157
 
110
158
  ```bash
111
- npm uninstall -g @one-ai/one-code # or: brew uninstall one-code
159
+ npm uninstall -g @one-ai/one-code # or: brew uninstall onecode
112
160
  rm -rf ~/.onecode # One Code's state, including pi's under the app
113
161
  ```
114
162
 
115
- On your own pi, run `pi remove one-code-extension` (or remove the package
116
- entry from pi's settings). Removing `~/.onecode` deletes One Code's
163
+ If the Windows script fetched Node.js for you, delete `%LOCALAPPDATA%\onecode`
164
+ too and remove that folder from your user PATH. On your own pi, run
165
+ `pi remove one-code-extension` (or remove the package entry from pi's
166
+ settings). Removing `~/.onecode` deletes One Code's
117
167
  settings, approvals, plan files, and, under the bundled app, pi's sessions
118
168
  and credentials. Memory files stay in `~/.claude/projects/`, because they
119
169
  are shared with Claude Code.
@@ -1,5 +1,7 @@
1
1
  # Permissions, modes, and auto mode
2
2
 
3
+ [← One Code user guide](README.md)
4
+
3
5
  Every tool call the model makes passes through One Code's permission gate
4
6
  before it runs. This page explains the permission modes, how to switch
5
7
  between them, how to write rules, what the approval prompt offers, and how
@@ -16,7 +18,7 @@ For each tool call, the gate checks the following in order:
16
18
  1. **Protected paths.** A write to a protected file or directory (see
17
19
  [Protected paths](#protected-paths)) is never approved automatically. In
18
20
  auto mode it goes to the classifier; in other modes it prompts you.
19
- Allow rules do not cover protected paths.
21
+ Allow rules don't cover protected paths.
20
22
  2. **`deny` rules.** A matching `deny` rule blocks the call. `deny` always
21
23
  wins.
22
24
  3. **`ask` rules.** A matching `ask` rule prompts you, even in a mode that
@@ -81,6 +83,18 @@ contains command substitution (`$(…)` or backticks), `eval`, `exec`, a pipe
81
83
  into an interpreter, or a base64 decode is never covered by a prefix or
82
84
  wildcard `allow` rule.
83
85
 
86
+ ### PowerShell rule patterns
87
+
88
+ `PowerShell(...)` rules have the same shape and follow Claude Code's
89
+ PowerShell matching: aliases are canonicalized on both sides
90
+ (`PowerShell(Remove-Item:*)` catches `rm`, `del`, and `ri`), cmdlet names
91
+ are case-insensitive, a line is split on `|`, `;`, `&&`, `||`, and newlines
92
+ outside quotes and here-strings, an `allow` rule must cover every statement,
93
+ and a `deny` or `ask` rule fires on any statement. A `$(…)` subexpression, a
94
+ backtick escape, a script block, the `&`/`.` call operators,
95
+ `Invoke-Expression`, or an encoded command keeps a wildcard `allow` from
96
+ applying. Details in [Windows](windows.md#permission-rules).
97
+
84
98
  ### Add a rule during a session
85
99
 
86
100
  To add an allow rule for the current repository, run:
@@ -96,7 +110,7 @@ Add `global` at the end to save it for every repository instead:
96
110
  ```
97
111
 
98
112
  To review the current mode and every loaded rule, including which project
99
- rules are trusted and which rules could not be parsed, run `/permissions`.
113
+ rules are trusted and which rules couldn't be parsed, run `/permissions`.
100
114
 
101
115
  Rules One Code adds are saved under `~/.onecode`, never under `~/.claude`.
102
116
 
@@ -104,7 +118,7 @@ Rules One Code adds are saved under `~/.onecode`, never under `~/.claude`.
104
118
 
105
119
  A mode sets the default answer for actions no rule covers. **Auto is the
106
120
  default**, matching Claude Code: a classifier approves routine actions and
107
- stops risky ones, so you are not prompted for every step.
121
+ stops risky ones, so you're not prompted for every step.
108
122
 
109
123
  | Mode | Badge | What it does |
110
124
  |---|---|---|
@@ -118,10 +132,10 @@ stops risky ones, so you are not prompted for every step.
118
132
  The current badge appears in the banner and is announced when the mode
119
133
  changes.
120
134
 
121
- ### Cycle modes with ctrl+q
135
+ ### Cycle modes with ctrl+q (alt+m on Windows and WSL)
122
136
 
123
- Press **ctrl+q** to cycle through manual, accept edits, plan, and auto.
124
- Two modes join the cycle only under conditions:
137
+ Press **ctrl+q** to cycle through manual, accept edits, plan, and auto. On
138
+ Windows and WSL the key is **alt+m**. Two modes join the cycle only under certain conditions:
125
139
 
126
140
  - **Auto** appears only when a model that can run the classifier is
127
141
  available. With no provider connected, the cycle skips it.
@@ -130,10 +144,11 @@ Two modes join the cycle only under conditions:
130
144
  **Don't ask** is never in the cycle; reach it with the `--permission-mode`
131
145
  flag or a settings file.
132
146
 
133
- Claude Code cycles modes with shift+tab. One Code cannot use that key
147
+ Claude Code cycles modes with shift+tab. One Code can't use that key
134
148
  because pi reserves it for the reasoning-effort dial. On Windows and WSL,
135
- pi's own default keybindings also use ctrl+q to queue a follow-up message.
136
- If the two conflict there, change pi's binding in its keybindings file.
149
+ pi's own default keybindings use ctrl+q to queue a follow-up message, so
150
+ One Code cycles modes with alt+m there instead. The footer badge and the
151
+ startup hints name whichever key applies on your machine.
137
152
 
138
153
  ### Choose the starting mode
139
154
 
@@ -160,12 +175,12 @@ Claude Code settings files. Merge this into the existing object:
160
175
  }
161
176
  ```
162
177
 
163
- The scopes are not equal:
178
+ The scopes aren't equal:
164
179
 
165
180
  - **User scope** (`~/.claude/settings.json`) and **managed settings** can
166
181
  set any mode.
167
182
  - **Project scope** (`.claude/settings.json` and `.claude/settings.local.json`)
168
- can set `default`, `acceptEdits`, `plan`, or `dontAsk`. It cannot set
183
+ can set `default`, `acceptEdits`, `plan`, or `dontAsk`. It can't set
169
184
  `auto` or `bypassPermissions`; a checked-in file must not be able to turn
170
185
  off approvals for whoever clones it.
171
186
  - A `defaultMode` in `~/.onecode/settings.json` has no effect.
@@ -198,7 +213,7 @@ and these choices:
198
213
  - **No, tell the agent what to do differently.** Deny it, with an optional
199
214
  note that is passed to the model as the reason.
200
215
 
201
- The "don't ask again" option is not offered for protected paths, for writes
216
+ The "don't ask again" option isn't offered for protected paths, for writes
202
217
  that the auto-mode safety floor caught, or in auto mode. Session grants never
203
218
  apply in auto mode and are cleared when the session ends.
204
219
 
@@ -214,7 +229,10 @@ Reads and edits are confined to the working directory by default:
214
229
  mode, and is denied in don't-ask mode.
215
230
  - Accept-edits mode approves edits only inside the working directory.
216
231
  - The harness's own session directories count as inside: the auto-memory
217
- folder, the session scratchpad, persisted tool output, and the plan file.
232
+ folder, the session scratchpad, persisted tool output, the plan file, and
233
+ this project's own session transcripts (with auto mode's decision log next
234
+ to them), which is what `/doctor` reads. Other projects' transcripts are
235
+ outside, as they are for Claude Code.
218
236
 
219
237
  Paths are compared after resolving symlinks, so a symlink inside the project
220
238
  that points outside it counts as outside.
@@ -226,7 +244,7 @@ check and always goes to the classifier.
226
244
  ## Protected paths
227
245
 
228
246
  Writes to these paths are never approved automatically in any mode other
229
- than bypass, and allow rules do not cover them.
247
+ than bypass, and allow rules don't cover them.
230
248
 
231
249
  Protected directories, including everything inside them:
232
250
 
@@ -285,7 +303,7 @@ code. Only read-only tools and edits to one plan file are available.
285
303
  `plan` agent, and then write the plan.
286
304
  - You can read and edit the plan file yourself while the model works.
287
305
 
288
- Enter plan mode by cycling to it with **ctrl+q**, by starting with
306
+ Enter plan mode by cycling to it with **ctrl+q** (**alt+m** on Windows and WSL), by starting with
289
307
  `--permission-mode plan`, or by asking the model to plan first (it can call
290
308
  `enter_plan_mode` itself).
291
309
 
@@ -300,11 +318,11 @@ shows the plan. Nothing runs until you choose. The choices are:
300
318
  5. **Keep planning.** No mode change; the model refines the plan file.
301
319
 
302
320
  The initial highlight is the option that restores your previous mode, or
303
- manual mode when that is not offered. It never lands on a more permissive
321
+ manual mode when that isn't offered. It never lands on a more permissive
304
322
  option by default. Press the number of a choice to pick it directly, or
305
323
  **Esc** to keep planning.
306
324
 
307
- In a non-interactive run there is no one to approve, so `exit_plan_mode`
325
+ In a non-interactive run there's no one to approve, so `exit_plan_mode`
308
326
  refuses and the session stays in plan mode with the plan on disk.
309
327
 
310
328
  ## Auto mode
@@ -317,20 +335,20 @@ classifier.
317
335
 
318
336
  - Actions a deterministic analysis proves safe. Read-only shell commands
319
337
  inside the working directory are the common case. This analysis can only
320
- ever conclude "safe"; anything it cannot parse or recognize goes to the
338
+ ever conclude "safe"; anything it can't parse or recognize goes to the
321
339
  classifier rather than through.
322
340
  - Edits and writes to files inside the project that are not credential
323
341
  files, not protected paths, and not files that run code on their own
324
342
  (build wrappers, CI workflows, editor auto-run configuration).
325
343
  - Deleting or resetting files inside the project **when git can recover
326
344
  them**. A tracked, committed file can be restored, so removing it is
327
- approved. An untracked or modified file cannot, so removing it goes to
345
+ approved. An untracked or modified file can't, so removing it goes to
328
346
  the classifier. Claude Code trusts the whole project directory here; One
329
347
  Code checks recoverability first.
330
348
 
331
349
  ### What goes to the classifier
332
350
 
333
- Everything else: destructive commands git cannot undo, anything that
351
+ Everything else: destructive commands git can't undo, anything that
334
352
  reaches outside the project, network-affecting commands, writes to
335
353
  protected paths, and reads outside the working directory.
336
354
 
@@ -342,21 +360,21 @@ The classifier is Claude Code's two-stage ruleset, embedded verbatim:
342
360
  stated intent and the allow list, and either approves or blocks with a
343
361
  named rule.
344
362
 
345
- Verdicts are checked before they are acted on. A block must cite a real
363
+ Verdicts are checked before they're acted on. A block must cite a real
346
364
  rule from the ruleset. An approval based on intent must quote your own
347
- words from the conversation. A classifier that cannot be reached, times
348
- out, or returns something unparseable blocks the action; a gate that cannot
365
+ words from the conversation. A classifier that can't be reached, times
366
+ out, or returns something unparseable blocks the action; a gate that can't
349
367
  consult its classifier approves nothing.
350
368
 
351
369
  A blocked action is reported to the model with the reason so it can choose
352
- a safer route. You are not prompted per action while auto mode runs. After
370
+ a safer route. You're not prompted per action while auto mode runs. After
353
371
  repeated blocks in a row, auto mode pauses and the next action prompts you;
354
372
  approving it resumes auto mode.
355
373
 
356
374
  Allow rules that are broad enough to pre-approve arbitrary execution, such
357
375
  as `Bash(*)`, a wildcarded interpreter, or a rule that allows delegation to
358
- subagents, are suspended in auto mode so they cannot bypass the classifier.
359
- Session grants from the approval prompt do not apply in auto mode either.
376
+ subagents, are suspended in auto mode so they can't bypass the classifier.
377
+ Session grants from the approval prompt don't apply in auto mode either.
360
378
 
361
379
  ### The classifier model
362
380
 
@@ -427,13 +445,13 @@ One Code's security model is the permission gate plus auto mode, not an
427
445
  assumption that the model behaves. Read these facts before you leave a
428
446
  session unattended:
429
447
 
430
- - **There is no operating-system sandbox.** The gate decides whether a
448
+ - **There's no operating-system sandbox.** The gate decides whether a
431
449
  command runs; nothing constrains what an approved command can touch. For
432
450
  an OS-level wall, run One Code inside a container. The gate and the
433
451
  container work together.
434
452
  - **Bypass mode bypasses everything**, including protected paths. Claude
435
453
  Code keeps its protected-path checks active even under
436
- `--dangerously-skip-permissions`; One Code does not.
454
+ `--dangerously-skip-permissions`; One Code doesn't.
437
455
  - **Auto mode is the default without a first-run consent step**, and
438
456
  without the OS sandbox Claude Code pairs its own auto default with.
439
457
  - **A weak classifier is a weaker boundary.** Automatic selection applies a
@@ -1,5 +1,7 @@
1
1
  # Providers and models
2
2
 
3
+ [← One Code user guide](README.md)
4
+
3
5
  One Code talks to each model provider natively, so you choose the provider
4
6
  and the model, and you can change either one during a session. This page
5
7
  covers connecting a provider, storing a key, switching models, how One Code
@@ -31,8 +33,8 @@ Two providers hand out free models you can try at no cost:
31
33
  a key, or sign in from inside One Code with no key copying. Free models
32
34
  carry a `:free` suffix, such as `nvidia/nemotron-3-ultra-550b-a55b:free`.
33
35
 
34
- Credentials are stored by pi in its agent directory (`~/.onecode/agent/`
35
- under the bundled app). `/logout` removes them.
36
+ pi stores credentials in its agent directory (`~/.onecode/agent/` under
37
+ the bundled app). `/logout` removes them.
36
38
 
37
39
  ## Store keys as environment variables
38
40
 
@@ -100,10 +102,10 @@ otherwise to the matching class within your provider (`haiku` the cheapest
100
102
  capable model, `sonnet` the cheapest Sonnet-class model, `opus` and `fable`
101
103
  your main model). They never switch providers.
102
104
 
103
- Capability is judged by tier (see the next section). Models are excluded
104
- when they cannot call tools, have no price, or are a generation behind: a
105
- model released more than a year after its vendor's newest is demoted one
106
- tier, and one more than two years behind is never picked automatically.
105
+ Capability is judged by tier (see the next section). One Code excludes
106
+ models that can't call tools, have no price, or are a generation behind: a
107
+ model released more than a year after its vendor's newest drops one tier,
108
+ and one more than two years behind never gets picked automatically.
107
109
  Provider aliases such as `:free` or `:online` variants are skipped.
108
110
 
109
111
  ### Measured selection with Artificial Analysis
@@ -148,8 +150,8 @@ the system prompt to match:
148
150
  | Cheap | Haiku-class models and comparable "flash", "mini", or "small" models. | The verbose prompt Claude Code gives Haiku. |
149
151
  | Tiny | Sub-Haiku models. | The verbose prompt plus extra scaffolding and the `grep`, `find`, and `ls` tools. |
150
152
 
151
- The tier is derived from the model's name, release date, and price. You do
152
- not configure it; set `CC_PROMPT_TIER` to force one when you want to
153
+ The tier is derived from the model's name, release date, and price. You
154
+ don't configure it; set `CC_PROMPT_TIER` to force one when you want to
153
155
  experiment. `/doctor report` shows the tier in use.
154
156
 
155
157
  ## Web search on providers without a search API
@@ -161,7 +163,7 @@ API, in this order:
161
163
 
162
164
  1. **Brave Search**, when `BRAVE_SEARCH_API_KEY` is set.
163
165
  2. **Tavily**, when `TAVILY_API_KEY` is set.
164
- 3. **Exa's free keyless endpoint**, when neither key is set. It is
166
+ 3. **Exa's free keyless endpoint**, when neither key is set. It's
165
167
  rate-limited and best-effort, so One Code warns you the first time a
166
168
  session uses it and labels every result that came from it.
167
169
 
@@ -187,7 +189,7 @@ so. Web fetch works on every provider; it never depends on a search API.
187
189
  - Some models reject request options others accept (a temperature, a
188
190
  reasoning setting). One Code sends minimal options to its side calls for
189
191
  this reason, and a side call that still fails does so loudly: a
190
- classifier that cannot answer blocks the action; a reader that fails
192
+ classifier that can't answer blocks the action; a reader that fails
191
193
  returns the raw page.
192
194
  - Interactive sessions request the provider's extended prompt cache (one
193
195
  hour on Anthropic). Subagents and one-shot runs use the short default.
@@ -1,5 +1,7 @@
1
1
  # Command and keyboard reference
2
2
 
3
+ [← One Code user guide](README.md)
4
+
3
5
  A lookup for every slash command, keyboard shortcut, command-line flag,
4
6
  environment variable, and file location. Each entry points to the page
5
7
  that explains it.
@@ -47,7 +49,7 @@ that explains it.
47
49
  | `/loop status`, `/loop stop` | Report or end the loop. | |
48
50
  | `/tools-deferred` | List deferred tools and whether each is loaded. | [Tools](tools.md#eager-and-deferred-tools) |
49
51
  | `/init` | Have the model write a `CLAUDE.md` for the project. | [CLAUDE.md](bring-your-claude-code-setup.md#project-instructions-claudemd) |
50
- | `/clear` | Start a new session (pi's `/new`). | [Sessions](sessions-and-context.md#start-over) |
52
+ | `/clear` | Start a new session (pi's `/new`); the model is told. | [Sessions](sessions-and-context.md#start-over) |
51
53
  | `/exit` | Quit (pi's `/quit`). | |
52
54
 
53
55
  ### pi commands
@@ -83,7 +85,7 @@ These come from pi and are available in every One Code session.
83
85
 
84
86
  | Shortcut | What it does |
85
87
  |---|---|
86
- | **ctrl+q** | Cycle the permission mode: manual, accept edits, plan, auto. |
88
+ | **ctrl+q** (**alt+m** on Windows and WSL) | Cycle the permission mode: manual, accept edits, plan, auto. |
87
89
  | **↓** (empty editor) | Focus the panel below the editor: background shells, then subagents, then workflows. |
88
90
  | **ctrl+x** then **ctrl+k** | Stop every running agent (in the subagent panel). |
89
91
  | **x** | Stop the selected agent, shell, or workflow (in a panel). |
@@ -122,7 +124,7 @@ Rebind keys in pi's keybindings file; see pi's documentation.
122
124
  ## Command-line flags
123
125
 
124
126
  `onecode` forwards every flag to pi except `--version` and `doctor`. On the
125
- extension installation, use `pi` in place of `onecode`.
127
+ extension install, use `pi` in place of `onecode`.
126
128
 
127
129
  | Flag | What it does |
128
130
  |---|---|
@@ -157,7 +159,7 @@ Set these before launching.
157
159
  |---|---|
158
160
  | `ONECODE_STATE_DIR` | Where One Code keeps its state (default `~/.onecode`). Independent of pi's agent directory. |
159
161
  | `ONECODE_NO_UPDATE_CHECK=1` | Skip the daily update check. |
160
- | `ONECODE_DEBUG=1` | Report when a pi-internal patch in the bundled app did not apply. |
162
+ | `ONECODE_DEBUG=1` | Report when a pi-internal patch in the bundled app didn't apply. |
161
163
  | `AA_API_KEY` | Artificial Analysis key for measured model selection. |
162
164
  | `BRAVE_SEARCH_API_KEY`, `TAVILY_API_KEY` | Web-search fallback keys. |
163
165
 
@@ -173,6 +175,7 @@ The `CC_` prefix is historical; `ONECODE_`-prefixed aliases are planned.
173
175
  | `CC_FOOTER=0` | Keep pi's footer instead of One Code's status line. |
174
176
  | `CC_TURN_DURATION=0` | Remove the post-turn timing line. |
175
177
  | `CC_RECAP=0` | Turn off the "while you were away" recap. |
178
+ | `CC_SESSION_TITLE=0` | Turn off the automatic session title. |
176
179
  | `CC_RECAP_IDLE_MS` | Idle time before a recap, in milliseconds (default 300000). |
177
180
  | `CC_COMPACTION=0` | Use pi's compaction summary instead of Claude Code's. |
178
181
  | `CC_CLEAR_THINKING=0`, `=1` | Force the thinking-preservation request off or on for Anthropic models. Default: on for `api.anthropic.com` only. |
@@ -192,6 +195,8 @@ The `CC_` prefix is historical; `ONECODE_`-prefixed aliases are planned.
192
195
  | `PI_CACHE_RETENTION` | pi's prompt-cache lifetime. One Code sets `long` for interactive sessions unless you set it yourself. |
193
196
  | `PI_OFFLINE=1` | Same as `--offline`. |
194
197
  | `CLAUDE_CONFIG_DIR` | Where Claude Code's user configuration is read from. |
198
+ | `CLAUDE_CODE_USE_POWERSHELL_TOOL` | `1` turns the `powershell` tool on (the default on Windows), `0` turns it off. Off Windows it needs a `pwsh` on PATH. See [Windows](windows.md). |
199
+ | `CLAUDE_CODE_GIT_BASH_PATH` | The bash that drives the `bash` tool, hooks, and background shells. Also read from the `env` block of `~/.claude/settings.json`; a non-bash binary is ignored with a warning. |
195
200
  | `CLAUDE_CODE_SUBAGENT_MODEL` | Default subagent model on a Claude session. |
196
201
  | `EDITOR`, `VISUAL` | Editor used by `/memory` (and pi's **ctrl+g**). |
197
202
  | `SHELL` | Shell used for commands (default `/bin/sh`). |
@@ -1,5 +1,7 @@
1
1
  # Sessions and context
2
2
 
3
+ [← One Code user guide](README.md)
4
+
3
5
  This page covers what One Code puts into the model's context, how it keeps
4
6
  long sessions within the context window, what it remembers between
5
7
  sessions, and how to continue or branch a session.
@@ -82,7 +84,7 @@ full transcript if it needs a detail.
82
84
  Run `/compact` to compact at any time; you can pass instructions about what
83
85
  the summary should focus on. Compaction that happens because the context is
84
86
  full is more expensive than a manual or threshold compaction, because it
85
- cannot reuse the cached prefix of the conversation.
87
+ can't reuse the cached prefix of the conversation.
86
88
 
87
89
  Set `CC_COMPACTION=0` to use pi's own summary instead.
88
90
 
@@ -107,7 +109,7 @@ turn it off.
107
109
 
108
110
  Interactive sessions ask the provider for an extended cache lifetime (one
109
111
  hour on Anthropic; provider-dependent elsewhere), so a pause between turns
110
- does not re-send the whole conversation. Subagents, workflow agents, and
112
+ doesn't re-send the whole conversation. Subagents, workflow agents, and
111
113
  `-p` or `--mode json` runs use the provider's short default. Set
112
114
  `PI_CACHE_RETENTION` yourself to take over the choice. The footer shows the
113
115
  cache-hit rate of the latest turn.
@@ -121,7 +123,7 @@ Each session gets a scratchpad directory under the system temp directory,
121
123
  named by project and session. The model is told to use it for temporary
122
124
  files instead of `/tmp`; writes there need no approval.
123
125
 
124
- Tool output larger than 50 KB is not truncated. It is written to a file
126
+ Tool output larger than 50 KB isn't truncated. It's written to a file
125
127
  under the session directory, and the model receives the path, the size,
126
128
  and a 2 KB preview in a `<persisted-output>` block, so it can read the part
127
129
  it needs.
@@ -182,6 +184,24 @@ Not restored:
182
184
  `/new`. Running background tasks are stopped and listed. The permission
183
185
  mode you chose carries over.
184
186
 
187
+ ### What the model learns about your commands
188
+
189
+ As in Claude Code, a slash command you run is recorded for the model: the
190
+ next message you send carries a short note that the command ran, wrapped in a
191
+ caveat telling the model not to act on it. `/clear` opens the new session
192
+ with that note, and a model switch records "Set model to …" the way Claude
193
+ Code does. Commands that One Code cannot observe (pi's own `/compact`,
194
+ `/settings`, `/name`) leave no note.
195
+
196
+ ### The session title
197
+
198
+ After your first real message, One Code names the session the way Claude
199
+ Code does: a cheap model on your provider turns the message into a short
200
+ title (Claude Code's own naming prompt), which shows in the terminal tab as
201
+ `One Code - <title> - <folder>` and in the session picker. A name you set
202
+ with `/name` is never overwritten. The call's cost is included in the
203
+ footer's total. Set `CC_SESSION_TITLE=0` to turn it off.
204
+
185
205
  ## Turn timing
186
206
 
187
207
  After each turn, a dim line such as `✻ Cooked for 5m 12s` reports how long