@taloswork/ose-shared 0.1.8 → 0.1.9

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 (155) hide show
  1. package/package.json +3 -3
  2. package/skills/cozy-static-svg/SKILL.md +76 -0
  3. package/skills/cozy-static-svg/references/approved-preview.png +0 -0
  4. package/skills/cozy-static-svg/references/cross-platform.md +73 -0
  5. package/skills/cozy-static-svg/references/moon_keeps_watch.svg +229 -0
  6. package/skills/cozy-static-svg/references/style-anchor.md +271 -0
  7. package/skills/cozy-static-svg/scripts/artkit.py +321 -0
  8. package/skills/cozy-static-svg/scripts/to_png.py +333 -0
  9. package/skills/diagram-design/SKILL.md +568 -0
  10. package/skills/diagram-design/assets/example-architecture-dark.html +182 -0
  11. package/skills/diagram-design/assets/example-architecture-full.html +194 -0
  12. package/skills/diagram-design/assets/example-architecture.html +183 -0
  13. package/skills/diagram-design/assets/example-bar-dark.html +129 -0
  14. package/skills/diagram-design/assets/example-bar-full.html +105 -0
  15. package/skills/diagram-design/assets/example-bar.html +129 -0
  16. package/skills/diagram-design/assets/example-data-flow-dark.html +143 -0
  17. package/skills/diagram-design/assets/example-data-flow-full.html +185 -0
  18. package/skills/diagram-design/assets/example-data-flow.html +143 -0
  19. package/skills/diagram-design/assets/example-datalake-dark.html +243 -0
  20. package/skills/diagram-design/assets/example-datalake-full.html +248 -0
  21. package/skills/diagram-design/assets/example-datalake.html +269 -0
  22. package/skills/diagram-design/assets/example-dp-integration-dark.html +80 -0
  23. package/skills/diagram-design/assets/example-dp-integration-full.html +90 -0
  24. package/skills/diagram-design/assets/example-dp-integration.html +80 -0
  25. package/skills/diagram-design/assets/example-dp-security-matrix-dark.html +31 -0
  26. package/skills/diagram-design/assets/example-dp-security-matrix-full.html +32 -0
  27. package/skills/diagram-design/assets/example-dp-security-matrix.html +88 -0
  28. package/skills/diagram-design/assets/example-er-dark.html +202 -0
  29. package/skills/diagram-design/assets/example-er-full.html +205 -0
  30. package/skills/diagram-design/assets/example-er.html +202 -0
  31. package/skills/diagram-design/assets/example-flowchart-dark.html +156 -0
  32. package/skills/diagram-design/assets/example-flowchart-full.html +159 -0
  33. package/skills/diagram-design/assets/example-flowchart.html +156 -0
  34. package/skills/diagram-design/assets/example-gantt-dark.html +137 -0
  35. package/skills/diagram-design/assets/example-gantt-full.html +127 -0
  36. package/skills/diagram-design/assets/example-gantt.html +137 -0
  37. package/skills/diagram-design/assets/example-high-level-dark.html +251 -0
  38. package/skills/diagram-design/assets/example-high-level-full.html +247 -0
  39. package/skills/diagram-design/assets/example-high-level-vertical-dark.html +274 -0
  40. package/skills/diagram-design/assets/example-high-level-vertical-full.html +252 -0
  41. package/skills/diagram-design/assets/example-high-level-vertical.html +325 -0
  42. package/skills/diagram-design/assets/example-high-level.html +301 -0
  43. package/skills/diagram-design/assets/example-import-drawio.html +185 -0
  44. package/skills/diagram-design/assets/example-import-mermaid.html +70 -0
  45. package/skills/diagram-design/assets/example-it-state-dark.html +90 -0
  46. package/skills/diagram-design/assets/example-it-state-full.html +69 -0
  47. package/skills/diagram-design/assets/example-it-state.html +128 -0
  48. package/skills/diagram-design/assets/example-layers-dark.html +123 -0
  49. package/skills/diagram-design/assets/example-layers-full.html +126 -0
  50. package/skills/diagram-design/assets/example-layers.html +123 -0
  51. package/skills/diagram-design/assets/example-line-dark.html +111 -0
  52. package/skills/diagram-design/assets/example-line-full.html +105 -0
  53. package/skills/diagram-design/assets/example-line.html +111 -0
  54. package/skills/diagram-design/assets/example-loop-dark.html +100 -0
  55. package/skills/diagram-design/assets/example-loop-full.html +137 -0
  56. package/skills/diagram-design/assets/example-loop-terminal.html +347 -0
  57. package/skills/diagram-design/assets/example-loop.html +100 -0
  58. package/skills/diagram-design/assets/example-medallion-dark.html +159 -0
  59. package/skills/diagram-design/assets/example-medallion-full.html +201 -0
  60. package/skills/diagram-design/assets/example-medallion.html +159 -0
  61. package/skills/diagram-design/assets/example-nested-dark.html +132 -0
  62. package/skills/diagram-design/assets/example-nested-full.html +135 -0
  63. package/skills/diagram-design/assets/example-nested.html +136 -0
  64. package/skills/diagram-design/assets/example-org-chart-dark.html +45 -0
  65. package/skills/diagram-design/assets/example-org-chart-full.html +45 -0
  66. package/skills/diagram-design/assets/example-org-chart.html +45 -0
  67. package/skills/diagram-design/assets/example-paved-road-animated.html +546 -0
  68. package/skills/diagram-design/assets/example-policy-trace-animated.html +490 -0
  69. package/skills/diagram-design/assets/example-process-dark.html +64 -0
  70. package/skills/diagram-design/assets/example-process-full.html +74 -0
  71. package/skills/diagram-design/assets/example-process.html +64 -0
  72. package/skills/diagram-design/assets/example-pyramid-dark.html +119 -0
  73. package/skills/diagram-design/assets/example-pyramid-full.html +122 -0
  74. package/skills/diagram-design/assets/example-pyramid.html +119 -0
  75. package/skills/diagram-design/assets/example-quadrant-consultant.html +166 -0
  76. package/skills/diagram-design/assets/example-quadrant-dark.html +135 -0
  77. package/skills/diagram-design/assets/example-quadrant-full.html +138 -0
  78. package/skills/diagram-design/assets/example-quadrant.html +135 -0
  79. package/skills/diagram-design/assets/example-queue-animated.html +577 -0
  80. package/skills/diagram-design/assets/example-radar-dark.html +139 -0
  81. package/skills/diagram-design/assets/example-radar-full.html +135 -0
  82. package/skills/diagram-design/assets/example-radar.html +139 -0
  83. package/skills/diagram-design/assets/example-scatter-dark.html +141 -0
  84. package/skills/diagram-design/assets/example-scatter-full.html +116 -0
  85. package/skills/diagram-design/assets/example-scatter.html +141 -0
  86. package/skills/diagram-design/assets/example-sequence-dark.html +222 -0
  87. package/skills/diagram-design/assets/example-sequence-full.html +388 -0
  88. package/skills/diagram-design/assets/example-sequence-oauth-dark.html +188 -0
  89. package/skills/diagram-design/assets/example-sequence-oauth-full.html +350 -0
  90. package/skills/diagram-design/assets/example-sequence-oauth.html +227 -0
  91. package/skills/diagram-design/assets/example-sequence.html +222 -0
  92. package/skills/diagram-design/assets/example-state-dark.html +147 -0
  93. package/skills/diagram-design/assets/example-state-full.html +150 -0
  94. package/skills/diagram-design/assets/example-state.html +147 -0
  95. package/skills/diagram-design/assets/example-swimlane-dark.html +172 -0
  96. package/skills/diagram-design/assets/example-swimlane-full.html +175 -0
  97. package/skills/diagram-design/assets/example-swimlane.html +172 -0
  98. package/skills/diagram-design/assets/example-timeline-dark.html +135 -0
  99. package/skills/diagram-design/assets/example-timeline-full.html +138 -0
  100. package/skills/diagram-design/assets/example-timeline.html +135 -0
  101. package/skills/diagram-design/assets/example-tree-dark.html +173 -0
  102. package/skills/diagram-design/assets/example-tree-full.html +176 -0
  103. package/skills/diagram-design/assets/example-tree.html +173 -0
  104. package/skills/diagram-design/assets/example-venn-dark.html +132 -0
  105. package/skills/diagram-design/assets/example-venn-full.html +135 -0
  106. package/skills/diagram-design/assets/example-venn.html +110 -0
  107. package/skills/diagram-design/assets/icons.html +230 -0
  108. package/skills/diagram-design/assets/index.html +369 -0
  109. package/skills/diagram-design/assets/template-dark.html +85 -0
  110. package/skills/diagram-design/assets/template-full.html +413 -0
  111. package/skills/diagram-design/assets/template-motion.html +434 -0
  112. package/skills/diagram-design/assets/template-terminal.html +173 -0
  113. package/skills/diagram-design/assets/template.html +86 -0
  114. package/skills/diagram-design/references/animation.md +141 -0
  115. package/skills/diagram-design/references/export.md +136 -0
  116. package/skills/diagram-design/references/import-drawio.md +171 -0
  117. package/skills/diagram-design/references/import-mermaid.md +126 -0
  118. package/skills/diagram-design/references/onboarding.md +297 -0
  119. package/skills/diagram-design/references/output-spec.md +181 -0
  120. package/skills/diagram-design/references/primitive-annotation.md +36 -0
  121. package/skills/diagram-design/references/primitive-icons.md +827 -0
  122. package/skills/diagram-design/references/primitive-sketchy.md +43 -0
  123. package/skills/diagram-design/references/primitive-terminal.md +76 -0
  124. package/skills/diagram-design/references/semantic-patterns.md +122 -0
  125. package/skills/diagram-design/references/style-guide.md +139 -0
  126. package/skills/diagram-design/references/type-architecture.md +78 -0
  127. package/skills/diagram-design/references/type-bar.md +48 -0
  128. package/skills/diagram-design/references/type-data-flow.md +374 -0
  129. package/skills/diagram-design/references/type-dp-integration.md +410 -0
  130. package/skills/diagram-design/references/type-dp-security-matrix.md +379 -0
  131. package/skills/diagram-design/references/type-er.md +23 -0
  132. package/skills/diagram-design/references/type-flowchart.md +23 -0
  133. package/skills/diagram-design/references/type-gantt.md +45 -0
  134. package/skills/diagram-design/references/type-high-level.md +458 -0
  135. package/skills/diagram-design/references/type-it-state.md +470 -0
  136. package/skills/diagram-design/references/type-layers.md +26 -0
  137. package/skills/diagram-design/references/type-line.md +44 -0
  138. package/skills/diagram-design/references/type-loop.md +223 -0
  139. package/skills/diagram-design/references/type-medallion.md +356 -0
  140. package/skills/diagram-design/references/type-nested.md +22 -0
  141. package/skills/diagram-design/references/type-org-chart.md +44 -0
  142. package/skills/diagram-design/references/type-process.md +495 -0
  143. package/skills/diagram-design/references/type-pyramid.md +33 -0
  144. package/skills/diagram-design/references/type-quadrant.md +81 -0
  145. package/skills/diagram-design/references/type-radar.md +80 -0
  146. package/skills/diagram-design/references/type-scatter.md +39 -0
  147. package/skills/diagram-design/references/type-sequence.md +130 -0
  148. package/skills/diagram-design/references/type-state.md +21 -0
  149. package/skills/diagram-design/references/type-swimlane.md +20 -0
  150. package/skills/diagram-design/references/type-timeline.md +20 -0
  151. package/skills/diagram-design/references/type-tree.md +24 -0
  152. package/skills/diagram-design/references/type-venn.md +26 -0
  153. package/skills/diagram-design/scripts/drawio_extract.py +856 -0
  154. package/skills/diagram-design/scripts/mermaid_extract.py +1285 -0
  155. package/skills/diagram-design/scripts/self_check.py +389 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taloswork/ose-shared",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "Talos cross-OSE shared library — skills + MCP servers auto-loaded into every OSE (P93 2026-07-27).",
5
5
  "type": "module",
6
6
  "files": [
@@ -10,6 +10,6 @@
10
10
  "publishConfig": {
11
11
  "access": "public"
12
12
  },
13
- "_talosPublishHash": "sha256-Jwek2npsPD2O5y281xlaBct9hS3AkgkMGHd-LXNgHCw",
14
- "_talosPublishedAt": "2026-09-16T17:21:18.072Z"
13
+ "_talosPublishHash": "sha256-G225GKl7MFuGzmHVNTAmkcBmcOohJvs3RLcQOy4ffEo",
14
+ "_talosPublishedAt": "2026-09-21T07:29:20.819Z"
15
15
  }
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: cozy-static-svg
3
+ description: "手工编写纯静态 SVG 插画:柔和渐变、圆润主体、舒适留白,可配温柔短句或贴题的唐宋诗词;色系自由、默认明快。适用于手绘 SVG、静态插画、治愈插画、诗词配图、沿用上次画风、再画一张等请求。"
4
+ ---
5
+
6
+ # 温柔静态 SVG 插画
7
+
8
+ ## 使用依据与范围
9
+
10
+ 用户以《月亮替你值夜班》为准,认可这套画风、精细度与制作流程;要求**手写直出原生 SVG、不转 PNG**:以速查表约束画风,以质检脚本守住最后质量。
11
+
12
+ - 认可原作:`references/moon_keeps_watch.svg`;风格参考:`references/approved-preview.png`。
13
+ - **速查与配方(每幅开画前必读)**:`references/style-anchor.md`。
14
+ - **跨平台速查**:`references/cross-platform.md`(macOS / Windows 命令对照、字体差异、转 PNG、故障对照)。
15
+ - **脚本(两平台共用同一份,不写死绝对路径)**:`scripts/artkit.py` 质检(结构校验+画风合规报告,秒级,不出图、不转 PNG;文件 / 目录 / 通配符都收,纯标准库);`scripts/to_png.py` 转 PNG(仅在用户明确要 PNG 时用,跨平台自动挑后端)。
16
+ - 首幅或题材类型首次出现时,可对照原作与风格参考复习一次;之后速查表+质检即可。
17
+ - 固定的是画风、方法、完成度,不是题材;不要每张重复同一主体、结构或坐标;成批出图按速查表的「题材轮换」主动错开。
18
+ - 拼接已有作品用 image-layout 技能,保持原图,不要用简化重绘冒充。
19
+ - 不改动原作母版;每次新建独立文件。
20
+
21
+ ## 提速工作流(默认按此执行)
22
+
23
+ 1. **一句话定创意**:主体姿态+环境结构+主光源位置。用户给了内容就直接用,不追问低风险细节。
24
+ 2. **读速查表**:`references/style-anchor.md`(画风、硬底线、题材轮换、配方与清单都在里面)。
25
+ 3. **手写整幅 SVG**:一次写全;defs+use 复用重复小元素;落盘前按速查表「开画前自查清单」过一遍。
26
+ 4. **一条命令质检**:
27
+
28
+ ```bash
29
+ python3 scripts/artkit.py 作品.svg # macOS / Linux
30
+ py -3 scripts\artkit.py 作品.svg # Windows
31
+ ```
32
+
33
+ 参数给目录或通配符即为批量(如 `python3 scripts/artkit.py .`),通配符由脚本自己展开,
34
+ 两个平台写法一致;细节见 `references/cross-platform.md`。
35
+ 报告含结构、圆角裁切、引用、字体、调色清单、文案清单;**无 ✗ 才算过**。不通过就用 edit 精准修复(只动需要动的坐标 / 路径 / 层级),再跑一次;成功报告留着核对文案与调色。
36
+ 5. **交付**:`present_file` 直出原生 SVG;预览、脚本不交付。质检报告核对过后,直接用温柔、贴合画面意境的一两句话交付,**严禁输出“质检通过、直出原生 SVG”这类生硬的技术汇报**。
37
+
38
+ - **成批出图**:先按顺序写完所有 SVG,再用一条命令批量质检(传目录或通配符即可),逐个按报告核对。
39
+ - **不拆子 agent**:画 SVG 全程自己完成,不派子 agent、不并行外发。逐张手写、逐张落盘、最后统一质检;成批也是串行画完再批量质检,不用子 agent 分担画面。
40
+ - **默认不渲染、不转 PNG**:直接交付原生 SVG。
41
+ - 不调用生图模型替代手绘;不把位图包进 SVG。
42
+
43
+ ## 画风与底线(细节与配方见速查表)
44
+
45
+ **画风(长什么样)**
46
+ - 情绪:安静、柔软、温暖、有一点生活趣味;每张只讲一个看得懂的小故事。
47
+ - 形状:手写贝塞尔与基础几何,圆润自然;大形先成立,细节克制;不以元素数量代替质量。
48
+ - 构图:默认 1200×900;舒服的留白;远/中/近与承托面分层;全幅圆角由最外层 clipPath 统一裁切(含文字)。
49
+ - 光与渐变:渐变过渡自然、层次分明、主光源统一(暖灯 / 冷月 / 落日 / 晨雾 / 日间自然光皆可)。
50
+
51
+ **硬底线(不可让步,详见速查表)**
52
+ - 明度均衡:不设固定色板——每幅按题材与情绪自由发挥、可多变;保持整幅协调;**默认明快,亮调与中间调为主,深色夜景只做少数**(原作那套夜色不是默认值)。
53
+ - 对比度:明快不等于发飘——亮底要有深色锚点,深底要有大面积亮部;整幅留一处明确的明暗落差,且集中在少数区域。
54
+ - 文字可读性:按文字所在区域的实际底色选色(不是按整幅平均色);亮底深字、暗底亮字;字号越小对比要求越高;脸、轮廓、文字对比必须清楚。详见速查表的「文字可读性」。
55
+ - 题材轮换:连续两张不同类型,每 4 张覆盖三类以上,同一母题最多两次。详见速查表的「题材轮换」。
56
+
57
+ **文案与落款**
58
+ - 上限:最多标题+一句温柔注脚(+少量落款);字体栈含中文系统回退。
59
+ - 诗词版:画面相宜时左下角可改题一首贴题的唐宋诗词(诗句两行+出处一行),此时**去掉右下小字**,全图五处文字(左上标题、右上落款、左下诗句与出处);标题写自己的话、诗句引原典,两者不重复。结构与对比照速查表的「诗词版」。
60
+ - 落款名不写死:按当前使用者的称呼填写;不确定就改用中性落款(如「晚安」),宁可无名字也不要猜错。详见速查表的「落款名:按使用者替换,不要照抄」。
61
+
62
+ **技术与可访问性**
63
+ - 含命名空间;显式 width/height/viewBox;`role="img"` 与 `aria-labelledby`;title/desc 如实;纯静态、纯矢量、自包含(无动画 / 脚本 / 外链 / 位图)。
64
+
65
+ ## 交付前质量核对
66
+
67
+ - 质检报告无 ✗:结构、圆角裁切(全部内容在框内)、引用、字体栈、静态底线。
68
+ - 文字可读性已核对:各处文字(标题、注脚、诗词、落款、小字)在其底色上都能轻松读出来;没有低对比或横跨明暗交界的句子。
69
+ - 对比度已核对:有一处明确的明暗落差,且集中在少数区域,没有整幅发飘或处处高对比。
70
+ - 落款名已核对:是当前使用者的称呼,或中性落款;没有照抄示例里的名字。
71
+ - 若用了诗词版:五处文字齐全(左上标题、右上落款、左下诗句与出处),右下无小字。
72
+ - 成批时题材轮换已核对:连续两张不同类型,母题未超两次。
73
+ - 整幅用色协调统一(色系自由、可多变);文案逐句核对无错字、无残缺句。
74
+ - 自查清单已勾完;最终交付 = 质检通过的最新版原生 SVG。
75
+
76
+
@@ -0,0 +1,73 @@
1
+ # 跨平台速查(macOS / Windows / Linux)
2
+
3
+ 这套技能本体是「手写 SVG 文本 + 纯标准库 Python 脚本」,没有平台依赖。
4
+ 真正需要按系统调整的只有两件事:**质检命令怎么写**、**转 PNG 用什么工具**。
5
+
6
+ ## 一、质检命令
7
+
8
+ 脚本 `scripts/artkit.py` 只用 Python 标准库(需 **Python 3.9+**),两个平台都能跑。
9
+ 参数支持**文件 / 目录 / 通配符**——目录会递归找全部 `.svg`;通配符由脚本自己展开,
10
+ 所以 PowerShell 不必先替命令展开 `*.svg`,两边的写法才真正一致。
11
+
12
+ | 场景 | macOS / Linux | Windows |
13
+ | --- | --- | --- |
14
+ | 单张 | `python3 scripts/artkit.py 作品.svg` | `py -3 scripts\artkit.py 作品.svg` |
15
+ | 整批(当前目录) | `python3 scripts/artkit.py .` | `py -3 scripts\artkit.py .` |
16
+ | 整批(通配符) | `python3 scripts/artkit.py "out/*.svg"` | `py -3 scripts\artkit.py "out\*.svg"` |
17
+ | 严格模式 | 加 `--strict`(提示也算不合格) | 同左 |
18
+
19
+ - Windows 上用 `py -3` 最稳;若装了新版 Python 且 PATH 里有 `python`,也可用 `python scripts\artkit.py`。
20
+ - 脚本已强制 UTF-8 输出,中文报告在 PowerShell / cmd 里不会乱码;个别老终端若仍乱码,先跑 `chcp 65001`。
21
+ - 退出码:0 通过,1 有不合格项 —— 可接进任何平台的脚本里做关卡。
22
+
23
+ ## 二、转 PNG(默认不做,用户明确要才做)
24
+
25
+ 默认工作流是**直出原生 SVG,不转 PNG**。用户明确要 PNG 时用 `scripts/to_png.py`,
26
+ 它自动探测本机可用的后端,两个平台命令一致:
27
+
28
+ ```bash
29
+ python3 scripts/to_png.py 作品.svg # macOS / Linux
30
+ py -3 scripts\to_png.py 作品.svg # Windows
31
+ python3 scripts/to_png.py --scale 2 . # 整目录,2 倍图
32
+ python3 scripts/to_png.py -o out 作品目录 # 指定输出目录
33
+ ```
34
+
35
+ 后端优先级:`rsvg-convert` → `inkscape` → `cairosvg` → `chrome/edge`(找不到可用的会给出安装提示)。
36
+ 也可以 `--backend inkscape` 手动指定。
37
+
38
+ | 后端 | macOS | Windows | 备注 |
39
+ | --- | --- | --- | --- |
40
+ | rsvg-convert | `brew install librsvg` | MSYS2 `pacman -S mingw-w64-x86_64-librsvg` | 与手绘流程同源,首选 |
41
+ | Inkscape | `brew install --cask inkscape` | 官网安装包(自带你丢命令行) | 图形界面顺手可编辑 |
42
+ | cairosvg | `pip install cairosvg` | 同左(wheel 自带 cairo) | 纯 Python 路线 |
43
+ | chrome / edge | 系统已有 Chrome/Edge 即可 | 系统自带 Edge 即可 | 零安装兜底,`--backend chrome` |
44
+
45
+ - 默认**保留透明底**(画风四角是圆角);要白底加 `--background FFFFFF`。
46
+ - 不指定尺寸时按 SVG 原始宽高输出(默认画布 1200×900),`--scale 2` 得 2400×1800。
47
+ - 不要用「截图整个屏幕」的方式凑 PNG;也不要把位图塞回 SVG。
48
+
49
+ ## 三、字体差异(唯一会看出区别的地方)
50
+
51
+ 字体栈固定为 `'PingFang SC','Noto Sans CJK SC','Microsoft YaHei',sans-serif`:
52
+
53
+ - macOS → **苹方**(PingFang SC);Windows → **微软雅黑**(Microsoft YaHei);两者都不会掉成方块。
54
+ - 字形与字宽略有差异(雅黑略宽、笔画更方),同一句话两平台占宽差几个百分点。
55
+ 本套画风标题与注脚都留了大片留白,**不会溢出画布**;做像素级对齐要求极高的活儿时,
56
+ 要么目标平台上装苹方(字体授权自行确认),要么把文字转成路径(代价:以后不能改文案)。
57
+ - Linux 上若两者都没有,装 `fonts-noto-cjk` 即可命中第二顺位。
58
+
59
+ ## 四、常见问题对照
60
+
61
+ | 现象 | 处理 |
62
+ | --- | --- |
63
+ | `python3: command not found`(Windows) | 改用 `py -3`;或到 python.org 装新版并勾选 Add to PATH |
64
+ | PowerShell 报找不到 `*.svg` | 参数用目录 `.`,或给通配符加引号 `"out\*.svg"`,脚本会自己展开 |
65
+ | 报告中文乱码 | 脚本已强制 UTF-8;老终端再执行 `chcp 65001` |
66
+ | `rsvg-convert` 不存在(Windows) | 用 `--backend inkscape` 或 `--backend chrome`(系统自带 Edge) |
67
+ | PNG 四角是透明格子 | 正常,画风就是圆角;要白底加 `--background FFFFFF` |
68
+ | 提示缺少 Python 版本 | 需 3.9+(用到 `str.removesuffix`),脚本会直接告诉你当前版本 |
69
+
70
+ ## 五、底线
71
+
72
+ - 交付物永远是**质检通过的原生 SVG**;PNG 只是复制品,改图只改 SVG 源文件。
73
+ - 两个平台跑同一份 `scripts/`,不各自维护两套;路径一律相对技能目录,不写死绝对路径。
@@ -0,0 +1,229 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="900" viewBox="0 0 1200 900" role="img" aria-labelledby="art-title art-desc">
2
+ <title id="art-title">月亮替你值夜班</title>
3
+ <desc id="art-desc">一幅纯静态矢量插画:紫粉色夜空映在拱形窗里,月牙与星星照着远山。胖橘猫坐在窗台上,旁边有一盏暖黄色小灯、一盆绿植和一本翻开的书。今晚的任务,只有好好休息。</desc>
4
+ <defs>
5
+ <linearGradient id="room" x1="0" y1="0" x2="0.8" y2="1">
6
+ <stop stop-color="#252138"/>
7
+ <stop offset="0.6" stop-color="#46334D"/>
8
+ <stop offset="1" stop-color="#70515F"/>
9
+ </linearGradient>
10
+ <radialGradient id="room-light" cx="76%" cy="72%" r="57%">
11
+ <stop stop-color="#DFA878" stop-opacity="0.2"/>
12
+ <stop offset="1" stop-color="#DFA878" stop-opacity="0"/>
13
+ </radialGradient>
14
+ <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
15
+ <stop stop-color="#343453"/>
16
+ <stop offset="0.48" stop-color="#77627D"/>
17
+ <stop offset="1" stop-color="#E8AD9B"/>
18
+ </linearGradient>
19
+ <linearGradient id="hill-far" x1="0" y1="0" x2="0" y2="1">
20
+ <stop stop-color="#97788D"/>
21
+ <stop offset="1" stop-color="#7E617F"/>
22
+ </linearGradient>
23
+ <linearGradient id="hill-near" x1="0" y1="0" x2="0" y2="1">
24
+ <stop stop-color="#51465F"/>
25
+ <stop offset="1" stop-color="#3D364F"/>
26
+ </linearGradient>
27
+ <linearGradient id="wood" x1="0" y1="0" x2="0" y2="1">
28
+ <stop stop-color="#997379"/>
29
+ <stop offset="1" stop-color="#775766"/>
30
+ </linearGradient>
31
+ <linearGradient id="desk" x1="0" y1="0" x2="0" y2="1">
32
+ <stop stop-color="#564052"/>
33
+ <stop offset="1" stop-color="#342C42"/>
34
+ </linearGradient>
35
+ <linearGradient id="fur" x1="0" y1="0" x2="1" y2="0.7">
36
+ <stop stop-color="#D89462"/>
37
+ <stop offset="0.55" stop-color="#ECAE78"/>
38
+ <stop offset="1" stop-color="#F5CA94"/>
39
+ </linearGradient>
40
+ <linearGradient id="tail-fur" x1="0" y1="0" x2="1" y2="0">
41
+ <stop stop-color="#C4855F"/>
42
+ <stop offset="1" stop-color="#EDB783"/>
43
+ </linearGradient>
44
+ <radialGradient id="lamp-halo">
45
+ <stop stop-color="#FFD29A" stop-opacity="0.35"/>
46
+ <stop offset="0.5" stop-color="#FFC989" stop-opacity="0.12"/>
47
+ <stop offset="1" stop-color="#FFC989" stop-opacity="0"/>
48
+ </radialGradient>
49
+ <linearGradient id="glass" x1="0" y1="0" x2="0.5" y2="1">
50
+ <stop stop-color="#FFE9BB"/>
51
+ <stop offset="0.6" stop-color="#FFDAA0"/>
52
+ <stop offset="1" stop-color="#ECC18A"/>
53
+ </linearGradient>
54
+ <linearGradient id="lamp-base" x1="0" y1="0" x2="1" y2="0">
55
+ <stop stop-color="#455D59"/>
56
+ <stop offset="0.6" stop-color="#61746A"/>
57
+ <stop offset="1" stop-color="#879081"/>
58
+ </linearGradient>
59
+ <clipPath id="canvas"><rect width="1200" height="900" rx="30"/></clipPath>
60
+ <clipPath id="window">
61
+ <path d="M270 698V472C270 294 416 166 600 166S930 294 930 472V698Z"/>
62
+ </clipPath>
63
+ <clipPath id="cat-body">
64
+ <path d="M450 568C411 598 394 635 398 672C400 705 428 718 475 719C526 720 558 705 556 669C554 630 527 592 505 573Z"/>
65
+ </clipPath>
66
+ <mask id="crescent" maskUnits="userSpaceOnUse" x="707" y="250" width="120" height="120">
67
+ <rect x="707" y="250" width="120" height="120" fill="black"/>
68
+ <circle cx="767" cy="310" r="48" fill="white"/>
69
+ <circle cx="786" cy="293" r="43" fill="black"/>
70
+ </mask>
71
+ <path id="spark" d="M0-8Q1-1 8 0Q1 1 0 8Q-1 1-8 0Q-1-1 0-8Z"/>
72
+ </defs>
73
+
74
+ <g clip-path="url(#canvas)">
75
+ <!-- 安静的室内与留白 -->
76
+ <rect width="1200" height="900" fill="url(#room)"/>
77
+ <rect width="1200" height="900" fill="url(#room-light)"/>
78
+ <path d="M86 122H135" stroke="#D8B68B" stroke-width="2" stroke-linecap="round"/>
79
+ <g font-family="'PingFang SC','Noto Sans CJK SC','Microsoft YaHei',sans-serif">
80
+ <text x="86" y="92" fill="#F5E1CD" font-size="27" font-weight="500" letter-spacing="4">月亮替你值夜班</text>
81
+ <text x="1112" y="90" text-anchor="end" fill="#C7AFAD" font-size="15" letter-spacing="3">晚安 · 阿答</text>
82
+ </g>
83
+
84
+ <!-- 拱窗:所有远景均收在完整窗框内 -->
85
+ <path d="M254 707V472C254 284 409 149 600 149S946 284 946 472V707Z" fill="#2B243A"/>
86
+ <path d="M262 703V472C262 289 412 158 600 158S938 289 938 472V703Z" fill="#A38189"/>
87
+ <g clip-path="url(#window)">
88
+ <rect x="260" y="158" width="682" height="552" fill="url(#sky)"/>
89
+ <circle cx="767" cy="310" r="110" fill="#FFF0C5" opacity="0.025"/>
90
+ <circle cx="767" cy="310" r="77" fill="#FFF0C5" opacity="0.045"/>
91
+ <circle cx="767" cy="310" r="48" fill="#FFF0C5" mask="url(#crescent)"/>
92
+ <!-- 定格的星光,没有动画 -->
93
+ <g fill="#F8E8CA">
94
+ <circle cx="450" cy="281" r="2" opacity="0.75"/>
95
+ <circle cx="559" cy="219" r="1.7" opacity="0.55"/>
96
+ <circle cx="651" cy="278" r="1.5" opacity="0.8"/>
97
+ <circle cx="691" cy="230" r="1.7" opacity="0.6"/>
98
+ <circle cx="835" cy="392" r="2" opacity="0.7"/>
99
+ <circle cx="369" cy="437" r="1.5" opacity="0.65"/>
100
+ <circle cx="520" cy="402" r="1.4" opacity="0.65"/>
101
+ <circle cx="625" cy="456" r="1.6" opacity="0.55"/>
102
+ <circle cx="865" cy="483" r="1.2" opacity="0.6"/>
103
+ <use href="#spark" transform="translate(565 332)" opacity="0.8"/>
104
+ <use href="#spark" transform="translate(388 352) scale(0.7)" opacity="0.65"/>
105
+ <use href="#spark" transform="translate(722 418) scale(0.55)" opacity="0.7"/>
106
+ </g>
107
+ <g fill="none" stroke="#F4D4CA" stroke-linecap="round">
108
+ <path d="M338 471Q387 460 448 470" stroke-width="3" opacity="0.15"/>
109
+ <path d="M577 510Q660 495 721 507" stroke-width="3" opacity="0.13"/>
110
+ <path d="M799 445H844" stroke-width="2" opacity="0.14"/>
111
+ </g>
112
+ <!-- 三层柔软的山色 -->
113
+ <path d="M240 592C357 550 410 486 505 525C586 558 620 575 711 536C796 499 884 527 959 575V710H240Z" fill="url(#hill-far)"/>
114
+ <path d="M244 649C350 557 440 602 534 623C663 652 760 547 858 582C902 597 940 621 961 641V714H244Z" fill="#695776"/>
115
+ <!-- 山间那一扇还亮着的小窗 -->
116
+ <g transform="translate(797 561)">
117
+ <path d="M0 19L22 1L46 19V49H0Z" fill="#51465F"/>
118
+ <path d="M-4 19L22-2L50 19" fill="none" stroke="#51465F" stroke-width="5" stroke-linejoin="round"/>
119
+ <rect x="17" y="22" width="11" height="14" rx="3" fill="#F6D5A0"/>
120
+ <path d="M22.5 22V36" stroke="#8E756F" stroke-width="1.3"/>
121
+ </g>
122
+ <path d="M244 675C327 641 383 630 472 654C557 677 635 635 717 640C813 646 873 660 954 638V719H244Z" fill="url(#hill-near)"/>
123
+ <path d="M620 161L294 698H332L650 162Z" fill="#FFFFFF" opacity="0.025"/>
124
+ </g>
125
+ <path d="M276 473C276 299 418 173 600 173" fill="none" stroke="#E2BCA5" stroke-width="2" opacity="0.4"/>
126
+ <path d="M600 173C782 173 924 299 924 473V696" fill="none" stroke="#D9ABA0" stroke-width="1.5" opacity="0.3"/>
127
+
128
+ <!-- 厚实的木窗台 -->
129
+ <path d="M232 699H968L994 728H206Z" fill="#AE8584"/>
130
+ <rect x="206" y="725" width="788" height="20" rx="5" fill="url(#wood)"/>
131
+ <path d="M225 728H976" stroke="#D7AAA0" stroke-width="1.5" opacity="0.45"/>
132
+ <path d="M228 745H973L1030 811H170Z" fill="#32283D" opacity="0.28"/>
133
+ <rect y="780" width="1200" height="120" fill="url(#desk)"/>
134
+ <path d="M0 780H1200" stroke="#A67A80" stroke-width="1" opacity="0.35"/>
135
+
136
+ <!-- 窗边的叶子 -->
137
+ <ellipse cx="318" cy="717" rx="46" ry="8" fill="#392B42" opacity="0.25"/>
138
+ <g fill="none" stroke="#809A8F" stroke-width="3" stroke-linecap="round">
139
+ <path d="M317 659Q309 596 290 544"/>
140
+ <path d="M319 658Q335 591 364 561"/>
141
+ <path d="M317 650Q317 593 323 572"/>
142
+ </g>
143
+ <g>
144
+ <path d="M297 568C273 568 265 550 270 533C291 535 302 550 297 568Z" fill="#92A594"/>
145
+ <path d="M302 589C316 570 334 570 341 578C334 595 318 602 302 589Z" fill="#6F9488"/>
146
+ <path d="M309 611C286 613 276 601 278 584C299 583 314 595 309 611Z" fill="#6E877D"/>
147
+ <path d="M338 604C339 580 353 567 371 572C371 592 357 608 338 604Z" fill="#9BB09B"/>
148
+ <path d="M351 579C347 559 357 545 372 541C379 560 370 577 351 579Z" fill="#B4BD9F"/>
149
+ <path d="M319 600C312 581 319 565 333 558C343 575 337 593 319 600Z" fill="#839D8A"/>
150
+ </g>
151
+ <path d="M282 654H354L344 707Q318 720 292 707Z" fill="#C28D7A"/>
152
+ <path d="M317 657H353L344 707Q330 714 317 714Z" fill="#E0AA8C" opacity="0.6"/>
153
+ <ellipse cx="318" cy="654" rx="36" ry="7" fill="#E2AF91"/>
154
+ <ellipse cx="318" cy="654" rx="29" ry="4" fill="#6E504E"/>
155
+
156
+ <!-- 小灯的暖光也是静态渐变 -->
157
+ <circle cx="824" cy="621" r="183" fill="url(#lamp-halo)"/>
158
+ <ellipse cx="824" cy="716" rx="74" ry="11" fill="#372D3D" opacity="0.28"/>
159
+ <path d="M776 667Q824 655 872 667V707Q824 724 776 707Z" fill="url(#lamp-base)"/>
160
+ <ellipse cx="824" cy="667" rx="48" ry="10" fill="#8A9783"/>
161
+ <ellipse cx="824" cy="663" rx="34" ry="6" fill="#D7C7A0"/>
162
+ <rect x="784" y="556" width="80" height="109" rx="29" fill="url(#glass)"/>
163
+ <path d="M796 611V589Q796 567 817 567" fill="none" stroke="#FFF4D9" stroke-width="4" stroke-linecap="round" opacity="0.5"/>
164
+ <circle cx="855" cy="691" r="11" fill="#BD9565"/>
165
+ <circle cx="856" cy="690" r="8" fill="#D5B486"/>
166
+ <path d="M856 684V689" stroke="#84745C" stroke-width="1.5" stroke-linecap="round"/>
167
+
168
+ <!-- 胖橘猫:圆圆的身子、闭着的笑眼、盘起来的尾巴 -->
169
+ <ellipse cx="480" cy="718" rx="108" ry="13" fill="#332B3C" opacity="0.32"/>
170
+ <path d="M450 568C411 598 394 635 398 672C400 705 428 718 475 719C526 720 558 705 556 669C554 630 527 592 505 573Z" fill="url(#fur)"/>
171
+ <g clip-path="url(#cat-body)" fill="none" stroke="#BB7957" stroke-width="13" stroke-linecap="round" opacity="0.5">
172
+ <path d="M393 614Q408 626 427 629"/>
173
+ <path d="M390 641Q407 654 423 654"/>
174
+ <path d="M390 670Q406 681 421 678"/>
175
+ </g>
176
+ <path d="M473 597C450 615 447 650 451 678C455 701 495 708 511 687C527 664 516 616 495 599Z" fill="#F9D4A3" opacity="0.86"/>
177
+ <!-- 耳朵先画,头部覆盖连接处 -->
178
+ <path d="M419 538L416 478Q419 471 425 476L457 507Z" fill="#DE9C6D"/>
179
+ <path d="M484 507L514 474Q520 470 522 479L526 539Z" fill="#F2BE87"/>
180
+ <path d="M424 514L423 488L445 509Z" fill="#BD7C6A" opacity="0.85"/>
181
+ <path d="M497 509L515 487L517 519Z" fill="#D3977D"/>
182
+ <path d="M418 528C421 507 443 498 469 498C496 498 522 510 527 533C534 560 520 586 478 591C440 594 411 570 418 528Z" fill="url(#fur)"/>
183
+ <g fill="none" stroke="#C1875F" stroke-width="7" stroke-linecap="round" opacity="0.7">
184
+ <path d="M455 503L460 520"/>
185
+ <path d="M474 502L475 519"/>
186
+ <path d="M493 507L488 522"/>
187
+ </g>
188
+ <path d="M443 555C441 542 460 540 470 552C481 540 502 543 502 556C502 574 483 581 471 580C458 580 444 571 443 555Z" fill="#FADAB0"/>
189
+ <g fill="none" stroke="#65454A" stroke-linecap="round">
190
+ <path d="M438 543Q445 551 453 543" stroke-width="3"/>
191
+ <path d="M486 543Q494 551 501 543" stroke-width="3"/>
192
+ <path d="M471 561V566M471 566Q464 572 461 567M471 566Q478 572 481 567" stroke-width="1.8"/>
193
+ </g>
194
+ <path d="M466 556Q471 553 476 556L471 562Z" fill="#B47A72"/>
195
+ <ellipse cx="435" cy="557" rx="8" ry="4.5" fill="#D08A72" opacity="0.55"/>
196
+ <ellipse cx="505" cy="557" rx="8" ry="4.5" fill="#D08A72" opacity="0.55"/>
197
+ <g fill="none" stroke="#F2CEA0" stroke-width="1.4" stroke-linecap="round" opacity="0.8">
198
+ <path d="M437 558L410 552M437 565L408 566M505 558L533 551M505 565L537 565"/>
199
+ </g>
200
+ <!-- 爪爪与尾巴的层次 -->
201
+ <path d="M458 656Q453 680 450 701Q452 712 469 710Q480 708 478 698L480 656" fill="#F2C693"/>
202
+ <path d="M497 656L493 697Q492 710 508 711Q523 710 522 700L516 658" fill="#F5CE9C"/>
203
+ <path d="M460 702V707M468 702V708M503 702V708M511 702V708" stroke="#BE9278" stroke-width="1.3" stroke-linecap="round"/>
204
+ <path d="M409 670C386 677 385 709 413 720C444 733 513 735 549 721C569 713 580 698 571 688C560 675 551 690 539 696C513 710 460 712 438 704" fill="none" stroke="url(#tail-fur)" stroke-width="24" stroke-linecap="round"/>
205
+ <path d="M456 718L455 731M484 718L486 732M514 714L518 726" fill="none" stroke="#B37A59" stroke-width="5" opacity="0.45"/>
206
+
207
+ <!-- 窗台上被灯光照亮的一小块位置 -->
208
+ <path d="M745 723H907" fill="none" stroke="#F0CA9A" stroke-width="2" opacity="0.35" stroke-linecap="round"/>
209
+
210
+ <!-- 桌上的书,今晚先读到这里 -->
211
+ <ellipse cx="746" cy="811" rx="128" ry="13" fill="#241E31" opacity="0.28"/>
212
+ <path d="M626 771L738 784L855 765L870 813L743 832L621 813Z" fill="#2D3C46"/>
213
+ <path d="M633 768Q686 762 741 787Q791 761 846 763L861 807Q798 806 743 826Q686 806 627 806Z" fill="#D9C1B1"/>
214
+ <path d="M633 763Q688 758 741 781L743 819Q691 798 627 801Z" fill="#EBD7BF"/>
215
+ <path d="M741 781Q790 756 845 757L859 800Q796 798 743 819Z" fill="#F5E5CB"/>
216
+ <path d="M741 781L743 819" fill="none" stroke="#B69C91" stroke-width="1.6"/>
217
+ <g fill="none" stroke="#B29B8C" stroke-width="1.2" opacity="0.55" stroke-linecap="round">
218
+ <path d="M648 773Q684 773 724 787M645 782Q684 782 725 796M644 791Q683 790 713 801"/>
219
+ <path d="M758 787Q796 771 835 771M758 796Q797 780 838 781M760 804Q785 794 812 791"/>
220
+ </g>
221
+ <path d="M806 761L816 760L826 808L819 805L814 811Z" fill="#C98779"/>
222
+
223
+ <!-- 给今晚的小小注脚 -->
224
+ <g font-family="'PingFang SC','Noto Sans CJK SC','Microsoft YaHei',sans-serif">
225
+ <text x="86" y="840" fill="#E2C9B6" font-size="17" letter-spacing="2">今晚的任务:好好休息。</text>
226
+ <text x="1112" y="841" text-anchor="end" fill="#A98F98" font-size="12" letter-spacing="3">不赶路,也很好</text>
227
+ </g>
228
+ </g>
229
+ </svg>