agentleFS
dotcommanderdotcommander/cclint/skills/updater/SKILL.md

updater

Skill18 starsChanged 8 days agoMITView on GitHub

Assistant-guided Claude Code lint-surface sweep for cclint: compare the changelog gap with an available installed binary, then review and update relevant schemas, lint rules, tests, and docs. Use when a new Claude Code version ships, the AGENTS.md surface row is stale, or a changelog claim needs checking.

1 other project uses a version of this.

Adopted by

Most recently taken up by

  • Other versions1 project uses a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 1

    1. jvalin17/agent-toolkit★ 2same name

    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 repositoryOne other file it gives its agents.

The file

We split this skill into the rules it gives an agent

12 rules. About 0 are common, 4 are distinctive, and 8 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈4

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 8

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Use direct edits by default.

    line 23
  2. Very specific:

    Binary identity: when inspecting a compiled binary, use rg -a.

    line 114
  3. Very specific:

    Dirty-tree health: if existing changes overlap a relevant check, establish a focused baseline where needed so failures can be attributed.

    line 122
  4. Very specific:

    If gh is available and authenticated, fetch and triage locally.

    line 129
  5. Distinctive:

    Read the ±3-line context of matching bullets only when classification needs it.

    line 144
  6. Distinctive:

    Use the surrounding evidence to determine the shape (string, array, bool, enum, or union).

    line 168
  7. Very specific:

    Doc-sync: when changing code values, update the matching docs in the same group — hook events → docs/rules/settings.md + …

    line 214
  8. Very specific:

    After all groups, select a focused build and test for the affected packages (for example, go build ./...

    line 218
  9. Distinctive:

    Use optional dispatch only when it makes a large change easier to review.

    line 223
  10. Very specific:

    Remove the fixture (literal path, rm -r).

    line 252
  11. Very specific:

    Leave changes uncommitted unless a commit was explicitly authorized.

    line 257
  12. Very specific:

    Add test case in internal/lint/settings_hooks_test.go

    line 293

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Updater — Claude Code Lint-Surface Sweep

This is an assistant-guided maintainer procedure, not a cclint command or an autonomous update. To use it, point a coding assistant with access to this checkout at skills/updater/SKILL.md and ask it to follow the relevant phases. The maintainer supplies the desired version range and scope, an installed Claude Code binary when binary verification is needed, and access to the upstream changelog (or a trusted copy). Classification-only and an older starting version are requests to the assistant, not flags implemented by cclint or this skill.

Review the classification and binary evidence before accepting any modeled change; review the scoped source/docs diff and verification results before release or commit. Missing tools or a binary that predates a candidate leave that candidate unverified; report the gap rather than inferring its shape. The changelog is a candidate source, not a schema authority. Keep large raw changelog and binary output out of assistant context; work from bounded excerpts. Use direct edits by default; delegation is optional when a change is too large for a useful direct edit. The phases are a checklist, not a time guarantee.

Quick Reference

PhaseOwnerOutput
0. Preflightassistantavailable binary identity, working-tree state, row + var anchors
1. Gap + classifyassistantgap slice + candidate table — never the full changelog
2. Verify shapesassistant (rg -a on a compiled binary)snippet + type determination per candidate
3. Judge scopeassistant + maintainer reviewcandidate list; a classification-only request stops here
4. Locate anchorsassistant (rg -n per edit site)file:line + verbatim spans
5. Implementassistant direct editscode + tests, one logical group at a time
6. Docsassistant direct editslint-surface.md surface + AGENTS.md row, cmd.ClaudeCodeSurface
7. Smoke + closeassistantfocused evidence and handoff; commit only if authorized

Entry-point routing:

User questionAction
"A new Claude Code version shipped — sweep it"Full workflow, Phases 0–7
"Anything lintable since the pinned version?"Ask for classification only (Phases 0–3); no edits
"Re-scan from an older baseline"Tell the assistant which version to start from, then follow the requested workflow
"The changelog says X — does the binary agree?"Phase 2 shape verification before any edit

Local-vs-Dispatch Boundary

The invoking assistant handles these tasks directly when practical:

TaskApproach
Large-gap classificationTriage the gap slice locally (Phase 1)
Edit-site anchorsUse rg -n (Phase 4)
Implementation and docsEdit confirmed changes directly (Phases 5–6)
Build, test and fixture smokeRun focused checks locally (Phase 7)
CommitsOnly with explicit authorization; otherwise leave the diff uncommitted

Optional dispatch: for a large change (for example, a new rule and tests), use an available assistant/agent only if useful. Supply exact edit anchors, scoped targets and a focused verification request. Keep task ownership with the invoking assistant; inspect the resulting diff yourself. Do not ask a worker to commit unless the maintainer explicitly authorized that commit.

Domain Classification Table

For each changelog entry, classify against these domains:

cclint DomainSignal in ChangelogSource Files
CUE schema (agent)New agent frontmatter field, new allowed valueinternal/cue/schemas/agent.cue
CUE schema (command)New command frontmatter fieldinternal/cue/schemas/command.cue
CUE schema (skill)New skill frontmatter fieldinternal/cue/schemas/skill.cue
CUE schema (settings)New settings field, new setting typeinternal/cue/schemas/settings.cue
Hook eventsNew hook event name, changed hook behaviorinternal/lint/settings.go
Known toolsNew tool name in allowed-toolsinternal/textutil/lineutil.go
Lint rules (agents)New agent validation requirement, naming ruleinternal/lint/agent_linter.go
Lint rules (skills)New skill validation requirementinternal/lint/skill_linter.go
Lint rules (commands)New command validation requirementinternal/lint/command_linter.go
Cross-file validationNew reference pattern, new component typeinternal/lint/crossfile/
DiscoveryNew file path pattern, new component directoryinternal/discovery/
Docs + surface rowAny modeled change abovedocs/rules/settings.md, docs/reference/schemas.md, .claude/rules/lint-surface.md, AGENTS.md, cmd/root.go

Skip: CLI flags, UI changes, SDK fields, env vars, performance improvements, bug fixes to existing behavior, and anything on the "Intentionally Not Modeled" guardrail in .claude/rules/lint-surface.md (runtime hook stdout contract, PermissionRequest agent hooks, instructionFiles/projectInstructions, claudeMdProcessingMode, yoloClassifier).

Workflow

Phase 0 — Preflight

From the repository root, check the available tools and locate the installed binary without assuming a particular installation path or readlink -f support. For example:

command -v claude && claude --version
command -v gh; command -v rg
git status --porcelain --untracked-files=all
rg -n 'claude_code_last_updated' AGENTS.md
rg -n '## Validation Surface' .claude/rules/lint-surface.md
rg -n 'ClaudeCodeSurface = ' cmd/root.go

Set BIN to a verified readable path to the installed Claude Code binary if binary inspection is possible (command -v claude may return a wrapper or symlink; resolve it using tools available on the host). Record its version.

Decisions this block drives:

  • Binary identity: when inspecting a compiled binary, use rg -a; plain rg may report only "binary file matches". If the available binary is older than a candidate, mark that candidate changelog-only, not binary-verified.
  • Preservation and commits: preserve pre-existing changes. Do not commit merely because the tree was clean or this procedure says to close. A commit requires explicit authorization; if authorized, review its exact contents and keep the AGENTS.md row and cmd/root.go var together (TestClaudeCodeSurfaceMatchesAGENTSRow guards their agreement).
  • Dirty-tree health: if existing changes overlap a relevant check, establish a focused baseline where needed so failures can be attributed. Check go env GOWORK; use GOWORK=off for repo-local Go commands when this module is not included in an active workspace.

Phase 1 — Gap + classify (root, no dispatch at any gap size)

If gh is available and authenticated, fetch and triage locally. First set CHANGELOG and GAP to unique temporary file paths you own; clean them up when finished. Locate the exact prior-version header before setting PREV_HEADER_LINE (do not run the slice command with an unset value). Only matching bullets and version headers need enter assistant context:

gh api -H "Accept: application/vnd.github.raw" repos/anthropics/claude-code/contents/CHANGELOG.md > "$CHANGELOG"
test -s "$CHANGELOG" && grep -qm1 '^## ' "$CHANGELOG" || { echo "fetch failed: empty or headerless changelog"; exit 1; }
grep -n '^## ' "$CHANGELOG" | head -8
# Locate the exact prior-version header; set PREV_HEADER_LINE from that match.
sed -n "1,$((PREV_HEADER_LINE-1))p" "$CHANGELOG" > "$GAP"
grep -nE '^## |settings|frontmatter|hook|tool|model|plugin|marketplace|schema|sandbox|permission' "$GAP"

Read the ±3-line context of matching bullets only when classification needs it. The changelog is newest-first, so the gap is everything above the previous version's header.

  • A maintainer-provided changelog copy or another available fetch route may replace gh; check that it includes the entire requested gap. Do not rely on aic claude for multi-version gaps: this setup observed only the newest entry. Do not suppress fetch errors or infer coverage from a partial result.
  • Newest header == previous version → current. Report and stop; no Phase 6 bump.
  • Classify the slice in-root against the Domain Classification Table and the skip list above.

Phase 2 — Pin exact shapes against the binary (root)

HARD GATE: never model a new shape from changelog prose. Verify against an installed binary at or beyond the candidate version; without one, classify only and report what remains unverified. For compiled binaries, use one discriminating grep per candidate:

rg -a -o '.{0,100}<candidateKey>.{0,180}' "$BIN" | head -5

Use the surrounding evidence to determine the shape (string, array, bool, enum, or union). A matching snippet alone may be ambiguous or incomplete; if it does not establish the shape, leave the candidate unverified. For names already modeled (KnownTools, knownPluginFields, schema fields), check for actual changes before editing.

Phase 3 — Root judgment (no dispatch)

Drop anything hitting the scope guardrail. Ask the maintainer to resolve materially ambiguous scope before editing. HARD GATE: emit a user-visible classification table BEFORE any implementation — one row per changelog entry across the whole gap, not just the lintable ones:

| Version | Change | Lintable? | cclint action |
|---|---|---|---|
| 2.1.X | <one-line description> | ✅ Yes / ⚠️ Partial / ❌ No | <action or skip reason> |
  • ✅ Yes — schema/lint surface change, will be implemented
  • ⚠️ Partial — adjacent to lintable surface but out of scope; document in .claude/rules/lint-surface.md operational context
  • ❌ No — runtime/UX/CLI/SDK/bugfix, no lint surface

End with a one-line summary: N lintable, M actioned, K documented, rest skipped (runtime/UX/bugfixes). A classification-only request stops here. If zero candidates, still emit the table, then report and stop.

Phase 4 — Locate anchors (root rg -n)

For every edit site the confirmed list touches: CUE schemas, Go validators, test tables, doc pages, .claude/rules/lint-surface.md, the AGENTS.md claude_code_last_updated row, and cmd/root.go ClaudeCodeSurface. Grep each, record file:line plus verbatim ±3-line spans — those spans are the exact old→new text for Phase 5/6 edits. A docs-only sweep needs only the row + var anchors, both already in hand from Phase 0.

Phase 5 — Implement (root direct edits)

One logical group at a time (e.g. new settings keys + their test file; model aliases + test entries), using the Phase 4 spans as literal old→new edits:

  • Code + tests land together in the same group — never separate them.
  • Minimal-edit constraint: make only the edits the confirmed list specifies; do not refactor, split, or reorganize files beyond them.
  • Doc-sync: when changing code values, update the matching docs in the same group — hook events → docs/rules/settings.md + docs/reference/schemas.md; Known tools → docs/reference/schemas.md; schema fields → docs/reference/schemas.md.
  • After all groups, select a focused build and test for the affected packages (for example, go build ./... and go test ./internal/cue/ ./internal/lint/ when those packages changed). Fix task-owned failures; rerun only affected checks. Do not run the full repository test suite by default.

Use optional dispatch only when it makes a large change easier to review; the invoking assistant remains responsible for the final diff.

Phase 6 — Docs (root direct edits)

Split across two files — never target the CLAUDE.md symlink, always the physical repo-root AGENTS.md:

  • .claude/rules/lint-surface.md (paths-conditional rule, the lint-surface ledger): Validation Surface entries, enum lines, and an Operational Context sweep bullet (versions covered, what was modeled, what was excluded and why).
  • AGENTS.md: only the claude_code_last_updated table row.

Plus the matching cmd.ClaudeCodeSurface var in cmd/root.go in the same change (TestClaudeCodeSurfaceMatchesAGENTSRow guards the sync). Check docs/cross-file-validation.md and docs/common-tasks.md only when the change adds a validation type or component surface.

Phase 7 — Smoke + close (root)

Rebuild first (go build -o cclint . — stale-binary trap; the output is gitignored). Then:

  • Full sweep: lint a temp fixture exercising each new key/alias via --root; expect exit 0 with no unknown-field or "Unknown model" output.
  • Docs-only sweep: ./cclint --version must print the new surface, and one --root fixture lint exits 0.
  • Remove the fixture (literal path, rm -r).

Close:

  • Review the classification, scoped diff and check results with the maintainer. Leave changes uncommitted unless a commit was explicitly authorized; never push or tag without separate authorization. If authorized to commit, keep the AGENTS.md row and cmd/root.go var in the same commit.
  • A personal FUI forum/thread is specific to the original maintainer's setup, not a requirement for independent use. If the maintainer provides a collaboration channel, send a concise classification and final handoff there; otherwise include both in the assistant's response. Do not invent a FUI command, thread, or delivery receipt.

Gotchas

GotchaProblemFix
gh api ... --jq '.content' | base64 -dContents API omits content for files > 1 MB — CHANGELOG.md crossed 1 MB; 200 OK with an empty bodyRaw Accept header form (Phase 1 command)
aic claude for multi-version gapsReturns only the newest entrygh api raw form; WebFetch fallback
Plain rg on a compiled Claude binaryMay only say "binary file matches"rg -a
Modeling from changelog proseProse misstates shapesPhase 2 binary grep is the only shape source
Skipping the classification tableWastes effort on non-lintable changesPhase 3 HARD GATE: full-entry table first
Returning the full changelog into root contextToken sinkSlice + grep-triage only the gap
Partial fetch of the gapMissing versions can be overlookedConfirm the previous-version header and inspect targeted context
Stale ./cclint binaryPhantom resultsgo build -o cclint . before smoke
Unscoped go test ./...Slow; scope creep./internal/cue/ ./internal/lint/
Committing AGENTS.md row without the root.go varTestClaudeCodeSurfaceMatchesAGENTSRow breaks mid-historySame commit, always
Adding a permissions.* key to settings.cue onlyGo-side closed key list in internal/lint/settings_permissions.go still rejects it ("unknown key"); per-package tests miss the driftEdit both sites plus the Supported-keys message in one change; the Phase 7 smoke fixture catches it
Editing an AGENTS.md aliasMay edit a different file than intendedEdit the physical repo-root AGENTS.md
Assuming a clean tree authorizes a commitUnauthorized history changeCommit only with explicit authorization; preserve pre-existing changes
Dispatching small mechanical editsAdds coordination and drift riskPrefer direct edits; review any delegated diff

Examples

Hook event addition

Changelog says: "Added WorktreeCreate hook event"

  1. Phase 2: rg -a -o '.{0,100}WorktreeCreate.{0,180}' "$BIN" — confirm event name
  2. Edit internal/lint/settings.go valid events map + internal/cue/schemas/settings.cue hook event enum
  3. Add test case in internal/lint/settings_hooks_test.go
  4. Doc-sync: docs/rules/settings.md + docs/reference/schemas.md
  5. Phase 6: lint-surface.md surface entry + Operational Context bullet

New tool name

Changelog says: "Added EnterWorktree tool"

  1. Phase 2: grep the binary for the tool name and its enum neighborhood
  2. Edit internal/textutil/lineutil.go KnownTools (the CUE #KnownTool union is generated from it — no .cue edit)
  3. Add test case in internal/textutil/lineutil_test.go
  4. Doc-sync: docs/reference/schemas.md Known Tools section
  5. Phase 6: lint-surface.md surface entry

Success Criteria

  • Version gap identified or confirmed current
  • Any modeled candidate shapes verified against a suitable installed binary, not changelog prose; unavailable verification reported
  • Classification table covered every gap entry before implementation
  • Code changes include tests; relevant focused checks pass or their limits are reported
  • Relevant .claude/rules/lint-surface.md entries and AGENTS.md claude_code_last_updated row updated; cmd.ClaudeCodeSurface matches when a version bump is justified
  • Scoped diff and focused checks reviewed; any smoke fixture removed
  • Classification, binary-verification limits and handoff reported; changes remain uncommitted unless explicitly authorized

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.