pennyrouter 0.2.7 → 0.2.9

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.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 PennyRouter
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.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PennyRouter
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.
package/README.md CHANGED
@@ -1,222 +1,225 @@
1
- # PennyRouter CLI
2
-
3
- Official local installer for [PennyRouter](https://pennyrouter.com) coding-agent integrations.
4
-
5
- PennyRouter is a model gateway for coding tools. This CLI handles the local setup work that
6
- agents should not do by hand: browser authorization, API-key handoff, config edits, backups,
7
- status checks, and uninstall metadata.
8
-
9
- ## Usage
10
-
11
- ```bash
12
- npx pennyrouter install
13
- npx pennyrouter install --make-default
14
- npx pennyrouter update
15
- npx pennyrouter auth anthropic
16
- npx pennyrouter install --harness claude-code,cline,opencode,codex,windsurf,zed,codegpt,aider
17
- npx pennyrouter disable
18
- npx pennyrouter enable
19
- npx pennyrouter uninstall
20
- npx pennyrouter status
21
- ```
22
-
23
- Installation opens a browser and requires login to the PennyRouter account that should own
24
- the new machine key. CLI installs no longer create anonymous ghost accounts.
25
-
26
- With no `--harness` flag, the interactive installer shows Claude Code and Codex. Detected
27
- tools start checked. The additional legacy integrations remain available through an explicit
28
- `--harness <id>` selection or `--all`.
29
-
30
- When Claude Code is selected, the installer offers Claude subscription authorization. If it is
31
- declined or unavailable, installation requires an Anthropic API key or OpenRouter key. Codex
32
- uses an existing ChatGPT login; without one, installation requires an OpenAI API key or
33
- OpenRouter key. PennyRouter-funded provider keys are never an installed-harness fallback.
34
-
35
- ## Explicit Penny Commands
36
-
37
- On macOS and Linux, a normal install adds a small `penny` launcher under `~/.local/bin`:
38
-
39
- ```bash
40
- penny claude
41
- penny codex
42
- ```
43
-
44
- Arguments are passed through to the native harness, so commands such as `penny claude --resume`
45
- and `penny codex resume --last` work normally. By default, bare `claude` and `codex` remain
46
- completely native; their normal configuration files are not redirected. Choose the installer's
47
- "make PennyRouter the default" option, or pass `--make-default`, to retain the original global
48
- routing behavior.
49
-
50
- Existing PennyRouter installs preserve their current bare-command behavior during upgrade unless
51
- the user explicitly changes it. Close running Claude Code or Codex sessions only when adding or
52
- removing global bare-command routing. A Penny-only install does not require closing native sessions.
53
-
54
- The launcher uses a private config at `~/.config/pennyrouter/config.json`, a Claude settings overlay,
55
- and a secret-free Codex profile. The installer adds one marked PATH block to zsh or bash startup
56
- files when needed; `--no-path-update` skips that edit.
57
-
58
- In Claude Code sessions launched with `penny claude`, `/penny help` is an alias for the existing
59
- `@penny help` syntax. Both forms remain supported. Codex continues to use `@penny` because Codex
60
- does not currently expose equivalent project-independent custom slash commands.
61
-
62
- When Codex is already signed in with ChatGPT, the installer preserves that Codex-managed
63
- login and configures PennyRouter as an OpenAI-authenticated Responses proxy. Codex continues
64
- to own and refresh the OpenAI credentials; PennyRouter stores only its existing `pr-` account
65
- key in the managed provider block. API-key Codex installs use the user's encrypted OpenAI or
66
- OpenRouter key.
67
-
68
- To point Codex directly at a PennyRouter gateway running on localhost port 8400:
69
-
70
- ```bash
71
- npx pennyrouter@latest install --harness codex --local
72
- ```
73
-
74
- Restart Codex after installation. Without `--local`, browser authorization supplies the normal
75
- hosted gateway URL.
76
-
77
- Before configuring Claude Code, the installer sends a small compatibility request exercising the
78
- modern beta/context-management request shape. If that check fails, Claude routing is not enabled;
79
- the gateway must be redeployed or fixed before retrying. This check is about PennyRouter's gateway
80
- compatibility, not a demand that the user upgrade a Claude Code version that already emits a
81
- supported request shape.
82
-
83
- ## Updating
84
-
85
- To pick up a new CLI version without repeating the install interview:
86
-
87
- ```bash
88
- npx pennyrouter update
89
- npx pennyrouter update --dry-run
90
- npx pennyrouter update --harness claude-code
91
- ```
92
-
93
- `update` refreshes only the files generated from the CLI's own constants: the managed `penny`
94
- runtime and launcher, the `/penny` Claude skill, the Claude settings overlay and statusline, the
95
- Codex provider profile, and the model labels and context-window settings in managed tool configs.
96
- Older installs are migrated forward, so retired model labels are replaced with the current ones.
97
-
98
- It never touches credentials and never re-runs browser authorization. Upstream provider tokens
99
- (Claude subscription, Anthropic, OpenAI, OpenRouter) are held encrypted at the gateway, and the
100
- existing `pr-` account key and gateway URL are read back from the local config, so the command is
101
- non-interactive and prompts for nothing.
102
-
103
- Per-tool choices are preserved rather than re-asked. Bare-command routing is read from the
104
- uninstall manifest, so a Penny-only install keeps bare `claude` and `codex` fully native and an
105
- install that opted into global routing keeps it. Subscription auth mode is likewise carried
106
- forward. Use `install` instead when the intent is to change those choices.
107
-
108
- Because the managed tool config is rewritten only for tools whose bare command already routes
109
- through PennyRouter, a Penny-only install leaves files such as `~/.claude/settings.json`
110
- untouched and needs no session shutdown. Updating a tool that owns global routing requires
111
- closing its running sessions, or passing `--allow-running-harnesses`. Unrelated keys and user
112
- settings inside managed config files are preserved, and re-running `update` is idempotent.
113
-
114
- Restart Claude Code or Codex afterwards to pick up the refreshed configuration.
115
-
116
- ## Supported Tools
117
-
118
- - Claude Code
119
- - Cline (manual setup instructions; no VS Code settings mutation)
120
- - Codex
121
- - opencode
122
- - Windsurf
123
- - Zed
124
- - JetBrains CodeGPT (manual setup instructions; no XML mutation)
125
- - Aider
126
-
127
- ## Penny Models
128
-
129
- Tools that expose a model picker (e.g. Claude Code `/model`) get four curated choices. The three
130
- named-model choices PIN the trunk to that exact model — you pick the model, PennyRouter still cuts
131
- the bill via its side machinery (cache/compaction/swallowed background calls) without switching the
132
- model you chose. "Penny Custom" is the dynamic option: PennyRouter cost-routes each turn.
133
-
134
- - Opus 5 (PennyRouter): pins `anthropic/claude-opus-5`
135
- - Sonnet 5 (PennyRouter): pins `anthropic/claude-sonnet-5`
136
- - Haiku 4.5 (PennyRouter): pins `anthropic/claude-haiku-4-5-20251001`
137
- - Fable 5 (PennyRouter): pins `anthropic/claude-fable-5`
138
- - Penny Custom: `pennyrouter/auto` — dynamic routing on the bundle/profile saved in the user's account
139
-
140
- ## Claude Subscription Auth
141
-
142
- When installing PennyRouter for Claude Code, the interactive installer offers to route
143
- Anthropic-native Claude turns through the user's own Claude subscription token. To force this
144
- in non-interactive installs:
145
-
146
- ```bash
147
- npx pennyrouter install --harness claude-code --anthropic-auth --token <token>
148
- npx pennyrouter install --harness claude-code --anthropic-api-key <key>
149
- npx pennyrouter install --harness codex --openai-api-key <key>
150
- npx pennyrouter install --openrouter-api-key <key>
151
- ```
152
-
153
- If Claude Code is already logged in to a Claude subscription, use Claude Code's token setup
154
- flow:
155
-
156
- ```bash
157
- claude setup-token
158
- ANTHROPIC_AUTH_TOKEN=<token> npx pennyrouter auth anthropic
159
- ```
160
-
161
- Other token sources are supported:
162
-
163
- ```bash
164
- npx pennyrouter auth anthropic --token <token>
165
- npx pennyrouter auth anthropic --token-command '<command that prints the token>'
166
- ```
167
-
168
- If the separate Anthropic `ant` CLI is installed and logged in, PennyRouter can use it as a
169
- convenience fallback:
170
-
171
- ```bash
172
- ant auth login
173
- npx pennyrouter auth anthropic
174
- ```
175
-
176
- The command stores the Anthropic token encrypted at the gateway. Claude Code keeps only the
177
- PennyRouter `pr-` bearer in its settings; the gateway retrieves and forwards the stored token
178
- with the required OAuth beta header and does not deduct PennyRouter credit for successfully
179
- served Anthropic-subscription calls.
180
-
181
- On a transient subscription 429/529, the gateway retries the same subscription once. If it
182
- still fails, it can fall back only to credentials owned by that user: Anthropic API then
183
- OpenRouter for Claude, or OpenAI API then OpenRouter for Codex. If no such credential is
184
- configured, the provider error is returned; PennyRouter never changes the payer to itself.
185
-
186
- PennyRouter also sets `disableClaudeAiConnectors: true` while its custom gateway is installed.
187
- Claude Code cannot load claude.ai organization connectors when gateway authentication takes
188
- precedence, and otherwise displays a persistent warning about that state. Making the disablement
189
- explicit suppresses the warning; locally configured MCP servers are unaffected. Reinstall keeps
190
- the original user value, and disable or uninstall restores it unless the user changed it later.
191
-
192
- If the stored token expires during a long-running session, refresh the token source and rerun
193
- `npx pennyrouter auth anthropic`.
194
-
195
- ## Agent Flow
196
-
197
- Users can ask a coding agent to follow:
198
-
199
- ```text
200
- https://pennyrouter.com/install
201
- ```
202
-
203
- That machine-readable page tells the agent to invoke this CLI instead of editing config files
204
- directly.
205
-
206
- ## What It Changes
207
-
208
- The CLI installs its managed launcher under `~/.local`, writes only selected local tool
209
- configuration or per-command overlay files, saves backups under the local PennyRouter state
210
- directory, and records an uninstall manifest.
211
-
212
- `disable` temporarily removes PennyRouter from selected tools while retaining a local
213
- PennyRouter-managed snapshot for `enable`.
214
-
215
- `update` rewrites those same managed files for the installed version without re-authorizing,
216
- and without changing bare-command routing or stored credentials.
217
-
218
- It does not delete PennyRouter accounts, credits, or remote API keys.
219
-
220
- ## License
221
-
222
- MIT
1
+ # PennyRouter CLI
2
+
3
+ Official local installer for [PennyRouter](https://pennyrouter.com) coding-agent integrations.
4
+
5
+ PennyRouter is a model gateway for coding tools. This CLI handles the local setup work that
6
+ agents should not do by hand: browser authorization, API-key handoff, config edits, backups,
7
+ status checks, and uninstall metadata.
8
+
9
+ ## Usage
10
+
11
+ ```bash
12
+ npx pennyrouter install
13
+ npx pennyrouter install --make-default
14
+ npx pennyrouter update
15
+ npx pennyrouter auth anthropic
16
+ npx pennyrouter install --harness claude-code,cline,opencode,codex,windsurf,zed,codegpt,aider
17
+ npx pennyrouter disable
18
+ npx pennyrouter enable
19
+ npx pennyrouter uninstall
20
+ npx pennyrouter status
21
+ ```
22
+
23
+ Installation opens a browser and requires login to the PennyRouter account that should own
24
+ the new machine key. CLI installs no longer create anonymous ghost accounts.
25
+
26
+ With no `--harness` flag, the interactive installer shows Claude Code and Codex. Detected
27
+ tools start checked. The additional legacy integrations remain available through an explicit
28
+ `--harness <id>` selection or `--all`.
29
+
30
+ When Claude Code is selected, the installer offers Claude subscription authorization. If it is
31
+ declined or unavailable, installation requires an Anthropic API key or OpenRouter key. Codex
32
+ uses an existing ChatGPT login; without one, installation requires an OpenAI API key or
33
+ OpenRouter key. PennyRouter-funded provider keys are never an installed-harness fallback.
34
+
35
+ ## Explicit Penny Commands
36
+
37
+ On macOS and Linux, a normal install adds a small `penny` launcher under `~/.local/bin`.
38
+ On Windows it installs `penny.cmd` under `%LOCALAPPDATA%\\PennyRouter\\bin` and adds that
39
+ directory to the user PATH:
40
+
41
+ ```bash
42
+ penny claude
43
+ penny codex
44
+ ```
45
+
46
+ Arguments are passed through to the native harness, so commands such as `penny claude --resume`
47
+ and `penny codex resume --last` work normally. By default, bare `claude` and `codex` remain
48
+ completely native; their normal configuration files are not redirected. Choose the installer's
49
+ "make PennyRouter the default" option, or pass `--make-default`, to retain the original global
50
+ routing behavior.
51
+
52
+ Existing PennyRouter installs preserve their current bare-command behavior during upgrade unless
53
+ the user explicitly changes it. Close running Claude Code or Codex sessions only when adding or
54
+ removing global bare-command routing. A Penny-only install does not require closing native sessions.
55
+
56
+ The launcher uses a private config, a Claude settings overlay, and a secret-free Codex profile.
57
+ The installer adds one marked PATH block to zsh or bash startup files on macOS/Linux, or a single
58
+ user-PATH entry on Windows, when needed; `--no-path-update` skips that edit. Open a new terminal
59
+ after a PATH update.
60
+
61
+ In Claude Code sessions launched with `penny claude`, `/penny help` is an alias for the existing
62
+ `@penny help` syntax. Both forms remain supported. Codex continues to use `@penny` because Codex
63
+ does not currently expose equivalent project-independent custom slash commands.
64
+
65
+ When Codex is already signed in with ChatGPT, the installer preserves that Codex-managed
66
+ login and configures PennyRouter as an OpenAI-authenticated Responses proxy. Codex continues
67
+ to own and refresh the OpenAI credentials; PennyRouter stores only its existing `pr-` account
68
+ key in the managed provider block. API-key Codex installs use the user's encrypted OpenAI or
69
+ OpenRouter key.
70
+
71
+ To point Codex directly at a PennyRouter gateway running on localhost port 8400:
72
+
73
+ ```bash
74
+ npx pennyrouter@latest install --harness codex --local
75
+ ```
76
+
77
+ Restart Codex after installation. Without `--local`, browser authorization supplies the normal
78
+ hosted gateway URL.
79
+
80
+ Before configuring Claude Code, the installer sends a small compatibility request exercising the
81
+ modern beta/context-management request shape. If that check fails, Claude routing is not enabled;
82
+ the gateway must be redeployed or fixed before retrying. This check is about PennyRouter's gateway
83
+ compatibility, not a demand that the user upgrade a Claude Code version that already emits a
84
+ supported request shape.
85
+
86
+ ## Updating
87
+
88
+ To pick up a new CLI version without repeating the install interview:
89
+
90
+ ```bash
91
+ npx pennyrouter update
92
+ npx pennyrouter update --dry-run
93
+ npx pennyrouter update --harness claude-code
94
+ ```
95
+
96
+ `update` refreshes only the files generated from the CLI's own constants: the managed `penny`
97
+ runtime and launcher, the `/penny` Claude skill, the Claude settings overlay and statusline, the
98
+ Codex provider profile, and the model labels and context-window settings in managed tool configs.
99
+ Older installs are migrated forward, so retired model labels are replaced with the current ones.
100
+
101
+ It never touches credentials and never re-runs browser authorization. Upstream provider tokens
102
+ (Claude subscription, Anthropic, OpenAI, OpenRouter) are held encrypted at the gateway, and the
103
+ existing `pr-` account key and gateway URL are read back from the local config, so the command is
104
+ non-interactive and prompts for nothing.
105
+
106
+ Per-tool choices are preserved rather than re-asked. Bare-command routing is read from the
107
+ uninstall manifest, so a Penny-only install keeps bare `claude` and `codex` fully native and an
108
+ install that opted into global routing keeps it. Subscription auth mode is likewise carried
109
+ forward. Use `install` instead when the intent is to change those choices.
110
+
111
+ Because the managed tool config is rewritten only for tools whose bare command already routes
112
+ through PennyRouter, a Penny-only install leaves files such as `~/.claude/settings.json`
113
+ untouched and needs no session shutdown. Updating a tool that owns global routing requires
114
+ closing its running sessions, or passing `--allow-running-harnesses`. Unrelated keys and user
115
+ settings inside managed config files are preserved, and re-running `update` is idempotent.
116
+
117
+ Restart Claude Code or Codex afterwards to pick up the refreshed configuration.
118
+
119
+ ## Supported Tools
120
+
121
+ - Claude Code
122
+ - Cline (manual setup instructions; no VS Code settings mutation)
123
+ - Codex
124
+ - opencode
125
+ - Windsurf
126
+ - Zed
127
+ - JetBrains CodeGPT (manual setup instructions; no XML mutation)
128
+ - Aider
129
+
130
+ ## Penny Models
131
+
132
+ Tools that expose a model picker (e.g. Claude Code `/model`) get four curated choices. The three
133
+ named-model choices PIN the trunk to that exact model — you pick the model, PennyRouter still cuts
134
+ the bill via its side machinery (cache/compaction/swallowed background calls) without switching the
135
+ model you chose. "Penny Custom" is the dynamic option: PennyRouter cost-routes each turn.
136
+
137
+ - Opus 5 (PennyRouter): pins `anthropic/claude-opus-5`
138
+ - Sonnet 5 (PennyRouter): pins `anthropic/claude-sonnet-5`
139
+ - Haiku 4.5 (PennyRouter): pins `anthropic/claude-haiku-4-5-20251001`
140
+ - Fable 5 (PennyRouter): pins `anthropic/claude-fable-5`
141
+ - Penny Custom: `pennyrouter/auto` — dynamic routing on the bundle/profile saved in the user's account
142
+
143
+ ## Claude Subscription Auth
144
+
145
+ When installing PennyRouter for Claude Code, the interactive installer offers to route
146
+ Anthropic-native Claude turns through the user's own Claude subscription token. To force this
147
+ in non-interactive installs:
148
+
149
+ ```bash
150
+ npx pennyrouter install --harness claude-code --anthropic-auth --token <token>
151
+ npx pennyrouter install --harness claude-code --anthropic-api-key <key>
152
+ npx pennyrouter install --harness codex --openai-api-key <key>
153
+ npx pennyrouter install --openrouter-api-key <key>
154
+ ```
155
+
156
+ If Claude Code is already logged in to a Claude subscription, use Claude Code's token setup
157
+ flow:
158
+
159
+ ```bash
160
+ claude setup-token
161
+ ANTHROPIC_AUTH_TOKEN=<token> npx pennyrouter auth anthropic
162
+ ```
163
+
164
+ Other token sources are supported:
165
+
166
+ ```bash
167
+ npx pennyrouter auth anthropic --token <token>
168
+ npx pennyrouter auth anthropic --token-command '<command that prints the token>'
169
+ ```
170
+
171
+ If the separate Anthropic `ant` CLI is installed and logged in, PennyRouter can use it as a
172
+ convenience fallback:
173
+
174
+ ```bash
175
+ ant auth login
176
+ npx pennyrouter auth anthropic
177
+ ```
178
+
179
+ The command stores the Anthropic token encrypted at the gateway. Claude Code keeps only the
180
+ PennyRouter `pr-` bearer in its settings; the gateway retrieves and forwards the stored token
181
+ with the required OAuth beta header and does not deduct PennyRouter credit for successfully
182
+ served Anthropic-subscription calls.
183
+
184
+ On a transient subscription 429/529, the gateway retries the same subscription once. If it
185
+ still fails, it can fall back only to credentials owned by that user: Anthropic API then
186
+ OpenRouter for Claude, or OpenAI API then OpenRouter for Codex. If no such credential is
187
+ configured, the provider error is returned; PennyRouter never changes the payer to itself.
188
+
189
+ PennyRouter also sets `disableClaudeAiConnectors: true` while its custom gateway is installed.
190
+ Claude Code cannot load claude.ai organization connectors when gateway authentication takes
191
+ precedence, and otherwise displays a persistent warning about that state. Making the disablement
192
+ explicit suppresses the warning; locally configured MCP servers are unaffected. Reinstall keeps
193
+ the original user value, and disable or uninstall restores it unless the user changed it later.
194
+
195
+ If the stored token expires during a long-running session, refresh the token source and rerun
196
+ `npx pennyrouter auth anthropic`.
197
+
198
+ ## Agent Flow
199
+
200
+ Users can ask a coding agent to follow:
201
+
202
+ ```text
203
+ https://pennyrouter.com/install
204
+ ```
205
+
206
+ That machine-readable page tells the agent to invoke this CLI instead of editing config files
207
+ directly.
208
+
209
+ ## What It Changes
210
+
211
+ The CLI installs its managed launcher under `~/.local`, writes only selected local tool
212
+ configuration or per-command overlay files, saves backups under the local PennyRouter state
213
+ directory, and records an uninstall manifest.
214
+
215
+ `disable` temporarily removes PennyRouter from selected tools while retaining a local
216
+ PennyRouter-managed snapshot for `enable`.
217
+
218
+ `update` rewrites those same managed files for the installed version without re-authorizing,
219
+ and without changing bare-command routing or stored credentials.
220
+
221
+ It does not delete PennyRouter accounts, credits, or remote API keys.
222
+
223
+ ## License
224
+
225
+ MIT
package/bin/penny.js CHANGED
@@ -1,9 +1,9 @@
1
- #!/usr/bin/env node
2
- import { runPenny } from "../src/launch.js";
3
-
4
- runPenny().then((code) => {
5
- process.exitCode = code;
6
- }).catch((error) => {
7
- console.error(error?.message || String(error));
8
- process.exitCode = 1;
9
- });
1
+ #!/usr/bin/env node
2
+ import { runPenny } from "../src/launch.js";
3
+
4
+ runPenny().then((code) => {
5
+ process.exitCode = code;
6
+ }).catch((error) => {
7
+ console.error(error?.message || String(error));
8
+ process.exitCode = 1;
9
+ });
@@ -1,7 +1,7 @@
1
- #!/usr/bin/env node
2
- import { main } from "../src/cli.js";
3
-
4
- main().catch((error) => {
5
- console.error(error?.message || String(error));
6
- process.exitCode = 1;
7
- });
1
+ #!/usr/bin/env node
2
+ import { main } from "../src/cli.js";
3
+
4
+ main().catch((error) => {
5
+ console.error(error?.message || String(error));
6
+ process.exitCode = 1;
7
+ });
package/package.json CHANGED
@@ -1,30 +1,30 @@
1
- {
2
- "name": "pennyrouter",
3
- "version": "0.2.7",
4
- "description": "Install and manage PennyRouter local coding-agent integrations.",
5
- "homepage": "https://pennyrouter.com",
6
- "bugs": {
7
- "url": "https://github.com/jduke99/pennyrouter-cli/issues"
8
- },
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/jduke99/pennyrouter-cli.git"
12
- },
13
- "type": "module",
14
- "bin": {
15
- "pennyrouter": "bin/pennyrouter.js"
16
- },
17
- "engines": {
18
- "node": ">=18"
19
- },
20
- "files": [
21
- "bin",
22
- "src",
23
- "README.md"
24
- ],
25
- "scripts": {
26
- "start": "node ./bin/pennyrouter.js",
27
- "check": "node --check ./bin/pennyrouter.js && node --check ./bin/penny.js && find src -name '*.js' -print0 | xargs -0 -n1 node --check && node src/session.test.js && node src/statusline.test.js && node src/harnesses/claude-code.test.js && node src/harnesses/codex.test.js && node src/launch.test.js"
28
- },
29
- "license": "MIT"
30
- }
1
+ {
2
+ "name": "pennyrouter",
3
+ "version": "0.2.9",
4
+ "description": "Install and manage PennyRouter local coding-agent integrations.",
5
+ "homepage": "https://pennyrouter.com",
6
+ "bugs": {
7
+ "url": "https://github.com/jduke99/pennyrouter-cli/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/jduke99/pennyrouter-cli.git"
12
+ },
13
+ "type": "module",
14
+ "bin": {
15
+ "pennyrouter": "bin/pennyrouter.js"
16
+ },
17
+ "engines": {
18
+ "node": ">=18"
19
+ },
20
+ "files": [
21
+ "bin",
22
+ "src",
23
+ "README.md"
24
+ ],
25
+ "scripts": {
26
+ "start": "node ./bin/pennyrouter.js",
27
+ "check": "node --check ./bin/pennyrouter.js && node --check ./bin/penny.js && find src -name '*.js' -print0 | xargs -0 -n1 node --check && node src/session.test.js && node src/statusline.test.js && node src/harnesses/claude-code.test.js && node src/harnesses/codex.test.js && node src/launch.test.js"
28
+ },
29
+ "license": "MIT"
30
+ }