From 3b38deb0785aaa83feadb5b2b23f198eb18cf7ab Mon Sep 17 00:00:00 2001 From: John Qiu Date: Sat, 22 Aug 2026 08:15:02 +0930 Subject: [PATCH] chore(marketplace): add slark-cicd-plugin --- .claude-plugin/marketplace.json | 13 ++ generate-marketplace.py | 2 +- .../.claude-plugin/plugin.json | 11 + skills-dev/slark-cicd-plugin/skills/SKILL.md | 201 ++++++++++++++++++ 4 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 skills-dev/slark-cicd-plugin/.claude-plugin/plugin.json create mode 100644 skills-dev/slark-cicd-plugin/skills/SKILL.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index b9f9afb..3d92fbb 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -401,6 +401,19 @@ ], "strict": false }, + { + "name": "slark-cicd-plugin", + "source": "./skills-dev/slark-cicd-plugin", + "description": "Slark 仓库 staging、生产与 Desktop 安装包的端到端 CI/CD 发布技能。", + "version": "1.0.0", + "category": "devops", + "keywords": [ + "devops", + "deployment", + "operations" + ], + "strict": false + }, { "name": "req-audit-plugin", "source": "./skills-req/req-audit-plugin", diff --git a/generate-marketplace.py b/generate-marketplace.py index 762e7a1..e38e1ce 100644 --- a/generate-marketplace.py +++ b/generate-marketplace.py @@ -60,7 +60,7 @@ def load_config(): def get_category_and_keywords(plugin_name): if any(x in plugin_name for x in ['dev-', 'coding', 'frontend']): return "development", ["development", "coding", "workflow"] - elif any(x in plugin_name for x in ['ops-', 'deploy', 'server']): + elif any(x in plugin_name for x in ['ops-', 'deploy', 'server', 'slark-cicd']): return "devops", ["devops", "deployment", "operations"] elif any(x in plugin_name for x in ['ai-proj', 'req']): return "productivity", ["project-management", "tasks", "requirements"] diff --git a/skills-dev/slark-cicd-plugin/.claude-plugin/plugin.json b/skills-dev/slark-cicd-plugin/.claude-plugin/plugin.json new file mode 100644 index 0000000..92df009 --- /dev/null +++ b/skills-dev/slark-cicd-plugin/.claude-plugin/plugin.json @@ -0,0 +1,11 @@ +{ + "name": "slark-cicd-plugin", + "description": "Slark 仓库 staging、生产与 Desktop 安装包的端到端 CI/CD 发布技能。", + "version": "1.0.0", + "author": { + "name": "qiudl" + }, + "install_name": "slark-cicd", + "install_type": "skill", + "dir_category": "dev" +} diff --git a/skills-dev/slark-cicd-plugin/skills/SKILL.md b/skills-dev/slark-cicd-plugin/skills/SKILL.md new file mode 100644 index 0000000..d65d536 --- /dev/null +++ b/skills-dev/slark-cicd-plugin/skills/SKILL.md @@ -0,0 +1,201 @@ +--- +name: slark-cicd +description: Slark 仓库 staging、生产和 Desktop 安装包的端到端 CI/CD 可执行 runbook。覆盖本地预推快检、PR 与内网 ci/internal-gate 门禁、合并 origin/main、staging 真机预验、审批式生产发布,以及在 m5max 构建签名、公证并上传 macOS/Windows Desktop 包到 OSS。当用户要在 slark(qiudl/qiu-slark)里发布/上线、部署到生产或 staging、发布 Desktop 安装包、盯 CI/合并 PR、复现或验证运行时行为、或排查发布链/推送路由问题时使用。 +--- + +# Slark CI/CD runbook + +驱动 Slark 从改代码到上线的端到端流程。权威流程与完整细节见仓库文档 +`docs/cicd-staging-production.md`(本技能命令与之一致);本文件是可直接照做的分阶段清单。 + +仓库:`qiudl/qiu-slark`(本机克隆通常在 `/Users/donglinlai/coding/slark`)。所有命令在**仓库根**执行。 +`ai-proj` 相关命令加 `GODEBUG=netdns=go` 前缀。 + +## 铁律(先记死) + +- GitHub `origin/main` 是唯一代码权威、合并入口与生产发布来源;`internal` 只用于 CI/镜像,永不发布。 +- 生产发布只接受**最新 `origin/main` 的精确 40 位 SHA**;`HEAD != origin/main` 会被 `deploy.sh` 拒绝。 +- 生产发布必须在**普通 clone** 中执行,且 `.git` 必须是目录;`release-prod.sh` / `deploy.sh` 会拒绝 + `.git` 为指针文件的 git worktree。不要污染现有 checkout:主目录脏或被占用时,新建干净的临时 clone。 +- 审批式部署,永不自动:亲手敲的 `sudo`/`rm -rf`/`dd`/`curl|sh`/包安装是 `destructive`(NEVER_AUTO), + **每次都要人审**;命中审批闸就**等人批**,绝不绕过、绝不把这些 key 加进 auto-approve 白名单。 +- staging 与生产硬隔离:staging 脚本带生产 IP 拒运行护栏、不 push origin、不反向 rsync。 +- 当前 Slark staging 权威目标是 AWS `ap-southeast-2` 实例 `i-013e5ca3fdfddc13e` + (Name=`slark-staging`,2026-08-18 核验公网 IP `15.135.112.181`)。公网 IP 自动分配,发布前必须按 + 实例 ID 重查并确认 Name/状态;不得凭历史 IP 判断目标。 +- `82.157.141.202` 是 ai-proj 预生产宿主机。其 `/opt/slark-staging` cohost 是隔离的 Slark 兼容验收栈, + 但不是 Slark 独立预生产;只有任务明确指定 cohost 时才能使用,不得作为普通 Slark staging 的默认目标。 +- staging 发布若影响 `packages/daemon`、`packages/runtime`、Server/daemon 公共协议或 Desktop 公共运行链, + 必须把 `server-staging` 与 `daemon-staging` 更新到同一精确 SHA;两者版本不一致不得宣告 staging 成功。 +- 只修 PR 范围内的 CI 失败;不为过检去改 CI/workflow 或做无关改动。 + +## 选择链路 + +- 「发布/上线/部署生产」→ 生产发布链:阶段 1→2→4→5。 +- 「Desktop/桌面版打包、发布、上传 OSS」→ 阶段 1→2 后走 `docs/desktop-oss-release.md` 的 m5max 双平台链路。 +- 「盯 CI/合并 PR」→ 阶段 1→2(用 babysit 心态循环到 green + mergeable + 评论收口)。 +- 「复现/验证运行时行为、别碰生产」→ staging 预验链(阶段 3,可独立随时跑)。 + +## 阶段 1:PR 与内网 gate(`ci/internal-gate`) + +真实门禁是内网 CI(GitHub Actions 已停用)。检查与自查: + +```bash +gh pr checks # 应见 ci/internal-gate +gh pr view --json state,mergeable,mergeStateStatus,isDraft,reviewDecision +``` + +- 基础门(全 PR):release-contract / member-gate / authz-matrix / controlled-content-exits / + onconflict-predicate / migration-idempotency / wsl-path-translation / typecheck / test(全量)。 +- 条件外部门(按改动路径):改 server DB/迁移/schema → `postgresql-security`;改 web → `web-e2e`; + android / daemon+desktop 各有门。 +- 本地复跑基础门可跑部分:`pnpm -r typecheck && pnpm test`。 + +红了:只修本 PR 范围内的失败。疑似无关的合并阻塞→先 merge 最新 `main`(可能别的 PR 已修)。 +`BLOCKED: