tauri-agent-tools 0.7.1 → 0.9.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.
- package/.agents/skills/tauri-agent-tools/SKILL.md +59 -14
- package/.agents/skills/tauri-bridge-setup/SKILL.md +10 -4
- package/.agents/skills/tauri-debug-quickstart/SKILL.md +10 -6
- package/AGENTS.md +13 -3
- package/README.md +33 -5
- package/dist/bridge/client.d.ts +21 -0
- package/dist/bridge/client.js +38 -2
- package/dist/bridge/client.js.map +1 -1
- package/dist/bridge/tokenDiscovery.js +5 -2
- package/dist/bridge/tokenDiscovery.js.map +1 -1
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/bundle.d.ts +2 -0
- package/dist/commands/bundle.js +212 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/capabilitiesAudit.js +14 -1
- package/dist/commands/capabilitiesAudit.js.map +1 -1
- package/dist/commands/capture.d.ts +11 -0
- package/dist/commands/capture.js +161 -156
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/check.js +2 -2
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/consoleMonitor.js +3 -3
- package/dist/commands/consoleMonitor.js.map +1 -1
- package/dist/commands/dom.js +2 -2
- package/dist/commands/dom.js.map +1 -1
- package/dist/commands/health.js +19 -1
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/interact/click.js +2 -2
- package/dist/commands/interact/click.js.map +1 -1
- package/dist/commands/interact/scroll.js +3 -3
- package/dist/commands/interact/scroll.js.map +1 -1
- package/dist/commands/ipcMonitor.js +41 -7
- package/dist/commands/ipcMonitor.js.map +1 -1
- package/dist/commands/logs.d.ts +30 -0
- package/dist/commands/logs.js +279 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/mutations.js +3 -3
- package/dist/commands/mutations.js.map +1 -1
- package/dist/commands/probe.js +49 -9
- package/dist/commands/probe.js.map +1 -1
- package/dist/commands/processTree.js +116 -4
- package/dist/commands/processTree.js.map +1 -1
- package/dist/commands/rustLogs.js +3 -3
- package/dist/commands/rustLogs.js.map +1 -1
- package/dist/commands/screenshot.js +2 -2
- package/dist/commands/screenshot.js.map +1 -1
- package/dist/commands/shared.d.ts +37 -0
- package/dist/commands/shared.js +62 -3
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/sidecarReplay.js +46 -1
- package/dist/commands/sidecarReplay.js.map +1 -1
- package/dist/commands/sidecarTap.js +23 -8
- package/dist/commands/sidecarTap.js.map +1 -1
- package/dist/commands/snapshot.js +2 -2
- package/dist/commands/snapshot.js.map +1 -1
- package/dist/commands/storeInspect.js +2 -2
- package/dist/commands/storeInspect.js.map +1 -1
- package/dist/commands/wait.js +3 -3
- package/dist/commands/wait.js.map +1 -1
- package/dist/commands/webviewAttach.js +17 -1
- package/dist/commands/webviewAttach.js.map +1 -1
- package/dist/platform/macos.js +35 -15
- package/dist/platform/macos.js.map +1 -1
- package/dist/schemas/bridge.d.ts +14 -0
- package/dist/schemas/bridge.js +3 -0
- package/dist/schemas/bridge.js.map +1 -1
- package/dist/util/logMerge.d.ts +42 -0
- package/dist/util/logMerge.js +133 -0
- package/dist/util/logMerge.js.map +1 -0
- package/dist/util/mergeByTimestamp.d.ts +18 -0
- package/dist/util/mergeByTimestamp.js +30 -0
- package/dist/util/mergeByTimestamp.js.map +1 -0
- package/dist/util/psTree.d.ts +28 -0
- package/dist/util/psTree.js +76 -0
- package/dist/util/psTree.js.map +1 -0
- package/dist/util/redactText.d.ts +23 -0
- package/dist/util/redactText.js +377 -0
- package/dist/util/redactText.js.map +1 -0
- package/examples/tauri-bridge/src/dev_bridge.rs +199 -12
- package/package.json +3 -2
- package/rust-bridge/README.md +2 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tauri-agent-tools
|
|
3
|
-
description: CLI for inspecting and interacting with Tauri desktop apps — DOM queries, screenshots, interaction (click/type/scroll), IPC monitoring, store inspection, structured assertions, plus bridge-free diagnostics (OS logs, app paths, sidecar NDJSON tap/replay, forensic bundles) and the `diagnose` super-
|
|
4
|
-
version: 0.
|
|
5
|
-
tags: [tauri, desktop, debugging, screenshot, dom, inspection, diff, mutations, snapshot, interaction, click, type, scroll, invoke, probe, capture, check, store-inspect, forensics, os-logs, app-paths, sidecar, config-inspect, diagnose]
|
|
3
|
+
description: CLI for inspecting and interacting with Tauri desktop apps — DOM queries, screenshots, interaction (click/type/scroll), IPC monitoring, store inspection, structured assertions, plus bridge-free diagnostics (unified cross-layer logs, deep OS process trees, OS logs, app paths, sidecar NDJSON tap/replay, forensic bundles) and the `diagnose`/`bundle` super-commands for one-shot triage. Works against older/vendored bridges by degrading gracefully.
|
|
4
|
+
version: 0.9.0
|
|
5
|
+
tags: [tauri, desktop, debugging, screenshot, dom, inspection, diff, mutations, snapshot, interaction, click, type, scroll, invoke, probe, capture, check, store-inspect, logs, bundle, process-tree, forensics, os-logs, app-paths, sidecar, config-inspect, diagnose]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# tauri-agent-tools
|
|
@@ -33,13 +33,16 @@ npm install -g tauri-agent-tools
|
|
|
33
33
|
Some commands require the Rust dev bridge running inside the Tauri app. Others work standalone.
|
|
34
34
|
|
|
35
35
|
**Bridge required** (needs running Tauri app with bridge):
|
|
36
|
-
`screenshot --selector`, `dom`, `eval`, `wait --selector`, `wait --eval`, `ipc-monitor`, `console-monitor`, `rust-logs`, `storage`, `page-state`, `mutations`, `snapshot`, `click`, `type`, `scroll`, `focus`, `navigate`, `select`, `invoke`, `capture`, `check`, `store-inspect
|
|
36
|
+
`screenshot --selector`, `dom`, `eval`, `wait --selector`, `wait --eval`, `ipc-monitor`, `console-monitor`, `rust-logs`, `storage`, `page-state`, `mutations`, `snapshot`, `click`, `type`, `scroll`, `focus`, `navigate`, `select`, `invoke`, `capture`, `check`, `store-inspect`
|
|
37
|
+
|
|
38
|
+
**Bridge-enriched, but degrade gracefully** (use a v0.7+ bridge for full output; otherwise emit a clear note instead of failing — pass `--strict` to fail loudly):
|
|
39
|
+
`capabilities audit`, `webview attach`, `health` *(richer with bridge v0.7+)*
|
|
37
40
|
|
|
38
41
|
**Standalone** (no bridge needed):
|
|
39
|
-
`screenshot --title` (full window only), `wait --title`, `list-windows`, `info`, `diff`, `app-paths`, `config inspect`, `os-logs`, `sidecar tap`, `sidecar replay`, `forensics`
|
|
42
|
+
`screenshot --title` (full window only), `wait --title`, `list-windows`, `info`, `diff`, `logs`, `app-paths`, `config inspect`, `os-logs`, `sidecar tap`, `sidecar replay`, `forensics`
|
|
40
43
|
|
|
41
|
-
**Optional bridge
|
|
42
|
-
`probe` (
|
|
44
|
+
**Optional bridge** (work standalone, richer with a bridge):
|
|
45
|
+
`probe`, `process-tree` (use `--deep` for a bridge-free OS walk), `logs` (merges on-disk files alone, or also drains the bridge ring buffer), `bundle`, `diagnose`
|
|
43
46
|
|
|
44
47
|
The bridge auto-discovers via token files in `/tmp/tauri-dev-bridge-*.token`. No manual port/token configuration needed.
|
|
45
48
|
|
|
@@ -144,14 +147,44 @@ tauri-agent-tools rust-logs --source sidecar --duration 10000 --json
|
|
|
144
147
|
tauri-agent-tools rust-logs --source sidecar:ffmpeg --duration 5000 --json
|
|
145
148
|
```
|
|
146
149
|
|
|
147
|
-
###
|
|
150
|
+
### Merge scattered logs into one timeline (`logs`)
|
|
151
|
+
|
|
152
|
+
A real app spreads logs across the bridge ring buffer, the webview console, an on-disk `tauri-plugin-log` file, and sidecar output. `logs` discovers what's available, normalizes every source, and emits one **timestamp-ordered** stream (NDJSON by default; `--pretty` for humans). Works with no bridge.
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Merge the on-disk log dir (auto-resolved from tauri.conf.json) + the bridge ring buffer
|
|
156
|
+
tauri-agent-tools logs --config ./src-tauri --pretty
|
|
157
|
+
|
|
158
|
+
# No source tree handy? Locate the OS log dir from a bundle id; skip the bridge
|
|
159
|
+
tauri-agent-tools logs --identifier com.example.app --no-bridge
|
|
160
|
+
|
|
161
|
+
# Point at explicit files / a custom dir; filter + infer correlation ids (run_id, requestId…)
|
|
162
|
+
tauri-agent-tools logs --log-dir ~/Library/Logs/com.example.app --level warn --correlate
|
|
163
|
+
tauri-agent-tools logs --log-file /path/a.log --log-file /path/b.log --filter "block_id=42"
|
|
164
|
+
|
|
165
|
+
# Follow live bridge logs until Ctrl-C (v0.8 bridge: non-draining cursor reads,
|
|
166
|
+
# safe to run alongside other log consumers). Against a pre-0.8 bridge it emits
|
|
167
|
+
# a one-time note and degrades to drain polling every --interval ms.
|
|
168
|
+
tauri-agent-tools logs --follow --level warn
|
|
169
|
+
tauri-agent-tools logs --follow --interval 1000 --pretty
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Each entry is `{ts, level, source, subsystem, message, origin}` (+ `correlation` with `--correlate`). `source` is `rust` / `sidecar:<name>` (bridge) or `file:<basename>` (disk). Timezone-less timestamps are read as UTC so ordering is host-independent.
|
|
148
173
|
|
|
149
|
-
|
|
174
|
+
### Bridge-extended diagnostics (process tree, capabilities, devtools, health)
|
|
175
|
+
|
|
176
|
+
These commands prefer richer endpoints on a v0.7+ bridge but **degrade gracefully** against older/vendored bridges: each calls `GET /version` first to feature-detect, and when an endpoint is missing it emits a clear `note:` (and falls back where it can) instead of failing. Pass `--strict` to make a missing endpoint a hard error instead.
|
|
150
177
|
|
|
151
178
|
```bash
|
|
152
|
-
# Tauri PID + registered sidecars (uses /process)
|
|
179
|
+
# Tauri PID + registered sidecars (uses /process on a v0.7+ bridge).
|
|
180
|
+
# On older bridges it degrades to an OS walk when the app PID is resolvable.
|
|
153
181
|
tauri-agent-tools process-tree --json
|
|
154
182
|
|
|
183
|
+
# Walk the REAL OS descendant tree — sidecar children, MCP servers, ML workers —
|
|
184
|
+
# without the bridge at all (great for unregistered grandchildren):
|
|
185
|
+
tauri-agent-tools process-tree --deep --json
|
|
186
|
+
tauri-agent-tools process-tree --deep --pid 12345 # no bridge needed with an explicit PID
|
|
187
|
+
|
|
155
188
|
# Devtron-style live capability audit (uses /capabilities)
|
|
156
189
|
tauri-agent-tools capabilities audit --json
|
|
157
190
|
# findings[] flag wildcard "*", over-broad shell:/fs:/http: scopes,
|
|
@@ -166,7 +199,7 @@ tauri-agent-tools webview attach --open # launch in default browser
|
|
|
166
199
|
tauri-agent-tools health --json
|
|
167
200
|
```
|
|
168
201
|
|
|
169
|
-
Sidecars only appear in `process-tree`
|
|
202
|
+
Sidecars only appear in the bridge's `/process` view (`process-tree` without `--deep`, and `health`) if integrators register them — by passing `Some(®istry)` to `dev_bridge::spawn_sidecar_monitored` or calling `dev_bridge::register_sidecar`. **`process-tree --deep` needs none of that** — it reads the live OS process table, so it surfaces unregistered children and grandchildren regardless.
|
|
170
203
|
|
|
171
204
|
### Bridge-free diagnostics (post-mortem & sidecar workflows)
|
|
172
205
|
|
|
@@ -196,6 +229,15 @@ tauri-agent-tools sidecar replay /tmp/run.ndjson --to-exec node my-sidecar.js --
|
|
|
196
229
|
tauri-agent-tools forensics --config ./src-tauri -o ./forensics-out
|
|
197
230
|
# → ./forensics-out/{summary.md,summary.json,project.json,app-log-tail.txt,live-os-log.ndjson}
|
|
198
231
|
# summary.md includes detected panic markers + suggested next commands.
|
|
232
|
+
|
|
233
|
+
# One-shot SHAREABLE incident bundle: merges logs + deep process tree + app-paths +
|
|
234
|
+
# forensics (+ optional UI capture) into one redacted directory and a .tar.gz.
|
|
235
|
+
tauri-agent-tools bundle --config ./src-tauri -o ./triage
|
|
236
|
+
# → ./triage/{logs.ndjson,process-tree.json,app-paths.json,forensics/,summary.md} + ./triage.tar.gz
|
|
237
|
+
tauri-agent-tools bundle --config ./src-tauri --with-capture -o ./triage # also screenshot + DOM (needs bridge)
|
|
238
|
+
# Secrets (token/api_key/password/JWTs/AWS keys/…) and PII (emails, IPs, phone
|
|
239
|
+
# numbers, home paths) are redacted from text artifacts on write; unredacted
|
|
240
|
+
# images are flagged as warnings in the redact phase.
|
|
199
241
|
```
|
|
200
242
|
|
|
201
243
|
### Watch DOM mutations
|
|
@@ -296,7 +338,7 @@ tauri-agent-tools eval "document.title" --window-label overlay --json
|
|
|
296
338
|
| `wait` | `--selector <css>`, `--eval <js>`, `--title <regex>`, `--timeout <ms>` | selector/eval: yes | Wait for a condition |
|
|
297
339
|
| `list-windows` | `--tauri`, `--json` | no | List visible windows |
|
|
298
340
|
| `info` | `--title <regex>`, `--json` | no | Window geometry and display info |
|
|
299
|
-
| `ipc-monitor` | `--filter <cmd>`, `--duration <ms>`, `--json` | yes | Monitor Tauri IPC calls |
|
|
341
|
+
| `ipc-monitor` | `--filter <cmd>`, `--duration <ms>`, `--slow <ms>`, `--stats`, `--json` | yes | Monitor Tauri IPC calls; flag slow calls + per-command latency summary |
|
|
300
342
|
| `console-monitor` | `--level <lvl>`, `--filter <regex>`, `--duration <ms>`, `--json` | yes | Monitor console output |
|
|
301
343
|
| `rust-logs` | `--level <lvl>`, `--target <regex>`, `--source <src>`, `--duration <ms>`, `--json` | yes | Monitor Rust logs and sidecar output |
|
|
302
344
|
| `storage` | `--type <local\|session\|cookies\|all>`, `--key <name>`, `--json` | yes | Inspect browser storage |
|
|
@@ -319,13 +361,15 @@ tauri-agent-tools eval "document.title" --window-label overlay --json
|
|
|
319
361
|
| `config inspect` | `--config <path>`, `--capabilities-dir <path>`, `--cargo-toml <path>`, `--json` | no | Structured `tauri.conf.json` snapshot + capability audit |
|
|
320
362
|
| `os-logs` | `--identifier <id>`, `--level <lvl>`, `--source <src>`, `--since <dur>`, `--duration <ms>`, `--json` | no | Tail host OS log stream filtered to a Tauri bundle id |
|
|
321
363
|
| `sidecar tap` | `-- <cmd...>`, `--schema <path>`, `--record <path>`, `--raw`, `--json` | no | Wrap-and-run a sidecar, frame NDJSON, validate envelopes |
|
|
322
|
-
| `sidecar replay` | `<file>`, `--to-exec <cmd>`, `--rate <lps>`, `--loop` | no | Replay a recorded NDJSON sidecar stream |
|
|
364
|
+
| `sidecar replay` | `<file>`, `--to-exec <cmd>`, `--rate <lps>`, `--loop`, `--tap-format`, `--dir in\|out` | no | Replay a recorded NDJSON sidecar stream; `--tap-format` unwraps `{dir,ts,line}` tap wrapper rows |
|
|
323
365
|
| `forensics` | `--config <path>`, `--identifier <id>`, `-o <dir>`, `--since <dur>`, `--json` | no | One-shot forensic bundle (works on dead apps) |
|
|
324
|
-
| `
|
|
366
|
+
| `logs` | `--config <path>`, `--identifier <id>`, `--log-dir <path>`, `--log-file <path>`, `--level <lvl>`, `--source <re>`, `--filter <re>`, `--correlate`, `--follow`, `--interval <ms>`, `--no-bridge`, `--pretty` | optional | Merge on-disk log files + bridge ring buffer into one timestamp-ordered stream; `--follow` tails the bridge via v0.8 cursor reads (drain-polling fallback on older bridges) |
|
|
367
|
+
| `process-tree` | `--deep`, `--pid <n>`, `--json` | optional | Tauri PID + sidecars (bridge /process); `--deep` walks the full OS descendant tree without the bridge |
|
|
325
368
|
| `capabilities audit` | `--json` | yes (v0.7+) | Live Devtron-style audit of declared Tauri capabilities |
|
|
326
369
|
| `webview attach` | `--print-url`, `--open`, `--json` | yes (v0.7+) | Print webview inspector URL or platform hint |
|
|
327
370
|
| `health` | `--json` | yes (v0.7+) | Uptime + webview/sidecar liveness (exit non-zero if unhealthy) |
|
|
328
371
|
| `diagnose` | `--config <path>`, `-o <dir>`, `--since <dur>`, `--no-bridge`, `--json` | optional | Best-effort super-bundle (forensics + live bridge enrichment) |
|
|
372
|
+
| `bundle` | `--config <path>`, `-o <dir>`, `--with-capture`, `--no-archive`, `--json` | optional | Shareable incident bundle: logs + deep process tree + app-paths + forensics → redacted dir + .tar.gz |
|
|
329
373
|
|
|
330
374
|
## Targeting Flags
|
|
331
375
|
|
|
@@ -333,6 +377,7 @@ All bridge-dependent commands support these flags:
|
|
|
333
377
|
- `--port <n>` / `--token <s>` — explicit bridge config (skips auto-discovery)
|
|
334
378
|
- `--pid <n>` — target a specific app by PID
|
|
335
379
|
- `--window-label <label>` — target a specific webview window (default: main)
|
|
380
|
+
- `--strict` — for v0.7-endpoint commands, fail with an upgrade error instead of degrading when the bridge is too old
|
|
336
381
|
|
|
337
382
|
## Important Notes
|
|
338
383
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tauri-bridge-setup
|
|
3
3
|
description: How to add the tauri-agent-tools Rust dev bridge to a Tauri application
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.9.0
|
|
5
5
|
tags: [tauri, rust, bridge, setup, integration, multi-window, process-tree, capabilities, devtools, health]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -11,9 +11,13 @@ Add the dev bridge to a Tauri app so `tauri-agent-tools` can inspect DOM, evalua
|
|
|
11
11
|
|
|
12
12
|
The bridge runs **only in debug builds** and is stripped from release builds automatically.
|
|
13
13
|
|
|
14
|
-
## Re-copying for v0.
|
|
14
|
+
## Re-copying for v0.8 (optional enrichment — not required)
|
|
15
15
|
|
|
16
|
-
> **Upgrading from v0.
|
|
16
|
+
> **Upgrading from v0.7:** Bridge v0.8 adds cursor-mode `/logs` reads (non-draining, long-polling) that power `logs --follow` and let multiple log consumers coexist. It is a **drop-in re-copy** of `dev_bridge.rs` — no `main.rs` changes this time. Without it, `logs --follow` emits a one-time note and degrades to drain polling.
|
|
17
|
+
|
|
18
|
+
## Re-copying for v0.7 (optional enrichment — not required)
|
|
19
|
+
|
|
20
|
+
> **Upgrading from v0.6:** The bridge surface grew with four new endpoints (`/process`, `/capabilities`, `/devtools`, `/health`) and `start_bridge` now returns a third tuple element (the sidecar registry). These are **optional enrichment**: as of CLI v0.8 the commands that use them (`process-tree`, `capabilities audit`, `webview attach`, `health`) feature-detect via `GET /version` and **degrade gracefully** against an older/vendored bridge — they emit a clear `note:` (and fall back to an OS/eval path where possible) instead of failing. So you are **not forced to re-sync** `dev_bridge.rs` just to keep using the CLI. To unlock the richer structured output, **re-copy `dev_bridge.rs` from the latest `examples/tauri-bridge/src/dev_bridge.rs`** and adjust your `main.rs` to destructure the new return shape (Step 3). Pass `--strict` to any of those commands to turn a missing endpoint back into a hard error.
|
|
17
21
|
|
|
18
22
|
## Bridge Endpoints
|
|
19
23
|
|
|
@@ -22,7 +26,7 @@ The bridge exposes eight HTTP endpoints on a random localhost port:
|
|
|
22
26
|
| Endpoint | Method | Auth | Purpose |
|
|
23
27
|
|----------|--------|------|---------|
|
|
24
28
|
| `/eval` | POST | token | Evaluate JS in a webview (supports `window` param for multi-window) |
|
|
25
|
-
| `/logs` | POST | token |
|
|
29
|
+
| `/logs` | POST | token | Rust tracing logs and sidecar output — bare `{token}` drains; `{cursor, waitMs, limit}` (**v0.8+**) reads without draining so multiple consumers can tail (powers `logs --follow`) |
|
|
26
30
|
| `/describe` | POST | token | Report PID, window labels, and capabilities |
|
|
27
31
|
| `/version` | GET | none | Bridge version and available endpoints (used for feature detection) |
|
|
28
32
|
| `/process` | POST | token | Tauri PID + registered sidecars (powers `process-tree`) — **v0.7+** |
|
|
@@ -184,6 +188,8 @@ dev_bridge::register_sidecar(
|
|
|
184
188
|
|
|
185
189
|
Then monitor with: `tauri-agent-tools rust-logs --source sidecar --duration 10000`, view the tree with `tauri-agent-tools process-tree`, and check liveness with `tauri-agent-tools health`.
|
|
186
190
|
|
|
191
|
+
> Registration is only needed for the bridge's **named** `/process` view (and `health` liveness). If you just want to *see* the process tree — including children and grandchildren you spawned yourself — `tauri-agent-tools process-tree --deep` reads the live OS process table and needs no registration (or even no bridge, with `--pid`).
|
|
192
|
+
|
|
187
193
|
## Troubleshooting
|
|
188
194
|
|
|
189
195
|
**"No bridge found" error:**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tauri-debug-quickstart
|
|
3
3
|
description: First-30-seconds triage for a broken Tauri desktop app. Pick the right command for the symptom you're seeing, with one-line escalations to deeper skills.
|
|
4
|
-
version: 0.
|
|
5
|
-
tags: [tauri, debugging, triage, quickstart, decision-tree, forensics, diagnose]
|
|
4
|
+
version: 0.9.0
|
|
5
|
+
tags: [tauri, debugging, triage, quickstart, decision-tree, logs, process-tree, bundle, forensics, diagnose]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Tauri Debug Quickstart
|
|
@@ -35,13 +35,17 @@ Pick the row that matches what's broken. Each command works without the bridge u
|
|
|
35
35
|
| Don't know what's wrong | `tauri-agent-tools diagnose -o ./diag` | Everything-bundle; graceful on dead apps |
|
|
36
36
|
| App crashed at startup | `tauri-agent-tools forensics --config ./src-tauri -o ./forensics` | Reads app log + DiagnosticReports without needing a live process |
|
|
37
37
|
| App is running but bridge isn't responding | `tauri-agent-tools probe` | Detects whether the bridge process is up and shows token-file state |
|
|
38
|
-
| App is running, bridge is up, but webview looks wrong | `tauri-agent-tools health --json`
|
|
38
|
+
| App is running, bridge is up, but webview looks wrong | `tauri-agent-tools health --json` | Returns webview_ready + sidecar liveness (richer on bridge v0.7+; degrades to a liveness ping otherwise) |
|
|
39
|
+
| Evidence is scattered across webview/Rust/sidecar logs | `tauri-agent-tools logs --config ./src-tauri --pretty` | Merges on-disk log files + the bridge ring buffer into one timestamp-ordered timeline |
|
|
40
|
+
| Need to watch logs live while reproducing | `tauri-agent-tools logs --follow --pretty` | Needs bridge; multi-consumer-safe on bridge v0.8+, drain-polling fallback otherwise |
|
|
41
|
+
| What did the sidecar actually spawn (MCP servers, workers)? | `tauri-agent-tools process-tree --deep --json` | Walks the real OS descendant tree, including unregistered grandchildren — no bridge needed |
|
|
42
|
+
| Need one shareable archive of everything for a bug report | `tauri-agent-tools bundle --config ./src-tauri -o ./triage` | Logs + deep process tree + app-paths + forensics → redacted dir + `.tar.gz` |
|
|
39
43
|
| A sidecar process is the suspect | `tauri-agent-tools sidecar tap --schema ./schema.json -- <cmd>` | Wrap-and-run the sidecar standalone; frame NDJSON; validate envelopes |
|
|
40
44
|
| Need to know exactly which files the app touches | `tauri-agent-tools app-paths --config ./src-tauri --exists` | Resolves Tauri 2's per-platform `app_data_dir`/`app_log_dir`/etc. + checks existence |
|
|
41
45
|
| Need to audit Tauri capabilities for over-broad permissions | `tauri-agent-tools config inspect --config ./src-tauri` (static) **or** `tauri-agent-tools capabilities audit` (live, needs bridge v0.7+) | Flags `*`, `fs:allow-all`, `shell:allow-spawn`, etc. |
|
|
42
46
|
| OS-level error visible in Console.app or journalctl | `tauri-agent-tools os-logs --identifier com.example.app --level error --duration 30000` | Filters platform log stream to the Tauri bundle id |
|
|
43
47
|
| Inspector / webview attach | `tauri-agent-tools webview attach` *(needs bridge v0.7+)* | Returns inspector URL or platform-specific hint |
|
|
44
|
-
| What sidecars did this app spawn? | `tauri-agent-tools process-tree --json`
|
|
48
|
+
| What sidecars did this app spawn? | `tauri-agent-tools process-tree --json` (or `--deep`) | Bridge /process lists registered sidecars (v0.7+); `--deep` walks the OS tree with no bridge |
|
|
45
49
|
|
|
46
50
|
## Decision tree
|
|
47
51
|
|
|
@@ -66,8 +70,8 @@ When in doubt, escalate to `diagnose` — its `summary.md` will tell you which d
|
|
|
66
70
|
|
|
67
71
|
- All commands accept `--json` for machine-readable output.
|
|
68
72
|
- Bundle commands (`forensics`, `diagnose`) write a `summary.md` agents can open directly and a `summary.json` agents can parse.
|
|
69
|
-
- Streaming commands (`os-logs`, `rust-logs`, `sidecar tap`) emit one NDJSON envelope per line on stdout.
|
|
70
|
-
- Bridge v0.7+ commands feature-detect via `GET /version` and
|
|
73
|
+
- Streaming commands (`os-logs`, `rust-logs`, `sidecar tap`, `logs --follow`) and one-shot `logs` emit one NDJSON envelope per line on stdout.
|
|
74
|
+
- Bridge v0.7+ commands feature-detect via `GET /version` and **degrade gracefully** (a clear `note:`, plus an OS/eval fallback where possible) against older bridges. Pass `--strict` to turn a missing endpoint into a hard error instead.
|
|
71
75
|
|
|
72
76
|
## When this skill is wrong
|
|
73
77
|
|
package/AGENTS.md
CHANGED
|
@@ -4,12 +4,13 @@ CLI tool for agent-driven inspection and interaction with Tauri desktop applicat
|
|
|
4
4
|
|
|
5
5
|
## Agent Skills
|
|
6
6
|
|
|
7
|
-
This package includes
|
|
7
|
+
This package includes three [Agent Skills](https://agentskills.io):
|
|
8
8
|
|
|
9
9
|
| Skill | Path | Purpose |
|
|
10
10
|
|-------|------|---------|
|
|
11
|
-
| `tauri-agent-tools` | `.agents/skills/tauri-agent-tools/SKILL.md` | Using all
|
|
11
|
+
| `tauri-agent-tools` | `.agents/skills/tauri-agent-tools/SKILL.md` | Using all 38 CLI commands to inspect and interact with Tauri apps |
|
|
12
12
|
| `tauri-bridge-setup` | `.agents/skills/tauri-bridge-setup/SKILL.md` | Adding the Rust dev bridge to a Tauri project |
|
|
13
|
+
| `tauri-debug-quickstart` | `.agents/skills/tauri-debug-quickstart/SKILL.md` | First-30-seconds triage — pick the right command for the symptom |
|
|
13
14
|
|
|
14
15
|
## Quick Reference
|
|
15
16
|
|
|
@@ -20,11 +21,20 @@ This package includes two [Agent Skills](https://agentskills.io):
|
|
|
20
21
|
**Standalone commands** (no bridge needed):
|
|
21
22
|
`list-windows`, `info`, `screenshot --title`, `wait --title`, `diff`
|
|
22
23
|
|
|
24
|
+
**Bridge-free diagnostics** (work on release builds, dead apps, and sidecars — no bridge required):
|
|
25
|
+
`app-paths`, `config inspect`, `os-logs`, `sidecar tap`, `sidecar replay`, `forensics`, `logs` (also reads the live bridge ring buffer when present), `process-tree --deep` (walks the full OS descendant tree)
|
|
26
|
+
|
|
23
27
|
**Bridge-required commands** (Tauri app must have dev bridge running):
|
|
24
28
|
`dom`, `eval`, `screenshot --selector`, `wait --selector/--eval`, `ipc-monitor`, `console-monitor`, `rust-logs`, `storage`, `page-state`, `mutations`, `snapshot`, `click`, `type`, `scroll`, `focus`, `navigate`, `select`, `invoke`, `capture`, `check`, `store-inspect`
|
|
25
29
|
|
|
30
|
+
**Bridge-extending diagnostics** (require bridge v0.7+; degrade gracefully against older/vendored bridges, or pass `--strict` to fail):
|
|
31
|
+
`process-tree`, `capabilities audit`, `webview attach`, `health`
|
|
32
|
+
|
|
33
|
+
**Super-commands** (best-effort, compose the above):
|
|
34
|
+
`diagnose` (one-shot triage report), `bundle` (shareable, redacted incident archive → directory + `.tar.gz`)
|
|
35
|
+
|
|
26
36
|
**Optional bridge:**
|
|
27
|
-
`probe` (works standalone to discover bridges, richer output with bridge)
|
|
37
|
+
`probe` (works standalone to discover bridges, richer output with bridge), `logs` (on-disk only with `--no-bridge`)
|
|
28
38
|
|
|
29
39
|
**Multi-app targeting:** Use `--pid <n>` to target a specific app. Use `--window-label <label>` for multi-window apps.
|
|
30
40
|
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Agent-driven inspection toolkit for Tauri desktop apps**
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
38 commands to screenshot, inspect, interact with, monitor, post-mortem, audit, and diagnose Tauri apps from the CLI.
|
|
8
8
|
|
|
9
9
|
[](https://github.com/cesarandreslopez/tauri-agent-tools/actions/workflows/ci.yml)
|
|
10
10
|
[](https://www.npmjs.com/package/tauri-agent-tools)
|
|
@@ -269,11 +269,13 @@ Interaction commands dispatch DOM events inside the webview. They require the de
|
|
|
269
269
|
|
|
270
270
|
| Command | Description |
|
|
271
271
|
|---------|-------------|
|
|
272
|
-
| `probe` | Discover running bridges, check health, list windows |
|
|
272
|
+
| `probe` | Discover running bridges, check health, list windows. With no explicit `--port`/`--token`/`--pid` and no bridge discoverable, reports instead of throwing (`target.alive=false` plus an actionable note, so callers can branch on the JSON) |
|
|
273
273
|
| `capture -o <dir>` | Full debug evidence bundle (screenshot, DOM, page state, storage, console errors, Rust logs) |
|
|
274
274
|
| `check` | Structured assertions (`--selector`, `--text`, `--eval`, `--no-errors`) — exits 0/1 |
|
|
275
275
|
| `store-inspect` | Inspect reactive store state (Pinia, Vue devtools, custom hooks) |
|
|
276
276
|
|
|
277
|
+
`capture`'s pipeline is also callable as a library: `captureToDir(bridge, adapter, opts)` returns the `CaptureManifest`. Deep-import it from `tauri-agent-tools/dist/commands/capture.js` — there is no package-root library entry point (the root is the CLI).
|
|
278
|
+
|
|
277
279
|
### Targeting Flags
|
|
278
280
|
|
|
279
281
|
All bridge-dependent commands support:
|
|
@@ -304,8 +306,9 @@ See [`docs/troubleshooting/decision-tree.md`](docs/troubleshooting/decision-tree
|
|
|
304
306
|
Four commands that talk to new dev-bridge endpoints. Each feature-detects via `GET /version` and surfaces an actionable upgrade error when the bridge is older than v0.7.0.
|
|
305
307
|
|
|
306
308
|
```bash
|
|
307
|
-
# Tauri PID + registered sidecars
|
|
309
|
+
# Tauri PID + registered sidecars (--deep walks the full OS descendant tree, no bridge needed)
|
|
308
310
|
tauri-agent-tools process-tree --json
|
|
311
|
+
tauri-agent-tools process-tree --deep --json
|
|
309
312
|
|
|
310
313
|
# Live capability audit (vs. config inspect which reads JSON files)
|
|
311
314
|
tauri-agent-tools capabilities audit --json
|
|
@@ -341,6 +344,7 @@ tauri-agent-tools os-logs --level error --source main --duration 30000
|
|
|
341
344
|
tauri-agent-tools sidecar tap --schema ./schema.json --record /tmp/run.ndjson -- node my-sidecar.js
|
|
342
345
|
# Replay the recording deterministically — to stdout or into a fresh sidecar's stdin
|
|
343
346
|
tauri-agent-tools sidecar replay /tmp/run.ndjson --to-exec node my-sidecar.js --rate 100
|
|
347
|
+
tauri-agent-tools sidecar replay /tmp/ipc-tap.ndjson --tap-format --dir out # (new in 0.9) unwrap {dir,ts,line} tap rows, replay one direction
|
|
344
348
|
|
|
345
349
|
# Forensic bundle for post-crash analysis (composes the above; works on dead apps)
|
|
346
350
|
tauri-agent-tools forensics --config ./src-tauri -o ./forensics-out
|
|
@@ -352,6 +356,29 @@ When to reach for them:
|
|
|
352
356
|
- **A sidecar is the suspect** → run it under `sidecar tap` instead of under Tauri.
|
|
353
357
|
- **You don't have source on hand, just a bundle id** → `app-paths --identifier com.example.app`.
|
|
354
358
|
|
|
359
|
+
## Unified logs and incident bundles (new in 0.8)
|
|
360
|
+
|
|
361
|
+
When you need the *whole* picture — every log line in order, or a single shareable archive of an incident:
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
# Merge on-disk tauri-plugin-log files + the live bridge /logs ring buffer into one
|
|
365
|
+
# timestamp-ordered stream (UTC-normalized). NDJSON by default; --pretty for humans.
|
|
366
|
+
tauri-agent-tools logs --config ./src-tauri --pretty
|
|
367
|
+
tauri-agent-tools logs --level warn --correlate # filter + infer run_id/requestId ids
|
|
368
|
+
tauri-agent-tools logs --no-bridge # on-disk files only (no running app)
|
|
369
|
+
|
|
370
|
+
# Tail live bridge logs until interrupted (new in 0.9; v0.8 bridge: non-draining
|
|
371
|
+
# cursor reads — older bridges degrade to drain polling every --interval ms, default 2000)
|
|
372
|
+
tauri-agent-tools logs --follow --level warn
|
|
373
|
+
|
|
374
|
+
# Collect a shareable incident bundle: merged logs + deep process tree + app-paths +
|
|
375
|
+
# forensics (+ optional UI capture) → a redacted directory and a .tar.gz.
|
|
376
|
+
tauri-agent-tools bundle --config ./src-tauri -o ./incident --since 10m
|
|
377
|
+
tauri-agent-tools bundle --with-capture # also snapshot the UI (needs live bridge)
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
`logs` works with no bridge (it reads the on-disk log files); a running bridge just adds the live ring buffer. `bundle` redacts secrets (tokens, API keys, passwords, JWTs, AWS keys) and PII (emails, IPs, phone numbers, home paths — including base64-encoded ones) from artifacts on write; `.json`/`.ndjson` artifacts stay parseable, unredacted images are flagged as warnings, and it degrades cleanly when a phase can't run.
|
|
381
|
+
|
|
355
382
|
## How It Works
|
|
356
383
|
|
|
357
384
|
```
|
|
@@ -417,8 +444,9 @@ This package ships [Agent Skills](https://agentskills.io) so AI coding agents ca
|
|
|
417
444
|
|
|
418
445
|
| Skill | Description |
|
|
419
446
|
|-------|-------------|
|
|
420
|
-
| `tauri-agent-tools` | Using all
|
|
447
|
+
| `tauri-agent-tools` | Using all 38 CLI commands to inspect and interact with Tauri apps |
|
|
421
448
|
| `tauri-bridge-setup` | Adding the Rust dev bridge to a Tauri project |
|
|
449
|
+
| `tauri-debug-quickstart` | First-30-seconds triage — pick the right command for the symptom |
|
|
422
450
|
|
|
423
451
|
<details>
|
|
424
452
|
<summary><strong>Claude Code</strong></summary>
|
|
@@ -471,7 +499,7 @@ Full documentation is available at the [docs site](https://cesarandreslopez.gith
|
|
|
471
499
|
- [Installation](https://cesarandreslopez.github.io/tauri-agent-tools/getting-started/installation/) — system requirements and setup
|
|
472
500
|
- [Quick Start](https://cesarandreslopez.github.io/tauri-agent-tools/getting-started/quick-start/) — get running in 5 minutes
|
|
473
501
|
- [Bridge Setup](https://cesarandreslopez.github.io/tauri-agent-tools/getting-started/bridge-setup/) — integrate the Rust bridge into your Tauri app
|
|
474
|
-
- [Command Reference](https://cesarandreslopez.github.io/tauri-agent-tools/commands/) — all
|
|
502
|
+
- [Command Reference](https://cesarandreslopez.github.io/tauri-agent-tools/commands/) — all 38 commands with examples
|
|
475
503
|
- [Platform Support](https://cesarandreslopez.github.io/tauri-agent-tools/platform-support/) — X11, Wayland, macOS details
|
|
476
504
|
- [Architecture](https://cesarandreslopez.github.io/tauri-agent-tools/architecture/overview/) — how it works under the hood
|
|
477
505
|
|
package/dist/bridge/client.d.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import type { BridgeConfig } from '../schemas/bridge.js';
|
|
2
2
|
import type { ElementRect, RustLogEntry, DescribeResponse, VersionResponse, ProcessResponse, CapabilitiesResponse, DevtoolsResponse, HealthResponse } from '../schemas/bridge.js';
|
|
3
3
|
import type { A11yNode } from '../schemas/dom.js';
|
|
4
|
+
interface FetchLogsOptions {
|
|
5
|
+
cursor?: number;
|
|
6
|
+
waitMs?: number;
|
|
7
|
+
limit?: number;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
}
|
|
10
|
+
interface FetchLogsCursorResponse {
|
|
11
|
+
entries: RustLogEntry[];
|
|
12
|
+
cursor?: number;
|
|
13
|
+
dropped?: number;
|
|
14
|
+
}
|
|
4
15
|
export declare class BridgeClient {
|
|
5
16
|
private baseUrl;
|
|
6
17
|
private token;
|
|
@@ -19,6 +30,7 @@ export declare class BridgeClient {
|
|
|
19
30
|
getDocumentTitle(): Promise<string>;
|
|
20
31
|
getAccessibilityTree(selector?: string, depth?: number): Promise<A11yNode | null>;
|
|
21
32
|
fetchLogs(timeout?: number): Promise<RustLogEntry[]>;
|
|
33
|
+
fetchLogs(opts: FetchLogsOptions): Promise<FetchLogsCursorResponse>;
|
|
22
34
|
ping(): Promise<boolean>;
|
|
23
35
|
describe(): Promise<DescribeResponse | null>;
|
|
24
36
|
version(): Promise<VersionResponse | null>;
|
|
@@ -29,9 +41,18 @@ export declare class BridgeClient {
|
|
|
29
41
|
* bridge is too old, with a hint pointing integrators at the example.
|
|
30
42
|
*/
|
|
31
43
|
requireEndpoint(path: string): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Non-throwing capability check: resolves true iff the running bridge
|
|
46
|
+
* advertises `path` in its `/version` endpoint list. Shares the `/version`
|
|
47
|
+
* cache with {@link requireEndpoint}, so repeated checks cost one roundtrip.
|
|
48
|
+
* Resolves false when the bridge is unreachable or too old to report
|
|
49
|
+
* `/version` — letting callers degrade gracefully instead of throwing.
|
|
50
|
+
*/
|
|
51
|
+
hasEndpoint(path: string): Promise<boolean>;
|
|
32
52
|
process(): Promise<ProcessResponse>;
|
|
33
53
|
capabilities(): Promise<CapabilitiesResponse>;
|
|
34
54
|
devtools(): Promise<DevtoolsResponse>;
|
|
35
55
|
health(): Promise<HealthResponse>;
|
|
36
56
|
private postAuthed;
|
|
37
57
|
}
|
|
58
|
+
export {};
|
package/dist/bridge/client.js
CHANGED
|
@@ -129,11 +129,20 @@ export class BridgeClient {
|
|
|
129
129
|
return null;
|
|
130
130
|
return A11yNodeSchema.parse(JSON.parse(String(result)));
|
|
131
131
|
}
|
|
132
|
-
async fetchLogs(
|
|
132
|
+
async fetchLogs(arg = 5000) {
|
|
133
|
+
const opts = typeof arg === 'number' ? undefined : arg;
|
|
134
|
+
const timeout = typeof arg === 'number' ? arg : arg.timeoutMs ?? 5000;
|
|
135
|
+
const body = { token: this.token };
|
|
136
|
+
if (opts?.cursor !== undefined)
|
|
137
|
+
body.cursor = opts.cursor;
|
|
138
|
+
if (opts?.waitMs !== undefined)
|
|
139
|
+
body.waitMs = opts.waitMs;
|
|
140
|
+
if (opts?.limit !== undefined)
|
|
141
|
+
body.limit = opts.limit;
|
|
133
142
|
const res = await fetch(`${this.baseUrl}/logs`, {
|
|
134
143
|
method: 'POST',
|
|
135
144
|
headers: { 'Content-Type': 'application/json' },
|
|
136
|
-
body: JSON.stringify(
|
|
145
|
+
body: JSON.stringify(body),
|
|
137
146
|
signal: AbortSignal.timeout(timeout),
|
|
138
147
|
});
|
|
139
148
|
if (!res.ok) {
|
|
@@ -147,6 +156,13 @@ export class BridgeClient {
|
|
|
147
156
|
throw new Error(`Bridge error (${res.status}): ${text}`);
|
|
148
157
|
}
|
|
149
158
|
const data = BridgeLogsResponseSchema.parse(await res.json());
|
|
159
|
+
if (opts !== undefined) {
|
|
160
|
+
return {
|
|
161
|
+
entries: data.entries,
|
|
162
|
+
cursor: data.cursor,
|
|
163
|
+
dropped: data.dropped,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
150
166
|
return data.entries;
|
|
151
167
|
}
|
|
152
168
|
async ping() {
|
|
@@ -217,6 +233,26 @@ export class BridgeClient {
|
|
|
217
233
|
`Re-copy examples/tauri-bridge/src/dev_bridge.rs into your app and rebuild — ` +
|
|
218
234
|
`see rust-bridge/README.md.`);
|
|
219
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Non-throwing capability check: resolves true iff the running bridge
|
|
238
|
+
* advertises `path` in its `/version` endpoint list. Shares the `/version`
|
|
239
|
+
* cache with {@link requireEndpoint}, so repeated checks cost one roundtrip.
|
|
240
|
+
* Resolves false when the bridge is unreachable or too old to report
|
|
241
|
+
* `/version` — letting callers degrade gracefully instead of throwing.
|
|
242
|
+
*/
|
|
243
|
+
async hasEndpoint(path) {
|
|
244
|
+
if (this.versionUnreachable)
|
|
245
|
+
return false;
|
|
246
|
+
if (this.versionCache === null) {
|
|
247
|
+
const v = await this.version();
|
|
248
|
+
if (v === null) {
|
|
249
|
+
this.versionUnreachable = true;
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
this.versionCache = v;
|
|
253
|
+
}
|
|
254
|
+
return this.versionCache.endpoints.includes(path);
|
|
255
|
+
}
|
|
220
256
|
async process() {
|
|
221
257
|
await this.requireEndpoint('/process');
|
|
222
258
|
const res = await this.postAuthed('/process');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bridge/client.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAW9B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD;;;;GAIG;AACH,MAAM,oBAAoB,GAA2B;IACnD,UAAU,EAAE,OAAO;IACnB,eAAe,EAAE,OAAO;IACxB,WAAW,EAAE,OAAO;IACpB,SAAS,EAAE,OAAO;CACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bridge/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readdir, readFile, unlink } from 'node:fs/promises';
|
|
1
|
+
import { readdir, readFile, stat, unlink } from 'node:fs/promises';
|
|
2
2
|
import { tmpdir } from 'node:os';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { TokenFileSchema } from '../schemas/bridge.js';
|
|
@@ -30,6 +30,7 @@ async function scanTokenDir(tokenDir) {
|
|
|
30
30
|
for (const file of tokenFiles) {
|
|
31
31
|
const filePath = join(tokenDir, file);
|
|
32
32
|
try {
|
|
33
|
+
const fileStats = await stat(filePath);
|
|
33
34
|
const content = await readFile(filePath, 'utf-8');
|
|
34
35
|
const data = TokenFileSchema.parse(JSON.parse(content));
|
|
35
36
|
if (!isPidAlive(data.pid)) {
|
|
@@ -38,6 +39,8 @@ async function scanTokenDir(tokenDir) {
|
|
|
38
39
|
continue;
|
|
39
40
|
}
|
|
40
41
|
found.push({
|
|
42
|
+
fileName: file,
|
|
43
|
+
mtimeMs: fileStats.mtimeMs,
|
|
41
44
|
pid: data.pid,
|
|
42
45
|
config: { port: data.port, token: data.token },
|
|
43
46
|
});
|
|
@@ -47,7 +50,7 @@ async function scanTokenDir(tokenDir) {
|
|
|
47
50
|
continue;
|
|
48
51
|
}
|
|
49
52
|
}
|
|
50
|
-
return found;
|
|
53
|
+
return found.sort((a, b) => b.mtimeMs - a.mtimeMs || b.fileName.localeCompare(a.fileName));
|
|
51
54
|
}
|
|
52
55
|
export async function discoverBridge() {
|
|
53
56
|
let first = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenDiscovery.js","sourceRoot":"","sources":["../../src/bridge/tokenDiscovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"tokenDiscovery.js","sourceRoot":"","sources":["../../src/bridge/tokenDiscovery.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -40,6 +40,8 @@ import { registerOsLogs } from './commands/osLogs.js';
|
|
|
40
40
|
import { registerSidecarTap } from './commands/sidecarTap.js';
|
|
41
41
|
import { registerSidecarReplay } from './commands/sidecarReplay.js';
|
|
42
42
|
import { registerForensics } from './commands/forensics.js';
|
|
43
|
+
import { registerLogs } from './commands/logs.js';
|
|
44
|
+
import { registerBundle } from './commands/bundle.js';
|
|
43
45
|
import { registerProcessTree } from './commands/processTree.js';
|
|
44
46
|
import { registerCapabilitiesAudit } from './commands/capabilitiesAudit.js';
|
|
45
47
|
import { registerWebviewAttach } from './commands/webviewAttach.js';
|
|
@@ -101,13 +103,15 @@ registerOsLogs(program);
|
|
|
101
103
|
registerSidecarTap(program);
|
|
102
104
|
registerSidecarReplay(program);
|
|
103
105
|
registerForensics(program);
|
|
106
|
+
registerLogs(program);
|
|
104
107
|
// ── Bridge-extending diagnostics (Tier 2 — requires bridge v0.7.0+) ──────────
|
|
105
108
|
registerProcessTree(program);
|
|
106
109
|
registerCapabilitiesAudit(program);
|
|
107
110
|
registerWebviewAttach(program);
|
|
108
111
|
registerHealth(program);
|
|
109
|
-
// ── Tier 3: super-
|
|
112
|
+
// ── Tier 3: super-commands (compose Tier 1 + Tier 2) ─────────────────────────
|
|
110
113
|
registerDiagnose(program);
|
|
114
|
+
registerBundle(program);
|
|
111
115
|
program.parseAsync().catch((err) => {
|
|
112
116
|
console.error(err instanceof Error ? err.message : String(err));
|
|
113
117
|
process.exitCode = 1;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|