@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.
- package/README.md +131 -0
- package/dist/chunks/chunk-I6VZLNRZ.js +2118 -0
- package/dist/chunks/chunk-XIHX5YAF.js +16391 -0
- package/dist/chunks/knowledge-Q6MHPG6I.js +1248 -0
- package/dist/chunks/monitor-VPRVRQIS.js +694 -0
- package/dist/index.js +32367 -0
- package/docs/00-project-context.md +125 -0
- package/docs/01-north-star-architecture.md +234 -0
- package/docs/02-mvp-technical-design.md +553 -0
- package/docs/03-domain-state-api.md +599 -0
- package/docs/04-security-and-operations.md +413 -0
- package/docs/05-delivery-plan.md +407 -0
- package/docs/README.md +44 -0
- package/docs/decisions/0001-initial-architecture.md +57 -0
- package/docs/decisions/0002-mongodb-environment-boundary.md +42 -0
- package/docs/decisions/0003-staged-production-topology.md +33 -0
- package/docs/decisions/0004-local-first-agent-research-runtime.md +71 -0
- package/docs/decisions/0005-official-skill-orchestration-and-local-content-memory.md +97 -0
- package/docs/decisions/0006-separate-wechat-user-login-from-account-authorization.md +87 -0
- package/docs/decisions/0007-explicit-personal-wechat-start.md +67 -0
- package/docs/decisions/0008-end-to-end-content-workflow-continuity.md +115 -0
- package/docs/decisions/0009-privileged-multitenant-draft-scheduling.md +36 -0
- package/docs/decisions/0009-versioned-cloud-template-catalog.md +39 -0
- package/docs/eight-stage-implementation-audit.md +62 -0
- package/docs/first-user-guide.md +187 -0
- package/docs/history/content-forge-prd-v0.2-summary.md +81 -0
- package/docs/local-development.md +511 -0
- package/docs/references/aliyun-oss-production-setup.md +89 -0
- package/docs/references/legacy-content-to-wechat-contract.md +223 -0
- package/docs/references/renderer-compatibility-report.md +68 -0
- package/docs/references/source-inventory.md +179 -0
- package/docs/references/wechat-renderer-platform-validation.md +92 -0
- package/docs/references/wechat-third-party-platform-setup.md +159 -0
- package/docs/references/wechat-website-login-setup.md +137 -0
- package/docs/references/wemd-template-attribution.md +25 -0
- package/docs/research-monitoring-design.md +235 -0
- package/docs/todo-preview-local-first.md +31 -0
- package/docs/workbuddy-first-user-runbook.md +246 -0
- package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-b-research-analyst/SKILL.md +230 -0
- package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-c-outline-architect/SKILL.md +194 -0
- package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-d-content-writer/SKILL.md +296 -0
- package/docs//345/221/230/345/267/245BCDE/347/232/204skill/employee-e-visual-designer/SKILL.md +268 -0
- package/package.json +25 -0
- package/skills/dxc-article-outline/SKILL.md +82 -0
- package/skills/dxc-article-outline/agents/openai.yaml +6 -0
- package/skills/dxc-article-outline/references/outline-methods.md +38 -0
- package/skills/dxc-article-write/SKILL.md +85 -0
- package/skills/dxc-article-write/agents/openai.yaml +6 -0
- package/skills/dxc-article-write/references/writing-methods.md +42 -0
- package/skills/dxc-content-brief/SKILL.md +81 -0
- package/skills/dxc-content-brief/agents/openai.yaml +6 -0
- package/skills/dxc-content-brief/references/brief-method.md +34 -0
- package/skills/dxc-content-review/SKILL.md +84 -0
- package/skills/dxc-content-review/agents/openai.yaml +6 -0
- package/skills/dxc-content-review/references/review-checklist.md +35 -0
- package/skills/dxc-content-workflow/SKILL.md +190 -0
- package/skills/dxc-content-workflow/agents/openai.yaml +6 -0
- package/skills/dxc-content-workflow/references/catalog.json +136 -0
- package/skills/dxc-content-workflow/references/onboarding-questions.md +107 -0
- package/skills/dxc-content-workflow/references/stage-contract.md +70 -0
- package/skills/dxc-research/SKILL.md +110 -0
- package/skills/dxc-research/agents/openai.yaml +6 -0
- package/skills/dxc-research/references/research-method.md +53 -0
- package/skills/dxc-title-write/SKILL.md +112 -0
- package/skills/dxc-title-write/agents/openai.yaml +6 -0
- package/skills/dxc-title-write/references/title-methods.md +26 -0
- package/skills/dxc-visual-plan/SKILL.md +119 -0
- package/skills/dxc-visual-plan/agents/openai.yaml +6 -0
- package/skills/dxc-visual-plan/references/visual-methods.md +35 -0
- package/skills/dxc-wechat-publisher/SKILL.md +157 -0
- package/skills/dxc-wechat-publisher/agents/openai.yaml +6 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# 微信第三方平台授权绑定配置
|
|
2
|
+
|
|
3
|
+
更新日期:2026-07-27
|
|
4
|
+
|
|
5
|
+
状态:本地假微信闭环已实现;真实第三方平台授权部署与扫码验证进行中
|
|
6
|
+
|
|
7
|
+
## 1. 本轮范围
|
|
8
|
+
|
|
9
|
+
本轮只验证:
|
|
10
|
+
|
|
11
|
+
1. DxC 生成微信第三方平台授权链接;
|
|
12
|
+
2. 浏览器先进入 `content.deployxai.com` 的授权发起页,再由公众号管理员进入微信官方页面扫码确认;
|
|
13
|
+
3. 微信回调经过签名、时间窗、重放和 AES 校验;
|
|
14
|
+
4. DxC 加密保存授权 Token;
|
|
15
|
+
5. CLI 显示公众号名称、ID 3/11 和草稿能力状态。
|
|
16
|
+
|
|
17
|
+
“草稿能力”只表示素材与草稿权限可用,不包含正式发布、群发或通知。网站应用微信登录不参与这条链路;其独立申请项和 URL 见 [微信网站应用登录配置](wechat-website-login-setup.md)。
|
|
18
|
+
|
|
19
|
+
## 2. 微信开放平台配置
|
|
20
|
+
|
|
21
|
+
进入已经审核通过的“DeployX 内容工作台”第三方平台,而不是网站应用,确认:
|
|
22
|
+
|
|
23
|
+
- 权限集只包含 ID 3(公众号账号信息)和 ID 11(素材管理与草稿能力);
|
|
24
|
+
- 授权事件接收 URL:
|
|
25
|
+
`https://content.deployxai.com/callbacks/wechat/component-events`
|
|
26
|
+
- 消息与事件接收 URL:
|
|
27
|
+
`https://content.deployxai.com/callbacks/wechat/authorizers/$APPID$/callback`
|
|
28
|
+
- 授权发起页域名:`content.deployxai.com`
|
|
29
|
+
- DxC 授权发起页固定为:
|
|
30
|
+
`https://content.deployxai.com/authorize/wechat/start`
|
|
31
|
+
- 授权回跳由服务端固定为:
|
|
32
|
+
`https://content.deployxai.com/authorize/wechat/callback`
|
|
33
|
+
|
|
34
|
+
`$APPID$` 是微信第三方平台配置中的公众号 AppID 占位符,不要替换成某个固定公众号 AppID。若当前控制台要求的字段名或 URL 模板不同,应先保存不含密钥的截图并以当前官方控制台为准。
|
|
35
|
+
|
|
36
|
+
仅完成公众号第三方平台授权时不需要:
|
|
37
|
+
|
|
38
|
+
- 网站应用 AppID/AppSecret;
|
|
39
|
+
- 被授权公众号的 AppID/AppSecret;
|
|
40
|
+
- 手工复制 `component_verify_ticket`;
|
|
41
|
+
- 手工复制 component/authorizer access token;
|
|
42
|
+
- 微信支付或 SkillPay Token。
|
|
43
|
+
|
|
44
|
+
个人用户登录会另外需要独立网站应用 AppID/AppSecret,但绝不能填入上述 Component 配置。
|
|
45
|
+
|
|
46
|
+
## 3. `.env.local`
|
|
47
|
+
|
|
48
|
+
`.env.local` 已被 Git 忽略。先复核:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
git check-ignore -v .env.local
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
从安全占位文件开始:
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
cp .env.example .env.local
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
真实联调需要在本机填写:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
DXC_WECHAT_MODE=live
|
|
64
|
+
DXC_PUBLIC_BASE_URL=https://content.deployxai.com
|
|
65
|
+
DXC_MONGODB_URI=mongodb://127.0.0.1:27017/dxc
|
|
66
|
+
DXC_MONGODB_DATABASE=dxc
|
|
67
|
+
DXC_ENCRYPTION_KEY_BASE64=<本地生成的 32 字节 Base64 Key>
|
|
68
|
+
DXC_WECHAT_COMPONENT_APP_ID=<第三方平台 Component AppID>
|
|
69
|
+
DXC_WECHAT_COMPONENT_APP_SECRET=<第三方平台 Component AppSecret>
|
|
70
|
+
DXC_WECHAT_COMPONENT_TOKEN=<第三方平台消息校验 Token>
|
|
71
|
+
DXC_WECHAT_ENCODING_AES_KEY=<第三方平台 43 位 EncodingAESKey>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`DXC_ENCRYPTION_KEY_BASE64` 是 DxC 自己用于加密 Mongo 中微信 Token 的根 Key,不是微信提供的 Key。可以由用户在本机生成:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
openssl rand -base64 32
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
不得把任何真实值复制到聊天、Git、文档、测试或命令输出记录中。正式部署时这些值必须进入安全环境或密钥管理服务,不长期保存在仓库目录。
|
|
81
|
+
|
|
82
|
+
## 4. 本地无微信测试
|
|
83
|
+
|
|
84
|
+
本地 MongoDB 运行后,将 `.env.local` 设置为:
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
DXC_WECHAT_MODE=fake
|
|
88
|
+
DXC_PUBLIC_BASE_URL=http://127.0.0.1:3000
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
其余 Mongo 和 `DXC_ENCRYPTION_KEY_BASE64` 仍需有效。然后运行:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
pnpm build
|
|
95
|
+
pnpm dev:server
|
|
96
|
+
pnpm dxc wechat connect --server http://127.0.0.1:3000
|
|
97
|
+
pnpm dxc wechat accounts
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
假微信页面会自动回跳,不使用真实公众号,也不会请求微信 API。预期输出包含:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
草稿能力:available
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 5. 真实扫码验证
|
|
107
|
+
|
|
108
|
+
真实验证前必须同时满足:
|
|
109
|
+
|
|
110
|
+
1. `content.deployxai.com` 的三个目标路径已路由到本次 Server;
|
|
111
|
+
2. HTTPS、Nginx 和部署变更得到单独授权;
|
|
112
|
+
3. Server 已收到并加密保存微信主动推送的 `component_verify_ticket`;
|
|
113
|
+
4. `.env.local` 或部署环境中的第三方平台配置全部通过运行时校验;
|
|
114
|
+
5. 只使用用户明确授权的自有公众号。
|
|
115
|
+
|
|
116
|
+
运行:
|
|
117
|
+
|
|
118
|
+
```text
|
|
119
|
+
pnpm dxc wechat connect --server https://content.deployxai.com
|
|
120
|
+
pnpm dxc wechat accounts
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
CLI 打开的第一个页面必须是 `content.deployxai.com/authorize/wechat/start`。点击“进入微信官方授权页”后,浏览器才跳转到微信;不能直接把 `mp.weixin.qq.com` 授权 URL 当作 CLI 入口,否则微信无法确认授权发起页域名。
|
|
124
|
+
|
|
125
|
+
通过标准:
|
|
126
|
+
|
|
127
|
+
- 浏览器先打开 DxC 同域授权发起页,再打开微信官方第三方平台授权页;
|
|
128
|
+
- 管理员扫码后只看到 ID 3/11 对应权限;
|
|
129
|
+
- CLI 显示公众号名称;
|
|
130
|
+
- `draftCapability` 为 `available`;
|
|
131
|
+
- 日志、API 响应和 Git 中没有 AppSecret、Token、EncodingAESKey、授权码或完整 AppID。
|
|
132
|
+
|
|
133
|
+
## 6. `alivps` 最小部署约束
|
|
134
|
+
|
|
135
|
+
2026-07-26 已获得用户对本轮真实授权验证的部署授权。部署保持以下边界:
|
|
136
|
+
|
|
137
|
+
- DxC Server 使用 `/opt/dxc/releases/<release>`,`/opt/dxc/current` 只指向当前版本;
|
|
138
|
+
- PM2 只新增 `dxc-server` 单实例,不修改现有应用;
|
|
139
|
+
- 运行配置只保存在 `/etc/dxc/dxc.env`,权限必须为 `0600`;
|
|
140
|
+
- Nginx 保留现有静态官网,只将健康检查、微信 API、授权回跳和微信回调路径代理到 `127.0.0.1:3000`;
|
|
141
|
+
- `dxc-worker` 部署在 `worker_vps`,不得加入 `alivps` 的 PM2 配置;
|
|
142
|
+
- Worker 通过私网受限 CONNECT 代理复用 `alivps` 微信白名单出口;
|
|
143
|
+
- 生产 ECS 只运行已构建产物,不执行 `pnpm install`、`pnpm build`、测试或镜像构建;
|
|
144
|
+
- MongoDB 仍位于 `worker_vps`,只使用独立 `dxc` 数据库和专用最小权限账号;
|
|
145
|
+
- 回滚时恢复 Nginx 备份、停止 `dxc-server`,并将 `current` 指回上一版本;
|
|
146
|
+
- 不访问或修改 `puzhi-prod`、`puzhi_ecs`。
|
|
147
|
+
|
|
148
|
+
## 7. 官方来源核验状态
|
|
149
|
+
|
|
150
|
+
目标官方入口:
|
|
151
|
+
|
|
152
|
+
- [授权流程技术说明](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/Authorization_Process_Technical_Description.html)
|
|
153
|
+
- [授权事件](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/authorize_event.html)
|
|
154
|
+
- [消息加解密](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/Before_Develop/Message_encryption_and_decryption.html)
|
|
155
|
+
- [获取 component access token](https://developers.weixin.qq.com/doc/oplatform/openApi/ticket-token/api_getcomponentaccesstoken)
|
|
156
|
+
- [获取 pre_auth_code](https://developers.weixin.qq.com/doc/oplatform/openApi/ticket-token/api_getpreauthcode)
|
|
157
|
+
- [获取授权账号信息](https://developers.weixin.qq.com/doc/oplatform/openApi/authorization-management/api_getauthorizerinfo)
|
|
158
|
+
|
|
159
|
+
2026-07-25 当前允许的网页读取入口仍未返回可引用正文。因此代码把微信 HTTP 调用集中在单一适配器并用假服务固定契约;真实控制台截图和扫码结果是上线前验证闸门,不把不可读取的页面内容写成已重新确认事实。
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# 微信网站应用登录配置
|
|
2
|
+
|
|
3
|
+
更新日期:2026-07-27
|
|
4
|
+
|
|
5
|
+
状态:代码已支持显式首次注册、关联、第二设备登录和会话续期;平台配置已由用户完成,
|
|
6
|
+
真实值只在 Git 外。生产发布必须按本页闸门现场验证。
|
|
7
|
+
|
|
8
|
+
## 1. 与公众号授权的边界
|
|
9
|
+
|
|
10
|
+
这是 DxC 用户的个人微信登录,不是微信公众号第三方平台授权:
|
|
11
|
+
|
|
12
|
+
- 个人登录使用微信开放平台“网站应用微信登录”和独立的 Website AppID/AppSecret;
|
|
13
|
+
- `dxc auth start` 登录已有用户,或在文案明确的首次流程中创建新用户;
|
|
14
|
+
- `dxc auth link-wechat` 把个人微信关联到当前 DxC owner;
|
|
15
|
+
- `dxc auth login` 只恢复已经关联的 owner,并在当前机器建立新设备会话;
|
|
16
|
+
- `dxc wechat connect` 继续只负责为当前租户授权公众号;
|
|
17
|
+
- 个人微信登录不能新增、迁移、刷新或撤销公众号授权;
|
|
18
|
+
- 公众号第三方平台的 Component AppID/AppSecret、Token、EncodingAESKey、RSA 私钥和平台证书都不能当作网站登录凭据。
|
|
19
|
+
|
|
20
|
+
完整决策见 [ADR-0006](../decisions/0006-separate-wechat-user-login-from-account-authorization.md)
|
|
21
|
+
和 [ADR-0007](../decisions/0007-explicit-personal-wechat-start.md)。
|
|
22
|
+
|
|
23
|
+
## 2. 微信开放平台固定配置
|
|
24
|
+
|
|
25
|
+
固定域名和路径已经在服务端写死:
|
|
26
|
+
|
|
27
|
+
| 用途 | 固定值 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| 授权回调域 | `content.deployxai.com` |
|
|
30
|
+
| DxC 登录发起页 | `https://content.deployxai.com/auth/wechat/login` |
|
|
31
|
+
| 微信登录回调 | `https://content.deployxai.com/callbacks/wechat/login` |
|
|
32
|
+
| OAuth scope | `snsapi_login` |
|
|
33
|
+
|
|
34
|
+
微信控制台的“授权回调域”字段只填写合法域名 `content.deployxai.com`,不要填写协议、路径、查询参数或公众号第三方平台回调。
|
|
35
|
+
|
|
36
|
+
网站应用审核通过后,只把控制台生成的两项材料放进 Server 的安全环境:
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
DXC_WECHAT_LOGIN_MODE=live
|
|
40
|
+
DXC_WECHAT_LOGIN_APP_ID=<网站应用 AppID>
|
|
41
|
+
DXC_WECHAT_LOGIN_APP_SECRET=<网站应用 AppSecret>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
AppSecret 只进入 Server 的 Secret 环境,不进入 CLI、浏览器、Mongo、Git、日志或聊天。网站登录 OAuth 不使用 `DXC_WECHAT_API_RSA_PRIVATE_KEY_FILE`、`DXC_WECHAT_API_PLATFORM_CERTIFICATE_FILE`、第三方平台 Token 或 EncodingAESKey。
|
|
45
|
+
|
|
46
|
+
## 3. 推荐首次使用和兼容关联
|
|
47
|
+
|
|
48
|
+
全新用户使用统一入口:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
dxc setup --server https://content.deployxai.com
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
第一步个人微信 `start`:已关联时恢复原用户,未关联时页面明确创建新 DxC 内容空间;
|
|
55
|
+
第二步只在当前空间没有公众号时进入第三方平台管理员授权。普通严格恢复仍可使用:
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
dxc auth login --server https://content.deployxai.com
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
它对未关联身份返回 `WECHAT_LOGIN_IDENTITY_NOT_LINKED`,不会建租户。
|
|
62
|
+
|
|
63
|
+
现有 owner 在仍然有效的设备上执行一次:
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
pnpm dxc auth link-wechat --server https://content.deployxai.com
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
关联完成后,新设备也可执行:
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
pnpm dxc auth login --server https://content.deployxai.com
|
|
73
|
+
pnpm dxc auth status
|
|
74
|
+
pnpm dxc wechat accounts
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
旧 `link-wechat` 路径仅为已存在但尚未关联个人微信的 owner 保留。公众号授权不能代替
|
|
78
|
+
个人登录接管已有租户。
|
|
79
|
+
|
|
80
|
+
## 4. 本地假微信验证
|
|
81
|
+
|
|
82
|
+
本地 `.env.local` 使用安全测试值:
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
DXC_WECHAT_MODE=fake
|
|
86
|
+
DXC_WECHAT_LOGIN_MODE=fake
|
|
87
|
+
DXC_PUBLIC_BASE_URL=http://127.0.0.1:3000
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
启动 Server 后,全新状态直接运行:
|
|
91
|
+
|
|
92
|
+
```text
|
|
93
|
+
pnpm dxc setup --server http://127.0.0.1:3000
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
在另一个临时 `DXC_CLI_STATE_DIR` 中验证第二设备:
|
|
97
|
+
|
|
98
|
+
```text
|
|
99
|
+
DXC_CLI_STATE_DIR=/tmp/dxc-second-device \
|
|
100
|
+
pnpm dxc auth login --server http://127.0.0.1:3000
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
假适配器不请求微信,不需要 AppID/AppSecret,只用于本地契约测试。
|
|
104
|
+
|
|
105
|
+
## 5. 会话与数据边界
|
|
106
|
+
|
|
107
|
+
- 设备访问 Token 有效 24 小时;
|
|
108
|
+
- 设备刷新凭据有效 30 天,每次使用同时轮换访问 Token 和刷新 Token;
|
|
109
|
+
- 刷新请求还必须由本机 Ed25519 私钥签名;
|
|
110
|
+
- Server 只保存 Token 摘要,不保存 CLI 的明文设备 Token;
|
|
111
|
+
- 微信网站登录返回的授权 code、access token 和 refresh token 在解析个人身份后立即丢弃;
|
|
112
|
+
- Mongo 只保存由 Website AppID + openid/unionid 派生的 SHA-256 查找键;
|
|
113
|
+
- logout(注销)会让当前访问和刷新能力同时失效。
|
|
114
|
+
|
|
115
|
+
当前 CLI 在 `~/.dxc/wechat-session.json` 中以 `0600` 保存设备会话和刷新凭据;迁移到系统钥匙串是后续存储适配,不改变协议。
|
|
116
|
+
|
|
117
|
+
## 6. 真实启用和发布闸门
|
|
118
|
+
|
|
119
|
+
真实扫码前还必须分别完成:
|
|
120
|
+
|
|
121
|
+
1. 网站应用审核通过并取得独立 AppID/AppSecret;
|
|
122
|
+
2. 生产安全环境注入三项 `DXC_WECHAT_LOGIN_*` 变量;
|
|
123
|
+
3. Nginx 将登录发起页、登录回调和登录 API 路由到当前 Server;
|
|
124
|
+
4. HTTPS 和授权回调域现场核对;
|
|
125
|
+
5. 用全新状态验证 `setup` 首次注册和公众号绑定,再用第二设备验证恢复同一 owner;
|
|
126
|
+
6. 确认日志、API 和 Mongo 中没有微信 OAuth Token、授权 code 或 AppSecret。
|
|
127
|
+
|
|
128
|
+
发布仓库包含登录 API、发起页、回调和预览所需的 Nginx 路由,以及只输出变量名错误的
|
|
129
|
+
生产环境渲染脚本。真实值仍只允许从 Git 外的安全环境注入;部署完成前不得把“代码
|
|
130
|
+
就绪”表述为“真实扫码已经验证”。
|
|
131
|
+
|
|
132
|
+
## 7. 官方来源
|
|
133
|
+
|
|
134
|
+
核验日期:2026-07-27。
|
|
135
|
+
|
|
136
|
+
- [微信开放平台网站应用微信登录开发指南](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)
|
|
137
|
+
- [微信 UnionID 机制](https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# WeMD 模板来源说明
|
|
2
|
+
|
|
3
|
+
核验日期:2026-07-31
|
|
4
|
+
|
|
5
|
+
DxC 的下列模板根据 [tenngoxars/WeMD](https://github.com/tenngoxars/WeMD) 的 MIT 许可证
|
|
6
|
+
主题设计转写为受控内联样式令牌:
|
|
7
|
+
|
|
8
|
+
- Academic Paper → `wechat-academic-paper@1`
|
|
9
|
+
- Aurora Glass → `wechat-aurora-glass@1`
|
|
10
|
+
- Bauhaus → `wechat-bauhaus@1`
|
|
11
|
+
- Cyberpunk Neon → `wechat-cyberpunk-neon@1`
|
|
12
|
+
- Knowledge Base → `wechat-knowledge-base@1`
|
|
13
|
+
- Luxury Gold → `wechat-luxury-gold@1`
|
|
14
|
+
- Morandi Forest → `wechat-morandi-forest@1`
|
|
15
|
+
- Neo Brutalism → `wechat-neo-brutalism@1`
|
|
16
|
+
- Receipt → `wechat-receipt@1`
|
|
17
|
+
- Sunset Film → `wechat-sunset-film@1`
|
|
18
|
+
|
|
19
|
+
核验的上游提交为
|
|
20
|
+
[`0a858532ebe7391d613fa0645bb320049776e483`](https://github.com/tenngoxars/WeMD/commit/0a858532ebe7391d613fa0645bb320049776e483),
|
|
21
|
+
上游许可证为 [MIT](https://github.com/tenngoxars/WeMD/blob/main/LICENSE)。
|
|
22
|
+
|
|
23
|
+
复用边界:DxC 没有复制 WeMD 的 Markdown 解析器、其原始 HTML 允许策略或浏览器运行时;
|
|
24
|
+
模板均通过 DxC 的 `marked` token renderer、`sanitize-html` allowlist 和预检后才写入
|
|
25
|
+
`RenderSnapshot`。这不是 WeMD 的兼容性或支持承诺。
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# 研究监控、热点发现与爆款拆解设计
|
|
2
|
+
|
|
3
|
+
日期:2026-07-30
|
|
4
|
+
|
|
5
|
+
状态:Proposed(待实施)
|
|
6
|
+
|
|
7
|
+
关联决策:[ADR-0004:本地优先的 Agent 研究与抓取运行时](decisions/0004-local-first-agent-research-runtime.md)
|
|
8
|
+
|
|
9
|
+
## 一句话决策
|
|
10
|
+
|
|
11
|
+
定时抓取不加入文章八阶段,也不放到 DxC Cloud。它是用户本机或 Agent 宿主中的独立
|
|
12
|
+
“研究监控层”:按用户显式创建的监控任务采集公开信号,保存时间序列和证据,产出候选
|
|
13
|
+
研究包;用户真正要写文章时,`research` 阶段再消费其中与本次主题有关的部分。
|
|
14
|
+
|
|
15
|
+
采集、热度判断、爆款拆解和文章创作必须分层。一个能抓页面的项目,不会自动得到可靠
|
|
16
|
+
的热点判断;一篇高互动文章,也不能因为互动高就证明它的观点正确。
|
|
17
|
+
|
|
18
|
+
## 用户能得到什么
|
|
19
|
+
|
|
20
|
+
### 定时热点监控
|
|
21
|
+
|
|
22
|
+
用户可以表达:
|
|
23
|
+
|
|
24
|
+
> 每天 9 点看过去 24 小时 AI 编程热点,只保留跨两个来源出现或热度持续上升的主题。
|
|
25
|
+
|
|
26
|
+
系统将生成:
|
|
27
|
+
|
|
28
|
+
- 本次候选池和抓取时间;
|
|
29
|
+
- 与前几次运行相比的新出现、持续、升温、降温;
|
|
30
|
+
- 每条热度证据的来源和统计口径;
|
|
31
|
+
- 值得进一步研究的 3–8 个主题;
|
|
32
|
+
- 失败、限流、过期登录态和本次未覆盖来源。
|
|
33
|
+
|
|
34
|
+
### 爆款文章拆解
|
|
35
|
+
|
|
36
|
+
用户可以表达:
|
|
37
|
+
|
|
38
|
+
> 每周找 10 篇与私域增长有关的高互动文章,拆解开头、承诺、结构、证据、情绪和行动。
|
|
39
|
+
|
|
40
|
+
系统先判断“爆款证据是否成立”,再拆内容。输出分成:
|
|
41
|
+
|
|
42
|
+
1. `viralEvidence`:榜单位置、互动快照、采集时间、来源内相对位置、是否跨源出现;
|
|
43
|
+
2. `contentPattern`:钩子、读者承诺、冲突、结构、证据、情绪转折、金句、CTA;
|
|
44
|
+
3. `claimType`:可核实事实、作者观点、项目方声明、仍待验证;
|
|
45
|
+
4. `reusableInsight`:可借鉴的机制,不复制原文表达;
|
|
46
|
+
5. `risk`:标题透支、因果倒置、样本偏差、广告或版权风险。
|
|
47
|
+
|
|
48
|
+
## 为什么不做成第九阶段
|
|
49
|
+
|
|
50
|
+
- 文章八阶段是一次内容任务,有明确开始和完成;
|
|
51
|
+
- 热点监控是长期任务,会重复运行、积累历史、错过执行并处理来源故障;
|
|
52
|
+
- 同一个监控结果可以服务多篇文章;
|
|
53
|
+
- 用户可能只看简报,不进入写作;
|
|
54
|
+
- 定时任务需要暂停、删除、频率和保留策略,这些不属于文章 checkpoint。
|
|
55
|
+
|
|
56
|
+
两者只通过有界产物连接:监控层输出候选和证据,文章 `research` 阶段选择其中一部分,
|
|
57
|
+
记录来源指针和哈希,不把完整抓取缓存复制进文章项目。
|
|
58
|
+
|
|
59
|
+
## 当前 WorkBuddy 自动化能复用什么
|
|
60
|
+
|
|
61
|
+
本机已存在的“GitHub 热门项目周报”自动化证明了业务流程可行:
|
|
62
|
+
|
|
63
|
+
- `/Users/lvyuanfang/.workbuddy/automation-backups/github.json` 已包含周日 9 点的周期任务;
|
|
64
|
+
- `/Users/lvyuanfang/WorkBuddy/20260324151404/.workbuddy/automations/github/editorial-strategy.md`
|
|
65
|
+
已把热度与价值拆成两个维度;
|
|
66
|
+
- `build-github-history-index.mjs` 已按 `owner/repo` 归一历史,记录首次出现、重复出现、
|
|
67
|
+
连续出现和周增序列;
|
|
68
|
+
- `REVIEW-2026-07-27.md` 已验证固定 Top 10 会把采集口径误写成编辑目标。
|
|
69
|
+
|
|
70
|
+
这些可以复用为“评分与编辑策略”样板,但当前 `github.json` 本质上是一个长提示词:
|
|
71
|
+
来源调用、错误分类、时间序列、限流、去重和证据结构没有统一运行时契约,不能直接当成
|
|
72
|
+
DxC 的通用抓取引擎。
|
|
73
|
+
|
|
74
|
+
## 运行架构
|
|
75
|
+
|
|
76
|
+
### 1. Monitor 定义
|
|
77
|
+
|
|
78
|
+
每个监控任务至少包含:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"id": "uuid",
|
|
83
|
+
"name": "AI 编程热点",
|
|
84
|
+
"query": "AI coding, coding agent",
|
|
85
|
+
"schedule": "FREQ=DAILY;BYHOUR=9;BYMINUTE=0",
|
|
86
|
+
"timezone": "Asia/Shanghai",
|
|
87
|
+
"sourceIds": ["github-public", "rss-list", "aihot-public"],
|
|
88
|
+
"executionLocation": "local-device",
|
|
89
|
+
"dataTransit": "local-only",
|
|
90
|
+
"missedRunPolicy": "run-once-when-online",
|
|
91
|
+
"retentionDays": 90,
|
|
92
|
+
"enabled": true
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
用户必须显式创建和启用。删除任务时可以选择只删调度定义,或同时清理其本地缓存;不能
|
|
97
|
+
静默注册开机自启。
|
|
98
|
+
|
|
99
|
+
### 2. Source Adapter
|
|
100
|
+
|
|
101
|
+
适配器只负责“取回并规范化证据”,不写文章。每个适配器固定版本、域名、认证方式、
|
|
102
|
+
最小间隔、超时和输出上限。
|
|
103
|
+
|
|
104
|
+
优先顺序:
|
|
105
|
+
|
|
106
|
+
1. 官方 API、RSS/Atom 和公开 JSON;
|
|
107
|
+
2. 用户明确选择的第三方聚合 API;
|
|
108
|
+
3. 无登录公开网页;
|
|
109
|
+
4. 用户已授权的本地浏览器会话。
|
|
110
|
+
|
|
111
|
+
登录态来源只允许 `local-device`。Cookie、Token、请求头和 Profile 路径不能进入任务
|
|
112
|
+
定义、日志或 Agent 对话。
|
|
113
|
+
|
|
114
|
+
### 3. 统一 ResearchItem
|
|
115
|
+
|
|
116
|
+
所有来源归一为同一条目:
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"sourceId": "github-public",
|
|
121
|
+
"sourceItemId": "owner/repo",
|
|
122
|
+
"canonicalUrl": "https://github.com/owner/repo",
|
|
123
|
+
"title": "owner/repo",
|
|
124
|
+
"author": "owner",
|
|
125
|
+
"publishedAt": "2026-07-29T00:00:00Z",
|
|
126
|
+
"discoveredAt": "2026-07-30T01:00:00Z",
|
|
127
|
+
"capturedAt": "2026-07-30T01:00:02Z",
|
|
128
|
+
"excerpt": "有界摘录",
|
|
129
|
+
"engagement": {
|
|
130
|
+
"stars": 12000,
|
|
131
|
+
"weeklyStars": 1800
|
|
132
|
+
},
|
|
133
|
+
"captureMethod": "official-api",
|
|
134
|
+
"executionLocation": "local-device",
|
|
135
|
+
"dataTransit": "local-only",
|
|
136
|
+
"rawHash": "sha256",
|
|
137
|
+
"extractor": "github-public@1",
|
|
138
|
+
"limitations": []
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
SQLite 保存规范化条目、每次指标快照、运行记录和去重关系。全文缓存有单独保留期限,
|
|
143
|
+
默认不进入知识库,也不上传 DxC Cloud。
|
|
144
|
+
|
|
145
|
+
### 4. 热度不是一个数字
|
|
146
|
+
|
|
147
|
+
热度判断至少包含:
|
|
148
|
+
|
|
149
|
+
- `velocity`:同一来源内的增长速度;
|
|
150
|
+
- `persistence`:连续多次运行是否仍出现;
|
|
151
|
+
- `crossSource`:是否在不同来源形成独立信号;
|
|
152
|
+
- `relativeRank`:在同一来源、同一时间窗中的相对位置;
|
|
153
|
+
- `novelty`:是否只是旧内容再次被转载;
|
|
154
|
+
- `sourceConfidence`:官方 API、聚合源、页面解析的证据等级;
|
|
155
|
+
- `valueScore`:问题价值和方案辨识度,由 Agent 单独判断。
|
|
156
|
+
|
|
157
|
+
不同平台的播放、点赞、收藏、评论和 Star 不直接相加。先在各自来源内归一,再解释跨源
|
|
158
|
+
关系。拿不到历史快照时写 `null`,不根据当前总量反推增长。
|
|
159
|
+
|
|
160
|
+
### 5. 调度和恢复
|
|
161
|
+
|
|
162
|
+
- 宿主提供可靠自动化时,优先让 WorkBuddy/Codex 自动化调用一次性本地 Runner;
|
|
163
|
+
- 没有宿主调度时,才使用 `launchd`、Windows 任务计划程序或 `systemd timer`;
|
|
164
|
+
- Runner 使用本地租约避免同一任务并发执行;
|
|
165
|
+
- 每次运行记录 `scheduledAt`、`startedAt`、`finishedAt`、来源结果、失败原因和下一次时间;
|
|
166
|
+
- 电脑离线时按 `missedRunPolicy` 处理,不能假装准时执行;
|
|
167
|
+
- 来源失败不让其它来源结果丢失;简报必须显示本次覆盖缺口。
|
|
168
|
+
|
|
169
|
+
DxC Server/Worker 不参与第三方抓取。
|
|
170
|
+
|
|
171
|
+
## 开源项目判断
|
|
172
|
+
|
|
173
|
+
核验日期:2026-07-30。
|
|
174
|
+
|
|
175
|
+
| 项目 | 可以借鉴 | 不直接采用的原因 | 建议 |
|
|
176
|
+
| --- | --- | --- | --- |
|
|
177
|
+
| [mvanhorn/last30days-skill](https://github.com/mvanhorn/last30days-skill) | 多来源并行、来源覆盖、互动信号、SQLite watchlist(监控列表) | 不同来源依赖 API Key、浏览器会话和第三方服务;Skill 还包含安装与宿主特定流程 | 作为适配器和研究编排参考,不作为 DxC 核心依赖 |
|
|
178
|
+
| [microwo/last30days-cn](https://github.com/microwo/last30days-cn) | 本机 WorkBuddy 当前安装的同名 Skill;B 站搜索、统一模型、评分和去重的轻量雏形 | 当前只有 B 站真正实现;知乎/小红书仍需 API,微博/抖音仍开发中;仓库样本和维护量很小 | 只作为 B 站试验候选,不能对外宣称已覆盖五个平台 |
|
|
179
|
+
| [Jesseovo/last30days-skill-cn](https://github.com/Jesseovo/last30days-skill-cn) | 更活跃的同名中文实现;多来源降级、诊断、缓存、测试和 Playwright 适配经验 | README 明确声明仅供学习研究、严禁商业用途;依赖浏览器登录态、公开搜索兜底和易变化的页面接口 | 可做技术评审样本,不能直接进入商业 DxC;如用户自行安装,也只能作为宿主可选工具 |
|
|
180
|
+
| [sansan0/TrendRadar](https://github.com/sansan0/TrendRadar) | 多榜单、RSS、定时、增量模式、本地存储和通知 | GPL-3.0 与 DxC 代码分发边界需要审查,且包含远超 MVP 的推送和 MCP 能力 | 借鉴数据模型;如试用,保持独立进程/文件接口,不复制代码 |
|
|
181
|
+
| [NanmiCoder/MediaCrawler](https://github.com/NanmiCoder/MediaCrawler) | 多个国内内容平台及评论采集经验 | 官方许可证明确限制为非商业学习,不允许直接进入商业 DxC | 不集成;只用于理解平台难点 |
|
|
182
|
+
| [AI HOT](https://aihot.virxact.com/terms) | 匿名只读 AI 资讯、热点事件和时间窗 API | 是策展聚合源,不等于原始全网抓取;缓存、归因和再分发要遵守接入条款 | 作为可选公开来源适配器,保留 canonical(规范链接)和 attribution(来源标注) |
|
|
183
|
+
|
|
184
|
+
不采用“反爬万能框架 + 代理池 + 验证码绕过”的路线。它与本地优先、商业合规、账号安全
|
|
185
|
+
和可维护性都冲突。
|
|
186
|
+
|
|
187
|
+
## 分阶段实施
|
|
188
|
+
|
|
189
|
+
### R1:公开来源最小闭环
|
|
190
|
+
|
|
191
|
+
- 已实现的 R1-0 本地采集原语:`dxc source fetch rss`、`api`、`html`。它们只处理用户给定的
|
|
192
|
+
RSS/Atom、返回 JSON 的 HTTP API 或公开 HTML,逐跳拦截本机/私网/云元数据地址,并输出
|
|
193
|
+
来源 URL、采集时间、内容哈希、抽取器版本及本机执行边界。
|
|
194
|
+
- 已实现的 R1-1 本地手动监控:`dxc monitor add|list|run|status|remove` 在私有 SQLite 中保存
|
|
195
|
+
来源定义、运行记录和去重哈希;`run` 以本地租约避免同一来源并发检查,输出新内容、更新、
|
|
196
|
+
未变化和失败说明。HTTP API 只保存环境变量名,不保存令牌值。
|
|
197
|
+
RSS 是条目级去重;公开 HTML 和任意 JSON API 当前按整个响应的内容哈希观察变化,不把
|
|
198
|
+
未配置字段映射的 JSON 列表冒充成条目级热点。
|
|
199
|
+
- 后续 R1 才加入 GitHub 官方仓库/Release/Issue/Discussion、AI HOT 等具名来源适配器、指标
|
|
200
|
+
快照、WorkBuddy 自动化一次性 Runner,以及 `.research.md` 与 `.analysis.json`。
|
|
201
|
+
|
|
202
|
+
R1-1 不声称有定时、升温判断、聚类或断网补跑;这些由后续本地监控层提供。
|
|
203
|
+
|
|
204
|
+
### R2:复用 GitHub 历史策略
|
|
205
|
+
|
|
206
|
+
- 把 `owner/repo` 归一、重复期去重、连续出现和 `null` 周增规则迁入正式契约;
|
|
207
|
+
- 热度和价值分离;
|
|
208
|
+
- 内部分析与公开稿分离;
|
|
209
|
+
- 监控结果可被 `dxc-research` 有界引用。
|
|
210
|
+
|
|
211
|
+
### R3:B 站试验
|
|
212
|
+
|
|
213
|
+
- 先核验公开接口和平台条款;
|
|
214
|
+
- 固定版本、调用频率、最大结果数和超时;
|
|
215
|
+
- 只存元数据、有界描述和互动快照;
|
|
216
|
+
- 不自动抓完整字幕、评论全集或登录态内容。
|
|
217
|
+
|
|
218
|
+
### R4:登录态平台
|
|
219
|
+
|
|
220
|
+
知乎、小红书、微博、抖音只有在以下闸门全部满足后才进入:
|
|
221
|
+
|
|
222
|
+
- 明确的商业使用和平台条款结论;
|
|
223
|
+
- 用户逐域名授权的本地浏览器适配器;
|
|
224
|
+
- 登录过期、验证码和风控的可见恢复流程;
|
|
225
|
+
- 不输出会话材料;
|
|
226
|
+
- 小规模真实测试证明不会造成高频访问或账号异常。
|
|
227
|
+
|
|
228
|
+
## 与收费和 local-first 的关系
|
|
229
|
+
|
|
230
|
+
“本地优先”不是“所有能力必须离线”。研究原始材料、历史快照和用户站点登录态留在
|
|
231
|
+
本地;公众号权威渲染、样式预览和草稿副作用仍由云端提供,这是清楚且可收费的价值边界。
|
|
232
|
+
|
|
233
|
+
可以收费的是云端权威渲染、样式、预览、草稿、审计和协作,不应为了证明 local-first
|
|
234
|
+
再造一个与正式渲染不同的本地预览。研究监控若以后收费,也应按受控适配器、分析额度或
|
|
235
|
+
同步能力收费,而不是把用户 Cookie 或第三方全文搬到 DxC Cloud。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# TODO:云端预览、收费与 local-first 的产品边界
|
|
2
|
+
|
|
3
|
+
状态:Deferred(延期决策)
|
|
4
|
+
|
|
5
|
+
日期:2026-07-30
|
|
6
|
+
|
|
7
|
+
## 已确定
|
|
8
|
+
|
|
9
|
+
- Markdown、本地知识库、用户画像、研究产物和视觉源文件继续保存在用户设备。
|
|
10
|
+
- 权威渲染、模板版本、样式选择、不可变快照和确认绑定属于 DxC Cloud。
|
|
11
|
+
- 预览阶段由 Agent 在宿主右侧内置浏览器直接展示云端快照,不在对话中发送短时链接。
|
|
12
|
+
- 当前不提供 `dxc wechat draft preview-local`,也不以本地复制云端模板来证明
|
|
13
|
+
“local-first”。
|
|
14
|
+
|
|
15
|
+
## 待回答
|
|
16
|
+
|
|
17
|
+
1. 免费用户能否在本地查看无样式的结构预检,而付费用户使用云端高保真模板预览?
|
|
18
|
+
2. 如果开放本地模板,如何避免模板版本、字体和微信兼容规则与云端真值漂移?
|
|
19
|
+
3. 样式选择的收费对象应是模板、渲染次数、草稿额度,还是权益组合?
|
|
20
|
+
4. 哪些内容必须上传才能完成预览,能否在上传前给出清晰的数据范围摘要?
|
|
21
|
+
5. 宿主没有右侧内置浏览器时,是否拒绝交付,还是提供受控的一次性预览窗口?
|
|
22
|
+
|
|
23
|
+
## 决策闸门
|
|
24
|
+
|
|
25
|
+
在回答以上问题并形成新 ADR 前:
|
|
26
|
+
|
|
27
|
+
- 不恢复离线 HTML 预览命令;
|
|
28
|
+
- 不把云端模板代码复制到 CLI;
|
|
29
|
+
- 不改变“创建草稿前必须展示并确认不可变云端快照”的安全门;
|
|
30
|
+
- 不把“本地优先”表述成“所有能力离线运行”,而表述为“内容源和长期记忆本地可控,
|
|
31
|
+
只有明确选择的交付数据进入云端能力”。
|