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 -g would otherwise show ~/.codeaf/skills/, a folder npx skills never writes to for codeaf.
npx skills remove -g deletes inside the declared folder without checking it. For every agent it targets, remove.ts runs rm -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/skills is also the resident's promoted-commands shelf (store.SkillsRoot), and internal/exec puts its bin/ on PATH. So once codeaf is listed with that folder, anyone removing a skill named bin, 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/skills keeps npx skills out of ~/.codeaf entirely. 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 -y writes .agents/skills/<name>/SKILL.md. Then codeaf in that project offers the skill: it is in the /skill picker, 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 -g touches 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-check and pnpm 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 only claude, codex and sarvam-code (USE_AGENT_CONFIGS in src/use.ts). codeaf can be added there later, once a skill prompt can be handed to codeaf on its command line the same way.
What is asked
Get codeaf listed in
npx skills, the CLI that installs Agent Skills (SKILL.mdfolders) into 78 coding agents. The upstream change is small: one entry insrc/agents.ts,'codeaf'in theAgentTypeunion insrc/types.ts, then theirvalidate-agents.tsandsync-agents.tsscripts (which regenerate the README table and the package keywords).Blocked on #1277 reaching a release
A listing claims that codeaf picks up what
npx skillsinstalls. Ondev, and in every released build (v0.4.1 and earlier), that is false: nothing ininternal/sessionreads aSKILL.md.The reader is #1277 (Santosh). It is on
santos/dev2: #1365 and #1382 merged there, and #1396 is open.internal/skillsscans.codeaf/skills,.agents/skills,.claude/skills,.codex/skills,.cursor/skillsand.gemini/skillsin both the project and the home directory. That covers both placesnpx skillswrites for an agent like codeaf:<project>/.agents/skills/<name>~/.agents/skills/<name>For an agent whose project folder is
.agents/skills("universal" upstream),installer.tswrites global installs to the shared~/.agents/skillsand never links them into the agent's ownglobalSkillsDir.So this issue does not build a loader. It opens the upstream pull request once #1277 is on
devand in a release.The entry, and why its global folder is
~/.agents/skillsThe first draft had
globalSkillsDir: join(codeafHome, 'skills'), which is codeaf's own skills folder in #1277. Two reasons to declare~/.agents/skillsinstead: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 codeafthen shows~/.agents/skills, and #1277's scan reads it.Acceptance, end to end, on a codeaf release that carries #1277
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.-g: the skill lands in~/.agents/skills/<name>, and codeaf opened in any folder offers it.npx skills remove -gtouches anything under~/.codeaf.validate-agents.ts,sync-agents.ts(README table, agent count, discovery paths, package keyword),pnpm format:check,pnpm type-checkandpnpm test.Notes
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.