agent-skills
AGENTS.md2 starsChanged 18 days agoBSD-3-ClauseView on GitHub
This repository is the source of truth for the Lightcone Research agent skills. It is not an application — it packages SKILL.md-based skills for three install targets (the npx skills CLI, the Claude Code plugin marketplace, and Codex plugins) from a single canonical source. Two plugins: astra (spec reference) and lightcone (project companion, which bundles astra). Plugin skills are namespaced by plugin name (e.g. /astra:astra, /lightcone:lightcone). - src/skills/<name>/SKILL.md — the canonical skills. Edit these. One directory per skill; the directory…
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,774 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
The file
We split this AGENTS.md into the rules it gives an agent
5 rules. About 0 are common, 1 is distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 47
Commit the regenerated files alongside your source change.
- Distinctive: line 70
If you arrived expecting a plain skills folder and found a generator, here's why it exists and the shape it takes, so nothing surprises you.
- Very specific: line 96
NOT in the closure), and returns the exact files + byte-copies every target needs.
- Very specific: line 107
If you add a dependency, you give that up.
- Very specific: line 132
Keep SKILL.md under ~500 lines.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md 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.
Files
AGENTS.md
This repository is the source of truth for the Lightcone Research agent skills.
It is not an application — it packages SKILL.md-based skills for three install
targets (the npx skills CLI, the Claude Code plugin marketplace, and Codex plugins)
from a single canonical source. Two plugins: astra (spec reference) and
lightcone (project companion, which bundles astra). Plugin skills are
namespaced by plugin name (e.g. /astra:astra, /lightcone:lightcone).
Where things live
src/skills/<name>/SKILL.md— the canonical skills. Edit these. One directory per skill; the directory name must equal thename:in the frontmatter.src/hooks/<plugin>/— per-pluginhooks.json+ bash scripts (astra/validates on save and reminds the agent to load the skill).skills.config.json— declares how skills compose into the plugins. A plugin composes with others two ways:dependencies(bundled build-time closure) andrequires(documented-only prerequisite the user installs — not bundled).scripts/build.mjs,scripts/validate.mjs— the generator and the validator.tests/<plugin>.yaml— declarative e2e hook-dispatch test specs, run byscripts/e2e-hooks.mjs(npm run e2e, and thee2e-hooksCI workflow) against real headless Claude Code and Codex sessions. To cover a new plugin, add a spec here — no runner changes needed.
Documentation lives in another repo
User-facing documentation is not kept here. It lives in
LightconeResearch/docs (the
agent-skills pages are under content/docs/agent-skills/) and is published at
https://docs.lightconeresearch.org. When a change here adds a skill or plugin,
or changes anything else users should know about (install steps, skill
behavior, prerequisites, tool pins that change what users run), open a matching
PR in that repo.
Generated — do not hand-edit
.claude-plugin/marketplace.json, .agents/plugins/marketplace.json, the entire
skills/ and plugins/ trees, and manifest.json are generated from
skills.config.json + src/. After changing any skill or the config:
npm run build # regenerate all target files
npm test # validate frontmatter + assert nothing driftedCommit the regenerated files alongside your source change. npm test
fails if the generated files are out of sync, if skills/ or plugins/ holds a
file the build didn't produce, or if a SKILL.md exists anywhere outside
src/skills/ and those two trees. The generator is zero-dependency
(Node ≥ 18 built-ins only) — no npm install is required.
Tool pins
Tool pins have one source of truth — each plugin's tools map
in skills.config.json (astra-spec is deliberately unpinned and resolves from
the astra-tools release). Canonical src/skills/ and src/hooks/ never carry a
concrete tool version: they write the literal @x.y.z placeholder, and
npm run build substitutes each bundling plugin's pin into the generated
plugins/<name>/ copies, and the owning plugin's pin (the first plugin listing
the skill in its own skills) into the flat skills/ copy. A plugin's effective pins merge over its dependency
closure (own entries win), so a bundling plugin inherits its dependencies'
pins unless it overrides them. npm test fails if canonical text carries a concrete version,
if a placeholder is left unpinned, or if canonical text pins astra-spec at
all. To bump: edit the one number in skills.config.json, run
npm run build, commit — no other file changes.
Build tooling — design & rationale
If you arrived expecting a plain skills folder and found a generator, here's why it exists and the shape it takes, so nothing surprises you.
Why a generator at all (not hand-maintained JSON). The three targets disagree on
layout. npx skills reads a flat top-level skills/ tree — before any manifest —
and its update re-fetches from the folder it installed from. The Claude and
Codex (OpenAI Codex CLI) marketplaces instead point every plugin at a
self-contained plugins/<name>/ — .claude-plugin/marketplace.json and
.agents/plugins/marketplace.json, plus a plugins/<name>/.codex-plugin/plugin.json
with its own skills/ directory per plugin — and, for a plugin that ships hooks,
its own hooks/ directory too (every harness reads the same hooks.json
protocol; hook commands locate the plugin root as ${CLAUDE_PLUGIN_ROOT:-$PLUGIN_ROOT} —
CLAUDE_PLUGIN_ROOT is the one root variable every harness defines, the fallback covers
older versions — so the generator declares the same hooks file and packages the canonical
src/hooks/ tree under the plugin root). And every installed copy needs real tool
pins, which the canonical text deliberately lacks.
Maintaining all of that against one set of skills by hand is exactly what drifts
silently. So skills.config.json + src/ is the single source, and everything
per-target — skills/ included — is generated and drift-checked. Do not edit a generated file to fix a
target — change the source and rebuild. If a manifest looks wrong, the bug is in
skills.config.json or scripts/lib.mjs, not in the output.
How the pieces fit. scripts/lib.mjs is the engine: it loads the config, parses
each SKILL.md frontmatter, computes the transitive skill closure per plugin (own +
dependencies skills — a plugin's generated dir bundles its whole closure so it
installs identically on both harnesses; requires prerequisites are deliberately
NOT in the closure), and returns the exact files + byte-copies every target needs.
build.mjs writes
them; validate.mjs regenerates in memory and diffs against disk. Both import lib.mjs
so the generator and the checker agree by construction.
Two deliberate, non-obvious choices (don't change these without reading this):
- Zero dependencies / hand-written frontmatter parser.
lib.mjsparses YAML frontmatter itself (inline + folded/literal scalars) instead of pulling ingray-matter, and there's notsx/vitest. This is intentional: the generator runs with nonpm install, so it works in a fresh checkout and in CI without a setup step. If you add a dependency, you give that up. The parser only needs to handlenameanddescription— if a skill ever needs richer frontmatter parsing, that's the tradeoff to weigh. - Generated plugin contents are real files, not symlinks. A plugin installer
archives the plugin directory and does not follow symlinks that point back
to canonical
src/skills/,src/agents/, orsrc/hooks/— this holds for every harness, not just one. The generator therefore copies the complete closure intoplugins/<name>/, while canonical files remain the only authoring source. The flatskills/tree is real files too: thenpx skillsCLI skips symlinked skill dirs, and its update check needs a git tree, not a link blob, at the installed path.validate.mjscompares every packaged file byte-for-byte with that source and checks executable permissions, so generated copies cannot drift silently.
Prior art. The pattern is borrowed: databricks/databricks-agent-skills (a generated
manifest.json registry from skill frontmatter, CI-validated, plus per-agent plugin
dirs incl. .codex-plugin/) and supabase/agent-skills (the source: "./" + strict:
false Claude marketplace style, and a build + sanity-test workflow). We trimmed both to
zero-dep and reconciled them to the three-target need.
Authoring conventions
name: 1–64 chars, lowercase letters/digits/hyphens, matches the directory.description: ≤ 1024 chars; say what it does and when to use it, with trigger keywords (this is what an agent reads to decide whether to load the skill).- Keep
SKILL.mdunder ~500 lines; push depth intoreferences/and load it on demand. - Any skill that shells out to
astramust run it through the pinneduvxinvocation — writeuvx astra-tools@x.y.zliterally; the build substitutes each bundling plugin's pin from itstoolsmap inskills.config.json— and open with the Prerequisites preflight: confirm the pinned CLI resolves, point to the uv install docs ifuvxis missing, and discover command syntax with--helprather than guessing.
See CONTRIBUTING.md for the full add-a-skill walkthrough.
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
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.

