
Ck
Register, inspect, and remove per-repo agent context so Claude Code sessions can resume without re-explaining the project.
Overview
ck (Context Keeper v2) is an agent skill most often used in Build / agent-tooling (also Operate and Validate) that registers, inspects, and removes on-disk project context for Claude Code-style sessions.
Install
npx skills add https://github.com/affaan-m/everything-claude-code --skill ckWhat is this skill?
- forget.mjs removes a project's context directory and deletes its projects.json registry entry
- info.mjs prints a compact read-only snapshot for a project matched by name, number, or cwd
- Resolves targets via resolveContext using argument, registry index, or current working directory
- SKILL.md requires Claude to ask for confirmation before running the destructive forget script
- Shared registry (projects.json) and CONTEXTS_DIR keep contexts portable across sessions
- forget.mjs removes both the per-project context directory and the projects.json registry entry
- info.mjs provides a compact read-only context snapshot with exit code 0 on success
Adoption & trust: 3.4k installs on skills.sh; 210k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You switch repos often and lose track of what agent context is stored, or you need to wipe a stale registration without hunting through hidden folders by hand.
Who is it for?
Solo and indie builders using Claude Code (or similar agents) on several local projects who want explicit register, info, and forget commands instead of implicit chat-only memory.
Skip if: Teams that need shared cloud session state, live MCP-backed context, or fully automated deletes without a human confirmation step before forget.mjs runs.
When should I use this skill?
You need to inspect, register, or remove persisted Context Keeper v2 project context for the current or named repo.
What do I get? / Deliverables
After running ck scripts, you get a clear info snapshot or a confirmed removal of the context directory and projects.json entry so the agent can continue with accurate, intentional project memory.
- Stdout info snapshot from info.mjs for a resolved project
- Removed context directory plus updated projects.json after confirmed forget.mjs run
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Context Keeper is shelved under Build because it is installed and invoked as part of day-to-day agent coding workflows, even though it also helps when you pivot projects or clean up later. Agent-tooling is the canonical shelf: ck is a Node CLI plus registry that extends how your coding agent remembers project context, not a feature you ship to end users.
Where it fits
Run info.mjs on a spike repo to see what Context Keeper already captured before you decide to promote or discard the experiment.
Resolve the active project by cwd and print a compact info block so the agent continues implementation with the right on-disk context.
Switch between client repos in one afternoon and use the registry to know which numbered project mapping applies before starting the next task.
After archiving a product, confirm in chat then run forget.mjs to remove context directories and the projects.json entry so old state does not leak into new wor
How it compares
Use this as a filesystem-backed project registry and context keeper for your agent—not as an MCP server or hosted memory product.
Common Questions / FAQ
Who is ck for?
ck is for solo and indie builders who run Claude Code or comparable agents locally and want durable, per-project context they can list, inspect, and remove with small Node scripts.
When should I use ck?
Use it during Build when registering or refreshing agent context for a repo, during Validate when you prototype in a throwaway folder and need a quick info snapshot, and during Operate when you iterate across machines or retire a project and need confirmed cleanup via forget.mjs.
Is ck safe to install?
Review the Security Audits panel on this Prism page and the upstream repo before installing; forget.mjs recursively deletes context directories and edits projects.json, so only run it after you confirm in chat as SKILL.md describes.
SKILL.md
READMESKILL.md - Ck
#!/usr/bin/env node /** * ck — Context Keeper v2 * forget.mjs — remove a project's context and registry entry * * Usage: node forget.mjs [name|number] * stdout: confirmation or error * exit 0: success exit 1: not found * * Note: SKILL.md instructs Claude to ask "Are you sure?" before calling this script. * This script is the "do it" step — no confirmation prompt here. */ import { rmSync } from 'fs'; import { resolve } from 'path'; import { resolveContext, readProjects, writeProjects, CONTEXTS_DIR } from './shared.mjs'; const arg = process.argv[2]; const cwd = process.env.PWD || process.cwd(); const resolved = resolveContext(arg, cwd); if (!resolved) { const hint = arg ? `No project matching "${arg}".` : 'This directory is not registered.'; console.log(`${hint}`); process.exit(1); } const { name, contextDir, projectPath } = resolved; // Remove context directory const contextDirPath = resolve(CONTEXTS_DIR, contextDir); try { rmSync(contextDirPath, { recursive: true, force: true }); } catch (e) { console.log(`ck: could not remove context directory — ${e.message}`); process.exit(1); } // Remove from projects.json const projects = readProjects(); delete projects[projectPath]; writeProjects(projects); console.log(`✓ Context for '${name}' removed.`); #!/usr/bin/env node /** * ck — Context Keeper v2 * info.mjs — quick read-only context snapshot * * Usage: node info.mjs [name|number] * stdout: compact info block * exit 0: success exit 1: not found */ import { resolveContext, renderInfoBlock } from './shared.mjs'; const arg = process.argv[2]; const cwd = process.env.PWD || process.cwd(); const resolved = resolveContext(arg, cwd); if (!resolved) { const hint = arg ? `No project matching "${arg}".` : 'This directory is not registered.'; console.log(`${hint} Run /ck:init to register it.`); process.exit(1); } console.log(''); console.log(renderInfoBlock(resolved.context)); #!/usr/bin/env node /** * ck — Context Keeper v2 * init.mjs — auto-detect project info and output JSON for Claude to confirm * * Usage: node init.mjs * stdout: JSON with auto-detected project info * exit 0: success exit 1: error */ import { readFileSync, existsSync } from 'fs'; import { resolve, basename } from 'path'; import { readProjects } from './shared.mjs'; const cwd = process.env.PWD || process.cwd(); const projects = readProjects(); const output = { path: cwd, name: null, description: null, stack: [], goal: null, constraints: [], repo: null, alreadyRegistered: !!projects[cwd], }; function readFile(filename) { const p = resolve(cwd, filename); if (!existsSync(p)) return null; try { return readFileSync(p, 'utf8'); } catch { return null; } } function extractSection(md, heading) { const re = new RegExp(`## ${heading}\\n([\\s\\S]*?)(?=\\n## |$)`); const m = md.match(re); return m ? m[1].trim() : null; } // ── package.json ────────────────────────────────────────────────────────────── const pkg = readFile('package.json'); if (pkg) { try { const parsed = JSON.parse(pkg); if (parsed.name && !output.name) output.name = parsed.name; if (parsed.description && !output.description) output.description = parsed.description; // Detect stack from dependencies const deps = Object.keys({ ...(parsed.dependencies || {}), ...(parsed.devDependencies || {}) }); const stackMap = { next: 'Next.js', react: 'React', vue: 'Vue', svelte: 'Svelte', astro: 'Astro', express: 'Express', fastify: 'Fastify', hono: 'Hono', nestjs: 'NestJS', typescript: 'TypeScript', prisma: 'Prisma', drizzle: 'Drizzle', '@neondatabase/serverless': 'Neon', '@upstash/redis': 'Upstash Redis', '@clerk/nextjs': 'Clerk', stripe: 'Stripe', tailwindcss: 'Tailwind CSS', }; for (const [dep, label] of Object.entries(stackMap)) { if (deps.includes(dep) && !output.stack.includes(label)) { output.stack.push(label); } } if (deps.includes('typescrip