mdk-skills 2.4.0 → 2.4.2
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/package.json +4 -2
- package/scripts/web-ui/dist/assets/index-B5lUvD80.css +1 -0
- package/scripts/web-ui/dist/assets/{index-Bu8b9gwQ.js → index-c2voeFwQ.js} +2 -2
- package/scripts/web-ui/dist/index.html +2 -2
- package/scripts/web-ui/dist/assets/index-CfvkkgtO.css +0 -1
- package/scripts/web-ui/index.html +0 -15
- package/scripts/web-ui/src/App.vue +0 -195
- package/scripts/web-ui/src/api/skills.js +0 -207
- package/scripts/web-ui/src/components/ModalComp.vue +0 -182
- package/scripts/web-ui/src/components/SkillCard.vue +0 -99
- package/scripts/web-ui/src/components/StatusBar.vue +0 -87
- package/scripts/web-ui/src/main.js +0 -10
- package/scripts/web-ui/src/router/index.js +0 -17
- package/scripts/web-ui/src/styles/main.css +0 -352
- package/scripts/web-ui/src/utils/usage.js +0 -46
- package/scripts/web-ui/src/views/Dashboard.vue +0 -1697
- package/scripts/web-ui/src/views/ReadmeView.vue +0 -115
- package/scripts/web-ui/src/views/SceneSwitch.vue +0 -1361
- package/scripts/web-ui/src/views/Settings.vue +0 -529
- package/scripts/web-ui/vite.config.js +0 -11
|
@@ -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-c2voeFwQ.js"></script>
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/assets/index-B5lUvD80.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="app"></div>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*{box-sizing:border-box;margin:0;padding:0}html,body,#app{background:#f5f7fa;height:100%}body{overflow-y:auto}*{scrollbar-width:none;-ms-overflow-style:none}::-webkit-scrollbar{display:none}.app-layout{flex-direction:column;min-height:100vh;padding-top:56px;display:flex}.app-header{z-index:100;background:#fff;border-bottom:1px solid #e5e7eb;align-items:center;height:56px;padding:0 24px;display:flex;position:fixed;top:0;left:0;right:0}.header-inner{justify-content:space-between;align-items:center;width:100%;display:flex}.header-left{align-items:center;gap:32px;display:flex}.logo{color:#1a1a1a;white-space:nowrap;font-size:18px;font-weight:700}.app-content{flex:1;width:100%;max-width:1000px;margin:0 auto;padding:24px}.markdown-content{color:#333;word-wrap:break-word;font-size:14px;line-height:1.7;overflow:auto}.markdown-content h1{border-bottom:1px solid #eee;margin:20px 0 12px;padding-bottom:8px;font-size:22px;font-weight:700}.markdown-content h2{border-bottom:1px solid #eee;margin:18px 0 10px;padding-bottom:6px;font-size:18px;font-weight:700}.markdown-content h3{margin:16px 0 8px;font-size:16px;font-weight:600}.markdown-content h4{margin:14px 0 6px;font-size:14px;font-weight:600}.markdown-content h5,.markdown-content h6{margin:12px 0 6px;font-size:13px;font-weight:600}.markdown-content p{margin:8px 0}.markdown-content ul,.markdown-content ol{margin:8px 0;padding-left:24px}.markdown-content li{margin:4px 0}.markdown-content blockquote{color:#555;background:#f0f7ff;border-left:4px solid #2080f0;margin:10px 0;padding:8px 16px}.markdown-content blockquote p{margin:4px 0}.markdown-content a{color:#2080f0;text-decoration:none}.markdown-content a:hover{text-decoration:underline}.markdown-content hr{border:none;border-top:1px solid #e0e0e0;margin:16px 0}.markdown-content table{border-collapse:collapse;width:100%;margin:12px 0;font-size:13px}.markdown-content th,.markdown-content td{text-align:left;border:1px solid #e0e0e0;padding:8px 12px}.markdown-content th{background:#f5f7fa;font-weight:600}.markdown-content tr:nth-child(2n) td{background:#fafafa}.markdown-content img{border-radius:4px;max-width:100%;margin:8px 0}.markdown-content code{color:#d63384;background:#f0f0f0;border-radius:3px;padding:2px 6px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.markdown-content pre{border:1px solid #e8e8e8;border-radius:6px;margin:12px 0;padding:0;position:relative;overflow:hidden}.markdown-content pre code{color:#333;tab-size:2;background:#f8f9fa;padding:14px 16px;font-size:13px;line-height:1.5;display:block;overflow-x:auto}.markdown-content pre .copy-btn{color:#999;cursor:pointer;opacity:0;background:#fff;border:1px solid #e0e0e0;border-radius:4px;padding:3px 8px;font-size:11px;transition:opacity .2s;position:absolute;top:6px;right:6px}.readme-fold{border:1px solid #e5e7eb;border-radius:6px;margin-bottom:20px;overflow:hidden}.fold-header{cursor:pointer;-webkit-user-select:none;user-select:none;background:#fafafa;align-items:center;gap:6px;padding:10px 16px;font-size:14px;font-weight:600;display:flex}.fold-header:hover{background:#f0f0f0}.fold-arrow{color:#999;font-size:11px;transition:transform .2s}.fold-arrow.open{transform:rotate(90deg)}.fold-body{padding:0 16px 16px}.markdown-content pre:hover .copy-btn{opacity:1}.markdown-content pre .copy-btn:hover{color:#2080f0;border-color:#2080f0}.header-right{align-items:center;gap:8px;display:flex}html,body,#app,.app-header,.app-content,.logo,.readme-fold,.fold-header,.fold-body,.markdown-content,[class*=n-]{transition:background-color .3s,color .3s,border-color .3s,box-shadow .3s}[data-theme=dark] html,[data-theme=dark] body,[data-theme=dark] #app{background:#1e1e2e}[data-theme=dark] .app-header{background:#1e1e2e;border-bottom-color:#363650}[data-theme=dark] .app-content{background:0 0}[data-theme=dark] .logo{color:#e4e4ef}[data-theme=dark] .header-status-item{color:#a6adc8}[data-theme=dark] .header-status-item.clickable:hover{color:#6a8cff}[data-theme=dark] .header-status-divider{background:#363650}[data-theme=dark] .readme-fold{border-color:#363650}[data-theme=dark] .fold-header{color:#e4e4ef;background:#282840}[data-theme=dark] .fold-header:hover{background:#323250}[data-theme=dark] .fold-body{background:#282840}[data-theme=dark] .markdown-content{color:#cdd6f4}[data-theme=dark] .markdown-content h1,[data-theme=dark] .markdown-content h2{color:#e4e4ef;border-bottom-color:#363650}[data-theme=dark] .markdown-content h3,[data-theme=dark] .markdown-content h4{color:#e4e4ef}[data-theme=dark] .markdown-content code{color:#e06c75;background:#2a2a42}[data-theme=dark] .markdown-content pre{border-color:#363650}[data-theme=dark] .markdown-content pre code{color:#cdd6f4;background:#1a1a2a}[data-theme=dark] .markdown-content blockquote{color:#a6adc8;background:#282840;border-left-color:#6a8cff}[data-theme=dark] .markdown-content a{color:#6a8cff}[data-theme=dark] .markdown-content th{background:#282840}[data-theme=dark] .markdown-content td{border-color:#363650}[data-theme=dark] .markdown-content tr:nth-child(2n) td{background:#24243a}[data-theme=dark] .markdown-content hr{border-top-color:#363650}[data-theme=dark] .markdown-content img{filter:brightness(.8)}[data-theme=dark] .markdown-content pre .copy-btn{color:#6c7086;background:#2a2a42;border-color:#363650}[data-theme=dark] .markdown-content pre .copy-btn:hover{color:#6a8cff;border-color:#6a8cff}[data-theme=dark] .hljs-keyword,[data-theme=dark] .hljs-selector-tag,[data-theme=dark] .hljs-built_in{color:#c678dd}[data-theme=dark] .hljs-string,[data-theme=dark] .hljs-addition{color:#98c379}[data-theme=dark] .hljs-number,[data-theme=dark] .hljs-literal{color:#d19a66}[data-theme=dark] .hljs-comment{color:#5c6370}[data-theme=dark] .hljs-title,[data-theme=dark] .hljs-section{color:#61afef}[data-theme=dark] .hljs-attr,[data-theme=dark] .hljs-attribute,[data-theme=dark] .hljs-selector-class,[data-theme=dark] .hljs-variable{color:#e06c75}[data-theme=dark] .hljs-type,[data-theme=dark] .hljs-meta{color:#e5c07b}[data-theme=dark] .hljs-deletion{color:#e06c75}[data-theme=dark] .hljs-bullet,[data-theme=dark] .hljs-link{color:#6a8cff}[data-theme=dark] .hljs-emphasis{font-style:italic}[data-theme=dark] .hljs-strong{font-weight:700}[data-theme=dark] .page-header h2{color:#e4e4ef}[data-theme=dark] .scene-desc{color:#a6adc8}.fade-enter-active,.fade-leave-active{transition:opacity .2s,transform .2s}.fade-enter-from{opacity:0;transform:translateY(6px)}.fade-leave-to{opacity:0}.header-status{align-items:center;gap:8px;margin-right:8px;display:flex}.header-status-item{color:#666;white-space:nowrap;align-items:center;gap:4px;font-size:12px;display:flex}.header-status-item.clickable{cursor:pointer}.header-status-item.clickable:hover{color:#2080f0}.header-status-divider{background:#e0e0e0;width:1px;height:14px}.skill-card[data-v-a875b7ef]{cursor:pointer;transition:box-shadow .2s}.skill-card[data-v-a875b7ef]:hover{box-shadow:0 2px 8px #00000014}.skill-meta[data-v-a875b7ef]{align-items:center;gap:8px;margin-bottom:8px;display:flex}.skill-version[data-v-a875b7ef]{color:#888;font-family:monospace;font-size:12px}.skill-desc[data-v-a875b7ef]{color:#666;text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:13px;overflow:hidden}[data-theme=dark] .skill-version{color:#9399b2}[data-theme=dark] .skill-desc{color:#a6adc8}.modal-overlay[data-v-6c73fe2b]{z-index:2000;background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal-card[data-v-6c73fe2b]{background:#fff;border-radius:8px;flex-direction:column;width:90%;max-height:85vh;display:flex;box-shadow:0 8px 32px #0000001f}.modal-header[data-v-6c73fe2b]{justify-content:space-between;align-items:center;padding:14px 20px 0;display:flex}.modal-title[data-v-6c73fe2b]{color:#333;font-size:16px;font-weight:600}.modal-close[data-v-6c73fe2b]{color:#999;cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;width:28px;height:28px;font-size:20px;line-height:1;transition:background .15s,color .15s;display:flex}.modal-close[data-v-6c73fe2b]:hover{color:#333;background:#f0f0f0}.modal-body[data-v-6c73fe2b]{padding:16px 20px;overflow-y:auto}.modal-footer[data-v-6c73fe2b]{border-top:1px solid #f0f0f0;justify-content:flex-end;gap:8px;padding:12px 20px 16px;display:flex}.modal-fade-enter-active[data-v-6c73fe2b]{transition:opacity .2s}.modal-fade-leave-active[data-v-6c73fe2b]{transition:opacity .15s}.modal-fade-enter-from[data-v-6c73fe2b],.modal-fade-leave-to[data-v-6c73fe2b]{opacity:0}[data-theme=dark] .modal-card{background:#2a2a42;box-shadow:0 8px 32px #00000080}[data-theme=dark] .modal-title{color:#e4e4ef}[data-theme=dark] .modal-close{color:#6c7086}[data-theme=dark] .modal-close:hover{color:#cdd6f4;background:#323250}[data-theme=dark] .modal-footer{border-top-color:#363650}[data-theme=dark] .modal-overlay{background:#000000a6}.dashboard[data-v-d9ef6284]{overflow-anchor:auto}.page-header[data-v-d9ef6284]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-bottom:4px;display:flex}.page-header h2[data-v-d9ef6284]{font-size:20px;font-weight:600}.header-actions[data-v-d9ef6284]{align-items:center;gap:8px;display:flex}.tag-filter[data-v-d9ef6284]{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:16px;display:flex}.search-bar[data-v-d9ef6284]{margin-bottom:12px}.detail-status[data-v-d9ef6284]{justify-content:center;padding:40px 0;display:flex}.detail-body[data-v-d9ef6284]{max-height:65vh;overflow-y:auto}.edit-panel[data-v-d9ef6284]{margin-bottom:4px}.edit-row[data-v-d9ef6284]{align-items:flex-start;gap:10px;margin-bottom:10px;display:flex}.edit-label[data-v-d9ef6284]{color:#888;flex-shrink:0;width:50px;font-size:13px;line-height:30px}.update-count-hint[data-v-d9ef6284]{color:#e68a00;margin-left:8px;font-family:monospace;font-size:12px}.pull-modal-body[data-v-d9ef6284]{min-height:100px}.pull-status[data-v-d9ef6284]{color:#666;justify-content:center;align-items:center;gap:10px;padding:24px 0;font-size:13px;display:flex}.preview-result[data-v-d9ef6284]{margin-top:8px}.pull-search-input[data-v-d9ef6284]{margin-bottom:8px}.preview-info[data-v-d9ef6284]{color:#555;align-items:center;gap:8px;margin-bottom:10px;font-size:13px;display:flex}.preview-list[data-v-d9ef6284]{background:#00000005;border-radius:6px;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px;max-height:300px;margin-bottom:14px;padding:10px;display:grid;overflow-y:auto}.preview-actions[data-v-d9ef6284]{justify-content:flex-end;gap:8px;display:flex}.pull-section[data-v-d9ef6284]{margin-top:12px}.pull-input-row[data-v-d9ef6284]{gap:8px;margin-bottom:8px;display:flex}.pull-input-row .n-input[data-v-d9ef6284]{flex:1}.pull-error[data-v-d9ef6284]{margin-bottom:8px}.pull-result[data-v-d9ef6284]{margin-top:8px}.pull-result-line[data-v-d9ef6284]{flex-wrap:wrap;align-items:center;gap:4px;margin-bottom:8px;font-size:13px;display:flex}.pull-result-label[data-v-d9ef6284]{color:#888;flex-shrink:0}.pull-result-hint[data-v-d9ef6284]{color:#999;font-size:12px}.install-panel[data-v-d9ef6284]{background:#00000005;border-radius:6px;margin-top:12px;padding:12px}.install-panel-label[data-v-d9ef6284]{color:#666;margin-bottom:8px;font-size:13px}.install-check-list[data-v-d9ef6284]{margin-bottom:10px}.install-btn[data-v-d9ef6284]{float:right}.edit-actions[data-v-d9ef6284]{justify-content:flex-end;gap:8px;display:flex}.alias-edit-trigger[data-v-d9ef6284]{cursor:pointer;opacity:0;vertical-align:middle;align-items:center;transition:opacity .15s;display:inline-flex}.group-header:hover .alias-edit-trigger[data-v-d9ef6284]{opacity:1}.alias-edit-icon[data-v-d9ef6284]{color:#999}.alias-edit-inline[data-v-d9ef6284]{align-items:center;display:inline-flex}.group-menu-btn[data-v-d9ef6284]{flex-shrink:0}.source-manager[data-v-d9ef6284]{background:#00000005;border-radius:6px;margin-top:8px;padding:10px}.source-manager-header[data-v-d9ef6284]{justify-content:space-between;align-items:center;margin-bottom:8px;display:flex}.source-manager-title[data-v-d9ef6284]{font-size:13px;font-weight:600}.source-manager-list[data-v-d9ef6284]{flex-direction:column;gap:6px;max-height:240px;display:flex;overflow-y:auto}.source-manager-row[data-v-d9ef6284]{align-items:center;gap:8px;display:flex}.source-manager-url[data-v-d9ef6284]{color:#888;text-overflow:ellipsis;white-space:nowrap;flex:1;font-family:monospace;font-size:11px;overflow:hidden}.source-manager-empty[data-v-d9ef6284]{color:#999;text-align:center;padding:12px 0;font-size:12px}.source-manager-actions[data-v-d9ef6284]{justify-content:flex-end;margin-top:8px;display:flex}.installed-tag[data-v-d9ef6284]{margin-left:4px}.skill-group[data-v-d9ef6284]{margin-bottom:4px}.group-header[data-v-d9ef6284]{cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;gap:8px;padding:8px 4px;display:flex}.group-header[data-v-d9ef6284]:hover{background:#00000008}.fold-arrow[data-v-d9ef6284]{color:#999;flex-shrink:0;font-size:10px;transition:transform .2s}.fold-arrow.open[data-v-d9ef6284]{transform:rotate(90deg)}.group-label[data-v-d9ef6284]{color:inherit;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.group-count[data-v-d9ef6284]{color:#999;flex-shrink:0;font-size:12px}.group-update-btn[data-v-d9ef6284]{flex-shrink:0}.group-body[data-v-d9ef6284]{grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:8px;display:grid}.readme-fold[data-v-d9ef6284]{border-top:1px solid #80808026;margin-top:24px;padding-top:12px}.setup-card[data-v-d9ef6284]{margin-bottom:20px}.setup-card-content[data-v-d9ef6284]{text-align:center;flex-direction:column;align-items:center;gap:12px;padding:32px 16px;display:flex}.setup-icon[data-v-d9ef6284]{margin-bottom:4px}.setup-title[data-v-d9ef6284]{margin:0;font-size:18px;font-weight:600}.setup-desc[data-v-d9ef6284]{color:#666;max-width:420px;margin:0;font-size:13px;line-height:1.6}.setup-desc code[data-v-d9ef6284]{background:#0000000f;border-radius:3px;padding:1px 6px;font-size:12px}.skill-group.group-remote[data-v-d9ef6284]{border-left:3px solid #2080f0;margin-bottom:12px;padding-left:8px}.skill-group.group-local[data-v-d9ef6284]{border-left:3px solid #18a058;margin-bottom:12px;padding-left:8px}.group-indicator[data-v-d9ef6284]{border-radius:50%;flex-shrink:0;width:6px;height:6px;display:inline-block}.indicator-remote[data-v-d9ef6284]{background:#2080f0}.indicator-local[data-v-d9ef6284]{background:#18a058}.source-info[data-v-d9ef6284]{margin-bottom:4px}.source-row[data-v-d9ef6284]{align-items:center;gap:10px;margin-bottom:6px;font-size:13px;display:flex}.source-label[data-v-d9ef6284]{color:#888;flex-shrink:0;width:70px}.source-value[data-v-d9ef6284]{word-break:break-all}.local-tag[data-v-d9ef6284]{color:#2e7d32;background:#e8f5e9;border-radius:3px;padding:1px 8px;font-size:12px;display:inline-block}.path-text[data-v-d9ef6284]{color:#666;font-family:monospace;font-size:12px}.source-actions[data-v-d9ef6284]{gap:8px;margin-top:8px;display:flex}.local-hint[data-v-d9ef6284]{color:#999;background:#00000005;border-radius:4px;margin-top:8px;padding:8px;font-size:12px;line-height:1.5}.siblings-body[data-v-d9ef6284]{min-height:60px}.siblings-desc[data-v-d9ef6284]{margin-bottom:12px;font-size:13px;line-height:1.6}.siblings-list[data-v-d9ef6284]{flex-direction:column;gap:8px;margin-bottom:16px;display:flex}.siblings-actions[data-v-d9ef6284]{justify-content:flex-end;gap:8px;display:flex}.batch-modal-body[data-v-d9ef6284]{min-height:60px}.batch-desc[data-v-d9ef6284]{margin-bottom:16px;font-size:13px;line-height:1.6}.batch-actions[data-v-d9ef6284]{justify-content:flex-end;gap:8px;display:flex}.batch-executing[data-v-d9ef6284]{color:#666;justify-content:center;align-items:center;gap:12px;padding:24px 0;font-size:13px;display:flex}.batch-result[data-v-d9ef6284]{margin-bottom:16px}.batch-result-line[data-v-d9ef6284]{flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:10px;font-size:13px;display:flex}.batch-result-label[data-v-d9ef6284]{color:#888;flex-shrink:0}[data-theme=dark] .edit-label,[data-theme=dark] .source-label,[data-theme=dark] .pull-result-label,[data-theme=dark] .batch-result-label{color:#9399b2!important}[data-theme=dark] .update-count-hint{color:#fbbf24}[data-theme=dark] .pull-status,[data-theme=dark] .batch-executing,[data-theme=dark] .install-panel-label,[data-theme=dark] .preview-info{color:#a6adc8}[data-theme=dark] .pull-result-hint,[data-theme=dark] .group-count,[data-theme=dark] .local-hint{color:#6c7086}[data-theme=dark] .path-text{color:#a6adc8}[data-theme=dark] .preview-list,[data-theme=dark] .install-panel,[data-theme=dark] .local-hint{background:#ffffff08}[data-theme=dark] .group-header:hover{background:#ffffff0a}[data-theme=dark] .local-tag{color:#4ade80;background:#4ade8026}[data-theme=dark] .skill-group.group-remote{border-left-color:#6a8cff}[data-theme=dark] .skill-group.group-local{border-left-color:#4ade80}[data-theme=dark] .indicator-remote{background:#6a8cff}[data-theme=dark] .indicator-local{background:#4ade80}[data-theme=dark] .setup-desc{color:#a6adc8}[data-theme=dark] .setup-desc code{background:#ffffff14}[data-theme=dark] .readme-fold{border-top-color:#ffffff14}[data-theme=dark] .source-manager{background:#ffffff08}[data-theme=dark] .source-manager-url,[data-theme=dark] .alias-edit-icon{color:#6c7086}[data-theme=dark] .source-value,[data-theme=dark] .siblings-desc,[data-theme=dark] .batch-desc{color:#cdd6f4!important}[data-theme=dark] .source-manager-title{color:#e4e4ef!important}.page-header[data-v-dbabded1]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.page-header h2[data-v-dbabded1]{font-size:20px;font-weight:600}.scene-grid[data-v-dbabded1]{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;margin:2px;display:grid}.scene-card[data-v-dbabded1]{transition:box-shadow .2s}.scene-card.active[data-v-dbabded1]{box-shadow:0 0 0 2px #2080f0}.scene-desc[data-v-dbabded1]{color:#666;margin:0;font-size:13px}.scene-footer[data-v-dbabded1]{justify-content:space-between;align-items:center;display:flex}.hint-text[data-v-dbabded1]{color:#999;font-size:12px}.diff-preview[data-v-dbabded1]{flex-direction:column;gap:14px;display:flex}.diff-hint[data-v-dbabded1]{margin:0 0 4px;font-size:14px}.diff-section[data-v-dbabded1]{flex-direction:column;gap:6px;display:flex}.diff-label[data-v-dbabded1]{align-items:center;gap:4px;font-size:13px;font-weight:600;display:flex}.diff-tags[data-v-dbabded1]{flex-wrap:wrap;gap:4px;display:flex}.skill-preview-list[data-v-dbabded1]{flex-direction:column;gap:2px;max-height:240px;display:flex;overflow-y:auto}.skill-preview-item[data-v-dbabded1]{padding:2px 0;font-size:13px}.modal-skill-groups[data-v-dbabded1]{max-height:50vh;overflow-y:auto}.skill-group[data-v-dbabded1]{border:1px solid #eee;border-radius:6px;margin-bottom:4px;overflow:hidden}.skill-group-header[data-v-dbabded1]{cursor:pointer;-webkit-user-select:none;user-select:none;background:#f8f9fa;border-bottom:1px solid #eee;align-items:center;gap:6px;padding:8px 10px;font-size:13px;transition:background .15s;display:flex}.skill-group-header[data-v-dbabded1]:hover{background:#eef0f4}.fold-arrow[data-v-dbabded1]{color:#999;flex-shrink:0;font-size:10px;transition:transform .2s}.fold-arrow.open[data-v-dbabded1]{transform:rotate(90deg)}.skill-group-label[data-v-dbabded1]{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-weight:600;overflow:hidden}.skill-group-count[data-v-dbabded1]{color:#999;flex-shrink:0;font-size:12px}.skill-group-body[data-v-dbabded1]{grid-template-columns:repeat(2,1fr);gap:6px;padding:8px 10px;display:grid}.always-apply-grid[data-v-dbabded1]{grid-template-columns:repeat(2,1fr);gap:6px;display:grid}.batch-actions[data-v-dbabded1]{margin-bottom:10px}.search-highlight[data-v-dbabded1]{background:#ffd666;border-radius:2px;padding:0 2px}.search-input[data-v-dbabded1]{margin-bottom:8px}.executing-state[data-v-dbabded1]{flex-direction:column;align-items:center;gap:12px;padding:32px 0;display:flex}.executing-text[data-v-dbabded1]{margin:0;font-size:15px;font-weight:600}.executing-hint[data-v-dbabded1]{color:#999;margin:0;font-size:13px}.failure-section[data-v-dbabded1]{flex-direction:column;gap:6px;margin-top:4px;display:flex}.failure-title[data-v-dbabded1]{align-items:center;gap:4px;font-size:13px;font-weight:600;display:flex}.failure-list[data-v-dbabded1]{flex-direction:column;gap:4px;display:flex}.failure-item[data-v-dbabded1]{background:#fff1f0;border-radius:4px;justify-content:space-between;align-items:center;padding:4px 8px;font-size:13px;display:flex}.failure-name[data-v-dbabded1]{font-weight:500}.failure-tip[data-v-dbabded1]{color:#999;margin:4px 0 0;font-size:12px}.fail-marker[data-v-dbabded1]{margin-left:2px;font-size:12px}.popover-fail-detail[data-v-dbabded1]{font-size:13px}.popover-fail-section[data-v-dbabded1]{margin-bottom:6px}.popover-fail-section[data-v-dbabded1]:last-child{margin-bottom:0}.popover-fail-title[data-v-dbabded1]{margin-bottom:3px;font-size:12px;font-weight:600}.popover-fail-item[data-v-dbabded1]{color:#555;padding:1px 0 1px 8px;font-size:12px}.pending-confirm-body[data-v-dbabded1]{flex-direction:column;gap:6px;display:flex}.pending-confirm-body p[data-v-dbabded1]{margin:0;font-size:14px}.pending-confirm-section[data-v-dbabded1]{flex-direction:column;gap:2px;display:flex}.pending-confirm-title[data-v-dbabded1]{font-size:12px;font-weight:600}.pending-confirm-item[data-v-dbabded1]{color:#555;padding:2px 0 2px 12px;font-size:13px}.pending-confirm-hint[data-v-dbabded1]{color:#999;margin-top:4px;font-size:13px}[data-theme=dark] .scene-card.active{box-shadow:0 0 0 2px #6a8cff}[data-theme=dark] .hint-text,[data-theme=dark] .skill-group-count{color:#6c7086}[data-theme=dark] .fold-arrow{color:#6c7086}[data-theme=dark] .skill-group-label{color:#cdd6f4!important}[data-theme=dark] .skill-group{border-color:#363b4a}[data-theme=dark] .skill-group-header{background:#1e2129;border-color:#363b4a}[data-theme=dark] .skill-group-header:hover{background:#2a2e3a}[data-theme=dark] .search-highlight{color:#fff;background:#8a6d00}[data-theme=dark] .failure-item{background:#d0305026}[data-theme=dark] .executing-hint,[data-theme=dark] .failure-tip{color:#6c7086}[data-theme=dark] .popover-fail-item,[data-theme=dark] .pending-confirm-item{color:#b0b6cc}[data-theme=dark] .pending-confirm-hint{color:#6c7086}.page-header[data-v-f552a014]{margin-bottom:20px}.page-header h2[data-v-f552a014]{font-size:20px;font-weight:600}.section[data-v-f552a014]{margin-bottom:20px}.init-alert[data-v-f552a014]{margin-bottom:12px}.missing-list[data-v-f552a014]{flex-direction:column;gap:4px;display:flex}.missing-item[data-v-f552a014]{font-size:13px;line-height:1.6}.missing-item code[data-v-f552a014]{background:#0000000f;border-radius:3px;padding:1px 6px;font-size:12px}.skill-tag[data-v-f552a014]{margin:1px 2px;display:inline-block}.missing-hint[data-v-f552a014]{opacity:.7;margin-top:4px;font-size:12px}.source-status[data-v-f552a014]{margin-bottom:16px}.source-actions[data-v-f552a014]{flex-direction:column;gap:12px;display:flex}.action-buttons[data-v-f552a014]{gap:8px;display:flex}.healthy-text[data-v-f552a014]{color:#18a058;font-size:13px}.issue-text[data-v-f552a014]{color:#d03050;font-size:13px}.readme-dialog-desc[data-v-f552a014]{color:#555;margin-bottom:16px;font-size:14px}.readme-checkbox[data-v-f552a014]{align-items:flex-start;margin-bottom:12px;display:flex}.readme-checkbox-content[data-v-f552a014]{flex-direction:column;gap:2px;display:flex}.readme-checkbox-title[data-v-f552a014]{font-size:14px;font-weight:500}.readme-checkbox-desc[data-v-f552a014]{color:#999;font-size:12px}.diag-group[data-v-f552a014]{margin-bottom:16px}.diag-group[data-v-f552a014]:last-child{margin-bottom:0}.diag-group-header[data-v-f552a014]{align-items:center;gap:6px;padding:6px 0;font-size:13px;font-weight:600;display:flex}.diag-group-error[data-v-f552a014]{color:#d03050}.diag-group-ok[data-v-f552a014]{color:#18a058}[data-theme=dark] .missing-item code{background:#ffffff14}[data-theme=dark] .healthy-text{color:#4ade80}[data-theme=dark] .issue-text{color:#f87171}[data-theme=dark] .readme-dialog-desc{color:#a6adc8}[data-theme=dark] .readme-checkbox-desc{color:#6c7086}.page-header[data-v-97d38fe1]{justify-content:space-between;align-items:center;margin-bottom:20px;display:flex}.page-header h2[data-v-97d38fe1]{font-size:20px;font-weight:600}.fade-enter-active[data-v-97d38fe1],.fade-leave-active[data-v-97d38fe1]{transition:opacity .2s}.fade-enter-from[data-v-97d38fe1],.fade-leave-to[data-v-97d38fe1]{opacity:0}pre code.hljs{padding:1em;display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#005cc5}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-comment,.hljs-code,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>mdk-skills 管理面板</title>
|
|
7
|
-
<script>
|
|
8
|
-
(function(){var t=localStorage.getItem("mdk-theme");if(t==="dark")document.documentElement.setAttribute("data-theme","dark")})();
|
|
9
|
-
</script>
|
|
10
|
-
</head>
|
|
11
|
-
<body>
|
|
12
|
-
<div id="app"></div>
|
|
13
|
-
<script type="module" src="/src/main.js"></script>
|
|
14
|
-
</body>
|
|
15
|
-
</html>
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<n-message-provider>
|
|
3
|
-
<n-notification-provider>
|
|
4
|
-
<n-config-provider :theme="theme" :locale="zhCN" :date-locale="dateZhCN">
|
|
5
|
-
<n-layout class="app-layout">
|
|
6
|
-
<!-- 导航栏 -->
|
|
7
|
-
<n-layout-header class="app-header" bordered>
|
|
8
|
-
<div class="header-inner">
|
|
9
|
-
<div class="header-left">
|
|
10
|
-
<span class="logo">mdk-skills</span>
|
|
11
|
-
<n-menu
|
|
12
|
-
v-model:value="activeKey"
|
|
13
|
-
mode="horizontal"
|
|
14
|
-
:options="menuOptions"
|
|
15
|
-
@update:value="onMenuChange"
|
|
16
|
-
/>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="header-right">
|
|
19
|
-
<div v-if="statusData" class="header-status">
|
|
20
|
-
<span class="header-status-item" title="已启用技能数">
|
|
21
|
-
<n-icon size="14" color="#18a058"><CheckmarkCircleOutline /></n-icon>
|
|
22
|
-
<span>{{ statusData.enabledCount }}/{{ statusData.totalCount }}</span>
|
|
23
|
-
</span>
|
|
24
|
-
<span class="header-status-divider" />
|
|
25
|
-
<span class="header-status-item" title="当前场景">
|
|
26
|
-
<n-icon size="14" color="#2080f0"><SwapHorizontalOutline /></n-icon>
|
|
27
|
-
<span>{{ statusData.activeProfile?.name || "自定义" }}</span>
|
|
28
|
-
</span>
|
|
29
|
-
<span class="header-status-divider" />
|
|
30
|
-
<span
|
|
31
|
-
class="header-status-item clickable"
|
|
32
|
-
title="CLAUDE.md 状态,点击查看"
|
|
33
|
-
@click="$router.push({ name: 'ClaudeMd' })"
|
|
34
|
-
>
|
|
35
|
-
<n-icon size="14" :color="statusData.hasClaudeMd ? '#18a058' : '#d03050'"><DocumentTextOutline /></n-icon>
|
|
36
|
-
<span>{{ statusData.hasClaudeMd ? "已就绪" : "未创建" }}</span>
|
|
37
|
-
</span>
|
|
38
|
-
</div>
|
|
39
|
-
<n-tag
|
|
40
|
-
v-if="statusData"
|
|
41
|
-
:type="statusData.sourcePath ? 'success' : 'warning'"
|
|
42
|
-
size="small"
|
|
43
|
-
>
|
|
44
|
-
{{ statusData.sourcePath ? "已连接" : "未设置" }}
|
|
45
|
-
</n-tag>
|
|
46
|
-
<n-button quaternary size="small" @click="toggleTheme">
|
|
47
|
-
<template #icon>
|
|
48
|
-
<n-icon><MoonOutline v-if="!darkMode" /><SunnyOutline v-else /></n-icon>
|
|
49
|
-
</template>
|
|
50
|
-
</n-button>
|
|
51
|
-
</div>
|
|
52
|
-
</div>
|
|
53
|
-
</n-layout-header>
|
|
54
|
-
|
|
55
|
-
<!-- 内容区 -->
|
|
56
|
-
<n-layout-content class="app-content">
|
|
57
|
-
<transition name="fade" mode="out-in">
|
|
58
|
-
<router-view @refresh="loadStatus" />
|
|
59
|
-
</transition>
|
|
60
|
-
</n-layout-content>
|
|
61
|
-
</n-layout>
|
|
62
|
-
</n-config-provider>
|
|
63
|
-
</n-notification-provider>
|
|
64
|
-
</n-message-provider>
|
|
65
|
-
</template>
|
|
66
|
-
|
|
67
|
-
<script setup>
|
|
68
|
-
import { h, ref, onMounted, computed, watch } from "vue";
|
|
69
|
-
import { useRouter, useRoute } from "vue-router";
|
|
70
|
-
import { NIcon, zhCN, dateZhCN, darkTheme } from "naive-ui";
|
|
71
|
-
import {
|
|
72
|
-
AppsOutline,
|
|
73
|
-
SwapHorizontalOutline,
|
|
74
|
-
CogOutline,
|
|
75
|
-
DocumentTextOutline,
|
|
76
|
-
CheckmarkCircleOutline,
|
|
77
|
-
MoonOutline,
|
|
78
|
-
SunnyOutline,
|
|
79
|
-
} from "@vicons/ionicons5";
|
|
80
|
-
import { getStatus } from "./api/skills";
|
|
81
|
-
|
|
82
|
-
const router = useRouter();
|
|
83
|
-
const route = useRoute();
|
|
84
|
-
|
|
85
|
-
const statusData = ref(null);
|
|
86
|
-
|
|
87
|
-
const darkMode = ref(localStorage.getItem("mdk-theme") === "dark");
|
|
88
|
-
|
|
89
|
-
const theme = computed(() => (darkMode.value ? darkTheme : null));
|
|
90
|
-
|
|
91
|
-
watch(darkMode, (val) => {
|
|
92
|
-
localStorage.setItem("mdk-theme", val ? "dark" : "light");
|
|
93
|
-
document.documentElement.setAttribute("data-theme", val ? "dark" : "light");
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
function toggleTheme() {
|
|
97
|
-
darkMode.value = !darkMode.value;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const menuOptions = [
|
|
101
|
-
{
|
|
102
|
-
label: "仪表盘",
|
|
103
|
-
key: "Dashboard",
|
|
104
|
-
icon: () => h(NIcon, null, { default: () => h(AppsOutline) }),
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
label: "场景切换",
|
|
108
|
-
key: "Scenes",
|
|
109
|
-
icon: () => h(NIcon, null, { default: () => h(SwapHorizontalOutline) }),
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
label: "设置",
|
|
113
|
-
key: "Settings",
|
|
114
|
-
icon: () => h(NIcon, null, { default: () => h(CogOutline) }),
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
label: "CLAUDE.md",
|
|
118
|
-
key: "ClaudeMd",
|
|
119
|
-
icon: () => h(NIcon, null, { default: () => h(DocumentTextOutline) }),
|
|
120
|
-
},
|
|
121
|
-
];
|
|
122
|
-
|
|
123
|
-
const activeKey = ref(route.name || "Dashboard");
|
|
124
|
-
|
|
125
|
-
function onMenuChange(key) {
|
|
126
|
-
router.push({ name: key });
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
router.afterEach((to) => {
|
|
130
|
-
activeKey.value = to.name;
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
async function loadStatus() {
|
|
134
|
-
try {
|
|
135
|
-
statusData.value = await getStatus();
|
|
136
|
-
} catch {
|
|
137
|
-
// 静默失败
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
onMounted(() => {
|
|
142
|
-
loadStatus();
|
|
143
|
-
document.documentElement.setAttribute("data-theme", darkMode.value ? "dark" : "light");
|
|
144
|
-
});
|
|
145
|
-
</script>
|
|
146
|
-
|
|
147
|
-
<style>
|
|
148
|
-
@import "./styles/main.css";
|
|
149
|
-
|
|
150
|
-
.fade-enter-active,
|
|
151
|
-
.fade-leave-active {
|
|
152
|
-
transition:
|
|
153
|
-
opacity 0.2s ease,
|
|
154
|
-
transform 0.2s ease;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
.fade-enter-from {
|
|
158
|
-
opacity: 0;
|
|
159
|
-
transform: translateY(6px);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
.fade-leave-to {
|
|
163
|
-
opacity: 0;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
.header-status {
|
|
167
|
-
display: flex;
|
|
168
|
-
align-items: center;
|
|
169
|
-
gap: 8px;
|
|
170
|
-
margin-right: 8px;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
.header-status-item {
|
|
174
|
-
display: flex;
|
|
175
|
-
align-items: center;
|
|
176
|
-
gap: 4px;
|
|
177
|
-
font-size: 12px;
|
|
178
|
-
color: #666;
|
|
179
|
-
white-space: nowrap;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
.header-status-item.clickable {
|
|
183
|
-
cursor: pointer;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
.header-status-item.clickable:hover {
|
|
187
|
-
color: #2080f0;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
.header-status-divider {
|
|
191
|
-
width: 1px;
|
|
192
|
-
height: 14px;
|
|
193
|
-
background: #e0e0e0;
|
|
194
|
-
}
|
|
195
|
-
</style>
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
const BASE = "/api";
|
|
2
|
-
|
|
3
|
-
async function request(path, options = {}) {
|
|
4
|
-
// GET 请求加时间戳,绕开浏览器缓存
|
|
5
|
-
const url = (options.method || "GET") === "GET"
|
|
6
|
-
? BASE + path + (path.includes("?") ? "&" : "?") + "_t=" + Date.now()
|
|
7
|
-
: BASE + path;
|
|
8
|
-
const res = await fetch(url, {
|
|
9
|
-
headers: { "Content-Type": "application/json" },
|
|
10
|
-
...options,
|
|
11
|
-
});
|
|
12
|
-
return res.json();
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function getSkills() {
|
|
16
|
-
return request("/skills");
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function toggleSkill(name, enabled) {
|
|
20
|
-
return request("/skills/toggle", {
|
|
21
|
-
method: "POST",
|
|
22
|
-
body: JSON.stringify({ name, enabled }),
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function installSkills(selected) {
|
|
27
|
-
return request("/skills/install", {
|
|
28
|
-
method: "POST",
|
|
29
|
-
body: JSON.stringify({ selected }),
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function getProfiles() {
|
|
34
|
-
return request("/profiles");
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function applyProfile(profileId) {
|
|
38
|
-
return request("/profiles/apply", {
|
|
39
|
-
method: "POST",
|
|
40
|
-
body: JSON.stringify({ profileId }),
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function saveProfile(data) {
|
|
45
|
-
return request("/profiles/save", {
|
|
46
|
-
method: "POST",
|
|
47
|
-
body: JSON.stringify(data),
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function deleteProfile(id) {
|
|
52
|
-
return request("/profiles/delete", {
|
|
53
|
-
method: "POST",
|
|
54
|
-
body: JSON.stringify({ id }),
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function getStatus() {
|
|
59
|
-
return request("/status");
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function getSource() {
|
|
63
|
-
return request("/source");
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export function connectSource(path) {
|
|
67
|
-
return request("/source/connect", {
|
|
68
|
-
method: "POST",
|
|
69
|
-
body: JSON.stringify({ path }),
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function clearSource() {
|
|
74
|
-
return request("/source/clear", { method: "POST" });
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export function syncSource() {
|
|
78
|
-
return request("/source/sync", { method: "POST" });
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function initSource() {
|
|
82
|
-
return request("/source/init", { method: "POST" });
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export function diagnose() {
|
|
86
|
-
return request("/diagnose");
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export function getReadme() {
|
|
90
|
-
return request("/readme");
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export function getSkillsReadme() {
|
|
94
|
-
return request("/skills-readme");
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function getClaudeMd() {
|
|
98
|
-
return request("/claudemd");
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export function getSkillReadme(name) {
|
|
102
|
-
return request("/skills/" + encodeURIComponent(name) + "/readme");
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export function updateSkillMeta(name, data) {
|
|
106
|
-
return request("/skills/" + encodeURIComponent(name) + "/meta", {
|
|
107
|
-
method: "PATCH",
|
|
108
|
-
body: JSON.stringify(data),
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export function pullSkills(url, names = []) {
|
|
113
|
-
return request("/skills/pull", {
|
|
114
|
-
method: "POST",
|
|
115
|
-
body: JSON.stringify({ url, names }),
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export function cancelPull(url) {
|
|
120
|
-
return request("/skills/pull-cancel", {
|
|
121
|
-
method: "POST",
|
|
122
|
-
body: JSON.stringify({ url }),
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function deleteSkill(name) {
|
|
127
|
-
return request("/skills/" + encodeURIComponent(name), {
|
|
128
|
-
method: "DELETE",
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export function getSkillSource(name) {
|
|
133
|
-
return request("/skills/" + encodeURIComponent(name) + "/source");
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export function updateSkill(name) {
|
|
137
|
-
return request("/skills/" + encodeURIComponent(name) + "/update", {
|
|
138
|
-
method: "POST",
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
export function batchUpdateSkills(names, url) {
|
|
143
|
-
return request("/skills/batch-update", {
|
|
144
|
-
method: "POST",
|
|
145
|
-
body: JSON.stringify({ names, url }),
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export function openSkillDir(name) {
|
|
150
|
-
return request("/skills/" + encodeURIComponent(name) + "/open", {
|
|
151
|
-
method: "POST",
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export function retryDelete(name) {
|
|
156
|
-
return request("/skills/" + encodeURIComponent(name) + "/retry-delete", {
|
|
157
|
-
method: "POST",
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export function retryInstall(name) {
|
|
162
|
-
return request("/skills/" + encodeURIComponent(name) + "/retry-install", {
|
|
163
|
-
method: "POST",
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export function openSkillsDest() {
|
|
168
|
-
return request("/skills-dest/open", {
|
|
169
|
-
method: "POST",
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
export function createReadme(data) {
|
|
174
|
-
return request("/readme/create", {
|
|
175
|
-
method: "POST",
|
|
176
|
-
body: JSON.stringify(data),
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export function cancelTask() {
|
|
181
|
-
return fetch("/api/tasks/cancel", { method: "POST" }).catch(() => {});
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
export function getSourceNames() {
|
|
185
|
-
return request("/source-names");
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
export function saveSourceNames(names) {
|
|
189
|
-
return request("/source-names", {
|
|
190
|
-
method: "POST",
|
|
191
|
-
body: JSON.stringify({ names }),
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
export function bulkToggleSkills(names, enabled) {
|
|
196
|
-
return request("/skills/bulk-toggle", {
|
|
197
|
-
method: "POST",
|
|
198
|
-
body: JSON.stringify({ names, enabled }),
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
export function bulkDeleteSkills(names) {
|
|
203
|
-
return request("/skills/bulk-delete", {
|
|
204
|
-
method: "POST",
|
|
205
|
-
body: JSON.stringify({ names }),
|
|
206
|
-
});
|
|
207
|
-
}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<Teleport to="body">
|
|
3
|
-
<Transition name="modal-fade">
|
|
4
|
-
<div v-if="show" class="modal-overlay" @click.self="onMaskClick">
|
|
5
|
-
<div class="modal-card" :style="{ maxWidth: width }">
|
|
6
|
-
<div class="modal-header">
|
|
7
|
-
<span class="modal-title">{{ title }}</span>
|
|
8
|
-
<button class="modal-close" @click="close">×</button>
|
|
9
|
-
</div>
|
|
10
|
-
<div class="modal-body">
|
|
11
|
-
<slot />
|
|
12
|
-
</div>
|
|
13
|
-
<div v-if="$slots.footer" class="modal-footer">
|
|
14
|
-
<slot name="footer" />
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
</div>
|
|
18
|
-
</Transition>
|
|
19
|
-
</Teleport>
|
|
20
|
-
</template>
|
|
21
|
-
|
|
22
|
-
<script setup>
|
|
23
|
-
import { watch, onUnmounted } from "vue";
|
|
24
|
-
|
|
25
|
-
const props = defineProps({
|
|
26
|
-
show: Boolean,
|
|
27
|
-
title: { type: String, default: "" },
|
|
28
|
-
width: { type: String, default: "480px" },
|
|
29
|
-
maskClosable: { type: Boolean, default: true },
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const emit = defineEmits(["update:show"]);
|
|
33
|
-
|
|
34
|
-
function close() {
|
|
35
|
-
emit("update:show", false);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function onMaskClick() {
|
|
39
|
-
if (props.maskClosable) close();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Escape 关闭 + body scroll lock
|
|
43
|
-
let escHandler = null;
|
|
44
|
-
let prevOverflow = null;
|
|
45
|
-
watch(
|
|
46
|
-
() => props.show,
|
|
47
|
-
(v) => {
|
|
48
|
-
if (escHandler) {
|
|
49
|
-
document.removeEventListener("keydown", escHandler);
|
|
50
|
-
escHandler = null;
|
|
51
|
-
}
|
|
52
|
-
if (v) {
|
|
53
|
-
prevOverflow = document.body.style.overflow;
|
|
54
|
-
document.body.style.overflow = "hidden";
|
|
55
|
-
escHandler = (e) => {
|
|
56
|
-
if (e.key === "Escape") close();
|
|
57
|
-
};
|
|
58
|
-
document.addEventListener("keydown", escHandler);
|
|
59
|
-
} else {
|
|
60
|
-
document.body.style.overflow = prevOverflow || "";
|
|
61
|
-
prevOverflow = null;
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
{ immediate: true },
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
onUnmounted(() => {
|
|
68
|
-
if (escHandler) document.removeEventListener("keydown", escHandler);
|
|
69
|
-
if (prevOverflow !== null) document.body.style.overflow = prevOverflow || "";
|
|
70
|
-
});
|
|
71
|
-
</script>
|
|
72
|
-
|
|
73
|
-
<style scoped>
|
|
74
|
-
.modal-overlay {
|
|
75
|
-
position: fixed;
|
|
76
|
-
inset: 0;
|
|
77
|
-
z-index: 2000;
|
|
78
|
-
display: flex;
|
|
79
|
-
align-items: center;
|
|
80
|
-
justify-content: center;
|
|
81
|
-
background: rgba(0, 0, 0, 0.45);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
.modal-card {
|
|
85
|
-
width: 90%;
|
|
86
|
-
background: #fff;
|
|
87
|
-
border-radius: 8px;
|
|
88
|
-
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
|
|
89
|
-
display: flex;
|
|
90
|
-
flex-direction: column;
|
|
91
|
-
max-height: 85vh;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
.modal-header {
|
|
95
|
-
display: flex;
|
|
96
|
-
align-items: center;
|
|
97
|
-
justify-content: space-between;
|
|
98
|
-
padding: 14px 20px 0;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
.modal-title {
|
|
102
|
-
font-size: 16px;
|
|
103
|
-
font-weight: 600;
|
|
104
|
-
color: #333;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
.modal-close {
|
|
108
|
-
width: 28px;
|
|
109
|
-
height: 28px;
|
|
110
|
-
border: none;
|
|
111
|
-
background: transparent;
|
|
112
|
-
font-size: 20px;
|
|
113
|
-
line-height: 1;
|
|
114
|
-
color: #999;
|
|
115
|
-
cursor: pointer;
|
|
116
|
-
border-radius: 4px;
|
|
117
|
-
display: flex;
|
|
118
|
-
align-items: center;
|
|
119
|
-
justify-content: center;
|
|
120
|
-
transition: background 0.15s, color 0.15s;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
.modal-close:hover {
|
|
124
|
-
background: #f0f0f0;
|
|
125
|
-
color: #333;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
.modal-body {
|
|
129
|
-
padding: 16px 20px;
|
|
130
|
-
overflow-y: auto;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
.modal-footer {
|
|
134
|
-
display: flex;
|
|
135
|
-
justify-content: flex-end;
|
|
136
|
-
gap: 8px;
|
|
137
|
-
padding: 12px 20px 16px;
|
|
138
|
-
border-top: 1px solid #f0f0f0;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/* fade 过渡 */
|
|
142
|
-
.modal-fade-enter-active {
|
|
143
|
-
transition: opacity 0.2s ease;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
.modal-fade-leave-active {
|
|
147
|
-
transition: opacity 0.15s ease;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
.modal-fade-enter-from,
|
|
151
|
-
.modal-fade-leave-to {
|
|
152
|
-
opacity: 0;
|
|
153
|
-
}
|
|
154
|
-
</style>
|
|
155
|
-
|
|
156
|
-
<style>
|
|
157
|
-
[data-theme="dark"] .modal-card {
|
|
158
|
-
background: #2a2a42;
|
|
159
|
-
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
[data-theme="dark"] .modal-title {
|
|
163
|
-
color: #e4e4ef;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
[data-theme="dark"] .modal-close {
|
|
167
|
-
color: #6c7086;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
[data-theme="dark"] .modal-close:hover {
|
|
171
|
-
background: #323250;
|
|
172
|
-
color: #cdd6f4;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
[data-theme="dark"] .modal-footer {
|
|
176
|
-
border-top-color: #363650;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
[data-theme="dark"] .modal-overlay {
|
|
180
|
-
background: rgba(0, 0, 0, 0.65);
|
|
181
|
-
}
|
|
182
|
-
</style>
|