Skip to content
Back to skills

Keel Update

ASecurity

Pull the latest Keel template improvements into THIS project — kit tooling in one reviewed batch, likely-tailored files hunk-by-hunk; only approved hunks are applied. Never touches project memory (HANDOVER/LESSONS/TASKS) or project-owned files (src/, CLAUDE.md, ADRs).

  • 9 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added September 5, 2026
ai-agentsgobashdockergitsecurity

Security analysis

A93/100
  • highPerforms destructive filesystem operations

Pro shows the line behind each finding and how to fix it

Scanned September 26, 2026

npx -y skills add muratsilahtaroglu/claude-code-starter-kit --skill keel-update --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Keel Update?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Keel Update
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/muratsilahtaroglu-keel-update/badge)](https://www.skillsdirectory.com/skills/muratsilahtaroglu-keel-update)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: keel-update
description: Pull the latest Keel template improvements into THIS project — kit tooling in one reviewed batch, likely-tailored files hunk-by-hunk; only approved hunks are applied. Never touches project memory (HANDOVER/LESSONS/TASKS) or project-owned files (src/, CLAUDE.md, ADRs).
---

# /keel-update — sync this project with the latest Keel template

Use when the kit was **cloned** a while ago and the template has since improved (hardened hooks, doc
fixes, workflow updates). Pull model: run it IN the project, review diffs, approve. Non-destructive is
the hard rule (same spirit as `/keel-adopt`): nothing is applied without a shown diff + an explicit yes.

**One channel:** the kit is clone-only (the plugin/marketplace half was retired in v0.8.23 — it
delivered only the tooling, double-fired hooks alongside a clone, and needed marketplace access that
locked-down networks block). Everything therefore syncs HERE, through the buckets below. If a project
still has `keel@keel` installed from before, removing it is the fix for double-firing hooks.

## 1. Fetch the latest template (never inside the project)
```bash
rm -rf /tmp/keel-latest   # idempotent — clear the stale clone a previous /keel-update run left behind
git clone --depth 1 https://github.com/muratsilahtaroglu/claude-code-starter-kit /tmp/keel-latest
git -C /tmp/keel-latest rev-parse --short HEAD   # record for the handover line
```

## 2. Classify every template path into three buckets
- **PROTECTED — never touched (project-owned):** `HANDOVER.md` · `LESSONS.md` · `TASKS.md` · `PLAN.md` ·
  `docs/handover-archive.md` · `docs/lessons-retired.md` · `docs/architecture.md` · `docs/adr/*` (except the kit-owned `0000`
  template and the folder `README.md` — those are TOOLING) · `CLAUDE.md` · `README.md` · `LICENSE` ·
  `config/` · `requirements/*.{txt,lock}` contents · `.env.example` values · `src/` · `tests/`
  (except the kit-owned `tests/unit/test_keel_*.py` matrix — that is TOOLING, same carve-out as
  the ADR `0000` template; never put project tests in a `test_keel_*.py` file) ·
  `scratch/` · `research/` findings · `reports/` · `.claude/last-audit` · `.claude/project-owner` ·
  `.claude/keel-caps` · `.claude/lessons-backlog` · `.claude/tasks-backlog` (project state: audit clock + governance owner +
  tuned caps + entry-budget baseline) ·
  `.claude/agents/team-*.md` (project agent-team charters, owner-authored — the kit ships none;
  `.claude/agent-team-sessions` is git-ignored and never syncs).
- **REVIEW — likely tailored; full diff, apply hunk-by-hunk with approval:** `rules.md` ·
  `.claude/settings.json` (permissions merge = union, keep the project's) · `.gitignore` ·
  `.pre-commit-config.yaml` · `pyproject.toml` · `Makefile` · `Dockerfile*` · `.dockerignore` ·
  `docker-compose.yml` · `.editorconfig` · `.github/*` (workflows + PR template) ·
  `docs/layouts.md` · `docs/user_manual.md` · **folder READMEs that carry KIT DOCTRINE inside a
  PROTECTED tree** — `scratch/README.md`, `tests/README.md`, `tests/*/README.md`: the folder's
  CONTENTS are the project's, but the README states the kit's rule for that folder and projects
  tailor it, so it is diffed hunk-by-hunk rather than skipped with the tree (without this the
  scratch-as-evidence rule of v0.8.25 could never reach an adopted project) · **`reports/team/README.md`**
  (the index TEMPLATE inside the PROTECTED `reports/` tree: its header is kit doctrine — status
  vocabulary, index scope — while its lines are the project's; diff the header, never the lines).
- **TOOLING — template-owned; summarize changes, one approval for the batch:** `.claude/skills/**` ·
  `.claude/hooks/**` · `.claude/*.py` · `.claude/claude-launch-wrapper.sh` (kit-owned tools that sit at the `.claude/` root — team-addresses, ritual-report, the launch wrapper) · `.claude/agents/{researcher,verifier,auditor,observer,README}.md` · `.claude/rules/README.md`
  (+ example) · `tests/unit/test_keel_*.py` · `docs/security.md` · `docs/steering.md` ·
  `docs/memory-files.md` · `.claude/keel-caps.example` (the key reference; the project's own
  `.claude/keel-caps` stays PROTECTED) ·
  `docs/adr/0000-adr-template.md` · `docs/adr/README.md` · `docs/assets/` · `CONTRIBUTING.md`
  (kit-meta by its own first line) · folder `README.md`s.

**If a path matches two buckets, the more protective one wins: PROTECTED > REVIEW > TOOLING**
(e.g. `config/README.md` is a folder README, but `config/` is PROTECTED → protected).

**A TOOLING file the project has COMMITTED to is no longer template-owned — check before copying.**
For every TOOLING path about to be applied, run `git log --oneline -- <path> | wc -l` IN THE PROJECT:
non-zero means the project edited it, so it moves to **REVIEW** (hunk-by-hunk), never a blind
overwrite. These files carry kit doctrine in their HEADER but project DATA in their BODY — the same
split the memory files use — and the batch approval only ever covered the doctrine. Field case
(2026-08-27): one blind TOOLING batch reset a 12-row ADR index to the template's empty
`Next number: 0001`, deleted a project agent's registration, deleted a 27-line pip-audit runbook, and
inverted a project note. The file with the MOST local commits (13) was exactly the one destroyed —
the signal was there and nothing read it.

**Respect the bootstrap prune (rules.md §0e):** files the tailoring removed on purpose (recorded in the
first HANDOVER block / tailoring ADR) are **not re-added** — list them as "pruned, skipped" unless the
user explicitly asks for them back.

## 3. Present the plan, then apply approved-only
**Enumerate changes MECHANICALLY — do not eyeball.** For EVERY path in the TOOLING + REVIEW buckets,
`diff -q <template-copy> <project-copy>`; every differing file MUST appear in the plan. Hand-picking "the
files that obviously changed" is how a hook lands while the skill it references does not — a half-applied
update leaves the hooks ahead of the skills (e.g. an owner-review nudge with no `## Review` write logic).
Then one table — **new · changed · pruned-skipped · protected** — one line per file with what/why, and the
diffs per §2 buckets. Apply only what was approved; never resolve a conflict silently.

**When the kit and the project both implement ONE function, decide per FUNCTION — not per file set.**
Compare the two feature by feature and keep the SUPERSET; either side may be it, and the answer can
differ within a single update, so a blanket "adopt the kit's tools" is the wrong unit of decision.
Field case (2026-08-27): of two such pairs, the kit's address resolver was the superset (same
detections plus the fix instruction in every line) while the PROJECT's LESSONS entry-budget was — it
had already absorbed the kit's fix and its docstring carried the owner's decision rationale, which a
pointer would have demoted. **Whichever loses is REMOVED — its file and its test — and listed as a
conscious skip**, so exactly one implementation survives: keeping both and disabling one leaves a
second codebase that drifts (measured in that same case — the two copies had already diverged by one
fix). If something permanent cites the retired file (an archive block, a report), leave a one-line
pointer to the survivor instead of deleting it, so no citation dangles.

## 4. Verify + record
- **Consistency re-diff:** after applying, `diff -q` the TOOLING paths against the template again — none
  should still differ except the ones consciously skipped. A leftover diff means a skill/hook pair is
  half-updated (the §3 failure mode) — finish it before committing.
- Hooks stay executable: `chmod +x .claude/hooks/*.sh`; each new/changed hook is registered in
  `.claude/settings.json` (an unregistered hook never fires — the re-ground hook flags this).
- Quick smoke: the project's tests still pass (rules.md §2.8).
- `HANDOVER.md` block (a) one-liner: `keel /keel-update applied @ <template-sha>: <files>`; structural
  changes also land in `docs/architecture.md` (rules.md §1.6). Commit with approval (rules.md §1.3);
  push only with approval (§6).

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.