mdk-skills 2.3.19 → 2.3.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.
@@ -7,8 +7,8 @@
7
7
  <script>
8
8
  (function(){var t=localStorage.getItem("mdk-theme");if(t==="dark")document.documentElement.setAttribute("data-theme","dark")})();
9
9
  </script>
10
- <script type="module" crossorigin src="/assets/index-DTyxBnEf.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-WVlw5hma.css">
10
+ <script type="module" crossorigin src="/assets/index-newKnVkp.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-CbSAZjIQ.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="app"></div>
@@ -437,12 +437,16 @@ async function handleApi(req, res) {
437
437
  const body = await parseBody(req);
438
438
  const { name, enabled } = body;
439
439
  if (!name) return sendJSON(res, { error: "缺少技能名" }, 400);
440
+ const src = path.join(pkgSkillsSource, name);
441
+ const dest = path.join(skillsDest, name);
440
442
  if (enabled) {
441
- const src = path.join(pkgSkillsSource, name);
442
- const dest = path.join(skillsDest, name);
443
443
  if (fs.existsSync(src) && !fs.existsSync(dest)) {
444
444
  copyDirSync(src, dest);
445
445
  }
446
+ } else {
447
+ if (fs.existsSync(dest)) {
448
+ fs.rmSync(dest, { recursive: true, force: true });
449
+ }
446
450
  }
447
451
  const settings = readSettings();
448
452
  if (!settings.skills) settings.skills = {};
@@ -537,6 +541,66 @@ async function handleApi(req, res) {
537
541
  return sendJSON(res, { ok: true, imported, skipped });
538
542
  }
539
543
 
544
+ // GET /api/source-names — 获取别名映射 + 已知 URL 列表
545
+ if (method === "GET" && pathname === "/api/source-names") {
546
+ const settings = readSettings();
547
+ const sourceNames = settings._sourceNames || {};
548
+ // 从 pull-source.json 汇总已拉取过的 URL
549
+ const pullSource = readPullSource();
550
+ const knownUrls = [...new Set(Object.values(pullSource).map(v => v.url))].filter(Boolean);
551
+ return sendJSON(res, { names: sourceNames, knownUrls });
552
+ }
553
+
554
+ // POST /api/source-names — 保存别名映射
555
+ if (method === "POST" && pathname === "/api/source-names") {
556
+ const body = await parseBody(req);
557
+ const settings = readSettings();
558
+ settings._sourceNames = body.names || {};
559
+ writeSettings(settings);
560
+ return sendJSON(res, { ok: true });
561
+ }
562
+
563
+ // POST /api/skills/bulk-toggle — 批量启用/禁用
564
+ if (method === "POST" && pathname === "/api/skills/bulk-toggle") {
565
+ if (!requireSource(res)) return;
566
+ const body = await parseBody(req);
567
+ const { names, enabled } = body;
568
+ if (!Array.isArray(names)) return sendJSON(res, { error: "参数错误" }, 400);
569
+ const settings = readSettings();
570
+ if (!settings.skills) settings.skills = {};
571
+ for (const name of names) {
572
+ const src = path.join(pkgSkillsSource, name);
573
+ const dest = path.join(skillsDest, name);
574
+ if (enabled) {
575
+ if (fs.existsSync(src) && !fs.existsSync(dest)) copyDirSync(src, dest);
576
+ } else {
577
+ if (fs.existsSync(dest)) fs.rmSync(dest, { recursive: true, force: true });
578
+ }
579
+ if (!settings.skills[name]) settings.skills[name] = {};
580
+ settings.skills[name].enabled = !!enabled;
581
+ }
582
+ writeSettings(settings);
583
+ return sendJSON(res, { ok: true });
584
+ }
585
+
586
+ // POST /api/skills/bulk-delete — 批量删除技能(源目录 + 项目目录)
587
+ if (method === "POST" && pathname === "/api/skills/bulk-delete") {
588
+ if (!requireSource(res)) return;
589
+ const body = await parseBody(req);
590
+ const { names } = body;
591
+ if (!Array.isArray(names) || names.length === 0) return sendJSON(res, { error: "参数错误" }, 400);
592
+ const settings = readSettings();
593
+ for (const name of names) {
594
+ const sourceDir = path.join(pkgSkillsSource, name);
595
+ const destDir = path.join(skillsDest, name);
596
+ if (fs.existsSync(sourceDir)) fs.rmSync(sourceDir, { recursive: true, force: true });
597
+ if (fs.existsSync(destDir)) fs.rmSync(destDir, { recursive: true, force: true });
598
+ if (settings.skills && settings.skills[name] !== undefined) delete settings.skills[name];
599
+ }
600
+ writeSettings(settings);
601
+ return sendJSON(res, { ok: true, deleted: names });
602
+ }
603
+
540
604
  // POST /api/skills/pull-cancel — 取消预览,清理缓存和临时目录
541
605
  if (method === "POST" && pathname === "/api/skills/pull-cancel") {
542
606
  const body = await parseBody(req);
@@ -162,3 +162,28 @@ export function createReadme(data) {
162
162
  export function cancelTask() {
163
163
  return fetch("/api/tasks/cancel", { method: "POST" }).catch(() => {});
164
164
  }
165
+
166
+ export function getSourceNames() {
167
+ return request("/source-names");
168
+ }
169
+
170
+ export function saveSourceNames(names) {
171
+ return request("/source-names", {
172
+ method: "POST",
173
+ body: JSON.stringify({ names }),
174
+ });
175
+ }
176
+
177
+ export function bulkToggleSkills(names, enabled) {
178
+ return request("/skills/bulk-toggle", {
179
+ method: "POST",
180
+ body: JSON.stringify({ names, enabled }),
181
+ });
182
+ }
183
+
184
+ export function bulkDeleteSkills(names) {
185
+ return request("/skills/bulk-delete", {
186
+ method: "POST",
187
+ body: JSON.stringify({ names }),
188
+ });
189
+ }