Repository navigation
List codeaf in npx skills (vercel-labs/skills) once #1277 ships #1399
Description
What is asked
Get codeaf listed in npx skills, the CLI that installs Agent Skills (SKILL.md folders) into 78 coding agents. The upstream change is small: one entry in src/agents.ts, 'codeaf' in the AgentType union in src/types.ts, then their validate-agents.ts and sync-agents.ts scripts (which regenerate the README table and the package keywords).
Blocked on #1277 reaching a release
A listing claims that codeaf picks up what npx skills installs. On dev, and in every released build (v0.4.1 and earlier), that is false: nothing in internal/session reads a SKILL.md.
The reader is #1277 (Santosh). It is on santos/dev2: #1365 and #1382 merged there, and #1396 is open. internal/skills scans .codeaf/skills, .agents/skills, .claude/skills, .codex/skills, .cursor/skills and .gemini/skills in both the project and the home directory. That covers both places npx skills writes for an agent like codeaf:
- a project install:
<project>/.agents/skills/<name> - a global install:
~/.agents/skills/<name>
For an agent whose project folder is .agents/skills ("universal" upstream), installer.ts writes global installs to the shared ~/.agents/skills and never links them into the agent's own globalSkillsDir.
So this issue does not build a loader. It opens the upstream pull request once #1277 is on dev and in a release.
The entry, and why its global folder is ~/.agents/skills
// src/agents.ts, beside the other *Home constants
const codeafHome = process.env.CODEAF_HOME?.trim() || join(home, '.codeaf');
codeaf: {
name: 'codeaf',
displayName: 'codeaf',
skillsDir: '.agents/skills',
globalSkillsDir: join(home, '.agents/skills'),
detectInstalled: async () => existsSync(codeafHome),
},The first draft had globalSkillsDir: join(codeafHome, 'skills'), which is codeaf's own skills folder in #1277. Two reasons to declare ~/.agents/skills instead:
- It is where a global install actually goes. The README table and
skills list -gwould otherwise show~/.codeaf/skills/, a foldernpx skillsnever writes to for codeaf. npx skills remove -gdeletes inside the declared folder without checking it. For every agent it targets,remove.tsrunsrm -rf <globalSkillsDir>/<name>without checking that the path is a skill. With no-a, it targets every agent in its table, installed or not.~/.codeaf/skillsis also the resident's promoted-commands shelf (store.SkillsRoot), andinternal/execputs itsbin/onPATH. So once codeaf is listed with that folder, anyone removing a skill namedbin, or one that shares a name with a promoted command, deletes that folder under~/.codeaf, even if they installed the skill for a different agent. Declaring~/.agents/skillskeepsnpx skillsout of~/.codeafentirely. Cline and Dexto declare the same folder.
skills add -g -a codeaf then shows ~/.agents/skills, and #1277's scan reads it.
Acceptance, end to end, on a codeaf release that carries #1277
- In a project,
npx skills add <a public skill repo> -a codeaf -ywrites.agents/skills/<name>/SKILL.md. Thencodeafin that project offers the skill: it is in the/skillpicker, and a turn can use it. - The same works with
-g: the skill lands in~/.agents/skills/<name>, and codeaf opened in any folder offers it. - Neither install nor
npx skills remove -gtouches anything under~/.codeaf. - Upstream's own gates are green:
validate-agents.ts,sync-agents.ts(README table, agent count, discovery paths, package keyword),pnpm format:check,pnpm type-checkandpnpm test.
Notes
- Upstream has about 83 "add agent" pull requests open. The ones that merged recently (fx, Sarvam Code, Posit Assistant) took days to weeks, so the pull request can be opened as soon as the release exists.
skills use <pkg>@<skill>launches onlyclaude,codexandsarvam-code(USE_AGENT_CONFIGSinsrc/use.ts). codeaf can be added there later, once a skill prompt can be handed tocodeafon its command line the same way.
Activity
[-]Load Agent Skills (SKILL.md) so codeaf can be listed in npx skills[/-][+]List codeaf in npx skills (vercel-labs/skills) once #1277 ships[/+]AbirAbbas commentedon Sep 23, 2026
The upstream change is ready locally and not pushed. It is one commit on vercel-labs/skills
main(v1.7.0) touchingsrc/types.ts,src/agents.ts,README.md,package.jsonand a newtests/codeaf-agent.test.ts: 5 files, +71/-2.Checked on Node 24, as their CI runs it:
validate-agents.tspasses.sync-agents.tsputs codeaf in the README row for.agents/skills/and~/.agents/skills/, beside Cline, Dexto and Sarvam Code, and adds the package keyword.format:check,type-checkandbuildare clean.pnpm test: 878 of 879 pass, including the 4 new tests. The one failure (private-repo-add-security> "falls back to normal Git authentication") fails the same way with this change stashed.End to end, with the real CLI and a throwaway HOME:
add -g -a codeafwrites~/.agents/skills/<name>, andadd -a codeafwrites.agents/skills/<name>. Nothing is written under~/.codeaf.skills.Discoverfromsantos/dev2finds both installs: scopeuserand scopeproject, root.agents/skills, no warnings.remove -ghazard is real. With the first-draft entry (globalSkillsDir: ~/.codeaf/skills),npx skills remove -g bindeleted a stand-in resident shelf at~/.codeaf/skills/bin, even though the skill had been installed only for Claude Code. With~/.agents/skillsdeclared, that folder survives.The upstream pull request opens once #1277 is in a codeaf release.