@deployxai/dxc 0.1.0

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 (71) hide show
  1. package/README.md +131 -0
  2. package/dist/chunks/chunk-I6VZLNRZ.js +2118 -0
  3. package/dist/chunks/chunk-XIHX5YAF.js +16391 -0
  4. package/dist/chunks/knowledge-Q6MHPG6I.js +1248 -0
  5. package/dist/chunks/monitor-VPRVRQIS.js +694 -0
  6. package/dist/index.js +32367 -0
  7. package/docs/00-project-context.md +125 -0
  8. package/docs/01-north-star-architecture.md +234 -0
  9. package/docs/02-mvp-technical-design.md +553 -0
  10. package/docs/03-domain-state-api.md +599 -0
  11. package/docs/04-security-and-operations.md +413 -0
  12. package/docs/05-delivery-plan.md +407 -0
  13. package/docs/README.md +44 -0
  14. package/docs/decisions/0001-initial-architecture.md +57 -0
  15. package/docs/decisions/0002-mongodb-environment-boundary.md +42 -0
  16. package/docs/decisions/0003-staged-production-topology.md +33 -0
  17. package/docs/decisions/0004-local-first-agent-research-runtime.md +71 -0
  18. package/docs/decisions/0005-official-skill-orchestration-and-local-content-memory.md +97 -0
  19. package/docs/decisions/0006-separate-wechat-user-login-from-account-authorization.md +87 -0
  20. package/docs/decisions/0007-explicit-personal-wechat-start.md +67 -0
  21. package/docs/decisions/0008-end-to-end-content-workflow-continuity.md +115 -0
  22. package/docs/decisions/0009-privileged-multitenant-draft-scheduling.md +36 -0
  23. package/docs/decisions/0009-versioned-cloud-template-catalog.md +39 -0
  24. package/docs/eight-stage-implementation-audit.md +62 -0
  25. package/docs/first-user-guide.md +187 -0
  26. package/docs/history/content-forge-prd-v0.2-summary.md +81 -0
  27. package/docs/local-development.md +511 -0
  28. package/docs/references/aliyun-oss-production-setup.md +89 -0
  29. package/docs/references/legacy-content-to-wechat-contract.md +223 -0
  30. package/docs/references/renderer-compatibility-report.md +68 -0
  31. package/docs/references/source-inventory.md +179 -0
  32. package/docs/references/wechat-renderer-platform-validation.md +92 -0
  33. package/docs/references/wechat-third-party-platform-setup.md +159 -0
  34. package/docs/references/wechat-website-login-setup.md +137 -0
  35. package/docs/references/wemd-template-attribution.md +25 -0
  36. package/docs/research-monitoring-design.md +235 -0
  37. package/docs/todo-preview-local-first.md +31 -0
  38. package/docs/workbuddy-first-user-runbook.md +246 -0
  39. package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-b-research-analyst/SKILL.md +230 -0
  40. package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-c-outline-architect/SKILL.md +194 -0
  41. package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-d-content-writer/SKILL.md +296 -0
  42. package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-e-visual-designer/SKILL.md +268 -0
  43. package/package.json +25 -0
  44. package/skills/dxc-article-outline/SKILL.md +82 -0
  45. package/skills/dxc-article-outline/agents/openai.yaml +6 -0
  46. package/skills/dxc-article-outline/references/outline-methods.md +38 -0
  47. package/skills/dxc-article-write/SKILL.md +85 -0
  48. package/skills/dxc-article-write/agents/openai.yaml +6 -0
  49. package/skills/dxc-article-write/references/writing-methods.md +42 -0
  50. package/skills/dxc-content-brief/SKILL.md +81 -0
  51. package/skills/dxc-content-brief/agents/openai.yaml +6 -0
  52. package/skills/dxc-content-brief/references/brief-method.md +34 -0
  53. package/skills/dxc-content-review/SKILL.md +84 -0
  54. package/skills/dxc-content-review/agents/openai.yaml +6 -0
  55. package/skills/dxc-content-review/references/review-checklist.md +35 -0
  56. package/skills/dxc-content-workflow/SKILL.md +190 -0
  57. package/skills/dxc-content-workflow/agents/openai.yaml +6 -0
  58. package/skills/dxc-content-workflow/references/catalog.json +136 -0
  59. package/skills/dxc-content-workflow/references/onboarding-questions.md +107 -0
  60. package/skills/dxc-content-workflow/references/stage-contract.md +70 -0
  61. package/skills/dxc-research/SKILL.md +110 -0
  62. package/skills/dxc-research/agents/openai.yaml +6 -0
  63. package/skills/dxc-research/references/research-method.md +53 -0
  64. package/skills/dxc-title-write/SKILL.md +112 -0
  65. package/skills/dxc-title-write/agents/openai.yaml +6 -0
  66. package/skills/dxc-title-write/references/title-methods.md +26 -0
  67. package/skills/dxc-visual-plan/SKILL.md +119 -0
  68. package/skills/dxc-visual-plan/agents/openai.yaml +6 -0
  69. package/skills/dxc-visual-plan/references/visual-methods.md +35 -0
  70. package/skills/dxc-wechat-publisher/SKILL.md +157 -0
  71. package/skills/dxc-wechat-publisher/agents/openai.yaml +6 -0
@@ -0,0 +1,223 @@
1
+ # 旧 `content-to-wechat` 可复用契约
2
+
3
+ 核验日期:2026-07-25
4
+ 来源:`/Users/lvyuanfang/.workbuddy/skills/content-to-wechat/`
5
+ 状态:只读参考
6
+
7
+ ## 1. 可复用的产品契约
8
+
9
+ 旧技能已经验证了用户真正需要的发布流程:
10
+
11
+ 1. 区分原始素材和已有 Markdown;
12
+ 2. 补齐标题、作者、摘要、封面和正文图片;
13
+ 3. 文章处理后进行事实和表达复核;
14
+ 4. 微信兼容渲染和预检;
15
+ 5. 集中展示标题、摘要、封面、路径和检查结果;
16
+ 6. 用户确认后创建草稿;
17
+ 7. 返回 `media_id`;
18
+ 8. 提醒用户到公众号后台人工复核和发布。
19
+
20
+ 这个顺序进入 DxC MVP。写作、标题生成、去 AI 味和封面生成从主 Skill 中拆为未来按需能力;已有文章默认不被重写。
21
+
22
+ ## 2. 输入契约
23
+
24
+ 旧技能建议的最小 Markdown:
25
+
26
+ ```yaml
27
+ ---
28
+ author: 作者
29
+ tags: [标签1, 标签2]
30
+ wechat_digest: 120 字以内摘要
31
+ wechat_comments: 1
32
+ wechat_cover_image: attachments/cover.png
33
+ ---
34
+ ```
35
+
36
+ 正文:
37
+
38
+ - 一级标题作为文章标题;
39
+ - 正文开头可以有与 `wechat_digest` 一致的引用摘要;
40
+ - 本地图片使用相对路径;
41
+ - 封面和正文图片应位于 Markdown 根目录内;
42
+ - 处理现有文件时优先创建发布副本。
43
+
44
+ DxC 不强制用户手写所有 frontmatter。CLI/Agent 可以交互补齐,但上传后的 `ArticleSource` 必须有结构化标题、作者、摘要、封面和图片清单。
45
+
46
+ ## 3. 渲染行为
47
+
48
+ 旧 `render-markdown.js` 使用 `marked` 的 GFM 模式,随后执行以下行为:
49
+
50
+ ### 3.1 外部链接
51
+
52
+ - 收集 Markdown 形式的 `http/https` 链接;
53
+ - 按 URL 去重;
54
+ - 正文中只保留链接文字;
55
+ - 文末重建“参考链接”章节;
56
+ - URL 以纯文本显示;
57
+ - 最终移除所有 `<a>` 和 `href`。
58
+
59
+ MVP 需要保留用户可核实来源和不输出可点击外链的行为。新实现使用 Markdown token,不沿用正则解析作为安全边界。
60
+
61
+ ### 3.2 表格
62
+
63
+ - 识别 GFM `<table>`;
64
+ - 首行为 header 时提取列名;
65
+ - 每一数据行转为 `<p>`;
66
+ - 首列加粗;
67
+ - 后续单元格使用“列名:内容”换行展示;
68
+ - 外层用带顶部强调线的 `<section>`。
69
+
70
+ 目标是避免微信过滤整个 `<table>` 导致内容消失。
71
+
72
+ ### 3.3 块级样式
73
+
74
+ 保留以下视觉语义:
75
+
76
+ - H1/H2/H3/H4 分级;
77
+ - H2 使用左侧品牌色竖线;
78
+ - 正文 16px、1.8 行高;
79
+ - 引用使用浅色背景和左边框;
80
+ - 列表保留缩进;
81
+ - 图片自适应宽度、居中;
82
+ - `<hr>` 转为带顶部边框的段落;
83
+ - `<em>` 转为带内联斜体样式的 `<span>`;
84
+ - 代码块转为浅灰背景的 `<section><code>`。
85
+
86
+ 模板代号固定为 `wechat-minimal@1`。颜色和精确样式通过黄金样例锁定,后续变更创建新版本。
87
+
88
+ ### 3.4 清洗
89
+
90
+ 旧脚本会:
91
+
92
+ - 删除 HTML 注释;
93
+ - 删除 `class` 和 `id`;
94
+ - 删除空 style;
95
+ - 删除标签之间的空白;
96
+ - 移除链接标签;
97
+ - 使用一个带字号、行高和颜色的外层 `<section>`。
98
+
99
+ 新实现必须增加真正的 HTML allowlist,禁止:
100
+
101
+ ```text
102
+ script, style, iframe, form, input, object, embed, table,
103
+ 事件属性, javascript: URL, 外部 CSS, 未批准的 data URL
104
+ ```
105
+
106
+ ## 4. 预检契约
107
+
108
+ 旧技能要求预检至少覆盖:
109
+
110
+ - 标题;
111
+ - 作者;
112
+ - 摘要存在且不超过 120 个 Unicode 字符;
113
+ - 封面存在、格式、大小、比例和引用;
114
+ - 所有本地图片存在;
115
+ - Markdown 可以渲染;
116
+ - 表格、链接、分隔线、强调、列表和代码块完成转换;
117
+ - HTML 小于旧规则的 20,000 字符;
118
+ - 没有裸 Markdown;
119
+ - 没有 `<table>`、外部 `<a>` 或 `href`。
120
+
121
+ DxC 输出结构化结果:
122
+
123
+ ```json
124
+ {
125
+ "ok": false,
126
+ "errors": [
127
+ {
128
+ "code": "DIGEST_TOO_LONG",
129
+ "path": "digest",
130
+ "message": "摘要超过当前限制"
131
+ }
132
+ ],
133
+ "warnings": [],
134
+ "metrics": {
135
+ "digestCharacters": 0,
136
+ "htmlCharacters": 0,
137
+ "imageCount": 0
138
+ }
139
+ }
140
+ ```
141
+
142
+ 约束数值来自旧行为时标记 `source=legacy`,在官方文档/测试号核验后更新来源和测试。
143
+
144
+ ## 5. 图片和封面契约
145
+
146
+ 旧流程:
147
+
148
+ - 扫描 Markdown 图片和 Obsidian 图片引用;
149
+ - 忽略 `http`、`https` 和 `data:`;
150
+ - 拒绝不存在的文件;
151
+ - 拒绝 Markdown 目录之外的路径;
152
+ - 上传时保持相对目录;
153
+ - 封面目标比例接近 2.35:1;
154
+ - 中心 1:1 为安全裁切区;
155
+ - 图片生成后必须实际查看。
156
+
157
+ DxC 保留路径限制和可视确认,但:
158
+
159
+ - CLI 不再通过 `scp` 上传 `/tmp`;
160
+ - 上传使用内容哈希和短时对象存储签名;
161
+ - 图片规范化是可审计资产变体;
162
+ - 封面处理结果变化后必须重新确认快照。
163
+
164
+ ## 6. 草稿契约
165
+
166
+ 旧流程将 Markdown 和图片上传到 `alivps`,再调用远端 `/opt/wechat-publish/wechat_publish.py`:
167
+
168
+ - 渲染 HTML;
169
+ - 上传正文图;
170
+ - 上传封面;
171
+ - 创建微信草稿;
172
+ - 成功返回 `media_id`。
173
+
174
+ DxC 保留:
175
+
176
+ - 固定出口;
177
+ - 云端处理;
178
+ - 创建草稿而非正式发布;
179
+ - `media_id` 和回读结果;
180
+ - 错误保留和人工复核提示。
181
+
182
+ DxC 不保留:
183
+
184
+ - SSH/SCP 作为产品协议;
185
+ - `/tmp` 文件名作为任务身份;
186
+ - 旧服务器脚本作为运行时依赖;
187
+ - 客户 AppID/AppSecret 模式;
188
+ - 只靠终端文本判断成功。
189
+
190
+ ## 7. 已发现的旧实现局限
191
+
192
+ 这些是重写理由,不是对旧工具的否定:
193
+
194
+ - `--check` 仍会把文件上传到远端 `/tmp`,不是真正无副作用的本地/云端预检;
195
+ - 正则链接提取无法覆盖所有 Markdown/HTML 边界;
196
+ - 旧 renderer 没有完整 HTML sanitizer;
197
+ - `/tmp` + basename 可能发生同名任务冲突;
198
+ - SSH 输出是非结构化文本,Agent 难以稳定分支;
199
+ - 草稿请求超时后的重复风险没有显式状态机;
200
+ - token、租户、撤销、审计和支付没有形成 SaaS 领域模型;
201
+ - 旧流程依赖一个服务器环境,不适合多租户扩展。
202
+
203
+ ## 8. 黄金样例清单
204
+
205
+ 新 renderer 至少建立:
206
+
207
+ 1. 最小文章;
208
+ 2. 中文标题和摘要边界;
209
+ 3. H1-H4;
210
+ 4. 有序/无序/松散列表;
211
+ 5. 引用和 Obsidian callout;
212
+ 6. 行内代码和多行代码;
213
+ 7. GFM 表格和复杂单元格;
214
+ 8. 重复 Markdown 链接;
215
+ 9. 手写“参考资料”章节;
216
+ 10. 裸 HTML、`<a>`、`<table>` 和事件属性攻击;
217
+ 11. 本地图片、重复图片和缺图;
218
+ 12. 封面比例;
219
+ 13. 接近/超过 HTML 长度限制;
220
+ 14. 中英文、emoji 和 Unicode 字符计数;
221
+ 15. 超长 URL 和含特殊字符的链接标题。
222
+
223
+ 黄金样例只保存虚构内容和测试图片,不复制用户文章或生产素材。
@@ -0,0 +1,68 @@
1
+ # 微信渲染器兼容性报告
2
+
3
+ 核验日期:2026-07-25
4
+ 闭环更新:2026-07-30
5
+
6
+ ## 1. 核验范围
7
+
8
+ 只读参考:
9
+
10
+ - `/Users/lvyuanfang/.workbuddy/skills/content-to-wechat/scripts/render-markdown.js`
11
+ - `/Users/lvyuanfang/.workbuddy/skills/content-to-wechat/references/wechat-html-spec.md`
12
+ - [legacy-content-to-wechat-contract.md](legacy-content-to-wechat-contract.md)
13
+
14
+ 新实现和虚构样例:
15
+
16
+ - `packages/renderer-wechat/`
17
+ - `fixtures/renderer/manifest.json`
18
+ - `fixtures/renderer/minimal.md`
19
+ - `fixtures/renderer/full.md`
20
+ - `fixtures/renderer/unsafe.md`
21
+ - `fixtures/renderer/wemd-templates.golden.json`
22
+
23
+ 没有读取旧技能的凭据、发布脚本输入或用户文章,也没有连接微信、服务器或生产环境。
24
+
25
+ ## 2. 行为对照
26
+
27
+ | 行为 | 旧脚本 | `wechat-minimal@1` 首轮实现 |
28
+ |---|---|---|
29
+ | Markdown | `marked.parse()` 后字符串替换 | `marked` GFM token + 有限 renderer |
30
+ | frontmatter | 脚本直接调用时会进入正文 HTML | 先用 YAML + Zod 解析为结构化文章包 |
31
+ | H1-H4 | 内联样式 | 保留相同视觉层级和品牌色 |
32
+ | 表格 | 先生成 `<table>`,再以正则改写 | 直接从 table token 生成 `<section>` / `<p>` |
33
+ | 外部链接 | 正则收集 Markdown 链接 | 从 link token 收集 HTTP(S) URL、按 URL 去重 |
34
+ | 手写资料章节 | 正则删除末尾章节并重建 | 从二级标题 token 截断并重建 |
35
+ | Obsidian callout | 去除 callout 标记 | 保留同一行为 |
36
+ | 原始 HTML | 可能保留 `<script>`、事件属性和危险图片 | 全部转义,再经过 allowlist 清洗 |
37
+ | 图片路径 | 输出原始 `src` | 只允许文章包内安全相对路径 |
38
+ | 预检 | 主要依赖调用方文本检查 | 稳定的 errors / warnings / metrics |
39
+ | 可复现性 | 没有输入/输出哈希 | 固定 `sourceHash` / `htmlHash` |
40
+
41
+ ## 3. 黄金样例结果
42
+
43
+ - `minimal`:标题、正文、加粗和单个外链通过。
44
+ - `full`:H1-H4、引用、嵌套列表、代码、表格、图片、分隔线、重复外链和手写参考资料通过。
45
+ - `unsafe`:上级目录封面、远程图片和越界图片产生结构化错误;原始 HTML 和危险协议只产生安全文本或警告,清洗后没有可执行结构。
46
+
47
+ 黄金 HTML 固定在:
48
+
49
+ - `fixtures/renderer/minimal.golden.html`
50
+ - `fixtures/renderer/full.golden.html`
51
+
52
+ 哈希、版本和预检指标固定在 `fixtures/renderer/manifest.json`,测试会重新渲染每个 fixture 并逐项比对。
53
+ 十套 WeMD 派生模板和极简模板使用同一份 `full.md`,其 HTML 哈希固定在
54
+ `fixtures/renderer/wemd-templates.golden.json`。
55
+
56
+ ## 4. 尚未完成的验证闸门
57
+
58
+ - 微信开发者文档页面在当前自动化访问环境中不可读取,因此没有把旧规则中的 120/20,000 数值重新标成官方限制。
59
+ - 尚未使用微信公众号测试号粘贴或创建草稿,未验证微信后台的二次过滤结果。
60
+ - WeMD 派生模板已经通过 DxC token renderer、allowlist 和黄金哈希回归,但尚未逐套通过
61
+ 非生产公众号的粘贴和草稿回读验证。
62
+ - 2026-07-30 已在 CLI/Server/Worker 闭环增加 PNG/JPEG 文件读取、尺寸/体积检查、
63
+ 正文图片上传和微信 URL 替换;单张正文图片小于 1 MiB、最多 20 张。真实微信二次过滤
64
+ 和 `media/uploadimg` 现场响应仍待非生产公众号验证。
65
+
66
+ 在上述闸门完成前,本轮只能确认“代码契约和旧行为兼容”,不能宣称 P2 已完成微信平台实测。
67
+
68
+ 平台验证步骤和证据边界见 [wechat-renderer-platform-validation.md](wechat-renderer-platform-validation.md)。
@@ -0,0 +1,179 @@
1
+ # 参考资料与只读来源
2
+
3
+ 核验日期:2026-07-27
4
+
5
+ 本文件记录本轮架构使用的证据。它不是依赖锁文件;实现具体接口前仍需重新核验官方文档。
6
+
7
+ ## 1. 本地工程
8
+
9
+ ### 1.1 DxC 主目录
10
+
11
+ 路径:`/Users/lvyuanfang/Code/dxc`
12
+
13
+ 初始状态:
14
+
15
+ - 空目录;
16
+ - 未初始化 Git;
17
+ - 无代码、配置或密钥。
18
+
19
+ 本轮只在该目录创建文档、`AGENTS.md`、`.gitignore` 和本地 Git 元数据。
20
+
21
+ ### 1.2 官网/审核页
22
+
23
+ 仓库:`/Users/lvyuanfang/FlutterCode/choir_site`
24
+
25
+ 已读取:
26
+
27
+ - `app/deployxai/content/page.tsx`
28
+ - `app/deployxai/content/layout.tsx`
29
+ - `app/deployxai/content/privacy/page.tsx`
30
+ - `app/deployxai/content/terms/page.tsx`
31
+ - `nginx.content.deployxai.conf`
32
+
33
+ 结论:
34
+
35
+ - 页面是静态品牌、能力、授权、安全、隐私和服务条款落地页;
36
+ - Nginx 当前把 `content.deployxai.com` 映射到静态导出目录;
37
+ - 没有 SaaS 登录、编辑、队列或微信 token 逻辑;
38
+ - 官网仓库与 DxC 主应用保持分离;
39
+ - 本轮没有修改该仓库或生产 Nginx。
40
+
41
+ ### 1.3 旧 `content-to-wechat`
42
+
43
+ 入口路径:`/Users/lvyuanfang/.workbuddy/skills/content-to-wechat/`
44
+ 实际代码路径:`/Users/lvyuanfang/Code/skills/content-to-wechat/`
45
+
46
+ 已读取:
47
+
48
+ - `SKILL.md`
49
+ - `references/wechat-html-spec.md`
50
+ - `scripts/render-markdown.js`
51
+ - `scripts/publish-to-wechat.sh`
52
+ - `scripts/generate-cover.sh`
53
+
54
+ 未读取:
55
+
56
+ - 任何真实凭据;
57
+ - `alivps` 上的环境变量;
58
+ - `/opt/wechat-publish/wechat_publish.py` 的远端内容。
59
+
60
+ 远端旧实现后续只有在用户明确授权只读访问时才核验。新产品不得永久通过 SSH 调用旧脚本。
61
+
62
+ ## 2. 产品历史
63
+
64
+ ### WorkBuddy 分享页
65
+
66
+ - [《博主内容生产系统(Content Forge for Bloggers)》](https://codebuddy.work/agents/share/AQJrGsUAQfUN57uxVO778ti7XTtpnP1YRgPw4hbdye8zA6Q9DsetIb2qAW-HDAy-?platform=workbuddy)
67
+ - 分享文件名:`博主内容生产系统_PRD.md`
68
+ - 版本:v0.2
69
+ - 状态:长期 North Star,不是当前 MVP
70
+ - 本地摘要:[../history/content-forge-prd-v0.2-summary.md](../history/content-forge-prd-v0.2-summary.md)
71
+
72
+ 该页面是动态页,普通正文提取为空;本轮通过页面公开分享元数据和文件下载接口核对正文,没有保存临时访问令牌。
73
+
74
+ ## 3. WorkBuddy 与 SkillPay
75
+
76
+ ### SkillHub
77
+
78
+ - [SkillPay 产品页](https://skillhub.cn/skillpay)
79
+ - [SkillHub 使用指南](https://skillhub.cn/tutorials)
80
+ - [SkillPay 入驻](https://skillhub.cn/tutorials#agent-pay-onboard)
81
+ - [升级为 Pay Skill](https://skillhub.cn/tutorials#agent-pay-upgrade)
82
+ - [发布 Pay Skill](https://skillhub.cn/tutorials#agent-pay-publish)
83
+ - [Pay Skill 最佳实践](https://skillhub.cn/tutorials#agent-pay-best-practice)
84
+
85
+ 当前公开信息支持的结论:
86
+
87
+ - Pay Skill 面向按次调用;
88
+ - 入驻顺序为团队账号与企业认证 → SkillHub 商户中心 → 微信商户平台绑定 → 回到 SkillHub 确认“已入驻”;
89
+ - 企业认证和微信商户号绑定属于主体账号操作,工程实现不代填企业材料、手机号验证码、SkillHub Token 或商户凭据;
90
+ - 商户服务仍需创建微信支付订单;
91
+ - 开发者私钥只展示一次,只能保存在服务端 Secret/KMS Provider 中;
92
+ - 服务端返回 X402/HTTP 402 支付触发;
93
+ - 支付后 Agent 重试,商户以回调或查单确认并履约;
94
+ - 公开文档没有证明原生月/年自动续费或一个 Skill 多价格。
95
+
96
+ ### WorkBuddy
97
+
98
+ - [Skills 市场说明](https://www.codebuddy.cn/docs/workbuddy/From-Beginner-to-Expert-Guide/Function-Description/Skills-Market)
99
+ - [WorkBuddy 更新日志](https://www.codebuddy.cn/docs/workbuddy/Changelog)
100
+
101
+ 更新日志显示 WorkBuddy 已有 SkillHub 安装、运行环境检测和对话内微信 AI 支付能力。DxC 的 CLI → X402 → WorkBuddy 真实链路仍需尖峰验证。
102
+
103
+ ## 4. 微信开放平台第三方平台
104
+
105
+ 官方新文档路径:
106
+
107
+ - [第三方平台术语与文档入口](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/getting_started/terminology_introduce.html)
108
+ - [授权流程技术说明](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/Authorization_Process_Technical_Description.html)
109
+ - [授权事件](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/authorize_event.html)
110
+ - [component_verify_ticket](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/component_verify_ticket.html)
111
+ - [component_access_token](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/ComponentAccessToken.html)
112
+ - [authorizer token](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/creat_token.html)
113
+ - [消息加解密](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/Message_encryption_and_decryption.html)
114
+ - [公众号权限集](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/product/offical_account_authority.html)
115
+ - [获取 component access token](https://developers.weixin.qq.com/doc/oplatform/openApi/ticket-token/api_getcomponentaccesstoken)
116
+ - [获取 pre_auth_code](https://developers.weixin.qq.com/doc/oplatform/openApi/ticket-token/api_getpreauthcode)
117
+ - [获取 authorizer access token](https://developers.weixin.qq.com/doc/oplatform/openApi/ticket-token/api_getauthorizeraccesstoken)
118
+ - [获取授权账号信息](https://developers.weixin.qq.com/doc/oplatform/openApi/authorization-management/api_getauthorizerinfo)
119
+
120
+ 旧的 `/doc/oplatform/Third-party_Platforms/api/*.html` 路径在核验时已返回 404,项目引用统一使用 2.0/新 API 路径。
121
+
122
+ ## 5. 微信开放平台网站应用登录
123
+
124
+ - [网站应用微信登录开发指南](https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&id=%E7%BD%91%E7%AB%99%E5%BA%94%E7%94%A8%E5%BE%AE%E4%BF%A1%E7%99%BB%E5%BD%95%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97&lang=zh_CN&t=resource%2Fres_list&verify=1)
125
+ - [微信 UnionID 机制](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html)
126
+
127
+ 实现固定使用独立 Website AppID/AppSecret、`snsapi_login`、同域登录入口和回调。网站 OAuth token 只用于解析身份后立即丢弃;公众号第三方平台授权继续使用 Component 凭据和另一组回调。
128
+
129
+ ## 6. 微信公众号草稿和素材
130
+
131
+ - [草稿箱指南](https://developers.weixin.qq.com/doc/service/guide/product/draft.html)
132
+ - [新增草稿](https://developers.weixin.qq.com/doc/service/api/draftbox/draftmanage/api_draft_add)
133
+ - [获取草稿](https://developers.weixin.qq.com/doc/service/api/draftbox/draftmanage/api_getdraft)
134
+ - [素材管理指南](https://developers.weixin.qq.com/doc/service/guide/product/asset.html)
135
+ - [上传图文消息内图片](https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimg)
136
+ - [新增永久素材](https://developers.weixin.qq.com/doc/service/api/material/permanent/api_addmaterial)
137
+
138
+ 正文图片适配器已于 2026-07-30 实现并完成假服务契约测试;真实公众号启用前仍须核对
139
+ 字段、大小、格式、频率、权限和错误码。旧技能的 20,000 HTML 字符约束先作为兼容预检
140
+ 规则,不替代官方实测。
141
+
142
+ ## 7. 支付
143
+
144
+ - [微信支付 Native 下单](https://pay.wechatpay.cn/doc/v3/merchant/4012791877)
145
+ - [微信支付 JSAPI 下单](https://pay.wechatpay.cn/doc/v3/merchant/4012791870)
146
+ - [自动续费/免密规则](https://pay.wechatpay.cn/doc/v3/merchant/4013519312)
147
+
148
+ MVP 不进入自动续费规则,月卡和年卡是一次支付、固定期限、手动续费。
149
+
150
+ ## 8. 本地运行时和导入工具
151
+
152
+ - [Node.js 发布周期](https://nodejs.org/en/about/previous-releases)
153
+ - [Node.js 24 LTS](https://nodejs.org/en/blog/release/v24.18.0)
154
+ - [Marked 官方文档](https://marked.js.org/)
155
+ - [sanitize-html](https://github.com/apostrophecms/sanitize-html)
156
+ - [Microsoft MarkItDown](https://github.com/microsoft/markitdown/blob/main/README.md)
157
+
158
+ MarkItDown 需要 Python 3.10+,适合生成供 LLM/用户继续编辑的 Markdown,不保证高保真版式。MVP 将其作为可选、隔离、按需安装的本地工具。
159
+
160
+ Marked 官方明确说明其输出不自带 HTML 清洗。P2 因此使用 token renderer 约束生成结构,并在输出边界再执行 `sanitize-html` allowlist 清洗。
161
+
162
+ ### 8.1 本地历史文章混合召回
163
+
164
+ - [Node.js 24 `node:sqlite`](https://nodejs.org/docs/latest-v24.x/api/sqlite.html)
165
+ - [SQLite FTS5 与 trigram tokenizer](https://www.sqlite.org/fts5.html)
166
+ - [ONNX Runtime Web](https://onnxruntime.ai/docs/get-started/with-javascript/web.html)
167
+ - [Hugging Face Tokenizers.js](https://github.com/huggingface/tokenizers.js)
168
+ - [BAAI `bge-small-zh-v1.5`](https://huggingface.co/BAAI/bge-small-zh-v1.5)
169
+ - [Xenova ONNX revision](https://huggingface.co/Xenova/bge-small-zh-v1.5/tree/75c43b069aac4d136ba6bc1122f995fedcfd2781)
170
+ - [Sentence Transformers semantic search](https://github.com/huggingface/sentence-transformers/blob/main/examples/sentence_transformer/applications/semantic-search/README.md)
171
+
172
+ 本轮核验确认:Node 本地 SQLite 支持 FTS5 `trigram`;ONNX Runtime Web 官方支持 Node.js 的单线程 WASM 执行,Tokenizers.js 可在 Node.js 本地完成模型兼容分词。真实探针已用固定 q8 ONNX 文件完成 CLS pooling(首位向量池化)和归一化:模型为 24M 参数、512 维,权重约 24 MB;“创业低谷”对“现金流快断了/暂停扩张”的相似度高于无关旅行片段。模型卡明确提醒相似度应以相对排序为主,不能直接把固定阈值当作“相关事实”。因此首版使用 FTS/向量双路排名和 RRF,不把原始余弦分数暴露为置信度。
173
+
174
+ ## 9. 数据库
175
+
176
+ - [MongoDB `findOneAndUpdate`](https://www.mongodb.com/docs/manual/reference/method/db.collection.findOneAndUpdate/)
177
+ - [MongoDB TTL 索引](https://www.mongodb.com/docs/manual/core/index-ttl/)
178
+
179
+ MVP 使用单文档原子更新、唯一索引、租约和 Saga,不把副本集事务或 change stream 作为硬依赖。
@@ -0,0 +1,92 @@
1
+ # 微信渲染平台验证闸门
2
+
3
+ 更新日期:2026-07-30
4
+ 状态:本地渲染、正文图片上传/URL 替换契约已通过;测试公众号验证待完成
5
+
6
+ ## 1. 目的
7
+
8
+ 本清单只验证 `wechat-minimal@1` 在微信侧的兼容行为,不实现公众号授权、素材上传或草稿业务流程,也不使用生产公众号。
9
+
10
+ 本地权威输入固定为:
11
+
12
+ - `fixtures/renderer/manifest.json`
13
+ - `fixtures/renderer/minimal.md`
14
+ - `fixtures/renderer/full.md`
15
+ - `fixtures/renderer/unsafe.md`
16
+ - 对应的 `*.golden.html`
17
+
18
+ 验证记录必须绑定 `sourceHash`、`htmlHash`、模板 ID 和渲染器版本,避免拿可变内容做结论。
19
+
20
+ ## 2. 官方文档复核状态
21
+
22
+ 目标官方来源:
23
+
24
+ - [草稿箱指南](https://developers.weixin.qq.com/doc/service/guide/product/draft.html)
25
+ - [新增草稿](https://developers.weixin.qq.com/doc/service/api/draftbox/draftmanage/api_draft_add)
26
+ - [上传图文消息内图片](https://developers.weixin.qq.com/doc/service/api/material/permanent/api_uploadimg)
27
+ - [新增永久素材](https://developers.weixin.qq.com/doc/service/api/material/permanent/api_addmaterial)
28
+
29
+ 2026-07-25 通过当前允许的网页读取和搜索入口复核时,官方页面没有返回可引用正文。没有改用转载、搜索摘要或旧博客替代官方证据。
30
+
31
+ 因此以下数值继续标记为 `source=legacy`:
32
+
33
+ - 摘要 120 个 Unicode code point(码点);
34
+ - 渲染后 HTML 20,000 个 JavaScript 字符单元。
35
+
36
+ 在取得官方正文或测试公众号证据前,不把它们写成当前微信官方上限。
37
+
38
+ ## 3. 测试公众号前置条件
39
+
40
+ 平台验证需要一个明确授权的非生产公众号或测试账号,并满足:
41
+
42
+ 1. 只使用仓库中的虚构 fixture(样例);
43
+ 2. 临时凭据由用户在 Git 外注入,不写入聊天、文档、命令历史或日志;
44
+ 3. 不访问或复用客户公众号、客户 AppID/AppSecret;
45
+ 4. 只创建草稿,不正式发布、不群发;
46
+ 5. 测试前记录账号类型、权限范围和验证日期,不记录完整 AppID;
47
+ 6. 测试后撤销临时凭据或确认其保留理由。
48
+
49
+ 真实测试号联调仍需单独授权。本任务没有生成、读取或写入任何微信凭据。
50
+
51
+ ## 4. 平台用例
52
+
53
+ | ID | 输入 | 观察点 | 通过标准 |
54
+ |---|---|---|---|
55
+ | WX-R01 | `minimal` | H1、正文、加粗、纯文本外链 | 草稿内容完整,没有 `<a>` / `href` |
56
+ | WX-R02 | `full` | H1-H4、引用、嵌套列表、代码、表格行式转换、图片占位 | 微信二次过滤后文本和层级仍完整 |
57
+ | WX-R03 | `unsafe` | 原始 HTML、危险协议、远程/越界图片 | 本地预检拒绝,不能进入草稿请求 |
58
+ | WX-R04 | 摘要 120/121 码点 | 后台/API 的接受边界和计数口径 | 记录实际响应,不根据旧数值推断 |
59
+ | WX-R05 | HTML 19,999/20,000/20,001 字符单元 | 后台/API 的接受、截断或拒绝行为 | `draft/get` 回读与输入哈希化对照 |
60
+ | WX-R06 | 重复和特殊字符 URL | 纯文本 URL、去重、转义 | 没有可点击外链,URL 文本没有丢失 |
61
+ | WX-R07 | 已上传正文图片 URL | `src` 替换和微信回读 | 最终 HTML 只含微信返回的正文图片 URL |
62
+ | WX-R08 | 分隔线、强调、代码缩进 | 微信过滤后的内联 style | 没有产生空列表项或内容丢失 |
63
+
64
+ `WX-R07` 的本地适配器、假服务上传、逻辑 URL 替换和 `draft/get` 期望核对已经实现;
65
+ 真实公众号执行仍需单独授权。正文图片单张小于 1 MiB,只接受 PNG/JPEG。
66
+
67
+ ## 5. 证据记录
68
+
69
+ 每次验证只记录:
70
+
71
+ - 验证日期和非敏感环境分类;
72
+ - fixture 名称;
73
+ - `sourceHash` / `htmlHash`;
74
+ - 模板和渲染器版本;
75
+ - 请求结果分类和微信错误码;
76
+ - `draft/get` 回读内容的哈希与结构差异;
77
+ - 微信是否移除或重写标签、属性、样式;
78
+ - 人工截图的脱敏路径。
79
+
80
+ 禁止记录 access token、完整 AppID、完整 `media_id`、完整请求/响应、用户文章或生产素材。
81
+
82
+ ## 6. 闸门判定
83
+
84
+ P2 平台闸门只有在以下条件同时满足时才能关闭:
85
+
86
+ - 官方字段与限制有可引用的一手证据,或明确标记为测试实测;
87
+ - `WX-R01` 至 `WX-R08` 在非生产账号完成;
88
+ - `draft/get` 证明内容没有静默截断;
89
+ - 失败用例不会继续进入草稿创建;
90
+ - 证据不包含秘密或真实用户内容。
91
+
92
+ 在此之前可以继续完善 P2 本地测试,但不得把平台结论写成已确认事实,也不得以此为由提前接入生产。