@skill-map/cli 0.72.0 → 0.73.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.
@@ -269,8 +269,15 @@ A skill-map project reads its files through exactly ONE active lens
269
269
  | `claude` | `.claude/` (agents, commands, skills) | agent, command, skill, markdown| `/` invokes, `@` mentions, refs| `.claude/` | stable | rich |
270
270
  | `codex` | `.codex/agents/*.toml` + `.agents/skills/`| agent (TOML), skill, markdown | `$` invokes, `@` file-refs, refs| `.codex/` | beta | rich |
271
271
  | `antigravity` | `.agents/skills/` + `.agent/workflows/` | skill, workflow, markdown | `/` invokes, `@` file-refs, refs | `.agent/workflows/`| beta | basic |
272
+ | `opencode` | `.agents/skills/` (basic scope) + `.opencode/` | skill, markdown | refs only | `.opencode/` | beta | basic |
272
273
  | `agent-skills` | `.agents/skills/` | skill, markdown | refs only | `.agents/` | stable (default) | basic |
273
274
 
275
+ `opencode` is the one rich-capable lens on the basic track: the OpenCode product
276
+ has `agent` + `command` kinds and `/`-invocation, but its tutorial teaches only
277
+ the shared open-standard `.agents/skills/` skills + markdown references (its
278
+ agents / commands are a deliberate out-of-scope simplification here; the real
279
+ OpenCode lens still classifies them in a live project).
280
+
274
281
  `core/markdown` classifies every orphan `.md` under whatever lens is
275
282
  active; it is the universal base, never a selectable lens.
276
283
 
@@ -282,7 +289,7 @@ active; it is the universal base, never a selectable lens.
282
289
  (skills) and `@`-FILE references (Codex's `@` is a file picker, it cannot
283
290
  mention an agent by name, and `/` is a Codex built-in command, not a skill
284
291
  invocation). Both also use markdown references.
285
- - **basic** (`agent-skills`, `antigravity`): the open-standard family,
292
+ - **basic** (`agent-skills`, `antigravity`, `opencode`): the open-standard family,
286
293
  built on `skill` + `markdown` and wired with **markdown references**
287
294
  (`[text](path)`), the one connection the Agent Skills standard
288
295
  documents. They diverge on what Antigravity bolts on top of the
@@ -311,14 +318,19 @@ built-in command, not a skill invocation).
311
318
  `provider = codex`, `track = rich`.
312
319
  - else a `.agent/workflows/` dir present → `provider = antigravity`,
313
320
  `track = basic`.
321
+ - else a `.opencode/` dir present → `provider = opencode`,
322
+ `<provider_dir> = .agents/skills`, `track = basic` (OpenCode joins the
323
+ open standard for the tutorial; its `.opencode/` marker rides on top of
324
+ the shared `.agents/skills/` skill home, like `.codex/` and
325
+ `.agent/workflows/` do).
314
326
  - else skill under `.claude/skills/sm-tutorial/` → `provider = claude`,
315
327
  `<provider_dir> = .claude`, `track = rich`.
316
328
  - else skill under `.agents/skills/sm-tutorial/` → `provider = agent-skills`,
317
329
  `<provider_dir> = .agents/skills`, `track = basic`.
318
- **Lens precedence for codex / antigravity**: both adopt the open
330
+ **Lens precedence for codex / antigravity / opencode**: each adopts the open
319
331
  `.agents/skills/` layout, so the scaffold leaves the vendor marker
320
- (`.codex/` or `.agent/workflows/`) alongside the `agent-skills` marker
321
- (`.agents/`). The vendor marker WINS: `sm init` resolves `codex` /
332
+ (`.codex/`, `.agent/workflows/`, or `.opencode/`) alongside the
333
+ `agent-skills` marker (`.agents/`). The vendor marker WINS: `sm init` resolves `codex` /
322
334
  `antigravity` outright with no prompt (the `.agents/` open default only
323
335
  competes when no vendor marker is present). So the codex book runs
324
336
  exactly like claude, `sm init` then `sm`, with no lens prompt and no
@@ -7,11 +7,13 @@
7
7
  export const PROVIDER_TOKEN = '__PROVIDER__';
8
8
 
9
9
  export function providerDir(provider) {
10
- // agent-skills, Antigravity and Codex all keep their SKILLS under the
11
- // open `.agents/skills/` layout. (Codex additionally has TOML agents under
12
- // `.codex/agents/`, supplied by the codex overlay's literal paths, not this
13
- // single base dir.)
14
- return provider === 'agent-skills' || provider === 'antigravity' || provider === 'codex'
10
+ // agent-skills, Antigravity, Codex, and OpenCode all keep their SKILLS under
11
+ // the open `.agents/skills/` layout. (Codex additionally has TOML agents
12
+ // under `.codex/agents/`, supplied by the codex overlay's literal paths, not
13
+ // this single base dir. OpenCode is rich-capable but joins the open-standard
14
+ // BASIC track here: the tutorial teaches its shared `.agents/skills/` layer,
15
+ // not its own `.opencode/` agents/commands.)
16
+ return provider === 'agent-skills' || provider === 'antigravity' || provider === 'codex' || provider === 'opencode'
15
17
  ? '.agents/skills'
16
18
  : '.claude';
17
19
  }
@@ -25,6 +27,10 @@ export const PROVIDER_KINDS = {
25
27
  codex: new Set(['skill', 'markdown']),
26
28
  'agent-skills': new Set(['skill', 'markdown']),
27
29
  antigravity: new Set(['skill', 'markdown']),
30
+ // OpenCode is rich-capable (it has agent + command kinds in the product), but
31
+ // its tutorial runs on the BASIC track via the shared open standard, so only
32
+ // skill + markdown are taught here (its agents/commands are out of scope).
33
+ opencode: new Set(['skill', 'markdown']),
28
34
  };
29
35
 
30
36
  export function kindsFor(provider) {
@@ -36,7 +42,8 @@ export function kindsFor(provider) {
36
42
  * kind?" axis (see `_core.md` §Provider detection):
37
43
  * - `rich` (agent + skill + slash + `@`): `claude`, `codex`.
38
44
  * - `basic` (skill + markdown, connected by markdown references): the
39
- * open-standard family `agent-skills`, `antigravity`.
45
+ * open-standard family `agent-skills`, `antigravity`, `opencode`
46
+ * (OpenCode is rich-capable but joins basic via the shared open standard).
40
47
  * The book renders the track's parts; the same lens always resolves to
41
48
  * the same track, so a resumed session never re-derives it.
42
49
  */
@@ -46,13 +53,14 @@ export function trackFor(provider) {
46
53
 
47
54
  /**
48
55
  * The provider whose fixture overlays a given provider reuses. The
49
- * open-standard family (`agent-skills`, `antigravity`) shares one on-disk
50
- * shape (`.agents/skills/`, skill + markdown, connected by markdown
51
- * references), so `antigravity` reuses the canonical `agent-skills`
52
- * overlays rather than duplicating them. Every other provider keys its own.
56
+ * open-standard family (`agent-skills`, `antigravity`, `opencode`) shares one
57
+ * on-disk shape (`.agents/skills/`, skill + markdown, connected by markdown
58
+ * references), so `antigravity` and `opencode` reuse the canonical
59
+ * `agent-skills` overlays rather than duplicating them. Every other provider
60
+ * keys its own.
53
61
  */
54
62
  export function overlayKey(provider) {
55
- return provider === 'antigravity' ? 'agent-skills' : provider;
63
+ return provider === 'antigravity' || provider === 'opencode' ? 'agent-skills' : provider;
56
64
  }
57
65
 
58
66
  /**
@@ -81,6 +89,7 @@ const KIND_DIRS = {
81
89
  codex: { skills: '.agents/skills' },
82
90
  'agent-skills': { skills: '.agents/skills' },
83
91
  antigravity: { skills: '.agents/skills' },
92
+ opencode: { skills: '.agents/skills' },
84
93
  };
85
94
 
86
95
  /**
@@ -135,5 +144,5 @@ export function nodeIdForTokenPath(tokenRelPath) {
135
144
  if (codexAgent) return codexAgent[1];
136
145
  return tokenRelPath;
137
146
  }
138
- !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]="54e1e331-4312-5c77-adc1-287ab9df7502")}catch(e){}}();
139
- //# debugId=54e1e331-4312-5c77-adc1-287ab9df7502
147
+ !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]="d231a237-bec6-57bf-a67b-98b9edc47ec9")}catch(e){}}();
148
+ //# debugId=d231a237-bec6-57bf-a67b-98b9edc47ec9
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]="2c7d4927-4422-59d2-a37a-59fed3a2ec80")}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]="b28a958b-1d55-5195-b54e-2998b22e5818")}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.72.0",
253
+ version: "0.73.0",
254
254
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
255
255
  license: "MIT",
256
256
  type: "module",
@@ -1186,15 +1186,17 @@ var agentSkillsProvider = {
1186
1186
  // wins when no vendor marker is present. Provider-owned.
1187
1187
  detect: { markers: [".agents"], fallback: true },
1188
1188
  // Authoring target for `sm tutorial`: the open standard discovers skills
1189
- // under `.agents/skills/<name>/SKILL.md`. `aka` lists Antigravity, which
1190
- // shares this territory AND the BASIC tutorial track (skill + markdown,
1191
- // references), so a tester on Antigravity scaffolds here. OpenAI Codex
1189
+ // under `.agents/skills/<name>/SKILL.md`. `aka` lists Antigravity and
1190
+ // OpenCode, which share this territory AND the BASIC tutorial track (skill +
1191
+ // markdown, references), so a tester on either scaffolds here. OpenCode is
1192
+ // rich-capable (`agent` + `command` kinds) but is deliberately taught on the
1193
+ // basic track via the shared open standard. OpenAI Codex
1192
1194
  // also reads `.agents/skills/`, but Codex is a RICH-track lens (it has the
1193
1195
  // `agent` kind, plus `$`-skill invocation and `@`-file references), so
1194
1196
  // advertising it under this basic row
1195
1197
  // would hand it the wrong book; Codex is surfaced once a Codex rich
1196
1198
  // scaffold target lands. `aka` is display-only, `--for` matches the id.
1197
- scaffold: { skillDir: ".agents/skills", aka: ["Google's Antigravity"] },
1199
+ scaffold: { skillDir: ".agents/skills", aka: ["Google's Antigravity", "OpenCode"] },
1198
1200
  read: COMMONS_READ,
1199
1201
  kinds: COMMONS_KINDS,
1200
1202
  resolution: COMMONS_RESOLUTION,
@@ -4879,7 +4881,7 @@ var builtInPlugins = [
4879
4881
  },
4880
4882
  {
4881
4883
  id: "antigravity",
4882
- description: "Google Antigravity CLI platform integration (replaces the retired Gemini CLI). Classifies Antigravity workflows under `.agent/workflows/*.md` (its own kind) and adopts the open-standard `.agents/skills/` layout for skills; contributes the Antigravity runtime identity and reserved built-in names.",
4884
+ description: "Google Antigravity CLI platform integration (replaces the retired Gemini CLI). Classifies workflows under `.agent/workflows/`, plus the open-standard `.agents/skills/` layout.",
4883
4885
  extensions: [
4884
4886
  antigravityProvider2
4885
4887
  ]
@@ -4894,7 +4896,7 @@ var builtInPlugins = [
4894
4896
  },
4895
4897
  {
4896
4898
  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.",
4899
+ description: "OpenCode CLI platform integration (open-source, model-agnostic terminal coding agent). Classifies agents and commands under `.opencode/`, plus the skill homes it reads.",
4898
4900
  extensions: [
4899
4901
  opencodeProvider2
4900
4902
  ]
@@ -5847,6 +5849,7 @@ var defaults_default = {
5847
5849
  schemaVersion: 1,
5848
5850
  allowEditSmFiles: false,
5849
5851
  allowSidecarWriters: true,
5852
+ tutorialReminderDismissed: false,
5850
5853
  tokenizer: "cl100k_base",
5851
5854
  roots: [],
5852
5855
  ignore: [],
@@ -5878,6 +5881,7 @@ var defaults_default = {
5878
5881
  // kernel/config/loader.ts
5879
5882
  var PROJECT_LOCAL_ONLY_KEYS = /* @__PURE__ */ new Set([
5880
5883
  "allowEditSmFiles",
5884
+ "tutorialReminderDismissed",
5881
5885
  "scan.referencePaths",
5882
5886
  "pluginTrust.projectEnabled"
5883
5887
  ]);
@@ -27115,6 +27119,7 @@ var SERVER_TEXTS = {
27115
27119
  projectPrefsBodyEmpty: "Request body must contain `allowSidecarWriters`, a `scan` block with `referencePaths`, and/or a `pluginTrust` block with `projectEnabled`.",
27116
27120
  projectPrefsConfirmNotBoolean: "`confirm` must be a boolean.",
27117
27121
  projectPrefsSidecarWritersNotBoolean: "`allowSidecarWriters` must be a boolean.",
27122
+ projectPrefsReminderNotBoolean: "`tutorialReminderDismissed` must be a boolean.",
27118
27123
  projectPrefsTrustNotObject: '`pluginTrust` must be an object (e.g. `{"pluginTrust": {"projectEnabled": true}}`).',
27119
27124
  projectPrefsTrustEnabledNotBoolean: "`pluginTrust.projectEnabled` must be a boolean.",
27120
27125
  // Server-stderr advisory after `PATCH /api/project-preferences`
@@ -29168,7 +29173,11 @@ function buildEnvelope3(deps) {
29168
29173
  cwd,
29169
29174
  default: false
29170
29175
  }) ?? false
29171
- }
29176
+ },
29177
+ tutorialReminderDismissed: readConfigValue("tutorialReminderDismissed", {
29178
+ cwd,
29179
+ default: false
29180
+ }) ?? false
29172
29181
  };
29173
29182
  }
29174
29183
  async function applyPatch3(deps, body) {
@@ -29176,8 +29185,11 @@ async function applyPatch3(deps, body) {
29176
29185
  const policyChanged = typeof body.allowSidecarWriters === "boolean" && writeSidecarWritersPolicy(body.allowSidecarWriters, cwd);
29177
29186
  const scan = applyScanWrites(body, cwd);
29178
29187
  const trustChanged = applyTrustWrite(body, cwd);
29188
+ const reminderChanged = applyTutorialReminderWrite(body, cwd);
29179
29189
  if (policyChanged || scan.mutated) await maybeRestartWatcher2(deps);
29180
- if (policyChanged || scan.attempted || trustChanged) deps.configService.reload();
29190
+ if (policyChanged || scan.attempted || trustChanged || reminderChanged) {
29191
+ deps.configService.reload();
29192
+ }
29181
29193
  }
29182
29194
  function applyTrustWrite(body, cwd) {
29183
29195
  const next = body.pluginTrust?.projectEnabled;
@@ -29202,6 +29214,23 @@ function applyTrustWrite(body, cwd) {
29202
29214
  log.warn(tx(SERVER_TEXTS.projectPrefsTrustSet, { value: String(next) }));
29203
29215
  return true;
29204
29216
  }
29217
+ function applyTutorialReminderWrite(body, cwd) {
29218
+ const next = body.tutorialReminderDismissed;
29219
+ if (next === void 0) return false;
29220
+ const before = readConfigValue("tutorialReminderDismissed", { cwd, default: false }) ?? false;
29221
+ if (before === next) return false;
29222
+ try {
29223
+ writeConfigValue("tutorialReminderDismissed", next, { target: "project-local", cwd });
29224
+ } catch (err) {
29225
+ throw new HTTPException13(400, {
29226
+ message: tx(SERVER_TEXTS.projectPrefsPersistFailed, {
29227
+ key: "tutorialReminderDismissed",
29228
+ message: formatErrorMessage(err)
29229
+ })
29230
+ });
29231
+ }
29232
+ return true;
29233
+ }
29205
29234
  function applyScanWrites(body, cwd) {
29206
29235
  const writes = collectWrites(body);
29207
29236
  if (writes.length === 0) return { attempted: false, mutated: false };
@@ -29355,11 +29384,13 @@ var PATCH_BODY_SCHEMA3 = {
29355
29384
  anyOf: [
29356
29385
  { required: ["allowSidecarWriters"] },
29357
29386
  { required: ["scan"] },
29358
- { required: ["pluginTrust"] }
29387
+ { required: ["pluginTrust"] },
29388
+ { required: ["tutorialReminderDismissed"] }
29359
29389
  ],
29360
29390
  properties: {
29361
29391
  confirm: { type: "boolean" },
29362
29392
  allowSidecarWriters: { type: "boolean" },
29393
+ tutorialReminderDismissed: { type: "boolean" },
29363
29394
  scan: {
29364
29395
  type: "object",
29365
29396
  additionalProperties: false,
@@ -29394,6 +29425,7 @@ var parsePatchBody4 = makeBodyValidator(PATCH_BODY_SCHEMA3, {
29394
29425
  "/pluginTrust/projectEnabled:type:boolean": SERVER_TEXTS.projectPrefsTrustEnabledNotBoolean,
29395
29426
  "/confirm:type:boolean": SERVER_TEXTS.projectPrefsConfirmNotBoolean,
29396
29427
  "/allowSidecarWriters:type:boolean": SERVER_TEXTS.projectPrefsSidecarWritersNotBoolean,
29428
+ "/tutorialReminderDismissed:type:boolean": SERVER_TEXTS.projectPrefsReminderNotBoolean,
29397
29429
  "/scan/referencePaths:type:array": tx(SERVER_TEXTS.projectPrefsListNotArray, { key: "scan.referencePaths" }),
29398
29430
  "/scan/referencePaths/*:type:string": tx(SERVER_TEXTS.projectPrefsListEntryNotString, { key: "scan.referencePaths" }),
29399
29431
  "/scan/referencePaths/*:pattern": SERVER_TEXTS.projectPrefsEntryHasComma
@@ -33358,4 +33390,4 @@ function resolveBareDefault() {
33358
33390
  process.exit(ExitCode.Error);
33359
33391
  }
33360
33392
  //# sourceMappingURL=cli.js.map
33361
- //# debugId=2c7d4927-4422-59d2-a37a-59fed3a2ec80
33393
+ //# debugId=b28a958b-1d55-5195-b54e-2998b22e5818
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]="36d7449f-872d-54bb-bf4a-a57a0865bea9")}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]="302a8177-c654-50bd-828f-f658a568e578")}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.72.0",
105
+ version: "0.73.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=36d7449f-872d-54bb-bf4a-a57a0865bea9
4264
+ //# debugId=302a8177-c654-50bd-828f-f658a568e578
@@ -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]="0cf98661-b345-5259-9225-d50ee3f837db")}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]="4dbe72ce-1485-5a29-adf0-bfb088a9bad4")}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.72.0",
105
+ version: "0.73.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=0cf98661-b345-5259-9225-d50ee3f837db
4264
+ //# debugId=4dbe72ce-1485-5a29-adf0-bfb088a9bad4