Claude Code is the assistant I use most, so it has the deepest links into Fulltrace. Every session starts already knowing my context, and two hooks keep that context in sync both ways without me thinking about it. Its setup has three parts: how to behave, what to know, and which commands to run. Permissions allow almost everything and stop hard on a short list. Routine chores run through low-cost tools, which keeps the bill down.
Claude Code's setup lives in three places in clients/claude/: how to behave, what to know, and what to do. Keeping them apart makes each one easy to look after.
A written contract for how the assistant communicates: its style, language rules (no em dashes, no AI openers), what I already know, and formatting. It loads in every session, from ~/.claude/CLAUDE.md.
Who I am, what I am working on, and what is already settled. The shared memory (global.md, conventions.md, projects/*.md) loads every time. Each project also has its own memory under ~/.claude/projects/[slug]/memory/, which the assistant writes as it learns.
Shortcuts for jobs I repeat, available in any project as /jn-* commands: building and deploying extensions, updating changelogs and docs, and syncing memory and config. Routine work runs the same way every time.
Some context loads in every session. The rest loads only when Claude Code runs inside a project folder.
Three things always load: the contract at ~/.claude/CLAUDE.md, the shared memory under ~/.claude/memory/ (global.md, conventions.md and a file per project), and the global slash commands under ~/.claude/commands/.
A project's own .claude/CLAUDE.md adds to the global one and says which project this is. Its memory lives in a folder named after its path, so D:\Development\AI becomes d--Development-AI. The same project on another drive would get a different name, so aliases point both at one folder.
The repo holds the master copy. sync.ps1 copies it into place and clears out stale files, and two hooks in settings.json run the sync for me.
Copies CLAUDE.md, the shared memory, the shared commands and settings.json into ~/.claude/, and clears stale files from earlier runs. It is safe to run again and again, and it is the only command that writes to the live setup.
The one exception to one-way sync, because the assistant writes memory as it learns. Each file is compared with the version from the last sync. A side that has not changed is left alone, a change on one side is copied across, and a conflict keeps the live copy and archives the other. File dates are never trusted.
A Stop hook runs push-runtime every time Claude Code exits, so changes made during a session are captured without a manual sync.
A second hook fires the moment Claude writes a file in ~/.claude/memory/ or ~/.claude/commands/, and runs the sync straight away instead of waiting for the session to end.
| Command | What it does |
|---|---|
| push-runtime | Deploys the master config to ~/.claude/, filling in every {{TOKEN}} placeholder (machine paths, the lightweight model id, the server token) as it goes, so the same repo deploys to any machine or drive. Clears stale files first. Config only flows one way; project memory is the one lane that flows both ways. |
| pull-extracted | Copies files from ~/.claude/memory/_extracted/ into memory/_extracted/ for review. It does not commit them. |
| clean-runtime | Removes every managed file from ~/.claude/, then runs push-runtime again. Used to clear out orphans after a restructure. |
Mechanical steps should not be billed like thinking. A command does the thinking once, hands the mechanical steps to tools, and logs them against a lightweight model, so the cost of a deploy reflects its one decision.
/jn-read-context reads a portfolio:// file straight from the server in the main session. The server already holds the file, so the cheapest read is one that starts nothing new.
/jn-ext-deploy calls the server's own compile, package and install tools instead of running shell commands. The command itself is logged as Sonnet, and each mechanical step is logged as the lightweight model, so the analytics charge compile and package at Haiku rates.
By default a helper runs as a real sub-agent: a separate context with its own tool limits, and only the result comes back. That suits any job that is better off without the main session's history.
An agent can also declare interactive: true and run inside the main conversation. A sub-agent has no way to ask me a question mid-run and wait for the answer, so an interview cannot run as one. The portfolio interviewer was the first to use this.
The permissions flipped as trust grew. When every routine command asks first, you learn to click approve without reading, and the prompt protects nothing. So settings.json accepts edits by default with a broad allow list, and puts its attention on the few things that must stop. Those stops have to fail safe.
Routine tools run without asking, ending in broad patterns such as Bash(*), PowerShell(*), Edit(*) and Write(*). The narrower entries above them record the common paths.
Two things always stop and ask. Granting or revoking Fulltrace's authority to apply a change (approval-cli grant and revoke), because that is the gate on every write to my code. And force-pushing, because it rewrites history that other machines depend on.
Never, whatever the context: wiping a drive or my home folder, reading secret files, and since 12 August the shell commands that send data off this machine (curl, wget, Invoke-WebRequest, Invoke-RestMethod and their short forms). These are refused outright, with no prompt.
clients/claude/ in the repo is the master copy. sync.ps1 copies each file below to its live place under ~/.claude/.
| Repo path | Deployed to | Purpose |
|---|---|---|
| clients/claude/CLAUDE.md | ~/.claude/CLAUDE.md | Behavioural contract |
| clients/shared/memory/global.md | ~/.claude/memory/global.md | Identity and stack |
| clients/shared/memory/conventions.md | ~/.claude/memory/conventions.md | Technical conventions (Salesforce, git, code standards) |
| clients/shared/memory/projects/*.md | ~/.claude/memory/projects/*.md | Per-project context files |
| clients/shared/skills/<name>/SKILL.md | ~/.claude/commands/*.md | 17 shared global slash commands |
| clients/claude/settings.json | ~/.claude/settings.json | Hooks and permission allowlists |
All 17 come from clients/shared/skills/ and are copied to all three assistants. In Claude Code they run as slash commands, and a hook logs each run to the server.