Full teardown, including every system prompt, the three sources taste feeds on, the tool catalogue, the wire protocol and the telemetry: https://gist.github.com/safzanpirani/26170636512c0b50494d6a70acfece8d
Web version: https://cmd.safzan.dev
Notes from reading the command-code npm package (Command Code CLI), version 1.58.0,
2026-09-19. Everything below is from the shipped bundle; line numbers are for dist/cli.mjs
run through npx prettier --parser babel (115,067 lines).
Reproduce with:
npm i -g command-code@1.58.0
npx prettier --parser babel \
"$(npm root -g)/command-code/dist/cli.mjs" > cli.pretty.mjs
No unpacking needed — it is a plain minified ESM bundle, and esbuild's --keep-names is on, so
every function is wrapped in __name(fn, "originalName") and the original identifiers survive.
From https://commandcode.ai/docs/taste, and repeated verbatim in the CLI's own help text
(:64741) and FAQ (:9371).
Archived copies, in case the page changes — the claim is present in every Wayback snapshot of this page from 2025-12-09 onward, so it is a long-standing position rather than a recent edit:
- 2026-09-07 (most recent capture)
- 2026-03-13
- 2025-12-09 (earliest capture)
The text:
"Taste is powered by our meta neuro-symbolic AI model taste-1 with continuous reinforcement learning (RL). We combine reasoning with neural intuition to create an invisible architecture of your choices, structures, patterns and tooling preferences."
The docs page bullets:
- "Continuously learning side learns the texture of your code (explicit & implicit feedback)."
- "Meta Neuro-Symbolic AI model taste-1 enforces the invisible logic of your choices."
- "Reflective Context Engineering of a self-aware RL feedback loop to build skills."
It also embeds an architecture diagram at /docs/mns.png whose alt text is
meta neuro-symbolic ai model taste-1.
runTasteLearningAgent (:55352) and compileTasteContext (:55686):
Shell out to git.collectCommits +getSubstitutions rungit show --format= -U3 --diff-algorithm=histogram -b --ignore-blank-lines -M <hash> over up to 200 commits and extract before→after line pairs.
2.
Build a prompt.compileTasteContext concatenates those hunks into a markdown document
headed# Dynamic Taste Analysis — Code Change Patterns and## Correction Diffs — What Wrong→Right Looks Like , ending with:## Instructions for Taste Learning`` You are analyzing code change patterns from a real repository. Based on the correction diffs above, generate deeply personal and opinionated coding taste.followed by eight numbered style guidelines ("Be specific, not generic," "Extract the WHY from patterns," "Capture anti-patterns too"…).
3.
Send it to an ordinary model. That string becomes a singlerole:"user" message on a
normal session, posted to the same/alpha/generate endpoint every other request uses, on
whatever model is currently selected:
const o = await e.createSession({ sessionId: …, baseUrl: t.getApiBaseUrl() });
o.setState({ state: { …, messages: [
{ role: "user", content: [{ type: "text", text: e.compiledContext }] } ] } });
await o.learn({ outputDir: e.outputDir });
The model writes markdown. Output lands in.commandcode/taste/taste.md .
5.
The file is pasted back into the system prompt on every later turn
(renderTasteSection2 ,:35886 ):
<taste>
Below is the complete content of the .commandcode/taste/taste.md file.
…
</taste>
git diffs → a prompt → an ordinary model → a markdown file → prompt prepending.
No embeddings. No weight updates. No RL loop. No symbolic component. No distinct model.
It is the CLAUDE.md / AGENTS.md pattern with an automated first draft.
Exactly one place — the TUI status bar (:97801):
y = Boolean(o && byokProviderId({ model: o })) ? "" : " · taste-1",
A literal string appended whenever you are not on BYOK. Configure your own provider and the
badge disappears while the feature behaves identically. It labels whichever model you picked
(claude-sonnet-4-6, moonshotai/Kimi-K2.5, …). It never names one.
Grep the bundle for taste-1 and you get four hits: this line, the FAQ string, the help string,
and the billing string below. There is no model id, no routing entry, no catalog record.
From the plans help text (:64749):
"Premium requests: Any request that uses a premium model (like taste-1) during your coding session."
Classifying taste-1 as a premium model is what justifies charging premium-request rates for
taste operations. The model catalog in the same bundle lists ~80 real model ids
(DeepSeek, Kimi, GLM, MiniMax, Qwen, GPT, Claude, Grok, Gemini) with contextWindow,
reasoningEfforts and provider routing. taste-1 is not among them.
The CLI states (:64741, :64749):
"Privacy: Taste processing runs on your codebase and stores learning data locally only."
"Taste processing runs on your codebase and stores learning data in your project and on your local machine only."
Storage is local — taste.md is written under .commandcode/taste/. Processing is not.
Step 3 above posts compiledContext to https://api.commandcode.ai, and that context embeds
verbatim source lines. buildSnippet2 (:55612) emits changed lines prefixed → with
surrounding context lines indented two spaces:
Snippet:
<context line>
→ <your changed line>
<context line>
Sending code to a model is what an inference call is, and is unremarkable in the main agent loop where the user knows it is happening. Taste is presented as local analysis. "Runs on your codebase … on your local machine only" reads as a claim that the code does not leave the machine, and it does.
The bundle ships a sensitive-filename denylist (:68900):
.env .env.* *.pem *.key id_rsa id_rsa.* id_ed25519 id_ed25519.*
id_ecdsa id_ecdsa.* credentials credentials.* *.crt .npmrc .pypirc .netrc
hasSensitiveBasename consumes it at six call sites — write-guarding (:17640), path-safety
sets (:17728, :17773), IDE/telemetry file lists (:74588, :74600, :74606).
The taste extractor is not one of them. Its only filter is isNoiseFile (:55556, list at
:77172):
package-lock.json pnpm-lock.yaml yarn.lock CHANGELOG.* .versionbot/
*.min.js *.min.css dist/ *.map
That is a relevance filter, not a safety filter.
Because taste reads history rather than the working tree, a repo that ever committed a
.env, *.pem, id_rsa or credentials file will have those hunks extracted verbatim and
uploaded with everything else — deleting the secret from HEAD does not remove it from the
commit range taste mines.
The filter exists and is applied in six places. It is missing from the one path that ships historical file contents off the machine.
- Opt out of telemetry with
DO_NOT_TRACK=1or"telemetry": falsein~/.commandcode/config.json. - The taste feature is genuinely useful. An automated first pass at a conventions file,
derived from what you actually did rather than what you'd claim you do, beats a blank
CLAUDE.md. None of the above is an argument against using it. - The objection is narrow: the mechanism is prompt engineering, and it is described as a neuro-symbolic model with reinforcement learning.
- All of this is from a published npm package, read as shipped. Version-pinned to 1.58.0; later releases may differ.