{"id":"d414bf9e-bd87-4ce0-872d-f7b226d81a56","shortId":"2Kmubr","kind":"skill","title":"cheez-write","tagline":"This skill should be used when the user asks to edit, replace, modify, update, change, delete, or insert code in a file — phrases like \"replace this function\", \"delete lines 44-89\", \"update validateToken\", \"change the implementation\", \"add this import\", \"fix this bug\" (when fixin","description":"# cheez-write\n\n> **Hard dependency**: If `mcp__tilth__tilth_edit` is unavailable, stop immediately and report\n> \"tilth MCP server is not loaded — cannot proceed.\" Do NOT fall back to `Edit`, `Write`,\n> or any host tool. Install via `tilth install <host> --edit` — the `--edit` flag is required\n> to expose `tilth_edit` (see README \"Installing tilth MCP\").\n\n## Capability detection\n\nBefore the first call, verify tilth's edit tool is reachable:\n\n1. Check that `mcp__tilth__tilth_edit` is in your tool list. If only `tilth_read` and `tilth_search` are present, tilth was installed without `--edit`. Stop and report `\"tilth MCP server is loaded but edit mode is disabled — re-install with 'tilth install <host> --edit'.\"`\n2. The first edit call is a probe by definition — if it returns a JSON-RPC transport error (not a hash mismatch), stop and report `\"tilth MCP server present but unhealthy: <error>\"`.\n3. Hash mismatches, syntax errors in the new content, or anchor-not-found are **content** issues — recover via the protocol below, do not bail.\n\nHash-anchored file editing via **tilth MCP** (`tilth_edit`).\nUse hash anchors from tilth_read to make precise, surgical edits. Avoid\nrewriting whole files unless the size and change ratio justify it (see\n\"When full-file rewrite is acceptable\" below).\n\n---\n\n## Examples\n\n### \"Replace the body of `handleAuth` in `src/auth.ts`\"\n\nStep 1 — read with edit mode to get anchors:\n\n```\ntilth_read(path: \"src/auth.ts\", section: \"44-89\", edit: true)\n# returns 44:b2c|... and 89:e1d|...\n```\n\nStep 2 — apply with the captured anchors:\n\n```json\ntilth_edit({\n  \"path\": \"src/auth.ts\",\n  \"edits\": [{\n    \"start\": \"44:b2c\",\n    \"end\":   \"89:e1d\",\n    \"content\": \"export function handleAuth(req, res, next) {\\n  const token = extractToken(req);\\n  if (!validateToken(token)) return res.status(401).end();\\n  next();\\n}\"\n  }]\n})\n```\n\nResponse confirms `Edit applied to src/auth.ts` and may list callers to\nreview.\n\n### \"Add an import without nuking the existing one on line 13\"\n\n`tilth_edit` replaces — there is no native insert. Anchor on line 13 and put\nthe original line back at the top of `content`:\n\n```json\ntilth_edit({\n  \"path\": \"src/auth.ts\",\n  \"edits\": [{\n    \"start\": \"13:abc\",\n    \"content\": \"import { existingThing } from './existing';\\nimport { newHelper } from './helpers';\"\n  }]\n})\n```\n\n### \"Hash mismatch — file changed under me\"\n\n```\nError: Hash mismatch at line 44\nExpected: b2c\nFound: f9a\n```\n\nRe-read the section, capture the new anchors, retry once. If it mismatches\nagain, **stop** — see \"Hash Mismatch Handling → Repeated mismatches\" below\n(`tilth_edit` has no fuzzy / search-replace mode, so blind retries lose\nraces, not win them).\n\n---\n\n## Core Principle: Anchors, Not Rewrites\n\nTraditional AI editing rewrites entire files, wasting tokens and risking data loss.\ntilth_edit uses **hash anchors** — unique identifiers for each line — to:\n- Make precise, surgical changes\n- Reject edits if the file changed (hash mismatch)\n- Show you exactly what changed\n\n**The protocol:**\n1. Read the file section with `tilth_read` (cheez-read) → get hash anchors\n2. Note start/end anchors for the block you'll change\n3. Call `tilth_edit` with those anchors and new content\n\n---\n\n## Scope: when tilth_edit, when not\n\n`tilth_edit` owns **block edits to tracked source code** — function bodies, signatures, imports, single-line tweaks, multi-edit batches, and cross-file specific changes. Hash anchors give concurrency safety; the read-edit protocol is mandatory for any code change that matters.\n\nFor everything else, prefer the right tool:\n\n| Change | Use this instead | Why |\n|--------|------------------|-----|\n| Cross-cutting structural codemod (`JSON.parse(JSON.stringify($X))` → `structuredClone($X)`) across N files | `sg --rewrite` (dry-run-first protocol) | tilth_edit needs N reads-for-anchors; codemods template the variable parts |\n| Lockfile changes (`Cargo.lock`, `package-lock.json`, `uv.lock`, etc.) | the package manager (`cargo update`, `npm i`, `uv lock`) | Hand-editing lockfiles loses checksum integrity |\n| Generated / build artifacts (compiled JS, transpiled output, `*.pb.go`) | regenerate from source | Editing the artifact rots on the next build |\n| Brand-new files, no prior content | `tilth_edit` (anchor on line 1, end-anchor on the last line for a single-edit insert) | Stay on one path; the anchor cost is negligible for new files |\n| Files outside the repo or inside dependency caches (`node_modules`, `.cargo/registry`) | don't edit them | Modifying dependencies is almost always a mistake — fix the source or upstream |\n| Binary files, images, PDFs | the producing tool | tilth_edit is text-only |\n\nIf the question is \"which tool for this specific source-code block edit?\" → `tilth_edit`. If it's \"rewrite this pattern everywhere\" → `sg --rewrite` with the dry-run protocol.\n\n### When LSP rename beats tilth_edit (if your harness has one)\n\n**easy-cheese does not install LSP** — it is whatever language servers your harness already exposes. There is one editing operation where an available LSP materially outperforms `tilth_edit`: **type-aware rename** of a symbol across the project.\n\n| Edit | Use this instead | Why LSP wins |\n|------|------------------|--------------|\n| Rename a function / class / variable across all type-correct usages, including aliased re-exports and generic instantiations | `textDocument/rename` (or the harness's rename refactor) | Returns a typechecker-validated `WorkspaceEdit`; covers aliased imports without textual collisions, and skips coincidental name matches in unrelated scopes. `tilth_edit` would need a separate read-edit cycle per call site, and `sg --rewrite` matches on syntax not type identity (overshoots on shadowed names, undershoots on aliased re-exports) |\n\nFor everything else — block edits, signature changes, body rewrites, hand-written codemods — `tilth_edit` (one-off) and `sg --rewrite` (cross-cutting) remain the right tools. LSP rename is narrowly the best fit for **identifier renames specifically**; nothing else in LSP's edit surface improves on the cheez-write protocol.\n\nIf no LSP is installed, or the rename touches a symbol the typechecker can't resolve (broken code, generated bindings), fall back to `sg --rewrite` with the dry-run-first protocol — see \"Structural codemods\" below.\n\n---\n\n## Hash Anchor Format\n\nWhen you read a file with tilth_read in edit mode, lines have anchors:\n\n```\n42:a3f|  let x = compute();\n43:f1b|  return x;\n```\n\nFormat: `<line>:<hash>|<content>` (ASCII pipe, no space).\n\nThe hash is a short content fingerprint. If someone else edits the file,\nhashes change, and your edit is safely rejected.\n\n---\n\n## MCP Tool Reference\n\n### tilth_edit — Precise File Editing\n\nThe minimal shape — single anchor, replacement content:\n\n```json\ntilth_edit({\n  \"path\": \"src/auth.ts\",\n  \"edits\": [\n    { \"start\": \"42:a3f\", \"content\": \"  let x = recompute();\" }\n  ]\n})\n```\n\nFor range replacement, deletion, multi-edit, insert-after, cross-file\nbatches, and the `diff: true` response option, see\n[`references/edit-patterns.md`](references/edit-patterns.md). That file is the\nJSON cookbook; this body sticks to the protocol.\n\n---\n\n## The Read-Edit Protocol\n\n### Step 1: Read to Get Anchors\n\n```\ntilth_read(path: \"src/auth.ts\", section: \"44-89\")\n```\n\nOutput:\n```\n44:b2c|export function handleAuth(req, res, next) {\n45:c3d|  const token = req.headers.authorization?.split(' ')[1];\n...\n88:d4e|  next();\n89:e1d|}\n```\n\n### Step 2: Note Your Anchors\n\n- **Start anchor:** `44:b2c` (first line of function)\n- **End anchor:** `89:e1d` (closing brace)\n\n### Step 3: Edit with Anchors\n\n```json\ntilth_edit({\n  \"path\": \"src/auth.ts\",\n  \"edits\": [{\n    \"start\": \"44:b2c\",\n    \"end\": \"89:e1d\",\n    \"content\": \"export function handleAuth(req, res, next) {\\n  const token = extractToken(req);\\n  if (!validateToken(token)) {\\n    return res.status(401).json({ error: 'Invalid token' });\\n  }\\n  req.user = decodeToken(token);\\n  next();\\n}\"\n  }]\n})\n```\n\n---\n\n## Replacing Entire Functions\n\nThis is the most common use case. The pattern:\n\n1. **Read the function** (outline first if file is large):\n   ```\n   tilth_read(path: \"src/auth.ts\")\n   # See: [44-89]  export fn handleAuth(req, res, next)\n\n   tilth_read(path: \"src/auth.ts\", section: \"44-89\")\n   # Get hash anchors\n   ```\n\n2. **Note start/end anchors** from the hashlined output.\n\n3. **Replace the entire function body:**\n   ```json\n   tilth_edit({\n     \"path\": \"src/auth.ts\",\n     \"edits\": [{\n       \"start\": \"44:b2c\",\n       \"end\": \"89:e1d\",\n       \"content\": \"<your new function implementation>\"\n     }]\n   })\n   ```\n\n---\n\n## Hash Mismatch Handling\n\nIf the file changed since you read it:\n\n```\nError: Hash mismatch at line 44\nExpected: b2c\nFound: f9a\n\nCurrent content:\n44:f9a|export async function handleAuth(req, res, next) {\n...\n```\n\n**Recovery:**\n1. Read the section again → get new anchors.\n2. Review the current content (someone else may have made changes).\n3. Edit with new anchors.\n\nThis is a **safety feature**, not a bug.\n\n### Repeated mismatches → bail out, don't loop\n\nIf you hit **two consecutive mismatches** on the same anchor, you're racing a\nconcurrent writer. `tilth_edit` has no fuzzy / search-replace mode — there\nis no \"ignore the hash, just match this string\" option. A third retry will\nlikely lose the same race.\n\nThe correct move is to bail and report:\n\n1. Read the latest section one final time and capture the current content.\n2. Prepare the new content as a unified diff or full block, but **do not\n   apply** it.\n3. Report `\"hash-anchor race on <path>:<line>; current content and proposed\n   replacement attached. Retry once the file is quiescent or apply manually.\"`\n   along with the captured anchors and proposed content.\n4. Stop. Let the orchestrator (or a human) decide whether to apply the change\n   or escalate.\n\nThis trades automation for safety — losing a race twice means whatever's\nwriting the file is faster than your read-edit cycle, and a third blind\nretry could overwrite real work.\n\n---\n\n## Caller Updates After Signature Changes\n\nWhen you edit a function signature, tilth_edit shows callers that may need updating:\n\n```\nEdit applied to src/auth.ts\n\n── callers that may need updates ──\n  src/routes/api.ts:34   router.use('/api/*', handleAuth)\n  src/routes/admin.ts:12 app.use(handleAuth)\n  src/middleware.ts:8    const wrapped = handleAuth(...)\n```\n\nCheck these locations and update if needed.\n\n---\n\n## Common Patterns\n\n| Goal | Pattern | Reference |\n|------|---------|-----------|\n| Replace one line | single anchor, new `content` | [edit-patterns.md#single-line-replacement](references/edit-patterns.md#single-line-replacement) |\n| Replace a range | `start` + `end` anchors | [edit-patterns.md#multi-line-range-replacement](references/edit-patterns.md#multi-line-range-replacement) |\n| Delete a block | range with `content: \"\"` | [edit-patterns.md#delete-a-block](references/edit-patterns.md#delete-a-block) |\n| Insert after a line | anchor on that line, prepend its content | [edit-patterns.md#insert-after-a-line](references/edit-patterns.md#insert-after-a-line) |\n| Multi-edit in one file | `edits: [...]` ordered bottom-up | [edit-patterns.md#multiple-edits-in-one-call](references/edit-patterns.md#multiple-edits-in-one-call) |\n| Cross-file change | one `tilth_edit` call per file | [edit-patterns.md#edits-across-multiple-files](references/edit-patterns.md#edits-across-multiple-files) |\n\n---\n\n## Large Files: Outline First\n\nFor large files, tilth_read shows an outline, not hashlined content:\n\n```\n# src/giant.ts (2400 lines, ~32k tokens) [outline]\n\n[1-20]    imports\n[22-89]   interface Config\n[91-450]  class GiantHandler\n  [100-180]  fn process\n  [182-340]  fn validate\n```\n\n**To edit, drill into the specific section:**\n\n```\ntilth_read(path: \"src/giant.ts\", section: \"100-180\")\n# Now you get hashlined content for fn process\n```\n\nThen edit with those anchors.\n\n---\n\n## When full-file rewrite is acceptable\n\nHash-anchored, surgical edits are the default. There is one exception:\n\n| File size | Policy |\n|-----------|--------|\n| **> 150 lines** | Never rewrite the whole file. Always hash-anchored. |\n| **≤ 150 lines** | Anchored single-edit preferred, but a full rewrite (delete-everything + insert) is acceptable when **≥ 80%** of the file is changing. Below that threshold, do the surgical edit. |\n\nThe 150-line / 80% threshold is informed by 2026 industry data (Cursor's\npublished numbers, can.ac analysis, the Morph benchmark) showing full-file\nrewrites tie or beat diff-style on small files. The threshold keeps the\nspirit conservative — large files always stay anchored.\n\nWhen you do rewrite a small file in full, still use `tilth_edit` (anchor on\nline 1, end-anchor on the last line). Do **not** drop to host `Write` —\nthat bypasses tilth's hash-mismatch safety.\n\n---\n\n## Structural codemods — `sg --rewrite` escape\n\n`tilth_edit` excels at \"replace this specific block in this specific file\"\nwith hash-anchor concurrency safety. It handles cross-cutting structural\nchanges awkwardly: one file at a time, one read-for-anchors per location.\nFor codemods — \"rewrite every `JSON.parse(JSON.stringify($X))` to\n`structuredClone($X)`\", \"convert every `var $X = $Y` to `let $X = $Y`\" —\ndrop to `sg --rewrite` (ast-grep) via Bash. This is the **only** sanctioned\nshell escape from cheez-write.\n\nThe two tools are **complementary, not redundant**:\n\n| Tool | Safety property | Best for |\n|------|------------------|----------|\n| `tilth_edit` | Hash-anchor (concurrency) | Specific-block edits, signature changes |\n| `sg --rewrite` | Structural match (CST) | Cross-cutting codemods over N files |\n\nWhen the change repeats across many locations and the surrounding text\nvaries, `sg --rewrite` captures the variable parts via metavars and templates\nthem back into the rewrite — `tilth_edit` cannot express that without N\nreads.\n\nFor invocation rules (`--lang`, `--json`, no `--interactive`), pitfalls\n(CST-not-AST, metavar binding, lenient-by-default), and the **non-negotiable\ndry-run-first protocol** (search → clean tree → `-U` → diff → revert if too\nloose), see\n[`../cheez-search/references/sg-patterns.md`](../cheez-search/references/sg-patterns.md)\n— the \"Structural codemods (`sg --rewrite`)\" and \"Pitfalls\" sections in\nparticular.\n\n`sg --rewrite` does not have hash-anchor safety. Treat each codemod as a\nsingle transactional change between two clean git states; never layer\nadditional edits on top until the codemod is committed or reverted.\n\n---\n\n## DO NOT\n\n- **DO NOT rewrite files > 150 lines** — use hash anchors for surgical edits.\n- **DO NOT rewrite small files when the change is < 80%** — anchor the changed range only.\n- **DO NOT guess hash values** — always read first to get current anchors.\n- **DO NOT ignore hash mismatches** — re-read and retry (see Hash Mismatch Handling).\n- **DO NOT use sed / awk / perl -i** to edit code — they bypass hash anchors and structural safety, and have no mismatch detection. `sg --rewrite` is the *only* sanctioned shell escape, and only for structural codemods that follow the dry-run-first protocol.\n- **DO NOT use `patch`** to apply diffs to code — `tilth_edit`'s anchored ranges are the safe equivalent.\n- **DO NOT use `tee` or shell redirects (`>`, `>>`)** to overwrite/append code files — both bypass anchors. Use `tilth_edit`.\n- **DO NOT use the host Edit/Write tool** — use `tilth_edit` (or `sg --rewrite` for structural codemods) exclusively for code.\n- **DO NOT use `sg --rewrite` for one-off block edits** — that's `tilth_edit` territory. The codemod escape is only for cross-cutting structural changes; using it on a single location wastes its strength and skips hash-anchor safety.\n- **DO NOT skip the dry-run-first protocol for `sg --rewrite`** — search-only first, clean working tree, then `-U`. Never combine search+rewrite blindly.\n- **DO NOT edit without reading** — you need the anchors.\n- **DO NOT use for reading** — use cheez-read.\n- **DO NOT use for searching** — use cheez-search.\n\n---\n\n## What This Skill Doesn't Do\n\n- **Read files** — use cheez-read first to get anchors.\n- **Search code** — use cheez-search to find what to edit.\n- **Run tests after editing** — use test/build skills.\n- **Commit changes** — use git/gh skills.\n- **Review your edits** — use the `/age` skill.","tags":["cheez","write","easy","cheese","paulnsorensen","agent-skills","ai-coding","claude-code","code-review","developer-tools"],"capabilities":["skill","source-paulnsorensen","skill-cheez-write","topic-agent-skills","topic-ai-coding","topic-claude-code","topic-code-review","topic-developer-tools"],"categories":["easy-cheese"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/paulnsorensen/easy-cheese/cheez-write","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add paulnsorensen/easy-cheese","source_repo":"https://github.com/paulnsorensen/easy-cheese","install_from":"skills.sh"}},"qualityScore":"0.453","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 7 github stars · SKILL.md body (16,285 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:40.717Z","embedding":null,"createdAt":"2026-05-18T13:21:08.490Z","updatedAt":"2026-05-18T19:13:40.717Z","lastSeenAt":"2026-05-18T19:13:40.717Z","tsv":"'-180':1740,1760 '-20':1729 '-340':1744 '-450':1736 '-89':34,283,1137,1255,1268,1732 '/age':2450 '/api':1563 '/cheez-search/references/sg-patterns.md':2112,2113 '/existing':393 '/helpers':397 '1':115,269,501,684,1126,1153,1239,1332,1424,1728,1899 '100':1739,1759 '12':1566 '13':356,368,387 '150':1796,1807,1839,2165 '182':1743 '2':161,293,515,1160,1272,1340,1437 '2026':1846 '22':1731 '2400':1723 '3':193,525,1179,1280,1351,1454 '32k':1725 '34':1561 '4':1484 '401':329,1214 '42':1022,1079 '43':1027 '44':33,282,287,306,409,1136,1139,1166,1190,1254,1267,1293,1315,1322 '45':1147 '8':1570 '80':1825,1841,2182 '88':1154 '89':290,309,1157,1174,1193,1296 '91':1735 'a3f':1023,1080 'abc':388 'accept':258,1780,1823 'across':608,828,843,1698,1704,2043 'add':40,346 'addit':2148 'ai':460 'alias':850,871,912 'almost':728 'along':1476 'alreadi':806 'alway':729,1803,1880,2193 'analysi':1854 'anchor':204,220,230,276,298,365,422,456,475,514,518,531,569,625,681,687,703,1006,1021,1069,1130,1163,1165,1173,1182,1271,1275,1339,1355,1380,1458,1480,1590,1608,1641,1773,1783,1806,1809,1882,1896,1902,1941,1961,2019,2131,2169,2183,2199,2227,2269,2288,2351,2387,2421 'anchor-not-found':203 'app.use':1567 'appli':294,337,1452,1474,1495,1552,2262 'artifact':655,666 'ascii':1032 'ask':12 'ast':1988,2085 'ast-grep':1987 'async':1325 'attach':1466 'autom':1502 'avail':815 'avoid':239 'awar':823 'awk':2218 'awkward':1951 'b2c':288,307,411,1140,1167,1191,1294,1317 'back':75,374,990,2062 'bail':217,1366,1421 'bash':1991 'batch':561,1098 'beat':784,1865 'benchmark':1857 'best':949,2013 'binari':737 'bind':988,2087 'blind':447,1526,2378 'block':521,544,762,919,1448,1623,1631,1636,1933,2023,2320 'bodi':263,551,923,1115,1285 'bottom':1669 'bottom-up':1668 'brace':1177 'brand':673 'brand-new':672 'broken':985 'bug':45,1363 'build':654,671 'bypass':1914,2225,2287 'c3d':1148 'cach':717 'call':107,165,526,895,1677,1684,1692 'caller':343,1532,1546,1555 'can.ac':1853 'cannot':70,2068 'capabl':102 'captur':297,419,1433,1479,2053 'cargo':640 'cargo.lock':633 'cargo/registry':720 'case':1236 'chang':18,37,247,401,485,491,498,524,567,583,593,632,922,1050,1305,1350,1497,1536,1688,1830,1950,2026,2041,2140,2180,2185,2337,2441 'check':116,1574 'checksum':651 'chees':794 'cheez':2,49,510,966,2001,2395,2404,2416,2426 'cheez-read':509,2394,2415 'cheez-search':2403,2425 'cheez-writ':1,48,965,2000 'class':841,1737 'clean':2103,2143,2369 'close':1176 'code':22,549,582,761,986,2223,2265,2284,2310,2423 'codemod':602,626,928,1003,1922,1965,2035,2116,2135,2154,2248,2307,2328 'coincident':878 'collis':875 'combin':2375 'commit':2156,2440 'common':1234,1581 'compil':656 'complementari':2007 'comput':1026 'concurr':571,1385,1942,2020 'config':1734 'confirm':335 'consecut':1375 'conserv':1877 'const':319,1149,1203,1571 'content':201,208,311,379,389,534,678,1041,1071,1081,1195,1298,1321,1344,1436,1441,1462,1483,1592,1626,1647,1721,1765 'convert':1974 'cookbook':1113 'core':454 'correct':847,1417 'cost':704 'could':1528 'cover':870 'cross':564,599,938,1096,1686,1947,2033,2334 'cross-cut':598,937,1946,2032,2333 'cross-fil':563,1095,1685 'cst':2031,2083 'cst-not-ast':2082 'current':1320,1343,1435,1461,2198 'cursor':1849 'cut':600,939,1948,2034,2335 'cycl':893,1522 'd4e':1155 'data':469,1848 'decid':1492 'decodetoken':1222 'default':1788,2091 'definit':170 'delet':19,31,1088,1621,1629,1634,1819 'delete-a-block':1628,1633 'delete-everyth':1818 'depend':52,716,726 'detect':103,2235 'diff':1101,1445,1867,2106,2263 'diff-styl':1866 'disabl':153 'doesn':2409 'dri':614,778,997,2098,2253,2358 'drill':1749 'drop':1909,1983 'dry-run':777 'dry-run-first':613,996,2097,2252,2357 'e1d':291,310,1158,1175,1194,1297 'easi':793 'easy-chees':792 'edit':14,57,77,87,89,96,111,121,140,150,160,164,222,227,238,272,284,301,304,336,358,382,385,438,461,472,487,528,538,542,545,560,576,619,648,664,680,696,723,745,763,765,786,811,820,831,885,892,920,930,960,1017,1046,1053,1061,1064,1074,1077,1091,1123,1180,1185,1188,1288,1291,1352,1388,1521,1539,1544,1551,1662,1666,1674,1681,1691,1697,1703,1748,1770,1785,1812,1837,1895,1927,2016,2024,2067,2149,2172,2222,2267,2291,2301,2321,2325,2381,2432,2436,2447 'edit-patterns.md':1593,1609,1627,1648,1671,1695 'edit/write':2297 'edits-across-multiple-fil':1696,1702 'els':588,918,956,1045,1346 'end':308,330,686,1172,1192,1295,1607,1901 'end-anchor':685,1900 'entir':463,1228,1283 'equival':2274 'error':179,197,404,1216,1310 'escal':1499 'escap':1925,1998,2243,2329 'etc':636 'everi':1967,1975 'everyth':587,917,1820 'everywher':772 'exact':496 'exampl':260 'excel':1928 'except':1792 'exclus':2308 'exist':352 'existingth':391 'expect':410,1316 'export':312,853,915,1141,1196,1256,1324 'expos':94,807 'express':2069 'extracttoken':321,1205 'f1b':1028 'f9a':413,1319,1323 'fall':74,989 'faster':1516 'featur':1360 'file':25,221,242,255,400,464,490,504,565,610,675,709,710,738,1012,1048,1063,1097,1109,1246,1304,1470,1514,1665,1687,1694,1700,1706,1708,1713,1777,1793,1802,1828,1861,1871,1879,1889,1937,1953,2038,2164,2177,2285,2413 'final':1430 'find':2429 'fingerprint':1042 'first':106,163,616,999,1168,1244,1710,2100,2195,2255,2360,2368,2418 'fit':950 'fix':43,732 'fixin':47 'flag':90 'fn':1257,1741,1745,1767 'follow':2250 'format':1007,1031 'found':206,412,1318 'full':254,1447,1776,1816,1860,1891 'full-fil':253,1775,1859 'function':30,313,550,840,1142,1171,1197,1229,1242,1284,1326,1541 'fuzzi':441,1391 'generat':653,987 'generic':855 'get':275,512,1129,1269,1337,1763,2197,2420 'gianthandl':1738 'git':2144 'git/gh':2443 'give':570 'goal':1583 'grep':1989 'guess':2190 'hand':647,926 'hand-edit':646 'hand-written':925 'handl':433,1301,1945,2213 'handleauth':265,314,1143,1198,1258,1327,1564,1568,1573 'har':789,805,860 'hard':51 'hash':182,194,219,229,398,405,431,474,492,513,568,1005,1037,1049,1270,1299,1311,1401,1457,1782,1805,1918,1940,2018,2130,2168,2191,2203,2211,2226,2350 'hash-anchor':218,1456,1781,1804,1939,2017,2129,2349 'hash-mismatch':1917 'hashlin':1278,1720,1764 'hit':1373 'host':81,1911,2296 'human':1491 'ident':905 'identifi':477,952 'ignor':1399,2202 'imag':739 'immedi':61 'implement':39 'import':42,348,390,553,872,1730 'improv':962 'includ':849 'industri':1847 'inform':1844 'insert':21,364,697,1093,1637,1650,1656,1821 'insert-aft':1092 'insert-after-a-lin':1649,1655 'insid':715 'instal':83,86,99,138,156,159,797,973 'instanti':856 'instead':596,834 'integr':652 'interact':2080 'interfac':1733 'invalid':1217 'invoc':2075 'issu':209 'js':657 'json':176,299,380,1072,1112,1183,1215,1286,2078 'json-rpc':175 'json.parse':603,1968 'json.stringify':604,1969 'justifi':249 'keep':1874 'lang':2077 'languag':802 'larg':1248,1707,1712,1878 'last':690,1905 'latest':1427 'layer':2147 'lenient':2089 'lenient-by-default':2088 'let':1024,1082,1486,1980 'like':27,1411 'line':32,355,367,373,408,480,556,683,691,1019,1169,1314,1588,1596,1601,1612,1618,1640,1644,1653,1659,1724,1797,1808,1840,1898,1906,2166 'list':126,342 'll':523 'load':69,148 'locat':1576,1963,2045,2343 'lock':645 'lockfil':631,649 'loop':1370 'loos':2110 'lose':449,650,1412,1505 'loss':470 'lsp':782,798,816,836,944,958,971 'made':1349 'make':235,482 'manag':639 'mandatori':579 'mani':2044 'manual':1475 'match':880,900,1403,2030 'materi':817 'matter':585 'may':341,1347,1548,1557 'mcp':54,65,101,118,145,188,225,1057 'mean':1509 'metavar':2058,2086 'minim':1066 'mismatch':183,195,399,406,427,432,435,493,1300,1312,1365,1376,1919,2204,2212,2234 'mistak':731 'mode':151,273,445,1018,1395 'modifi':16,725 'modul':719 'morph':1856 'move':1418 'multi':559,1090,1611,1617,1661 'multi-edit':558,1089,1660 'multi-line-range-replac':1610,1616 'multipl':1673,1680,1699,1705 'multiple-edits-in-one-cal':1672,1679 'n':318,323,331,333,609,621,1202,1207,1211,1219,1220,1224,1226,2037,2072 'name':879,909 'narrowli':947 'nativ':363 'need':620,887,1549,1558,1580,2385 'neglig':706 'negoti':2096 'never':1798,2146,2374 'new':200,421,533,674,708,1338,1354,1440,1591 'newhelp':395 'next':317,332,670,1146,1156,1201,1225,1261,1330 'nimport':394 'node':718 'non':2095 'non-negoti':2094 'note':516,1161,1273 'noth':955 'npm':642 'nuke':350 'number':1852 'one':353,700,791,810,932,1429,1587,1664,1676,1683,1689,1791,1952,1957,2318 'one-off':931,2317 'oper':812 'option':1104,1406 'orchestr':1488 'order':1667 'origin':372 'outlin':1243,1709,1718,1727 'outperform':818 'output':659,1138,1279 'outsid':711 'overshoot':906 'overwrit':1529 'overwrite/append':2283 'own':543 'packag':638 'package-lock.json':634 'part':630,2056 'particular':2123 'patch':2260 'path':279,302,383,701,1075,1133,1186,1251,1264,1289,1756 'pattern':771,1238,1582,1584 'pb.go':660 'pdfs':740 'per':894,1693,1962 'perl':2219 'phrase':26 'pipe':1033 'pitfal':2081,2120 'polici':1795 'precis':236,483,1062 'prefer':589,1813 'prepar':1438 'prepend':1645 'present':135,190 'principl':455 'prior':677 'probe':168 'proceed':71 'process':1742,1768 'produc':742 'project':830 'properti':2012 'propos':1464,1482 'protocol':213,500,577,617,780,968,1000,1119,1124,2101,2256,2361 'publish':1851 'put':370 'question':752 'quiescent':1472 'race':450,1383,1415,1459,1507 'rang':1086,1605,1613,1619,1624,2186,2270 'ratio':248 're':155,415,852,914,1382,2206 're-export':851,913 're-instal':154 're-read':414,2205 'reachabl':114 'read':130,233,270,278,416,502,508,511,575,623,891,1010,1015,1122,1127,1132,1240,1250,1263,1308,1333,1425,1520,1715,1755,1959,2073,2194,2207,2383,2392,2396,2412,2417 'read-edit':574,890,1121,1519 'read-for-anchor':1958 'readm':98 'reads-for-anchor':622 'real':1530 'recomput':1084 'recov':210 'recoveri':1331 'redirect':2281 'redund':2009 'refactor':863 'refer':1059,1585 'references/edit-patterns.md':1106,1107,1598,1615,1632,1654,1678,1701 'regener':661 'reject':486,1056 'remain':940 'renam':783,824,838,862,945,953,976 'repeat':434,1364,2042 'replac':15,28,261,359,444,1070,1087,1227,1281,1394,1465,1586,1597,1602,1603,1614,1620,1930 'repo':713 'report':63,143,186,1423,1455 'req':315,322,1144,1199,1206,1259,1328 'req.headers.authorization':1151 'req.user':1221 'requir':92 'res':316,1145,1200,1260,1329 'res.status':328,1213 'resolv':984 'respons':334,1103 'retri':423,448,1409,1467,1527,2209 'return':173,286,327,864,1029,1212 'revert':2107,2158 'review':345,1341,2445 'rewrit':240,256,458,462,612,769,774,899,924,936,993,1778,1799,1817,1862,1886,1924,1966,1986,2028,2052,2065,2118,2125,2163,2175,2237,2304,2315,2364,2377 'right':591,942 'risk':468 'rot':667 'router.use':1562 'rpc':177 'rule':2076 'run':615,779,998,2099,2254,2359,2433 'safe':1055,2273 'safeti':572,1359,1504,1920,1943,2011,2132,2230,2352 'sanction':1996,2241 'scope':535,883 'search':133,443,1393,2102,2366,2376,2401,2405,2422,2427 'search-on':2365 'search-replac':442,1392 'section':281,418,505,1135,1266,1335,1428,1753,1758,2121 'sed':2217 'see':97,251,430,1001,1105,1253,2111,2210 'separ':889 'server':66,146,189,803 'sg':611,773,898,935,992,1923,1985,2027,2051,2117,2124,2236,2303,2314,2363 'shadow':908 'shape':1067 'shell':1997,2242,2280 'short':1040 'show':494,1545,1716,1858 'signatur':552,921,1535,1542,2025 'sinc':1306 'singl':555,695,1068,1589,1595,1600,1811,2138,2342 'single-edit':694,1810 'single-lin':554 'single-line-replac':1594,1599 'site':896 'size':245,1794 'skill':5,2408,2439,2444,2451 'skill-cheez-write' 'skip':877,2348,2355 'small':1870,1888,2176 'someon':1044,1345 'sourc':548,663,734,760 'source-cod':759 'source-paulnsorensen' 'space':1035 'specif':566,758,954,1752,1932,1936,2022 'specific-block':2021 'spirit':1876 'split':1152 'src/auth.ts':267,280,303,339,384,1076,1134,1187,1252,1265,1290,1554 'src/giant.ts':1722,1757 'src/middleware.ts':1569 'src/routes/admin.ts':1565 'src/routes/api.ts':1560 'start':305,386,1078,1164,1189,1292,1606 'start/end':517,1274 'state':2145 'stay':698,1881 'step':268,292,1125,1159,1178 'stick':1116 'still':1892 'stop':60,141,184,429,1485 'strength':2346 'string':1405 'structur':601,1002,1921,1949,2029,2115,2229,2247,2306,2336 'structuredclon':606,1972 'style':1868 'surfac':961 'surgic':237,484,1784,1836,2171 'surround':2048 'symbol':827,979 'syntax':196,902 'tee':2278 'templat':627,2060 'territori':2326 'test':2434 'test/build':2438 'text':748,2049 'text-on':747 'textdocument/rename':857 'textual':874 'third':1408,1525 'threshold':1833,1842,1873 'tie':1863 'tilth':55,56,64,85,95,100,109,119,120,129,132,136,144,158,187,224,226,232,277,300,357,381,437,471,507,527,537,541,618,679,744,764,785,819,884,929,1014,1060,1073,1131,1184,1249,1262,1287,1387,1543,1690,1714,1754,1894,1915,1926,2015,2066,2266,2290,2300,2324 'time':1431,1956 'token':320,326,466,1150,1204,1210,1218,1223,1726 'tool':82,112,125,592,743,755,943,1058,2005,2010,2298 'top':377,2151 'topic-agent-skills' 'topic-ai-coding' 'topic-claude-code' 'topic-code-review' 'topic-developer-tools' 'touch':977 'track':547 'trade':1501 'tradit':459 'transact':2139 'transpil':658 'transport':178 'treat':2133 'tree':2104,2371 'true':285,1102 'tweak':557 'twice':1508 'two':1374,2004,2142 'type':822,846,904 'type-awar':821 'type-correct':845 'typecheck':867,981 'typechecker-valid':866 'u':2105,2373 'unavail':59 'undershoot':910 'unhealthi':192 'unifi':1444 'uniqu':476 'unless':243 'unrel':882 'updat':17,35,641,1533,1550,1559,1578 'upstream':736 'usag':848 'use':8,228,473,594,832,1235,1893,2167,2216,2259,2277,2289,2294,2299,2313,2338,2390,2393,2399,2402,2414,2424,2437,2442,2448 'user':11 'uv':644 'uv.lock':635 'valid':868,1746 'validatetoken':36,325,1209 'valu':2192 'var':1976 'vari':2050 'variabl':629,842,2055 'verifi':108 'via':84,211,223,1990,2057 'wast':465,2344 'whatev':801,1510 'whether':1493 'whole':241,1801 'win':452,837 'without':139,349,873,2071,2382 'work':1531,2370 'workspaceedit':869 'would':886 'wrap':1572 'write':3,50,78,967,1512,1912,2002 'writer':1386 'written':927 'x':605,607,1025,1030,1083,1970,1973,1977,1981 'y':1978,1982","prices":[{"id":"6f6880f2-75b8-4005-b127-aeaef148fe13","listingId":"d414bf9e-bd87-4ce0-872d-f7b226d81a56","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"paulnsorensen","category":"easy-cheese","install_from":"skills.sh"},"createdAt":"2026-05-18T13:21:08.490Z"}],"sources":[{"listingId":"d414bf9e-bd87-4ce0-872d-f7b226d81a56","source":"github","sourceId":"paulnsorensen/easy-cheese/cheez-write","sourceUrl":"https://github.com/paulnsorensen/easy-cheese/tree/main/skills/cheez-write","isPrimary":false,"firstSeenAt":"2026-05-18T13:21:08.490Z","lastSeenAt":"2026-05-18T19:13:40.717Z"}],"details":{"listingId":"d414bf9e-bd87-4ce0-872d-f7b226d81a56","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"paulnsorensen","slug":"cheez-write","github":{"repo":"paulnsorensen/easy-cheese","stars":7,"topics":["agent-skills","ai-coding","claude-code","code-review","developer-tools"],"license":"mit","html_url":"https://github.com/paulnsorensen/easy-cheese","pushed_at":"2026-05-18T06:33:38Z","description":"Cheese your code 🧀 — high-quality results as easy as cheese. A portable, harness-agnostic Agent Skills toolkit.","skill_md_sha":"38377bd3a0476017e91dd1d664a3527ea1c6b2cf","skill_md_path":"skills/cheez-write/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/paulnsorensen/easy-cheese/tree/main/skills/cheez-write"},"layout":"multi","source":"github","category":"easy-cheese","frontmatter":{"name":"cheez-write","license":"MIT","description":"This skill should be used when the user asks to edit, replace, modify, update, change, delete, or insert code in a file — phrases like \"replace this function\", \"delete lines 44-89\", \"update validateToken\", \"change the implementation\", \"add this import\", \"fix this bug\" (when fixing requires editing), or apply a cross-cutting structural change (codemod) like \"rewrite every X to Y\". Replaces sed / awk / perl -i / patch / tee / Edit / Write / shell redirects (`>`, `>>`) with hash-anchored tilth MCP edits for one-off block changes; sanctions `sg --rewrite` (ast-grep) for structural codemods that span many files. Always read first via cheez-read to get hash anchors for anchored edits. Prefer surgical anchored edits over whole-file rewrites. If tilth MCP is unavailable, stop and report rather than fall back. Do NOT use for reading files (cheez-read first to get anchors), searching code (use cheez-search), or running tests/builds.","compatibility":"Requires tilth MCP server. Optional ast-grep (`sg`) for structural codemods (`sg --rewrite`) that span many files."},"skills_sh_url":"https://skills.sh/paulnsorensen/easy-cheese/cheez-write"},"updatedAt":"2026-05-18T19:13:40.717Z"}}