@stylewx/mcp-server 0.1.0 → 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 wjunhere
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.js CHANGED
@@ -162,7 +162,10 @@ async function handleEditorApi(req, res, path, url, deps) {
162
162
  return sendErr(res, { code: 'missing_llm_config', message: '需要 LLM 配置。', hint: '请配置 LLM_BASE_URL / LLM_API_KEY / LLM_MODEL 后重启服务。' });
163
163
  const b = await readJsonBody(req);
164
164
  const markdown = typeof b.markdown === 'string' ? b.markdown : '';
165
- const r = await optimizeArticle(markdown, deps.llm);
165
+ const prompt = typeof b.prompt === 'string' && b.prompt.trim() ? b.prompt.trim() : undefined;
166
+ const sel = b.selection;
167
+ const selection = sel && typeof sel.start === 'number' && typeof sel.end === 'number' ? { start: sel.start, end: sel.end } : undefined;
168
+ const r = await optimizeArticle(markdown, deps.llm, { prompt, selection });
166
169
  return sendJson(res, { markdown: r.markdown });
167
170
  }
168
171
  return sendErr(res, { code: 'not_found', message: '未知 /editor/api 端点:' + path, hint: '请检查路径。' }, 404);
@@ -181,14 +184,14 @@ async function runStdio() {
181
184
  async function runHttp(port) {
182
185
  const transports = new Map();
183
186
  const deps = buildDeps();
184
- const editorHtml = readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '../editor.html'), 'utf8');
187
+ const editorHtmlPath = resolve(dirname(fileURLToPath(import.meta.url)), '../editor.html');
185
188
  const server = createServer(async (req, res) => {
186
189
  const url = new URL(req.url ?? '/', 'http://localhost');
187
190
  const path = url.pathname;
188
- // 本地 Web 编辑器(WeMD 风格)
191
+ // 本地 Web 编辑器(WeMD 风格);每次读取,改 editor.html 后即时生效
189
192
  if (path === '/editor') {
190
193
  res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
191
- res.end(editorHtml);
194
+ res.end(readFileSync(editorHtmlPath, 'utf8'));
192
195
  return;
193
196
  }
194
197
  if (path.startsWith('/editor/api/')) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/editor.html CHANGED
@@ -4,6 +4,7 @@
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <title>stylewx 编辑器</title>
7
+ <link rel="icon" href='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="8" fill="%232563eb"/><text x="16" y="23" font-size="19" font-family="Arial,Helvetica,sans-serif" font-weight="700" fill="%23fff" text-anchor="middle">M</text></svg>' />
7
8
  <style>
8
9
  :root{
9
10
  --bg:#f3f4f7; --panel:#fff; --line:#e8eaee; --line2:#f0f2f5;
@@ -45,7 +46,8 @@
45
46
 
46
47
  /* ---------- 主区 ---------- */
47
48
  .main{flex:1;display:flex;flex-direction:column;gap:14px;min-width:0}
48
- .topbar{display:flex;align-items:center;gap:8px;padding:11px 16px;background:var(--panel);border-radius:var(--radius);box-shadow:var(--shadow);flex-wrap:wrap}
49
+ .topbar{display:flex;align-items:center;gap:7px;padding:11px 16px;background:var(--panel);border-radius:var(--radius);box-shadow:var(--shadow);flex-wrap:wrap}
50
+ .topbar .right{margin-left:auto;display:flex;align-items:center;gap:7px;flex-wrap:nowrap}
49
51
  .btn{border:1px solid var(--line);background:#fff;color:var(--ink);border-radius:var(--radius-sm);padding:7px 12px;font-size:12.5px;cursor:pointer;transition:.12s;white-space:nowrap;box-shadow:0 1px 2px rgba(20,30,50,.03);display:inline-flex;align-items:center;gap:6px}
50
52
  .btn svg,.subnav button svg{flex:none}
51
53
  .btn:hover{background:#f4f6f9;border-color:#dde1e7}
@@ -59,9 +61,14 @@
59
61
  select:focus,input:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(37,99,235,.12)}
60
62
  input#title{width:170px}
61
63
  details.theme-panel{position:relative}
62
- details.theme-panel summary{cursor:pointer;padding:7px 12px;font-size:12.5px;border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);box-shadow:0 1px 2px rgba(20,30,50,.03)}
64
+ details.theme-panel summary{cursor:pointer;display:flex;align-items:center;gap:6px;padding:7px 12px;font-size:12.5px;border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);box-shadow:0 1px 2px rgba(20,30,50,.03)}
63
65
  .theme-box{position:absolute;right:0;top:calc(100% + 8px);background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow-lg);padding:12px;width:260px;z-index:30}
64
- .theme-box h4{margin:0 0 8px;font-size:12px;color:var(--muted);font-weight:600}
66
+ .theme-box h4{margin:10px 0 6px;font-size:12px;color:var(--muted);font-weight:600}
67
+ .theme-box .menu-items{display:flex;flex-direction:column;gap:2px}
68
+ .theme-box .menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 9px;border:0;background:none;border-radius:8px;color:var(--ink);font-size:12.5px;text-align:left;cursor:pointer}
69
+ .theme-box .menu-item:hover{background:var(--line2)}
70
+ .theme-box .menu-item svg{flex:none;color:var(--muted)}
71
+ .theme-box .menu-sep{height:1px;background:var(--line2);margin:8px -4px}
65
72
 
66
73
  /* ---------- 内容区 ---------- */
67
74
  .content{flex:1;display:flex;gap:14px;min-height:0}
@@ -79,6 +86,9 @@
79
86
  .table-picker .tcell{background:#eef1f5;border-radius:3px;cursor:pointer}
80
87
  .table-picker .tcell.on{background:var(--brand)}
81
88
  .table-picker .tcell:hover{background:var(--brand);opacity:.75}
89
+ .tm-picker{position:fixed;z-index:70;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow-lg);padding:6px;display:none;min-width:158px}
90
+ .tm-opt{display:flex;align-items:center;gap:7px;width:100%;padding:7px 10px;border:0;background:none;border-radius:8px;color:var(--ink);font-size:12.5px;text-align:left;cursor:pointer}
91
+ .tm-opt:hover{background:var(--line2)}
82
92
  .tb-sep{width:1px;height:16px;background:var(--line);margin:0 5px}
83
93
  .markdown{flex:1;width:100%;border:0;resize:none;padding:22px 26px;font:14px/1.8 var(--mono);background:#fff;color:var(--ink);outline:none}
84
94
  .markdown::placeholder{color:var(--faint)}
@@ -113,6 +123,16 @@
113
123
  .switch input:checked + .slider{background:var(--brand)}
114
124
  .switch input:checked + .slider:before{transform:translateX(18px)}
115
125
  .modal-foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 18px;border-top:1px solid var(--line)}
126
+ .ai-lbl{display:block;font-size:12px;color:var(--muted);margin:0 0 6px}
127
+ .ai-scope{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line2)}
128
+ .ai-chips{display:flex;gap:8px;flex-wrap:wrap}
129
+ .ai-chip{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--line);border-radius:9px;font-size:12.5px;cursor:pointer;color:var(--ink2)}
130
+ .ai-chip input{accent-color:var(--blue);cursor:pointer}
131
+ .ai-chip:has(input:checked){border-color:var(--blue);color:var(--blue);background:rgba(64,158,255,.06)}
132
+ .ai-selinfo{font-size:12px;color:var(--blue);font-weight:600}
133
+ .ai-prompt{width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:10px;padding:9px 11px;font-size:13px;font-family:inherit;line-height:1.6;resize:vertical;min-height:78px}
134
+ .ai-prompt:focus{outline:2px solid rgba(64,158,255,.4);border-color:var(--blue)}
135
+ .ai-hint{font-size:12px;color:var(--muted);line-height:1.6;margin-top:10px}
116
136
  </style>
117
137
  </head>
118
138
  <body>
@@ -142,24 +162,30 @@
142
162
  <div class="topbar">
143
163
  <button class="btn ghost" id="undoBtn" title="撤销">↶</button>
144
164
  <button class="btn ghost" id="redoBtn" title="重做">↷</button>
145
- <span class="lbl">主题</span>
146
- <select id="themeSel" style="max-width:200px"></select>
147
- <details class="theme-panel" id="themePanel"><summary>主题库 ▾</summary><div class="theme-box"><h4>已保存的自定义主题</h4><div id="themeList" style="max-height:180px;overflow:auto;font-size:12px;color:var(--ink2);line-height:1.9"></div></div></details>
148
- <button class="btn" id="genBtn" title="按当前文章用 AI 生成主题"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l1.6 4.4L18 9l-4.4 1.6L12 15l-1.6-4.4L6 9l4.4-1.6z"/><path d="M19 14l.8 2.2L22 17l-2.2.8L19 20l-.8-2.2L16 17l2.2-.8z"/><path d="M5 15l.7 1.8 1.8.7-1.8.7L5 20l-.7-1.8-1.8-.7 1.8-.7z"/></svg>生成主题</button>
149
- <button class="btn" id="saveBtn"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/><path d="M17 21v-8H7v8M7 3v5h8"/></svg>保存主题</button>
150
- <button class="btn" id="valBtn"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="m8 12 3 3 5-6"/></svg>校验</button>
151
- <span class="grow"></span>
152
- <label class="lbl">标题</label><input type="text" id="title" placeholder="文章标题" />
153
- <label class="lbl">封面</label><input type="text" id="cover" placeholder="封面URL(选填)" style="width:150px" title="封面图 URL(900×383/2.35:1);留空则用正文首图或自动生成" />
165
+ <select id="themeSel" style="max-width:150px" title="主题"></select>
166
+ <details class="theme-panel" id="themePanel"><summary><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="5" r="1"/><circle cx="12" cy="12" r="1"/><circle cx="12" cy="19" r="1"/></svg>主题管理</summary><div class="theme-box">
167
+ <div class="menu-items">
168
+ <button class="menu-item" id="genBtn" title="按当前文章用 AI 生成主题"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l1.6 4.4L18 9l-4.4 1.6L12 15l-1.6-4.4L6 9l4.4-1.6z"/><path d="M19 14l.8 2.2L22 17l-2.2.8L19 20l-.8-2.2L16 17l2.2-.8z"/><path d="M5 15l.7 1.8 1.8.7-1.8.7L5 20l-.7-1.8-1.8-.7 1.8-.7z"/></svg>生成主题</button>
169
+ <button class="menu-item" id="saveBtn" title="保存当前主题"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"/><path d="M17 21v-8H7v8M7 3v5h8"/></svg>保存主题</button>
170
+ </div>
171
+ <div class="menu-sep"></div>
172
+ <h4>已保存的自定义主题</h4>
173
+ <div id="themeList" style="max-height:150px;overflow:auto;font-size:12px;color:var(--ink2);line-height:1.9"></div>
174
+ </div></details>
175
+ <label class="lbl">标题</label><input type="text" id="title" placeholder="文章标题" style="flex:1 1 120px;max-width:230px" />
176
+ <label class="lbl">封面</label><input type="text" id="cover" placeholder="封面URL" style="width:120px" title="封面图 URL(900×383/2.35:1);留空则用正文首图或自动生成" />
154
177
  <button class="btn" id="coverUpload" title="上传本地图片作封面">上传</button>
155
178
  <span id="coverThumbWrp" style="display:none;position:relative;line-height:0">
156
179
  <img id="coverThumb" alt="封面预览" style="width:54px;height:26px;object-fit:cover;border-radius:6px;vertical-align:middle;border:1px solid var(--line)" />
157
180
  <button class="btn ghost" id="coverClear" title="清除封面" style="position:absolute;top:-9px;right:-9px;padding:0 5px;font-size:13px;line-height:18px;border-radius:9px">×</button>
158
181
  </span>
159
182
  <input type="file" id="coverFile" accept="image/*" style="display:none" />
183
+ <div class="right">
184
+ <button class="btn" id="valBtn"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="m8 12 3 3 5-6"/></svg>校验</button>
160
185
  <button class="btn" id="copyHtmlBtn"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="8" y="3" width="8" height="4" rx="1"/><path d="M8 5H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2"/></svg>复制 HTML</button>
161
186
  <button class="btn primary" id="copyWxBtn"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="12" height="12" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>复制到公众号</button>
162
187
  <button class="btn primary" id="pubBtn"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M22 2 11 13"/><path d="M22 2 15 22l-4-9-9-4z"/></svg>发布草稿箱</button>
188
+ </div>
163
189
  </div>
164
190
 
165
191
  <div class="content">
@@ -169,20 +195,20 @@
169
195
  <button class="tb-btn" data-a="bold" title="加粗"><b>B</b></button>
170
196
  <button class="tb-btn" data-a="italic" title="斜体"><i style="font-style:italic">I</i></button>
171
197
  <button class="tb-btn" data-a="strike" title="删除线"><s>S</s></button>
172
- <button class="tb-btn" data-a="h1" title="一级标题">H1</button>
173
- <button class="tb-btn" data-a="h2" title="二级标题">H2</button>
174
- <button class="tb-btn" data-a="h3" title="三级标题">H3</button>
198
+ <button class="tb-btn tm-trigger" data-a="heading" title="标题"><b>H</b></button>
175
199
  <span class="tb-sep"></span>
176
200
  <button class="tb-btn" data-a="quote" title="引用"><svg viewBox="0 0 24 24" width="15" height="15" fill="currentColor"><path d="M9.5 4C5.9 4 3 6.9 3 10.5V20h8v-8H7c0-2.2 1.3-4 2.5-4V4zm11 0C16.9 4 14 6.9 14 10.5V20h8v-8h-4c0-2.2 1.3-4 2.5-4V4z"/></svg></button>
177
201
  <button class="tb-btn" data-a="code" title="行内代码"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="m16 18 6-6-6-6M8 6l-6 6 6 6"/></svg></button>
178
- <button class="tb-btn" data-a="ul" title="无序列表"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M9 6h12M9 12h12M9 18h12"/><circle cx="4.5" cy="6" r="1.4" fill="currentColor"/><circle cx="4.5" cy="12" r="1.4" fill="currentColor"/><circle cx="4.5" cy="18" r="1.4" fill="currentColor"/></svg></button>
179
- <button class="tb-btn" data-a="ol" title="有序列表"><svg viewBox="0 0 24 24" width="15" height="15" fill="none"><path d="M11 6h10M11 12h10M11 18h10" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/><g fill="currentColor" font-size="8" font-family="Arial,sans-serif"><text x="2.5" y="9">1</text><text x="2.5" y="15">2</text><text x="2.5" y="21">3</text></g></svg></button>
202
+ <button class="tb-btn" data-a="sup" title="上标">x<sup>2</sup></button>
203
+ <button class="tb-btn" data-a="sub" title="下标">x<sub>2</sub></button>
204
+ <button class="tb-btn tm-trigger" data-a="list" title="列表"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M9 6h12M9 12h12M9 18h12"/><circle cx="4.5" cy="6" r="1.4" fill="currentColor"/><circle cx="4.5" cy="12" r="1.4" fill="currentColor"/><circle cx="4.5" cy="18" r="1.4" fill="currentColor"/></svg></button>
180
205
  <button class="tb-btn" data-a="highlight" title="高亮"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M13.5 4.5 19.5 10 9.5 20H3.5v-6z"/><path d="M4 20h17"/></svg></button>
181
206
  <span class="tb-sep"></span>
182
207
  <button class="tb-btn" data-a="link" title="链接"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg></button>
183
208
  <button class="tb-btn" data-a="img" title="图片"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><path d="m21 15-5-5L5 21"/></svg></button>
184
209
  <button class="tb-btn" data-a="table" title="表格"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><path d="M3 10h18M10 4v16"/></svg></button>
185
210
  <button class="tb-btn" data-a="hr" title="分隔线"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M4 12h16"/></svg></button>
211
+ <button class="tb-btn tm-trigger" data-a="callout" title="警告框"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3 2 20h20L12 3z"/><path d="M12 10v4"/><path d="M12 17.5h.01"/></svg></button>
186
212
  <span class="tb-sep"></span>
187
213
  <button class="tb-btn" data-a="clear" title="清除格式"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M6 6l12 12M18 6L6 18"/></svg></button>
188
214
  <button class="tb-btn" data-a="help" title="Markdown 帮助"><svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></button>
@@ -201,6 +227,7 @@
201
227
  </div>
202
228
  </div>
203
229
  <div class="table-picker" id="tablePicker"></div>
230
+ <div class="tm-picker" id="tmPicker"></div>
204
231
  <div class="toast" id="toast"></div>
205
232
 
206
233
  <!-- 图床设置弹窗 -->
@@ -220,6 +247,25 @@
220
247
  </div>
221
248
  </div>
222
249
 
250
+ <div class="overlay" id="aiOverlay">
251
+ <div class="modal">
252
+ <div class="modal-head"><b>AI 优化</b><button class="modal-close" data-close-ai>&times;</button></div>
253
+ <div class="modal-body">
254
+ <div class="ai-scope">
255
+ <span class="ai-lbl" style="margin:0">作用范围</span>
256
+ <div class="ai-chips">
257
+ <label class="ai-chip"><input type="radio" name="aiScope" value="all" checked>全文</label>
258
+ <label class="ai-chip"><input type="radio" name="aiScope" value="sel">选中片段<span class="ai-selinfo" id="aiSelInfo"></span></label>
259
+ </div>
260
+ </div>
261
+ <label class="ai-lbl" style="margin-top:14px">优化要求(可选,自定义 prompt)</label>
262
+ <textarea class="ai-prompt" id="aiPrompt" rows="4" placeholder="例如:把开头写得更有吸引力;语句更口语化;压缩到 800 字以内;每段补一个小标题…(留空 = 通用优化)"></textarea>
263
+ <div class="ai-hint">提示:先在编辑器里选中想优化的文字,再点「AI 优化」即可只优化该段;不选中则默认优化全文。优化会保留 Markdown 结构与事实,不改变主旨。</div>
264
+ </div>
265
+ <div class="modal-foot"><button class="btn" data-close-ai>取消</button><button class="btn primary" id="aiRun">开始优化</button></div>
266
+ </div>
267
+ </div>
268
+
223
269
  <script>
224
270
  // ---- 状态 ----
225
271
  let lastHtml=''; let themesCache=[]; let currentTitle='';
@@ -283,6 +329,7 @@ function linePrefix(p){
283
329
  const ACTIONS={
284
330
  bold:()=>wrap('**'), italic:()=>wrap('*'), strike:()=>wrap('~~'), highlight:()=>wrap('=='),
285
331
  code:()=>wrap('`'), link:()=>wrap('[','](https://)'), img:()=>wrap('![','](https://)'),
332
+ sup:()=>wrap('^'), sub:()=>wrap('~'),
286
333
  h1:()=>linePrefix('# '), h2:()=>linePrefix('## '), h3:()=>linePrefix('### '),
287
334
  quote:()=>linePrefix('> '), ul:()=>linePrefix('- '), ol:()=>linePrefix('1. '),
288
335
  hr:()=>{const ta=$('#md');ta.value=(ta.value+'\n\n---\n');render();},
@@ -292,6 +339,9 @@ const ACTIONS={
292
339
  $('#toolbar').addEventListener('click',e=>{
293
340
  const btn=e.target.closest('.tb-btn'); const a=btn?.dataset?.a; if(!a) return;
294
341
  if(a==='table'){ showTablePicker(btn); return; }
342
+ if(a==='heading'){ showTmPicker(btn, HEAD_OPTS); return; }
343
+ if(a==='list'){ showTmPicker(btn, LIST_OPTS); return; }
344
+ if(a==='callout'){ showTmPicker(btn, CALLOUT_OPTS); return; }
295
345
  if(ACTIONS[a]) ACTIONS[a]();
296
346
  });
297
347
 
@@ -316,6 +366,45 @@ function showTablePicker(btn){
316
366
  }
317
367
  function hideTablePicker(){ $('#tablePicker').style.display='none'; }
318
368
  document.addEventListener('click',e=>{ if(!e.target.closest('#tablePicker') && !e.target.closest('.tb-btn[data-a=table]')) hideTablePicker(); });
369
+
370
+ // ---- 通用工具栏下拉(标题 / 列表 / 警告框) ----
371
+ const HEAD_OPTS=[
372
+ {label:'一级标题(H1)', action:()=>linePrefix('# ')},
373
+ {label:'二级标题(H2)', action:()=>linePrefix('## ')},
374
+ {label:'三级标题(H3)', action:()=>linePrefix('### ')} ];
375
+ const LIST_OPTS=[
376
+ {label:'无序列表', action:()=>linePrefix('- ')},
377
+ {label:'有序列表', action:()=>linePrefix('1. ')},
378
+ {label:'二级—无序', action:()=>linePrefix(' - ')},
379
+ {label:'二级—有序', action:()=>linePrefix(' 1. ')} ];
380
+ const CALLOUT_OPTS=[
381
+ {label:'提醒内容', action:()=>insertCallout('info','提醒内容')},
382
+ {label:'建议内容', action:()=>insertCallout('tip','建议内容')},
383
+ {label:'重要内容', action:()=>insertCallout('important','重要内容')},
384
+ {label:'警告内容', action:()=>insertCallout('warning','警告内容')},
385
+ {label:'注意内容', action:()=>insertCallout('note','注意内容')} ];
386
+ function showTmPicker(btn, options){
387
+ hideTmPicker();
388
+ const p=$('#tmPicker'); p._opts=options;
389
+ p.innerHTML=options.map((o,i)=>'<button class="tm-opt" data-i="'+i+'">'+o.label+'</button>').join('');
390
+ const rect=btn.getBoundingClientRect();
391
+ p.style.left=Math.min(rect.left, window.innerWidth-200)+'px';
392
+ p.style.top=(rect.bottom+4)+'px';
393
+ p.style.display='block';
394
+ }
395
+ function hideTmPicker(){ const p=$('#tmPicker'); if(p) p.style.display='none'; }
396
+ $('#tmPicker').addEventListener('click',e=>{
397
+ const b=e.target.closest('.tm-opt'); if(!b) return;
398
+ const o=($('#tmPicker')._opts||[])[+b.dataset.i]; hideTmPicker(); if(o&&o.action) o.action();
399
+ });
400
+ document.addEventListener('click',e=>{ if(!e.target.closest('#tmPicker') && !e.target.closest('.tm-trigger')) hideTmPicker(); });
401
+ // 在光标处插入一个 ::: 类型 标题 … ::: 警告框(光标停在内容占位符处)
402
+ function insertCallout(type,title){
403
+ const ta=$('#md'), s=ta.selectionStart, e=ta.selectionEnd;
404
+ const block='\n::: '+type+' '+title+'\n内容……\n:::\n';
405
+ ta.value=ta.value.slice(0,s)+block+ta.value.slice(e);
406
+ const pos=s+block.indexOf('\n内容……')+1; ta.selectionStart=ta.selectionEnd=pos; render(); saveSnap(); ta.focus();
407
+ }
319
408
  // 在光标处插入 cols 列 × rows 行(首行表头)的 Markdown 表格
320
409
  function insertTable(cols, rows){
321
410
  const ta=$('#md'), s=ta.selectionStart;
@@ -362,8 +451,8 @@ $('#search').addEventListener('input',e=>renderHistory(e.target.value.trim()));
362
451
  $('#newBtn').onclick=()=>{ $('#md').value=''; $('#title').value=''; $('#pv').srcdoc=''; $('#pv').style.display='none'; $('#pvEmpty').style.display=''; activeId=null; setVal([{kind:'warn',text:'新建文章:开始输入 Markdown'} ]); $('#md').focus(); };
363
452
 
364
453
  // ---- 主题操作 ----
365
- $('#genBtn').onclick=async()=>{ toast('正在生成主题(LLM)…'); try{ const d=await api('/editor/api/generate',{article:$('#md').value,save:true}); if(d.theme&&d.theme.name){await loadThemes();$('#themeSel').value=d.theme.name;} toast('已生成'+(d.saved?'并保存':'')+':'+(d.theme&&d.theme.name)); render(); }catch(e){ toast('生成失败:'+e.message,false); } };
366
- $('#saveBtn').onclick=async()=>{ const name=$('#themeSel').value; const th=themesCache.find(t=>t.name===name); if(!th)return toast('请先选择主题',false); try{ await api('/editor/api/savetheme',{theme:th}); await loadThemes(); $('#themeSel').value=name; toast('已保存:'+name); }catch(e){ toast('保存失败:'+e.message,false); } };
454
+ $('#genBtn').onclick=async()=>{ toast('正在生成主题(LLM)…'); try{ const d=await api('/editor/api/generate',{article:$('#md').value,save:true}); if(d.theme&&d.theme.name){await loadThemes();$('#themeSel').value=d.theme.name;} toast('已生成'+(d.saved?'并保存':'')+':'+(d.theme&&d.theme.name)); render(); }catch(e){ toast('生成失败:'+e.message,false); } $('#themePanel').open=false; };
455
+ $('#saveBtn').onclick=async()=>{ const name=$('#themeSel').value; const th=themesCache.find(t=>t.name===name); if(!th)return toast('请先选择主题',false); try{ await api('/editor/api/savetheme',{theme:th}); await loadThemes(); $('#themeSel').value=name; toast('已保存:'+name); }catch(e){ toast('保存失败:'+e.message,false); } $('#themePanel').open=false; };
367
456
  $('#valBtn').onclick=async()=>{ const md=$('#md').value,theme=$('#themeSel').value; try{ const d=await api('/editor/api/render',{markdown:md,theme}); const v=d.validation||{}; const issues=(v.issues||[]).map(i=>'['+i.rule+'] '+i.message); setVal([{kind:v.pass?'ok':'err',text:v.pass?'✓ 校验通过':'✗ 校验未通过'},...issues.map(t=>({kind:v.pass?'warn':'err',text:t}))]); toast(v.pass?'校验通过':'校验未通过',v.pass); }catch(e){ toast('校验失败:'+e.message,false); } };
368
457
 
369
458
  // ---- 复制 / 发布 ----
@@ -375,8 +464,37 @@ $('#pubBtn').onclick=async()=>{ const title=$('#title').value||((($('#md').value
375
464
  // ---- 侧栏导航 / 设置 / AI 优化 ----
376
465
  function nav(id){ document.querySelectorAll('.subnav button').forEach(b=>b.classList.remove('active')); var b=document.getElementById(id); if(b)b.classList.add('active'); }
377
466
  $('#navTheme').onclick=()=>{ nav('navTheme'); $('#themePanel').open=true; $('#themeSel').focus(); };
467
+ // 点击页面其他位置关闭「主题管理」下拉;点侧栏「文章主题」或下拉内部(含 summary/菜单项)时不关闭
468
+ document.addEventListener('click',e=>{
469
+ const p=$('#themePanel'); if(!p||!p.open) return;
470
+ if(p.contains(e.target) || (e.target.closest && e.target.closest('#navTheme'))) return;
471
+ p.open=false;
472
+ });
378
473
  $('#navImgHost').onclick=()=>{ nav('navImgHost'); $('#imgHostOverlay').classList.add('show'); };
379
- $('#navAi').onclick=async()=>{ nav('navAi'); if(!$('#md').value.trim())return toast('请先输入文章',false); toast('AI 优化中(LLM)…'); try{ const d=await api('/editor/api/optimize',{markdown:$('#md').value}); $('#md').value=d.markdown; saveSnap(); render(); toast('AI 优化完成'); }catch(e){ toast('AI 优化失败:'+e.message,false); } };
474
+ function aiSelRange(){ const t=$('#md'); return { start:t.selectionStart, end:t.selectionEnd, text:(t.value||'').slice(t.selectionStart,t.selectionEnd) }; }
475
+ function refreshAiSel(){ const s=aiSelRange(); const info=$('#aiSelInfo'); if(info) info.textContent = s.text.trim() ? ('· 已选 '+s.text.length+' 字') : ''; }
476
+ $('#navAi').onclick=()=>{ nav('navAi'); if(!$('#md').value.trim())return toast('请先输入文章',false); refreshAiSel(); $('#aiOverlay').classList.add('show'); $('#aiPrompt').focus(); };
477
+ document.querySelectorAll('[data-close-ai]').forEach(b=>b.onclick=()=>{ $('#aiOverlay').classList.remove('show'); });
478
+ $('#aiOverlay').addEventListener('click',e=>{ if(e.target.id==='aiOverlay') $('#aiOverlay').classList.remove('show'); });
479
+ document.querySelectorAll('input[name="aiScope"]').forEach(r=>r.addEventListener('change',refreshAiSel));
480
+ $('#aiRun').onclick=async()=>{
481
+ const md=$('#md').value; if(!md.trim())return toast('请先输入文章',false);
482
+ const scope=document.querySelector('input[name="aiScope"]:checked').value;
483
+ const prompt=$('#aiPrompt').value.trim();
484
+ let selection;
485
+ if(scope==='sel'){ const s=aiSelRange(); if(s.end>s.start){ selection={start:s.start,end:s.end}; } else { toast('未选中文字,将优化全文',false); } }
486
+ $('#aiOverlay').classList.remove('show');
487
+ toast('AI 优化中(LLM)…');
488
+ try{
489
+ const body={ markdown:md }; if(prompt) body.prompt=prompt; if(selection) body.selection=selection;
490
+ const d=await api('/editor/api/optimize', body);
491
+ const t=$('#md');
492
+ if(selection){ t.value = md.slice(0,selection.start) + d.markdown + md.slice(selection.end); const pos=selection.start+d.markdown.length; t.setSelectionRange(pos,pos); }
493
+ else { t.value = d.markdown; }
494
+ saveSnap(); render();
495
+ toast(selection?'已优化选中片段':'AI 优化完成');
496
+ }catch(e){ toast('AI 优化失败:'+e.message,false); }
497
+ };
380
498
  // 设置弹窗:开关
381
499
  const relocateToggle=$('#relocateOpt'); relocateToggle.checked=localStorage.getItem('mp-relocate')!=='0'; relocateToggle.addEventListener('change',()=>localStorage.setItem('mp-relocate',relocateToggle.checked?'1':'0'));
382
500
  document.querySelectorAll('[data-close]').forEach(b=>b.onclick=()=>{ $('#imgHostOverlay').classList.remove('show'); });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stylewx/mcp-server",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "stylewx MCP Server: exposes styling/validate/publish capabilities to AI agents (Kimi Code / Claude Code / Cursor). stdio + Streamable HTTP.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -18,25 +18,24 @@
18
18
  "dist",
19
19
  "editor.html"
20
20
  ],
21
+ "dependencies": {
22
+ "@modelcontextprotocol/sdk": "^1.12.0",
23
+ "zod": "^4.0.0",
24
+ "@stylewx/service": "0.1.2",
25
+ "@stylewx/core": "0.1.2",
26
+ "@stylewx/theme": "0.1.2",
27
+ "@stylewx/publisher": "0.1.2",
28
+ "@stylewx/validator": "0.1.2"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
21
33
  "scripts": {
22
34
  "build": "tsc -p tsconfig.json",
23
35
  "test": "vitest run",
24
36
  "test:watch": "vitest",
25
37
  "type-check": "tsc -p tsconfig.json --noEmit",
26
38
  "dev": "node --import tsx/esm src/index.ts --transport stdio",
27
- "inspector": "node dist/index.js --transport stdio",
28
- "prepublishOnly": "pnpm build"
29
- },
30
- "dependencies": {
31
- "@stylewx/core": "workspace:*",
32
- "@stylewx/publisher": "workspace:*",
33
- "@stylewx/service": "workspace:*",
34
- "@stylewx/theme": "workspace:*",
35
- "@stylewx/validator": "workspace:*",
36
- "@modelcontextprotocol/sdk": "^1.12.0",
37
- "zod": "^4.0.0"
38
- },
39
- "publishConfig": {
40
- "access": "public"
39
+ "inspector": "node dist/index.js --transport stdio"
41
40
  }
42
- }
41
+ }