@gallopsystems/agent-skills 1.10.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,10 +44,17 @@ yarn add -D @gallopsystems/agent-skills
44
44
  ```
45
45
 
46
46
  On install, a `postinstall` script symlinks the package's content into the
47
- project's `.claude/` directory:
47
+ project, for both Claude Code and Codex:
48
48
 
49
49
  - **skills** — each directory containing a `SKILL.md` → `.claude/skills/<name>`
50
- - **commands** — each `.md` file under any `commands/` directory → `.claude/commands/<name>.md`
50
+ (Claude Code) **and** `.agents/skills/<name>` (Codex). The `SKILL.md` format is
51
+ identical for both agents, so each skill dir is linked verbatim. Everything ships
52
+ as a skill: in current Claude Code a skill is both slash-invocable (`/<name>`) and
53
+ model-invocable, so `contribute-skill`, for example, gives you `/contribute-skill`
54
+ *and* gets auto-offered when relevant — no separate command needed.
55
+ - **commands** — each `.md` file under any `commands/` directory →
56
+ `.claude/commands/<name>.md` (Claude only; Codex has no project command dir). Kept
57
+ for legacy/Claude-only commands; this package ships none today.
51
58
 
52
59
  Updating is just a version bump:
53
60
 
@@ -61,12 +68,13 @@ recreated on every install), so ignore them in `.gitignore`:
61
68
  ```
62
69
  .claude/skills
63
70
  .claude/commands
71
+ .agents/skills
64
72
  ```
65
73
 
66
74
  Notes:
67
- - The script never clobbers a real `.claude/skills/<name>` or `.claude/commands/<name>`
68
- you authored, and only removes symlinks it created. Run `yarn unlink-skills` to
69
- remove all managed links.
75
+ - The script never clobbers a real `.claude/skills/<name>`, `.agents/skills/<name>`,
76
+ or `.claude/commands/<name>` you authored, and only removes symlinks it created.
77
+ Run `yarn unlink-skills` to remove all managed links.
70
78
  - Works out of the box with Yarn (Classic, or Berry with `nodeLinker: node-modules`)
71
79
  and npm. **pnpm** (v10+) blocks dependency build scripts by default — add the
72
80
  package to `pnpm.onlyBuiltDependencies` for the `postinstall` to run.
@@ -163,8 +171,8 @@ Covers:
163
171
 
164
172
  Every skill ends with a **Contributing Back** section: when Claude works through
165
173
  something the skill didn't cover, it offers to contribute the lesson upstream. The
166
- `/contribute-skill` command (shipped in this package and symlinked into
167
- `.claude/commands/` on install) automates the flow: distill the generic lesson,
174
+ `contribute-skill` skill (run `/contribute-skill` on Claude Code, or let either agent
175
+ invoke it when relevant) automates the flow: distill the generic lesson,
168
176
  privacy-sweep it, clone or fork this repo, and open a PR against the right skill
169
177
  file. PRs from forks are welcome — content must be generic (placeholders only, no
170
178
  project-specific names, IDs, or domains).
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gallopsystems/agent-skills",
3
- "version": "1.10.0",
4
- "description": "Gallop Systems Claude Code skills, symlinked into .claude/skills on install.",
3
+ "version": "1.11.0",
4
+ "description": "Gallop Systems agent skills, symlinked into .claude/skills (Claude Code) and .agents/skills (Codex) on install.",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
7
7
  "type": "git",
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "contribute-skill",
3
+ "description": "Contribute a lesson learned this session back to the gallop-systems/agent-skills repo as a PR: distill the generic rule, privacy-sweep it, and open a PR against the right skill.",
4
+ "version": "1.0.0",
5
+ "author": {
6
+ "name": "yeedle"
7
+ }
8
+ }
@@ -1,5 +1,6 @@
1
1
  ---
2
- description: Contribute a lesson learned this session back to the gallop-systems/agent-skills repo as a PR
2
+ name: contribute-skill
3
+ description: Contribute a lesson learned this session back to the gallop-systems/agent-skills repo as a PR. Use when capturing an error→fix, a behavior that contradicted a skill, or a workflow gap the skill didn't cover, and turning it into a generic, public-safe addition to an installed skill.
3
4
  argument-hint: [which skill and/or what lesson]
4
5
  ---
5
6
 
@@ -1,10 +1,19 @@
1
1
  #!/usr/bin/env node
2
- // Postinstall: symlink this package's skills and commands into the consuming
3
- // project's .claude directory, so a `yarn add` / `yarn install` keeps the
4
- // project in sync with this package's version:
2
+ // Postinstall: symlink this package's skills (and any commands) into the consuming
3
+ // project, so a `yarn add` / `yarn install` keeps the project in sync with this
4
+ // package's version:
5
5
  //
6
- // skills -> .claude/skills/<name> (a dir containing SKILL.md)
7
- // commands -> .claude/commands/<rel>.md (a .md file under any commands/ dir)
6
+ // skills -> .claude/skills/<name> (Claude Code; a dir with SKILL.md)
7
+ // skills -> .agents/skills/<name> (Codex; same SKILL.md format)
8
+ // commands -> .claude/commands/<rel>.md (Claude Code only; a .md under commands/)
9
+ //
10
+ // The SKILL.md format (name + description frontmatter, no nesting) is identical
11
+ // across Claude and Codex, so skill dirs are linked verbatim into both roots. In
12
+ // current Claude Code, custom commands were merged into skills: a skill is itself
13
+ // slash-invocable (`/<name>`) AND model-invocable, so it fully covers what a command
14
+ // did. We therefore ship workflows as skills, not commands. The commands/ path is
15
+ // still honored for any legacy Claude-only command, but Codex has no project command
16
+ // dir, so commands are never linked there.
8
17
  //
9
18
  // This runs during `yarn install`, so it MUST NOT throw — a thrown error aborts
10
19
  // the whole install. Every failure path here degrades to a warning + exit 0.
@@ -229,20 +238,27 @@ function main() {
229
238
  return
230
239
  }
231
240
 
232
- const skillsRoot = path.join(projectRoot, '.claude', 'skills')
233
- const commandsRoot = path.join(projectRoot, '.claude', 'commands')
241
+ const claudeSkillsRoot = path.join(projectRoot, '.claude', 'skills') // Claude Code
242
+ const codexSkillsRoot = path.join(projectRoot, '.agents', 'skills') // Codex
243
+ const commandsRoot = path.join(projectRoot, '.claude', 'commands') // Claude Code only
234
244
 
235
245
  if (UNLINK) {
236
- for (const root of [skillsRoot, commandsRoot]) {
246
+ for (const root of [claudeSkillsRoot, codexSkillsRoot, commandsRoot]) {
237
247
  if (fs.existsSync(root)) removeStaleLinks(realOrSelf(root), new Set())
238
248
  }
239
- log('removed managed symlinks from .claude/skills and .claude/commands.')
249
+ log('removed managed symlinks from .claude/ and .agents/.')
240
250
  return
241
251
  }
242
252
 
243
- const skills = linkInto(skillsRoot, collectSkills(PKG_DIR), 'skills')
253
+ const skillSources = collectSkills(PKG_DIR)
254
+ const skills = linkInto(claudeSkillsRoot, skillSources, 'skills')
255
+ linkInto(codexSkillsRoot, skillSources, 'skills')
244
256
  const commands = linkInto(commandsRoot, collectCommands(PKG_DIR), 'commands')
245
- log(`linked ${skills} skill${skills === 1 ? '' : 's'} and ${commands} command${commands === 1 ? '' : 's'} into .claude/`)
257
+ log(
258
+ `linked ${skills} skill${skills === 1 ? '' : 's'} (.claude + .agents)` +
259
+ (commands ? ` and ${commands} command${commands === 1 ? '' : 's'} (.claude)` : '') +
260
+ '.',
261
+ )
246
262
  }
247
263
 
248
264
  try {