$npx -y skills add dotcommander/cclint --skill updaterCheck Claude Code changelog for lintable changes and implement cclint updates. Use when a new Claude Code version ships, when CLAUDE.md claude_code_last_updated is stale, or for version gap detection, domain classification, and parallel agent dispatch across CUE schemas, hook e
| 1 | ## Quick Reference |
| 2 | |
| 3 | | Step | Action | Tool | |
| 4 | |------|--------|------| |
| 5 | | 1. Version gap | Read CLAUDE.md → extract `claude_code_last_updated` | Read | |
| 6 | | 2. Fetch changelog | `aic claude` (primary) or `gh api` (fallback) | Bash | |
| 7 | | 3. Classify + summarize | Emit user-visible table covering every changelog entry, then map to cclint domains | — | |
| 8 | | 4. Task list | TaskCreate per domain group | TaskCreate | |
| 9 | | 5. Implement | Parallel `Task(sonnet)` per task | Task | |
| 10 | | 6. Verify | `Task(sonnet)`: build, test, cclint | Task | |
| 11 | | 7. Review docs | Check docs for stale references | Task | |
| 12 | | 8. Ship | Update version, delegate commit | Task | |
| 13 | |
| 14 | ## Domain Classification Table |
| 15 | |
| 16 | For each changelog entry, classify against these domains: |
| 17 | |
| 18 | | cclint Domain | Signal in Changelog | Source Files | |
| 19 | |---------------|---------------------|--------------| |
| 20 | | CUE schema (agent) | New agent frontmatter field, new allowed value | `internal/cue/schemas/agent.cue` | |
| 21 | | CUE schema (command) | New command frontmatter field | `internal/cue/schemas/command.cue` | |
| 22 | | CUE schema (skill) | New skill frontmatter field | `internal/cue/schemas/skill.cue` | |
| 23 | | CUE schema (settings) | New settings field, new setting type | `internal/cue/schemas/settings.cue` | |
| 24 | | Hook events | New hook event name, changed hook behavior | `internal/lint/settings.go` | |
| 25 | | Known tools | New tool name in allowed-tools | `internal/textutil/lineutil.go` | |
| 26 | | Lint rules (agents) | New agent validation requirement, naming rule | `internal/lint/agent_linter.go` | |
| 27 | | Lint rules (skills) | New skill validation requirement | `internal/lint/skill_linter.go` | |
| 28 | | Lint rules (commands) | New command validation requirement | `internal/lint/command_linter.go` | |
| 29 | | Cross-file validation | New reference pattern, new component type | `internal/lint/crossfile/` | |
| 30 | | Discovery | New file path pattern, new component directory | `internal/discovery/` | |
| 31 | |
| 32 | **Skip**: CLI flags, UI changes, SDK fields, performance improvements, bug fixes to existing behavior. |
| 33 | |
| 34 | Output: `| Changelog Entry | Domain | Action Required |` |
| 35 | |
| 36 | ## Workflow |
| 37 | |
| 38 | ### Step 1: Version gap |
| 39 | |
| 40 | Read `CLAUDE.md` Operational Context → extract `claude_code_last_updated`. |
| 41 | Report: `v{old} → v{latest}`. If no gap, report and stop (unless `--from` overrides). |
| 42 | |
| 43 | ### Step 2: Fetch changelog |
| 44 | |
| 45 | **Gotchas to avoid:** |
| 46 | - `aic claude` with no args prints **only the latest version** — not a full changelog. Don't pipe it straight to a file and expect the gap to be in there. |
| 47 | - Version arg to `aic claude --version` takes **no `v` prefix**: `2.1.104` works, `v2.1.104` errors. |
| 48 | - **Never** wrap exploration commands in `2>/dev/null`. aic writes "version not found" to stderr — silencing it turns a clear error into a phantom empty stdout and wastes turns. |
| 49 | |
| 50 | Primary method — walk the gap with `aic claude`: |
| 51 | |
| 52 | ```bash |
| 53 | aic claude --list # enumerate all published versions |
| 54 | aic claude --version 2.1.X --md # fetch each version newer than pin; skip if "not found" |
| 55 | aic claude --version 2.1.X --json # empty changelog bodies still emit JSON metadata — use this to confirm a release is truly empty vs. missing |
| 56 | ``` |
| 57 | |
| 58 | Concat the `--md` outputs into `.work/CHANGELOG.upstream.md`. Expect some patch versions to be missing or have empty bodies (internal releases). |
| 59 | |
| 60 | Fallback — if `aic` is not available, use GitHub API: |
| 61 | |
| 62 | ```bash |
| 63 | gh api repos/anthropics/claude-code/contents/CHANGELOG.md \ |
| 64 | -H "Accept: application/vnd.github.raw" > .work/CHANGELOG.upstream.md |
| 65 | ``` |
| 66 | |
| 67 | Then Read `.work/CHANGELOG.upstream.md` and extract entries between `## {old_version}` and `## {new_version}` headers. |
| 68 | |
| 69 | ### Step 3: Classify lintable items |
| 70 | |
| 71 | For each changelog entry, classify against the Domain Classification Table above. |
| 72 | |
| 73 | **BLOCKING — Emit a user-visible summary table BEFORE proceeding to Step 4.** Cover *every* changelog entry across all versions in the gap, not just the lintable ones. The user wants to see the full surface review and the reasoning for what was skipped. |
| 74 | |
| 75 | Required format (one row per entry): |
| 76 | |
| 77 | ``` |
| 78 | | Version | Change | Lintable? | cclint action | |
| 79 | |---|---|---|---| |
| 80 | | 2.1.X | <one-line description> | ✅ Yes / ⚠️ Partial / ❌ No | <action or skip reason> | |
| 81 | ``` |
| 82 | |
| 83 | Use: |
| 84 | - ✅ Yes — schema/lint surface change, will be implemented |
| 85 | - ⚠️ Partial — adjacent to lintable surface but out of scope (e.g. unmodeled subschema, new file type cclint doesn't yet discover) — document in CLAUDE.md operational context |
| 86 | - ❌ No — runtime/UX/CLI/SDK/bugfix, no lint surface |
| 87 | |
| 88 | End the table with a one-line summary: `N lintable, M actioned, K documented, rest skipped (runtime/UX/bugfixes).` |
| 89 | |
| 90 | If zero lintable items found, still emit th |