@skill-map/cli 0.71.0 → 0.72.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.
@@ -276,8 +276,8 @@ the `__PROVIDER__` token and skip kinds the provider does not claim.
276
276
  `rm -rf .skill-map`.
277
277
  2. Lay the portfolio boot (Express skeleton + handbook):
278
278
  `fixtures.js lay portfolio --only "AGENTS.md,server.js,package.json,public/index.html" --provider <provider> --lang <lang>`.
279
- The harness members (`CLAUDE.md`, `content-editor`, the docs) are
280
- laid by their own chapters.
279
+ The harness members (the entry pointer, `content-editor`, the docs)
280
+ are laid by their own chapters.
281
281
 
282
282
  The tester runs `sm init` in the first chapter. (Later campaign
283
283
  parts use `preflight: seed`; `portfolio-init` is Part 1's flavour,
@@ -19,6 +19,7 @@
19
19
  "portfolio": [
20
20
  "AGENTS.md",
21
21
  "CLAUDE.md",
22
+ "README.md",
22
23
  "server.js",
23
24
  "package.json",
24
25
  "AGENTS.sm",
@@ -289,7 +289,7 @@
289
289
  {
290
290
  "id": "reserved",
291
291
  "title": "A reserved name collides",
292
- "est_min": 2
292
+ "est_min": 4
293
293
  },
294
294
  {
295
295
  "id": "publish",
@@ -209,7 +209,7 @@ parts:
209
209
  - id: setup ; title: "Make it yours and bring it up" ; est_min: 4
210
210
  - id: add-page ; title: "Add a page with your skill" ; est_min: 3
211
211
  - id: broken-ref ; title: "A rename breaks a link" ; est_min: 3
212
- - id: reserved ; title: "A reserved name collides" ; est_min: 2
212
+ - id: reserved ; title: "A reserved name collides" ; est_min: 4
213
213
  - id: publish ; title: "Ship it: run the publish skill for real" ; est_min: 3
214
214
  - id: stability ; title: "Set a node's stability (and the `.sm` sidecar)" ; est_min: 3
215
215
  - id: golive ; title: "Your website, live next to the graph" ; est_min: 3
@@ -12,8 +12,11 @@ model; the per-chapter invocations live in each `part-*.md`.
12
12
  fixtures-data/
13
13
  manifest.json sets, footprints, edits, seeds, providerToken, langs
14
14
  sets/<set>/
15
- shared/ lang-invariant files (code: server.js, package.json, CLAUDE.md)
15
+ shared/ lang-invariant files (code: server.js, package.json)
16
16
  en/ es/ one tree per language (files with translatable prose)
17
+ providers/<provider>/ per-lens overlay (shared/ + en/ es/); e.g. the root
18
+ entry pointer is CLAUDE.md on claude/codex,
19
+ README.md on agent-skills/antigravity
17
20
  edits/<edit-id>/
18
21
  en/ es/ append fragments (one file per fragment)
19
22
  ```
@@ -138,7 +138,7 @@ mv docs/DEPLOY.md docs/DEPLOYMENT.md
138
138
  Wait for confirmation. The harness MUST be clean again before Act C. Mark
139
139
  `broken-ref`: done. Auto-advance to `reserved`.
140
140
 
141
- ## Chapter `reserved` - A reserved name collides (~2 min)
141
+ ## Chapter `reserved` - A reserved name collides (~4 min)
142
142
 
143
143
  **Preparation**: `Write` `<provider_dir>/model/SKILL.md`:
144
144
  ```markdown
@@ -169,7 +169,51 @@ The watcher picks up the new skill. Tell the tester:
169
169
  >
170
170
  > See the `model` node land clean, with no warning?
171
171
 
172
- Wait for confirmation. Mark `reserved`: done. Auto-advance to `publish`.
172
+ Wait for confirmation.
173
+
174
+ **Beat 2, prove the vendor exception by switching the lens (hands-on).** First
175
+ `Write` `<provider_dir>/goal/SKILL.md` (a skill named after the Antigravity
176
+ built-in verb `goal`):
177
+
178
+ ```markdown
179
+ ---
180
+ name: goal
181
+ description: |
182
+ Captures a goal for the site and tracks it to done.
183
+ ---
184
+
185
+ # goal
186
+
187
+ Notes a goal and checks it off when shipped.
188
+ ```
189
+
190
+ The watcher adds it clean (on your open-standard lens `goal` is just a name). The
191
+ agent does NOT touch settings (Inviolable rule #2); the tester drives the
192
+ Settings UI. Tell the tester:
193
+
194
+ > Now let's make that warning real by switching the lens. I added one more skill,
195
+ > `goal`, an Antigravity built-in verb. On your open standard it landed clean,
196
+ > same as `model`.
197
+ >
198
+ > Open **Settings** (the sliders icon, top right) and the **Project** tab. Find
199
+ > **Active provider** and switch it from the open standard to **Google's
200
+ > Antigravity**, then confirm. skill-map clears the old lens's scan, so the Map
201
+ > goes quiet; click the **refresh** button (the sync icon in the topbar) to
202
+ > re-scan under the new lens.
203
+ >
204
+ > Watch the Map: `goal` now wears a **`name-reserved`** warning (under Antigravity
205
+ > `/goal` is a built-in command, so your skill would be shadowed), while `model`
206
+ > stays clean (it is not one of Antigravity's verbs). Same files, different lens:
207
+ > the lens decides what is reserved.
208
+ >
209
+ > Now switch **Active provider** back to the open standard, confirm, and click
210
+ > refresh once more. The warning on `goal` clears, you are back on the neutral
211
+ > standard that reserves nothing.
212
+ >
213
+ > Did the warning appear under Antigravity and clear when you switched back?
214
+
215
+ Wait for confirmation. The lens MUST be back on the open standard before
216
+ continuing. Mark `reserved`: done. Auto-advance to `publish`.
173
217
 
174
218
  ---
175
219
 
@@ -128,8 +128,8 @@ You edit `notes/todo.md` so it becomes the **hub** that points to the other
128
128
  nodes. On this lens there is exactly one connector: the **markdown reference**.
129
129
  A bullet links to another file with `[label](relative/path)`; skill-map reads
130
130
  that as a `references` link and draws an arrow when the target resolves to a
131
- real file. (The rich track also has `/`-invokes and `@`-mentions; the open
132
- standard connects by file links only, and that is all this lens emits.)
131
+ real file. (Wiring everything with file links keeps the harness portable: a
132
+ reference resolves the same way on any runtime that speaks the open standard.)
133
133
 
134
134
  Apply the hub bullets (content lives in `fixtures-data/`). The edit appends
135
135
  three bullets after the `# Pending` heading. Backstage (silent):
@@ -60,13 +60,13 @@ Wait for confirmation. Mark `kickoff`: done.
60
60
  Tell the tester to create the file themselves (their project's file, Inviolable
61
61
  rule #2):
62
62
 
63
- > Create a file called `CLAUDE.md` at the project root with exactly this content:
63
+ > Create a file called `README.md` at the project root with exactly this content:
64
64
  >
65
65
  > ```markdown
66
66
  > See the [handbook](AGENTS.md).
67
67
  > ```
68
68
  >
69
- > Save it. Watch the map: a new `CLAUDE.md` node appears with a `references`
69
+ > Save it. Watch the map: a new `README.md` node appears with a `references`
70
70
  > connector pointing at `AGENTS.md`, solid at 1.00. The markdown link
71
71
  > `[handbook](AGENTS.md)` is a file pointer (the same kind of reference you met
72
72
  > in the prologue), and since the handbook is right there the link resolves with
@@ -117,7 +117,7 @@ Tell the tester:
117
117
  > front of you:
118
118
  >
119
119
  > - **skill**: `content-editor` (does work on your behalf).
120
- > - **markdown**: `AGENTS.md`, `CLAUDE.md`, the two docs (plain notes and
120
+ > - **markdown**: `AGENTS.md`, `README.md`, the two docs (plain notes and
121
121
  > manuals).
122
122
  >
123
123
  > Your lens authors exactly these two; Claude and Codex projects add `agent` and
@@ -188,10 +188,10 @@ Continue the tester message:
188
188
  > - `publish -> content-editor` (the `[content-editor](../content-editor/SKILL.md)` link)
189
189
  > - `publish -> docs/DEPLOY.md` (the `[deploy runbook](../../../docs/DEPLOY.md)` link)
190
190
  >
191
- > One node, three connectors, all references. On a vendor lens (claude/codex) the
192
- > first two would be a `/`-invoke and an `@`-mention; the open standard wires
193
- > everything with file links, and that is all this lens emits. The harness is
194
- > starting to look like a real graph.
191
+ > One node, three connectors, all references. Wiring the whole harness with
192
+ > markdown file links keeps it portable: each reference resolves the same way on
193
+ > any runtime that speaks the open standard. The harness is starting to look
194
+ > like a real graph.
195
195
  >
196
196
  > 💡 Tip: to tidy the layout, click **Re-arrange layout** in the map toolbar.
197
197
  >
@@ -78,7 +78,10 @@ function writeFileEnsuring(abs, content) {
78
78
  * tier, then the per-provider overlay (`providers/<provider>/{shared,<lang>}/`).
79
79
  * The overlay carries the skill-shaped variants of nodes a lens renders
80
80
  * differently (e.g. the `content-editor` agent becomes a skill on
81
- * agent-skills); claude declares no overlay because the base IS its shape.
81
+ * agent-skills). claude is mostly the base shape, but it still carries a tiny
82
+ * overlay for the entry-pointer file: the portfolio root pointer is `CLAUDE.md`
83
+ * (claude/codex overlays) vs `README.md` (agent-skills / antigravity), so it
84
+ * cannot live in the universal base `shared/` tier.
82
85
  */
83
86
  function laySet(manifest, set, o, only = null) {
84
87
  const { kinds } = pdirAndKinds(o);
@@ -297,5 +300,5 @@ function main() {
297
300
  }
298
301
 
299
302
  main();
300
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9e366749-efd9-5bc5-bba4-41147eabf625")}catch(e){}}();
301
- //# debugId=9e366749-efd9-5bc5-bba4-41147eabf625
303
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b7c7dad8-e6ce-5918-a25b-41b4e2d13a4c")}catch(e){}}();
304
+ //# debugId=b7c7dad8-e6ce-5918-a25b-41b4e2d13a4c
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // cli/entry.ts
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="81f53ca6-a8bf-5fc1-909d-ce926a83f056")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2c7d4927-4422-59d2-a37a-59fed3a2ec80")}catch(e){}}();
4
4
  import { existsSync as existsSync34 } from "fs";
5
5
  import { Builtins, Cli as Cli2 } from "clipanion";
6
6
 
@@ -250,7 +250,7 @@ function bucketByKind(kind, instance, bag) {
250
250
  // package.json
251
251
  var package_default = {
252
252
  name: "@skill-map/cli",
253
- version: "0.71.0",
253
+ version: "0.72.0",
254
254
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
255
255
  license: "MIT",
256
256
  type: "module",
@@ -584,6 +584,7 @@ var CLAUDE_PLUGIN_ID = "claude";
584
584
  var CODEX_PLUGIN_ID = "codex";
585
585
  var ANTIGRAVITY_PLUGIN_ID = "antigravity";
586
586
  var AGENT_SKILLS_PLUGIN_ID = "agent-skills";
587
+ var OPENCODE_PLUGIN_ID = "opencode";
587
588
 
588
589
  // plugins/claude/providers/claude/index.ts
589
590
  var RESERVED_SLASH_NAMES = [
@@ -1559,6 +1560,186 @@ var dollarSkillExtractor = {
1559
1560
  }
1560
1561
  };
1561
1562
 
1563
+ // plugins/opencode/providers/opencode/schemas/agent.schema.json
1564
+ var agent_schema_default3 = {
1565
+ $schema: "https://json-schema.org/draft/2020-12/schema",
1566
+ $id: "https://skill-map.ai/providers/opencode/v1/frontmatter/agent.schema.json",
1567
+ title: "FrontmatterOpenCodeAgent",
1568
+ description: "Frontmatter shape for nodes classified as `agent` by the OpenCode Provider. OpenCode agents live as markdown files under `.opencode/agent/<name>.md` (https://opencode.ai/docs/agents); the markdown body is the agent prompt. There is NO `name` field, the filename stem is the handle. Field set mirrors OpenCode's documented agent frontmatter; `additionalProperties: true` lets any other inherited key flow through unchanged.",
1569
+ allOf: [
1570
+ { $ref: "https://skill-map.ai/spec/v0/frontmatter/base.schema.json" }
1571
+ ],
1572
+ type: "object",
1573
+ additionalProperties: true,
1574
+ required: ["description"],
1575
+ properties: {
1576
+ description: {
1577
+ type: "string",
1578
+ description: "What the agent does and when to use it. OpenCode surfaces this when selecting a subagent; skill-map mirrors it in the card. Required: a description-less agent cannot be meaningfully selected."
1579
+ },
1580
+ mode: {
1581
+ type: "string",
1582
+ enum: ["all", "primary", "subagent"],
1583
+ description: "How the agent runs: `primary` (a top-level agent the user can switch to), `subagent` (invoked by another agent via the `task` tool), or `all`. Inherits OpenCode's default when omitted."
1584
+ },
1585
+ model: {
1586
+ type: "string",
1587
+ description: "Model the agent runs against, in OpenCode's `provider/model` form (e.g. `anthropic/claude-opus-4-8`). Inherits the parent's model when omitted."
1588
+ },
1589
+ permission: {
1590
+ type: "object",
1591
+ additionalProperties: true,
1592
+ description: "Per-tool permission policy. Each documented tool key maps to `allow`, `ask`, or `deny`; `bash` may instead be a map of command globs to policies. Any tool omitted inherits OpenCode's default.",
1593
+ properties: {
1594
+ edit: { type: "string", enum: ["allow", "ask", "deny"] },
1595
+ bash: {
1596
+ description: "Either a blanket policy or a per-command-glob map.",
1597
+ oneOf: [
1598
+ { type: "string", enum: ["allow", "ask", "deny"] },
1599
+ {
1600
+ type: "object",
1601
+ additionalProperties: { type: "string", enum: ["allow", "ask", "deny"] }
1602
+ }
1603
+ ]
1604
+ },
1605
+ webfetch: { type: "string", enum: ["allow", "ask", "deny"] }
1606
+ }
1607
+ }
1608
+ }
1609
+ };
1610
+
1611
+ // plugins/opencode/providers/opencode/schemas/command.schema.json
1612
+ var command_schema_default2 = {
1613
+ $schema: "https://json-schema.org/draft/2020-12/schema",
1614
+ $id: "https://skill-map.ai/providers/opencode/v1/frontmatter/command.schema.json",
1615
+ title: "FrontmatterOpenCodeCommand",
1616
+ description: "Frontmatter shape for nodes classified as `command` by the OpenCode Provider. OpenCode custom commands live as markdown files under `.opencode/commands/<name>.md` (https://opencode.ai/docs/commands); the markdown body is the command template and the filename stem is the command name (invoked `/<name>`). No required fields beyond the base (OpenCode treats the frontmatter as optional metadata); `additionalProperties: true` lets inherited keys flow through unchanged.",
1617
+ allOf: [
1618
+ { $ref: "https://skill-map.ai/spec/v0/frontmatter/base.schema.json" }
1619
+ ],
1620
+ type: "object",
1621
+ additionalProperties: true,
1622
+ properties: {
1623
+ description: {
1624
+ type: "string",
1625
+ description: "Brief explanation of the command's purpose, shown in OpenCode's slash-command picker."
1626
+ },
1627
+ agent: {
1628
+ type: "string",
1629
+ description: "Optional agent this command runs under (matches an `.opencode/agent/<name>` handle)."
1630
+ },
1631
+ model: {
1632
+ type: "string",
1633
+ description: "Optional model override for this command, in OpenCode's `provider/model` form."
1634
+ }
1635
+ }
1636
+ };
1637
+
1638
+ // plugins/opencode/providers/opencode/index.ts
1639
+ var OPENCODE_RESERVED_SLASH_VERBS = [
1640
+ // Inherited open-standard base (universal cross-agent slash commands).
1641
+ ...COMMONS_RESERVED_NAMES["skill"] ?? [],
1642
+ // OpenCode-specific built-in verbs (`/help` already lives in the base).
1643
+ "init",
1644
+ "redo",
1645
+ "share",
1646
+ "undo"
1647
+ ];
1648
+ var opencodeProvider = {
1649
+ id: "opencode",
1650
+ pluginId: OPENCODE_PLUGIN_ID,
1651
+ kind: "provider",
1652
+ description: "Classifies `.opencode/agent/*.md` as OpenCode agents and `.opencode/commands/*.md` as OpenCode commands (its own kinds), and skills under `.opencode/skills/`, `.claude/skills/`, and `.agents/skills/` (the project-level homes OpenCode reads).",
1653
+ // Provider identity for the active-lens dropdown, the topbar lens chip, and
1654
+ // the per-node provider chip. OpenCode has no strong model vendor (it is
1655
+ // model-agnostic), so the label is the bare product name, NOT a possessive
1656
+ // `<Vendor>'s <product>` like the other vendor lenses. Cyan, distinct from
1657
+ // codex green, antigravity violet, and the agent-skills slate.
1658
+ presentation: {
1659
+ label: "OpenCode",
1660
+ color: "#0891b2",
1661
+ colorDark: "#22d3ee",
1662
+ // OpenCode invokes its custom commands with `/<name>`; the palette paints
1663
+ // this as the `invokes` edge glyph under the opencode lens. (Skills are
1664
+ // loaded by OpenCode's native `skill` tool, not a body sigil.)
1665
+ invocationSigil: "/"
1666
+ },
1667
+ // Auto-detect marker: a `.opencode/` directory marks an OpenCode project.
1668
+ detect: { markers: [".opencode"] },
1669
+ // Vendor lens: gated to the active lens. OpenCode only resolves its own
1670
+ // territory (plus the Claude-compat / open-standard skill homes it reads).
1671
+ // Gating keeps the walker from claiming OpenCode territory under another
1672
+ // lens, where the OpenCode runtime would never resolve it anyway, and keeps
1673
+ // the `.claude/skills/` claim here from colliding with the claude lens.
1674
+ gatedByActiveLens: true,
1675
+ // Beta: ships enabled, auto-detects `.opencode/`, selectable as the active
1676
+ // lens, with a maturity badge. Same posture as codex / antigravity, since
1677
+ // the lens is freshly landed. Promote to `stable` (drop the field) once it
1678
+ // has real-world mileage.
1679
+ stability: "beta",
1680
+ // Single read rule: all three families are `.md` + YAML frontmatter, so one
1681
+ // `COMMONS_READ` pass suffices (no multi-rule `read` like codex, which mixes
1682
+ // `.toml`). `classify()` below routes each path to its kind.
1683
+ read: COMMONS_READ,
1684
+ kinds: {
1685
+ agent: {
1686
+ schema: "./schemas/agent.schema.json",
1687
+ schemaJson: agent_schema_default3,
1688
+ ui: {
1689
+ label: "Agents",
1690
+ // Cross-provider agent vocabulary: same blue as Claude's `agent` kind,
1691
+ // so an agent paints the same regardless of which lens sourced it.
1692
+ color: "#3b82f6",
1693
+ colorDark: "#60a5fa",
1694
+ icon: { kind: "pi", id: "pi-user" }
1695
+ },
1696
+ // No `name` frontmatter field: the filename stem
1697
+ // (`.opencode/agent/<name>.md`) is the handle.
1698
+ identifiers: ["filename-basename"]
1699
+ },
1700
+ command: {
1701
+ schema: "./schemas/command.schema.json",
1702
+ schemaJson: command_schema_default2,
1703
+ ui: {
1704
+ label: "Commands",
1705
+ // Cross-provider command vocabulary: same amber (and icon) as Claude's
1706
+ // `command` kind and Antigravity's `workflow` kind.
1707
+ color: "#f59e0b",
1708
+ colorDark: "#fbbf24",
1709
+ icon: { kind: "svg", path: "M4 17 L10 11 L4 5 M12 19 L20 19" }
1710
+ },
1711
+ // The filename stem is the command name (`/<name>`); no `name` field.
1712
+ identifiers: ["filename-basename"]
1713
+ },
1714
+ // Open-standard `skill` kind, inherited from `agent-skills` by manifest
1715
+ // composition (same schema + green visuals every adopter shares).
1716
+ // `classify()` routes the three skill homes OpenCode reads into this kind.
1717
+ ...COMMONS_KINDS
1718
+ },
1719
+ // `/<name>` slash invocations resolve to commands ONLY: OpenCode reserves the
1720
+ // slash for its custom commands, and loads skills via its native `skill` tool
1721
+ // (no `/`-invocation), so `invokes` does NOT target `skill` here (unlike
1722
+ // claude). Overrides the open-standard default (`invokes: ['skill']`). The
1723
+ // `core/slash-command` extractor is authorised under the opencode lens (its
1724
+ // precondition lists `opencode`) so `/deploy` in a body emits the link.
1725
+ resolution: { invokes: ["command"] },
1726
+ // Reserved built-in slash commands, applied to the `command` kind (the only
1727
+ // `/`-invocable OpenCode kind: skills are tool-loaded, not slash-invoked, so
1728
+ // a skill named after a built-in cannot be shadowed through the slash
1729
+ // channel and is deliberately NOT reserved).
1730
+ reservedNames: {
1731
+ command: OPENCODE_RESERVED_SLASH_VERBS
1732
+ },
1733
+ classify(path) {
1734
+ const lower = path.toLowerCase();
1735
+ if (/^\.opencode\/agent\/[^/]+\.md$/.test(lower)) return "agent";
1736
+ if (/^\.opencode\/commands\/[^/]+\.md$/.test(lower)) return "command";
1737
+ if (/^\.opencode\/skills\/[^/]+\/skill\.md$/.test(lower)) return "skill";
1738
+ if (/^\.claude\/skills\/[^/]+\/skill\.md$/.test(lower)) return "skill";
1739
+ return classifyCommonsPath(path);
1740
+ }
1741
+ };
1742
+
1562
1743
  // plugins/core/providers/core-markdown/schemas/markdown.schema.json
1563
1744
  var markdown_schema_default = {
1564
1745
  $schema: "https://json-schema.org/draft/2020-12/schema",
@@ -2009,7 +2190,7 @@ var slashCommandExtractor = {
2009
2190
  id: ID9,
2010
2191
  pluginId: CORE_PLUGIN_ID,
2011
2192
  kind: "extractor",
2012
- description: "Turns `/command` invocations in a node's body into arrows that point at the resolved slash command, skill, or workflow, using the `/`-grammar shared by Claude and Antigravity. Example: `/deploy` in the body draws an arrow to the `deploy` command.",
2193
+ description: "Turns `/command` invocations in a node's body into arrows that point at the resolved slash command, skill, or workflow, using the `/`-grammar shared by Claude, Antigravity, and OpenCode. Example: `/deploy` in the body draws an arrow to the `deploy` command.",
2013
2194
  scope: "body",
2014
2195
  // Also authorised under the antigravity lens, which shares the `/command`
2015
2196
  // grammar: a workflow / skill / AGENTS.md body's `/name` tokens resolve to
@@ -2019,7 +2200,13 @@ var slashCommandExtractor = {
2019
2200
  // `/init`, ...) and invokes user skills with `$` instead (parsed by the
2020
2201
  // codex `dollar-skill` extractor). A lens that declares no `invokes`
2021
2202
  // resolution leaves the signals unresolved (no spurious edges).
2022
- precondition: { provider: ["claude", "antigravity"] },
2203
+ //
2204
+ // Also authorised under the opencode lens: OpenCode invokes its custom
2205
+ // `.opencode/commands/<name>.md` with `/<name>` (the opencode provider maps
2206
+ // `invokes: ['command']`, since OpenCode loads skills via its native `skill`
2207
+ // tool rather than the slash channel). Additive: claude / antigravity runs
2208
+ // are unchanged.
2209
+ precondition: { provider: ["claude", "antigravity", "opencode"] },
2023
2210
  extract(ctx) {
2024
2211
  const seen = /* @__PURE__ */ new Set();
2025
2212
  const body = stripCodeAndHtml(ctx.body);
@@ -4650,6 +4837,7 @@ var toolsCounterExtractor2 = { ...toolsCounterExtractor, pluginId: "claude", ver
4650
4837
  var antigravityProvider2 = { ...antigravityProvider, pluginId: "antigravity", version: VERSION };
4651
4838
  var codexProvider2 = { ...codexProvider, pluginId: "codex", version: VERSION };
4652
4839
  var dollarSkillExtractor2 = { ...dollarSkillExtractor, pluginId: "codex", version: VERSION };
4840
+ var opencodeProvider2 = { ...opencodeProvider, pluginId: "opencode", version: VERSION };
4653
4841
  var agentSkillsProvider2 = { ...agentSkillsProvider, pluginId: "agent-skills", version: VERSION };
4654
4842
  var coreMarkdownProvider2 = { ...coreMarkdownProvider, pluginId: "core", version: VERSION };
4655
4843
  var atFileExtractor2 = { ...atFileExtractor, pluginId: "core", version: VERSION };
@@ -4704,6 +4892,13 @@ var builtInPlugins = [
4704
4892
  dollarSkillExtractor2
4705
4893
  ]
4706
4894
  },
4895
+ {
4896
+ id: "opencode",
4897
+ description: "OpenCode CLI platform integration (open-source, model-agnostic terminal coding agent). Classifies OpenCode agents under `.opencode/agent/*.md` and commands under `.opencode/commands/*.md` (its own kinds), and adopts the skill homes OpenCode reads (`.opencode/skills/`, `.claude/skills/`, `.agents/skills/`); contributes the OpenCode runtime identity and reserved built-in names.",
4898
+ extensions: [
4899
+ opencodeProvider2
4900
+ ]
4901
+ },
4707
4902
  {
4708
4903
  id: "agent-skills",
4709
4904
  description: "Open-standard Agent Skills layout. Classifies skills under the vendor-neutral path `.agents/skills/<name>/SKILL.md` (adopted by Anthropic, OpenAI, Google). See agentskills.io.",
@@ -5442,6 +5637,7 @@ var BUILT_IN_PLUGIN_IDS = /* @__PURE__ */ new Set([
5442
5637
  "claude",
5443
5638
  "antigravity",
5444
5639
  "codex",
5640
+ "opencode",
5445
5641
  "agent-skills",
5446
5642
  "core"
5447
5643
  ]);
@@ -22181,6 +22377,7 @@ var BUILT_IN_PLUGIN_PRESENTATION_ORDER = [
22181
22377
  "claude",
22182
22378
  "antigravity",
22183
22379
  "codex",
22380
+ "opencode",
22184
22381
  "agent-skills"
22185
22382
  ];
22186
22383
  function sortPluginsForPresentation(plugins) {
@@ -33161,4 +33358,4 @@ function resolveBareDefault() {
33161
33358
  process.exit(ExitCode.Error);
33162
33359
  }
33163
33360
  //# sourceMappingURL=cli.js.map
33164
- //# debugId=81f53ca6-a8bf-5fc1-909d-ce926a83f056
33361
+ //# debugId=2c7d4927-4422-59d2-a37a-59fed3a2ec80
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // kernel/i18n/registry.texts.ts
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="44976d76-8c48-5b39-862d-641f0e3be027")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="36d7449f-872d-54bb-bf4a-a57a0865bea9")}catch(e){}}();
4
4
  var REGISTRY_TEXTS = {
5
5
  duplicateExtension: "Extension already registered: {{kind}}:{{qualifiedId}}",
6
6
  unknownKind: "Unknown extension kind: {{kind}}",
@@ -102,7 +102,7 @@ import { Tiktoken as Tiktoken2 } from "js-tiktoken/lite";
102
102
  // package.json
103
103
  var package_default = {
104
104
  name: "@skill-map/cli",
105
- version: "0.71.0",
105
+ version: "0.72.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -4261,4 +4261,4 @@ export {
4261
4261
  runScanWithRenames
4262
4262
  };
4263
4263
  //# sourceMappingURL=index.js.map
4264
- //# debugId=44976d76-8c48-5b39-862d-641f0e3be027
4264
+ //# debugId=36d7449f-872d-54bb-bf4a-a57a0865bea9
@@ -1,6 +1,6 @@
1
1
  // kernel/i18n/registry.texts.ts
2
2
 
3
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7667ff07-bdd8-541a-b813-e01e201964f0")}catch(e){}}();
3
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0cf98661-b345-5259-9225-d50ee3f837db")}catch(e){}}();
4
4
  var REGISTRY_TEXTS = {
5
5
  duplicateExtension: "Extension already registered: {{kind}}:{{qualifiedId}}",
6
6
  unknownKind: "Unknown extension kind: {{kind}}",
@@ -102,7 +102,7 @@ import { Tiktoken as Tiktoken2 } from "js-tiktoken/lite";
102
102
  // package.json
103
103
  var package_default = {
104
104
  name: "@skill-map/cli",
105
- version: "0.71.0",
105
+ version: "0.72.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -4261,4 +4261,4 @@ export {
4261
4261
  runScanWithRenames
4262
4262
  };
4263
4263
  //# sourceMappingURL=index.js.map
4264
- //# debugId=7667ff07-bdd8-541a-b813-e01e201964f0
4264
+ //# debugId=0cf98661-b345-5259-9225-d50ee3f837db