| name | backlink-publisher |
| description | 根据本地外链 JSON 队列或批次队列,把当前项目发布到免费外链、目录、startup listing、AI tools 和 gallery 平台。用于需要 Codex 使用 @chrome 操作用户已登录的 Chrome、读取项目资料夹、按单个 JSON 或 30 条左右的 batch JSON 逐组处理、通过 subagent 调用 $humanizer 生成自然文案、填写平台提交表单、直接提交免费 listing 并更新队列状态的任务。 |
外链发布器
概览
从单个 JSON 队列读取外链平台任务,把当前项目提交到免费外链平台。执行时使用 Chrome 插件操作浏览器,用本地项目资料夹作为事实来源,任何需要生成的 listing 文案都必须交给 fresh subagent 处理。
当候选外链很多时,优先使用批次 JSON 逐组运行。推荐每个 batch 控制在 30 条左右,并把可执行 batch 放在 data/backlinks/batches/,例如 data/backlinks/batches/batch-001.json。默认通过 data/backlinks/foreign-backlinks-batches-manifest.json 选择要运行的 batch;manifest 只用于记录批次顺序和数量,不是队列文件,不能直接传给发布流程。
必需输入
- 批次 manifest。默认路径:
data/backlinks/foreign-backlinks-batches-manifest.json,用于选择要运行的 batch;实际运行时必须读取其中某一个 batch JSON。
- 外链队列 JSON。默认使用 manifest 指向的批次 JSON,例如
data/backlinks/batches/batch-001.json。旧单文件队列 data/backlinks/free-backlinks.json 只作为兼容入口:只有用户明确指定,或没有可用 manifest 时才使用。
- 项目资料夹,里面必须有
profile.md 和 metadata.json,格式兼容 project-profile-capture 的输出。
- 公开提交信息文件。默认路径:
public-submission-info.md,用于保存允许公开使用的邮箱、联系人姓名、公司所在地、成立时间等信息。
- Chrome 中已经登录用户的 Google 账号。
- 团队人数默认为 1,除非用户明确指定
如果当前项目里有多个项目资料夹,并且用户没有指定目标项目,先询问用户使用哪一个。如果没有可用项目资料夹,停止并让用户先用 project-profile-capture 创建。
如果 public-submission-info.md 不存在,先创建模板并询问用户补充公开提交信息。如果文件存在但必填字段为空,第一时间询问用户补齐后再开始处理外链队列。不要从 Chrome、Google 账号或项目文案里推断私人联系信息。
参考文件
- 修改或更新队列前,先读
references/backlinks-json-schema.md。
- 使用 Chrome 或提交 listing 前,先读
references/chrome-workflow.md。
- 请求生成文案前,先读
references/content-subagent-prompt.md。
- 判断错误后是否继续前,先读
references/failure-policy.md。
工作流程
- 确定本轮队列 JSON:
- 如果用户指定了具体 JSON 文件,使用该文件。
- 不要把
batch-*-submitted.json 当作执行队列;这类文件只是已提交结果导出。
- 如果用户只指定 manifest,或没有指定 JSON 但默认 manifest 存在,先读取 manifest。用户指定了 batch 编号时使用对应 batch;没有指定时,按 manifest 顺序打开
batches[].file,选择第一个实际包含 status: "pending" 队列项的 batch,并在开始前报告 batch 编号和待处理条目数。不要只依赖 manifest 里的 status 字段。
- 如果没有可用 manifest,再回退到
data/backlinks/free-backlinks.json。
- 不要把 manifest 当作外链队列传给发布流程。
- 校验本轮外链 JSON:
python3 skills/backlink-publisher/scripts/validate_backlinks_json.py <queue-json-path>
- 读取并检查
public-submission-info.md。缺少必填公开信息时,先询问用户补齐:
- 读取所选项目资料夹中的
profile.md 和 metadata.json。
- 默认只处理当前队列 JSON 内
status: "pending" 的队列项,除非用户明确要求重试其他状态。
- 每处理一个队列项,先把该项状态设为
in_progress。
- 所有浏览器操作都使用
@chrome。不要改用其他浏览器后端。
- 打开平台 URL,寻找 submit、add、list、post、suggest 或类似入口。
- 如果平台出现 Google 账号选择器,默认选择第一个可见的个人 Google 账号继续。如果无法判断是否为个人账号、要求额外敏感权限或没有 Google 登录选项,按失败处理规则更新当前队列项,然后停止本轮任务让用户接手。
- 如果表单需要生成文案,按
references/content-subagent-prompt.md 启动 fresh subagent。
- 使用项目资料、公开提交信息、生成文案、项目 URL、logo 和截图填写表单;能从资料中确定的必填和可选字段都尽可能帮用户填完整,不要只填最低必填字段。
- 如果表单出现验证码或机器人验证,不要立刻停止。先把项目资料和公开提交信息能够确定的所有必填、可选字段全部填好;需要图片时默认上传当前项目资料夹中的
screenshot.png,只有平台明确要求 logo 时才改用 logo.png。然后按用户授权尽可能完成验证。验证码不可读、无法自动完成、需要外部设备/账号确认或需要用户人工判断时,才设为 needs_user,保留已经填好的表单标签页,让用户只需完成验证并提交。
- 免费 listing 表单的必填字段填完后直接提交。用户明确补充授权:“下次你填写完毕内容就自己提交”;因此不要在字段已填完、且没有新的 CAPTCHA / 付费 / 权限 / 私密信息等停止条件时停下来等用户点击最终提交。
- 页面出现成功状态、成功提示或可用 listing URL 后,把该项标记为
submitted,并把 result_url 设为 listing URL 或当前页面 URL。
- 如果当前平台不符合项目要求,例如只收 boilerplate、template、deal、特定集成或其他与当前项目事实不匹配的 listing,把该项标记为
skipped,写入 last_attempt_at 和简短 error,然后继续处理当前 batch 的下一个 pending 队列项。
- 如果当前平台无法继续提交且需要用户接手或属于真正失败,把该项标记为
needs_user 或 failed,把原因写入 error。只有 needs_user 或 failed 触发停止;如果页面可由用户接手,保留当前 Chrome 标签页。
- 只有当前 batch 没有触发停止条件且全部处理完后,才报告本批提交、跳过、失败和需要用户处理的数量;除非用户明确要求继续,不要自动进入下一个 batch。
状态更新规则
更新 JSON 队列时:
- 保持队列项顺序不变。
- 保留未来可能新增的未知字段。
- 除非用户要求批量更新,只修改当前正在处理的队列项。
- 如果本轮输入是 batch JSON,状态写回该 batch 文件;不要把状态写回完整候选池或正式队列,除非用户明确指定。
- manifest 只作为批次索引;如果本轮是通过 manifest 选中的 batch,处理结束后同步对应 batch 的
item_count、first_id、last_id 和 status。没有 pending / in_progress 项时,把 manifest 中该 batch 标记为 processed;仍有待处理项时保持或设为 pending。
last_attempt_at 使用 ISO 8601 时间戳。
- 提交成功时保持
error: null。
- 如果平台定位、分类或硬性要求与当前项目事实不匹配,设为
status: "skipped",写入 last_attempt_at 和简短 error,然后继续当前 batch 的下一个 pending 项。
- 运行中把当前项设为
skipped 后,不要停止本轮任务;继续处理当前 batch 的下一个 pending 项。
- 只有验证码无法代填或需要用户人工处理时,才把当前项设为
needs_user;设置前必须先填完所有可由项目资料和公开提交信息确定的字段,并默认上传当前项目的 screenshot.png。如果验证码已完成,继续提交当前表单。
停止规则
如果页面要求付费、浏览器权限、私密个人信息、用户未授权的非 Google 登录,或任何超出免费公开项目 listing 提交范围的动作,立即停止本轮任务并报告给用户。通过 Google 登录或继续创建免费 listing 账号是允许的,但只能使用第一个可见的个人 Google 账号,且不能授权敏感权限。
验证码不是默认停止条件。遇到 CAPTCHA、验证码或机器人验证时,先填完所有可确定的表单字段并默认上传项目 screenshot.png,再尽可能帮用户完成验证;只有无法自动完成、不可读、需要外部设备/账号确认或需要用户人工判断时,才停止并设为 needs_user。保留的页面必须处于“用户只需完成验证码/人机验证并提交”的状态,不能留下仍可由项目资料补齐的空字段。
平台不符合当前项目要求但不需要用户接手时,设为 skipped,写入 last_attempt_at 和简短 error,然后继续当前 batch 的下一个 pending 项。
停止时必须更新当前队列项:用户可以在 Chrome 中解决或继续流程的,设为 needs_user;平台明显不可提交且不是项目不匹配跳过场景的,设为 failed。两种状态都要写入 last_attempt_at 和简短 error。如果页面可由用户接手,保留当前 Chrome 标签页,不要清理或继续下一个 pending 项,直到用户明确要求继续、跳过或已处理。