@michengai/dsh-skills-manager 1.2.19 → 1.2.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -18,6 +18,10 @@ import {
18
18
  getProviderSkill,
19
19
  userRoots,
20
20
  setRootPath,
21
+ addCustomSources,
22
+ updateCustomSource,
23
+ removeCustomSource,
24
+ scanCustomSourceCandidates,
21
25
  projectRoots,
22
26
  resolveWorkspaceTarget,
23
27
  listWorkspaces,
@@ -357,7 +361,7 @@ function apply(ctx, config) {
357
361
  }
358
362
  ctx.effect(() => ctx.webServer.register({
359
363
  kind: "prefix",
360
- path: "/api/dsh-skills-manager",
364
+ path: "/api/michengai/dsh-skills-manager",
361
365
  handler: async (req, res) => {
362
366
  const u = new URL(req.url, "http://localhost");
363
367
  const path = u.pathname.replace(/\/+$/, "");
@@ -400,22 +404,22 @@ function apply(ctx, config) {
400
404
  json(res, hostError.statusCode, { ok: false, code: hostError.code, error: hostError.error });
401
405
  return;
402
406
  }
403
- if (req.method === "GET" && path === "/api/dsh-skills-manager/state") {
407
+ if (req.method === "GET" && path === "/api/michengai/dsh-skills-manager/state") {
404
408
  return run(res, stateWithSources);
405
409
  }
406
- if (req.method === "GET" && path === "/api/dsh-skills-manager/sidebar-entry") {
410
+ if (req.method === "GET" && path === "/api/michengai/dsh-skills-manager/sidebar-entry") {
407
411
  return run(res, async () => ({ enabled: await getSidebarEntry() }));
408
412
  }
409
- if (req.method === "GET" && path === "/api/dsh-skills-manager/online-update") {
413
+ if (req.method === "GET" && path === "/api/michengai/dsh-skills-manager/online-update") {
410
414
  return run(res, async () => ({ enabled: await isUpdateEnabled(), locked: hostDisabled }));
411
415
  }
412
- if ((req.method === "GET" || req.method === "HEAD") && path === "/api/dsh-skills-manager/workspaces") {
416
+ if ((req.method === "GET" || req.method === "HEAD") && path === "/api/michengai/dsh-skills-manager/workspaces") {
413
417
  return run(res, async () => ({ items: await listWorkspaces(registeredWorkspacePaths(ctx) ?? []) }), void 0, req.method === "HEAD");
414
418
  }
415
- if ((req.method === "GET" || req.method === "HEAD") && path === "/api/dsh-skills-manager/repositories") {
419
+ if ((req.method === "GET" || req.method === "HEAD") && path === "/api/michengai/dsh-skills-manager/repositories") {
416
420
  return run(res, () => enqueueMutation(() => repositories.list()), void 0, req.method === "HEAD");
417
421
  }
418
- if (req.method === "GET" && (path === "/api/dsh-skills-manager/clawhub/list" || path === "/api/dsh-skills-manager/clawhub/search")) {
422
+ if (req.method === "GET" && (path === "/api/michengai/dsh-skills-manager/clawhub/list" || path === "/api/michengai/dsh-skills-manager/clawhub/search")) {
419
423
  const searching = path.endsWith("/search");
420
424
  const allowed = searching ? ["q", "limit"] : ["limit", "cursor", "sort"];
421
425
  if ([...u.searchParams.keys()].some((key) => !allowed.includes(key) || u.searchParams.getAll(key).length !== 1) || searching && !u.searchParams.has("q")) {
@@ -425,7 +429,7 @@ function apply(ctx, config) {
425
429
  const parameter = (key) => u.searchParams.get(key) ?? void 0;
426
430
  return run(res, () => searching ? searchClawHub(parameter("q"), { limit: parameter("limit") }) : listClawHub({ limit: parameter("limit"), sort: parameter("sort"), cursor: parameter("cursor") }));
427
431
  }
428
- if (req.method === "GET" && path === "/api/dsh-skills-manager/skills-sh/search") {
432
+ if (req.method === "GET" && path === "/api/michengai/dsh-skills-manager/skills-sh/search") {
429
433
  const queries = u.searchParams.getAll("q");
430
434
  if (queries.length !== 1) {
431
435
  json(res, 400, { ok: false, code: "error.catalog.query", error: "\u641C\u7D22\u8BCD\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u4E0D\u80FD\u8D85\u8FC7 100 \u4E2A\u5B57\u7B26" });
@@ -434,9 +438,9 @@ function apply(ctx, config) {
434
438
  return run(res, () => searchSkillsSh(queries[0]));
435
439
  }
436
440
  if (req.method === "HEAD") {
437
- if (path === "/api/dsh-skills-manager/state") return run(res, stateWithSources, void 0, true);
438
- if (path === "/api/dsh-skills-manager/sidebar-entry") return run(res, async () => ({ enabled: await getSidebarEntry() }), void 0, true);
439
- if (path === "/api/dsh-skills-manager/online-update") return run(res, async () => ({ enabled: await isUpdateEnabled(), locked: hostDisabled }), void 0, true);
441
+ if (path === "/api/michengai/dsh-skills-manager/state") return run(res, stateWithSources, void 0, true);
442
+ if (path === "/api/michengai/dsh-skills-manager/sidebar-entry") return run(res, async () => ({ enabled: await getSidebarEntry() }), void 0, true);
443
+ if (path === "/api/michengai/dsh-skills-manager/online-update") return run(res, async () => ({ enabled: await isUpdateEnabled(), locked: hostDisabled }), void 0, true);
440
444
  json(res, 405, { ok: false, code: "error.proto.method", error: `method not allowed: ${req.method}` }, true);
441
445
  return;
442
446
  }
@@ -449,17 +453,17 @@ function apply(ctx, config) {
449
453
  json(res, requestError.statusCode, { ok: false, code: requestError.code, error: requestError.error });
450
454
  return;
451
455
  }
452
- const body = await readBody(req, path === "/api/dsh-skills-manager/upload" ? MAX_UPLOAD_BODY_BYTES : void 0);
453
- if (path.startsWith("/api/dsh-skills-manager/repositories/") && (!body || typeof body !== "object" || Array.isArray(body))) {
456
+ const body = await readBody(req, path === "/api/michengai/dsh-skills-manager/upload" ? MAX_UPLOAD_BODY_BYTES : void 0);
457
+ if (path.startsWith("/api/michengai/dsh-skills-manager/repositories/") && (!body || typeof body !== "object" || Array.isArray(body))) {
454
458
  json(res, 400, { ok: false, code: "error.repo.invalid", error: "\u4ED3\u5E93\u53C2\u6570\u5FC5\u987B\u662F\u5BF9\u8C61" });
455
459
  return;
456
460
  }
457
- if (path === "/api/dsh-skills-manager/browse") {
461
+ if (path === "/api/michengai/dsh-skills-manager/browse") {
458
462
  return run(res, () => browseDirectories(body.path));
459
463
  }
460
- if (path === "/api/dsh-skills-manager/repositories/refresh") return run(res, () => repositories.refresh(body));
461
- if (path === "/api/dsh-skills-manager/catalog/detail") return run(res, () => readCatalogSkill(body));
462
- if (path === "/api/dsh-skills-manager/catalog/install") {
464
+ if (path === "/api/michengai/dsh-skills-manager/repositories/refresh") return run(res, () => repositories.refresh(body));
465
+ if (path === "/api/michengai/dsh-skills-manager/catalog/detail") return run(res, () => readCatalogSkill(body));
466
+ if (path === "/api/michengai/dsh-skills-manager/catalog/install") {
463
467
  return run(res, async () => {
464
468
  if (body.root !== void 0 && body.root !== "dsh" && body.root !== "agents") throw Object.assign(new Error("\u6280\u80FD\u5B89\u88C5\u4F4D\u7F6E\u65E0\u6548"), { statusCode: 400, code: "error.repo.invalid" });
465
469
  if (body.workspace !== void 0 && body.root !== void 0 && body.root !== "dsh") throw Object.assign(new Error("\u5DE5\u4F5C\u533A\u53EA\u80FD\u5B89\u88C5\u5230\u9879\u76EE DSH skills"), { statusCode: 400, code: "error.repo.invalid" });
@@ -472,7 +476,7 @@ function apply(ctx, config) {
472
476
  }
473
477
  return enqueueMutation(() => {
474
478
  switch (path) {
475
- case "/api/dsh-skills-manager/sidebar-entry":
479
+ case "/api/michengai/dsh-skills-manager/sidebar-entry":
476
480
  return run(res, async () => {
477
481
  if (!body || typeof body.enabled !== "boolean") {
478
482
  throw Object.assign(new Error("enabled \u5FC5\u987B\u662F\u5E03\u5C14\u503C"), { statusCode: 400, code: "error.proto.invalidParams" });
@@ -480,7 +484,7 @@ function apply(ctx, config) {
480
484
  const enabled = await setSidebarEntry(body.enabled);
481
485
  return { enabled };
482
486
  });
483
- case "/api/dsh-skills-manager/online-update":
487
+ case "/api/michengai/dsh-skills-manager/online-update":
484
488
  return run(res, async () => {
485
489
  if (!body || typeof body.enabled !== "boolean") {
486
490
  throw Object.assign(new Error("enabled \u5FC5\u987B\u662F\u5E03\u5C14\u503C"), { statusCode: 400, code: "error.proto.invalidParams" });
@@ -491,65 +495,73 @@ function apply(ctx, config) {
491
495
  const enabled = await setOnlineUpdate(body.enabled);
492
496
  return { enabled };
493
497
  });
494
- case "/api/dsh-skills-manager/repositories/add":
498
+ case "/api/michengai/dsh-skills-manager/repositories/add":
495
499
  return run(res, () => repositories.add(body));
496
- case "/api/dsh-skills-manager/repositories/remove":
500
+ case "/api/michengai/dsh-skills-manager/repositories/remove":
497
501
  return run(res, () => repositories.remove(body));
498
- case "/api/dsh-skills-manager/repositories/detail":
502
+ case "/api/michengai/dsh-skills-manager/repositories/detail":
499
503
  return run(res, () => repositories.detail(body));
500
- case "/api/dsh-skills-manager/repositories/install":
504
+ case "/api/michengai/dsh-skills-manager/repositories/install":
501
505
  return run(res, () => repositories.install(body, registeredWorkspacePaths(ctx)), afterWrite);
502
- case "/api/dsh-skills-manager/repositories/uninstall":
506
+ case "/api/michengai/dsh-skills-manager/repositories/uninstall":
503
507
  return run(res, () => repositories.uninstall(body), afterWrite);
504
- case "/api/dsh-skills-manager/repositories/preview":
508
+ case "/api/michengai/dsh-skills-manager/repositories/preview":
505
509
  return run(res, () => repositories.preview(body));
506
- case "/api/dsh-skills-manager/repositories/update":
510
+ case "/api/michengai/dsh-skills-manager/repositories/update":
507
511
  return run(res, () => repositories.update(body), afterWrite);
508
- case "/api/dsh-skills-manager/repositories/rollback":
512
+ case "/api/michengai/dsh-skills-manager/repositories/rollback":
509
513
  return run(res, () => repositories.rollback(body), afterWrite);
510
- case "/api/dsh-skills-manager/workspace-skills":
514
+ case "/api/michengai/dsh-skills-manager/workspace-skills":
511
515
  return run(res, async () => {
512
516
  const snapshot = await workspaceSkills(body.workspace, registeredWorkspacePaths(ctx));
513
517
  return "roots" in snapshot ? attachSources(snapshot) : snapshot;
514
518
  });
515
- case "/api/dsh-skills-manager/enable":
519
+ case "/api/michengai/dsh-skills-manager/enable":
516
520
  return run(res, () => withScope(body, async (scope) => setSkillEnabled(await requestRoot(String(body.root || "dsh"), scope?.projectCwds), String(body.name || ""), true, log)), afterWrite);
517
- case "/api/dsh-skills-manager/disable":
521
+ case "/api/michengai/dsh-skills-manager/disable":
518
522
  return run(res, () => withScope(body, async (scope) => setSkillEnabled(await requestRoot(String(body.root || "dsh"), scope?.projectCwds), String(body.name || ""), false, log)), afterWrite);
519
- case "/api/dsh-skills-manager/source-enable":
523
+ case "/api/michengai/dsh-skills-manager/source-enable":
520
524
  return run(res, () => withScope(body, (scope) => setSourceEnabled(String(body.root || ""), true, log, scopedOptions(scope))), afterWrite);
521
- case "/api/dsh-skills-manager/source-disable":
525
+ case "/api/michengai/dsh-skills-manager/source-disable":
522
526
  return run(res, () => withScope(body, (scope) => setSourceEnabled(String(body.root || ""), false, log, scopedOptions(scope))), afterWrite);
523
- case "/api/dsh-skills-manager/root-path":
527
+ case "/api/michengai/dsh-skills-manager/root-path":
524
528
  return run(res, () => setRootPath(String(body.key || ""), body.path === void 0 ? null : body.path), afterWrite);
525
- case "/api/dsh-skills-manager/category-create":
529
+ case "/api/michengai/dsh-skills-manager/custom-source-add":
530
+ return run(res, () => addCustomSources(Array.isArray(body.sources) ? body.sources : body), afterWrite);
531
+ case "/api/michengai/dsh-skills-manager/custom-source-update":
532
+ return run(res, () => updateCustomSource(String(body.id || ""), body), afterWrite);
533
+ case "/api/michengai/dsh-skills-manager/custom-source-remove":
534
+ return run(res, () => removeCustomSource(String(body.id || "")), afterWrite);
535
+ case "/api/michengai/dsh-skills-manager/custom-source-scan":
536
+ return run(res, () => scanCustomSourceCandidates(body.path));
537
+ case "/api/michengai/dsh-skills-manager/category-create":
526
538
  return run(res, () => withScope(body, (scope) => createCategory(String(body.root || ""), String(body.name || ""), log, scopedOptions(scope))));
527
- case "/api/dsh-skills-manager/category-rename":
539
+ case "/api/michengai/dsh-skills-manager/category-rename":
528
540
  return run(res, () => withScope(body, (scope) => renameCategory(String(body.root || ""), String(body.id || ""), String(body.name || ""), log, scopedOptions(scope))));
529
- case "/api/dsh-skills-manager/category-delete":
541
+ case "/api/michengai/dsh-skills-manager/category-delete":
530
542
  return run(res, () => withScope(body, (scope) => deleteCategory(String(body.root || ""), String(body.id || ""), log, scopedOptions(scope))));
531
- case "/api/dsh-skills-manager/category-assign":
543
+ case "/api/michengai/dsh-skills-manager/category-assign":
532
544
  return run(res, () => withScope(body, (scope) => assignSkillCategory(String(body.root || ""), String(body.name || ""), String(body.category || ""), log, scopedOptions(scope))));
533
- case "/api/dsh-skills-manager/category-move":
545
+ case "/api/michengai/dsh-skills-manager/category-move":
534
546
  return run(res, () => withScope(body, (scope) => moveSkillInCategory(String(body.root || ""), String(body.name || ""), String(body.category || ""), body.targetName ? String(body.targetName) : void 0, body.position === void 0 ? "before" : String(body.position), log, scopedOptions(scope))));
535
- case "/api/dsh-skills-manager/category-enable":
547
+ case "/api/michengai/dsh-skills-manager/category-enable":
536
548
  return run(res, () => withScope(body, (scope) => setCategoryEnabled(String(body.root || ""), String(body.category || ""), true, log, scopedOptions(scope))), afterWrite);
537
- case "/api/dsh-skills-manager/category-disable":
549
+ case "/api/michengai/dsh-skills-manager/category-disable":
538
550
  return run(res, () => withScope(body, (scope) => setCategoryEnabled(String(body.root || ""), String(body.category || ""), false, log, scopedOptions(scope))), afterWrite);
539
- case "/api/dsh-skills-manager/delete":
551
+ case "/api/michengai/dsh-skills-manager/delete":
540
552
  return run(res, () => withScope(body, async (scope) => {
541
553
  const target = await workspaceTarget(body);
542
554
  if (target && "ok" in target && target.ok === false) return target;
543
555
  const root = target ? target.root : await requestRoot(String(body.root || "dsh"), scope?.projectCwds);
544
556
  return repositories.trashSkill(root, String(body.name || ""));
545
557
  }), afterWrite);
546
- case "/api/dsh-skills-manager/trash-restore":
558
+ case "/api/michengai/dsh-skills-manager/trash-restore":
547
559
  return run(res, () => withScope(body, (scope) => repositories.restoreTrash(String(body.id || ""), { ...scope ?? {}, registeredWorkspaces: registeredWorkspacePaths(ctx) })), afterWrite);
548
- case "/api/dsh-skills-manager/trash-delete":
560
+ case "/api/michengai/dsh-skills-manager/trash-delete":
549
561
  return run(res, () => repositories.permanentlyDeleteTrash(String(body.id || "")));
550
- case "/api/dsh-skills-manager/detail":
562
+ case "/api/michengai/dsh-skills-manager/detail":
551
563
  return run(res, () => withScope(body, (scope) => skillDetail(String(body.root || "dsh"), String(body.name || ""), scope ? { ...scope, workspaceBound: true } : projectOptions())));
552
- case "/api/dsh-skills-manager/create":
564
+ case "/api/michengai/dsh-skills-manager/create":
553
565
  return run(res, async () => {
554
566
  const target = await workspaceTarget(body);
555
567
  if (target && "ok" in target && target.ok === false) return target;
@@ -559,7 +571,7 @@ function apply(ctx, config) {
559
571
  { root: target ? target.root : await requestRoot(String(body.root || "dsh")) }
560
572
  );
561
573
  }, afterWrite);
562
- case "/api/dsh-skills-manager/import":
574
+ case "/api/michengai/dsh-skills-manager/import":
563
575
  return run(res, async () => {
564
576
  const target = await workspaceTarget(body);
565
577
  if (target && "ok" in target && target.ok === false) return target;
@@ -569,7 +581,7 @@ function apply(ctx, config) {
569
581
  ...target ? { root: target.root } : body.root === "agents" ? { root: await requestRoot("agents") } : {}
570
582
  });
571
583
  }, body.dryRun === true ? void 0 : afterWrite);
572
- case "/api/dsh-skills-manager/upload":
584
+ case "/api/michengai/dsh-skills-manager/upload":
573
585
  return run(res, async () => {
574
586
  const target = await workspaceTarget(body);
575
587
  if (target && "ok" in target && target.ok === false) return target;
@@ -1,7 +1,7 @@
1
1
  import { promises as fs } from "node:fs";
2
2
  import { join, dirname, resolve } from "node:path";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
- import { managerHomePath, userRoots, checkedRepositoryRootDefinition, projectRootForRecord, resolveWorkspaceTarget, createWorkspaceIndex } from "./core.js";
4
+ import { managerHomePath, userRoots, checkedRepositoryRootDefinition, projectRootForRecord, resolveWorkspaceTarget, createWorkspaceIndex, renameWithRetry } from "./core.js";
5
5
  const hash = (bytes) => createHash("sha256").update(bytes).digest("hex");
6
6
  const repositoryInstallKeys = /* @__PURE__ */ new Set(["dsh", "agents"]);
7
7
  function repositoryInstallRoot(key = "dsh") {
@@ -129,9 +129,9 @@ function createRepositoryUpdater({ read, write, repository, download, serialize,
129
129
  delete previous.backup;
130
130
  const nextRecord = rollback ? { ...record.backup.record } : { ...previous, commit: plan.commit, files: plan.next };
131
131
  nextRecord.backup = { key, fingerprint: signature(plan.current), record: previous };
132
- await fs.rename(target, backup);
132
+ await renameWithRetry(target, backup);
133
133
  moved = true;
134
- await fs.rename(stage, target);
134
+ await renameWithRetry(stage, target);
135
135
  replaced = true;
136
136
  data.installs[data.installs.indexOf(record)] = nextRecord;
137
137
  await write(data);
@@ -139,8 +139,8 @@ function createRepositoryUpdater({ read, write, repository, download, serialize,
139
139
  const error = caught;
140
140
  if (moved) {
141
141
  try {
142
- if (replaced) await fs.rename(target, stage);
143
- await fs.rename(backup, target);
142
+ if (replaced) await renameWithRetry(target, stage);
143
+ await renameWithRetry(backup, target);
144
144
  } catch {
145
145
  recoveryFailed = true;
146
146
  throw failure("\u81EA\u52A8\u6062\u590D\u5931\u8D25\uFF0C\u539F\u6587\u4EF6\u4FDD\u7559\u5728\u5907\u4EFD\u76EE\u5F55\uFF0C\u8BF7\u52FF\u91CD\u590D\u64CD\u4F5C", "error.repo.state");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michengai/dsh-skills-manager",
3
- "version": "1.2.19",
3
+ "version": "1.2.21",
4
4
  "description": "DSH Skills Manager — 在 DeepSeek Harness 中统一加载并安全管理本机 Agent Skills · Load and safely manage local Agent Skills in DSH",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "scripts": {
45
45
  "build": "node scripts/build.mjs",
46
- "test": "node scripts/check-committed-lib.mjs && npm run typecheck && npm run build && node test/build-test.mjs && node test/api-base.test.mjs && node test/route-lifecycle.test.mjs && node test/repositories.test.mjs && node test/repository-install-targets.test.mjs && node test/workspace-target.test.mjs && node test/workspace-routes.test.mjs && node test/workspace-list.test.mjs && node test/destination-picker.test.mjs && node test/workspace-project-page.test.mjs && node test/repository-ui.test.mjs && node test/catalog-skill.test.mjs && node test/skills-sh-catalog.test.mjs && node test/clawhub-catalog.test.mjs && node --test test/catalog-state.test.mjs test/catalog-lifecycle.test.mjs && node test/theme-select.test.mjs && node --test test/antd-theme.browser.test.mjs && node test/host-fallback.test.mjs && node test/repository-routes.test.mjs && node test/core-test.mjs && node test/root-path.test.mjs && node test/disabled-external-native.test.mjs && node test/categories.test.mjs && node test/categories-ui.test.mjs && node --experimental-strip-types --test test/settings-nav-icon.test.mjs && node test/readonly-discovery.test.mjs && node test/project-root-skills.test.mjs && node test/project-sources.test.mjs && node test/locale-test.mjs && node --test test/plugin-updater.test.mjs && node test/plugin-update-locale.test.mjs && node test/client-scope.test.mjs && node test/compatibility-options-test.mjs && node test/sidebar-entry.test.mjs && node --test test/sidebar-entry-lifecycle.test.mjs test/plugin-update-visibility.test.mjs && node test/online-update.test.mjs",
46
+ "test": "node scripts/check-committed-lib.mjs && npm run typecheck && npm run build && node test/build-test.mjs && node test/api-base.test.mjs && node test/route-lifecycle.test.mjs && node test/repositories.test.mjs && node test/repository-install-targets.test.mjs && node test/workspace-target.test.mjs && node test/workspace-routes.test.mjs && node test/workspace-list.test.mjs && node test/destination-picker.test.mjs && node test/workspace-project-page.test.mjs && node test/repository-ui.test.mjs && node test/catalog-skill.test.mjs && node test/skills-sh-catalog.test.mjs && node test/clawhub-catalog.test.mjs && node --test test/catalog-state.test.mjs test/catalog-lifecycle.test.mjs && node test/theme-select.test.mjs && node --test test/antd-theme.browser.test.mjs && node test/host-fallback.test.mjs && node test/repository-routes.test.mjs && node test/core-test.mjs && node test/root-path.test.mjs && node test/custom-sources.test.mjs && node test/disabled-external-native.test.mjs && node test/categories.test.mjs && node test/categories-ui.test.mjs && node --experimental-strip-types --test test/settings-nav-icon.test.mjs && node test/readonly-discovery.test.mjs && node test/project-root-skills.test.mjs && node test/project-sources.test.mjs && node test/locale-test.mjs && node --test test/plugin-updater.test.mjs && node test/plugin-update-locale.test.mjs && node test/client-scope.test.mjs && node test/compatibility-options-test.mjs && node test/sidebar-entry.test.mjs && node --test test/sidebar-entry-lifecycle.test.mjs test/plugin-update-visibility.test.mjs && node test/online-update.test.mjs",
47
47
  "verify": "node scripts/sync-hosts.mjs && npm test && npm run pack:check && node test/pack-test.mjs",
48
48
  "pack:check": "npm pack --dry-run --json",
49
49
  "prepack": "npm run typecheck && npm run build",
@@ -102,5 +102,6 @@
102
102
  ],
103
103
  "dependencies": {
104
104
  "fflate": "0.8.3"
105
- }
105
+ },
106
+ "icon": "assets/icon.svg"
106
107
  }