update
Skill734 starsChanged 9 days agoMITView on GitHub
For claude-desktop-extra - handle a new upstream Claude Desktop version end-to-end: build, fix failing patches, diff old vs new JS for new platform gates, audit feature flags + ion-dist + platform gates, update baseline docs + CHANGELOG, bump .upstream-version, then commit.
- Deletes or force-pushes
61 other projects use a version of this.
Adopted by
Most recently taken up by
- orgiggly/claude-plugintheir own version, first seen Nov 8, 2026
- ljchang/mechatheir own version, first seen Nov 8, 2026
- onetapstudiogames/1f3d9-citylifetheir own version, first seen Nov 8, 2026
- egregore-labs/egregoretheir own version, first seen Nov 6, 2026
- buildomator/buildomatortheir own version, first seen Nov 4, 2026
- ChainGPT-org/chaingpt-claude-skilltheir own version, first seen Nov 1, 2026
Used with
Projects with it also use end, create and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
torarnvSkillend
Wrap up a work session. Updates memory files, logs decisions and lessons, appends to the session log.
Also in 3 projects that use this
MicrosoftSkillcreate
Also in 4 projects that use this
bitwize-music-studioSkilltutorial
Provides interactive guided album creation for new users. Use when the user is new to the plugin or asks for a walkthrough of the album creation process.
Also in 3 projects that use this
MicrosoftSkillnote
Use this skill to record progress, partial findings, hypotheses, and page-anchored evidence while investigating a long document. Call Note aggressively — any time you read a page and confirm, narrow, or update your understanding of the user's question. Triggers include "jot that down", "save this finding", "note that page 7 says X", or (more often) implicit internal signals — you just learned something and want it recoverable later. Notes persist in the session and Review can select among them. Never paraphrase notes back from memory; write them as you go.
Also in 4 projects that use this
kv0906Skillinbox
Quick capture mode (with content) or batch processing mode (no content). GTD-style routing of inbox items to proper folders. Use "/inbox thought to capture" or "/inbox" to process.
Also in 4 projects that use this
jholhewresSkillbackup
Backup and restore — files, databases, and system backups
Also in 3 projects that use this
- +2 more from microsoft
Other versions61 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 61
- anthropics/knowledge-work-plugins★ 35ksame name
- Q00/ouroboros★ 6.3ksame name
- vellum-ai/vellum-assistant★ 1.5ksame name
- me2resh/apexyard★ 542same name
- daloopa/investing★ 488same name
- TokenRollAI/cc-plugin★ 483same name
- egregore-labs/egregore★ 293same name
- k1p1l0/claude-telegram-supercharged★ 144same name
- kv0906/pm-kit★ 138same name
- buildomator/buildomator★ 102same name
51 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository12 other files it gives its agents.
- AGENTS.mdAGENTS.md
- 3pSkill
- architectureSkill
- auditSkill
- check-issueSkill
- check-prSkill
- commentSkill
- debugSkill
- deploySkill
- fresh-upstreamSkill
- linuxSkill
- test-nativeSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
13 rules. 0 are common, 4 are distinctive, and 9 are very specific to this project.
0
Common
Most of the 59 edited versions we read keep these.
4
Distinctive
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 13
Run from the repo root. The official Linux .deb is remotely managed and re-minifies every release.
- Distinctive: line 15
Use sequential thinking and delegate independent analysis (diff, flag audit, ion-dist, platform gates) to parallel sub-agents where useful.
- Very specific: line 23
Use grep -a on extracted bundles.
- Very specific: line 25
Check how many copies of @anthropic-ai/claude-agent-sdk the bundle embeds: grep -ao 'CLAUDE_AGENT_SDK_VERSION="[0-9.]*"' …
- Very specific: line 37
Run the build for this OS (Arch here).
- Distinctive: line 44
If patches fail (upstream renamed identifiers / refactored / removed a feature):
- Distinctive: line 81
If earlier versions were auto-released without an audit, diff catalogs and baselines (Steps 4-6) against the LAST AUDITED version (the …
- Very specific: line 84
Read baseline/CLAUDE_FEATURE_FLAGS.md.
- Very specific: line 88
Check enable_local_agent_mode.nim's override list still covers the cowork/code flags and its Zod schema includes them.
- Very specific: line 98
Read baseline/ION.md. ion-dist is in the .deb's resources, not inside app.asar.
- Very specific: line 110
Read baseline/PLATFORM_GATE_BASELINE.md first.
- Distinctive: line 125
Update only what changed:
- Very specific: line 137
Always re-extract fresh if ./tmp is stale (different minified names -> wrong conclusions).
“Common” is measured: kept by at least 6 in 10 of the 59 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Update to a new upstream Claude Desktop version
When to run this: normally you don't. CI auto-releases new upstream versions (version-check.yml dispatches build-and-release.yml; green run = released + .upstream-version bumped + tracking issue closed). Run this skill when the auto-release failed (a comment on the "new version detected" issue links the failed run) or when you want a deep audit of a bump. On a patch failure, decide FIRST: did the re-minify just move the anchor (fix the regex), or did upstream natively implement what we patch (remove the patch - the expected direction, since Anthropic maintains 1p Linux support)?
Upstream changelog: https://claude.com/docs/cowork/changelog ("Release notes for Claude Desktop", one entry per version incl. the bundled Claude Code version). Read the entry for the new version before Step 3; it is a hint list, not the authority (past major-number jumps went unexplained there - the code decides).
Run from the repo root. The official Linux .deb is remotely managed and re-minifies every release; patches use [\w$]+ wildcards on stable string anchors. Step 1 runs /fresh-upstream for a clean extract; Step 9 ends with /deploy to release. $ARGUMENTS may name a target version.
Use sequential thinking and delegate independent analysis (diff, flag audit, ion-dist, platform gates) to parallel sub-agents where useful; you coordinate and edit.
Search rules (apply to every step)
- The main bundle is code-split since v1.19367.0:
index.jsis a loader stub, the code lives inindex.chunk-<hash>.jssiblings (hashes change every release) +index.pre.js. For any "search the bundle" command, use a concatenation per side:B=./tmp/app.asar.contents/.vite/build cat $B/index.pre.js $B/index.js $B/index*.chunk-*.js > ./tmp/new-bundle.js # same for the OLD extract -> ./tmp/old-bundle.js - Use
grep -aon extracted bundles.rg -a --no-ignoresilently fails on them (raw NUL bytes); a zero-hitrgis not evidence. - Match JS identifiers with
[\w$]+, never bare\w+- minified names contain$(F$e,$S) and\w+silently misses them. - Check how many copies of
@anthropic-ai/claude-agent-sdkthe bundle embeds:grep -ao 'CLAUDE_AGENT_SDK_VERSION="[0-9.]*"' ./tmp/new-bundle.js | sort | uniq -c. It was 2 from v1.12603.0 and 1 by v2.42304.2 (0.3.299; 0.3.304 in v3.1623.0). If >1, a pattern on SDK-internal code matches once per copy: decide explicitly whether to patch both and assert the count. - The shell's
grepmay be a ugrep shim that rejects long context patterns (.{0,200}fails with "exceeds complexity limits";.{0,60}works). For wide context windows use python:python3 -I -c 'import re,sys;d=open(sys.argv[1],"rb").read().decode("latin1");[print(m) for m in sorted(set(re.findall(r".{0,200}ANCHOR.{0,200}",d)))]' "$NEW".
Step 0 - clean slate
cd "$(git rev-parse --show-toplevel)"
git status # must be clean before starting
rm -rf build/ extract/ # old artifactsNote current .upstream-version. If you're here because the auto-release failed, read the failed run's log first - it names exactly which patch (and which sub-patch counter) failed.
Step 1 - build & fix patches
Run the build for this OS (Arch here). It auto-downloads the latest official .deb, applies patches, packages:
./scripts/build-local.sh
# Ubuntu/Debian: SKIP_SMOKE_TEST=1 ./scripts/build-ubuntu-local.sh
# Fedora/RHEL: ./scripts/build-fedora-local.sh
# Specific version / local .deb: --version 1.17282.0 | --deb /path/to/claude-desktop_amd64.debIf patches fail (upstream renamed identifiers / refactored / removed a feature):
- Get a clean unpatched extract (run
/fresh-upstream, or it's already in./tmp/app.asar.contents/.vite/build/)../scripts/validate-patches.sh ./tmp/app.asar.contentsruns every patch against it and lists the failures. - For each failing patch, find the new pattern with
grep -ao '.{0,50}anchor.{0,50}', then fixpatches/<group>/<name>.nimwith capture/replace, reusing the captured names:
Edit the# BAD - hardcoded minified names break on the next release let pattern = re2"function pTe\(\)\{const t=ce\.screen\.getPrimaryDisplay\(\)" # GOOD - wildcard + capture, rebuild from the captured groups let pattern = re2"(function [\w$]+\(\)\{const t=)([\w$]+)(\.screen\.)getPrimaryDisplay\(\)".jsinjs/for Computer Use / cowork-font and otherstaticReadpatches, thentouchthe.nim(the Makefile tracks most but not allstaticReaddeps). - Recompile + test one patch against the stub+chunks concatenation (what the orchestrator stages):
The staged concatenation never passescd patches && make <patch_name> && cd .. B=./tmp/app.asar.contents/.vite/build { cat $B/index.js; for c in $B/index.chunk-*.js; do printf '\n/*__CDB_SPLIT__%s__*/\n' "$(basename $c)"; cat "$c"; done; } > ./tmp/test-index.js patches/<group>/<patch_name> ./tmp/test-index.js; echo "exit=$?"node --checkas a whole; the per-chunknode --checkin the build is authoritative. A syntax error there means the patch replaced only part of a construct. - Re-run the build until all patches pass. Every sub-patch must succeed or
quit(1)- never[WARN]+continue. If a feature was upstreamed, remove the patch (git rm, bumpEXPECTED_PATCH_COUNTinscripts/apply_patches.py). The absorption probe (scripts/check-upstream-absorbed.py, run by the build) flags ABSORBED/PARTIAL patches: audit that upstream ships the same behavior on Linux, then remove. FAILED means re-fit, not remove. A PARTIAL verdict can also be a false "already patched" in our own idempotency check (a prefix regex matching new, unrelated upstream code): read the matched site before removing anything. See AGENTS.md Rules 4/6.
Step 2 - Linux-compat analysis (new gates?)
Diff old vs new for newly darwin/win32-gated features that need Linux support (OLD/NEW = the two concatenations from the search rules):
diff <(grep -aoE '.{0,40}process\.platform.{0,40}' "$OLD"|sort -u) <(grep -aoE '.{0,40}process\.platform.{0,40}' "$NEW"|sort -u)
diff <(grep -aoE '.{0,80}status:"unavailable".{0,80}' "$OLD"|sort -u) <(grep -aoE '.{0,80}status:"unavailable".{0,80}' "$NEW"|sort -u)
diff <(grep -aoE 'require\("[^"]+"\)' "$OLD"|sort -u) <(grep -aoE 'require\("[^"]+"\)' "$NEW"|sort -u) # new native modules -> need x86_64+aarch64Validate any new input/screenshot feature across all 5 session types (X11, wlroots, GNOME, KDE, XWayland).
Step 3 - diff old vs new JS
diff <(cd ./tmp/app.asar.contents-OLD && find . -type f | sed 's/-[A-Za-z0-9_-]\{8\}\.js$/.js/' | sort) \
<(cd ./tmp/app.asar.contents && find . -type f | sed 's/-[A-Za-z0-9_-]\{8\}\.js$/.js/' | sort) # new/removed files
diff <(grep -aoE 'handle\("[^"]+"' "$OLD"|sort -u) <(grep -aoE 'handle\("[^"]+"' "$NEW"|sort -u) # IPC handlersRead the new version's entry in the upstream changelog (https://claude.com/docs/cowork/changelog) and cross-check every item that touches something we patch or ship (Quick Entry, window chrome, settings pages, popouts, managed-settings keys, Computer Use) against the patches; the code stays the authority. Also skim Claude Code / Cowork subsystem changes. Classify each finding: rename-only (no action) / new feature (may need a Linux patch) / changed behavior (existing patches may break) / removed (clean up patches/docs).
If earlier versions were auto-released without an audit, diff catalogs and baselines (Steps 4-6) against the LAST AUDITED version (the version stamped in the baseline docs), not just the previous release.
Step 4 - feature-flag audit
Read baseline/CLAUDE_FEATURE_FLAGS.md. Find the new static-registry function name (changes every release; anchor on a known flag like ccdPlugins). Diff flag sets:
diff <(grep -aoE '[\w$]+\("[0-9]{6,}"\)' "$OLD"|sort -u) <(grep -aoE '[\w$]+\("[0-9]{6,}"\)' "$NEW"|sort -u)Check enable_local_agent_mode.nim's override list still covers the cowork/code flags and its Zod schema includes them. Update the doc + version-history table.
Also refresh the flag catalog in js/growthbook_overrides.js (TEMPLATE): it lists every store-consulted flag of the audited version, commented out. Extract IDs from EVERY quoted 6-10 digit literal, not only call-shaped ones (many IDs are hoisted into a variable first, e.g. var Ou="1169442571";...t.u1(Ou,!0), or sit in arrays; a call-shaped grep found 516 of 619 at v3.1623.0): grep -aoE '["][0-9]{6,10}["]' <new-bundle-concat> | tr -d '"' | sort -u, then drop non-flag constants (git modes like 100644/160000, registry dwords, 0123456789, size/limit literals) and dead gates, each after reading its site. Drop the IDs force-rewritten by patches (grep -oI '"[0-9]{6,10}"' patches//.nim`, minus IDs only mentioned in comments), and update descriptions + the version stamp in the header. Then regenerate the browsable copy and rebuild the binary:
bash scripts/check-jsonc-template-sync.sh --write # updates docs/claude-desktop-extra.jsonc
touch patches/core/add_growthbook_overrides.nim && (cd patches && make)CI runs scripts/check-jsonc-template-sync.sh (no --write) and fails if the docs catalog drifts from the shipped template.
Step 5 - ion-dist SPA audit
Read baseline/ION.md. ion-dist is in the .deb's resources, not inside app.asar. Since v4.29.0 it ships packed as resources/ion-dist.asar (the build extracts it, patches the extract and repacks it in place); extract it once for the audit:
asar extract ./tmp/extract/usr/lib/claude-desktop/resources/ion-dist.asar ./tmp/ion-dist
ION=./tmp/ion-dist
ls "$ION/index.html" && du -sh "$ION" && find "$ION" -name '*.js' | wc -l # vs baseline: big swing = refactor
grep -l 'org-plugins' "$ION/assets/v1/"*.js # config chunk (hash changes every release)
grep -aoE 'mountPath:\{.{0,200}\}' "$ION/assets/v1/"*.js # a linux key here = maybe upstreamed
grep -aoE '/Library/Application Support.{0,60}|%ProgramFiles%.{0,60}' "$ION/assets/v1/"*.jsfix_ion_dist_linux.nim finds its target by content signature, not filename. Update ION.md / the patch if anything moved.
Step 6 - platform-gate re-audit
Read baseline/PLATFORM_GATE_BASELINE.md first; only gates that don't map to an existing row matter.
for p in darwin win32 linux; do echo "$p: $(grep -ao "platform===\"$p\"" "$NEW" | wc -l)"; done # vs baseline counts
grep -aoE '.{0,60}process\.platform==="(darwin|win32)".{0,80}' "$NEW" | sort -u
grep -aoE '.{0,80}!=="darwin".{0,40}!=="win32".{0,80}' "$NEW" | sort -u
grep -aoE '.{0,60}processPlatform\(\).{0,60}' "$NEW" | sort -u # injected gates, e.g. this.deps.processPlatform()!=="win32" - the process.platform greps miss theseClassify each: PATCHED (maps to a patch) / NATIVE (real Apple/Win API) / STUB (disabled on all platforms) / PORTABLE (mac/win-only, no native dep, not patched - the only actionable class). Verify before reporting: trace every PORTABLE candidate yourself and quote the verbatim snippet; past sub-agent audits hallucinated removed features and fake UUIDs. Update the baseline's Last audited, counts and rows.
Step 7 - Cowork backend
Cowork runs on the .deb's bundled native VM backend (cowork-linux-helper + virtiofsd + smol-bin + QEMU/OVMF; the local VM requires /dev/kvm). Nothing to update on a bump. Cowork has two backends: cloud Cowork (1P only; no KVM, desktop tools need a keyed device = TPM access) and the local Cowork VM (optional in 1P, the only Cowork in 3P). Settings -> Extra -> Cowork (Linux) shows both.
Re-check on every bump: baseline/COWORK_HEADER_ICON_ANCHORS.md (the claude.ai header icon anchors of fix_cowork_device_icon_web.nim) and the two core captures in add_feature_extra_settings.nim (globalThis.__cdbNavigation, globalThis.__cdbCoworkVmProbe) that the Cowork (Linux) page uses.
Step 8 - docs
Update only what changed:
CHANGELOG.md- add the new entry (one##section per day, newest at top; informative not a debug log).baseline/CLAUDE_FEATURE_FLAGS.md,CLAUDE_BUILT_IN_MCP.md(checkregisterInternalMcpServercalls),ION.md,PLATFORM_GATE_BASELINE.md- if their tracked internals moved.docs/patches.mdpatch tables - if patches added/removed/changed; the README's summary carries the per-directory counts. Do NOT touch README install-command version numbers (CI updates those viased; manual edits cause merge conflicts).
Step 9 - bump .upstream-version (required) + commit
echo "<NEW_VERSION>" > .upstream-version # closes the "new version detected" issue, greens the README badgeThen commit + push to master directly, only when the user says to. After merge, release with /deploy (or /deploy force for patch-only changes where upstream version didn't move).
Guardrails
- Always re-extract fresh if
./tmpis stale (different minified names -> wrong conclusions). - A green build with all patches applied + docs synced +
.upstream-versionbumped is "done". Don't claim done with failing patches.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

