@tempr/cli 0.9.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.
Files changed (3) hide show
  1. package/README.md +275 -0
  2. package/bin/tempr.js +22 -0
  3. package/package.json +17 -0
package/README.md ADDED
@@ -0,0 +1,275 @@
1
+ # Tempr CLI
2
+
3
+ Sign in, chat, and run agentic coding tasks against your Tempr license from the terminal.
4
+
5
+ ## Install
6
+
7
+ The standalone builds need nothing installed first -- no .NET, no Node.
8
+
9
+ **macOS and Linux**
10
+
11
+ ```
12
+ curl -fsSL https://temprhq.io/cli/install.sh | sh
13
+ ```
14
+
15
+ **Windows**
16
+
17
+ ```
18
+ irm https://temprhq.io/cli/install.ps1 | iex
19
+ ```
20
+
21
+ Or download an archive for your platform from https://temprhq.io/cli#downloads (the current release
22
+ is always at `https://temprhq.io/cli/latest/tempr-<rid>.zip` or `.tar.gz`, for `win-x64`,
23
+ `win-arm64`, `osx-arm64`, `osx-x64`, `linux-x64` and `linux-arm64`) and put `tempr` on your `PATH`;
24
+ each one ships with a `.sha256` next to it. `tempr update` checks for a newer release and tells you
25
+ the command that installs it.
26
+
27
+ `install.sh` installs to `~/.local/bin` (override with `TEMPR_INSTALL_DIR`); `install.ps1` installs
28
+ to `%LOCALAPPDATA%\Programs\tempr` (override with `-InstallDir`) and adds it to your user `PATH`.
29
+
30
+ Binaries aren't code-signed yet, so the first run may meet a SmartScreen or Gatekeeper warning.
31
+ The install scripts avoid it on macOS and Linux.
32
+
33
+ ## Quick start
34
+
35
+ ```
36
+ tempr auth # sign in through your browser, or with your license key
37
+ tempr keys add # add a key for a model provider (OpenAI, Anthropic, ...)
38
+ tempr config set-model <id> # set a default model
39
+ tempr doctor # check everything is set up (exits non-zero if not)
40
+ tempr "explain this repo" # one-shot
41
+ tempr # interactive session
42
+ ```
43
+
44
+ ## Usage
45
+
46
+ - `tempr "<prompt>"` -- one-shot agent turn with real tool-calling (file read/write/edit, run_command, semantic search).
47
+ - `tempr` -- interactive REPL with persistent history and tab-completion for `/commands` and `@personas`. The first run plays a short animated ASCII logo; `TEMPR_LOGO=1` plays it again, `TEMPR_NO_LOGO` skips it, and `NO_COLOR` shows a plain one-line name instead of the animation.
48
+ - `<something> | tempr` -- headless/piped mode: with no prompt argument, stdin is the whole prompt (`{ echo "review this:"; git diff; } | tempr`). Given a prompt argument, stdin is ignored.
49
+ - `tempr --ask "<prompt>"` -- plain chat, no tools.
50
+ - `tempr "@debugger why does this fail"` -- run a specialist persona. In the REPL, `/persona` opens a picker to switch personas for the rest of the session instead of typing `@name` every turn.
51
+ - `@workspace`/`#codebase` anywhere in a message attaches a brief workspace overview; `@problems`/`@diagnostics` attaches current compiler errors/warnings (via `dotnet build`/`tsc --noEmit`); `@relative/path/to/file` attaches that file -- images (`.png`/`.jpg`/`.gif`/`.webp`/`.bmp`) go in as real image content, other files as inline text.
52
+ - Workspace instructions: every agent turn carries `AGENTS.md` and `.github/copilot-instructions.md` from the current directory, other agents' files (`CLAUDE.md`, `GEMINI.md`, `.cursorrules` and Cursor rules in `.cursor/rules` that always apply; the others are listed with their description for the agent to read when relevant), then a global `~/.tempr/AGENTS.md` for every workspace, each under its own heading and 16 KB combined at most. Where they disagree, AGENTS.md wins. `--verbose` names the files it found.
53
+ - `tempr auth` signs in through your browser: it shows a code, opens the Tempr portal, and you approve the sign-in there -- on any device, so it works over SSH too. `tempr auth --browser` skips the question; `tempr auth <key>` or `TEMPR_LICENSE_KEY` still sign in with a license key, for scripts and CI. Running `tempr` for the first time walks through signing in, adding a provider key and picking a model.
54
+ - `tempr -c` resumes this folder's most recent session; `/resume` picks one from a list.
55
+ - `!command` in the REPL runs a command yourself -- `!git status` -- in this folder, and its output goes in front of your next message. No approval: it's your own command.
56
+ - A turn that runs 30 seconds or more rings the terminal bell when it's done or needs approval, with a desktop notification where the terminal shows one; `tempr config set-notifications off` or `TEMPR_NO_NOTIFY` turns it off.
57
+ - `/diff` shows what the last turn changed on disk, and `/undo` puts it back -- skipping any file that has changed since, so an undo never overwrites work it didn't make.
58
+ - `tempr keys` lists your provider keys -- Tempr calls every model with your own key for its provider. `tempr keys add [provider]` adds or replaces one (no provider opens a picker), and `tempr keys remove <provider>` removes one; `/keys` does the same inside the REPL. The key is typed at a hidden prompt, piped in on stdin, or read with `--from-env VARIABLE` -- never passed as an argument, where it would land in shell history. Tempr checks it with the provider before saving it; a key the provider rejects isn't saved unless you say so or pass `--force`, and one that couldn't be checked (the provider was down, or offers no way to check) is saved with a note. Azure OpenAI, Azure AI Foundry, AWS Bedrock and custom endpoints need more than a key, so they're set up on the Portal's Provider keys page; on a Team plan, your organization's admin manages keys.
59
+ - `tempr models` lists the models your licence can use, with prices and context sizes; `/model` with no argument opens a picker over the same list.
60
+ - `tempr init` drafts an `AGENTS.md` for this workspace from a scan of what's in it.
61
+ - `tempr usage` shows what this machine's turns have cost, by model.
62
+ - `tempr completion bash|zsh|fish|powershell` prints a completion script.
63
+ - `tempr config`, `tempr history`, `tempr mcp`, `tempr doctor` -- manage config, saved sessions, MCP servers, and connectivity. `tempr mcp browse` (or `/mcp browse` in the REPL) opens a picker over Tempr's curated MCP catalog.
64
+ - Agent-mode tools also include `get_diagnostics`, `search_symbols` (where a name is defined, then where it's used, in C#, TypeScript and JavaScript, Python, Go, Rust, Java, Kotlin, C and C++, Swift, Ruby and PHP), `get_callers`/`get_callees` (lexical, not a real language server), and `get_solution`/`get_projects`/`get_project_references`/`get_tests`/`run_tests`/`get_test_results` for .NET workspaces.
65
+ - Web search: on an Anthropic, OpenAI or xAI model, the agent can search the web with the provider's own search, shown as `Searching the web for "…"`. The provider runs the search and bills it to your key for that provider, on top of the tokens: $10 per 1,000 searches on Anthropic and OpenAI, and $5 per 1,000 on xAI, where opening a page counts as a search too; the cost `tempr usage` and the Portal show includes it. It's on in an interactive session and off in scripts (`--json`, piped input, `CI`); `--search` and `--no-search` decide for one run, and `tempr config set-web-search off` turns it off for interactive sessions too. The pages a search finds are ones the agent may then open with `web_fetch`.
66
+ - Chat history (`~/.tempr/sessions/`) and auth tokens are both encrypted at rest (DPAPI on Windows, AES-256-GCM elsewhere).
67
+
68
+ ## Approval modes
69
+
70
+ Mutating tool calls -- file writes, patches, commands and MCP calls -- are gated by an approval
71
+ mode. `tempr config set-approval-mode <mode>` sets the default; `--yolo` uses `autopilot` for one
72
+ run without changing it, and on Linux puts its commands in the sandbox (see below).
73
+
74
+ | Mode | File edits and MCP calls | Commands |
75
+ |---|---|---|
76
+ | `interactive` (default) | asks | asks |
77
+ | `autopilot` | run | allow-listed commands run; ones that delete, publish, force-push, reset or reboot, and anything not allow-listed, ask |
78
+ | `bypass` | run | always asks -- **stricter than `autopilot`**, despite the name |
79
+
80
+ The mode names are shared with Tempr's IDE extensions, which is why `bypass` reads the way it does.
81
+ `autopilot` is the one to use unattended. With no terminal to ask on (piped input, `--json`, CI), a
82
+ call that would have asked is refused and the model is told why.
83
+
84
+ The allow-list starts with read-only commands and each ecosystem's build, test, lint and type-check
85
+ commands: `dotnet build`/`test`, `npm test` and `npm run build`/`test`/`lint`/`typecheck` (and
86
+ the pnpm, yarn and bun equivalents), `pytest`, `go build`/`test`/`vet`, `cargo
87
+ build`/`check`/`test`/`clippy`, `mvn compile`/`test`, `gradle build`/`test` and their wrapper
88
+ scripts, `git status`, `git log` and the like. Other `package.json` scripts (`npm run deploy`)
89
+ aren't on it. A prefix covers whole words: `npm run build` doesn't cover `npm run build-and-deploy`.
90
+ Add to it per machine with `tempr config allow-command <prefix>`, or per repository with an
91
+ `.agentcommands.json` file at the workspace root: `{ "allowedPrefixes": ["docker build"] }`.
92
+
93
+ Each turn tells the model which projects the workspace holds -- a few folders deep, so a monorepo's
94
+ projects are listed with their folders -- and how each one builds and tests. A command runs in the
95
+ workspace root or, with `working_directory`, a folder inside it (chaining `cd` is refused). It's
96
+ stopped after 2 minutes unless the model asks for longer, up to 10, and long output keeps its start
97
+ and its end. The .NET-only tools (projects, references, tests) are offered only where there's a .NET
98
+ project.
99
+
100
+ Every tool path is checked against the current directory, including through symbolic links and
101
+ Windows junctions, so a link inside the workspace can't be used to read or write outside it.
102
+
103
+ ## Sandbox (Linux)
104
+
105
+ `--sandbox` runs the agent's commands inside a sandbox. They can change files only in the current
106
+ folder, the temp folders and the package stores and caches builds write to (npm's, pip's, NuGet's,
107
+ Go's, Cargo's, Gradle's and Maven's), and they can't open network connections. Reading is open.
108
+ `tempr config set-sandbox on` turns it on for every run; `--no-sandbox` turns it off for one.
109
+
110
+ **On by default for `--yolo` and CI.** A run on autopilot with nobody deciding command by command
111
+ (`--yolo`, `--approval-mode autopilot`, or autopilot in CI) runs its commands in the sandbox with the
112
+ network on: the file limits hold, and installs, restores and tests that use localhost still work.
113
+ Where the sandbox can't run, those runs go ahead unsandboxed, as before, and an interactive session
114
+ says so. `--sandbox` asks for the network off as well; `--no-sandbox`, or
115
+ `tempr config set-sandbox off`, keeps `--yolo` out of the sandbox. Other runs aren't sandboxed
116
+ unless asked: the sandbox would let their commands run without asking.
117
+
118
+ Inside the sandbox any command runs without asking, in every approval mode, so an unattended run can
119
+ build, test and try things it has no allow-list entry for. Commands that delete, publish or
120
+ force-push still ask. When a command fails because the sandbox blocked it -- a download, say -- the
121
+ agent can ask to run it outside the sandbox, which always asks you first; a run with nobody to ask
122
+ refuses it.
123
+
124
+ dotnet in the sandbox keeps its own per-user files in `~/.cache/tempr/sandbox-dotnet` rather than
125
+ `~/.dotnet`, which holds global tools and stays read-only; it restores into your own
126
+ `~/.nuget/packages` and reads your NuGet package sources.
127
+
128
+ - **What it covers:** `run_command`, the .NET test tools and `get_diagnostics`. Not `!command`,
129
+ which you type yourself, and not MCP servers.
130
+ - **Git hooks:** a command may not keep changes to `.git/hooks`, `.git/config` or
131
+ `.agentcommands.json`, which run or allow things later, outside the sandbox. Tempr puts back
132
+ anything a command changed there and tells the agent.
133
+ - **The network:** `--sandbox-network` (or `set-sandbox network`) keeps the file limits and leaves
134
+ the network on. Cutting the network off blocks TCP only, so name lookups still work.
135
+ - **Where it runs:** Linux 5.13 or later, and 6.7 or later to cut off the network, through the
136
+ kernel's Landlock. It needs no install and no privileges, and works in a container and on
137
+ Ubuntu 24.04. On macOS and Windows it isn't available yet (inside WSL2 it works). If you ask for
138
+ the sandbox where it can't run, nothing runs: the CLI exits with code 7 rather than run your
139
+ commands unsandboxed. `tempr doctor` says what this machine supports.
140
+
141
+ ## Your own commands and agents
142
+
143
+ Markdown files, shared with Tempr Code. Put them in `.tempr/` in a project to commit them with it,
144
+ or in `~/.tempr/` to have them everywhere.
145
+
146
+ `.tempr/commands/deploy.md` — invoked as `/deploy staging`:
147
+
148
+ ```markdown
149
+ ---
150
+ description: Walk through a deploy
151
+ persona: devops
152
+ ---
153
+
154
+ Deploy to $ARGUMENTS. Check the health endpoint afterwards and report what you saw.
155
+ ```
156
+
157
+ `$ARGUMENTS` is everything after the command name; `$1`…`$9` are its whitespace-separated words.
158
+
159
+ `.tempr/agents/dba.md` — invoked as `@dba what's slow about this query`:
160
+
161
+ ```markdown
162
+ ---
163
+ description: Database specialist
164
+ allowed-tools: read_file, search_files, run_command
165
+ model: anthropic/claude-opus-4-5
166
+ ---
167
+
168
+ You know this schema inside out. Prefer an index over a rewrite, and always explain the plan.
169
+ ```
170
+
171
+ `/commands` and `/agents` list what's available, and both complete on Tab.
172
+
173
+ ## Headless and CI
174
+
175
+ `--json` writes one event per line and then a final result object:
176
+
177
+ ```bash
178
+ tempr --json --yolo "fix the failing test" | tail -1 | jq '{status, summary, files: .filesChanged}'
179
+ ```
180
+
181
+ | Exit code | Meaning |
182
+ |---|---|
183
+ | 0 | the turn finished |
184
+ | 1 | something went wrong (server, network, tool, unhandled error) |
185
+ | 2 | the command line didn't make sense |
186
+ | 3 | not signed in, session expired, or no active plan |
187
+ | 4 | hit the step limit with work still to do |
188
+ | 5 | a tool call was refused and the turn carried on without it |
189
+ | 6 | stopped at `--max-cost` |
190
+ | 7 | the sandbox was asked for and can't run here, so nothing ran |
191
+ | 130 | interrupted (Ctrl+C) |
192
+
193
+ Useful flags for an unattended run: `--max-turns`, `--max-cost` (stop once the run's model calls
194
+ have cost this many dollars), `--allowed-tools`, `--disallowed-tools`, `--approval-mode`,
195
+ `--prompt-file`, and `--search` to let the model search the web, which a script doesn't do unless
196
+ asked. The first `--json` line is a `session` object (session id, model, settings), and each tool the
197
+ CLI runs locally adds a `tool-result` line with its output. Sign in with `TEMPR_LICENSE_KEY` rather than on a command line,
198
+ where the key would land in shell history and in every process listing on the machine. Setting `CI`
199
+ turns off the logo, the update check and crash reports, and makes any call that would have asked a
200
+ question refuse instead of waiting.
201
+
202
+ There's a GitHub Action at the repository root; `docs/examples/tempr-agent-workflows.md` has a
203
+ PR-review workflow and a fix-the-build workflow built on it.
204
+
205
+ ## In your editor (Agent Client Protocol)
206
+
207
+ `tempr acp` runs Tempr as an [Agent Client Protocol](https://agentclientprotocol.com) agent, which
208
+ an editor starts and talks to over stdin and stdout: Zed, JetBrains AI Assistant, Neovim
209
+ (CodeCompanion, avante.nvim) and Emacs (agent-shell) among them. In Zed's `settings.json`:
210
+
211
+ ```json
212
+ {
213
+ "agent_servers": {
214
+ "Tempr": { "type": "custom", "command": "tempr", "args": ["acp"] }
215
+ }
216
+ }
217
+ ```
218
+
219
+ In JetBrains IDEs, the same entry goes under `agent_servers` in `~/.jetbrains/acp.json`, with the
220
+ full path to `tempr` as the command; AI Chat's ⋮ menu > Add Custom Agent opens that file.
221
+
222
+ The editor shows Tempr's replies, its tool calls (edits as diffs) and its questions, and you answer
223
+ them there. Tempr runs its tools itself, so the allow-list, the approval mode and, on Linux, the
224
+ [sandbox](#sandbox-linux) work as they do here; autopilot in an editor counts like `--yolo`. Sign in
225
+ with `tempr auth` first, or from the editor, which offers the browser sign-in.
226
+
227
+ - **Sessions** are saved like any other, so `tempr history` lists them and `tempr -c` in the same
228
+ folder carries one on. The editor's own session list shows them too, and opening one there
229
+ replays its conversation (the text; tool calls aren't kept).
230
+ - **Settings:** the approval mode, the model, its reasoning level and web search, for that session.
231
+ A new session starts on the model last picked in an editor, or on your default until you pick one
232
+ (`tempr config set-model` makes the default the starting model again). A reasoning level is kept
233
+ per model, as `/reasoning` keeps it.
234
+ - **Slash commands:** your command templates, plus `/undo`, `/diff` and `/agents`.
235
+ - **MCP servers** the editor passes run beside yours from `~/.tempr/mcp.json`; one with the same name
236
+ as one of yours takes its place for the session.
237
+ - **Command output** streams into a terminal under the call, in editors that draw one (Zed); in
238
+ others it shows when the command ends.
239
+ - **Sub-agents** answer under the call that delegated to them, apart from the reply.
240
+
241
+ It passes the ACP conformance kit ([acp-tck](https://github.com/agentclientprotocol/acp-tck)). The
242
+ setup for each editor is at <https://temprhq.io/docs/cli-editors>.
243
+
244
+ ## What leaves your machine
245
+
246
+ Everything below goes to your Tempr server (`api.temprhq.io` unless the `TEMPRAPP_SERVER_URL`
247
+ environment variable or a `serverUrl` entry in `~/.tempr/config.json` says otherwise), which relays model calls to the providers your license has keys for.
248
+
249
+ **Sent on every turn you send**
250
+
251
+ - Your message, and the conversation so far in this session.
252
+ - `AGENTS.md`, `.github/copilot-instructions.md`, `CLAUDE.md`, `GEMINI.md` and Cursor rules from the
253
+ current directory, and `~/.tempr/AGENTS.md`, up to 16 KB combined.
254
+ - Files you attach with `@path`, including images, and anything `@workspace` or `@problems` pulls
255
+ in (a workspace overview, or your current build errors).
256
+ - The contents of files the agent reads or searches, as tool results.
257
+ - Your operating system, CPU architecture and which shell `run_command` would use, so the model
258
+ writes commands that work on your machine, and the projects found in the current directory, with
259
+ their folders and build and test commands.
260
+
261
+ **Sent only if you say yes**
262
+
263
+ - Crash reports: the error type and message, the stack trace, the CLI version and your OS version.
264
+ Off by default. The first interactive session asks once and remembers your answer; change it with
265
+ `tempr config set-crash-reports on|off`. Nothing is ever sent when there's no terminal to ask on
266
+ (piped input, `--json`), or when `CI`, `DO_NOT_TRACK` or `TEMPR_NO_CRASH_REPORTS` is set.
267
+
268
+ **Never sent**
269
+
270
+ - Your license key after sign-in (it is exchanged once for a session token).
271
+ - Any file the agent didn't read, and any command output you didn't approve.
272
+ - Telemetry: there is none beyond the requests above.
273
+
274
+ See `tempr --help` for the full command reference, and `docs/plans/plan-tempr-cli-v1-roadmap.md` in
275
+ the Tempr repo for design notes.
package/bin/tempr.js ADDED
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ // Hands off to the platform package npm installed for this machine. A shim rather than a
3
+ // postinstall download: nothing is fetched at install time, so the package works behind a proxy,
4
+ // in an offline cache, and in a lockfile that means what it says.
5
+ const { spawnSync } = require('node:child_process');
6
+
7
+ const pkg = `@tempr/cli-${process.platform}-${process.arch}`;
8
+ let binary;
9
+ try {
10
+ binary = require.resolve(`${pkg}/bin/tempr${process.platform === 'win32' ? '.exe' : ''}`);
11
+ } catch {
12
+ console.error(`The Tempr CLI has no build for ${process.platform} ${process.arch}.`);
13
+ console.error(`Expected ${pkg} to be installed. If your installer skips optional dependencies, install it directly.`);
14
+ process.exit(1);
15
+ }
16
+
17
+ const result = spawnSync(binary, process.argv.slice(2), { stdio: 'inherit' });
18
+ if (result.error) {
19
+ console.error(result.error.message);
20
+ process.exit(1);
21
+ }
22
+ process.exit(result.status === null ? 1 : result.status);
package/package.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "@tempr/cli",
3
+ "version": "0.9.9",
4
+ "description": "Sign in, chat, and run agentic coding tasks against your Tempr license from the terminal.",
5
+ "homepage": "https://temprhq.io",
6
+ "license": "SEE LICENSE IN README.md",
7
+ "bin": { "tempr": "bin/tempr.js" },
8
+ "files": ["bin/"],
9
+ "optionalDependencies": {
10
+ "@tempr/cli-win32-x64": "0.9.9",
11
+ "@tempr/cli-win32-arm64": "0.9.9",
12
+ "@tempr/cli-linux-x64": "0.9.9",
13
+ "@tempr/cli-linux-arm64": "0.9.9",
14
+ "@tempr/cli-darwin-x64": "0.9.9",
15
+ "@tempr/cli-darwin-arm64": "0.9.9"
16
+ }
17
+ }