tracer-sh 0.3.4 → 0.3.6

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/README.md CHANGED
@@ -10,14 +10,32 @@ During an incident, most time goes to switching between observability tools
10
10
  and gathering context — not fixing the problem. Tracer connects your providers
11
11
  to a single AI chat interface so you find the root cause in one place.
12
12
 
13
+ ## How it works
14
+
15
+ ```
16
+ ┌─────────┐ your API keys ┌──────────────────┐
17
+ │ │ ◄──────────────────────────►│ Observability │
18
+ │ Tracer │ │ Providers │
19
+ │ local │ your API keys ├──────────────────┤
20
+ │ │ ◄──────────────────────────►│ LLM Providers │
21
+ └─────────┘ └──────────────────┘
22
+ ```
23
+
24
+ Everything runs on your machine. Your data stays local in an encrypted SQLite
25
+ database. Tracer talks directly to your provider and LLM APIs using your own
26
+ API keys — no intermediary servers, no telemetry, no data leaves your machine
27
+ except the API calls you control.
28
+
13
29
  ## Debug
14
30
 
15
- Chat with an AI agent that queries your providers in real-time and finds root causes — all from a single conversation.
31
+ Chat with an AI agent that queries your providers in real time and finds root
32
+ causes — all from a single conversation.
16
33
 
17
- - Natural language investigation
34
+ - Natural language investigation across all connected providers
18
35
  - Live query execution with inline charts
36
+ - Attach evidence to any message — screenshots, log files, code, PDFs — via paperclip, drag-and-drop, or paste
19
37
  - Post-mortem reports — download as Markdown to share
20
- - Share investigations as PNG — drop the exported image back into Tracer to re-open the analysis
38
+ - Share investigations as PNG — drop the exported image onto the sidebar to re-open the full analysis
21
39
  - Agent memory across sessions
22
40
  - Session history and cost tracking
23
41
 
@@ -25,65 +43,26 @@ Chat with an AI agent that queries your providers in real-time and finds root ca
25
43
 
26
44
  ## Settings
27
45
 
28
- Configure providers, LLM credentials, agent behavior, and memory. All data is stored locally — nothing leaves your machine except the API calls you configure.
46
+ Configure providers, LLM credentials, integrations, and agent behavior. Each
47
+ provider setup includes connectivity tests and guidance on creating
48
+ least-privilege API keys.
29
49
 
30
- - Anthropic (Claude) and Google (Gemini) API keys
50
+ - LLM backends: Anthropic (Claude), Google (Gemini via AI Studio or Vertex AI)
31
51
  - Data provider setup with connectivity tests
52
+ - Jira integration
32
53
  - Thinking budgets and step limits
33
54
  - Agent memory management
34
55
 
35
56
  ![Settings page](docs/screenshots/settings_page.png)
36
57
 
37
- ## How it works
38
-
39
- ```
40
- ┌─────────┐ your API keys ┌──────────────────┐
41
- │ │ ◄──────────────────────────►│ Observability │
42
- │ Tracer │ │ Providers │
43
- │ local │ your API keys ├──────────────────┤
44
- │ │ ◄──────────────────────────►│ LLM Providers │
45
- └─────────┘ └──────────────────┘
46
- ```
47
-
48
- Everything runs on your machine. Your data stays local in an encrypted SQLite
49
- database. Tracer talks directly to your provider and LLM APIs using your own API
50
- keys — no intermediary servers, no data leaves your machine except API calls you control.
51
-
52
- ## Security
58
+ ## Supported providers
53
59
 
54
- Tracer is built **defense-in-depth**: your secrets provider and LLM API keys,
55
- integration tokens, chat history, and agent memory — sit behind several independent
56
- layers, so no single failure exposes them.
57
-
58
- - **Local-only.** Nothing leaves your machine except the provider and LLM API calls you configure. No Tracer servers, no telemetry, no sync.
59
- - **Encrypted at rest.** The entire SQLite database is encrypted with SQLCipher (AES-256). On disk it is ciphertext — a stolen laptop, a copied `.db` file, or a backup is useless without the key.
60
- - **Machine-bound, user-scoped key.** A random 256-bit key is generated on first run and stored in your OS keychain (macOS Keychain, Windows Credential Manager, or Linux Secret Service). It never leaves the machine and is scoped to your OS user, so another user on the same box can't read the database either.
61
- - **Hardened on disk.** The data directory is created owner-only (`0700`); if no keychain is available, the fallback key file is written `0600`.
62
-
63
- **Automatic and transparent.** New installs are encrypted from the first run. An
64
- existing plaintext database is migrated on the first launch of this version — the
65
- encrypted copy is verified and atomically swapped in, and no plaintext is left behind.
66
- There's nothing to enable.
67
-
68
- **CI / headless.** Where no keychain exists, supply the key yourself with
69
- `TRACER_DB_KEY` — a 64-character hex string (e.g. `openssl rand -hex 32`).
70
-
71
- **What this protects — and what it doesn't.** Encryption at rest defends the file
72
- (theft, backups, copies) and blocks other users on the same machine. It does **not**
73
- defend against you, the logged-in user, running code as yourself: the app must hold the
74
- key at runtime to read its own data, so anyone controlling your user session can too. No
75
- local-first app escapes this — it's the honest boundary of on-device encryption.
60
+ **Data:** New Relic (NRQL), Google Cloud (Logs, Traces, Metrics, Errors), PostHog (HogQL)
76
61
 
77
- **Key loss means data loss.** Because the key lives only in your keychain, losing it (an
78
- OS reinstall or keychain reset) makes the database unrecoverable. For a safety net, back
79
- up the `tracer-sh` / `db-key` keychain value somewhere secure.
62
+ **LLM:** Anthropic (Claude), Google (Gemini AI Studio or Vertex AI)
80
63
 
81
- **Verify it yourself.** The raw file should be unreadable without the key:
82
-
83
- ```bash
84
- sqlite3 ~/.tracer/data/tracer.db '.tables' # → "Error: file is not a database"
85
- head -c 16 ~/.tracer/data/tracer.db | od -c # → random bytes, not "SQLite format 3"
86
- ```
64
+ **Integrations:** Jira the agent reads issue details and comment threads for
65
+ incident context, and posts comments back only when you explicitly ask.
87
66
 
88
67
  ## Install
89
68
 
@@ -95,8 +74,6 @@ Requires [Node.js 20+](https://nodejs.org/).
95
74
  npx tracer-sh@latest
96
75
  ```
97
76
 
98
- `npx` is ephemeral — it runs the newest published version on every launch and isn't a pinned version.
99
-
100
77
  **Install a pinned copy:**
101
78
 
102
79
  ```bash
@@ -104,42 +81,69 @@ npm install -g tracer-sh
104
81
  tracer-sh
105
82
  ```
106
83
 
107
- The first run gets the latest version; it then stays on that version until you explicitly update — either with **Update now** in the app (click the version in the sidebar) or by re-running the install.
108
-
109
- **Which should I pick?** Use the global install if you want a stable version that only changes when you choose; use `npx` to always grab the newest with zero install.
84
+ Either way, Tracer stays on its installed version until you explicitly update:
85
+ click the version in the sidebar and hit **Update now**, or re-run the install
86
+ command. Note that bare `npx tracer-sh` reuses npm's cached copy and does NOT
87
+ check for new releases — use the in-app update or `npx tracer-sh@latest` to get
88
+ the newest version.
110
89
 
111
- Open `http://localhost:3579`, go to **Settings** to add your API keys and choose an LLM — done.
90
+ Open `http://localhost:3579`, go to **Settings** to add your API keys and
91
+ choose an LLM — done.
112
92
 
113
93
  ## Headless / CLI
114
94
 
115
- Run an investigation from the terminal and get back the final analysis — so other tools and agents (including Claude Code) can drive Tracer:
95
+ Run an investigation from the terminal and get back the final analysis — so
96
+ other tools and agents (including Claude Code) can drive Tracer:
116
97
 
117
98
  ```bash
118
99
  tracer-sh analyze "Why did checkout error rate spike after 14:00 UTC?"
119
100
  ```
120
101
 
121
- Continue a prior run with `--session <id>`; pass `--json` for the full response (session id, queries, usage). Requires a running server.
102
+ - `--session <id>` continue a prior run with full context
103
+ - `--provider <name>` — scope the investigation to one provider
104
+ - `--json` — full response envelope (session id, queries, usage)
105
+ - `tracer-sh --help` — usage for every subcommand
122
106
 
123
- ## Supported Providers
107
+ Requires a running server.
124
108
 
125
- **Data:** New Relic (NRQL), Google Cloud (Logs, Traces, Metrics, Errors), PostHog (HogQL)
109
+ ## Security
126
110
 
127
- **LLM:** Anthropic (Claude), Google (Gemini)
111
+ Your secrets — API keys, integration tokens, chat history, agent memory — sit
112
+ behind several independent layers:
128
113
 
129
- ## Uninstall
114
+ - **Local-only.** No Tracer servers, no telemetry, no sync.
115
+ - **Encrypted at rest.** The entire SQLite database is encrypted with SQLCipher (AES-256). A stolen laptop, a copied `.db` file, or a backup is ciphertext without the key.
116
+ - **Machine-bound, user-scoped key.** A random 256-bit key is generated on first run and stored in your OS keychain (macOS Keychain, Windows Credential Manager, Linux Secret Service). It never leaves the machine and other OS users can't read it.
117
+ - **Hardened on disk.** The data directory is owner-only (`0700`); a keychain-less fallback key file is `0600`.
118
+
119
+ Encryption is automatic — new installs are encrypted from the first run, and
120
+ an existing plaintext database is migrated in place on first launch. In CI or
121
+ headless environments without a keychain, supply the key yourself via
122
+ `TRACER_DB_KEY` (64-char hex, e.g. `openssl rand -hex 32`).
123
+
124
+ Two honest caveats. Encryption at rest defends the file, not your live
125
+ session: anyone running code as your OS user can read what the app can read —
126
+ that is the boundary of every local-first app. And the key lives only in your
127
+ keychain, so losing it (OS reinstall, keychain reset) makes the database
128
+ unrecoverable; back up the `tracer-sh` / `db-key` keychain value if you want
129
+ a safety net.
130
+
131
+ Verify it yourself:
130
132
 
131
133
  ```bash
132
- npm uninstall -g tracer-sh
134
+ sqlite3 ~/.tracer/data/tracer.db '.tables' # → "Error: file is not a database"
135
+ head -c 16 ~/.tracer/data/tracer.db | od -c # → random bytes, not "SQLite format 3"
133
136
  ```
134
137
 
135
- To also remove your local database (settings, sessions, API keys):
138
+ ## Uninstall
136
139
 
137
140
  ```bash
138
- rm -rf ~/.tracer
141
+ npm uninstall -g tracer-sh
142
+ rm -rf ~/.tracer # also removes settings, sessions, API keys
139
143
  ```
140
144
 
141
- The database encryption key also lives in your OS keychain (service `tracer-sh`,
142
- account `db-key`). Remove it for a clean slate — on macOS:
145
+ The database encryption key lives in your OS keychain (service `tracer-sh`,
146
+ account `db-key`). On macOS:
143
147
 
144
148
  ```bash
145
149
  security delete-generic-password -s tracer-sh -a db-key
@@ -156,19 +160,10 @@ security delete-generic-password -s tracer-sh -a db-key
156
160
 
157
161
  ## Contributing
158
162
 
159
- Contributions are welcome! There are two main ways to help:
160
-
161
- **Report bugs or request features** — [open an issue](https://github.com/sholub-dev/tracer/issues). Include steps to reproduce for bugs, or a clear description for feature requests.
162
-
163
- **Submit a code change:**
164
-
165
- 1. Fork this repo
166
- 2. Create a branch (`git checkout -b fix/my-fix`)
167
- 3. Make your changes and commit
168
- 4. Push to your fork (`git push origin fix/my-fix`)
169
- 5. Open a pull request against `master`
163
+ **Report bugs or request features** [open an issue](https://github.com/sholub-dev/tracer/issues) with steps to reproduce or a clear description.
170
164
 
171
- All PRs require approval before merging.
165
+ **Submit a code change** fork, branch, and open a pull request against
166
+ `master`. All PRs require approval before merging.
172
167
 
173
168
  ## License
174
169
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tracer-sh",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "type": "module",
5
5
  "description": "Local-first debugging & analysis platform",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -154,14 +154,14 @@ _Flag if:_ Count is more than 20% lower than the baseline.
154
154
  ---
155
155
 
156
156
  ### Reporting Format
157
- After completing all applicable checks, report results as a table:
157
+ After completing all applicable checks, report results as a table. (This verdict summary is the ONE permitted markdown table \u2014 each check's underlying data must still be shown via tool calls.)
158
158
 
159
159
  | Check | Current | Baseline (1w ago) | Delta | Status |
160
160
  |-------|---------|-------------------|-------|--------|
161
- | Response Time P99 | ... | ... | +X% | \u2705 Pass / \u26A0\uFE0F Flagged |
162
- | Transaction Error Rate | ... | ... | +X% | \u2705 Pass / \u26A0\uFE0F Flagged |
163
- | External Services Errors | ... | ... | ... | \u2705 Pass / \u26A0\uFE0F Flagged / \u2014 N/A |
164
- | Success Transactions | ... | ... | -X% | \u2705 Pass / \u26A0\uFE0F Flagged |
161
+ | Response Time P99 | ... | ... | +X% | Pass / FLAGGED |
162
+ | Transaction Error Rate | ... | ... | +X% | Pass / FLAGGED |
163
+ | External Services Errors | ... | ... | ... | Pass / FLAGGED / N/A |
164
+ | Success Transactions | ... | ... | -X% | Pass / FLAGGED |
165
165
 
166
166
  End with an overall verdict on its own line:
167
167
  - \`Service appears healthy.\` \u2014 all checks pass
@@ -4,7 +4,7 @@ import {
4
4
  NR_DOMAIN_KNOWLEDGE,
5
5
  NR_INSIDE_OUT_DEBUGGING,
6
6
  NR_SERVICE_HEALTH_RUNBOOK
7
- } from "./chunk-XFJVNMJI.js";
7
+ } from "./chunk-LDYGR5S3.js";
8
8
  import "./chunk-ZAYYPDZP.js";
9
9
  export {
10
10
  NR_AUTH_STOP_RULE,