agents.md · skill.md · one source

Your agent context file is a lockfile that nothing locks.

Every coding agent reads a context file, and every context file rots the moment nobody updates it by hand. skillfile writes yours from a scan of the repo, stores a hash of what it saw, and fails your build when the two stop matching. No LLM calls, no API key, nothing to hallucinate.

$ npx skillfile init node 18+ · mit · ~1s
How it works

It reads six things, writes three files, and remembers one number.

Nothing here is inferred or generated by a model. Every line of output traces to a file already in your repo, which is why the same repo always produces the same bytes.

How skillfile works skillfile reads your manifest, Makefile, README, directory structure, tooling markers and git log. It writes AGENTS.md, a Claude SKILL.md and a SKILLFILE.md manifest containing a source hash. The check command recomputes the hash and exits non-zero when the repo has drifted. your repo package.json / pyproject Makefile targets README first paragraph top-level structure tooling markers (CI, tests) git branch + recent log gitignore-aware read scan deterministic no model call write committed to your repo AGENTS.md cursor, codex, copilot, gemini .claude/skills/<name>/SKILL.md claude code SKILLFILE.md holds source-hash: 5318… check match → exit 0 differ → exit 1 you change a script, add a directory, or adopt a new tool — the hash no longer matches, CI goes red $ npx skillfile update — rewrites the files, hash matches again, build goes green
Try it

Break the repo and watch the build turn red.

The whole product is one comparison: does the hash in SKILLFILE.md still describe the repo in front of it? Change something below. Note what the last button does — and what it doesn't.

package.jsonunchanged
"scripts": {
  "test": "node test/smoke.js",
  "build": "tsc -p ."
},
"dependencies": {
  "commander": "^12.1.0"
}
SKILLFILE.mdgenerated earlier
---
generated-by: https://skillfile.pro
source-hash: 53183589327afae1
---
skillfile: up to date (2 targets). exit 0 · build passes

Three of these change what an agent needs to know. One of them doesn't.

Input and output

This is skillfile's own repo, scanned by skillfile.

Not a mockup. The panel on the right is the real committed AGENTS.md in github.com/d08m/skillfile, produced from the panel on the left.

what it found
// package.json
name: skillfile
description: Generate and keep fresh…
scripts:
  test:        node test/smoke.js
  check-tools: node scripts/check-tools.js

// structure
.github/  bin/  scripts/
site/  src/  test/  test-fixtures/

// tooling markers
.github/workflows → CI configured
test/             → test directory
scan
~1s
no model
AGENTS.md
<!-- skillfile:generated -->
# skillfile

Generate and keep fresh cross-agent
context files, deterministically.

## Commands

- `test`: `node test/smoke.js`
- `check-tools`: `node scripts/…`

## Structure

- `bin/`  - `src/`  - `test/`

## Tooling

- CI configured (`.github/workflows`)
- Has a dedicated test directory
Three commands

Nothing else to learn.

skillfile init

Scan, then write AGENTS.md and SKILL.md — same content, both conventions, one source. Refuses to overwrite a file you wrote by hand.

skillfile update

Re-scan and rewrite. Sub-second and free: there is no model in the loop, so there is nothing to pay for and nothing to invent.

skillfile check

Exit non-zero if the repo drifted since generation. In CI, a stale context file blocks the merge that made it stale.

In CI

Four lines, and the file keeps itself honest.

# .github/workflows/ci.yml
- run: npm install
- run: npm test
# a stale AGENTS.md fails the build, same as a stale lockfile
- run: npx skillfile check
For agents

This site is readable without rendering it.

If you are an agent evaluating whether to install this, skip the page. These are plain text, no markup, no JavaScript.

What skillfile does, what it writes, when to reach for it, and the exact commands — in the llms.txt convention.
A ready-to-install SKILL.md. Save it to .claude/skills/skillfile/SKILL.md and you can run the tool correctly without reading anything else.
skillfile's own generated context file, served as-is — the format's own output, describing the tool that made it.
What it is not

A floor, not a ceiling.

skillfile will not capture your architecture philosophy or the war stories behind your conventions. Keep writing those by hand — it refuses to touch a hand-written file for exactly that reason.

It also won't guess. A repo that declares no commands anywhere renders "no scripts declared", because an invented command that an agent then runs is worse than silence.

What it guarantees is the floor: any agent, any tool, cold session, always knows your real commands, real structure and real dependencies — and CI proves that stays true.

Optional targets for CLAUDE.md, GEMINI.md, Cursor rules and Windsurf are one flag away, generated from the same scan.