@skill-map/cli 0.68.1 → 0.69.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 (31) hide show
  1. package/dist/cli/tutorial/sm-tutorial/references/_core.md +15 -6
  2. package/dist/cli/tutorial/sm-tutorial/references/_manifest.json +70 -70
  3. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +38 -38
  4. package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +3 -3
  5. package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +25 -8
  6. package/dist/cli/tutorial/sm-tutorial/references/part-basic-daily.md +77 -29
  7. package/dist/cli/tutorial/sm-tutorial/references/part-basic-fundamentals.md +1 -1
  8. package/dist/cli/tutorial/sm-tutorial/references/part-basic-kickoff.md +1 -1
  9. package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +1 -1
  10. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +77 -31
  11. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +3 -3
  12. package/dist/cli/tutorial/sm-tutorial/references/part-plugins.md +1 -1
  13. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +2 -2
  14. package/dist/cli/tutorial/sm-tutorial/references/part-settings.md +2 -2
  15. package/dist/cli.js +699 -326
  16. package/dist/conformance/index.js +3 -3
  17. package/dist/index.js +11 -10
  18. package/dist/kernel/index.d.ts +27 -17
  19. package/dist/kernel/index.js +11 -10
  20. package/dist/migrations/001_initial.sql +7 -3
  21. package/dist/ui/chunk-E7GLGHVY.js +1 -0
  22. package/dist/ui/chunk-RLRSNHYG.js +3 -0
  23. package/dist/ui/{chunk-22EQLC23.js → chunk-RRRXQNG6.js} +1 -1
  24. package/dist/ui/{chunk-K3ZRQNN5.js → chunk-SI4MGFOW.js} +1 -1
  25. package/dist/ui/index.html +1 -1
  26. package/dist/ui/{main-R7BIU4HU.js → main-23NGLEUB.js} +3 -3
  27. package/migrations/001_initial.sql +7 -3
  28. package/package.json +2 -2
  29. package/dist/ui/chunk-PU5OP5RN.js +0 -1
  30. package/dist/ui/chunk-TLMV4LOQ.js +0 -3
  31. /package/dist/ui/{chunk-KMHXNOFZ.js → chunk-SXSNTF26.js} +0 -0
@@ -1,6 +1,6 @@
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]="47b9c38a-6cac-52c4-9dce-13fbbd5b35ec")}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]="b6a1c282-9829-57e4-bf63-a527fcb3c207")}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";
@@ -215,7 +215,7 @@ function grantFixturePluginTrust(scope, binary, env) {
215
215
  const db = new DatabaseSync(dbPath);
216
216
  try {
217
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"
218
+ "INSERT INTO config_plugins (plugin_id, trusted, updated_at) VALUES (?, 1, 0) ON CONFLICT(plugin_id) DO UPDATE SET trusted = 1"
219
219
  );
220
220
  for (const id of ids) stmt.run(id);
221
221
  } finally {
@@ -453,4 +453,4 @@ export {
453
453
  runConformanceCase
454
454
  };
455
455
  //# sourceMappingURL=index.js.map
456
- //# debugId=47b9c38a-6cac-52c4-9dce-13fbbd5b35ec
456
+ //# debugId=b6a1c282-9829-57e4-bf63-a527fcb3c207
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]="f0a24ed1-f91a-59a8-b2b9-db8168690990")}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]="8412e979-4214-5385-b673-277f1b8e6e02")}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.68.1",
105
+ version: "0.69.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -256,21 +256,22 @@ var PLUGIN_LOADER_TEXTS = {
256
256
  // schema. Both are GitHub blob URLs.
257
257
  invalidManifestExtensionShape: "{{relEntry}}: {{errors}}. See {{docUrl}}.",
258
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.).",
259
- disabledByConfig: "disabled by config_plugins or settings.json",
259
+ disabledByConfig: "disabled by settings.json (plugins.<id>.enabled)",
260
260
  /**
261
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.
262
+ * imported because the operator never granted local import trust.
263
+ * Distinct from `disabledByConfig` (an explicit operational toggle-off
264
+ * in the config layers): this id is enabled but carries no
265
+ * `config_plugins` trust grant, so its code stays unexecuted until
266
+ * `sm plugins trust` records local consent.
266
267
  */
267
- untrustedNotLoaded: "not loaded: project-local plugin is untrusted until enabled. Run `sm plugins enable {{pluginId}}` to load it.",
268
+ untrustedNotLoaded: "not loaded: project-local plugin is enabled but not trusted on this machine. Run `sm plugins trust {{pluginId}}` to load it.",
268
269
  /**
269
270
  * One-time aggregate notice the runtime emits when project-local
270
271
  * plugins were found on disk but left unloaded for lack of trust. The
271
272
  * `{{count}}` plugins ride the scan without executing any code.
272
273
  */
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>`.",
274
+ 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 trust any you vetted with `sm plugins trust <id>`.",
274
275
  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.",
275
276
  idCollision: "Plugin '{{id}}' at {{pathA}} collides with the plugin at {{pathB}}. Rename one and rerun.",
276
277
  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.",
@@ -4163,4 +4164,4 @@ export {
4163
4164
  runScanWithRenames
4164
4165
  };
4165
4166
  //# sourceMappingURL=index.js.map
4166
- //# debugId=f0a24ed1-f91a-59a8-b2b9-db8168690990
4167
+ //# debugId=8412e979-4214-5385-b673-277f1b8e6e02
@@ -486,7 +486,7 @@ type TSettingValue = string | string[] | boolean | number | ISetting_KeyValueLis
486
486
  * to DISABLED, so the extension does not load (does not run, does not
487
487
  * register) unless the operator opts in (`sm plugins enable
488
488
  * <plugin>/<ext>`, the Settings toggle, or a `settings.json` /
489
- * `config_plugins` override). The opt-in is a plain enable override,
489
+ * `settings.local.json` override). The opt-in is a plain enable override,
490
490
  * once set it wins over the installed default exactly like any other
491
491
  * extension (so a deprecated extension can still be kept running during
492
492
  * a migration). The remaining values are presentation-only and default
@@ -2061,11 +2061,15 @@ interface IMigrateNodeFksReport {
2061
2061
  keys: Record<string, string>;
2062
2062
  }>;
2063
2063
  }
2064
- /** A single `config_plugins` override row as the kernel sees it. */
2065
- interface IPluginConfigRow {
2064
+ /**
2065
+ * A single `config_plugins` trust row as the kernel sees it. The table
2066
+ * is the per-machine import-trust store (the SECURITY axis); the
2067
+ * operational enable/disable toggle lives in the config layers, not
2068
+ * here. Keyed by the bare plugin id.
2069
+ */
2070
+ interface IPluginTrustRow {
2066
2071
  pluginId: string;
2067
- enabled: boolean;
2068
- configJson: string | null;
2072
+ trusted: boolean;
2069
2073
  updatedAt: number;
2070
2074
  }
2071
2075
  /** Discovered kernel migration file (one of `NNN_snake_case.sql`). */
@@ -4977,24 +4981,30 @@ interface StoragePort {
4977
4981
  */
4978
4982
  findActive(predicate: (issue: Issue) => boolean): Promise<IIssueRow[]>;
4979
4983
  };
4980
- pluginConfig: {
4984
+ /**
4985
+ * Per-machine plugin import-trust store (`config_plugins`, the SECURITY
4986
+ * axis). Keyed by bare plugin id. Written by `sm plugins trust /
4987
+ * untrust` and `PATCH /api/plugins/:id/trust`. The operational
4988
+ * enable/disable toggle lives in the config layers, NOT here.
4989
+ */
4990
+ trust: {
4981
4991
  /**
4982
- * Upsert the per-plugin enabled override into `config_plugins`.
4983
- * Caller is `sm plugins enable / disable`.
4992
+ * Upsert the per-plugin trust grant into `config_plugins`. Caller is
4993
+ * `sm plugins trust / untrust` (and the BFF trust route).
4984
4994
  */
4985
- set(pluginId: string, enabled: boolean): Promise<void>;
4986
- /** Read a single override; `undefined` when no row exists. */
4995
+ set(pluginId: string, trusted: boolean): Promise<void>;
4996
+ /** Read a single trust grant; `undefined` when no row exists. */
4987
4997
  get(pluginId: string): Promise<boolean | undefined>;
4988
- /** Every override row, sorted by `pluginId` for stable rendering. */
4989
- list(): Promise<IPluginConfigRow[]>;
4990
- /** Drop a single override row (no-op when absent). */
4998
+ /** Every trust row, sorted by `pluginId` for stable rendering. */
4999
+ list(): Promise<IPluginTrustRow[]>;
5000
+ /** Drop a single trust row (no-op when absent). */
4991
5001
  delete(pluginId: string): Promise<void>;
4992
5002
  /**
4993
- * Load every override into a map for quick lookup by id. Used by
4994
- * `loadPluginRuntime` to layer the DB overrides over the
4995
- * `settings.json` defaults at scan boot.
5003
+ * Load every trust grant into a map for quick lookup by bare plugin
5004
+ * id. Used by `loadPluginRuntime` to feed the import-trust gate at
5005
+ * scan boot.
4996
5006
  */
4997
- loadOverrideMap(): Promise<Map<string, boolean>>;
5007
+ loadTrustMap(): Promise<Map<string, boolean>>;
4998
5008
  };
4999
5009
  jobs: {
5000
5010
  /**
@@ -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]="7dc46367-403b-5856-87b8-23673c2d3f6c")}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]="c7e7d754-73eb-5f99-8e19-732a9f84a4c8")}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.68.1",
105
+ version: "0.69.0",
106
106
  description: "skill-map reference implementation \u2014 kernel + CLI + adapters.",
107
107
  license: "MIT",
108
108
  type: "module",
@@ -256,21 +256,22 @@ var PLUGIN_LOADER_TEXTS = {
256
256
  // schema. Both are GitHub blob URLs.
257
257
  invalidManifestExtensionShape: "{{relEntry}}: {{errors}}. See {{docUrl}}.",
258
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.).",
259
- disabledByConfig: "disabled by config_plugins or settings.json",
259
+ disabledByConfig: "disabled by settings.json (plugins.<id>.enabled)",
260
260
  /**
261
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.
262
+ * imported because the operator never granted local import trust.
263
+ * Distinct from `disabledByConfig` (an explicit operational toggle-off
264
+ * in the config layers): this id is enabled but carries no
265
+ * `config_plugins` trust grant, so its code stays unexecuted until
266
+ * `sm plugins trust` records local consent.
266
267
  */
267
- untrustedNotLoaded: "not loaded: project-local plugin is untrusted until enabled. Run `sm plugins enable {{pluginId}}` to load it.",
268
+ untrustedNotLoaded: "not loaded: project-local plugin is enabled but not trusted on this machine. Run `sm plugins trust {{pluginId}}` to load it.",
268
269
  /**
269
270
  * One-time aggregate notice the runtime emits when project-local
270
271
  * plugins were found on disk but left unloaded for lack of trust. The
271
272
  * `{{count}}` plugins ride the scan without executing any code.
272
273
  */
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>`.",
274
+ 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 trust any you vetted with `sm plugins trust <id>`.",
274
275
  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.",
275
276
  idCollision: "Plugin '{{id}}' at {{pathA}} collides with the plugin at {{pathB}}. Rename one and rerun.",
276
277
  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.",
@@ -4163,4 +4164,4 @@ export {
4163
4164
  runScanWithRenames
4164
4165
  };
4165
4166
  //# sourceMappingURL=index.js.map
4166
- //# debugId=7dc46367-403b-5856-87b8-23673c2d3f6c
4167
+ //# debugId=c7e7d754-73eb-5f99-8e19-732a9f84a4c8
@@ -241,12 +241,16 @@ CREATE TABLE state_node_favorites (
241
241
 
242
242
  -- --- Config zone -----------------------------------------------------------
243
243
 
244
+ -- Per-machine plugin import-trust store (the SECURITY axis). The
245
+ -- operational enable/disable toggle lives in the config layers
246
+ -- (settings.json / settings.local.json), NOT here. Keyed by bare plugin
247
+ -- id. Redefined inline (greenfield, no migration file, no user_version
248
+ -- bump): the scan_meta.schema_fingerprint drift path rebuilds the cache.
244
249
  CREATE TABLE config_plugins (
245
250
  plugin_id TEXT PRIMARY KEY,
246
- enabled INTEGER NOT NULL DEFAULT 1,
247
- config_json TEXT,
251
+ trusted INTEGER NOT NULL DEFAULT 0,
248
252
  updated_at INTEGER NOT NULL,
249
- CONSTRAINT ck_config_plugins_enabled CHECK (enabled IN (0,1))
253
+ CONSTRAINT ck_config_plugins_trusted CHECK (trusted IN (0,1))
250
254
  );
251
255
 
252
256
  CREATE TABLE config_preferences (
@@ -0,0 +1 @@
1
+ import{c as l,d as c,i as d}from"./chunk-SXSNTF26.js";import{K as a,P as o,ga as r,wc as s}from"./chunk-EJVWTBMV.js";var h={triggerLabel:"Settings",triggerTooltip:"Settings",modalTitle:"Settings",closeLabel:"Close",sections:{plugins:"Plugins",general:"General",project:"Project",changelog:"Changelog",about:"About"},general:{heading:"General",intro:"Per-machine preferences.",loadErrorPrefix:"Could not load preferences:",saveErrorPrefix:"Could not save preferences:",toggles:{"updateCheck.enabled":{label:"Check for updates",description:"Check npm for newer @skill-map/cli releases."},telemetry:{label:"Send anonymous error & usage reports",description:"Report crashes and which features you use. No file contents or paths.",hint:"Restart sm for this to take effect."}},extraTheme:{label:"Theme",description:"Pick a specialty theme.",options:{none:{label:"None",description:"Use the topbar dark/light toggle."}}},storageHintLabel:"Settings are stored in:",storageHintPath:"~/.skill-map/settings.json"},project:{heading:"Project",introPrefix:"These settings apply only to this project and are saved in",introPath:".skill-map/settings.local.json",introSuffix:".",loadErrorPrefix:"Could not load project settings:",saveErrorPrefix:"Could not save project settings:",sidecarWritersLabel:"Allow sidecar writers",sidecarWritersDescription:"Let actions write `.sm` files (version, tags, stability) next to your notes. Turn this off on a shared project to keep them out of the repo: the setting is committed, so it applies to the whole team.",pluginTrustLabel:"Trust plugins this project enables (this machine only)",pluginTrustDescription:"Run any plugin under .skill-map/plugins/ that the project enables, without trusting each one by hand. This applies only to your machine and is never committed. Turn it off to require per-plugin trust again.",pluginTrustConfirmHeader:"Trust every plugin this project enables?",pluginTrustConfirmIntro:"This lets any plugin the project enables run its code on this machine, including ones you have not reviewed. It applies only to your machine and is never committed.",pluginTrustConfirmAccept:"Trust project plugins",pluginTrustConfirmReject:"Cancel",referencePathsLabel:"Folders for link validation",referencePathsDescription:"If your notes link to files outside this project, list those folders here. Skill-map checks them only to confirm the links work, nothing from these folders shows up in the map.",referencePathsPlaceholder:"~/Documents/research",referencePathsInputAriaLabel:"New folder path",commaForbidden:"Add one path at a time, without commas.",addPathLabel:"Add path",removePathLabel:"Remove",confirmDialogHeader:"Allow access to folders outside this project?",confirmDialogIntro:"This change lets the scan read files in:",confirmDialogAccept:"Allow access",confirmDialogReject:"Cancel",ignorePatternsLabel:"Ignored patterns",ignorePatternsDescriptionPrefix:"Patterns that exclude files and folders from the scan, stored in",ignorePatternsDescriptionFile:".skillmapignore",ignorePatternsDescriptionMiddle:"at the project root. Same syntax as",ignorePatternsDescriptionGitignore:".gitignore",ignorePatternsDescriptionSuffix:"(one pattern per line).",ignorePatternsPlaceholder:"secrets.md",ignorePatternsInputAriaLabel:"New ignore pattern",ignorePatternEmpty:"Pattern cannot be empty or whitespace-only.",ignorePatternHasControlChar:"Pattern must be a single line without control characters.",ignorePatternDuplicate:"This pattern is already in the list.",addIgnorePatternLabel:"Add pattern",removeIgnorePatternLabel:"Remove",activeProviderLabel:"Active provider",activeProviderDescription:"Selects which provider sees this project. The map reflects how the chosen provider interprets your files.",activeProviderSourceAutodetect:"Auto-detected from your files (no value saved yet).",activeProviderSourceDefault:"No provider marker detected. Showing the universal Markdown view (nothing saved).",activeProviderDetectedPrefix:"Detected:",activeProviderDisabledSuffix:"(disabled)",activeProviderConfirmHeader:"Switch the active provider?",activeProviderConfirmIntro:"Switching will clear the persisted scan (nodes, links, issues). Jobs and history are kept. You will need to run `sm scan` after the switch.",activeProviderConfirmAccept:"Switch and clear scan",activeProviderConfirmReject:"Cancel",activeProviderSwitchedPrefix:"Lens switched. Cleared",activeProviderSwitchedSuffix:"scan table(s). Run `sm scan` to repopulate.",activeProviderSwitchedNoDb:"Lens switched. Run `sm scan` to populate the map under the new lens."},changelogHeading:"Changelog",changelogIntro:"What's new in skill-map. Each entry covers a release of @skill-map/cli (the CLI + bundled UI) and lists the user-facing changes plus the workspace(s) each one affects.",changelogEmpty:"No release notes yet. Future releases will populate this list automatically from the changesets shipped in each PR.",changelogInternalRelease:"Internal release. Focus on stability, infra, and refactors. No user-facing changes this time.",changelogAffectedPackages:"Affected packages",changelogFooterText:"Want the full changelog?",changelogFooterLinkLabel:"See it on GitHub \u2192",changelogFooterUrl:"https://github.com/crystian/skill-map/blob/main/src/CHANGELOG.md",aboutHeading:"About",aboutIntro:"Version information for the running CLI / server.",aboutCliLabel:"skill-map CLI",aboutSpecLabel:"Spec version",aboutSchemaLabel:"Schema version",aboutFolderLabel:"Project folder",aboutDbLabel:"Project DB",aboutDbValue:(e,i)=>e==="present"?i:`${e} \xB7 ${i}`,aboutLoading:"Loading\u2026",aboutUnknown:"-",aboutErrorPrefix:"Could not read health endpoint:",aboutLinksHeading:"Links",aboutWebsiteLabel:"Website",aboutGithubLabel:"GitHub",aboutWebsiteUrl:"https://skill-map.ai/",aboutGithubUrl:"https://github.com/crystian/skill-map",aboutStarHeading:"Enjoying skill-map?",aboutStarBody:"If it's useful to you, drop us a star on GitHub, it helps a lot and keeps the project alive.",aboutStarCta:"Star on GitHub",aboutStarA11y:"Open the skill-map repository on GitHub to give it a star",pluginsHeading:"Plugins",pluginsIntro:"Enable or disable installed plugins.",pluginsSearchPlaceholder:"Filter by name\u2026",pluginsSearchA11y:"Filter plugins by name",pluginsSearchEmpty:e=>`No plugins match "${e}".`,pluginsKindFilterAll:"All",pluginsKindFilterOptionA11y:(e,i)=>i?`Show only ${e} extensions`:"Show all kinds",pluginsSourceFilterOptionA11y:(e,i)=>i?`Show only ${e} plugins`:"Show all sources",pluginsFilterA11y:"Filter plugins by source and kind",pluginsFilterAllA11y:"Show every plugin (clear the source and kind filters)",pluginsProjectEmpty:"No project plugins yet. Drop one under .skill-map/plugins/ or create it with sm plugins create <id>.",unsavedChangesMessage:e=>e===1?'1 unsaved change. Click "Apply" to persist it.':`${e} unsaved changes. Click "Apply" to persist them.`,startsAsDisabledRowHint:"This plugin started disabled and is not loaded in memory. Restart `sm serve` for the change to take effect.",startsAsDisabledFooterHint:"Some plugins were disabled when the server started. Consider restarting `sm serve` so they take effect.",discardChanges:"Discard",applyAndClose:"Apply",discardA11y:"Discard pending changes",applyA11y:"Apply pending changes and refresh the map",applyErrorPrefix:"Could not apply changes:",confirmCloseTitle:"Apply pending changes?",confirmCloseBody:e=>e===1?"You have 1 unsaved change.":`You have ${e} unsaved changes.`,keepEditing:"Keep editing",sourceBuiltIn:"Built-in",sourceProject:"Project",enabledLabel:"Enabled",disabledLabel:"Disabled",lockedLabel:"Locked",lockedTooltip:"Locked by the host (cannot be toggled).",expandLabel:"Show extensions",collapseLabel:"Hide extensions",stability:{experimental:"experimental",beta:"beta",deprecated:"deprecated",tooltip:"Lifecycle stage declared by the extension manifest."},runtimeErrors:{badge:e=>e===1?"1 runtime error":`${e} runtime errors`,badgeTooltip:"This plugin loaded fine, but some of its contributions were rejected during the last scan. Expand for details.",expandLabel:"Show runtime errors",collapseLabel:"Hide runtime errors",extensionPrefix:"Extension:",slotPrefix:"Slot:",contributionPrefix:"Contribution:",a11y:{toggle:(e,i)=>`Runtime errors for plugin ${e} (${i})`}},trust:{trustLabel:"Trust",untrustLabel:"Untrust",trustedBadge:"Trusted",trustedTooltip:"You trusted this plugin to run on this machine.",trustTooltip:"Allow this plugin to run on this machine. Local only, never committed.",untrustedReason:"Enabled but not trusted on this machine, so its code does not run.",trustRestartLoad:"Restart the server to load it.",trustRestartUnload:"Restart the server to unload it.",a11y:{trust:e=>`Trust plugin ${e} to run on this machine`,untrust:e=>`Stop trusting plugin ${e}`}},pluginSection:{navLabel:e=>e,intro:"Configure this plugin's options. Changes apply when you click Apply.",formA11y:e=>`Settings for ${e}`,sectionA11y:e=>`Settings for plugin ${e}`},statusFailure:{"incompatible-spec":"Incompatible spec version","invalid-manifest":"Invalid manifest","load-error":"Failed to load","id-collision":"Plugin id collision"},loading:"Loading plugins\u2026",empty:"No plugins installed.",errorPrefix:"Could not load plugins:",toggleErrorPrefix:"Toggle failed:",a11y:{triggerLabel:"Open settings",pluginToggle:(e,i)=>i?`Enable plugin ${e}`:`Disable plugin ${e}`,extensionToggle:(e,i)=>i?`Enable ${e}`:`Disable ${e}`,pluginRow:e=>`Plugin ${e} row`,extensionRow:e=>`Extension ${e} row`}};var p={available:"Update available",copiedLabel:"Copied!",tooltip:e=>`v${e} is available. Click to copy the install command.`,copyCommand:"npm i -g @skill-map/cli@latest",copiedTooltip:"Copied! Paste it in your terminal.",npmLinkUrl:"https://www.npmjs.com/package/@skill-map/cli",npmLinkTooltip:"Open on npm",npmLinkA11y:"Open the @skill-map/cli package page on npm",a11yLabel:e=>`Update available: version ${e}, click to copy the install command`,versionLabel:e=>`v${e}`,versionTooltip:e=>`skill-map CLI v${e}`,versionA11yLabel:e=>`Running version ${e}`,fetchFailed:e=>`UpdateCheckService: fetch failed (${e})`};var S=(()=>{class e{dataSource=o(l);status=r(null);isOutdated=s(()=>this.status()?.isOutdated===!0);latest=s(()=>this.status()?.latest??null);current=s(()=>this.status()?.current??null);async load(){try{let t=await this.dataSource.getUpdateStatus();this.status.set(t)}catch(t){let n=t instanceof Error?t.message:String(t);console.warn(p.fetchFailed(n))}}static \u0275fac=function(n){return new(n||e)};static \u0275prov=a({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();var u={scanFailed:e=>`scan-trigger failed: ${e}`};var x=(()=>{class e{dataSource=o(l);loader=o(d);scanning=r(!1);scanError=r(null);async run(){if(!this.scanning()){this.scanning.set(!0),this.scanError.set(null);try{await this.dataSource.runScan(),await this.loader.load()}catch(t){let n=t instanceof c||t instanceof Error?t.message:String(t);this.scanError.set(n),console.warn(u.scanFailed(n))}finally{this.scanning.set(!1)}}}static \u0275fac=function(n){return new(n||e)};static \u0275prov=a({token:e,factory:e.\u0275fac,providedIn:"root"})}return e})();export{p as a,S as b,h as c,x as d};