@skill-map/cli 0.66.0 → 0.68.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.
Files changed (102) hide show
  1. package/dist/cli/tutorial/sm-tutorial/SKILL.md +16 -8
  2. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/agents-hub/providers/agent-skills/en/agents-hub.md +2 -0
  3. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/agents-hub/providers/agent-skills/es/agents-hub.md +2 -0
  4. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/content-editor-style/providers/agent-skills/en/content-editor-style.md +1 -0
  5. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/content-editor-style/providers/agent-skills/es/content-editor-style.md +1 -0
  6. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/en/todo-bullet-guideline.md +1 -0
  7. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/en/todo-bullet-guideline2.md +1 -0
  8. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/en/todo-bullet-skill.md +1 -0
  9. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/es/todo-bullet-guideline.md +1 -0
  10. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/es/todo-bullet-guideline2.md +1 -0
  11. package/dist/cli/tutorial/sm-tutorial/fixtures-data/edits/todo-connectors/providers/agent-skills/es/todo-bullet-skill.md +1 -0
  12. package/dist/cli/tutorial/sm-tutorial/fixtures-data/manifest.json +9 -1
  13. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/agent-skills/en/__PROVIDER__/skills/publish/SKILL.md +15 -0
  14. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/agent-skills/es/__PROVIDER__/skills/publish/SKILL.md +16 -0
  15. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/codex/en/__PROVIDER__/skills/publish/SKILL.md +15 -0
  16. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/harness/providers/codex/es/__PROVIDER__/skills/publish/SKILL.md +16 -0
  17. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/agent-skills/en/__PROVIDER__/skills/master-agent/SKILL.md +13 -0
  18. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/agent-skills/es/__PROVIDER__/skills/master-agent/SKILL.md +14 -0
  19. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/codex/en/.codex/agents/master-agent.toml +10 -0
  20. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/master/providers/codex/es/.codex/agents/master-agent.toml +10 -0
  21. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/en/AGENTS.md +7 -0
  22. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/en/__PROVIDER__/skills/content-editor/SKILL.md +20 -0
  23. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/es/AGENTS.md +7 -0
  24. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/es/__PROVIDER__/skills/content-editor/SKILL.md +20 -0
  25. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/agent-skills/shared/CLAUDE.md +1 -0
  26. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/codex/en/.codex/agents/content-editor.toml +19 -0
  27. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/portfolio/providers/codex/es/.codex/agents/content-editor.toml +19 -0
  28. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/en/.codex/agents/demo-agent.toml +13 -0
  29. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/en/__PROVIDER__/skills/demo-command/SKILL.md +11 -0
  30. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/es/.codex/agents/demo-agent.toml +13 -0
  31. package/dist/cli/tutorial/sm-tutorial/fixtures-data/sets/prologue/providers/codex/es/__PROVIDER__/skills/demo-command/SKILL.md +12 -0
  32. package/dist/cli/tutorial/sm-tutorial/references/_core.md +101 -48
  33. package/dist/cli/tutorial/sm-tutorial/references/_manifest.json +174 -0
  34. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +90 -0
  35. package/dist/cli/tutorial/sm-tutorial/references/part-basic-connect.md +166 -0
  36. package/dist/cli/tutorial/sm-tutorial/references/part-basic-daily.md +267 -0
  37. package/dist/cli/tutorial/sm-tutorial/references/part-basic-fundamentals.md +350 -0
  38. package/dist/cli/tutorial/sm-tutorial/references/part-basic-kickoff.md +140 -0
  39. package/dist/cli/tutorial/sm-tutorial/references/part-connect-harness.md +6 -4
  40. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +21 -26
  41. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +10 -5
  42. package/dist/cli/tutorial/sm-tutorial/references/part-mcp.md +3 -6
  43. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +29 -14
  44. package/dist/cli/tutorial/sm-tutorial/references/part-settings.md +17 -13
  45. package/dist/cli/tutorial/sm-tutorial/scripts/fixtures.js +85 -22
  46. package/dist/cli/tutorial/sm-tutorial/scripts/lib/paths.js +74 -4
  47. package/dist/cli/tutorial/sm-tutorial/scripts/state.js +22 -6
  48. package/dist/cli.js +527 -251
  49. package/dist/conformance/index.js +42 -2
  50. package/dist/index.js +43 -30
  51. package/dist/kernel/index.d.ts +28 -5
  52. package/dist/kernel/index.js +43 -30
  53. package/dist/ui/chunk-3ANNEMV4.js +499 -0
  54. package/dist/ui/chunk-3GDWM5VM.js +2 -0
  55. package/dist/ui/{chunk-5BJGO7GH.js → chunk-3U4QZKU2.js} +4 -4
  56. package/dist/ui/chunk-3ZAHOYQ7.js +1 -0
  57. package/dist/ui/chunk-4F53HBGG.js +1845 -0
  58. package/dist/ui/{chunk-56CBK7LB.js → chunk-6FGV5O5J.js} +1 -1
  59. package/dist/ui/chunk-7WMT2LX4.js +1 -0
  60. package/dist/ui/chunk-BJUBDHJR.js +3 -0
  61. package/dist/ui/{chunk-276RLZR4.js → chunk-BSIR3ADF.js} +14 -14
  62. package/dist/ui/{chunk-FC22ZJQZ.js → chunk-CG25RHMO.js} +1 -1
  63. package/dist/ui/chunk-EFSC6SOL.js +3 -0
  64. package/dist/ui/chunk-EJVWTBMV.js +4 -0
  65. package/dist/ui/chunk-EZI3BXQN.js +1 -0
  66. package/dist/ui/{chunk-JZ2YF7EL.js → chunk-GUPPOK7U.js} +8 -8
  67. package/dist/ui/{chunk-CJURGJTN.js → chunk-HLALESGR.js} +1 -1
  68. package/dist/ui/chunk-I3I4KHR5.js +2 -0
  69. package/dist/ui/{chunk-BOVJVOLH.js → chunk-I6ED2OW7.js} +1 -1
  70. package/dist/ui/chunk-JKPG5PO7.js +375 -0
  71. package/dist/ui/chunk-KHDWXSGR.js +1 -0
  72. package/dist/ui/{chunk-HEK4PH5A.js → chunk-KMHXNOFZ.js} +1 -1
  73. package/dist/ui/chunk-KWT7E2RJ.js +16 -0
  74. package/dist/ui/{chunk-WHZVGOS3.js → chunk-MQSU6EFZ.js} +1 -1
  75. package/dist/ui/{chunk-43S72FTV.js → chunk-OGEE252A.js} +1 -1
  76. package/dist/ui/{chunk-J4J42HJ4.js → chunk-PU5OP5RN.js} +1 -1
  77. package/dist/ui/{chunk-UTRZTB6V.js → chunk-QVG7J2MP.js} +1 -1
  78. package/dist/ui/chunk-TQBXK5JN.js +1 -0
  79. package/dist/ui/chunk-Z7SOKILO.js +2 -0
  80. package/dist/ui/{chunk-WCABR6TI.js → chunk-ZRJ5ZCFR.js} +1 -1
  81. package/dist/ui/index.html +2 -2
  82. package/dist/ui/main-ZYRIR6DB.js +4 -0
  83. package/dist/ui/styles-VEGETYWD.css +1 -0
  84. package/package.json +17 -18
  85. package/dist/ui/chunk-34ZZDYNQ.js +0 -1
  86. package/dist/ui/chunk-44VNNUSQ.js +0 -2
  87. package/dist/ui/chunk-4SG4352Z.js +0 -7
  88. package/dist/ui/chunk-5ITZXW3A.js +0 -1
  89. package/dist/ui/chunk-7ANZW2OI.js +0 -499
  90. package/dist/ui/chunk-BJ6X6WBO.js +0 -4
  91. package/dist/ui/chunk-CZSLV6YD.js +0 -1
  92. package/dist/ui/chunk-DLYJHLJX.js +0 -2
  93. package/dist/ui/chunk-LGFABCIA.js +0 -16
  94. package/dist/ui/chunk-LPDD2DHE.js +0 -369
  95. package/dist/ui/chunk-MSKP5A4B.js +0 -3
  96. package/dist/ui/chunk-P3SNMV4X.js +0 -2
  97. package/dist/ui/chunk-S4S5ZMXJ.js +0 -3
  98. package/dist/ui/chunk-VHEFRMK3.js +0 -1
  99. package/dist/ui/chunk-X6TRIDBI.js +0 -1845
  100. package/dist/ui/main-NCNZHLLJ.js +0 -4
  101. package/dist/ui/styles-I4ULXD3V.css +0 -1
  102. /package/dist/ui/{chunk-Y2Z26SRI.js → chunk-5RNLC6V4.js} +0 -0
@@ -1,10 +1,11 @@
1
1
  // conformance/index.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]="bc1fc06c-0be1-5b35-9ac6-cedcc9367962")}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]="47b9c38a-6cac-52c4-9dce-13fbbd5b35ec")}catch(e){}}();
4
4
  import { spawnSync } from "child_process";
5
5
  import { cpSync, existsSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync } from "fs";
6
6
  import { tmpdir } from "os";
7
7
  import { isAbsolute, join as join2, relative, resolve as resolve2 } from "path";
8
+ import { DatabaseSync } from "node:sqlite";
8
9
 
9
10
  // kernel/util/format-error.ts
10
11
  function formatErrorMessage(err) {
@@ -125,6 +126,11 @@ function runConformanceCase(options) {
125
126
  if (c.fixture) {
126
127
  replaceFixture(scope, fixturesRoot, c.fixture);
127
128
  }
129
+ grantFixturePluginTrust(scope, options.binary, {
130
+ ...pickSafeEnv(process.env),
131
+ ...options.env,
132
+ ...setupEnv
133
+ });
128
134
  const argv = [c.invoke.verb];
129
135
  if (c.invoke.sub) argv.push(c.invoke.sub);
130
136
  if (c.invoke.args) argv.push(...c.invoke.args);
@@ -194,6 +200,40 @@ function replaceFixture(scope, fixturesRoot, fixture) {
194
200
  const src = join2(fixturesRoot, fixture);
195
201
  cpSync(src, scope, { recursive: true });
196
202
  }
203
+ function grantFixturePluginTrust(scope, binary, env) {
204
+ const pluginsDir = join2(scope, KERNEL_SKILL_MAP_DIR, "plugins");
205
+ if (!existsSync(pluginsDir)) return;
206
+ const ids = readdirSync(pluginsDir, { withFileTypes: true }).filter((e) => e.isDirectory() && existsSync(join2(pluginsDir, e.name, "plugin.json"))).map((e) => e.name);
207
+ if (ids.length === 0) return;
208
+ const dbPath = join2(scope, KERNEL_SKILL_MAP_DIR, "skill-map.db");
209
+ if (!existsSync(dbPath)) {
210
+ spawnSync(process.execPath, [binary, "init", "--no-scan"], { cwd: scope, env, encoding: "utf8" });
211
+ }
212
+ if (!hasConfigPluginsTable(dbPath)) {
213
+ spawnSync(process.execPath, [binary, "scan"], { cwd: scope, env, encoding: "utf8" });
214
+ }
215
+ const db = new DatabaseSync(dbPath);
216
+ try {
217
+ const stmt = db.prepare(
218
+ "INSERT INTO config_plugins (plugin_id, enabled, updated_at) VALUES (?, 1, 0) ON CONFLICT(plugin_id) DO UPDATE SET enabled = 1"
219
+ );
220
+ for (const id of ids) stmt.run(id);
221
+ } finally {
222
+ db.close();
223
+ }
224
+ }
225
+ function hasConfigPluginsTable(dbPath) {
226
+ if (!existsSync(dbPath)) return false;
227
+ const db = new DatabaseSync(dbPath, { readOnly: true });
228
+ try {
229
+ const row = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'config_plugins'").get();
230
+ return row !== void 0;
231
+ } catch {
232
+ return false;
233
+ } finally {
234
+ db.close();
235
+ }
236
+ }
197
237
  function assertContained(root, rel, label) {
198
238
  if (isAbsolute(rel)) {
199
239
  throw new Error(
@@ -413,4 +453,4 @@ export {
413
453
  runConformanceCase
414
454
  };
415
455
  //# sourceMappingURL=index.js.map
416
- //# debugId=bc1fc06c-0be1-5b35-9ac6-cedcc9367962
456
+ //# debugId=47b9c38a-6cac-52c4-9dce-13fbbd5b35ec
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]="27ef1dc5-0da7-5a76-9fa8-d447025bd0d4")}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]="9e2b3a4e-2df6-5424-b6ce-30468020a39d")}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.66.0",
105
+ version: "0.68.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -175,39 +175,38 @@ var package_default = {
175
175
  clean: "rm -rf dist coverage"
176
176
  },
177
177
  dependencies: {
178
- "@hono/node-server": "2.0.1",
179
- "@sentry/node": "10.55.0",
178
+ "@hono/node-server": "2.0.6",
179
+ "@sentry/node": "10.61.0",
180
180
  "@skill-map/spec": "workspace:*",
181
- ajv: "8.18.0",
181
+ ajv: "8.20.0",
182
182
  "ajv-formats": "3.0.1",
183
183
  chokidar: "5.0.0",
184
184
  clipanion: "4.0.0-rc.4",
185
- hono: "4.12.18",
185
+ hono: "4.12.27",
186
186
  ignore: "7.0.5",
187
187
  "js-tiktoken": "1.0.21",
188
- "js-yaml": "4.1.1",
189
- kysely: "0.28.17",
190
- "posthog-node": "5.35.6",
191
- semver: "7.7.4",
192
- "smol-toml": "1.6.1",
188
+ "js-yaml": "5.1.0",
189
+ kysely: "0.29.2",
190
+ "posthog-node": "5.38.5",
191
+ semver: "7.8.5",
192
+ "smol-toml": "1.7.0",
193
193
  typanion: "3.14.0",
194
194
  ws: "8.21.0"
195
195
  },
196
196
  devDependencies: {
197
197
  "@eslint/js": "10.0.1",
198
198
  "@stylistic/eslint-plugin": "5.10.0",
199
- "@types/js-yaml": "4.0.9",
200
- "@types/node": "24.12.2",
199
+ "@types/node": "26.0.1",
201
200
  "@types/semver": "7.7.1",
202
201
  "@types/ws": "8.18.1",
203
202
  c8: "11.0.0",
204
- eslint: "10.2.1",
205
- "eslint-plugin-import-x": "4.16.2",
203
+ eslint: "10.5.0",
204
+ "eslint-plugin-import-x": "4.17.0",
206
205
  "json-schema-to-typescript": "15.0.4",
207
206
  tsup: "8.5.1",
208
- tsx: "4.22.3",
209
- typescript: "5.9.3",
210
- "typescript-eslint": "8.59.1"
207
+ tsx: "4.22.4",
208
+ typescript: "6.0.3",
209
+ "typescript-eslint": "8.62.0"
211
210
  },
212
211
  engines: {
213
212
  node: ">=24.0"
@@ -258,6 +257,20 @@ var PLUGIN_LOADER_TEXTS = {
258
257
  invalidManifestExtensionShape: "{{relEntry}}: {{errors}}. See {{docUrl}}.",
259
258
  importExceededTimeout: "import exceeded {{timeoutMs}}ms; likely a top-level side effect (network call, infinite loop, large blocking work). Move side effects into the runtime methods (`detect` / `evaluate` / `render` / etc.).",
260
259
  disabledByConfig: "disabled by config_plugins or settings.json",
260
+ /**
261
+ * Reason stamped on a project-local disk plugin discovered but not
262
+ * imported because the operator never granted local trust. Distinct
263
+ * from `disabledByConfig` (an explicit toggle-off): this id has no
264
+ * `config_plugins` override at all, so its code stays unexecuted until
265
+ * `sm plugins enable` records local intent.
266
+ */
267
+ untrustedNotLoaded: "not loaded: project-local plugin is untrusted until enabled. Run `sm plugins enable {{pluginId}}` to load it.",
268
+ /**
269
+ * One-time aggregate notice the runtime emits when project-local
270
+ * plugins were found on disk but left unloaded for lack of trust. The
271
+ * `{{count}}` plugins ride the scan without executing any code.
272
+ */
273
+ untrustedPluginsFoundNotice: "{{count}} project-local plugin(s) found in .skill-map/plugins/ but not loaded (untrusted). Their code did NOT run. Review with `sm plugins list`, then enable any you trust with `sm plugins enable <id>`.",
261
274
  invalidManifestDirMismatch: "directory name '{{dirName}}' does not match manifest id '{{manifestId}}'. Rename the directory to match the id, or update the manifest id to match the directory.",
262
275
  idCollision: "Plugin '{{id}}' at {{pathA}} collides with the plugin at {{pathB}}. Rename one and rerun.",
263
276
  loadErrorPluginIdMismatch: "{{relEntry}}: extension declares pluginId '{{declared}}' but its plugin.json declares id '{{manifestId}}'. Remove the explicit pluginId from the extension; the loader injects it from plugin.json#/id.",
@@ -2226,7 +2239,7 @@ function readDefaultsFromDisk() {
2226
2239
  }
2227
2240
 
2228
2241
  // plugins/core/parsers/frontmatter-yaml/index.ts
2229
- import yaml from "js-yaml";
2242
+ import { load as yamlLoad, JSON_SCHEMA } from "js-yaml";
2230
2243
 
2231
2244
  // kernel/util/strip-prototype-pollution.ts
2232
2245
  var FORBIDDEN_KEYS = /* @__PURE__ */ new Set([
@@ -2261,7 +2274,7 @@ var frontmatterYamlParser = {
2261
2274
  let parsed = {};
2262
2275
  const issues = [];
2263
2276
  try {
2264
- const doc = yaml.load(frontmatterRaw, { schema: yaml.JSON_SCHEMA });
2277
+ const doc = yamlLoad(frontmatterRaw, { schema: JSON_SCHEMA });
2265
2278
  if (doc && typeof doc === "object" && !Array.isArray(doc)) {
2266
2279
  parsed = stripPrototypePollution(doc);
2267
2280
  }
@@ -2559,7 +2572,7 @@ import { existsSync as existsSync5, readFileSync as readFileSync6 } from "fs";
2559
2572
  import { dirname as dirname4, resolve as resolve8 } from "path";
2560
2573
  import { createRequire as createRequire3 } from "module";
2561
2574
  import { Ajv2020 as Ajv20204 } from "ajv/dist/2020.js";
2562
- import yaml2 from "js-yaml";
2575
+ import { load as yamlLoad2, JSON_SCHEMA as JSON_SCHEMA2 } from "js-yaml";
2563
2576
  function readSidecarFor(mdAbsolutePath) {
2564
2577
  const sidecarPath = sidecarPathFor(mdAbsolutePath);
2565
2578
  if (!existsSync5(sidecarPath)) {
@@ -2577,7 +2590,7 @@ function readSidecarFor(mdAbsolutePath) {
2577
2590
  }
2578
2591
  let parsedYaml;
2579
2592
  try {
2580
- parsedYaml = yaml2.load(raw, { schema: yaml2.JSON_SCHEMA });
2593
+ parsedYaml = yamlLoad2(raw, { schema: JSON_SCHEMA2 });
2581
2594
  } catch (err) {
2582
2595
  return {
2583
2596
  parsed: null,
@@ -2712,7 +2725,7 @@ import { existsSync as existsSync8, readFileSync as readFileSync8 } from "fs";
2712
2725
  import { dirname as dirname6, resolve as resolve9 } from "path";
2713
2726
  import { createRequire as createRequire4 } from "module";
2714
2727
  import { Ajv2020 as Ajv20205 } from "ajv/dist/2020.js";
2715
- import yaml3 from "js-yaml";
2728
+ import { dump as yamlDump, load as yamlLoad3, CORE_SCHEMA, JSON_SCHEMA as JSON_SCHEMA3 } from "js-yaml";
2716
2729
 
2717
2730
  // kernel/util/atomic-write.ts
2718
2731
  import {
@@ -2734,7 +2747,7 @@ import { createHash } from "crypto";
2734
2747
  import { existsSync as existsSync9 } from "fs";
2735
2748
  import { isAbsolute as isAbsolute3, resolve as resolvePath } from "path";
2736
2749
  import "js-tiktoken/lite";
2737
- import yaml4 from "js-yaml";
2750
+ import { dump as yamlDump2, CORE_SCHEMA as CORE_SCHEMA2 } from "js-yaml";
2738
2751
 
2739
2752
  // kernel/orchestrator/frontmatter.ts
2740
2753
  function validateFrontmatter(providerFrontmatter, provider, kind, frontmatter, path, strict) {
@@ -2827,22 +2840,22 @@ function canonicalFrontmatter(parsed, raw) {
2827
2840
  if (!hasParsedKeys && hasRawText) {
2828
2841
  return raw;
2829
2842
  }
2830
- return yaml4.dump(parsed, {
2843
+ return yamlDump2(parsed, {
2831
2844
  sortKeys: true,
2832
2845
  lineWidth: -1,
2833
2846
  noRefs: true,
2834
- noCompatMode: true
2847
+ schema: CORE_SCHEMA2
2835
2848
  });
2836
2849
  }
2837
2850
  function canonicalSidecarAnnotations(annotations) {
2838
2851
  if (!annotations || typeof annotations !== "object" || Array.isArray(annotations)) {
2839
- return yaml4.dump({}, { sortKeys: true, lineWidth: -1, noRefs: true, noCompatMode: true });
2852
+ return yamlDump2({}, { sortKeys: true, lineWidth: -1, noRefs: true, schema: CORE_SCHEMA2 });
2840
2853
  }
2841
- return yaml4.dump(annotations, {
2854
+ return yamlDump2(annotations, {
2842
2855
  sortKeys: true,
2843
2856
  lineWidth: -1,
2844
2857
  noRefs: true,
2845
- noCompatMode: true
2858
+ schema: CORE_SCHEMA2
2846
2859
  });
2847
2860
  }
2848
2861
  function resolveSidecarOverlay(relativePath, nodePathForIssue, roots, liveBodyHash, liveFrontmatterHash) {
@@ -4150,4 +4163,4 @@ export {
4150
4163
  runScanWithRenames
4151
4164
  };
4152
4165
  //# sourceMappingURL=index.js.map
4153
- //# debugId=27ef1dc5-0da7-5a76-9fa8-d447025bd0d4
4166
+ //# debugId=9e2b3a4e-2df6-5424-b6ce-30468020a39d
@@ -1574,6 +1574,19 @@ interface IDiscoveredPlugin {
1574
1574
  storageSchemas?: Record<string, IPluginStorageSchema>;
1575
1575
  /** Human-readable diagnostic shown by `sm plugins list/show`. */
1576
1576
  reason?: string;
1577
+ /**
1578
+ * Runtime-only, never persisted, never spec-modeled.
1579
+ *
1580
+ * Set by the loader when a project-local disk plugin was discovered
1581
+ * (manifest parsed + surfaced) but its extension code was NOT imported
1582
+ * because the operator never granted local trust (no `config_plugins`
1583
+ * override enables the plugin or any of its extensions). The plugin
1584
+ * still rides as `status: 'disabled'` (extensions absent), this flag
1585
+ * lets the runtime distinguish "not yet trusted" from an explicit
1586
+ * `sm plugins disable`, so it can emit a one-time "found but not
1587
+ * loaded, run `sm plugins enable`" notice. See spec § Plugin trust.
1588
+ */
1589
+ untrusted?: boolean;
1577
1590
  }
1578
1591
  /**
1579
1592
  * Runtime-only, a single AJV-compiled storage schema attached to a
@@ -1720,7 +1733,7 @@ declare function makePluginStore(opts: {
1720
1733
  * a single `set` simply replaces the base.
1721
1734
  * 3. `delta`: additive (may be negative), summed.
1722
1735
  * 4. `floor`: raise to at least the value (`max`).
1723
- * 5. `ceil`: lower to at most the value (`min`) today's broken cap.
1736
+ * 5. `ceil`: lower to at most the value (`min`), today's broken cap.
1724
1737
  * Applied AFTER floor so a cap dominates a floor/ceil collision.
1725
1738
  * 6. clamp to [0,1] ONCE at the end, so opposing deltas round-trip
1726
1739
  * (e.g. `-0.4` then `+0.4` returns to base, never clipped midway).
@@ -2598,12 +2611,22 @@ interface IProviderScaffold {
2598
2611
  * traversal; the consuming verb joins it onto the cwd.
2599
2612
  */
2600
2613
  skillDir: string;
2614
+ /**
2615
+ * Optional directory the materialising verb creates so the active-lens
2616
+ * resolver picks THIS Provider when its `skillDir` is shared with another
2617
+ * lens. The open `.agents/skills` territory is read by several lenses
2618
+ * (`agent-skills`, `antigravity`, `codex`); a Provider whose skillDir is
2619
+ * that shared territory but whose lens needs a distinct marker (Codex's
2620
+ * `.codex`) declares it here, and `sm tutorial --for <id>` drops the marker
2621
+ * alongside the skill. Omitted when the skillDir's parent IS the marker.
2622
+ */
2623
+ marker?: string;
2601
2624
  /**
2602
2625
  * Display-only hints naming the agents that consume this scaffold
2603
- * territory, rendered in parentheses next to the Provider label in the
2604
- * `sm tutorial` destination prompt (e.g. `.agents/skills` is read by
2605
- * Google's Antigravity and OpenAI's Codex). Purely presentational: NOT matched by
2606
- * `--for` (only registered Provider ids are) and has no runtime effect.
2626
+ * territory AND share its tutorial track, rendered in parentheses next to
2627
+ * the Provider label in the `sm tutorial` destination prompt. Purely
2628
+ * presentational: NOT matched by `--for` (only registered Provider ids
2629
+ * are) and has no runtime effect.
2607
2630
  */
2608
2631
  aka?: readonly string[];
2609
2632
  }
@@ -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]="ffec428d-8810-5e29-bc67-ad4ec917ce6f")}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]="f36575e1-2be1-582e-9ebc-c041fd1a716b")}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.66.0",
105
+ version: "0.68.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -175,39 +175,38 @@ var package_default = {
175
175
  clean: "rm -rf dist coverage"
176
176
  },
177
177
  dependencies: {
178
- "@hono/node-server": "2.0.1",
179
- "@sentry/node": "10.55.0",
178
+ "@hono/node-server": "2.0.6",
179
+ "@sentry/node": "10.61.0",
180
180
  "@skill-map/spec": "workspace:*",
181
- ajv: "8.18.0",
181
+ ajv: "8.20.0",
182
182
  "ajv-formats": "3.0.1",
183
183
  chokidar: "5.0.0",
184
184
  clipanion: "4.0.0-rc.4",
185
- hono: "4.12.18",
185
+ hono: "4.12.27",
186
186
  ignore: "7.0.5",
187
187
  "js-tiktoken": "1.0.21",
188
- "js-yaml": "4.1.1",
189
- kysely: "0.28.17",
190
- "posthog-node": "5.35.6",
191
- semver: "7.7.4",
192
- "smol-toml": "1.6.1",
188
+ "js-yaml": "5.1.0",
189
+ kysely: "0.29.2",
190
+ "posthog-node": "5.38.5",
191
+ semver: "7.8.5",
192
+ "smol-toml": "1.7.0",
193
193
  typanion: "3.14.0",
194
194
  ws: "8.21.0"
195
195
  },
196
196
  devDependencies: {
197
197
  "@eslint/js": "10.0.1",
198
198
  "@stylistic/eslint-plugin": "5.10.0",
199
- "@types/js-yaml": "4.0.9",
200
- "@types/node": "24.12.2",
199
+ "@types/node": "26.0.1",
201
200
  "@types/semver": "7.7.1",
202
201
  "@types/ws": "8.18.1",
203
202
  c8: "11.0.0",
204
- eslint: "10.2.1",
205
- "eslint-plugin-import-x": "4.16.2",
203
+ eslint: "10.5.0",
204
+ "eslint-plugin-import-x": "4.17.0",
206
205
  "json-schema-to-typescript": "15.0.4",
207
206
  tsup: "8.5.1",
208
- tsx: "4.22.3",
209
- typescript: "5.9.3",
210
- "typescript-eslint": "8.59.1"
207
+ tsx: "4.22.4",
208
+ typescript: "6.0.3",
209
+ "typescript-eslint": "8.62.0"
211
210
  },
212
211
  engines: {
213
212
  node: ">=24.0"
@@ -258,6 +257,20 @@ var PLUGIN_LOADER_TEXTS = {
258
257
  invalidManifestExtensionShape: "{{relEntry}}: {{errors}}. See {{docUrl}}.",
259
258
  importExceededTimeout: "import exceeded {{timeoutMs}}ms; likely a top-level side effect (network call, infinite loop, large blocking work). Move side effects into the runtime methods (`detect` / `evaluate` / `render` / etc.).",
260
259
  disabledByConfig: "disabled by config_plugins or settings.json",
260
+ /**
261
+ * Reason stamped on a project-local disk plugin discovered but not
262
+ * imported because the operator never granted local trust. Distinct
263
+ * from `disabledByConfig` (an explicit toggle-off): this id has no
264
+ * `config_plugins` override at all, so its code stays unexecuted until
265
+ * `sm plugins enable` records local intent.
266
+ */
267
+ untrustedNotLoaded: "not loaded: project-local plugin is untrusted until enabled. Run `sm plugins enable {{pluginId}}` to load it.",
268
+ /**
269
+ * One-time aggregate notice the runtime emits when project-local
270
+ * plugins were found on disk but left unloaded for lack of trust. The
271
+ * `{{count}}` plugins ride the scan without executing any code.
272
+ */
273
+ untrustedPluginsFoundNotice: "{{count}} project-local plugin(s) found in .skill-map/plugins/ but not loaded (untrusted). Their code did NOT run. Review with `sm plugins list`, then enable any you trust with `sm plugins enable <id>`.",
261
274
  invalidManifestDirMismatch: "directory name '{{dirName}}' does not match manifest id '{{manifestId}}'. Rename the directory to match the id, or update the manifest id to match the directory.",
262
275
  idCollision: "Plugin '{{id}}' at {{pathA}} collides with the plugin at {{pathB}}. Rename one and rerun.",
263
276
  loadErrorPluginIdMismatch: "{{relEntry}}: extension declares pluginId '{{declared}}' but its plugin.json declares id '{{manifestId}}'. Remove the explicit pluginId from the extension; the loader injects it from plugin.json#/id.",
@@ -2226,7 +2239,7 @@ function readDefaultsFromDisk() {
2226
2239
  }
2227
2240
 
2228
2241
  // plugins/core/parsers/frontmatter-yaml/index.ts
2229
- import yaml from "js-yaml";
2242
+ import { load as yamlLoad, JSON_SCHEMA } from "js-yaml";
2230
2243
 
2231
2244
  // kernel/util/strip-prototype-pollution.ts
2232
2245
  var FORBIDDEN_KEYS = /* @__PURE__ */ new Set([
@@ -2261,7 +2274,7 @@ var frontmatterYamlParser = {
2261
2274
  let parsed = {};
2262
2275
  const issues = [];
2263
2276
  try {
2264
- const doc = yaml.load(frontmatterRaw, { schema: yaml.JSON_SCHEMA });
2277
+ const doc = yamlLoad(frontmatterRaw, { schema: JSON_SCHEMA });
2265
2278
  if (doc && typeof doc === "object" && !Array.isArray(doc)) {
2266
2279
  parsed = stripPrototypePollution(doc);
2267
2280
  }
@@ -2559,7 +2572,7 @@ import { existsSync as existsSync5, readFileSync as readFileSync6 } from "fs";
2559
2572
  import { dirname as dirname4, resolve as resolve8 } from "path";
2560
2573
  import { createRequire as createRequire3 } from "module";
2561
2574
  import { Ajv2020 as Ajv20204 } from "ajv/dist/2020.js";
2562
- import yaml2 from "js-yaml";
2575
+ import { load as yamlLoad2, JSON_SCHEMA as JSON_SCHEMA2 } from "js-yaml";
2563
2576
  function readSidecarFor(mdAbsolutePath) {
2564
2577
  const sidecarPath = sidecarPathFor(mdAbsolutePath);
2565
2578
  if (!existsSync5(sidecarPath)) {
@@ -2577,7 +2590,7 @@ function readSidecarFor(mdAbsolutePath) {
2577
2590
  }
2578
2591
  let parsedYaml;
2579
2592
  try {
2580
- parsedYaml = yaml2.load(raw, { schema: yaml2.JSON_SCHEMA });
2593
+ parsedYaml = yamlLoad2(raw, { schema: JSON_SCHEMA2 });
2581
2594
  } catch (err) {
2582
2595
  return {
2583
2596
  parsed: null,
@@ -2712,7 +2725,7 @@ import { existsSync as existsSync8, readFileSync as readFileSync8 } from "fs";
2712
2725
  import { dirname as dirname6, resolve as resolve9 } from "path";
2713
2726
  import { createRequire as createRequire4 } from "module";
2714
2727
  import { Ajv2020 as Ajv20205 } from "ajv/dist/2020.js";
2715
- import yaml3 from "js-yaml";
2728
+ import { dump as yamlDump, load as yamlLoad3, CORE_SCHEMA, JSON_SCHEMA as JSON_SCHEMA3 } from "js-yaml";
2716
2729
 
2717
2730
  // kernel/util/atomic-write.ts
2718
2731
  import {
@@ -2734,7 +2747,7 @@ import { createHash } from "crypto";
2734
2747
  import { existsSync as existsSync9 } from "fs";
2735
2748
  import { isAbsolute as isAbsolute3, resolve as resolvePath } from "path";
2736
2749
  import "js-tiktoken/lite";
2737
- import yaml4 from "js-yaml";
2750
+ import { dump as yamlDump2, CORE_SCHEMA as CORE_SCHEMA2 } from "js-yaml";
2738
2751
 
2739
2752
  // kernel/orchestrator/frontmatter.ts
2740
2753
  function validateFrontmatter(providerFrontmatter, provider, kind, frontmatter, path, strict) {
@@ -2827,22 +2840,22 @@ function canonicalFrontmatter(parsed, raw) {
2827
2840
  if (!hasParsedKeys && hasRawText) {
2828
2841
  return raw;
2829
2842
  }
2830
- return yaml4.dump(parsed, {
2843
+ return yamlDump2(parsed, {
2831
2844
  sortKeys: true,
2832
2845
  lineWidth: -1,
2833
2846
  noRefs: true,
2834
- noCompatMode: true
2847
+ schema: CORE_SCHEMA2
2835
2848
  });
2836
2849
  }
2837
2850
  function canonicalSidecarAnnotations(annotations) {
2838
2851
  if (!annotations || typeof annotations !== "object" || Array.isArray(annotations)) {
2839
- return yaml4.dump({}, { sortKeys: true, lineWidth: -1, noRefs: true, noCompatMode: true });
2852
+ return yamlDump2({}, { sortKeys: true, lineWidth: -1, noRefs: true, schema: CORE_SCHEMA2 });
2840
2853
  }
2841
- return yaml4.dump(annotations, {
2854
+ return yamlDump2(annotations, {
2842
2855
  sortKeys: true,
2843
2856
  lineWidth: -1,
2844
2857
  noRefs: true,
2845
- noCompatMode: true
2858
+ schema: CORE_SCHEMA2
2846
2859
  });
2847
2860
  }
2848
2861
  function resolveSidecarOverlay(relativePath, nodePathForIssue, roots, liveBodyHash, liveFrontmatterHash) {
@@ -4150,4 +4163,4 @@ export {
4150
4163
  runScanWithRenames
4151
4164
  };
4152
4165
  //# sourceMappingURL=index.js.map
4153
- //# debugId=ffec428d-8810-5e29-bc67-ad4ec917ce6f
4166
+ //# debugId=f36575e1-2be1-582e-9ebc-c041fd1a716b