// ai client LIVE

Claude Code

The assistant I use most, and the most connected

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.

03 setup parts 17 shared commands 02 sync hooks 31 hard stops

Three Parts to the Setup

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.

How to behave
CLAUDE.md

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.

What to know
memory/

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.

What to do
commands/

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.

What Loads, and When

Some context loads in every session. The rest loads only when Claude Code runs inside a project folder.

Every session

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/.

Inside a project

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.

Sync Without Thinking About It

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.

01
sync.ps1 push-runtime

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.

02
Project memory, both ways

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.

03
When a session ends

A Stop hook runs push-runtime every time Claude Code exits, so changes made during a session are captured without a manual sync.

04
When memory is written

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.

sync_commandspush, pull, clean
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.

Cheap Work at Cheap Rates

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.

Portfolio reads go direct

/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.

Mechanical steps become tools

/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.

Sub-agents where isolation helps

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.

Inline where it has to ask me

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 --auto flag lets a chain of commands skip their confirmation steps. /jn-website-commit passes it to the changelog, docs, git and publish steps, so the whole post-build routine runs after one changelog approval.

Allow Most, Stop a Few

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.

Allow: 51 entries

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.

Ask: 8 entries

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.

Deny: 23 entries

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.

The stop on approvals was rebuilt after a self-audit found it did not work. A test grant ran without a prompt: none of its three layers enforced it, and in bypass mode an ask rule is ignored entirely. It now returns an explicit allow, ask or deny for every command, so a compound command cannot slip through when the check is unsure.

Where Each File Goes

clients/claude/ in the repo is the master copy. sync.ps1 copies each file below to its live place under ~/.claude/.

path_mapevery repo path, where it deploys, what it is
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

The 17 Shared Commands

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.

/jn-ext-compileCompile the VSCode extension.
/jn-ext-packagePackage the extension as a .vsix, bumping its version.
/jn-ext-installInstall the newest .vsix, through the server's install tool.
/jn-ext-reloadReload the extension host so the new build is live.
/jn-ext-deployCompile, package, install and reload in one go, each step billed at the lightweight rate.
/jn-changelog-docs-commitChangelog, then docs, then commit, with a check at each step.
/jn-git-commitCommit staged work after a confirmation (skipped with --auto).
/jn-git-pushPush after a confirmation (skipped with --auto).
/jn-commit-push-allCommit and push every repo with changes, in one pass.
/jn-read-contextRead portfolio files from the server.
/jn-sync-claudeRun the Claude sync script to deploy the master config.
/jn-sync-cursorRun the Cursor sync script.
/jn-update-changelogDraft a dated changelog entry and add it after a confirmation.
/jn-update-docsFind and update the .md files affected by the latest changes.
/jn-website-contentDraft and write showcase site copy for the current project.
/jn-website-commitThe full post-build routine: changelog, docs, site copy, commit and push.
/jn-update-claude-stats-cacheRefresh the cached analytics data for Studio.