Only the latest release is supported.
-
The plugin goes to
$CLAUDE_CONFIG_DIR/skills/theway(~/.claude/skills/thewaywhen unset) and the binary to~/.local/bin/theway(or$THEWAY_INSTALL_DIR). Install refuses to replace a program there that is not a theway binary. -
The data home is
~/.theway, orTHEWAY_HOME. Install refuses a home that is your home folder, one of its parents or/, and a custom home with a glob character or a line break. -
Install writes into the data home:
config.yaml, only when absent, andconfig.default.yaml, always;- the shipped standards, templates, workflows and prompts: an unedited one is updated, an edited one is kept with the shipped version next to it as
<stem>.default.<ext>; instandards/,workflows/andprompts/, a file of yours with a shipped name is kept and an unedited file theway stops shipping is removed; intemplates/, on a first install without a manifest a differing file is backed up to.bakbefore being replaced; - the
.shipped.jsonmanifest.
-
A pointer file is written for a custom home only, at
$XDG_CONFIG_HOME/theway/home(~/.config/theway/homewhen unset). -
Two rules are added to
permissions.allowin$CLAUDE_CONFIG_DIR/settings.json(~/.claude/settings.jsonwhen unset):Bash(theway:*);Read(~/.theway/**)for the default home, orRead(//<absolute path>/**)for a custom one.
The settings file keeps its mode, or gets
0600when new. -
Install cleans up after older versions and earlier homes:
- it removes the legacy
Edit(<root>/*/changes/**)rule and the 0.2.0 rules; - when the home changed, it removes the previous home's Read rule;
- it deletes the 0.2.0 launcher files under
<home>/bin, only when their contents match what 0.2.0 wrote; - it moves the shipped standards of the old
data/standards/layout tostandards/, and removesdata/standards/and thendata/when empty; - it removes the unedited step files and schemas earlier versions shipped in
steps/andschemas/, keeps every other file there with a message, and removes each folder when empty; it never removes a file from a project'ssteps/.
- it removes the legacy
-
Uninstall removes the plugin, the binary when it is theway's, the pointer, and the rules of
THEWAY_HOME, of the home the pointer names and of~/.theway, plus the legacyEdit(<root>/*/changes/**)rule and the 0.2.0 rules. It keeps the data home, with your changes and config.
engineering: writes only the change folder, with throwaway probes in amktemp -ddirectory.workflow: does what the workflow's prompts say for the run, and nothing more: edits the repository, in your session or through agents, and ticks the change's tasks withtheway task doneand writes itsnotes.mdin its change folder; commits only on the change's feature branch; pushes that branch and opens its PR only when a prompt says to; writes change folders andmktemp -ddirectories; never force-pushes or pushes the default branch; merges only on your explicit yes; pushes, PRs and merges go through the commandsgit-host.mdnames, never bypassing required reviews or checks.archive: moves a change folder tochanges/archive/<date>-<change-id>/only when you name the change and say to archive it; with--forceonly when you accept its open tasks.document: writes and overwritesdocs/architecture/*in the repository.list: reads only; runstheway path,theway projectandtheway list.
theway dashboardbinds127.0.0.1only and refuses a request whoseHostis not its own loopback address and port.- It takes a write only with its own
Originand the token it makes at start and puts in its page. - It writes only
<home>/workflows/,<home>/prompts/, a project's two same folders,<home>/history/, and thechange.yamland Markdown files of a project's active change folders (<home>/projects/<key>/changes/<id>/). Those files are instructions to every command, as "Untrusted content" says.
- Project keys given with
--projectmust match^[A-Za-z0-9-]{1,200}$(a derived key longer than 200 characters is refused), and change IDs^[a-z0-9]+(?:-[a-z0-9]+)*$. - Both are at most 200 characters.
- A path built from them stays inside the data home.
- The package is published with npm trusted publishing, from the
npmenvironment, by the release workflow, only when release-please creates a release, i.e. when its release PR is merged tomain. - It carries a SLSA provenance attestation.
- Every workflow action is pinned to a commit SHA, and a test enforces it.
- theway runs inside Claude Code with your permissions, and the text it reads (code, CI logs, PR text, web pages, other agents' output) can contain prompt injection.
- The Authority rule in
authority.mdtells the model and every spawned agent to treat that text as data. - The same rule treats the data home's
config.yaml, standards, templates, prompts, steps and workflows as instructions: anyone who can write to the data home can steer every command. Keep it writable only by you. - Claude Code loads a repository's own instruction files (CLAUDE.md, CLAUDE.local.md,
.claude/CLAUDE.md,.claude/rules/, AGENTS.md and the files they import) as instructions. Read them before running theway in a repository you don't trust. - Claude Code's permission settings remain the boundary that actually enforces anything.
- The CLI and install/uninstall.
- Command text that grants more than the authority stated above.
- Injected text that makes a command exceed that authority.
Claude Code itself and your own permission settings are out of scope: report those to their owners.
Report vulnerabilities through GitHub private vulnerability reporting: open the Security tab of this repository and click "Report a vulnerability". Never report them in public issues.
Expect a first response within 7 days.