@chinhae/atw-cli 0.2.10 → 0.3.1

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 (98) hide show
  1. package/README.md +29 -5
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +243 -123
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/uninstall.d.ts.map +1 -1
  6. package/dist/commands/uninstall.js +18 -3
  7. package/dist/commands/uninstall.js.map +1 -1
  8. package/dist/commands/update.d.ts +0 -3
  9. package/dist/commands/update.d.ts.map +1 -1
  10. package/dist/commands/update.js +45 -0
  11. package/dist/commands/update.js.map +1 -1
  12. package/dist/configurators/index.d.ts +8 -0
  13. package/dist/configurators/index.d.ts.map +1 -1
  14. package/dist/configurators/index.js +19 -0
  15. package/dist/configurators/index.js.map +1 -1
  16. package/dist/migrations/manifests/0.3.0.json +3410 -0
  17. package/dist/migrations/manifests/0.3.1.json +9 -0
  18. package/dist/templates/atw/config.yaml +4 -3
  19. package/dist/templates/atw/index.d.ts +2 -0
  20. package/dist/templates/atw/index.d.ts.map +1 -1
  21. package/dist/templates/atw/index.js +4 -0
  22. package/dist/templates/atw/index.js.map +1 -1
  23. package/dist/templates/atw/scripts/common/noob_mode.py +102 -0
  24. package/dist/templates/atw/scripts/common/session_context.py +7 -0
  25. package/dist/templates/atw/scripts/noob_mode.py +41 -0
  26. package/dist/templates/atw/scripts/tickets.py +66 -10
  27. package/dist/templates/atw/workflow.md +81 -17
  28. package/dist/templates/common/bundled-skills/atw-code-review/SKILL.md +4 -2
  29. package/dist/templates/common/bundled-skills/atw-codebase-design/DESIGN-IT-TWICE.md +1 -1
  30. package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/SKILL.md +2 -2
  31. package/dist/templates/common/bundled-skills/atw-domain-modeling/{CONTEXT-FORMAT.md → GLOSSARY-FORMAT.md} +10 -10
  32. package/dist/templates/common/bundled-skills/atw-domain-modeling/SKILL.md +12 -12
  33. package/dist/templates/common/bundled-skills/atw-handoff/SKILL.md +1 -1
  34. package/dist/templates/common/bundled-skills/atw-implement/SKILL.md +6 -4
  35. package/dist/templates/common/bundled-skills/atw-implement-spec/SKILL.md +79 -0
  36. package/dist/templates/common/bundled-skills/atw-implement-spec/agents/openai.yaml +5 -0
  37. package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/SKILL.md +5 -5
  38. package/dist/templates/common/bundled-skills/atw-init-repo/SKILL.md +6 -4
  39. package/dist/templates/common/bundled-skills/atw-init-repo/references/domain.md +8 -8
  40. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw-local.md +5 -2
  41. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw.md +5 -2
  42. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-github.md +5 -4
  43. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-gitlab.md +2 -2
  44. package/dist/templates/common/bundled-skills/atw-init-repo/references/triage-labels.md +1 -1
  45. package/dist/templates/common/bundled-skills/atw-interview/SKILL.md +9 -1
  46. package/dist/templates/common/bundled-skills/atw-map/SKILL.md +5 -5
  47. package/dist/templates/common/bundled-skills/atw-noob-mode/SKILL.md +101 -0
  48. package/dist/templates/common/bundled-skills/atw-noob-mode/agents/openai.yaml +3 -0
  49. package/dist/templates/common/bundled-skills/atw-spec/SKILL.md +1 -1
  50. package/dist/templates/common/bundled-skills/atw-tdd/SKILL.md +2 -2
  51. package/dist/templates/common/bundled-skills/atw-tickets/SKILL.md +4 -4
  52. package/dist/templates/common/bundled-skills/atw-triage/SKILL.md +2 -2
  53. package/dist/templates/common/commands/continue.md +1 -1
  54. package/dist/templates/opencode/plugins/inject-workflow-state.js +29 -1
  55. package/dist/templates/shared-hooks/inject-subagent-context.py +29 -3
  56. package/dist/templates/shared-hooks/inject-workflow-state.py +27 -3
  57. package/dist/templates/shared-hooks/session-start.py +23 -0
  58. package/dist/templates/snow/SNOW.md +1 -1
  59. package/dist/utils/file-writer.d.ts.map +1 -1
  60. package/dist/utils/file-writer.js +29 -16
  61. package/dist/utils/file-writer.js.map +1 -1
  62. package/dist/utils/interactive-guard.d.ts +2 -2
  63. package/dist/utils/interactive-guard.js +2 -2
  64. package/dist/utils/lang.d.ts +14 -0
  65. package/dist/utils/lang.d.ts.map +1 -0
  66. package/dist/utils/lang.js +20 -0
  67. package/dist/utils/lang.js.map +1 -0
  68. package/dist/utils/optional-skills.d.ts +90 -0
  69. package/dist/utils/optional-skills.d.ts.map +1 -0
  70. package/dist/utils/optional-skills.js +266 -0
  71. package/dist/utils/optional-skills.js.map +1 -0
  72. package/dist/utils/template-fetcher.d.ts +6 -0
  73. package/dist/utils/template-fetcher.d.ts.map +1 -1
  74. package/dist/utils/template-fetcher.js +1 -1
  75. package/dist/utils/template-fetcher.js.map +1 -1
  76. package/package.json +2 -2
  77. package/dist/templates/common/bundled-skills/atw-merge/SKILL.md +0 -14
  78. package/dist/templates/common/bundled-skills/atw-merge/agents/openai.yaml +0 -3
  79. package/dist/templates/common/bundled-skills/dejargonizer/SKILL.md +0 -133
  80. package/dist/templates/common/bundled-skills/noob-mode/SKILL.md +0 -175
  81. package/dist/templates/common/bundled-skills/noob-mode/references/examples.md +0 -418
  82. package/dist/templates/common/bundled-skills/noob-mode/references/glossary.md +0 -368
  83. package/dist/templates/common/bundled-skills/oxy-explanation/SKILL.md +0 -80
  84. package/dist/templates/common/bundled-skills/oxy-learning-hub/SKILL.md +0 -179
  85. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/course.css +0 -1044
  86. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/course.js +0 -184
  87. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/lesson-template.html +0 -125
  88. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/summary-template.html +0 -659
  89. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/publishing.md +0 -64
  90. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/summary-mode.md +0 -96
  91. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/GLOSSARY-FORMAT.md +0 -30
  92. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/LEARNING-RECORD-FORMAT.md +0 -42
  93. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/MISSION-FORMAT.md +0 -50
  94. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/RESOURCES-FORMAT.md +0 -40
  95. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching-mode.md +0 -251
  96. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/workspace.md +0 -112
  97. package/dist/templates/common/bundled-skills/oxy-learning-hub/scripts/validate_html.py +0 -200
  98. package/dist/templates/common/bundled-skills/show-me/SKILL.md +0 -127
@@ -1,659 +0,0 @@
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>
@@ -1,64 +0,0 @@
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
- - 每个分支都报告成功路径或失败原因。