growovo 0.3.0__tar.gz

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 (80) hide show
  1. growovo-0.3.0/LICENSE +21 -0
  2. growovo-0.3.0/PKG-INFO +295 -0
  3. growovo-0.3.0/README.md +251 -0
  4. growovo-0.3.0/channels/__init__.py +51 -0
  5. growovo-0.3.0/channels/email_cdp.py +57 -0
  6. growovo-0.3.0/channels/email_smtp.py +146 -0
  7. growovo-0.3.0/channels/github.py +280 -0
  8. growovo-0.3.0/channels/hn.py +216 -0
  9. growovo-0.3.0/channels/linkedin.py +124 -0
  10. growovo-0.3.0/channels/reddit.py +148 -0
  11. growovo-0.3.0/channels/x/__init__.py +1 -0
  12. growovo-0.3.0/channels/x/adapter.py +193 -0
  13. growovo-0.3.0/channels/x/vendor/PROVENANCE.md +9 -0
  14. growovo-0.3.0/channels/x/vendor/follow_x.py +83 -0
  15. growovo-0.3.0/channels/x/vendor/like_x.py +78 -0
  16. growovo-0.3.0/channels/x/vendor/publish_x.py +425 -0
  17. growovo-0.3.0/channels/x/vendor/reply_x.py +152 -0
  18. growovo-0.3.0/channels/x/vendor/scan_inbox.py +59 -0
  19. growovo-0.3.0/channels/x/vendor/search_x.py +83 -0
  20. growovo-0.3.0/channels/x/vendor/x_search.sh +118 -0
  21. growovo-0.3.0/channels/x/vendor/xdm.py +376 -0
  22. growovo-0.3.0/core/__init__.py +1 -0
  23. growovo-0.3.0/core/action_runner.py +246 -0
  24. growovo-0.3.0/core/approval.py +217 -0
  25. growovo-0.3.0/core/attribution.py +274 -0
  26. growovo-0.3.0/core/campaign.py +337 -0
  27. growovo-0.3.0/core/cdp.py +52 -0
  28. growovo-0.3.0/core/collector.py +250 -0
  29. growovo-0.3.0/core/contacts.py +113 -0
  30. growovo-0.3.0/core/demo.py +143 -0
  31. growovo-0.3.0/core/doctor.py +138 -0
  32. growovo-0.3.0/core/evidence.py +28 -0
  33. growovo-0.3.0/core/experiments.py +238 -0
  34. growovo-0.3.0/core/gates.py +131 -0
  35. growovo-0.3.0/core/ledger.py +157 -0
  36. growovo-0.3.0/core/links.py +94 -0
  37. growovo-0.3.0/core/locators.py +127 -0
  38. growovo-0.3.0/core/onboarding.py +83 -0
  39. growovo-0.3.0/core/operations_memory.py +76 -0
  40. growovo-0.3.0/core/optimization.py +151 -0
  41. growovo-0.3.0/core/outcome_io.py +147 -0
  42. growovo-0.3.0/core/pipeline.py +126 -0
  43. growovo-0.3.0/core/planlint.py +144 -0
  44. growovo-0.3.0/core/playbooks.py +255 -0
  45. growovo-0.3.0/core/queue.py +179 -0
  46. growovo-0.3.0/core/queue_runner.py +82 -0
  47. growovo-0.3.0/core/safety.py +60 -0
  48. growovo-0.3.0/core/scheduler.py +212 -0
  49. growovo-0.3.0/core/scorecard.py +156 -0
  50. growovo-0.3.0/core/task_outcome.py +317 -0
  51. growovo-0.3.0/core/throttle.py +172 -0
  52. growovo-0.3.0/core/transports.py +121 -0
  53. growovo-0.3.0/core/workflows.py +606 -0
  54. growovo-0.3.0/core/workspace.py +46 -0
  55. growovo-0.3.0/growovo.egg-info/PKG-INFO +295 -0
  56. growovo-0.3.0/growovo.egg-info/SOURCES.txt +78 -0
  57. growovo-0.3.0/growovo.egg-info/dependency_links.txt +1 -0
  58. growovo-0.3.0/growovo.egg-info/entry_points.txt +3 -0
  59. growovo-0.3.0/growovo.egg-info/requires.txt +1 -0
  60. growovo-0.3.0/growovo.egg-info/top_level.txt +4 -0
  61. growovo-0.3.0/mcp_server.py +450 -0
  62. growovo-0.3.0/mkt.py +1306 -0
  63. growovo-0.3.0/pyproject.toml +49 -0
  64. growovo-0.3.0/setup.cfg +4 -0
  65. growovo-0.3.0/tests/test_action_runner_outcome.py +81 -0
  66. growovo-0.3.0/tests/test_core.py +431 -0
  67. growovo-0.3.0/tests/test_demo.py +60 -0
  68. growovo-0.3.0/tests/test_doctor.py +62 -0
  69. growovo-0.3.0/tests/test_experiments_attribution.py +202 -0
  70. growovo-0.3.0/tests/test_github_benchmark.py +246 -0
  71. growovo-0.3.0/tests/test_mcp_collect.py +236 -0
  72. growovo-0.3.0/tests/test_operations.py +154 -0
  73. growovo-0.3.0/tests/test_operations_memory.py +42 -0
  74. growovo-0.3.0/tests/test_planlint.py +149 -0
  75. growovo-0.3.0/tests/test_playbooks.py +132 -0
  76. growovo-0.3.0/tests/test_queue_recovery.py +21 -0
  77. growovo-0.3.0/tests/test_safety.py +125 -0
  78. growovo-0.3.0/tests/test_task_outcome.py +221 -0
  79. growovo-0.3.0/tests/test_workflow.py +289 -0
  80. growovo-0.3.0/tests/test_workflows.py +311 -0
growovo-0.3.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Roy Tong
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
growovo-0.3.0/PKG-INFO ADDED
@@ -0,0 +1,295 @@
1
+ Metadata-Version: 2.4
2
+ Name: growovo
3
+ Version: 0.3.0
4
+ Summary: Agent-native GTM operator kernel: reviewed playbooks, authorized accounts, quotas and verifiable operation records.
5
+ Author: Roy Tong
6
+ License: MIT License
7
+
8
+ Copyright (c) 2026 Roy Tong
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/roy-tong/Growovo
29
+ Project-URL: Changelog, https://github.com/roy-tong/Growovo/blob/main/CHANGELOG.md
30
+ Keywords: gtm,growth,marketing-automation,mcp,one-person-company,agent
31
+ Classifier: Development Status :: 3 - Alpha
32
+ Classifier: Environment :: Console
33
+ Classifier: Intended Audience :: Developers
34
+ Classifier: License :: OSI Approved :: MIT License
35
+ Classifier: Programming Language :: Python :: 3
36
+ Classifier: Programming Language :: Python :: 3.9
37
+ Classifier: Programming Language :: Python :: 3.11
38
+ Classifier: Topic :: Office/Business
39
+ Requires-Python: >=3.9
40
+ Description-Content-Type: text/markdown
41
+ License-File: LICENSE
42
+ Requires-Dist: playwright>=1.40
43
+ Dynamic: license-file
44
+
45
+ <p align="center">
46
+ <img src="docs/assets/logo.png" width="400" alt="Growovo">
47
+ </p>
48
+
49
+ <p align="center"><strong>把重复运营工作交给 Agent,留下可核验的执行记录。</strong><br>
50
+ <em>Execute authorized recurring operations with reviewable results.</em></p>
51
+
52
+ <p align="center"><strong>简体中文</strong> · <a href="README.en.md">English</a></p>
53
+
54
+ Growovo 面向维护产品社区、内容渠道和客户沟通的运营人员。输入工作目标、授权账号与任务清单,先预览和审核,再执行重复操作;每项动作记录成功、失败或待人工核实,支持暂停与后续处理。
55
+
56
+ 产品由 **Operator Engine(操作内核)** 和 **Playbooks(业务工作流)** 组成。当前可用的 GitHub Inbox Playbook 把问题列表分流并生成回复队列;内容、邮件和增长活动复用同一执行内核。CLI、MCP、Skill 共用审批、预算、回读和账本。发送成功只代表操作完成,注册、付费等业务结果单独记录。
57
+
58
+ [![tests](https://github.com/roy-tong/Growovo/actions/workflows/tests.yml/badge.svg)](https://github.com/roy-tong/Growovo/actions/workflows/tests.yml)
59
+
60
+ **先试一个结果:** `python3 mkt.py demo` 在本地完成计划校验、审批、dry-run 和账本演示,无需账号或网络。实际平台命令的验证等级见下表。[能力进度与技术取舍](docs/feature-status.md)。
61
+
62
+ > 为什么不自己写个脚本,或者用通用自动化平台?[对比页](docs/compare.md)(英文)逐项写了 Growovo 在哪输、在哪赢,并给出每条主张对应的仓库文件。
63
+
64
+ - **Askovo** 负责业务研究与验证,为任务提供依据。
65
+ - **Growovo** 执行授权运营任务,记录操作结果。
66
+ - **Verovo** 关联费用与业务结果,计算单任务经济性。
67
+
68
+ 三者可独立使用。`mkt.py` 与 `growovo-gtm` 标识保持兼容,GTM 是首批应用场景。
69
+
70
+ ## 合规与纪律(先读这个)
71
+
72
+ - 仅用于**本人拥有/运营的账号**;不碰他人账号、不做代运营自动化
73
+ - CDP 通道零凭据:不保存任何密码/token/Cookie;SMTP 凭据只走环境变量
74
+ - **一切写操作默认 dry-run,`--go` 才实跑**;实跑必须绑定**已人审 plan**——无 plan 管辖默认拒跑,仅 CLI 人工通道 `--adhoc` 显式放行(账本记 adhoc=true;MCP 不开放)
75
+ - 日预算在发送前原子预留;`indeterminate`(未知结果)不可自动重发,必须人工 `ledger resolve`;contacts 的 DNC/bounced 身份与 `suppress.txt` 合并为同一发送抑制源
76
+ - 失败即停(不重试轰炸);回读校验不一致绝不发送(449 空正文事故的固化)
77
+ - 人类节奏:随机间隔 + 单次硬上限 + 日预算(core/throttle.py 的表)
78
+ - 不群发:千人千面内容为前提;占位符残留会被门禁直接拒绝
79
+ - 不做对抗:不绕验证码、不伪造指纹、不用代理池
80
+
81
+ ## 安装与启动
82
+
83
+ **先拿一个结果,再装环境。** 克隆后不需要任何依赖、任何账号:
84
+
85
+ ```bash
86
+ git clone https://github.com/roy-tong/Growovo.git && cd Growovo
87
+ python3 mkt.py demo # 零网络零账号,不到 1 秒过内核四步:lint→人审→写路径→账本
88
+ ```
89
+
90
+ 要连真实渠道(X / Gmail / GitHub 写)再装运行时,并初始化工作区:
91
+
92
+ ```bash
93
+ pip install -r requirements.txt # 仅 playwright;CDP 走系统 Chrome,无需下载浏览器
94
+ python3 mkt.py init # 建目录 + 报凭据缺口 + 打印下一步
95
+ python3 mkt.py doctor # 环境体检(--selftest 连跑全部离线单测)
96
+ ./launch.command # 双击亦可:首次复制登录 profile,启动 CDP 9222
97
+ python3 mkt.py check # 确认 CDP 会话与 X/Gmail 登录态
98
+ ```
99
+
100
+ ## 命令矩阵与验证等级
101
+
102
+ | 命令 | 说明 | 等级 |
103
+ |---|---|---|
104
+ | `python3 mkt.py status` | 全局账本聚合 | — |
105
+ | `python3 mkt.py check` | CDP 会话检查(X/Gmail/Reddit/LinkedIn) | — |
106
+ | `python3 mkt.py demo` | 零网络零账号演示(计划校验→人审闸门→写路径 dry-run→账本,沙盒可删) | — |
107
+ | `python3 mkt.py doctor [--selftest]` | 环境体检:内核导入/数据契约/凭据/CDP/暂停态 | — |
108
+ | `python3 mkt.py report [--hours 24] [--format md]` | 一页纸运营报告(异常/暂停态/抑制名单) | — |
109
+ | `python3 mkt.py init` | 工作区初始化:建目录/报凭据缺口/给下一步(`--workspace` 或 `MKT_HOME` 隔离多产品) | — |
110
+ | `python3 mkt.py next` | 状态机:现在该做什么、为什么 | — |
111
+ | `mkt plan new/lint/show/list/approve/revoke` | **计划与审批**:脚手架、校验、带署名的审批事件(署名 + 计划指纹 + 有效期) | — |
112
+ | `mkt queue lint <file>` / `mkt queue build` | **编辑期门禁**:占位符/重复/长度在写队列时拦;模板 + CSV 生成千人千面队列 | — |
113
+ | `mkt campaign show/report/next` | **Campaign 视图**:计划/人审/队列预检/账本/事件/实验/下一步 → 一页 Markdown | — |
114
+ | `mkt review <campaign>` | 人审预览:队列逐条过门禁 + 已有留证 + 批准与执行命令 | — |
115
+ | `mkt ledger resolve <ref> --result … --by … --note …` | **indeterminate 人工裁决**(append-only 覆盖,原账本行不改) | — |
116
+ | `mkt link create/list` | **追踪链接**:生成带 utm_campaign 的链接并落盘,供事件归位 | — |
117
+ | `mkt outcome import <csv>` / `mkt outcome sync` | **记账自动化**:CSV 导入(幂等)+ 账本聚合成 count 快照 | — |
118
+ | `mkt queue run <file> [--go]` | **全渠道队列执行**(email/hn/github/reddit/linkedin/x-reply),逐条走同一管道 | — |
119
+ | `mkt action <channel> <action> …` | 单条写动作(与队列同一套门禁/审批/账本);x message/engage 透传 vendor | — |
120
+ | `mkt collect serve/event/import` | **本地 collector**:`/t/<link>` 点击归因、`/events` webhook、Plausible/PostHog CSV | — |
121
+ | `mkt experiment obs --id X --from-outcomes` | 实验观察从事件台账自动聚合(不再手抄) | — |
122
+ | `python3 mkt.py pause --on '原因' / --off` | **全局暂停总闸**(一切写操作拒跑且留痕) | — |
123
+ | `python3 mkt.py contacts add/find/dnc/mark/import` | 线索库操作(幂等去重/DNC 隐藏/er-batch 导入) | — |
124
+ | `mkt x publish/reply/message/engage/search/inbox …` | X 全动作(vendor x-ops-automation) | **PROVEN** |
125
+ | `mkt email message --queue data/queues/w1.json [--go]` | SMTP 发信队列 | **PORTED** |
126
+ | `mkt email inbox` / `mkt email bounces` | CDP 只读扫 Gmail / 退信 | **PORTED**(模式 PROVEN) |
127
+ | `mkt reddit search --query "…"` | 只读搜索 | **UNVERIFIED** |
128
+ | `mkt reddit reply --url <帖> --text "…" [--go]` | 评论(回读校验管道) | **UNVERIFIED** |
129
+ | `mkt reddit publish --sub <版块> --title … --body-file … [--go]` | 发帖(日 ≤3) | **UNVERIFIED** |
130
+ | `mkt linkedin search --keywords "…"` | 只读搜人 | **UNVERIFIED** |
131
+ | `mkt linkedin message --url <profile> --note-file … [--go]` | 半自动连接请求(终端确认) | **UNVERIFIED** |
132
+ | `mkt github audit --repo owner/repo` | **仓库体检**(基础/社区健康/releases/贡献者集中度/AI-readiness/Scorecard) | **PROVEN** |
133
+ | `mkt github inbox --repo owner/repo` | open issues/PR 清单 + 零回复标记(48h 首响巡检) | **PROVEN** |
134
+ | `mkt github search --query "…"` | 仓库搜索(客群/对标发现) | **PROVEN** |
135
+ | `mkt github reply --repo o/r --number N --text "…" [--go]` | issue/PR 评论(api 通道写路径首例;需 `MKT_GITHUB_TOKEN`) | **UNVERIFIED** |
136
+ | `mkt playbook github-inbox --repo o/r --drafts drafts.json` | 收件箱分流→候选回复→标准队列(不发送;仍需审批/dry-run) | **PORTED** |
137
+ | `mkt hn search --query "…"` | HN 讨论/客群发现(Algolia 公共 API,匿名只读) | **PROVEN**(只读) |
138
+ | `mkt hn publish --title "Show HN: …" --url … [--go]` | submit 表单提交(CDP;日≤1,标题≤80;Show HN 限自有项目) | **UNVERIFIED** |
139
+ | `mkt hn reply --item item:N --text "…" [--go]` | 条目评论(首用=Show HN 首条作者评论,提交后 1h 内) | **UNVERIFIED** |
140
+ | `python3 mkt.py memory …` | 只读运营记忆:从已核验回执提取重复模式(见文末) | — |
141
+ | `python3 mkt.py workflow …` | 可复用配方:learn / approve / replay(默认 dry-run)/ runs / reconcile | — |
142
+ | `python3 mkt.py scorecard` | 记分卡:确认/未知/失败/证据率与业务结果计数(只读) | — |
143
+ | `python3 mkt.py optimize` | 优化建议(requires_human,不自动执行) | — |
144
+ | `python3 mkt.py schedule …` | 持久化排期:add / tick / status / resume | — |
145
+
146
+ 等级含义:PROVEN=真实账号跑通;PORTED=模式已验证、本封装未整跑;UNVERIFIED=选择器未实测,首跑必须人工盯跑(首跑清单见 03 渠道文档 §5)。
147
+
148
+ ## 规划层:计划是数据,人审是闸门(05 产品方案 §2)
149
+
150
+ ```bash
151
+ # 1. 生成计划脚手架(也可直接按 data/schemas.md 手写)
152
+ mkt plan new --id askovo-p0 --goal '拿到 20 个激活' --beachhead '独立 UX 研究者' \
153
+ --hypothesis '证据分级是购买动机' --channel email --wave-action message --size 10
154
+
155
+ # 2. 校验(schema/能力矩阵/size≤内核日预算/判据预注册)
156
+ mkt plan lint --id askovo-p0
157
+
158
+ # 3. 人审:必须署名;写审批事件 + 计划指纹(批准后再改计划会被指纹识别并拒跑)
159
+ mkt plan approve askovo-p0 --by roy --days 7
160
+
161
+ # 4. 队列:模板 + 目标 CSV 生成,或手写后用 lint 过门禁
162
+ mkt queue build --campaign askovo-p0-w1 --channel email --wave-action message \
163
+ --template assets/outreach.md --targets data/targets.csv
164
+ mkt queue lint data/queues/askovo-p0-w1.json
165
+
166
+ # 5. 人审预览 → 干跑 → 实跑
167
+ mkt review askovo-p0-w1
168
+ mkt email message --queue data/queues/askovo-p0-w1.json # dry-run
169
+ mkt email message --queue data/queues/askovo-p0-w1.json --go # 须已批准
170
+
171
+ # 6. 记账与复盘
172
+ mkt link create --campaign askovo-p0-w1 --channel hn --url https://example.com
173
+ mkt outcome import data/events.csv --campaign askovo-p0-w1
174
+ mkt outcome sync --campaign askovo-p0-w1
175
+ mkt campaign report askovo-p0-w1
176
+ ```
177
+
178
+ 计划指纹 = 计划内容(不含 review 块)的规范化 sha256;旧计划只有 `human_approved=true`
179
+ 时仍按 legacy 放行,新审批一律带指纹与有效期。
180
+
181
+ 上限是内核属性:计划里的 size 超过 `core/throttle.py` 日预算会被 lint 拒收。
182
+
183
+ ## MCP 服务(mcp_server.py,stdio,零依赖)
184
+
185
+ ```json
186
+ {"mkt": {"command": "python3", "args": ["/绝对路径/Growovo/mcp_server.py"]}}
187
+ ```
188
+
189
+ 10 个工具,全渠道读写:
190
+
191
+ - 读:`mkt_status` / `mkt_channels` / `mkt_plan_lint` / `mkt_search`(x/reddit/linkedin/hn/github)/ `mkt_ledger_query` / `mkt_campaign` / `mkt_inbox`(hn/github/email/x)/ `mkt_audit`(github)
192
+ - 写:`mkt_run_queue`(全渠道队列,默认 dry-run)/ `mkt_action`(单条动作,同一套门禁/审批/账本)
193
+
194
+ 写操作实跑一律要求已人审 plan;UNVERIFIED 渠道需 `allow_unverified=true`(人工首跑校准);adhoc 仅 CLI 人工通道,MCP 不开放。MCP 进程同样读 `MKT_HOME`,可与 CLI 用不同工作区。
195
+
196
+ ## Skill(skills/)
197
+
198
+ - `skills/growovo-gtm/SKILL.md`:**GTM 操作协议**——入口是增长目标(注册/激活/付费)而非单个渠道动作,按四引擎(定位→资产→投放→结果)拆解为七步:目标→plan→客群→人审→执行→复盘。装入 `~/.agents/skills/` 即可在 ZCode 等宿主触发(内容协作走 warm-email-outreach / expert-review-outreach / b2b-account-mapping)。
199
+ - `skills/github-project-ops/`:**GitHub 项目经营协议**(开源与闭源通用)——定位诊断(四象限+七阶段)→ 仓库体检清单 → 增长 playbook → 闭源经营模式库;含独立体检脚本 `scripts/repo_audit.py`(零依赖发行版)。与 CLI 的关系:skill 是协议与判断,`mkt github *` 是采数与执行。
200
+
201
+ ## 案例(docs/cases/)
202
+
203
+ 第一波案例来自 ovo 家族自身,每个案例都区分「平台动作」与「业务结果」,不为获客改写状态:
204
+
205
+ - [Askovo](docs/cases/askovo.md):首位 dogfood 客户(P0,进行中)——operator 275 分钟 / human 5 分钟跑完定造跑,D14 门禁 2026-11-14
206
+ - [Verovo](docs/cases/verovo.md):前置案例——一轮完整 GTM 的代价→默认值映射;Growovo 每条纪律都有出处
207
+ - [Growovo](docs/cases/growovo.md):自举——改名、双语 README、dogfood 回路,每次自我运营走自己的管道
208
+
209
+ ## 通道层(core/transports.py)
210
+
211
+ ACTIVE×4:`api`(OAuth,Reddit 二期)|`browser-cdp`(PROVEN)|`os-input`(macOS 键鼠/AX 模拟,UNVERIFIED,transports/os_input.py)|`protocol`(SMTP/IMAP,PROVEN)。
212
+ RESERVE×6(通道储备库):`webdriver`|`rss-public`(只读)|`esp-api`(事务邮件)|`mobile-appium`|`integration`(平台原生)|`semi-auto-ui`(人工确认兜底)。
213
+ 每渠道×动作声明首选+降级链;**降级用于"路不通",不用于"绕风控"**——风控信号的响应是降节奏或 `mkt pause`,不是换马甲。风控阈值与账号限额见项目 06 文档(官方口径亲核;代码预算一律低于官方上限,见 throttle.INTERVALS/OFFICIAL_LIMITS)。
214
+
215
+ ## 环境变量
216
+
217
+ | 变量 | 用途 |
218
+ |---|---|
219
+ | `MKT_CDP_URL` | CDP 端点(默认 http://127.0.0.1:9222) |
220
+ | `MKT_EMAIL_USER` / `MKT_EMAIL_APP_PASSWORD` | Gmail SMTP(App Password,绝不入库) |
221
+ | `MKT_LINKEDIN_AUTO=1` | 解锁 LinkedIn 全自动(不建议;默认半自动需终端确认) |
222
+ | `MKT_GITHUB_TOKEN` | GitHub PAT(仅写操作 reply 需要;读原语匿名可用,限额 60 次/时) |
223
+
224
+ ## 数据三件套(`data/`,gitignore)
225
+
226
+ - `queues/<campaign>.json` 队列;`ledger.jsonl` 全局账本;`contacts.jsonl` 线索库
227
+ - `suppress.txt` 抑制名单(每行一个目标);`shots/` 留证;`state/` 日预算状态
228
+ - schema 详见 `data/schemas.md`
229
+
230
+ ## 结构
231
+
232
+ ```
233
+ core/ ledger 账本(含人工裁决覆盖)· gates 门禁(含 DNC 合并)· throttle 原子日预算 · pipeline 写路径事务 · evidence 留证 · cdp 会话 · transports 通道注册表 · planlint 计划校验 · approval 审批事件/计划指纹 · queue 编辑期门禁 · campaign 视图/人审预览/下一步 · links 追踪链接 · outcome_io CSV 导入与账本聚合 · collector 本地 webhook/跳转 · action_runner 单条动作 · queue_runner 全渠道队列 · playbooks GitHub Inbox 分流/草稿队列 · workflows 配方学习/审批/重放 · locators 定位器阶梯 · scorecard 记分卡 · optimization 优化建议 · scheduler 持久化排期 · workspace 多产品隔离 · experiments 预注册实验 · attribution 事件/漏斗/归因 · demo 零账号演示 · doctor 环境体检
234
+ channels/ x/(vendor+adapter) · email_smtp · email_cdp · reddit · linkedin · github(api 通道首发) · hn(CDP 写 + Algolia 读)
235
+ transports/ os_input(macOS 键鼠/AX 模拟,UNVERIFIED)
236
+ skills/ growovo-gtm(GTM 操作协议)· github-project-ops(GitHub 项目经营协议+体检脚本)
237
+ tests/ 离线单测(118 项,含 449 事故回归、全渠道人审门禁/adhoc 放行、审批指纹与过期、预算原子预留、DNC/indeterminate 阻断、队列编辑期门禁、CSV 导入幂等、账本裁决覆盖、collector 跳转/事件鉴权、MCP stdout 洁净、GitHub Inbox Playbook 分流/草稿队列、漏斗身份归一与时序披露、价值事件核验、实验冻结与预注册防篡改、demo 闭环与 doctor 分级):python3 -m unittest discover tests -v
238
+ mcp_server.py MCP 外壳(stdio JSON-RPC,零依赖)
239
+ ```
240
+
241
+ X 渠道 vendor 引入 x-ops-automation(上游 github: roy-tong/x-ops-automation),
242
+ **不改写已验证代码**(见 `channels/x/vendor/PROVENANCE.md`);上游修选择器时同步。
243
+
244
+ ## License
245
+
246
+ MIT(见 [LICENSE](LICENSE))。`channels/x/vendor/` 引入自同作者仓库 x-ops-automation(MIT)。
247
+
248
+ ## 可复用工作流:一次学习,稳定重放
249
+
250
+ 同一类操作不必每次让模型重新探索页面。`workflow` 把步骤、定位器阶梯与回读条件固化成带指纹的配方;批准后才可 `--go`,每次运行都有逐步日志:
251
+
252
+ ```bash
253
+ python3 mkt.py workflow learn hn-reply --trace trace.json # 观察一次 → 草稿(不自动批准)
254
+ python3 mkt.py workflow approve hn-reply --by "operator" --days 30
255
+ python3 mkt.py workflow replay hn-reply --var item=123 --var text="…" # dry-run:只解析定位器
256
+ python3 mkt.py workflow replay hn-reply --cdp-url http://127.0.0.1:9222 … --go # 实跑
257
+ python3 mkt.py workflow runs
258
+ python3 mkt.py workflow reconcile --run <id> --outcome not_sent --note "已核对平台后台" --by "operator"
259
+ ```
260
+
261
+ 页面变化时按 `css → placeholder → label → role → text` 逐级恢复;视觉恢复需要操作者提供 provider,没有就停在 `visual_unavailable`,不猜点击位置。写入仍走统一门禁:`action` 步骤复用 `action_runner`,`commit` 点击检查暂停与日预算并写账本。详见[工作流](docs/workflows.md)。
262
+
263
+ ## 运营记分卡、排期与优化建议
264
+
265
+ 执行之后要看得见结果,也要能停下来。`scorecard` 把账本与业务事件分开统计:确认率、未知率、失败数与证据覆盖率,不把「发出去了」算成转化。
266
+
267
+ ```bash
268
+ python3 mkt.py scorecard --campaign my-campaign
269
+ python3 mkt.py optimize --campaign my-campaign # 人工决策建议,不自动执行
270
+ python3 mkt.py schedule add --id daily --queue data/queues/q1.json --interval 1440
271
+ python3 mkt.py schedule tick # 由 cron/launchd 或人手动触发
272
+ python3 mkt.py schedule resume --id daily --note "已核对未知回执"
273
+ ```
274
+
275
+ - 排期只跑「到点的一波」;全局暂停、未知结果、失败队列都会让它停下并标 `needs_review`;
276
+ - 进程中断后的 `running` 波次不会被自动重跑;
277
+ - `optimize` 的比较是描述性的:高确认率不等于渠道效果,建议全部 `requires_human: true`。
278
+
279
+ ## 运营记忆:从已核验的平台回执中学习
280
+
281
+ 在不暴露联系人明细、也不自动重放任何历史动作的前提下,检视重复出现的渠道/动作模式:
282
+
283
+ ```bash
284
+ python3 mkt.py memory --campaign my-campaign
285
+ python3 mkt.py memory --channel github --output data/operations-memory.json
286
+ ```
287
+
288
+ 摘要报告已确认的平台操作、未知/失败回执与**人审候选**;有意排除目标对象与消息正文。平台动作成功**不**等于客户激活,模式也永远不是重放许可:新的执行仍需新的授权、当期平台政策检查与标准执行门禁。这是工作流学习的只读输入:它给出模式与风险,真正可重放的配方在批准后由 `mkt workflow` 执行。见[能力进度与技术取舍](docs/feature-status.md)。
289
+
290
+ ## 参与
291
+
292
+ - 改动前先读 [CONTRIBUTING.md](CONTRIBUTING.md):里面是**不能破坏的执行不变量**(人审、dry-run、暂停、预算、抑制名单、回读校验、未知结果不重试)与 AI 贡献政策。
293
+ - 安全问题走 [SECURITY.md](SECURITY.md) 的私密通道,不要开公开 issue。
294
+ - issue/PR 首次响应目标 48 小时内;能力边界与验证等级以 [docs/feature-status.md](docs/feature-status.md) 为准。
295
+ - 案例(含失败与判死)在 [docs/cases/](docs/cases/README.md),不删改状态。
@@ -0,0 +1,251 @@
1
+ <p align="center">
2
+ <img src="docs/assets/logo.png" width="400" alt="Growovo">
3
+ </p>
4
+
5
+ <p align="center"><strong>把重复运营工作交给 Agent,留下可核验的执行记录。</strong><br>
6
+ <em>Execute authorized recurring operations with reviewable results.</em></p>
7
+
8
+ <p align="center"><strong>简体中文</strong> · <a href="README.en.md">English</a></p>
9
+
10
+ Growovo 面向维护产品社区、内容渠道和客户沟通的运营人员。输入工作目标、授权账号与任务清单,先预览和审核,再执行重复操作;每项动作记录成功、失败或待人工核实,支持暂停与后续处理。
11
+
12
+ 产品由 **Operator Engine(操作内核)** 和 **Playbooks(业务工作流)** 组成。当前可用的 GitHub Inbox Playbook 把问题列表分流并生成回复队列;内容、邮件和增长活动复用同一执行内核。CLI、MCP、Skill 共用审批、预算、回读和账本。发送成功只代表操作完成,注册、付费等业务结果单独记录。
13
+
14
+ [![tests](https://github.com/roy-tong/Growovo/actions/workflows/tests.yml/badge.svg)](https://github.com/roy-tong/Growovo/actions/workflows/tests.yml)
15
+
16
+ **先试一个结果:** `python3 mkt.py demo` 在本地完成计划校验、审批、dry-run 和账本演示,无需账号或网络。实际平台命令的验证等级见下表。[能力进度与技术取舍](docs/feature-status.md)。
17
+
18
+ > 为什么不自己写个脚本,或者用通用自动化平台?[对比页](docs/compare.md)(英文)逐项写了 Growovo 在哪输、在哪赢,并给出每条主张对应的仓库文件。
19
+
20
+ - **Askovo** 负责业务研究与验证,为任务提供依据。
21
+ - **Growovo** 执行授权运营任务,记录操作结果。
22
+ - **Verovo** 关联费用与业务结果,计算单任务经济性。
23
+
24
+ 三者可独立使用。`mkt.py` 与 `growovo-gtm` 标识保持兼容,GTM 是首批应用场景。
25
+
26
+ ## 合规与纪律(先读这个)
27
+
28
+ - 仅用于**本人拥有/运营的账号**;不碰他人账号、不做代运营自动化
29
+ - CDP 通道零凭据:不保存任何密码/token/Cookie;SMTP 凭据只走环境变量
30
+ - **一切写操作默认 dry-run,`--go` 才实跑**;实跑必须绑定**已人审 plan**——无 plan 管辖默认拒跑,仅 CLI 人工通道 `--adhoc` 显式放行(账本记 adhoc=true;MCP 不开放)
31
+ - 日预算在发送前原子预留;`indeterminate`(未知结果)不可自动重发,必须人工 `ledger resolve`;contacts 的 DNC/bounced 身份与 `suppress.txt` 合并为同一发送抑制源
32
+ - 失败即停(不重试轰炸);回读校验不一致绝不发送(449 空正文事故的固化)
33
+ - 人类节奏:随机间隔 + 单次硬上限 + 日预算(core/throttle.py 的表)
34
+ - 不群发:千人千面内容为前提;占位符残留会被门禁直接拒绝
35
+ - 不做对抗:不绕验证码、不伪造指纹、不用代理池
36
+
37
+ ## 安装与启动
38
+
39
+ **先拿一个结果,再装环境。** 克隆后不需要任何依赖、任何账号:
40
+
41
+ ```bash
42
+ git clone https://github.com/roy-tong/Growovo.git && cd Growovo
43
+ python3 mkt.py demo # 零网络零账号,不到 1 秒过内核四步:lint→人审→写路径→账本
44
+ ```
45
+
46
+ 要连真实渠道(X / Gmail / GitHub 写)再装运行时,并初始化工作区:
47
+
48
+ ```bash
49
+ pip install -r requirements.txt # 仅 playwright;CDP 走系统 Chrome,无需下载浏览器
50
+ python3 mkt.py init # 建目录 + 报凭据缺口 + 打印下一步
51
+ python3 mkt.py doctor # 环境体检(--selftest 连跑全部离线单测)
52
+ ./launch.command # 双击亦可:首次复制登录 profile,启动 CDP 9222
53
+ python3 mkt.py check # 确认 CDP 会话与 X/Gmail 登录态
54
+ ```
55
+
56
+ ## 命令矩阵与验证等级
57
+
58
+ | 命令 | 说明 | 等级 |
59
+ |---|---|---|
60
+ | `python3 mkt.py status` | 全局账本聚合 | — |
61
+ | `python3 mkt.py check` | CDP 会话检查(X/Gmail/Reddit/LinkedIn) | — |
62
+ | `python3 mkt.py demo` | 零网络零账号演示(计划校验→人审闸门→写路径 dry-run→账本,沙盒可删) | — |
63
+ | `python3 mkt.py doctor [--selftest]` | 环境体检:内核导入/数据契约/凭据/CDP/暂停态 | — |
64
+ | `python3 mkt.py report [--hours 24] [--format md]` | 一页纸运营报告(异常/暂停态/抑制名单) | — |
65
+ | `python3 mkt.py init` | 工作区初始化:建目录/报凭据缺口/给下一步(`--workspace` 或 `MKT_HOME` 隔离多产品) | — |
66
+ | `python3 mkt.py next` | 状态机:现在该做什么、为什么 | — |
67
+ | `mkt plan new/lint/show/list/approve/revoke` | **计划与审批**:脚手架、校验、带署名的审批事件(署名 + 计划指纹 + 有效期) | — |
68
+ | `mkt queue lint <file>` / `mkt queue build` | **编辑期门禁**:占位符/重复/长度在写队列时拦;模板 + CSV 生成千人千面队列 | — |
69
+ | `mkt campaign show/report/next` | **Campaign 视图**:计划/人审/队列预检/账本/事件/实验/下一步 → 一页 Markdown | — |
70
+ | `mkt review <campaign>` | 人审预览:队列逐条过门禁 + 已有留证 + 批准与执行命令 | — |
71
+ | `mkt ledger resolve <ref> --result … --by … --note …` | **indeterminate 人工裁决**(append-only 覆盖,原账本行不改) | — |
72
+ | `mkt link create/list` | **追踪链接**:生成带 utm_campaign 的链接并落盘,供事件归位 | — |
73
+ | `mkt outcome import <csv>` / `mkt outcome sync` | **记账自动化**:CSV 导入(幂等)+ 账本聚合成 count 快照 | — |
74
+ | `mkt queue run <file> [--go]` | **全渠道队列执行**(email/hn/github/reddit/linkedin/x-reply),逐条走同一管道 | — |
75
+ | `mkt action <channel> <action> …` | 单条写动作(与队列同一套门禁/审批/账本);x message/engage 透传 vendor | — |
76
+ | `mkt collect serve/event/import` | **本地 collector**:`/t/<link>` 点击归因、`/events` webhook、Plausible/PostHog CSV | — |
77
+ | `mkt experiment obs --id X --from-outcomes` | 实验观察从事件台账自动聚合(不再手抄) | — |
78
+ | `python3 mkt.py pause --on '原因' / --off` | **全局暂停总闸**(一切写操作拒跑且留痕) | — |
79
+ | `python3 mkt.py contacts add/find/dnc/mark/import` | 线索库操作(幂等去重/DNC 隐藏/er-batch 导入) | — |
80
+ | `mkt x publish/reply/message/engage/search/inbox …` | X 全动作(vendor x-ops-automation) | **PROVEN** |
81
+ | `mkt email message --queue data/queues/w1.json [--go]` | SMTP 发信队列 | **PORTED** |
82
+ | `mkt email inbox` / `mkt email bounces` | CDP 只读扫 Gmail / 退信 | **PORTED**(模式 PROVEN) |
83
+ | `mkt reddit search --query "…"` | 只读搜索 | **UNVERIFIED** |
84
+ | `mkt reddit reply --url <帖> --text "…" [--go]` | 评论(回读校验管道) | **UNVERIFIED** |
85
+ | `mkt reddit publish --sub <版块> --title … --body-file … [--go]` | 发帖(日 ≤3) | **UNVERIFIED** |
86
+ | `mkt linkedin search --keywords "…"` | 只读搜人 | **UNVERIFIED** |
87
+ | `mkt linkedin message --url <profile> --note-file … [--go]` | 半自动连接请求(终端确认) | **UNVERIFIED** |
88
+ | `mkt github audit --repo owner/repo` | **仓库体检**(基础/社区健康/releases/贡献者集中度/AI-readiness/Scorecard) | **PROVEN** |
89
+ | `mkt github inbox --repo owner/repo` | open issues/PR 清单 + 零回复标记(48h 首响巡检) | **PROVEN** |
90
+ | `mkt github search --query "…"` | 仓库搜索(客群/对标发现) | **PROVEN** |
91
+ | `mkt github reply --repo o/r --number N --text "…" [--go]` | issue/PR 评论(api 通道写路径首例;需 `MKT_GITHUB_TOKEN`) | **UNVERIFIED** |
92
+ | `mkt playbook github-inbox --repo o/r --drafts drafts.json` | 收件箱分流→候选回复→标准队列(不发送;仍需审批/dry-run) | **PORTED** |
93
+ | `mkt hn search --query "…"` | HN 讨论/客群发现(Algolia 公共 API,匿名只读) | **PROVEN**(只读) |
94
+ | `mkt hn publish --title "Show HN: …" --url … [--go]` | submit 表单提交(CDP;日≤1,标题≤80;Show HN 限自有项目) | **UNVERIFIED** |
95
+ | `mkt hn reply --item item:N --text "…" [--go]` | 条目评论(首用=Show HN 首条作者评论,提交后 1h 内) | **UNVERIFIED** |
96
+ | `python3 mkt.py memory …` | 只读运营记忆:从已核验回执提取重复模式(见文末) | — |
97
+ | `python3 mkt.py workflow …` | 可复用配方:learn / approve / replay(默认 dry-run)/ runs / reconcile | — |
98
+ | `python3 mkt.py scorecard` | 记分卡:确认/未知/失败/证据率与业务结果计数(只读) | — |
99
+ | `python3 mkt.py optimize` | 优化建议(requires_human,不自动执行) | — |
100
+ | `python3 mkt.py schedule …` | 持久化排期:add / tick / status / resume | — |
101
+
102
+ 等级含义:PROVEN=真实账号跑通;PORTED=模式已验证、本封装未整跑;UNVERIFIED=选择器未实测,首跑必须人工盯跑(首跑清单见 03 渠道文档 §5)。
103
+
104
+ ## 规划层:计划是数据,人审是闸门(05 产品方案 §2)
105
+
106
+ ```bash
107
+ # 1. 生成计划脚手架(也可直接按 data/schemas.md 手写)
108
+ mkt plan new --id askovo-p0 --goal '拿到 20 个激活' --beachhead '独立 UX 研究者' \
109
+ --hypothesis '证据分级是购买动机' --channel email --wave-action message --size 10
110
+
111
+ # 2. 校验(schema/能力矩阵/size≤内核日预算/判据预注册)
112
+ mkt plan lint --id askovo-p0
113
+
114
+ # 3. 人审:必须署名;写审批事件 + 计划指纹(批准后再改计划会被指纹识别并拒跑)
115
+ mkt plan approve askovo-p0 --by roy --days 7
116
+
117
+ # 4. 队列:模板 + 目标 CSV 生成,或手写后用 lint 过门禁
118
+ mkt queue build --campaign askovo-p0-w1 --channel email --wave-action message \
119
+ --template assets/outreach.md --targets data/targets.csv
120
+ mkt queue lint data/queues/askovo-p0-w1.json
121
+
122
+ # 5. 人审预览 → 干跑 → 实跑
123
+ mkt review askovo-p0-w1
124
+ mkt email message --queue data/queues/askovo-p0-w1.json # dry-run
125
+ mkt email message --queue data/queues/askovo-p0-w1.json --go # 须已批准
126
+
127
+ # 6. 记账与复盘
128
+ mkt link create --campaign askovo-p0-w1 --channel hn --url https://example.com
129
+ mkt outcome import data/events.csv --campaign askovo-p0-w1
130
+ mkt outcome sync --campaign askovo-p0-w1
131
+ mkt campaign report askovo-p0-w1
132
+ ```
133
+
134
+ 计划指纹 = 计划内容(不含 review 块)的规范化 sha256;旧计划只有 `human_approved=true`
135
+ 时仍按 legacy 放行,新审批一律带指纹与有效期。
136
+
137
+ 上限是内核属性:计划里的 size 超过 `core/throttle.py` 日预算会被 lint 拒收。
138
+
139
+ ## MCP 服务(mcp_server.py,stdio,零依赖)
140
+
141
+ ```json
142
+ {"mkt": {"command": "python3", "args": ["/绝对路径/Growovo/mcp_server.py"]}}
143
+ ```
144
+
145
+ 10 个工具,全渠道读写:
146
+
147
+ - 读:`mkt_status` / `mkt_channels` / `mkt_plan_lint` / `mkt_search`(x/reddit/linkedin/hn/github)/ `mkt_ledger_query` / `mkt_campaign` / `mkt_inbox`(hn/github/email/x)/ `mkt_audit`(github)
148
+ - 写:`mkt_run_queue`(全渠道队列,默认 dry-run)/ `mkt_action`(单条动作,同一套门禁/审批/账本)
149
+
150
+ 写操作实跑一律要求已人审 plan;UNVERIFIED 渠道需 `allow_unverified=true`(人工首跑校准);adhoc 仅 CLI 人工通道,MCP 不开放。MCP 进程同样读 `MKT_HOME`,可与 CLI 用不同工作区。
151
+
152
+ ## Skill(skills/)
153
+
154
+ - `skills/growovo-gtm/SKILL.md`:**GTM 操作协议**——入口是增长目标(注册/激活/付费)而非单个渠道动作,按四引擎(定位→资产→投放→结果)拆解为七步:目标→plan→客群→人审→执行→复盘。装入 `~/.agents/skills/` 即可在 ZCode 等宿主触发(内容协作走 warm-email-outreach / expert-review-outreach / b2b-account-mapping)。
155
+ - `skills/github-project-ops/`:**GitHub 项目经营协议**(开源与闭源通用)——定位诊断(四象限+七阶段)→ 仓库体检清单 → 增长 playbook → 闭源经营模式库;含独立体检脚本 `scripts/repo_audit.py`(零依赖发行版)。与 CLI 的关系:skill 是协议与判断,`mkt github *` 是采数与执行。
156
+
157
+ ## 案例(docs/cases/)
158
+
159
+ 第一波案例来自 ovo 家族自身,每个案例都区分「平台动作」与「业务结果」,不为获客改写状态:
160
+
161
+ - [Askovo](docs/cases/askovo.md):首位 dogfood 客户(P0,进行中)——operator 275 分钟 / human 5 分钟跑完定造跑,D14 门禁 2026-11-14
162
+ - [Verovo](docs/cases/verovo.md):前置案例——一轮完整 GTM 的代价→默认值映射;Growovo 每条纪律都有出处
163
+ - [Growovo](docs/cases/growovo.md):自举——改名、双语 README、dogfood 回路,每次自我运营走自己的管道
164
+
165
+ ## 通道层(core/transports.py)
166
+
167
+ ACTIVE×4:`api`(OAuth,Reddit 二期)|`browser-cdp`(PROVEN)|`os-input`(macOS 键鼠/AX 模拟,UNVERIFIED,transports/os_input.py)|`protocol`(SMTP/IMAP,PROVEN)。
168
+ RESERVE×6(通道储备库):`webdriver`|`rss-public`(只读)|`esp-api`(事务邮件)|`mobile-appium`|`integration`(平台原生)|`semi-auto-ui`(人工确认兜底)。
169
+ 每渠道×动作声明首选+降级链;**降级用于"路不通",不用于"绕风控"**——风控信号的响应是降节奏或 `mkt pause`,不是换马甲。风控阈值与账号限额见项目 06 文档(官方口径亲核;代码预算一律低于官方上限,见 throttle.INTERVALS/OFFICIAL_LIMITS)。
170
+
171
+ ## 环境变量
172
+
173
+ | 变量 | 用途 |
174
+ |---|---|
175
+ | `MKT_CDP_URL` | CDP 端点(默认 http://127.0.0.1:9222) |
176
+ | `MKT_EMAIL_USER` / `MKT_EMAIL_APP_PASSWORD` | Gmail SMTP(App Password,绝不入库) |
177
+ | `MKT_LINKEDIN_AUTO=1` | 解锁 LinkedIn 全自动(不建议;默认半自动需终端确认) |
178
+ | `MKT_GITHUB_TOKEN` | GitHub PAT(仅写操作 reply 需要;读原语匿名可用,限额 60 次/时) |
179
+
180
+ ## 数据三件套(`data/`,gitignore)
181
+
182
+ - `queues/<campaign>.json` 队列;`ledger.jsonl` 全局账本;`contacts.jsonl` 线索库
183
+ - `suppress.txt` 抑制名单(每行一个目标);`shots/` 留证;`state/` 日预算状态
184
+ - schema 详见 `data/schemas.md`
185
+
186
+ ## 结构
187
+
188
+ ```
189
+ core/ ledger 账本(含人工裁决覆盖)· gates 门禁(含 DNC 合并)· throttle 原子日预算 · pipeline 写路径事务 · evidence 留证 · cdp 会话 · transports 通道注册表 · planlint 计划校验 · approval 审批事件/计划指纹 · queue 编辑期门禁 · campaign 视图/人审预览/下一步 · links 追踪链接 · outcome_io CSV 导入与账本聚合 · collector 本地 webhook/跳转 · action_runner 单条动作 · queue_runner 全渠道队列 · playbooks GitHub Inbox 分流/草稿队列 · workflows 配方学习/审批/重放 · locators 定位器阶梯 · scorecard 记分卡 · optimization 优化建议 · scheduler 持久化排期 · workspace 多产品隔离 · experiments 预注册实验 · attribution 事件/漏斗/归因 · demo 零账号演示 · doctor 环境体检
190
+ channels/ x/(vendor+adapter) · email_smtp · email_cdp · reddit · linkedin · github(api 通道首发) · hn(CDP 写 + Algolia 读)
191
+ transports/ os_input(macOS 键鼠/AX 模拟,UNVERIFIED)
192
+ skills/ growovo-gtm(GTM 操作协议)· github-project-ops(GitHub 项目经营协议+体检脚本)
193
+ tests/ 离线单测(118 项,含 449 事故回归、全渠道人审门禁/adhoc 放行、审批指纹与过期、预算原子预留、DNC/indeterminate 阻断、队列编辑期门禁、CSV 导入幂等、账本裁决覆盖、collector 跳转/事件鉴权、MCP stdout 洁净、GitHub Inbox Playbook 分流/草稿队列、漏斗身份归一与时序披露、价值事件核验、实验冻结与预注册防篡改、demo 闭环与 doctor 分级):python3 -m unittest discover tests -v
194
+ mcp_server.py MCP 外壳(stdio JSON-RPC,零依赖)
195
+ ```
196
+
197
+ X 渠道 vendor 引入 x-ops-automation(上游 github: roy-tong/x-ops-automation),
198
+ **不改写已验证代码**(见 `channels/x/vendor/PROVENANCE.md`);上游修选择器时同步。
199
+
200
+ ## License
201
+
202
+ MIT(见 [LICENSE](LICENSE))。`channels/x/vendor/` 引入自同作者仓库 x-ops-automation(MIT)。
203
+
204
+ ## 可复用工作流:一次学习,稳定重放
205
+
206
+ 同一类操作不必每次让模型重新探索页面。`workflow` 把步骤、定位器阶梯与回读条件固化成带指纹的配方;批准后才可 `--go`,每次运行都有逐步日志:
207
+
208
+ ```bash
209
+ python3 mkt.py workflow learn hn-reply --trace trace.json # 观察一次 → 草稿(不自动批准)
210
+ python3 mkt.py workflow approve hn-reply --by "operator" --days 30
211
+ python3 mkt.py workflow replay hn-reply --var item=123 --var text="…" # dry-run:只解析定位器
212
+ python3 mkt.py workflow replay hn-reply --cdp-url http://127.0.0.1:9222 … --go # 实跑
213
+ python3 mkt.py workflow runs
214
+ python3 mkt.py workflow reconcile --run <id> --outcome not_sent --note "已核对平台后台" --by "operator"
215
+ ```
216
+
217
+ 页面变化时按 `css → placeholder → label → role → text` 逐级恢复;视觉恢复需要操作者提供 provider,没有就停在 `visual_unavailable`,不猜点击位置。写入仍走统一门禁:`action` 步骤复用 `action_runner`,`commit` 点击检查暂停与日预算并写账本。详见[工作流](docs/workflows.md)。
218
+
219
+ ## 运营记分卡、排期与优化建议
220
+
221
+ 执行之后要看得见结果,也要能停下来。`scorecard` 把账本与业务事件分开统计:确认率、未知率、失败数与证据覆盖率,不把「发出去了」算成转化。
222
+
223
+ ```bash
224
+ python3 mkt.py scorecard --campaign my-campaign
225
+ python3 mkt.py optimize --campaign my-campaign # 人工决策建议,不自动执行
226
+ python3 mkt.py schedule add --id daily --queue data/queues/q1.json --interval 1440
227
+ python3 mkt.py schedule tick # 由 cron/launchd 或人手动触发
228
+ python3 mkt.py schedule resume --id daily --note "已核对未知回执"
229
+ ```
230
+
231
+ - 排期只跑「到点的一波」;全局暂停、未知结果、失败队列都会让它停下并标 `needs_review`;
232
+ - 进程中断后的 `running` 波次不会被自动重跑;
233
+ - `optimize` 的比较是描述性的:高确认率不等于渠道效果,建议全部 `requires_human: true`。
234
+
235
+ ## 运营记忆:从已核验的平台回执中学习
236
+
237
+ 在不暴露联系人明细、也不自动重放任何历史动作的前提下,检视重复出现的渠道/动作模式:
238
+
239
+ ```bash
240
+ python3 mkt.py memory --campaign my-campaign
241
+ python3 mkt.py memory --channel github --output data/operations-memory.json
242
+ ```
243
+
244
+ 摘要报告已确认的平台操作、未知/失败回执与**人审候选**;有意排除目标对象与消息正文。平台动作成功**不**等于客户激活,模式也永远不是重放许可:新的执行仍需新的授权、当期平台政策检查与标准执行门禁。这是工作流学习的只读输入:它给出模式与风险,真正可重放的配方在批准后由 `mkt workflow` 执行。见[能力进度与技术取舍](docs/feature-status.md)。
245
+
246
+ ## 参与
247
+
248
+ - 改动前先读 [CONTRIBUTING.md](CONTRIBUTING.md):里面是**不能破坏的执行不变量**(人审、dry-run、暂停、预算、抑制名单、回读校验、未知结果不重试)与 AI 贡献政策。
249
+ - 安全问题走 [SECURITY.md](SECURITY.md) 的私密通道,不要开公开 issue。
250
+ - issue/PR 首次响应目标 48 小时内;能力边界与验证等级以 [docs/feature-status.md](docs/feature-status.md) 为准。
251
+ - 案例(含失败与判死)在 [docs/cases/](docs/cases/README.md),不删改状态。
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env python3
2
+ """渠道注册表 —— 能力声明(架构文档 §2.3)。
3
+
4
+ status 三级(02 §6.2,诚实交付):
5
+ PROVEN 在真实账号跑通过(或模式来源已跑通且未改动逻辑)
6
+ PORTED 模式已验证、框架化封装后未整跑(首跑清单见 03 文档 §5)
7
+ UNVERIFIED 选择器/流程按公开 UI 编写,未实测;强制 dry-run 门槛
8
+ """
9
+ REGISTRY = {
10
+ "x": {
11
+ "status": "PROVEN",
12
+ "note": "vendor 引入 x-ops-automation,选择器与纪律为真实账号实测",
13
+ "actions": {"publish", "reply", "message", "engage", "search", "inbox"},
14
+ "transports": {"cdp"},
15
+ },
16
+ "email": {
17
+ "status": "PORTED",
18
+ "note": "SMTP 写(newoutreach 模式)+ CDP 读(scan_inbox 模式);封装后未整跑",
19
+ "actions": {"publish", "reply", "message", "inbox"},
20
+ "transports": {"smtp", "cdp"},
21
+ },
22
+ "reddit": {
23
+ "status": "UNVERIFIED",
24
+ "note": "old.reddit 选择器未实测;engage 禁用;publish 日≤3",
25
+ "actions": {"publish", "reply", "message", "search", "inbox"},
26
+ "transports": {"cdp", "api"},
27
+ },
28
+ "linkedin": {
29
+ "status": "UNVERIFIED",
30
+ "note": "Tier B 半自动;全自动默认锁死(MKT_LINKEDIN_AUTO=1 才解锁)",
31
+ "actions": {"publish", "reply", "message", "search", "inbox"},
32
+ "transports": {"cdp"},
33
+ },
34
+ "github": {
35
+ # 安全语义按写原语取级(MCP 实跑门禁用);读原语已在真实仓库实测
36
+ "status": "UNVERIFIED",
37
+ "note": "api 通道首发渠道;读原语 audit/search/inbox PROVEN(2026-10-12 实测);"
38
+ "reply 走统一写路径,首跑需人工盯 + 复核公开可见;凭据走 MKT_GITHUB_TOKEN",
39
+ "actions": {"reply", "search", "inbox", "audit"},
40
+ "transports": {"api"},
41
+ },
42
+ "hn": {
43
+ # 安全语义按写原语取级;读原语 search 已于 2026-10-14 实测(Algolia 匿名只读)
44
+ "status": "UNVERIFIED",
45
+ "note": "发布走 CDP submit 表单(showhn-pack SOP),搜索走 Algolia 公共 API"
46
+ "(匿名只读,2026-10-14 实测);publish 日≤1(Show HN 稀缺纪律),"
47
+ "标题 ≤80 字符;engage/message 不实现(无 DM、投票操纵红线同 Reddit)",
48
+ "actions": {"publish", "reply", "search", "inbox"},
49
+ "transports": {"cdp", "api"},
50
+ },
51
+ }