skalpel 3.2.11 → 3.2.13

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/INSTALL.md CHANGED
@@ -47,14 +47,14 @@ Post-W4 (OAuth port): first run is a guided TUI walkthrough plus browser-loopbac
47
47
 
48
48
  This flow corresponds to Journey 1 — First launch, fresh authentication — in `SPEC.md`. That narrative describes what the user feels at each step; this document describes what the install machinery actually does.
49
49
 
50
- If the user runs `skalpel` without first running `skalpel login`, the walkthrough prompts them to sign in inline (Enter), skip for now (`s`), turn interception off (`o`), or quit (`q`). The walkthrough also surfaces the website onboarding URL (`https://launch.skalpel.ai/signup`) and notes that a wizard activation command can be pasted directly — npm frequently hides `postinstall` output, so this CLI-side hint is where self-serve `npm install -g` users reliably learn how to activate. To sign out of an existing account on this machine, run `skalpel logout` from a shell — the CLI revokes the backend session (best-effort) and removes `auth.json` via `internal/auth.Delete`.
50
+ If the user runs `skalpel` without first running `skalpel login`, the walkthrough prompts them to sign in inline (Enter), skip for now (`s`), turn interception off (`o`), or quit (`q`). The walkthrough also surfaces the website onboarding URL (`https://skalpel.ai/signup`) and notes that a wizard activation command can be pasted directly — npm frequently hides `postinstall` output, so this CLI-side hint is where self-serve `npm install -g` users reliably learn how to activate. To sign out of an existing account on this machine, run `skalpel logout` from a shell — the CLI revokes the backend session (best-effort) and removes `auth.json` via `internal/auth.Delete`.
51
51
 
52
52
  ### Guided activation vs. self-serve global install
53
53
 
54
54
  The primary, guided path is the website signup wizard, which mints a one-time, version-pinned-to-`latest` command:
55
55
 
56
56
  ```bash
57
- npx --yes skalpel@<latest> login --activation <token> && npm install -g skalpel@<latest>
57
+ npm install -g skalpel@<latest> && skalpel login --activation <token>
58
58
  ```
59
59
 
60
60
  The `&& npm install -g` step puts `skalpel` on your PATH so shell wrappers from setup work in new terminals; it only runs if activation succeeds.
@@ -63,7 +63,7 @@ The shell wrappers — and the `skalpel active` / `skalpel inactive` indicator e
63
63
 
64
64
  `login --activation` is **auth-only with respect to the TUI**: it claims the token, writes `auth.json`, and never launches the TUI (the magic flow is a deliberate terminal handoff). Before exiting it chains directly into harness setup so the single pasted command also walks the user through wrapping their coding agents: in an interactive terminal it runs the same detection + checkbox prompt as `skalpel setup`; in a non-interactive shell (CI, piped) it only prints what it detected and points at `skalpel setup`, never editing shell startup files unattended. Browser-loopback `skalpel login` is unchanged and still lands the user on the dashboard.
65
65
 
66
- A user who independently runs `npm install -g skalpel` is still supported: `postinstall` prints a best-effort pointer to `https://launch.skalpel.ai/signup`, and the first `skalpel` run repeats that pointer where output is guaranteed.
66
+ A user who independently runs `npm install -g skalpel` is still supported: `postinstall` prints a best-effort pointer to `https://skalpel.ai/signup`, and the first `skalpel` run repeats that pointer where output is guaranteed.
67
67
 
68
68
  ### `skalpel setup` — detect and wrap coding agents
69
69
 
@@ -153,6 +153,47 @@ When the TUI connects to the daemon at launch, the handshake includes a version
153
153
 
154
154
  The handshake is also where the TUI reads the daemon's engine list and the daemon's per-agent detection results (per `SPEC.md` §6 and §9). A version-coupled handshake is also a guarantee that the TUI is reading those results from a daemon whose schema it understands. When the bundle promises versions match, the TUI does not need a defensive parse-and-recover path for the daemon's responses; the schema is whatever the bundle's joint version says it is.
155
155
 
156
+ ## Advanced: chaining `skalpeld` through a local interception proxy
157
+
158
+ By default `skalpeld` is the host's HTTP proxy for coding agents. If you
159
+ also run a separate local interception proxy (e.g. an mitmproxy that
160
+ records traffic for research), you can have the daemon **chain** its
161
+ outbound provider traffic through it without either rig fighting over the
162
+ proxy role. This is opt-in and controlled by two environment variables on
163
+ the **daemon** process:
164
+
165
+ | Variable | Values | Default | Effect |
166
+ |---|---|---|---|
167
+ | `SKALPEL_VIA_MITM` | `true` \| `false` \| `bypass` | `true` | `true`: the daemon routes its **provider** calls (Anthropic / OpenAI / …) through the proxy at `MITM_PROXY_URL`, while its own **control-plane** calls to `api.skalpel.ai` and the **Cognito** auth hop bypass the proxy (so your recordings never contain Skalpel control-plane chatter). `false` / `bypass`: the daemon talks direct to providers, no chaining; `bypass` is the explicit "turn everything off" debugging value. An unset or unrecognised value behaves as `true`. |
168
+ | `MITM_PROXY_URL` | a proxy URL | `http://127.0.0.1:8888` | The interception-proxy address to chain through when `SKALPEL_VIA_MITM=true`. The daemon's own live proxy address-file and `SKALPEL_PROXY_URL` take precedence over this if set. |
169
+
170
+ The bypass list is fixed and suffix-based — it covers the Skalpel control
171
+ plane (`api.skalpel.ai`, `.skalpel.ai`), Cognito and AWS
172
+ (`amazoncognito.com`, `amazonaws.com`), object stores
173
+ (`r2.cloudflarestorage.com`), the package registries the install path
174
+ reaches (`pypi.org`, `crates.io`, `*.github.com`), and loopback. Provider
175
+ hosts are NOT on the list, so they route through the proxy.
176
+
177
+ Because the daemon is service-managed, set these via a systemd drop-in
178
+ rather than an interactive shell:
179
+
180
+ ```ini
181
+ # ~/.config/systemd/user/skalpeld.service.d/proxy-chain.conf
182
+ [Service]
183
+ Environment=SKALPEL_VIA_MITM=true
184
+ Environment=MITM_PROXY_URL=http://127.0.0.1:8888
185
+ ```
186
+
187
+ ```bash
188
+ systemctl --user daemon-reload
189
+ systemctl --user restart skalpeld
190
+ ```
191
+
192
+ To disable chaining, set `SKALPEL_VIA_MITM=bypass` (or `false`) and
193
+ restart the daemon. The interception proxy must trust nothing extra for
194
+ this to work; the chain is purely a network-layer redirect of the
195
+ daemon's outbound sockets.
196
+
156
197
  ## Open questions
157
198
 
158
199
  A small set of bundling questions are recorded here for the build phase. Each will be resolved before v1 ships; none affect the design commitments above.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skalpel",
3
- "version": "3.2.11",
3
+ "version": "3.2.13",
4
4
  "description": "Skalpel — local proxy and TUI for coding agents (skalpel + skalpeld bundle).",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://skalpel.ai",
@@ -58,10 +58,10 @@
58
58
  "x64"
59
59
  ],
60
60
  "optionalDependencies": {
61
- "@skalpelai/skalpel-darwin-arm64": "3.2.11",
62
- "@skalpelai/skalpel-darwin-x64": "3.2.11",
63
- "@skalpelai/skalpel-linux-arm64": "3.2.11",
64
- "@skalpelai/skalpel-linux-x64": "3.2.11",
65
- "@skalpelai/skalpel-win32-x64": "3.2.11"
61
+ "@skalpelai/skalpel-darwin-arm64": "3.2.13",
62
+ "@skalpelai/skalpel-darwin-x64": "3.2.13",
63
+ "@skalpelai/skalpel-linux-arm64": "3.2.13",
64
+ "@skalpelai/skalpel-linux-x64": "3.2.13",
65
+ "@skalpelai/skalpel-win32-x64": "3.2.13"
66
66
  }
67
67
  }
@@ -19,7 +19,7 @@ const log = require('./log');
19
19
  // product flow is the website signup wizard (which mints a one-time
20
20
  // activation command), not `npm install -g`. We surface it here so a
21
21
  // self-serve global install still has a clean path to activation.
22
- const ONBOARDING_URL = 'https://launch.skalpel.ai/signup';
22
+ const ONBOARDING_URL = 'https://skalpel.ai/signup';
23
23
 
24
24
  function run({ dryRun }) {
25
25
  const hint = `next: activate your account at ${ONBOARDING_URL}`;