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.
- package/.claude/settings.json +77 -2
- package/.claude/skills/android-cli/.meta.json +6 -0
- package/.claude/skills/android-cli/SKILL.md +207 -0
- package/.claude/skills/android-cli/references/interact.md +83 -0
- package/.claude/skills/android-cli/references/journeys.md +97 -0
- package/package.json +1 -1
- package/scripts/web-ui/dist/assets/index-CbSAZjIQ.css +1 -0
- package/scripts/web-ui/dist/assets/{index-DTyxBnEf.js → index-newKnVkp.js} +26 -26
- package/scripts/web-ui/dist/index.html +2 -2
- package/scripts/web-ui/server.js +66 -2
- package/scripts/web-ui/src/api/skills.js +25 -0
- package/scripts/web-ui/src/views/Dashboard.vue +396 -32
- package/scripts/web-ui/src/views/SceneSwitch.vue +3 -0
- package/scripts/web-ui/dist/assets/index-WVlw5hma.css +0 -1
|
@@ -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-
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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>
|
package/scripts/web-ui/server.js
CHANGED
|
@@ -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
|
+
}
|