Files

289 lines
34 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 画个标 · 项目规则(Trae Rules)
> 本文档 = 项目完整说明 + 操作规范,覆盖四套工作区(LOGO / 头像 / 海报 / 动态表情)、两套资源库、三套技能库与全量质检流程。素材或技能变更后按「版本号联动」与「验证流程」执行。
## 一、整体架构(四工作区 · 三资源体系)
纯前端静态应用(HTML/CSS/原生 JS,零依赖,无构建流程),直接静态服务器托管;智能设计为 **AI 驱动**(DeepSeek API):AI 输出设计决策 JSON,系统负责渲染与导出,**禁止**以模板随机组合作为主流程;AI 失败自动降级为内置引擎,保证页面不空白。
### 1. 工作区与页面清单
> 各库规模数字为最近快照,构建素材/技能后以 `js/data/manifest/BASELINE.md`(脚本自动生成)为准,无需手动维护本表数字。
| 工作区 | 入口 | 资源库 | 技能库 |
|---|---|---|---|
| LOGO 设计 | index.html | 共享图标库(icon-sources.js,222 源 / 370,268 图标) | 共享技能(54 个) |
| 头像设计 | avatar.html | 复用共享图标库(**无独立素材源**,avatarGen.js 扩充素材池) | 共享技能(54 个,自动停用字体类) |
| 海报设计 | poster.html | 海报素材库(poster-sources.js,24 源 / 1581 素材) | 共享技能(54)+ 海报技能(64) |
| 动态表情 | emoji.html | 复用共享图标库(底图 = 头像/类头像图形,emojiGen.js 动画化) | 表情技能(sticker-skills,12 个,motion/emotion) |
配套页面:素材库 materials.html(行式列表预览 LOGO/头像/海报素材,搜索 + 「查看更多」展开);素材中心 sources.html(图标)/ poster-sources.html(海报);技能中心 skills.html(共享)/ poster-skills.html(海报);表情技能在 emoji.html 预览弹窗自动全跑(追加即生效);审计页 audit-pixels.html(图标像素)/ audit-posters.html(海报像素)/ audit-emojis.html(表情逐帧)/ audit-render.html(通用渲染,已挂表情审计)。工作区通过 `window.HGB_WORKSPACE`(logo/avatar/poster/emoji)切换隔离。
### 5. 可读出口(manifest,供外部项目/AI 直接读取)
- 纯前端懒加载 + 单行大索引(builtin-icons.js 等)对「外部读取」不友好(单行 2.4MB 一读就撞截断)。因此构建脚本输出**机器可读 JSON manifest** 作为对外出口,位置 `js/data/manifest/`:`icons.json`(build-icons.js 生成)/ `posters.json`(build-posters.js 生成)/ `skills.json`(`node scripts/build-skill-manifest.js` 生成,shared + poster + sticker 三技能库元数据,含 step/kind/workspaces)+ `README.md`(AI 读取指南:目录结构 / id 规范 / 数据文件位置 / 字段说明)
- **读取约定**:外部项目或 AI 复用本库时,先读 `js/data/manifest/README.md` → 对应 manifest(有哪些源/数量/协议/数据文件路径)→ 按 manifest 的 `file` 字段定向读 `js/data/sources/{id}.js`(`window['HGB_Source_{id}'] = {icons:[...]}`)或 `js/data/posters/{id}.js`,勿直接读单行大索引
- **前端页面同源**:sources.html / poster-sources.html 优先 fetch manifest(带 `?v=`),fetch 失败自动回退内置配置(window.HGB_IconSources / HGB_PosterSources);skills 页面直接读技能 API(HGB_Skills,与 manifest 同源)
### 2. LOGO 图标资源库(js/data/icon-sources.js,222 源 / 370,268 图标)
- **type 三分类**:`icon` 单色 163 / `emoji` 多色 27 / `brand` 品牌 32(每个源、每个图标必带 type)
- **拉取方式**:`format: 'iconify'` 199 个(@iconify-json 集合,`scaleMode: 'body'` 坐标归一化到 24)/ `dir-files` 12(npm 目录枚举)/ `gh-files` 6(GitHub 直拉)/ sprite 3 / nodes 1 / remix-files 1
- **产物**:js/data/builtin-icons.js(轻量索引,`const HGB_BuiltinIcons` 为全局词法绑定、**非 window 属性**,须 typeof 探测)+ js/data/sources/{id}.js 按源懒加载(统一 `window['HGB_Source_{id}'] =` 赋值,**id 含连字符必须方括号**)+ js/data/sources/dicebear-{style}.js(29 风格头像,`window['HGB_Dicebear_xxx']`)
- 图标 ID 规范:内置库「源:名称」(lucide:graduation-cap);行业图标裸 id
- 品牌名回退顺序:设计面板品牌名 → 顶栏项目名 → 行业默认名
### 3. 头像资源体系(复用图标库,无独立素材源)
- avatarGen.js 的 generateAvatars:先按风格 + 布局白名单(AVATAR_LAYOUTS,仅纯图形 Mark + avatarOnly 布局 fullbleed/concentric/centroid)生成基础方案,再按行业图标 id 拆分英文词根从共享图标库模糊匹配扩充素材池
- 头像 vs LOGO 差异:布局白名单互斥(头像排除 monogram/ribbon 文字布局;LOGO 全局布局池排除 avatarOnly)
- 导出走 exporter.js exportAvatarPngs:微信 300 / QQ 640 / 抖音 400 / YouTube 800 / App 1024 / Favicon 64 + 自定义 + 圆形裁切 circleCropCanvas
### 4. 海报素材资源库(js/data/poster-sources.js,24 源 / 1581 素材)
- **type 8 分类**:palette 5 / font 12 / bg 3 / decoration 4(illustration / template / mockup / photo 暂无合规静态源,继续观测)
- **拉取方式**:`format: 'gh-files'` 11(GitHub 直拉)/ `format: 'dir-files'` 13(npm 目录枚举:字体 woff2 / 配色 JSON)
- **产物**:js/data/poster-builtin.js(轻量索引,window.HGB_PosterBuiltin,每源含 count)+ js/data/posters/{id}.js(`window['HGB_PosterSource_{id}'] = {items:[...]}`)+ js/data/posters/{id}/files/(位图/字体二进制按 file 引用直读)
- palette 数据形态:.json 内联为 item.data(数组或扁平对象均可,冒烟 `typeof it.data === 'object'`);font 分类固定 `cat='font'`(避免名称误命中场景词表)
- 素材 id = 「源:相对路径」;**海报技能 8 类**:layout/color/typography/grid/hierarchy/print/creative/ai(各 8 个)
### 6. 动态表情模块(emoji.html,复用图标库,无独立素材源)
- **核心交互**:`generateEmojiSet`(行业/图标 → 一张静态底图)→ `expandAnimations`(**同图 × 全部动画类型** = 一组表情包);AI 编排决策插入首位变体;AI 失败自动降级内置池
- **动画引擎 HGB_Motion**:`ANIMS` 注册表(11 种:bounce/pulse/wiggle/float/spin/fade/twirl/heartbeat/shake/breath/hopspin);`apply(el,t,p)` 帧函数返回 {tx,ty,rot,s,opacity} + `elementT` 元素级分层错峰 + `normalize` 补参;**预览 rAF 与导出逐帧采样共用同一套 apply**(预览 = 导出)
- **表情技能库 HGB_StickerSkills**(js/sticker-skills/,12 个,分类 motion/emotion):预览弹窗自动全跑 motion 类技能(追加即生效)
- **导出**:GIF89a 手写编码器(零依赖,LCT 255 色 + LZW)+ WebM + PNG;尺寸 240/320/512
- **AI 编排 HGB_EmojiAI**:`suggest` → 结构化决策 JSON(布局/风格/动画参数)→ `validate` 白名单修正,非法参数回退默认值;无 HGB_AI/无 Key/异常静默降级
## 二、设计体系(技能库)
### 1. 共享技能库(js/skills/,54 个,7 类)
- 架构:js/skills/core.js(HGB_Skills 注册表核心 + utils + 5 步流程 API)+ 7 分类文件(layout/color/typography/icon/ai/presentation/export),index.html 按 core→layout→color→typography→icon→ai→presentation→export 顺序加载;skills.html 动态渲染 `HGB_Skills.all()`,追加即自动生效
- 分布:layout 10 / color 9 / typography 8 / icon 8 / export 8 / ai 6 / presentation 5
- **流程组织**(core.js DESIGN_STEPS,用户视角的「设计流水线」):① 品牌洞察 5 → ② 方案生成 11 → ③ 方案评审 26 → ④ 迭代优化 1 → ⑤ 交付导出 11;`kind` 分布 check 28 / gen 17 / deliver 9;auditPlan 按 REVIEW_RUNNERS 适配器跑 26 项评审
- 头像模式自动停用字体类(typography 分类 + slogan-gen)并重渲染技能区
### 2. 海报技能库(js/poster-skills/,64 个,8 类 × 8)
- 架构:core.js(HGB_PosterSkills 注册表,workspaces 统一 ['poster'])+ skills.js(全部技能定义);通用技能复用 HGB_Skills,海报专属技能收本库
- 分类与分布:layout/color/typography/grid/hierarchy/print/creative/ai 各 8 个
- 技能标准字段:`id / name / category / emoji / scene / summary / params / source / run / test`(run 纯函数;test 自跑供技能中心「测试运行」)
### 3. 表情技能库(js/sticker-skills/,12 个,分类 motion/emotion)
- 架构:core.js(HGB_StickerSkills 注册表,DEFAULT_WORKSPACES 统一 ['emoji'])+ skills.js(全部技能定义,纯函数)
- 分类与分布:motion 11 / emotion 1(节奏/物理/循环/克制/情绪传达/风格匹配/体积/平台/分层协调/幅度/缓动 + 情绪-动画映射)
- 生效路径:注册即自动进 manifest(build-skill-manifest.js 已并入)+ emoji.html 预览弹窗自动全跑 motion 类技能 + audit-emojis.html 审计
## 三、素材与技能拓展流程
> 任何素材/技能构建完成后,运行 `node scripts/build-baseline.js` 自动更新 `js/data/manifest/BASELINE.md`(基线快照),指令一~四即读最新基线。
### 新增图标源(LOGO 库 → icon-sources.js)
1. 末尾追加源配置对象,**必须**带:唯一 `id`、`name`(英文)、`nameCn`(中文)、`desc`(中文一句话风格)、`type`(icon/emoji/brand)、`license` + `licenseNote`(中文)、`home`、`github`、`added`、`coordText`、`variants`
2. 拉取方式:
- Iconify 集合:`npm: '@iconify-json/<id>'`、`format: 'iconify'`、`scaleMode: 'body'`(坐标各异自动归一化到 24)
- npm 目录枚举:`format: 'dir-files'`、`dirs: [...]`、可选 `weightSuffix`(子集后缀)/ `skipNameRe`(跳过命名不合规)/ `wrapOpen/wrapClose`(坐标系非 0 起点 `<g transform>` 包装)
- GitHub 直拉:`format: 'gh-files'`、`gh: 'owner/repo'`、`ghBranch`、`dirs: [...]`;品牌 Logo viewBox 各异用 `scaleMode: 'wrap'`(逐图标 viewBox 归一化)
3. 新源入库前必须确认「viewBox 坐标系 + 子集命名」四件套(scale / weightSuffix / skipNameRe / wrap),并抽查含连字符 id 数据文件可 eval
4. 许可证过滤:排除 `BY-SA / BY-NC / BY-ND / GPL / -NC-`;接受 MIT / Apache-2.0 / ISC / CC BY 4.0 / OFL 等
5. 运行 `node scripts/build-icons.js`(构建 + 增量缓存 + 批次下载质量校验)→ bump 版本号
### 新增海报源(海报库 → poster-sources.js)
1. 末尾追加源配置对象(结构同 icon-sources 追加 `workspaces: ['poster']`,type 8 分类之一)
2. 拉取方式:gh-files(GitHub 直拉)或 dir-files(npm 目录枚举,ext 过滤 .svg/.json/.woff2 等);`.json` 自动内联 data,font 固定 cat='font'
3. 许可证过滤同上;超大源用 `maxItems` 限量、`exclude` 正则(匹配完整路径)剔除近重复变体
4. 运行 `node scripts/build-posters.js` → bump 版本号
5. 常见排除项:运行时生成器(无静态 SVG,如 svgwave/inkjet)、主题色存于扩展仓库(dracula/rose-pine)、jsDelivr 未索引(mrmrs/patterns)、重复源(与既有源同字体/同集合)
### 新增设计技能
1. 共享技能:编辑 `js/skills/{分类}.js`,在 `HGB_Skills.register([...])` 数组末尾追加技能对象;分类 7 类(见上)
2. 海报技能:编辑 `js/poster-skills/skills.js`,追加到 register 数组末尾;分类 8 类(见上)
3. 表情技能:编辑 `js/sticker-skills/skills.js`,追加到 register 数组末尾;分类 motion/emotion(见上)
4. 字段与约束:标准 10 字段;`run(args)` 纯函数返回结果;`test()` 必须能自跑;若用工具需自行 `const U = HGB_Skills.utils;`
5. 追加即自动生效,无需改页面(技能中心动态渲染;表情技能自动进 manifest + emoji.html 预览弹窗自动全跑)
## 四、版本号联动(缓存 busting)
素材/技能变更后,同步 bump 版本号(格式 `YYYYMMDD` + 后缀),否则浏览器强缓存旧文件导致「改了没生效/整页崩溃」:
- **LOGO 线**:`js/core/iconlib.js` 的 `VERSION`(控制懒加载 sources/{id}.js?v=)+ `js/core/dicebear.js` 的 `VERSION`(dicebear 文件变更时)+ index.html/sources.html/skills.html 中 `builtin-icons.js?v=` 与相关 `?v=`
- **海报线**:`js/core/posterlib.js` 的 `VERSION` + poster.html/poster-sources.html/poster-skills.html/audit-posters.html 中 `poster-builtin.js?v=` 与相关 `?v=`
- **表情线**:`js/core/motion.js` / `emojiGen.js` / `emojiAi.js` / `gifEncoder.js` / `js/sticker-skills/*.js` 变更 → emoji.html / audit-emojis.html 中相关 `?v=` 同步(无集中 VERSION,逐文件带参)
- 验证时强制刷新(Ctrl+F5)或带查询参数(如 `?x=N` 递增绕过磁盘缓存)
## 五、验证流程
### 1. 构建端批次质量校验(两构建脚本均自动执行)
- **数量完整性**:对比官方索引数与最终内置数,通过率 = 内置/官方,**< 80% 判异常**(下载损坏/文件缺失/过滤过度),构建结束输出「🔍 批次下载质量校验」汇总报告并列出异常源
- **分辨率校验**:统计原始数据非法 viewBox(≤0 / 非有限 / 超 1e5),构建兜底归一化
- **格式校验**:剔除空 body / 无几何 / 悬空引用(url(#id) 无定义),剔除数与通过率一并报告
- **内容级像素校验**(构建端自动化,仅本次实际下载源):bodyBBox 仿射矩阵计算内容 bbox,检测「内容不在视口内」与「面积过小」两类渲染空白风险;疑似空白占比 ≥ 5% 判异常;须配合浏览器像素审计最终确认
- **海报特有**:sha256 字节 + 格式魔数 + 分辨率参数 + SVG 内容校验;palette/font 内联与分类抽查
### 2. 浏览器像素级质量测试(每批次下载完成后)
- 图标:audit-pixels.html(支持 `?only=源1,源2&max=N` 定向),canvas 渲染逐图标检测非透明像素,空白图标 = 渲染故障须归零
- 海报:audit-posters.html(font/transform 源跳过像素渲染,走构建端校验),空白 0 / 失败 0 为通过
- 表情:audit-emojis.html(逐帧渲染:每帧非透明像素 > 0 无空白帧 + 帧间确有变化 + GIF 头校验),空白 0 / 静态 0 为通过;audit-render.html 已 iframe 挂表情审计
- 浏览器访问 http://localhost:55501 强制刷新,确认素材/技能中心无 JS 报错
### 3. Node 无头验证
- `node --check js/skills/*.js`、`node --check js/poster-skills/skills.js` 与 `node --check js/sticker-skills/skills.js`(语法校验)
- Node `vm` 冒烟测试:拼接 core + 数据文件 + 技能文件,逐个跑 `HGB_Skills.test(id)` / `HGB_PosterSkills.test(id)` / `HGB_StickerSkills.test(id)` 确认 0 失败;技能总数/分类白名单/每类下限断言;素材三方对账(配置 ↔ 索引 ↔ 按源数据文件)+ 全库 id 无重复
- 表情专项冒烟:`node scripts/emoji-smoke.js`(motion 帧函数/确定性、gifEncoder LZW、emojiGen 产物、emojiAi 降级、sticker-skills test 0 失败)
- 注意:Node 无头环境缺浏览器全局(HGB_AI/HGB_Industries/document 等)属环境分级容错,不计失败;顶层 `const HGB_*` 不挂 sandbox,需方括号取 window['...'] 或拼接进同一 vm 作用域
## 六、安全提醒
- **不内置任何 API Key**:`js/core/ai.js` 的 `DEFAULT_KEY` 恒为空串;使用者在「🤖 AI 设置」填写自己的 DeepSeek Key,仅存本机 localStorage、仅发给 api.deepseek.com(BYOK 模式,站点侧读不到)
- 源码 / 仓库 / 部署产物中不得出现任何 Key;推 Gitea 或上线前先 `grep -rn "sk-" .` 自查
## 七、教训
- 浏览器强缓存旧 JS:验证修改时必须强制刷新(Ctrl+F5)或带查询参数访问
- 构建脚本解析 sprite 时只剥离已知库前缀(lucide-/feather-/tabler-),避免误截断图标名
- 用户核心诉求是「AI 智能化设计」,不是模板组合或传统拖拽编辑
- SVG path 缩放禁止 toFixed() 固定小数位(0 → 0.00 非法语法),必须去尾零;弧命令 flags(0/1)不得缩放
- 新增源后检查「id 含连字符」数据文件(`window['HGB_Source_xxx']` 方括号)能否 eval;来源按钮中文名靠索引 nameCn 自动生效,无需维护 SOURCE_CN
- 新增技能必须提供 run/test;技能类 API 改动必须给 js/skills/*.js 加 ?v= 版本参数
- 海报重复源教训:同一字体/集合先查既有源(如 Playfair Display = fontsource-playfair),避免重复收录
## 八、AI 指令库(可复用 Prompt,直接复制发给 AI 执行)
> 用途:持续扩充系统能力。五条指令各司其职、可独立下发:**指令一~三** 对应三条采集管线(图标源 / 海报源 / 设计技能,技能含共享/海报/表情三库),互相独立、各自完整闭环(探测→构建→版本联动→验证→收口更新基线),**可分开跑、分开收口**;**指令四** 在新增技能/素材后自查设计流水线优化空间(含表情动画/编排管线);**指令五发给「外部项目」的 AI 使用**(调取本库能力,只读)。共性铁律:**价值门槛**(拒同质堆量)+ **去重/协议合规**(防污染)+ **构建质量校验**(≥80% 通过率)+ **版本联动**(防缓存失效)+ **双端验证**(Node 无头 + 浏览器像素)。所有指令的基线一律读 `js/data/manifest/BASELINE.md`(构建后 `node scripts/build-baseline.js` 自动更新),指令文本本身无需维护任何数字。
### 指令一:新增图标源(LOGO/头像共享图标库)
```text
你是「画个标」项目的素材采集工程师,任务是为共享图标库新增 1 个合规、高质量、不重复的图标源,并完成构建、版本联动与质检闭环。
【先读基线(构建自动生成,勿手算)】读 js/data/manifest/BASELINE.md ① 图标库节:当前源数/分类/总数。权威清单 js/data/icon-sources.js(末尾追加源配置)。构建 scripts/build-icons.js(@cfg hash 增量缓存)。去重以 icon-sources.js 现有 id 为准。产物约定:builtin-icons.js 索引(const HGB_BuiltinIcons 非 window 属性)+ js/data/sources/{id}.js(统一 window['HGB_Source_{id}'] 方括号赋值,id 含连字符必须方括号)+ dicebear-{style}.js。
【硬性门槛,任一不过即放弃】
1. 价值门槛:新源须带来新覆盖(新主题/新风格/新品牌),与既有源同质重复的排除;先 Grep 查 id 是否已收录。
2. 协议合规:排除 BY-SA/BY-NC/BY-ND/GPL/商业自定义条款;接受 MIT/Apache-2.0/ISC/CC BY 4.0/OFL/CC0/Unlicense/BSD/MPL。
3. 可拉取性:jsDelivr 对 >50MB 大仓库 403(cncf/artwork 等);scoped npm 包 unpkg 元数据 302 需跟随;raw.githubusercontent 证书问题用 rejectUnauthorized:false 探测,下载走 jsDelivr CDN。
【执行步骤】
1. 探测:优先 Iconify collections.json 未收录集合;其次 npm 目录(unpkg `目录/?meta` 枚举 + 单文件 head 取样);再次 GitHub(data.jsdelivr.com 枚举文件树)。国产 UI 框架优先 npm 包(semi-icons 成功,arco/vant/nutui 无 SVG 弃)。
2. 确定「viewBox 坐标系 + 子集命名」四件套:scale(非 24 坐标数值比例,如 512→24);weightSuffix(子集是否自带后缀,Phosphor fill 文件自带 -fill 需剥除);skipNameRe(正则滤命名不合规如纯数字);wrapOpen/wrapClose(坐标系非 0 起点用 <g transform> 包装,勿改 path 坐标)。品牌 Logo 逐图标 viewBox 各异用 format:'gh-files' + scaleMode:'wrap'。
3. 配置:在 icon-sources.js 末尾追加对象,必带 id(唯一)/type/name/nameCn/desc(中文)/style/license/licenseNote(中文)/home/github/npm/format/urls/dirs/scale/weightSuffix/skipNameRe/wrapOpen/wrapClose/coordText/variants/added;海报也用才加 workspaces:['poster']。图标级 type 由构建脚本注入,无需手写。
4. 构建:node scripts/build-icons.js,确认批次质量校验通过率 ≥80%、无「内容不在视口/面积过小」空白风险源。
5. 版本联动:bump js/core/iconlib.js VERSION(如 20260823b)→ index.html/sources.html/skills.html 全部 ?v= 同步;dicebear 文件变更才 bump dicebear.js VERSION。
6. 验证:Node eval 数据文件(含连字符 id 方括号、无 .00 残留、索引三方对账);浏览器 http://localhost:55501 强制刷新,audit-pixels.html?only=新源 像素审计空白 0;sources.html 来源按钮中文名自动生效(索引 nameCn)。
7. 收口:node scripts/build-baseline.js 更新基线,确认新增源在 BASELINE.md ① 图标库节就位(源数/总数/type 分布变化),本轮独立收口完成;如需留痕可 git 提交本次改动。
【坑位提醒】禁止 toFixed() 缩放 path(0→0.00 非法语法,用去尾零);弧命令 flags 不得缩放;id 重复录入会导致构建覆盖数据混淆(carbon 教训);licence 存疑源(如 prime 商业协议)标记备查不收录。
```
### 指令二:新增海报源(海报素材库)
```text
你是「画个标」项目的海报素材采集工程师,任务是为海报素材库新增 1 个合规、高质量、不重复的海报素材源(palette/font/bg/decoration 优先,illustration/template/mockup/photo 暂无合规静态源需继续观测)。
【先读基线(构建自动生成,勿手算)】读 js/data/manifest/BASELINE.md ② 海报素材库节:当前源数/分类/总数。权威清单 js/data/poster-sources.js(末尾追加源配置,type 8 分类)。构建 scripts/build-posters.js(BUILD_REV='2')。去重以 poster-sources.js 现有 id 为准。产物约定:poster-builtin.js(window.HGB_PosterBuiltin,每源 count)+ js/data/posters/{id}.js(window['HGB_PosterSource_{id}'])+ {id}/files/ 位图/字体二进制直读。
【硬性门槛,任一不过即放弃】
1. 价值门槛:与既有源同字体/同集合/同配色重复的排除(先查:Playfair Display 与 fontsource-playfair 重复教训);主题色存于扩展仓库(dracula/rose-pine)、jsDelivr 未索引(mrmrs/patterns)、运行时生成器(svgwave/inkjet,无静态 SVG 违反静态素材铁律)一律排除。
2. 协议合规:同图标源(排除 BY-SA/BY-NC/BY-ND/GPL)。
3. 可拉取性:jsDelivr 超 50MB 拒绝索引(403)不可用(fxemoji/noto-emoji/Montserrat 教训);仓库仅 .glyphs/UFO 源文件无成品字体不可用。
【执行步骤】
1. 探测:gh-files 走 data.jsdelivr.com 枚举文件树 + cdn.jsdelivr.net/gh/ 下载;dir-files 走 npm 目录枚举(ext 过滤 .svg/.json/.woff2 等)。
2. 分类:确定 type 8 分类之一;palette 数据 .json 内联为 item.data(数组/扁平对象均可);font 固定 cat='font' 避免名称误命中场景词表。
3. 配置:poster-sources.js 末尾追加,必带 id(唯一)/type/name/nameCn/desc(中文)/license/licenseNote(中文)/home/github/format/gh+ghBranch+dirs 或 npm+dirs+ext/scaleMode/coordText/variants/added/workspaces:['poster'];超大源用 maxItems 限量、exclude 正则(匹配完整路径)剔除近重复变体。
4. 构建:node scripts/build-posters.js,确认 sha256/格式魔数/分辨率/数量 ≥80% 全部通过。
5. 版本联动:bump js/core/posterlib.js VERSION → poster.html/poster-sources.html/poster-skills.html/audit-posters.html 全部 ?v= 同步。
6. 验证:Node 审计(内联与分类抽查)+ 浏览器强制刷新 audit-posters.html(font/transform 源跳过像素渲染,空白 0/失败 0)+ poster-sources.html console 零报错。
7. 收口:node scripts/build-baseline.js 更新基线,确认新增源在 BASELINE.md ② 海报素材库节就位(源数/总数/分类变化),本轮独立收口完成;如需留痕可 git 提交本次改动。
【坑位提醒】先 Grep 查重复源再录入;exclude 正则锚定完整路径(twemoji 国旗段教训);探测排除项记录在源文件注释备查,避免重复踩坑。
```
### 指令三:新增设计技能(共享 + 海报 + 表情)
```text
你是「画个标」项目的技能研发工程师,任务是新增设计技能。技能是系统的「智能能力」,新增必须解决真实设计问题、可自测、自动生效。
【先读基线(构建自动生成,勿手算)】读 js/data/manifest/BASELINE.md ③ 技能库节:共享/海报/表情技能数、分类分布、四区覆盖(头像向最少则本批优先补头像;表情向看表情技能分类分布)。去重:Grep 技能 id,共享/海报/表情三库不得互相重复。
【硬性门槛,任一不过即重写】
1. 标准 10 字段:id/name/category/emoji/scene/summary/params/source/run/test;可选 workspaces(不标=四区通用,typography 类不含头像)。
2. 四区覆盖:每批至少 1 个头像向技能(workspaces 含 'avatar' 或 scene 明确头像场景)与至少 1 个表情向技能(category ∈ motion/emotion 或 scene 明确表情/动画场景);头像纯图形无文字(typography/slogan-gen 自动停用);表情技能纯函数勿依赖浏览器全局。
3. run 纯函数返回 {ok/tip/...},无浏览器全局依赖;test 必须能自跑断言。
4. 共享技能补 core.js 的 SKILL_STEPS(未映射默认步骤 2);海报技能 workspaces 统一 ['poster'];表情技能 workspaces 统一 ['emoji'](sticker-skills core.js DEFAULT_WORKSPACES)。
【执行与验证】
1. 注册:共享技能追加到 js/skills/{分类}.js 的 register 数组末尾;海报技能追加到 js/poster-skills/skills.js register 末尾;表情技能追加到 js/sticker-skills/skills.js register 末尾。
2. 冒烟:node --check 各文件;vm 拼接 core+数据依赖逐个跑 test 0 失败;表情技能跑 node scripts/emoji-smoke.js;断言分类白名单与四区均衡(头像 ≥ LOGO 60%)。
3. 版本联动:bump 改动技能文件 ?v=(core 改动必须 bump)→ 相关页面同步(表情线见「四、版本号联动」)。
4. 浏览器验证:强制刷新,技能中心有新卡、🔬测试通过、console 零报错;avatar.html 无 typography 泄漏;emoji.html 预览弹窗自动全跑新增表情技能。
5. 收口:node scripts/build-skill-manifest.js 更新 skills.json(含 sticker 分支)→ node scripts/build-baseline.js 更新基线,确认技能数在 BASELINE.md ③ 技能库节就位(三库总数/分类分布/覆盖变化),本轮独立收口完成;如需留痕可 git 提交本次改动。
【坑位提醒】用 HGB_Skills.utils 自行声明 U;忘了 ?v= 会被缓存整页崩;头像技能勿依赖文字;只服务部分工作区的共享技能必须显式标 workspaces;表情技能 test 须自跑(audit-emojis.html 会全量断言)。
```
### 指令四:设计流程优化(新增技能/素材后,自查流水线优化空间)
> 场景:新增技能/素材后、或收到用户对设计体验的反馈时,检查设计流水线是否有优化空间(如新技能可吸收进生成前置、评审规则可注入生成阶段等)。与指令一~三配合:采集是「加零件」,本条是「调装配线」。
```text
你是「画个标」项目的流程优化工程师,任务是检查设计流水线(DESIGN_STEPS 五步 + SKILL_STEPS 映射 + auditPlan 评审 + AI prompt 编排 + 表情动画/编排管线)是否有可落地的优化空间,并实施、验证、回归。
【先读基线】读 js/data/manifest/BASELINE.md ③ 技能库节 + 读 js/skills/core.js(DESIGN_STEPS / SKILL_STEPS / REVIEW_RUNNERS / workspacesOf)、js/poster-skills/core.js 与 js/core/motion.js + emojiGen.js + emojiAi.js(表情 ANIMS 注册表 / expandAnimations / AI 编排),了解当前流水线组织。
【找优化空间(从这些入口自查)】
1. 新技能吸收:最近新增的 gen/check 技能,是否只挂在「评审」步骤而未进入「方案生成」前置?若技能能在生成阶段前置约束(先审后生成),应调整 AI prompt 编排或 SKILL_STEPS。表情锚点:motion.js 新动画类型注册进 ANIMS 即被 expandAnimations 自动展开(生成前置,无需再接线)。
2. 评审闭环:auditPlan 跑的评审项与「迭代优化」步骤是否闭环——评审发现的失败高频项是否有对应优化(生成侧规避 or 评审侧新增检查)?表情锚点:emoji.html renderStickerAudit 自动全跑 motion 类技能(追加即生效);emojiAi 动画决策已注入生成前置。
3. 用户反馈:评审分数低/风格雷同/速度慢等反馈,是否有流程层根因(prompt 编排、步骤顺序、降级路径)?表情锚点:AI 编排降级率 / 表情技能检查通过率 / GIF 导出体积与耗时。
4. 工作区过滤:头像自动停用字体类等 workspacesOf/forWorkspace 规则是否随新技能正确收编。表情锚点:HGB_StickerSkills.workspacesOf 统一 ['emoji'],勿让表情技能漏进其他工作区。
5. 版本与验证:新增技能/素材是否都走「版本联动 + 冒烟 + 浏览器验证」闭环。表情锚点:emoji-smoke.js + audit-emojis.html + 浏览器实测。
【硬性门槛,任一不过即不改】
1. 不破坏架构铁律:AI 输出结构化设计决策 JSON + 系统负责渲染/导出;AI 失败自动降级内置引擎;禁止改为模板随机组合。
2. 可验证:任何流程改动必须通过 Node vm 冒烟(HGB_Skills.test / HGB_PosterSkills.test / HGB_StickerSkills.test 0 失败)+ 浏览器真实走一遍设计流程(index/avatar/poster/emoji 四工作区各一)。
3. 兼容:不改坏既有技能注册 API(run/test 签名、utils、REVIEW_RUNNERS 适配器归一化)与动画 API(HGB_Motion.apply/elementT 签名,预览=导出一致)。
4. 变更即 bump:改动 core.js/分类文件/动画文件/ai prompt 相关文件 → 对应 ?v= 全部同步(表情线逐文件带参),否则浏览器缓存旧文件整页崩。
【执行步骤】
1. 分析并写出一句话结论:优化点是什么、解决什么问题、怎么验证。
2. 改动 js/skills/core.js(SKILL_STEPS/DESIGN_STEPS/REVIEW_RUNNERS/prompt 编排)、js/poster-skills/ 或 js/core/motion.js + emojiGen.js + emojiAi.js;纯 prompt 优化则改 ai 相关文件。
3. 冒烟:node --check 改动文件;vm 拼接 core+依赖逐个跑 test 0 失败;断言流程步骤计数/分类白名单不变或按预期变化。
4. 版本联动:bump 改动文件 ?v= → 相关页面同步。
5. 浏览器验证:四工作区各真实生成一次,确认流程走通、评审项计数正确、console 零报错。
【坑位提醒】「先审后生成」类优化只动 prompt 编排不动技能本体;流程步骤变化会改变技能中心区块计数,验证时核对;表情动画优化必须保持预览与导出逐帧采样用同一套 apply(预览 = 导出);优化失败回滚只 revert 本次改动文件(技能注册表与素材互不牵连,风险隔离)。
```
### 指令五:跨项目调取本库能力(发给外部项目 AI 使用)
> 当别的项目要「调取画个标的能力」时,把下面整段发给那个项目的 AI。只读复用,禁止修改画个标代码。入口永远走 manifest(先读 README → manifest → 按 file 定向读数据文件),此即解决「读不准」的既定路径。
```text
你是外部项目 AI,需要调取「画个标」设计系统的素材库与技能库能力(只读复用,禁止修改画个标代码)。
【定位方式(二选一,自行判断可用性)】
- 本地路径:d:\SGP_KF\DrawLogo\(本机 git 仓库,直接读文件)
- HTTP 部署:{baseUrl}/js/data/manifest/...(如 http://localhost:55501)
【读取步骤(顺序固定,勿跳步)】
1. 先读 js/data/manifest/README.md —— 目录结构 / id 规范 / 字段说明 / 数据形态
2. 再读目标 manifest(纯 JSON,分行可读,含每个源的协议/数量/数据文件路径;数量一律以 manifest 实际值为准,勿依赖记忆数字):
- icons.json —— 共享图标库(type: icon 单色 / emoji 多色 / brand 品牌;dicebear 字段含头像风格)
- posters.json —— 海报素材库(type: palette/font/bg/decoration…)
- skills.json —— 技能库(shared + poster + sticker;含 step 流水线步骤 / kind 性质 / workspaces 工作区)
3. 按 manifest 里 source 的 file 字段定向读数据文件(勿猜路径):
- js/data/sources/{id}.js → window['HGB_Source_{id}'] = { icons: [{ id, name, categoryCn, svg, type }] }
- js/data/posters/{id}.js → window['HGB_PosterSource_{id}'] = { items: [...] }
- 二进制(字体/位图)→ js/data/posters/{id}/files/ 按 file 引用直读
【数据使用规则】
- 图标 svg 是归一化到 24 viewBox 的 body 片段:单色 icon 渲染套 <svg viewBox="0 0 24 24" fill="currentColor">;emoji/brand 多色保留原样
- 图标 id 规范:内置库「源:名称」(lucide:graduation-cap);行业图标裸 id
- 技能:元数据(scene/summary/params/source)可直接当设计知识/评审规则;run/test 是函数实现,如需执行须加载 js/skills/*.js(含数据依赖)后调用 HGB_Skills.run(id, args)
- 协议合规:BY-SA/BY-NC/BY-ND/GPL 源不可商用;引用素材须标注来源与协议
- 图标筛选质量规则:按 name 匹配用「词边界 + 意象白名单」而非子串(否则混入 door-open/baguette 等噪音);排除 -off/-alert/-error/-forbidden 等负面变体;做 LOGO/品牌用途时避开品牌标志图形(instagram/mickey 等专有图形,有商标风险)
【反模式(禁止)】
- 勿读单行大索引 builtin-icons.js / poster-builtin.js(单行 2.4MB,读不动)——manifest 已含全部所需元信息
- 勿 eval 数据文件(它是 window 赋值,需作为 JS 加载后取 window['HGB_Source_xxx'] 或正则提取对象)
- 勿猜文件名——一切以 manifest 的 file 字段为准
- 勿整读大文件:sources/{id}.js 单个几百 KB~数 MB,超过 ~200KB 应用脚本/正则采样提取目标图标(如 Node vm 加载后按 id 取),勿用 Read 整读进上下文
- 勿在画个标仓库里写代码/加素材;产出(设计稿/脚本)放外部项目或临时目录(如 _design-test/),不写进画个标源码树(扩库请回画个标项目,按其「AI 指令库 指令一~三」执行闭环)
【能力边界】
- 能:参考素材风格/配色、复用技能设计方法与评审规则、按协议引用图标/字体
- 不能:调用 DeepSeek AI 设计接口(Key 内置于画个标前端,外部不可复用);不能跨项目执行画个标渲染/导出管线(纯前端,需在其页面内运行)
【最小示例】从 icons.json 找 nameCn 含「学校」的源 → 读其 file 指向的数据文件 → 在 icons 里用 name 词边界匹配 education/grad/graduation(或按 categoryCn 过滤)→ 取 graduation-cap 的 svg → 包 <svg viewBox="0 0 24 24"> 渲染。注意:图标级 name/categoryCn 在数据文件里,不在 manifest。
```