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.
@@ -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-Bu8b9gwQ.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-CfvkkgtO.css">
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">&times;</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>