@chinhae/atw-cli 0.2.4 → 0.2.5

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.
Files changed (23) hide show
  1. package/README.md +34 -0
  2. package/dist/migrations/manifests/0.2.5.json +9 -0
  3. package/dist/templates/common/bundled-skills/dejargonizer/SKILL.md +133 -0
  4. package/dist/templates/common/bundled-skills/noob-mode/SKILL.md +175 -0
  5. package/dist/templates/common/bundled-skills/noob-mode/references/examples.md +418 -0
  6. package/dist/templates/common/bundled-skills/noob-mode/references/glossary.md +368 -0
  7. package/dist/templates/common/bundled-skills/oxy-explanation/SKILL.md +80 -0
  8. package/dist/templates/common/bundled-skills/oxy-learning-hub/SKILL.md +179 -0
  9. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/course.css +1044 -0
  10. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/course.js +184 -0
  11. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/lesson-template.html +125 -0
  12. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/summary-template.html +659 -0
  13. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/publishing.md +64 -0
  14. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/summary-mode.md +96 -0
  15. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/GLOSSARY-FORMAT.md +30 -0
  16. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/LEARNING-RECORD-FORMAT.md +42 -0
  17. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/MISSION-FORMAT.md +50 -0
  18. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/RESOURCES-FORMAT.md +40 -0
  19. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching-mode.md +251 -0
  20. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/workspace.md +112 -0
  21. package/dist/templates/common/bundled-skills/oxy-learning-hub/scripts/validate_html.py +198 -0
  22. package/dist/templates/common/bundled-skills/show-me/SKILL.md +127 -0
  23. package/package.json +2 -2
@@ -0,0 +1,659 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN" data-theme="light">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <meta name="color-scheme" content="light dark" />
7
+ <title>{{TITLE}}</title>
8
+ <script>
9
+ // 必须前置设置主题,避免页面首帧闪白或闪黑。
10
+ (() => {
11
+ const saved = localStorage.getItem("oxy-theme");
12
+ const systemDark = window.matchMedia(
13
+ "(prefers-color-scheme: dark)",
14
+ ).matches;
15
+ document.documentElement.dataset.theme =
16
+ saved || (systemDark ? "dark" : "light");
17
+ })();
18
+ </script>
19
+ <style>
20
+ :root,
21
+ :root[data-theme="light"] {
22
+ --bg: oklch(0.985 0.002 260);
23
+ --surface: oklch(1 0 0);
24
+ --raised: oklch(0.968 0.004 260);
25
+ --fg: oklch(0.22 0.014 265);
26
+ --muted: oklch(0.53 0.012 265);
27
+ --border: oklch(0.912 0.006 265);
28
+ --accent: oklch(0.5 0.15 262);
29
+ --accent-hover: oklch(0.42 0.15 262);
30
+ --on-accent: oklch(0.99 0.005 262);
31
+ --code-bg: oklch(0.19 0.014 265);
32
+ --code-fg: oklch(0.92 0.01 265);
33
+ --font-display:
34
+ system-ui, -apple-system, "Segoe UI", "PingFang SC", sans-serif;
35
+ --display-weight: 660;
36
+ --display-tracking: -0.03em;
37
+ --shadow:
38
+ 0 1px 2px color-mix(in oklch, var(--fg) 6%, transparent),
39
+ 0 8px 24px -16px color-mix(in oklch, var(--fg) 22%, transparent);
40
+ }
41
+
42
+ :root[data-theme="dark"] {
43
+ --bg: oklch(0.185 0.014 250);
44
+ --surface: oklch(0.225 0.016 250);
45
+ --raised: oklch(0.265 0.018 250);
46
+ --fg: oklch(0.945 0.008 250);
47
+ --muted: oklch(0.705 0.014 250);
48
+ --border: oklch(0.325 0.018 250);
49
+ --accent: oklch(0.8 0.13 178);
50
+ --accent-hover: oklch(0.88 0.13 178);
51
+ --on-accent: oklch(0.2 0.05 178);
52
+ --code-bg: oklch(0.155 0.014 250);
53
+ --code-fg: oklch(0.9 0.01 250);
54
+ --font-display:
55
+ ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace;
56
+ --display-weight: 600;
57
+ --display-tracking: -0.015em;
58
+ --shadow: 0 1px 2px color-mix(in oklch, black 24%, transparent);
59
+ }
60
+
61
+ :root {
62
+ --accent-soft: color-mix(in oklch, var(--accent) 12%, var(--surface));
63
+ --font-body:
64
+ "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", system-ui,
65
+ sans-serif;
66
+ --font-mono:
67
+ ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace;
68
+ --radius: 8px;
69
+ --radius-lg: 12px;
70
+ }
71
+
72
+ *,
73
+ *::before,
74
+ *::after {
75
+ box-sizing: border-box;
76
+ }
77
+
78
+ html {
79
+ scroll-behavior: smooth;
80
+ -webkit-text-size-adjust: 100%;
81
+ }
82
+
83
+ body {
84
+ margin: 0;
85
+ color: var(--fg);
86
+ background: var(--bg);
87
+ font-family: var(--font-body);
88
+ font-size: 16px;
89
+ line-height: 1.76;
90
+ -webkit-font-smoothing: antialiased;
91
+ transition:
92
+ color 0.2s ease,
93
+ background 0.2s ease;
94
+ }
95
+
96
+ a {
97
+ color: var(--accent);
98
+ text-decoration: none;
99
+ }
100
+
101
+ a:hover {
102
+ text-decoration: underline;
103
+ text-underline-offset: 0.2em;
104
+ }
105
+
106
+ button {
107
+ font: inherit;
108
+ cursor: pointer;
109
+ }
110
+
111
+ :focus-visible {
112
+ outline: 2px solid var(--accent);
113
+ outline-offset: 2px;
114
+ border-radius: 4px;
115
+ }
116
+
117
+ .topbar {
118
+ position: sticky;
119
+ top: 0;
120
+ z-index: 20;
121
+ border-bottom: 1px solid var(--border);
122
+ background: color-mix(in oklch, var(--bg) 86%, transparent);
123
+ backdrop-filter: saturate(1.3) blur(12px);
124
+ }
125
+
126
+ .topbar-inner {
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 16px;
130
+ width: min(84rem, 100%);
131
+ height: 56px;
132
+ margin-inline: auto;
133
+ padding: 0 32px;
134
+ }
135
+
136
+ .brand {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 10px;
140
+ font-weight: 620;
141
+ letter-spacing: -0.01em;
142
+ }
143
+
144
+ .brand-mark {
145
+ display: grid;
146
+ place-items: center;
147
+ width: 22px;
148
+ height: 22px;
149
+ border-radius: 6px;
150
+ color: var(--on-accent);
151
+ background: var(--accent);
152
+ font-family: var(--font-mono);
153
+ font-size: 11px;
154
+ font-weight: 700;
155
+ }
156
+
157
+ .document-type {
158
+ color: var(--muted);
159
+ font-family: var(--font-mono);
160
+ font-size: 13px;
161
+ letter-spacing: 0.02em;
162
+ }
163
+
164
+ .document-type::before {
165
+ content: "/";
166
+ margin-right: 10px;
167
+ color: var(--border);
168
+ }
169
+
170
+ .theme-toggle {
171
+ display: inline-flex;
172
+ align-items: center;
173
+ gap: 7px;
174
+ height: 32px;
175
+ margin-left: auto;
176
+ padding: 0 12px;
177
+ border: 1px solid var(--border);
178
+ border-radius: 999px;
179
+ color: var(--fg);
180
+ background: var(--surface);
181
+ font-size: 12.5px;
182
+ }
183
+
184
+ .theme-toggle:hover {
185
+ border-color: var(--fg);
186
+ background: var(--raised);
187
+ }
188
+
189
+ .theme-toggle svg {
190
+ display: block;
191
+ width: 14px;
192
+ height: 14px;
193
+ }
194
+
195
+ .theme-toggle .icon-sun {
196
+ display: none;
197
+ }
198
+
199
+ :root[data-theme="dark"] .theme-toggle .icon-sun {
200
+ display: block;
201
+ }
202
+
203
+ :root[data-theme="dark"] .theme-toggle .icon-moon {
204
+ display: none;
205
+ }
206
+
207
+ .progress-track,
208
+ .progress-line {
209
+ height: 2px;
210
+ }
211
+
212
+ .progress-line {
213
+ width: 0;
214
+ background: var(--accent);
215
+ }
216
+
217
+ .layout {
218
+ display: grid;
219
+ grid-template-columns: 15rem minmax(0, 48rem);
220
+ gap: 48px;
221
+ width: min(72rem, calc(100% - 64px));
222
+ margin-inline: auto;
223
+ padding: 48px 0 104px;
224
+ }
225
+
226
+ .toc {
227
+ position: sticky;
228
+ top: 88px;
229
+ align-self: start;
230
+ max-height: calc(100vh - 112px);
231
+ overflow: auto;
232
+ }
233
+
234
+ .toc-head,
235
+ .kicker {
236
+ font-family: var(--font-mono);
237
+ font-size: 10.5px;
238
+ letter-spacing: 0.16em;
239
+ text-transform: uppercase;
240
+ }
241
+
242
+ .toc-head {
243
+ margin: 0 0 14px;
244
+ color: var(--muted);
245
+ }
246
+
247
+ .toc ul,
248
+ .toc ol {
249
+ margin: 0;
250
+ padding: 0;
251
+ list-style: none;
252
+ }
253
+
254
+ .toc ul ul,
255
+ .toc ol ol,
256
+ .toc ul ol,
257
+ .toc ol ul {
258
+ margin-left: 18px;
259
+ }
260
+
261
+ .toc li {
262
+ margin: 0;
263
+ }
264
+
265
+ .toc a {
266
+ display: block;
267
+ padding: 6px 0;
268
+ color: var(--muted);
269
+ font-size: 13.5px;
270
+ line-height: 1.5;
271
+ transition: color 0.15s ease;
272
+ }
273
+
274
+ .toc a:hover,
275
+ .toc a.is-active {
276
+ color: var(--accent);
277
+ text-decoration: none;
278
+ }
279
+
280
+ main {
281
+ min-width: 0;
282
+ }
283
+
284
+ .document-header {
285
+ margin-bottom: 48px;
286
+ }
287
+
288
+ .kicker {
289
+ display: inline-flex;
290
+ margin: 0 0 20px;
291
+ padding: 5px 11px;
292
+ border-radius: 999px;
293
+ color: var(--accent);
294
+ background: var(--accent-soft);
295
+ }
296
+
297
+ h1,
298
+ h2 {
299
+ font-family: var(--font-display);
300
+ font-weight: var(--display-weight);
301
+ letter-spacing: var(--display-tracking);
302
+ text-wrap: balance;
303
+ }
304
+
305
+ h1 {
306
+ margin: 0;
307
+ font-size: clamp(32px, 5vw, 48px);
308
+ line-height: 1.15;
309
+ }
310
+
311
+ .meta {
312
+ margin: 18px 0 0;
313
+ color: var(--muted);
314
+ font-size: 14px;
315
+ }
316
+
317
+ h2 {
318
+ display: flex;
319
+ align-items: center;
320
+ gap: 14px;
321
+ margin: 56px 0 12px;
322
+ scroll-margin-top: 88px;
323
+ font-size: 22px;
324
+ line-height: 1.35;
325
+ }
326
+
327
+ h2::after {
328
+ content: "";
329
+ flex: 1;
330
+ height: 1px;
331
+ background: var(--border);
332
+ }
333
+
334
+ h3 {
335
+ margin: 30px 0 8px;
336
+ scroll-margin-top: 88px;
337
+ font-size: 17px;
338
+ line-height: 1.45;
339
+ }
340
+
341
+ p {
342
+ margin: 12px 0;
343
+ text-wrap: pretty;
344
+ }
345
+
346
+ ul,
347
+ ol {
348
+ padding-left: 1.25em;
349
+ }
350
+
351
+ li {
352
+ margin: 7px 0;
353
+ }
354
+
355
+ li::marker {
356
+ color: var(--muted);
357
+ }
358
+
359
+ blockquote {
360
+ margin: 22px 0;
361
+ padding: 14px 18px;
362
+ border-left: 2px solid var(--accent);
363
+ border-radius: 0 var(--radius) var(--radius) 0;
364
+ color: var(--muted);
365
+ background: var(--surface);
366
+ }
367
+
368
+ blockquote > :first-child {
369
+ margin-top: 0;
370
+ }
371
+
372
+ blockquote > :last-child {
373
+ margin-bottom: 0;
374
+ }
375
+
376
+ code {
377
+ font-family: var(--font-mono);
378
+ }
379
+
380
+ :not(pre) > code {
381
+ padding: 2px 6px;
382
+ border: 1px solid var(--border);
383
+ border-radius: 5px;
384
+ background: var(--raised);
385
+ font-size: 0.87em;
386
+ }
387
+
388
+ pre {
389
+ overflow-x: auto;
390
+ margin: 20px 0;
391
+ padding: 18px 20px;
392
+ border: 1px solid var(--border);
393
+ border-radius: var(--radius);
394
+ color: var(--code-fg);
395
+ background: var(--code-bg);
396
+ font-family: var(--font-mono);
397
+ font-size: 13px;
398
+ line-height: 1.78;
399
+ }
400
+
401
+ table {
402
+ display: block;
403
+ width: 100%;
404
+ overflow-x: auto;
405
+ margin: 22px 0;
406
+ border-collapse: collapse;
407
+ border: 1px solid var(--border);
408
+ border-radius: var(--radius);
409
+ background: var(--surface);
410
+ }
411
+
412
+ th,
413
+ td {
414
+ padding: 11px 13px;
415
+ border-bottom: 1px solid var(--border);
416
+ text-align: left;
417
+ vertical-align: top;
418
+ }
419
+
420
+ th {
421
+ background: var(--raised);
422
+ font-size: 14px;
423
+ }
424
+
425
+ tr:last-child td {
426
+ border-bottom: 0;
427
+ }
428
+
429
+ details {
430
+ margin: 18px 0;
431
+ padding: 14px 18px;
432
+ border: 1px solid var(--border);
433
+ border-radius: var(--radius-lg);
434
+ background: var(--surface);
435
+ box-shadow: var(--shadow);
436
+ }
437
+
438
+ summary {
439
+ cursor: pointer;
440
+ font-weight: 620;
441
+ }
442
+
443
+ hr {
444
+ margin: 48px 0;
445
+ border: 0;
446
+ border-top: 1px solid var(--border);
447
+ }
448
+
449
+ img,
450
+ video {
451
+ max-width: 100%;
452
+ height: auto;
453
+ border-radius: var(--radius-lg);
454
+ }
455
+
456
+ @media (max-width: 900px) {
457
+ .topbar-inner {
458
+ padding-inline: 20px;
459
+ }
460
+
461
+ .layout {
462
+ grid-template-columns: 1fr;
463
+ gap: 32px;
464
+ width: min(48rem, calc(100% - 40px));
465
+ padding-top: 28px;
466
+ }
467
+
468
+ .toc {
469
+ position: static;
470
+ max-height: none;
471
+ padding: 16px 18px;
472
+ border: 1px solid var(--border);
473
+ border-radius: var(--radius-lg);
474
+ background: var(--surface);
475
+ }
476
+
477
+ .toc > ul,
478
+ .toc > ol {
479
+ columns: 2;
480
+ column-gap: 24px;
481
+ }
482
+ }
483
+
484
+ @media (max-width: 560px) {
485
+ .document-type {
486
+ display: none;
487
+ }
488
+
489
+ .theme-toggle span {
490
+ display: none;
491
+ }
492
+
493
+ .theme-toggle {
494
+ width: 32px;
495
+ padding: 0;
496
+ justify-content: center;
497
+ }
498
+
499
+ .toc > ul,
500
+ .toc > ol {
501
+ columns: 1;
502
+ }
503
+ }
504
+
505
+ @media print {
506
+ .topbar,
507
+ .toc {
508
+ display: none;
509
+ }
510
+
511
+ body {
512
+ color: black;
513
+ background: white;
514
+ }
515
+
516
+ .layout {
517
+ display: block;
518
+ width: 100%;
519
+ padding: 0;
520
+ }
521
+ }
522
+ </style>
523
+ </head>
524
+ <body>
525
+ <header class="topbar">
526
+ <div class="topbar-inner">
527
+ <div class="brand">
528
+ <span class="brand-mark">O</span>
529
+ Oxy Learning Hub
530
+ <span class="document-type">summary</span>
531
+ </div>
532
+ <button
533
+ class="theme-toggle"
534
+ id="theme-toggle"
535
+ type="button"
536
+ aria-label="切换到深色主题"
537
+ >
538
+ <svg
539
+ class="icon-sun"
540
+ viewBox="0 0 24 24"
541
+ fill="none"
542
+ stroke="currentColor"
543
+ stroke-width="1.8"
544
+ stroke-linecap="round"
545
+ aria-hidden="true"
546
+ >
547
+ <circle cx="12" cy="12" r="4.2" />
548
+ <path
549
+ d="M12 2.6v2.2M12 19.2v2.2M2.6 12h2.2M19.2 12h2.2M5.3 5.3l1.6 1.6M17.1 17.1l1.6 1.6M18.7 5.3l-1.6 1.6M6.9 17.1l-1.6 1.6"
550
+ />
551
+ </svg>
552
+ <svg
553
+ class="icon-moon"
554
+ viewBox="0 0 24 24"
555
+ fill="none"
556
+ stroke="currentColor"
557
+ stroke-width="1.8"
558
+ stroke-linecap="round"
559
+ stroke-linejoin="round"
560
+ aria-hidden="true"
561
+ >
562
+ <path
563
+ d="M20.5 14.4A8.6 8.6 0 1 1 9.6 3.5a6.9 6.9 0 0 0 10.9 10.9Z"
564
+ />
565
+ </svg>
566
+ <span id="theme-label">深色</span>
567
+ </button>
568
+ </div>
569
+ <div class="progress-track">
570
+ <div class="progress-line" id="progress-line"></div>
571
+ </div>
572
+ </header>
573
+
574
+ <div class="layout">
575
+ <aside class="toc" aria-label="目录">
576
+ <p class="toc-head">内容目录</p>
577
+ {{TOC}}
578
+ </aside>
579
+
580
+ <main>
581
+ <header class="document-header">
582
+ <p class="kicker">结构化总结</p>
583
+ <h1>{{TITLE}}</h1>
584
+ <p class="meta">{{META}}</p>
585
+ </header>
586
+ {{CONTENT}}
587
+ </main>
588
+ </div>
589
+
590
+ <script>
591
+ (() => {
592
+ const root = document.documentElement;
593
+ const toggle = document.querySelector("#theme-toggle");
594
+ const label = document.querySelector("#theme-label");
595
+ const progress = document.querySelector("#progress-line");
596
+
597
+ const renderTheme = () => {
598
+ const toDark = root.dataset.theme !== "dark";
599
+ label.textContent = toDark ? "深色" : "浅色";
600
+ toggle.setAttribute(
601
+ "aria-label",
602
+ toDark ? "切换到深色主题" : "切换到浅色主题",
603
+ );
604
+ };
605
+
606
+ toggle.addEventListener("click", () => {
607
+ root.dataset.theme = root.dataset.theme === "dark" ? "light" : "dark";
608
+ localStorage.setItem("oxy-theme", root.dataset.theme);
609
+ renderTheme();
610
+ });
611
+
612
+ window
613
+ .matchMedia("(prefers-color-scheme: dark)")
614
+ .addEventListener("change", (event) => {
615
+ if (localStorage.getItem("oxy-theme")) return;
616
+ root.dataset.theme = event.matches ? "dark" : "light";
617
+ renderTheme();
618
+ });
619
+
620
+ const tocLinks = [...document.querySelectorAll('.toc a[href^="#"]')];
621
+ const headings = tocLinks
622
+ .map((link) => document.querySelector(link.getAttribute("href")))
623
+ .filter(Boolean);
624
+
625
+ if (headings.length) {
626
+ const observer = new IntersectionObserver(
627
+ (entries) => {
628
+ entries.forEach((entry) => {
629
+ if (!entry.isIntersecting) return;
630
+ tocLinks.forEach((link) => {
631
+ link.classList.toggle(
632
+ "is-active",
633
+ link.getAttribute("href") === `#${entry.target.id}`,
634
+ );
635
+ });
636
+ });
637
+ },
638
+ { rootMargin: "-88px 0px -70% 0px" },
639
+ );
640
+ headings.forEach((heading) => observer.observe(heading));
641
+ }
642
+
643
+ const renderProgress = () => {
644
+ const scrollable =
645
+ document.documentElement.scrollHeight - window.innerHeight;
646
+ const percent =
647
+ scrollable > 0
648
+ ? Math.min(100, (window.scrollY / scrollable) * 100)
649
+ : 0;
650
+ progress.style.width = `${percent}%`;
651
+ };
652
+
653
+ window.addEventListener("scroll", renderProgress, { passive: true });
654
+ renderTheme();
655
+ renderProgress();
656
+ })();
657
+ </script>
658
+ </body>
659
+ </html>
@@ -0,0 +1,64 @@
1
+ # 总结发布
2
+
3
+ 根据总结模式已确认的多选结果执行本文件中的对应分支。多个选项同时选择时全部执行,
4
+ 未选择的分支不执行。
5
+
6
+ ## 本地输出目录
7
+
8
+ 用户选择 Markdown 或 HTML 时,在当前项目根目录创建:
9
+
10
+ ```text
11
+ atlas-{YYYYMMDD}-{safe-title}/
12
+ ```
13
+
14
+ 只选择 Outline 时不创建本地目录。
15
+
16
+ ## Markdown
17
+
18
+ 用户选择“生成 Markdown 文档”时写入:
19
+
20
+ ```text
21
+ atlas-{YYYYMMDD}-{safe-title}/SUMMARY.md
22
+ ```
23
+
24
+ 如果总结将升级为教学,可以直接把该目录作为教学工作区并按需加入教学文件。
25
+ 写入内容与对话中的总结一致。
26
+
27
+ ## HTML
28
+
29
+ 用户选择“生成 HTML 单文件”时,读取 `assets/summary-template.html`,替换全部占位符:
30
+
31
+ - `{{TITLE}}`:可读标题;
32
+ - `{{META}}`:来源、作者或抓取日期,没有则留空;
33
+ - `{{TOC}}`:根据二级和三级标题生成的目录;
34
+ - `{{CONTENT}}`:由 Markdown 转换得到的语义化 HTML。
35
+
36
+ 输出为同目录的 `SUMMARY.html`。可以按视觉和交互需要使用远程字体、CSS、图片、
37
+ JavaScript 库或 Mermaid 运行时;多个页面会复用的配置优先放入共享 Assets。
38
+
39
+ 生成后运行:
40
+
41
+ ```bash
42
+ python3 scripts/validate_html.py atlas-.../SUMMARY.html
43
+ ```
44
+
45
+ ## Outline
46
+
47
+ 用户选择“写入 Outline”时,使用当前宿主可用的 Outline MCP 能力:
48
+
49
+ 1. 用户已指定 collection 或父文档时直接采用;
50
+ 2. 未指定时列出 collections;单条直接使用,多条只询问一次;
51
+ 3. Outline 的标题使用独立 title 字段;
52
+ 4. 正文第一个非空行若为 H1,删除该行及紧随的空行;
53
+ 5. 创建成功后返回文档 URL;
54
+ 6. 发布失败不影响已经生成的 Markdown 或 HTML,并报告原始错误信息。
55
+
56
+ 更新已有文档时先定位文档 ID,再更新正文,不新建重复文档。
57
+
58
+ ## 完成标准
59
+
60
+ - 已执行用户多选的全部载体,且未执行未选择的分支;
61
+ - 文件名安全且路径明确;
62
+ - HTML 没有未替换占位符,页面结构完整;
63
+ - Outline 正文不以 H1 开头;
64
+ - 每个分支都报告成功路径或失败原因。