praxis-agent 0.1.0 → 0.1.2
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 +132 -497
- package/THIRD_PARTY_NOTICES.md +34 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/plugins/claude-plugin-mcpb.d.ts.map +1 -1
- package/dist/plugins/claude-plugin-mcpb.js +39 -21
- package/dist/plugins/claude-plugin-mcpb.js.map +1 -1
- package/dist/plugins/mcpb-schemas/mcpb-manifest-v0.1.schema.json +280 -0
- package/dist/plugins/mcpb-schemas/mcpb-manifest-v0.2.schema.json +287 -0
- package/dist/plugins/mcpb-schemas/mcpb-manifest-v0.3.schema.json +330 -0
- package/dist/plugins/mcpb-schemas/mcpb-manifest-v0.4.schema.json +330 -0
- package/dist/tools/local-tools.d.ts.map +1 -1
- package/dist/tools/local-tools.js +2 -2
- package/dist/tools/local-tools.js.map +1 -1
- package/dist/tools/pdf.d.ts +7 -0
- package/dist/tools/pdf.d.ts.map +1 -0
- package/dist/tools/pdf.js +31 -0
- package/dist/tools/pdf.js.map +1 -0
- package/package.json +7 -11
package/README.md
CHANGED
|
@@ -4,19 +4,29 @@
|
|
|
4
4
|
[](https://github.com/Forest-Isle/Praxis/actions/workflows/codeql.yml)
|
|
5
5
|
[](https://scorecard.dev/viewer/?uri=github.com/Forest-Isle/Praxis)
|
|
6
6
|
[](https://www.npmjs.com/package/praxis-agent)
|
|
7
|
-
[](https://www.npmjs.com/package/praxis-agent)
|
|
8
|
+
[](https://github.com/Forest-Isle/Praxis/blob/main/LICENSE)
|
|
8
9
|
|
|
9
10
|
Praxis is a local-first, single-user general agent for the command line.
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
It provides an interactive or headless agent loop, local tools, permissions,
|
|
13
|
+
sessions, skills, hooks, MCP, plugins, background agents, and provider-neutral
|
|
14
|
+
Anthropic/OpenAI-compatible model access. Praxis deliberately excludes
|
|
14
15
|
accounts, organizations, billing, managed enterprise policy, remote control,
|
|
15
16
|
IDE surfaces, and telemetry control planes.
|
|
16
17
|
|
|
17
|
-
##
|
|
18
|
+
## Requirements
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
- macOS or Linux
|
|
21
|
+
- Node.js 24 or newer
|
|
22
|
+
- [`ripgrep`](https://github.com/BurntSushi/ripgrep) (`rg`) for the Grep tool
|
|
23
|
+
- an API key and model ID for an Anthropic or OpenAI-compatible provider
|
|
24
|
+
|
|
25
|
+
Praxis does not use Claude subscription authentication. Claude Code
|
|
26
|
+
interoperability covers local sessions, configuration, permissions, memory,
|
|
27
|
+
skills, hooks, agents, plugins, and MCP data.
|
|
28
|
+
|
|
29
|
+
## Install
|
|
20
30
|
|
|
21
31
|
```sh
|
|
22
32
|
npm install --global praxis-agent
|
|
@@ -24,511 +34,136 @@ praxis --version
|
|
|
24
34
|
```
|
|
25
35
|
|
|
26
36
|
Release tarballs, SBOMs, SHA-256 checksums, and build attestations are attached
|
|
27
|
-
to
|
|
28
|
-
|
|
29
|
-
## Status
|
|
30
|
-
|
|
31
|
-
Stage 90 exact CLI signature closure is implemented on top of the
|
|
32
|
-
Stage 89 executable CLI surface closure,
|
|
33
|
-
Stage 88 plugin MCP bundle parity,
|
|
34
|
-
Stage 87 protected plugin option parity,
|
|
35
|
-
Stage 86 interactive plugin LSP parity,
|
|
36
|
-
Stage 85 interactive question and plan-mode parity, and
|
|
37
|
-
Stage 84 completion audit, interactive dynamic wakeups,
|
|
38
|
-
Workflow, scheduled prompts, and
|
|
39
|
-
top-level background sessions and agent management, durable tasks, background Bash,
|
|
40
|
-
WebFetch/WebSearch, MCP resource tools,
|
|
41
|
-
native file globbing, notebook editing, CLI customization and session
|
|
42
|
-
controls, print and machine-I/O support, image tool results, native foreground
|
|
43
|
-
and background subagents, resilient sessions, native full-history forks, child-process
|
|
44
|
-
credential boundaries, shared memory, and native Anthropic/OpenAI-compatible
|
|
45
|
-
providers.
|
|
46
|
-
Headless runs support Claude-style settings/source isolation, safe and bare
|
|
47
|
-
modes, direct/file system prompts, additional canonical directory roots,
|
|
48
|
-
dynamic cwd/environment/memory/git context with optional first-user relocation,
|
|
49
|
-
explicit tool sets, CLI permission rules and modes, current-directory
|
|
50
|
-
continue/fork, PR-linked resume/fork, native session names, and in-memory
|
|
51
|
-
no-persistence execution.
|
|
52
|
-
`--resume` accepts an optional selector: UUID resumes directly, print/background
|
|
53
|
-
mode resolves an exact case-insensitive session title, and TTY text filters the
|
|
54
|
-
required session picker. Bare TTY `--resume` opens that picker.
|
|
55
|
-
The hidden-compatible `--permission-prompt-tool` control routes ask decisions
|
|
56
|
-
through a reserved MCP tool, supports approved input replacement, and keeps the
|
|
57
|
-
permission tool out of the model-visible tool surface. Denials can either return
|
|
58
|
-
a failed tool result or interrupt the run, matching the MCP response contract.
|
|
59
|
-
Classifier-backed `auto` permissions use the bounded provider decision path and
|
|
60
|
-
fail closed when classification is unavailable. No-persistence runs disable
|
|
61
|
-
Agent because native sidechains are disk-backed.
|
|
62
|
-
Running `praxis` or `praxis "prompt"` in a
|
|
63
|
-
TTY opens an
|
|
64
|
-
Ink session UI with streaming
|
|
65
|
-
responses, recent-session selection, runtime status, ask-permission prompts,
|
|
66
|
-
model-driven `AskUserQuestion`, and `EnterPlanMode`/`ExitPlanMode`. A positional
|
|
67
|
-
TTY prompt is submitted once after any required resume selection; `-p` remains
|
|
68
|
-
headless. Plan mode persists native `permission-mode` records, resumes across
|
|
69
|
-
Praxis and Claude transcripts, and restricts writes to the current session's
|
|
70
|
-
exact plan file under the shared Claude plans directory.
|
|
71
|
-
When resume finds a tool call interrupted before its result was persisted, the
|
|
72
|
-
UI shows the prepared tool name/input and requires a separate retry decision.
|
|
73
|
-
Praxis can run, resume, fork, and list Claude-compatible sessions
|
|
74
|
-
through a provider-neutral event loop and Anthropic-compatible or
|
|
75
|
-
OpenAI-compatible streaming providers. Built-in read, write, edit, glob, search,
|
|
76
|
-
shell, notebook, and web tools execute behind Claude-compatible local permission
|
|
77
|
-
rules with path checks, timeouts, cancellation, and bounded output. Notebook `Read`
|
|
78
|
-
emits Claude-compatible cell IDs and `NotebookEdit` performs one structured
|
|
79
|
-
replace, insert, or delete only after a successful read. `Read`, `Write`, and `Edit`
|
|
80
|
-
also accept the canonical shared Claude project-memory root; other external
|
|
81
|
-
paths and memory-root symlink escapes remain rejected.
|
|
82
|
-
`Read` detects PNG, JPEG, GIF, and WebP by file signature and returns bounded
|
|
83
|
-
provider-neutral image data. Anthropic receives a native image tool-result
|
|
84
|
-
block; OpenAI-compatible providers receive a paired tool confirmation and user
|
|
85
|
-
`image_url`. The image persists in Claude Code 2.1.208's native
|
|
86
|
-
`tool_result`/`toolUseResult` envelope and survives Praxis or Claude resume.
|
|
87
|
-
User image/document attachments and ordered MCP text, image, audio, resource,
|
|
88
|
-
and structured-content results use their validated native envelopes. Binary MCP
|
|
89
|
-
audio/resources are bounded and materialized under the session tool-result path.
|
|
90
|
-
|
|
91
|
-
Interactive plugin sessions expose Claude's `LSP` tool when an enabled plugin
|
|
92
|
-
provides `.lsp.json` or manifest `lspServers` configuration. Praxis implements
|
|
93
|
-
the nine Claude operations over bounded stdio JSON-RPC, exact result formatting,
|
|
94
|
-
document synchronization, gitignored-result filtering, transient retry,
|
|
95
|
-
crash recovery, and graceful shutdown. Plugin root/data/environment expansion,
|
|
96
|
-
effective user/project/local `${user_config.*}` options, workspace settings,
|
|
97
|
-
initialization options, and case-insensitive extension mapping follow the shared
|
|
98
|
-
plugin contract. Headless, safe, bare, explicitly denied, and `mcp serve`
|
|
99
|
-
surfaces do not expose LSP.
|
|
100
|
-
Plugin options merge user, project, and local settings with protected
|
|
101
|
-
`pluginSecrets`, with secure values winning collisions. Sensitive values are
|
|
102
|
-
stored in Claude-compatible credentials, scrubbed from plaintext settings,
|
|
103
|
-
removed after the last installed scope, and redacted from LSP, MCP, and hook
|
|
104
|
-
diagnostics. `${user_config.*}` substitution spans LSP/MCP/hook runtime config;
|
|
105
|
-
plugin hooks also receive `CLAUDE_PLUGIN_OPTION_*`. Commands, skills, and agents
|
|
106
|
-
receive non-sensitive values while sensitive references become explicit
|
|
107
|
-
model-safe placeholders.
|
|
108
|
-
Plugin MCP servers use Claude's `plugin:<plugin>:<server>` runtime namespace,
|
|
109
|
-
explicit plugin-origin metadata, manual-server-first signature deduplication,
|
|
110
|
-
and normalized model-visible tool names while preserving raw scoped names for
|
|
111
|
-
status and resource operations.
|
|
112
|
-
Manifest declarations support ordinary JSON plus local or HTTP(S) `.mcpb` and
|
|
113
|
-
`.dxt` bundles. Bundle loading uses the official MCPB schema/config generator,
|
|
114
|
-
sticky remote and change-aware local caches, bounded downloads and ZIP
|
|
115
|
-
extraction, traversal/symlink/bomb rejection, executable-bit restoration, and
|
|
116
|
-
per-bundle failure isolation. MCPB user config shares the protected plugin
|
|
117
|
-
option plane; required values, qualified `server.key=value` assignments,
|
|
118
|
-
defaults, arrays, platform overrides, plugin data/root expansion, and sensitive
|
|
119
|
-
diagnostic redaction are preserved through packed runtime execution.
|
|
120
|
-
Protected plugin configuration commits credentials and settings under one
|
|
121
|
-
cross-process lease with a crash-recovery journal; interrupted writes recover
|
|
122
|
-
forward or roll back from exact file hashes without exposing Keychain values in
|
|
123
|
-
process arguments.
|
|
124
|
-
|
|
125
|
-
Each run or resume holds one session lease through model completion and final
|
|
126
|
-
persistence. Native tool calls and results append immediately to the shared
|
|
127
|
-
Claude transcript, and Claude Code 2.1.208 can resume a Praxis tool session.
|
|
128
|
-
`--resume-session-at <message-id>` with explicit `--resume` starts from any
|
|
129
|
-
active user or assistant message. Praxis preserves abandoned descendants in
|
|
130
|
-
the append-only JSONL, appends a native `parentUuid` branch, projects only the
|
|
131
|
-
new active chain on later resumes, and applies the same boundary before a
|
|
132
|
-
generated or explicit `--fork-session`. Foreground, interactive, background,
|
|
133
|
-
and no-persistence paths share this behavior, and either CLI can resume the
|
|
134
|
-
other runtime's branch.
|
|
135
|
-
The synchronous `Agent` tool runs bounded `general-purpose` or shared custom
|
|
136
|
-
agents through the same provider, local/MCP/Skill tools, permissions, hooks,
|
|
137
|
-
context, and cancellation path. Completed work writes native sidechain JSONL,
|
|
138
|
-
metadata, and main-chain Agent results that Claude Code 2.1.208 can discover and
|
|
139
|
-
resume. Background Agent execution, output/stop, same-ID messaging, and
|
|
140
|
-
completion notifications share that sidechain path.
|
|
141
|
-
`TaskCreate`, `TaskGet`, `TaskList`, and `TaskUpdate` use Claude's authoritative
|
|
142
|
-
`<config>/tasks/<session-id>` graph, including reciprocal dependencies,
|
|
143
|
-
metadata merge/delete, monotonic IDs, internal-task filtering, optimistic
|
|
144
|
-
cross-runtime update replay, and bidirectional resume. Bash accepts
|
|
145
|
-
`run_in_background`, writes bounded redacted output under Claude's temporary
|
|
146
|
-
task path, and shares `TaskOutput`/`TaskStop` routing with Agent IDs. Resumable
|
|
147
|
-
Bash sidecars use atomic replacement and malformed records are ignored. Only
|
|
148
|
-
`Read` can access the temporary output root.
|
|
149
|
-
Top-level `--bg`/`--background` launches a detached, persistent session whose
|
|
150
|
-
eight-hex job ID owns an idle/active/stopped lifecycle. In a TTY, `praxis agents`
|
|
151
|
-
opens a live grouped dashboard for native Claude and Praxis sessions, including
|
|
152
|
-
history review, background dispatch, completed-session resume, attach,
|
|
153
|
-
continuation, detach, and stop. `agents --json [--all] [--cwd <path>]` retains a
|
|
154
|
-
non-interactive scripting surface; `logs`, `attach`, and `stop` use an
|
|
155
|
-
owner-authenticated local control socket. Job state follows Claude's local
|
|
156
|
-
`jobs/` and `sessions/` layout while Praxis-only dispatch ownership prevents
|
|
157
|
-
cross-runtime process takeover. Background user/assistant entries carry native
|
|
158
|
-
`sessionKind: "bg"` metadata, and either CLI can resume the shared transcript.
|
|
159
|
-
CLI worktree sessions support `--tmux`: iTerm2 receives a native split pane
|
|
160
|
-
with an explicitly rooted, shell-escaped child command; other terminals fall
|
|
161
|
-
back to detached classic tmux. `--tmux=classic` always forces traditional tmux.
|
|
162
|
-
`CronCreate`, `CronList`, and `CronDelete` expose Claude Code 2.1.208-compatible
|
|
163
|
-
schemas and results for session-only and durable prompts. Durable jobs share
|
|
164
|
-
`<cwd>/.claude/scheduled_tasks.json`, preserve unknown native fields, use atomic
|
|
165
|
-
optimistic mutations, avoid live foreign process owners, catch up missed
|
|
166
|
-
one-shot jobs, and expire recurring jobs after a final seven-day execution. The
|
|
167
|
-
interactive CLI keeps one service alive, submits due prompts while idle, and
|
|
168
|
-
releases timers on exit. Built-in `/loop` expands fixed intervals through
|
|
169
|
-
`CronCreate` and executes the prompt immediately once. In an interactive Praxis
|
|
170
|
-
service, `ScheduleWakeup` clamps session-only one-shot delays, submits the prompt
|
|
171
|
-
through the same idle queue, and supports stop/close cancellation. Headless runs
|
|
172
|
-
retain the observed Claude inactive result. Active replacement, max-age,
|
|
173
|
-
stop, and close behavior follows the validated process-local lifecycle.
|
|
174
|
-
The opt-in `Workflow` tool runs sandboxed JavaScript orchestration with agents,
|
|
175
|
-
parallel/pipeline helpers, structured results, token targets, worktree isolation,
|
|
176
|
-
background task control, native run/journal files, and same-run replay. Praxis can
|
|
177
|
-
fallback-replay a unique Claude-created prompt without semantic options. Exact
|
|
178
|
-
chained `v2` replay keys, semantic sidecars, and ordered fallbacks are validated
|
|
179
|
-
in both directions. Claude Code 2.1.208 exposes no standalone `Monitor` tool.
|
|
180
|
-
Forks preserve the complete supported main-chain native history, including
|
|
181
|
-
tool calls/results, compact boundaries/summaries, attachments, agent settings,
|
|
182
|
-
titles, images, errors, and interrupted-tool denial records. Existing UUIDs,
|
|
183
|
-
parent links, and payload fields remain unchanged; only `sessionId` changes.
|
|
184
|
-
Latest mode and permission state is retained. Queue and file-history records
|
|
185
|
-
are transient and excluded, while unknown entry types, mismatched session IDs,
|
|
186
|
-
and malformed cross-entry links fail closed. Subagent sidechains and orphaned
|
|
187
|
-
`last-prompt` hints are excluded from the main-session fork.
|
|
188
|
-
When `CLAUDE_CODE_ENABLE_SDK_FILE_CHECKPOINTING=true`, successful `Write`,
|
|
189
|
-
`Edit`, and `NotebookEdit` calls append native file-history snapshot/delta
|
|
190
|
-
records and bounded backups under `<config>/file-history/<session-id>`.
|
|
191
|
-
`--resume <session-id> --rewind-files <user-message-uuid>` is a provider-free
|
|
192
|
-
standalone operation that restores or removes tracked files at that checkpoint.
|
|
193
|
-
Claude Code can rewind Praxis checkpoints, and Praxis can rewind Claude
|
|
194
|
-
checkpoints; restore paths remain confined to the active workspace, explicit
|
|
195
|
-
additional directories, and shared memory root.
|
|
196
|
-
|
|
197
|
-
Session leases now carry PID/token ownership and safely reclaim locks left by a
|
|
198
|
-
dead Praxis process while preserving live or unrecognized locks. Session
|
|
199
|
-
listing isolates malformed JSONL instead of failing the entire project and
|
|
200
|
-
reports the exact line and byte offset. `praxis inspect` exposes read/write
|
|
201
|
-
status and recovery metadata; `praxis export` returns the original transcript
|
|
202
|
-
bytes without normalization. Both commands remain available when the detected
|
|
203
|
-
Claude version is unsupported for writes or the transcript has a corrupt tail.
|
|
204
|
-
`praxis export --json` carries those bytes as base64 with explicit encoding
|
|
205
|
-
metadata.
|
|
206
|
-
|
|
207
|
-
Global and project `CLAUDE.md`, unconditional user/project rules, and the first
|
|
208
|
-
200 lines of canonical project `MEMORY.md` now assemble into provider-neutral
|
|
209
|
-
system context for run and resume. A successful `Read` of a path matching a
|
|
210
|
-
conditional rule activates its instruction for later model turns and persists
|
|
211
|
-
the Claude 2.1.208 native `nested_memory` attachment, so both Praxis and Claude
|
|
212
|
-
Code retain it after resume. Prompt path mentions, Write, Grep, and Bash do not
|
|
213
|
-
activate path rules. Edit also remains non-activating; the compatibility probe
|
|
214
|
-
pre-reads its target before installing the matching rule so Edit can succeed
|
|
215
|
-
without a rule-activating Read.
|
|
216
|
-
Linked memory details remain explicit standard `Read` calls. Standard `Write`
|
|
217
|
-
and `Edit` calls update the same shared Markdown files, so Claude Code and
|
|
218
|
-
Praxis observe one memory plane without import or synchronization. Base system
|
|
219
|
-
context stays ephemeral and is not copied into the authoritative transcript.
|
|
220
|
-
|
|
221
|
-
Global and project commands and skills now expand from the shared Claude files
|
|
222
|
-
without entering base context. Slash invocation persists Claude-compatible
|
|
223
|
-
command wrapper plus expanded user entries; provider-selected skills use the
|
|
224
|
-
`Skill` tool/result flow and inject their scoped body before the next turn.
|
|
225
|
-
`--agent <name>` applies shared agent instructions and writes native
|
|
226
|
-
`agent-setting` metadata, which both Praxis and Claude restore on resume.
|
|
227
|
-
|
|
228
|
-
Command hooks load directly from user, project, and local Claude settings.
|
|
229
|
-
Praxis executes SessionStart, UserPromptSubmit, PreToolUse,
|
|
230
|
-
PermissionRequest, PostToolUse, PostToolUseFailure, Stop, and SessionEnd with
|
|
231
|
-
bounded subprocesses and native stdin envelopes. Pre-tool hooks can rewrite
|
|
232
|
-
input, decide permission, add resumable context, or block with exit code 2;
|
|
233
|
-
Stop hooks can request another model turn. Hook success, failure, and context
|
|
234
|
-
attachments before SessionEnd use the Claude 2.1.208 transcript profile and
|
|
235
|
-
survive bidirectional resume; SessionEnd executes after `last-prompt` without
|
|
236
|
-
writing its output to the transcript. Hook commands run without user shell
|
|
237
|
-
startup files or ambient credential variables. Exact credential values are
|
|
238
|
-
redacted from commands, stdout, stderr, blocking reasons, and additional
|
|
239
|
-
context before they can reach diagnostics or shared JSONL.
|
|
240
|
-
|
|
241
|
-
MCP servers load from Claude's shared user, project, and project-local config
|
|
242
|
-
with local-over-project-over-user precedence. Stdio, Streamable HTTP, and
|
|
243
|
-
legacy SSE servers expose `mcp__<server>__<tool>` definitions through the same
|
|
244
|
-
permission and hook pipeline as built-in tools. Unavailable servers emit a
|
|
245
|
-
warning; connected clients and stdio subprocesses close after each CLI
|
|
246
|
-
invocation. Multi-turn stream input intentionally reuses one connection set.
|
|
247
|
-
Resource-capable servers also expose Claude-compatible list, read, and
|
|
248
|
-
directory-resource tools. Resource discovery follows bounded MCP pagination;
|
|
249
|
-
text results stay inline, while bounded binary blobs are exclusively saved under
|
|
250
|
-
the active session's shared `tool-results` directory, including ephemeral
|
|
251
|
-
sessions that do not write JSONL. Stream init reports connected and failed
|
|
252
|
-
configured servers even when a server provides resources but no callable tools.
|
|
253
|
-
Stdio servers receive a sanitized ambient environment; values declared in that
|
|
254
|
-
server's explicit `env` config remain available to it. Credential-named MCP
|
|
255
|
-
environment values and sensitive HTTP headers are redacted from tool results,
|
|
256
|
-
discovery warnings, and errors. Plain, NDJSON, and interactive CLI diagnostics
|
|
257
|
-
also redact ambient credential values, including provider error bodies, failed
|
|
258
|
-
runtime events, tool failures, and approval descriptions that echo a key.
|
|
259
|
-
Prompt-capable servers expose `server:prompt (MCP)` slash commands with bounded
|
|
260
|
-
pagination, `list_changed` refresh, raw wire-name preservation, reconnect, and
|
|
261
|
-
positional argument mapping. Text, image, audio, resource, and resource-link
|
|
262
|
-
content follows the same bounded conversion path as MCP tools; binary prompt
|
|
263
|
-
content is written to the active session's durable `tool-results` directory so
|
|
264
|
-
resume never retains a deleted temporary path.
|
|
265
|
-
|
|
266
|
-
Normal and safe modes expose `WebFetch`; `WebSearch` is added only when the
|
|
267
|
-
selected provider advertises native search support. Bare mode excludes both,
|
|
268
|
-
including explicit tool selection. WebFetch upgrades HTTP to HTTPS, rejects
|
|
269
|
-
credentials and private/loopback destinations, pins each request to validated
|
|
270
|
-
public DNS results, revalidates same-host redirects, converts supported text to
|
|
271
|
-
Markdown, and bounds time, response bytes, output bytes, redirects, and cache.
|
|
272
|
-
Cross-host redirects are returned for a fresh explicit fetch. Anthropic-native
|
|
273
|
-
WebSearch supports allowed or blocked domain filters, links/citations, and the
|
|
274
|
-
Claude-compatible source reminder; OpenAI-compatible providers currently do
|
|
275
|
-
not advertise native WebSearch.
|
|
276
|
-
|
|
277
|
-
Provider-neutral context budgeting counts system/history/tool-schema input
|
|
278
|
-
before every model turn. When an explicitly configured provider window would
|
|
279
|
-
overflow, Praxis summarizes completed history without tools, atomically appends
|
|
280
|
-
the Claude 2.1.208 native `compact_boundary` plus compact-summary pair, and
|
|
281
|
-
rechecks the reduced request before continuing. Shared JSONL remains
|
|
282
|
-
append-only; Claude Code and Praxis both project only the latest summary and
|
|
283
|
-
later messages. Activated nested-memory rules remain active across compaction.
|
|
284
|
-
|
|
285
|
-
## Product boundary
|
|
286
|
-
|
|
287
|
-
- CLI-only, including interactive and structured non-interactive output
|
|
288
|
-
- One local OS user, multiple workspaces and sessions
|
|
289
|
-
- Provider-capability-aware rather than tied to one model vendor
|
|
290
|
-
- Claude Code-compatible transcripts, configuration, permissions, and memory
|
|
291
|
-
- Shared local agent definitions plus background Agent launch, output, stop,
|
|
292
|
-
same-ID messaging, completion notification, and native sidechains
|
|
293
|
-
- Shared durable task graph plus foreground/background Bash lifecycle
|
|
294
|
-
- Persistent top-level background sessions plus native/Praxis agents dashboard,
|
|
295
|
-
history review/resume, JSON, logs, attach, continuation, and stop controls
|
|
296
|
-
- Session-only dynamic wakeups, shared durable scheduled prompts, and
|
|
297
|
-
fixed-interval `/loop`
|
|
37
|
+
to every [GitHub release](https://github.com/Forest-Isle/Praxis/releases).
|
|
298
38
|
|
|
299
|
-
##
|
|
39
|
+
## Quick start
|
|
300
40
|
|
|
301
|
-
|
|
302
|
-
The compatibility target is bidirectional: Praxis can resume Claude Code
|
|
303
|
-
sessions, and Claude Code can resume sessions written by Praxis. Project
|
|
304
|
-
instructions, auto memory, skills, agents, hooks, and MCP configuration are
|
|
305
|
-
shared rather than copied into a separate Praxis ecosystem.
|
|
41
|
+
OpenAI or an OpenAI-compatible endpoint is the default provider:
|
|
306
42
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
43
|
+
```sh
|
|
44
|
+
export PRAXIS_API_KEY="your-api-key"
|
|
45
|
+
export PRAXIS_MODEL="your-model-id"
|
|
46
|
+
# Optional for a compatible gateway:
|
|
47
|
+
# export PRAXIS_BASE_URL="https://api.example.com/v1"
|
|
312
48
|
|
|
313
|
-
|
|
49
|
+
cd /path/to/project
|
|
50
|
+
praxis
|
|
51
|
+
```
|
|
314
52
|
|
|
315
|
-
|
|
316
|
-
The Grep tool requires `rg`; command execution uses startup-file-free
|
|
317
|
-
`/bin/zsh` on macOS and `/bin/bash` on Linux.
|
|
53
|
+
For Anthropic Messages:
|
|
318
54
|
|
|
319
55
|
```sh
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
npm run build
|
|
324
|
-
npm run check
|
|
325
|
-
npm run test:performance
|
|
326
|
-
npm run test:package
|
|
327
|
-
node dist/cli.js --help
|
|
328
|
-
```
|
|
56
|
+
export PRAXIS_PROVIDER="anthropic"
|
|
57
|
+
export PRAXIS_API_KEY="your-api-key"
|
|
58
|
+
export PRAXIS_MODEL="claude-sonnet-4-20250514"
|
|
329
59
|
|
|
330
|
-
|
|
331
|
-
|
|
60
|
+
cd /path/to/project
|
|
61
|
+
praxis
|
|
62
|
+
```
|
|
332
63
|
|
|
333
|
-
|
|
64
|
+
Common non-interactive operations:
|
|
334
65
|
|
|
335
66
|
```sh
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
node dist/cli.js --init-only
|
|
376
|
-
node dist/cli.js -p --init "Run setup hooks, then continue"
|
|
377
|
-
node dist/cli.js -p --maintenance "Run maintenance hooks, then continue"
|
|
378
|
-
node dist/cli.js fork <session-id>
|
|
379
|
-
node dist/cli.js --worktree=review --tmux "Inspect in a native pane"
|
|
380
|
-
node dist/cli.js --worktree=review --tmux=classic "Inspect in tmux"
|
|
381
|
-
node dist/cli.js --bg "Inspect this project"
|
|
382
|
-
node dist/cli.js agents
|
|
383
|
-
node dist/cli.js agents --json --all --cwd "$PWD"
|
|
384
|
-
node dist/cli.js logs <agent-id>
|
|
385
|
-
node dist/cli.js attach <agent-id>
|
|
386
|
-
node dist/cli.js stop <agent-id>
|
|
387
|
-
node dist/cli.js mcp list
|
|
388
|
-
node dist/cli.js mcp add-json fixture '{"type":"stdio","command":"node","args":["server.mjs"]}'
|
|
389
|
-
MCP_CLIENT_SECRET=secret node dist/cli.js mcp add-json oauth-fixture '{"type":"http","url":"https://example.test/mcp","oauth":{"clientId":"client"}}' --client-secret
|
|
390
|
-
node dist/cli.js mcp get fixture
|
|
391
|
-
node dist/cli.js mcp remove fixture --scope local
|
|
392
|
-
node dist/cli.js auto-mode defaults --label Read
|
|
393
|
-
node dist/cli.js --json plugin list --available
|
|
394
|
-
node dist/cli.js plugin init my-plugin --with skills agents
|
|
395
|
-
node dist/cli.js plugin marketplace add owner/repo --sparse .claude-plugin plugins
|
|
396
|
-
node dist/cli.js plugin disable --all
|
|
397
|
-
node dist/cli.js plugin eval --scaffold --allow-tools Bash ./my-plugin
|
|
398
|
-
node dist/cli.js plugin eval init --bare smoke-test
|
|
399
|
-
node dist/cli.js
|
|
67
|
+
praxis -p "Inspect this project"
|
|
68
|
+
praxis -p --output-format json "Summarize the test failures"
|
|
69
|
+
praxis --resume
|
|
70
|
+
praxis sessions --json
|
|
71
|
+
praxis doctor
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
See
|
|
75
|
+
[Getting Started](https://github.com/Forest-Isle/Praxis/blob/main/docs/GETTING_STARTED.md)
|
|
76
|
+
for provider setup, shared Claude state, permissions, updating, and
|
|
77
|
+
troubleshooting. Run `praxis --help` for the authoritative command surface.
|
|
78
|
+
|
|
79
|
+
## What Praxis provides
|
|
80
|
+
|
|
81
|
+
- **Local agent runtime** — streaming interactive UI, print mode, structured
|
|
82
|
+
JSON/JSONL, context compaction, tool loops, and bounded execution.
|
|
83
|
+
- **Built-in tools** — read, write, edit, glob, search, shell, notebook, PDF,
|
|
84
|
+
image, web, scheduled prompts, workflows, and worktrees.
|
|
85
|
+
- **Permission boundary** — local allow/ask/deny rules, safe and bare modes,
|
|
86
|
+
path confinement, credential redaction, and sanitized child processes.
|
|
87
|
+
- **Durable local work** — resumable sessions, full-history forks, file
|
|
88
|
+
checkpoints, tasks, foreground/background subagents, and top-level agents.
|
|
89
|
+
- **Claude-compatible ecosystem** — shared instructions, memory, skills,
|
|
90
|
+
commands, agents, hooks, settings, MCP servers, plugins, and transcript data.
|
|
91
|
+
- **Provider-neutral models** — native Anthropic Messages and OpenAI-compatible
|
|
92
|
+
streaming adapters with explicit capability checks and metering controls.
|
|
93
|
+
|
|
94
|
+
Detailed feature status and executable evidence live in the
|
|
95
|
+
[parity matrix](https://github.com/Forest-Isle/Praxis/blob/main/docs/PARITY_MATRIX.md),
|
|
96
|
+
not in this entry-point README.
|
|
97
|
+
|
|
98
|
+
## Claude Code interoperability
|
|
99
|
+
|
|
100
|
+
Praxis and Claude Code use one local data plane by default:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
Claude Code ─┐
|
|
104
|
+
├── ~/.claude (or CLAUDE_CONFIG_DIR)
|
|
105
|
+
Praxis ──────┘
|
|
400
106
|
```
|
|
401
107
|
|
|
402
|
-
Claude
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
MCP management commands write Claude-compatible local (`.claude.json` project
|
|
446
|
-
state), project (`.mcp.json`), or user (`.claude.json` root) scopes atomically;
|
|
447
|
-
`add`, `add-json`, `list`, `get`, `remove`, and `reset-project-choices` are
|
|
448
|
-
implemented. `add-json --client-secret` stores OAuth secrets outside shared MCP
|
|
449
|
-
configuration and rolls back config replacement if secret persistence fails.
|
|
450
|
-
OAuth login/logout and MCP server hosting are separate commands; Claude Desktop
|
|
451
|
-
import is intentionally excluded.
|
|
452
|
-
|
|
453
|
-
Plugin management supports local and marketplace installs, details, strict
|
|
454
|
-
manifest validation, typed `--config key=value` persistence (or
|
|
455
|
-
`--config server.key=value` for ambiguous MCPB options), JSON marketplace
|
|
456
|
-
availability, and native `plugin init <name>` scaffolds under
|
|
457
|
-
`~/.claude/skills/<name>`. Skills-directory plugins load with normal plugin
|
|
458
|
-
resources and can be enabled or disabled through their `<name>@skills-dir` ID.
|
|
459
|
-
Plugin config validates required/default/range/boolean behavior atomically;
|
|
460
|
-
sensitive options use shared protected credentials and never enter
|
|
461
|
-
`settings.json`.
|
|
462
|
-
Marketplace Git sources support bounded `--sparse <paths...>` checkout with
|
|
463
|
-
paths preserved for later updates; `plugin disable -a|--all` disables every
|
|
464
|
-
enabled native and skills-directory plugin.
|
|
465
|
-
`plugin eval` discovers strict YAML or prose cases under `evals/`, runs each case
|
|
466
|
-
in an isolated non-persistent session, supports with/without-plugin ablation,
|
|
467
|
-
bounded opt-in scaffolds, operator grants for gated tools, deterministic and
|
|
468
|
-
three-vote model graders, cost ceilings, scored JSON artifacts, and resumable
|
|
469
|
-
Claude JSONL history context. `plugin eval init` provides TTY authoring or an
|
|
470
|
-
immediately runnable `--bare` template.
|
|
471
|
-
Plugin LSP declarations may be inline objects, JSON paths, or ordered arrays;
|
|
472
|
-
manifest entries override same-named `.lsp.json` defaults. LSP subprocesses
|
|
473
|
-
receive sanitized ambient state plus explicit plugin env, `CLAUDE_PLUGIN_ROOT`,
|
|
474
|
-
and persistent `CLAUDE_PLUGIN_DATA`. Saved LSP options use Claude settings
|
|
475
|
-
precedence: local overrides project, project overrides user, and protected
|
|
476
|
-
secrets override legacy plaintext values. The same option plane feeds plugin
|
|
477
|
-
MCP servers and hooks; model-visible plugin content excludes sensitive values.
|
|
478
|
-
|
|
479
|
-
`PRAXIS_PROVIDER` defaults to `openai`. `PRAXIS_BASE_URL` defaults to the
|
|
480
|
-
selected provider's official `/v1` endpoint. Native Anthropic requests accept
|
|
481
|
-
`PRAXIS_MAX_OUTPUT_TOKENS` (default 8192) and
|
|
482
|
-
`PRAXIS_ANTHROPIC_VERSION` (default `2023-06-01`). Native Anthropic WebSearch
|
|
483
|
-
is advertised only with `PRAXIS_ANTHROPIC_WEB_SEARCH=true`, because arbitrary
|
|
484
|
-
models and compatible relays do not necessarily implement it. Context window
|
|
485
|
-
configuration is explicit because Praxis accepts arbitrary provider models; when
|
|
486
|
-
`PRAXIS_CONTEXT_WINDOW_TOKENS` is absent, Praxis does not invent a model limit.
|
|
487
|
-
Reserve defaults to 10% of the configured window, capped at 8192.
|
|
488
|
-
Provider credentials stay in the Praxis process. Bash, hooks, Claude version
|
|
489
|
-
detection, and ambient MCP stdio environments do not inherit credential-named
|
|
490
|
-
variables. Explicit per-server MCP `env` and HTTP headers are treated as
|
|
491
|
-
intentional grants to that server, with matching output redaction.
|
|
492
|
-
|
|
493
|
-
Permissions load from the shared global and current-project Claude settings.
|
|
494
|
-
`Read`, `Grep`, `LSP`, `Agent`, `SendMessage`, and Task tools default to `allow`;
|
|
495
|
-
`Write`, `Edit`, `Bash`, `WebFetch`, and `WebSearch` default to `ask`.
|
|
496
|
-
Interactive mode prompts before an `ask` tool call. Entering plan mode is
|
|
497
|
-
automatic; leaving it displays the plan and requires user approval. Question and
|
|
498
|
-
plan prompts honor tool cancellation. Headless commands remain non-interactive
|
|
499
|
-
and return a denied tool result
|
|
500
|
-
unless a compatible `allow` rule exists.
|
|
501
|
-
|
|
502
|
-
With a Claude Code 2.1.208 installation, run the isolated compatibility probes
|
|
503
|
-
separately. Claude-backed probes make real model requests; the context-runtime
|
|
504
|
-
probe uses a local provider fixture:
|
|
108
|
+
Praxis can resume Claude Code sessions, and Claude Code can resume compatible
|
|
109
|
+
sessions written by Praxis. The validated read-write target is Claude Code
|
|
110
|
+
2.1.208; unknown versions fail closed for transcript writes while retaining
|
|
111
|
+
read-only inspection and export paths.
|
|
112
|
+
|
|
113
|
+
See the
|
|
114
|
+
[compatibility contract](https://github.com/Forest-Isle/Praxis/blob/main/docs/COMPATIBILITY.md)
|
|
115
|
+
for exact shared data, version boundaries, exclusions, and verification gates.
|
|
116
|
+
|
|
117
|
+
## Documentation
|
|
118
|
+
|
|
119
|
+
| Need | Document |
|
|
120
|
+
| ------------------------------------------ | ------------------------------------------------------------------------------------------ |
|
|
121
|
+
| Install and run the first session | [Getting Started](https://github.com/Forest-Isle/Praxis/blob/main/docs/GETTING_STARTED.md) |
|
|
122
|
+
| Common commands and environment variables | [CLI Reference](https://github.com/Forest-Isle/Praxis/blob/main/docs/CLI_REFERENCE.md) |
|
|
123
|
+
| Find all user and maintainer documentation | [Documentation Index](https://github.com/Forest-Isle/Praxis/blob/main/docs/README.md) |
|
|
124
|
+
| Understand module and data-flow boundaries | [Architecture](https://github.com/Forest-Isle/Praxis/blob/main/docs/ARCHITECTURE.md) |
|
|
125
|
+
| Review security assumptions | [Threat Model](https://github.com/Forest-Isle/Praxis/blob/main/docs/THREAT_MODEL.md) |
|
|
126
|
+
| Check Claude Code parity | [Parity Matrix](https://github.com/Forest-Isle/Praxis/blob/main/docs/PARITY_MATRIX.md) |
|
|
127
|
+
| Build, test, and contribute | [Contributing](https://github.com/Forest-Isle/Praxis/blob/main/CONTRIBUTING.md) |
|
|
128
|
+
| Verify release and supply-chain controls | [Release Contract](https://github.com/Forest-Isle/Praxis/blob/main/docs/RELEASE.md) |
|
|
129
|
+
|
|
130
|
+
## Project boundary
|
|
131
|
+
|
|
132
|
+
Praxis targets one local OS user working across multiple repositories and
|
|
133
|
+
sessions. It is CLI-only and provider-capability-aware. Organization, tenant,
|
|
134
|
+
RBAC, billing, enterprise gateway, IDE, Chrome, Remote Control, Claude Desktop
|
|
135
|
+
import, and hosted review-product surfaces are permanent non-goals.
|
|
136
|
+
|
|
137
|
+
## Security and support
|
|
138
|
+
|
|
139
|
+
Report vulnerabilities through
|
|
140
|
+
[GitHub private vulnerability reporting](https://github.com/Forest-Isle/Praxis/security/advisories/new),
|
|
141
|
+
not a public issue. See
|
|
142
|
+
[SECURITY.md](https://github.com/Forest-Isle/Praxis/blob/main/SECURITY.md) for
|
|
143
|
+
response expectations.
|
|
144
|
+
|
|
145
|
+
Use [GitHub Discussions](https://github.com/Forest-Isle/Praxis/discussions) for
|
|
146
|
+
questions and usage help, and issues for reproducible defects or scoped feature
|
|
147
|
+
requests. See
|
|
148
|
+
[SUPPORT.md](https://github.com/Forest-Isle/Praxis/blob/main/SUPPORT.md).
|
|
149
|
+
|
|
150
|
+
## Development
|
|
505
151
|
|
|
506
152
|
```sh
|
|
507
|
-
|
|
153
|
+
git clone git@github.com:Forest-Isle/Praxis.git
|
|
154
|
+
cd Praxis
|
|
155
|
+
npm ci
|
|
156
|
+
npm run check
|
|
508
157
|
```
|
|
509
158
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
append behavior. Exact fixtures and limits are documented in
|
|
522
|
-
[docs/PERFORMANCE.md](docs/PERFORMANCE.md).
|
|
523
|
-
|
|
524
|
-
`npm run test:package` builds the `praxis-agent` tarball, enforces its file and
|
|
525
|
-
size boundary, installs it into an empty project, and exercises both provider
|
|
526
|
-
adapters through the installed `praxis` bin plus the fail-closed Claude version
|
|
527
|
-
matrix. See
|
|
528
|
-
[docs/RELEASE.md](docs/RELEASE.md). Publishing remains an explicit separate
|
|
529
|
-
operation.
|
|
530
|
-
|
|
531
|
-
Architecture constraints live in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
|
|
532
|
-
Runtime semantics and trust boundaries live in
|
|
533
|
-
[docs/RUNTIME_CONTRACT.md](docs/RUNTIME_CONTRACT.md) and
|
|
534
|
-
[docs/THREAT_MODEL.md](docs/THREAT_MODEL.md).
|
|
159
|
+
Contributions use Conventional Commit pull-request titles and the protected
|
|
160
|
+
squash-merge workflow. Read
|
|
161
|
+
[CONTRIBUTING.md](https://github.com/Forest-Isle/Praxis/blob/main/CONTRIBUTING.md)
|
|
162
|
+
before changing compatibility, persistence, release, or security behavior.
|
|
163
|
+
|
|
164
|
+
## License
|
|
165
|
+
|
|
166
|
+
Praxis is available under the
|
|
167
|
+
[MIT License](https://github.com/Forest-Isle/Praxis/blob/main/LICENSE). Vendored
|
|
168
|
+
dependency attributions are listed in
|
|
169
|
+
[THIRD_PARTY_NOTICES.md](https://github.com/Forest-Isle/Praxis/blob/main/THIRD_PARTY_NOTICES.md).
|