skilldrop-cli 0.7.0 → 0.8.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
@@ -293,13 +293,14 @@ Four targets, each projecting only as much as the tool's format demands:
293
293
  | `--ide copilot` | `.github/agents/<name>.agent.md` | a rename |
294
294
  | `--ide kiro` | `.kiro/agents/<name>.json` | generated JSON; tool names mapped to Kiro's built-ins |
295
295
  | `--ide codex` | `~/.codex/agents/<name>.toml` (`--project` for repo) | generated TOML |
296
+ | `--ide antigravity` | `~/.gemini/config/agents/<name>.md` (`--project` → `.agents/agents/`) | frontmatter rewritten, `subagent: true` added |
296
297
  | `--dest <dir>` | `<dir>/<name>.md` | none |
297
298
 
298
299
  The Kiro emitter maps `Read`/`Grep`/`Glob`/`Bash` to `read`/`grep`/`glob`/`shell` against [Kiro's built-in tool reference](https://kiro.dev/docs/cli/reference/built-in-tools/), and **names any tool it can't map instead of dropping it silently** — a mistranslated permission is worse than a missing one. It omits `allowedTools` so you're prompted per tool call.
299
300
 
300
301
  Each generated target omits the permission field it cannot map safely rather than guessing one: Kiro's `allowedTools` and Codex's `sandbox_mode` are both left unset, so an agent inherits the session's permissions and is prompted per call. A widened permission nobody asked for is worse than an extra prompt.
301
302
 
302
- Only **Antigravity** still refuses — its subagents exist solely inside a plugin bundle, which is a container rather than a file drop. Design is worked out in [RFC-0013](docs/rfcs/0013-antigravity-plugin-bundle.md), unimplemented pending demand. [`agents/README.md`](agents/README.md) has the manual route.
303
+ **Every surveyed tool now installs.** Only Cursor is absent, because it has no agent file format at all — use a custom mode ([`agents/README.md`](agents/README.md) has the steps).
303
304
 
304
305
  ### Third-party catalogs — publish your own skills through the same CLI
305
306
 
package/agents/README.md CHANGED
@@ -4,7 +4,17 @@ Portable **reviewer agents** — opinionated personas you delegate code and test
4
4
 
5
5
  The frontmatter makes the file a drop-in **Claude Code subagent**. The body is plain enough to paste into any other tool's agent / mode / system-prompt slot.
6
6
 
7
- Nothing auto-discovers *this* folder at the repo root, so it is the **canonical source of truth** and the table below says where to copy each file. That framing used to be simpler: as of the [July 2026 survey](../docs/designs/ide-primitive-coverage.md), **five tools have a native subagent format** — Claude Code, Kiro, Codex, Copilot, and Antigravity, which registers subagents from a directory literally named `agents/` inside a plugin bundle. The CLI does not install agents into any of them yet ([RFC-0010](../docs/rfcs/0010-install-target-table.md) has to settle the projection model first), so copying by hand remains the route.
7
+ Nothing auto-discovers *this* folder at the repo root, so it is the **canonical source of truth**. As of the [July 2026 survey](../docs/designs/ide-primitive-coverage.md), **five tools have a native subagent format** — Claude Code, Kiro, Codex, Copilot, and Antigravity, which registers subagents from a directory literally named `agents/` inside a plugin bundle.
8
+
9
+ **The CLI installs into four of them** ([RFC-0012](../docs/rfcs/0012-subagent-installation.md)):
10
+
11
+ ```bash
12
+ npx skilldrop-cli agents # list
13
+ npx skilldrop-cli install --agent devils-advocate # ~/.claude/agents/
14
+ npx skilldrop-cli install --agent devils-advocate --ide kiro # .kiro/agents/*.json
15
+ ```
16
+
17
+ **Five of the five tools with a native format now install by command** — Claude Code, Kiro, Codex, Copilot, and Antigravity. Only Cursor needs hand-work, because it has no agent file format at all. Each section below gives the command where one exists, and the manual route either way.
8
18
 
9
19
  ## The agents
10
20
 
@@ -48,28 +58,36 @@ Standalone TOML in `~/.codex/agents/` or `.codex/agents/` (`--project`). Codex r
48
58
 
49
59
  ### Kiro (native custom agents)
50
60
 
51
- Kiro reads JSON agent definitions from `.kiro/agents/` (local) or `~/.kiro/agents/` (global). The filename minus `.json` becomes the agent's name.
61
+ ```bash
62
+ npx skilldrop-cli install --agent devils-advocate --ide kiro # .kiro/agents/<name>.json
63
+ ```
52
64
 
53
- Its `prompt` field accepts a **`file://` URI**, so the definition can point at the markdown instead of duplicating it — the cleanest projection of any tool surveyed:
65
+ Kiro reads JSON agent definitions from `.kiro/agents/` (local) or `~/.kiro/agents/` (global). The emitter maps Claude Code tool names to [Kiro's built-ins](https://kiro.dev/docs/cli/reference/built-in-tools/) — `Read`/`Grep`/`Glob`/`Bash` → `read`/`grep`/`glob`/`shell` — and **names any tool it cannot map** rather than dropping it silently.
54
66
 
55
- ```json
56
- {
57
- "name": "devils-advocate",
58
- "description": "<paste the description from the agent's frontmatter>",
59
- "prompt": "file://./agents/devils-advocate.md",
60
- "tools": ["read", "grep", "execute"]
61
- }
62
- ```
67
+ Two choices worth knowing if you hand-write one instead:
68
+
69
+ - **The prompt is inlined, not a `file://` reference.** Kiro's docs show a relative `file://` path but do not say whether it resolves against the workspace root or the JSON file, and a wrong path fails *silently* — the agent loads with no instructions.
70
+ - **`allowedTools` is omitted**, so you are prompted per tool call. That is the right default for a reviewer, and it avoids [kirodotdev/Kiro#6714](https://github.com/kirodotdev/Kiro/issues/6714), where the field does not load as configured.
63
71
 
64
72
  **Don't use a steering file for this.** Earlier advice here said to drop the agent at `.kiro/steering/<agent>.md`; a steering file with no inclusion mode is loaded into *every* session, which is a permanent context cost for a persona you want on demand. Same reason the CLI stopped writing steering shims for skills.
65
73
 
66
74
  ### GitHub Copilot (native custom agents)
67
75
 
68
- Copilot reads `.github/agents/<name>.agent.md` (repo) or `~/.copilot/agents/` (personal). The filename minus `.agent.md` is the invocation name — `copilot --agent devils-advocate`. Copy the file in and rename it; the frontmatter needs `name` and `description`, and takes an optional `tools` list.
76
+ ```bash
77
+ npx skilldrop-cli install --agent devils-advocate --ide copilot # .github/agents/<name>.agent.md
78
+ ```
79
+
80
+ Copilot reads `.github/agents/<name>.agent.md` (repo) or `~/.copilot/agents/` (personal). The filename minus `.agent.md` is the invocation name — `copilot --agent devils-advocate`. The install is a pure rename; nothing in the file changes.
69
81
 
70
82
  ### Antigravity CLI (plugin subagents)
71
83
 
72
- Antigravity registers subagent templates from an `agents/` directory **inside a plugin bundle** at `~/.gemini/antigravity-cli/plugins/<plugin>/agents/`. There is no project-root `agents/` convention, so this is a copy into a bundle you own, not a drop-in.
84
+ ```bash
85
+ npx skilldrop-cli install --agent devils-advocate --ide antigravity # ~/.gemini/config/agents/
86
+ ```
87
+
88
+ Antigravity discovers subagents at `~/.gemini/config/agents/<name>.md` (global) or `.agents/agents/<name>.md` (workspace, `--project`) — markdown with YAML frontmatter, same shape as these files. A plugin bundle is a *third* option, not a requirement; [RFC-0013](../docs/rfcs/0013-antigravity-plugin-bundle.md) records why an earlier draft wrongly thought it was the only one.
89
+
90
+ The emitter adds **`subagent: true`** — without it the agent exists but `invoke_subagent` cannot reach it — and maps `Read`/`Grep`/`Bash` to `view_file`/`grep_search`/`run_command`. Antigravity has no glob-style tool, so `Glob` is named and dropped rather than bent into `list_dir`.
73
91
 
74
92
  ### Continue, Cline, Aider, and other tools
75
93
 
package/bin/skilldrop.js CHANGED
@@ -54,8 +54,9 @@ Options:
54
54
  --ide kiro ./.kiro/agents generated JSON, tools mapped
55
55
  --ide copilot ./.github/agents <name>.agent.md
56
56
  --ide codex ~/.codex/agents generated TOML (--project for repo)
57
+ --ide antigravity ~/.gemini/config/agents markdown, subagent: true
57
58
  --dest <dir> any directory copied as-is
58
- Antigravity needs a plugin bundle (RFC-0013) — see agents/README.md.
59
+ Cursor has no agent format — use a custom mode (agents/README.md).
59
60
  --with-related also install each skill's related companions (one level)
60
61
  --with-hooks also wire any hooks a skill declares (RFC-0006) — git pre-commit
61
62
  reminders and Claude Code session-start context; degrades where the
@@ -202,6 +203,26 @@ function kiroAgentJSON(meta, body) {
202
203
  return { json: JSON.stringify(agent, null, 2) + "\n", unmapped: [...new Set(unmapped)] };
203
204
  }
204
205
 
206
+ /* Antigravity agent markdown (RFC-0013). Only mappings confirmed in Antigravity's own
207
+ subagents doc are listed. There is no glob-style tool in its file tooling
208
+ (view_file / list_dir / grep_search / write_to_file), so Glob is dropped and named
209
+ rather than bent into list_dir — a different operation. */
210
+ const ANTIGRAVITY_TOOLS = { Read: "view_file", Grep: "grep_search", Bash: "run_command" };
211
+ const ANTIGRAVITY_MODELS = new Set(["inherit", "flash", "pro"]);
212
+
213
+ function antigravityAgentMD(meta, body) {
214
+ const declared = meta.tools ? meta.tools.split(",").map((s) => s.trim()).filter(Boolean) : [];
215
+ const tools = [], unmapped = [];
216
+ for (const d of declared) (ANTIGRAVITY_TOOLS[d] ? tools : unmapped).push(ANTIGRAVITY_TOOLS[d] || d);
217
+ // YAML double-quoted scalars are a superset of JSON strings, so JSON.stringify is a
218
+ // correct quoter here — descriptions contain em-dashes and embedded quotes.
219
+ const lines = [`name: ${JSON.stringify(meta.name)}`, `description: ${JSON.stringify(meta.description)}`];
220
+ if (tools.length) lines.push(`tools: [${tools.join(", ")}]`);
221
+ lines.push("subagent: true"); // required, or invoke_subagent cannot reach it
222
+ if (ANTIGRAVITY_MODELS.has(meta.model)) lines.push(`model: ${meta.model}`);
223
+ return { md: `---\n${lines.join("\n")}\n---\n\n${body}\n`, unmapped: [...new Set(unmapped)] };
224
+ }
225
+
205
226
  /* Codex agent TOML. Schema confirmed at learn.chatgpt.com/docs/agent-configuration/subagents:
206
227
  name, description and developer_instructions are required; unknown fields are rejected.
207
228
  sandbox_mode is deliberately NOT emitted — Codex has no `tools` field, permissions come
@@ -219,7 +240,6 @@ function codexAgentTOML(meta, body) {
219
240
  /* Only plain-copy targets ship in RFC-0012. Everything else needs a projection the
220
241
  install-target model (RFC-0010) has not settled — so say so instead of guessing a path. */
221
242
  const AGENT_MANUAL = {
222
- antigravity: "an agents/ directory inside a plugin bundle you own — see RFC-0013",
223
243
  cursor: "a custom mode — Cursor has no agent file format",
224
244
  };
225
245
  function agentTarget(flags) {
@@ -236,6 +256,10 @@ function agentTarget(flags) {
236
256
  return flags.project
237
257
  ? { dest: path.resolve(".codex", "agents"), ide }
238
258
  : { dest: path.join(os.homedir(), ".codex", "agents"), ide };
259
+ if (ide === "antigravity")
260
+ return flags.project
261
+ ? { dest: path.resolve(".agents", "agents"), ide }
262
+ : { dest: path.join(os.homedir(), ".gemini", "config", "agents"), ide };
239
263
  const hint = AGENT_MANUAL[ide];
240
264
  die(`--agent has no target for '${ide}'${hint ? ` — it needs ${hint}` : ""}.\n` +
241
265
  ` Copy it by hand (see agents/README.md), or use --dest <dir>. Tracked in RFC-0012.`);
@@ -254,6 +278,15 @@ function writeAgent(cat, a, dest, ide) {
254
278
  ? ` ${a}: no Kiro equivalent for ${unmapped.join(", ")} — dropped from tools, add by hand if needed`
255
279
  : null };
256
280
  }
281
+ if (ide === "antigravity") {
282
+ const raw = fs.readFileSync(src, "utf8");
283
+ const body = raw.split("---").slice(2).join("---").trim();
284
+ const { md, unmapped } = antigravityAgentMD(agentMeta(cat, a), body);
285
+ fs.writeFileSync(path.join(dest, `${a}.md`), md);
286
+ return { file: `${a}.md`, warn: unmapped.length
287
+ ? ` ${a}: no Antigravity equivalent for ${unmapped.join(", ")} — dropped from tools, add by hand if needed`
288
+ : null };
289
+ }
257
290
  if (ide === "codex") {
258
291
  const raw = fs.readFileSync(src, "utf8");
259
292
  const body = raw.split("---").slice(2).join("---").trim();
@@ -585,6 +618,7 @@ function installAgents(args) {
585
618
  if (ide === "kiro") console.log("Kiro grants `tools` but not auto-approval — you are prompted per call by design.");
586
619
  if (ide === "copilot") console.log("Invoke with: copilot --agent <name>");
587
620
  if (ide === "codex") console.log("sandbox_mode is left unset, so each agent inherits the parent session's permissions.");
621
+ if (ide === "antigravity") console.log("Emitted with `subagent: true` so invoke_subagent can reach them.");
588
622
  if (cat.source !== BUNDLED)
589
623
  console.log(`\nWARNING: third-party catalog '${cat.source}'. An agent is a system prompt your tool will adopt — read it before first use. Install copied files only; nothing was executed.`);
590
624
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Portable AI-agent skills for the deliverables knowledge workers ship \u2014 diagrams, ADRs, PRDs, runbooks, decks, reviews \u2014 installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "bin": {
6
6
  "skilldrop": "bin/skilldrop.js"