感谢你关注 Sopify 的贡献方式。
- 非 trivial 改动请先开 issue,对齐范围和责任边界。
- PR 保持聚焦,尽量做到“一次一个功能或修复”。
- 用户可见行为变更时,同步更新
README.md和README.zh-CN.md。 - 用户可见行为或维护规则变化时,手动更新
CHANGELOG.md。
skills/{zh,en}是 prompt-layer 真源。每个语言目录包含header.md.template(宿主无关模板)和skills/sopify/(skill 包)。Codex/Skills/{CN,EN}和Claude/Skills/{CN,EN}已被 git 忽略。可通过bash scripts/sync-skills.sh本地生成,用于调试或查看传统宿主目录结构,但不参与发版、CI 或 pre-commit。skills/catalog/builtin_catalog.generated.json是生成的 builtin catalog;源 skill 定义通过scripts/generate-builtin-catalog.py维护。- Skill package 变更时,参考 skills/zh/skills/sopify/ / skills/en/skills/sopify/ 下各自的
SKILL.md。
关键约束:
- route 绑定优先使用
supports_routes skill.yaml统一经sopify_contracts/skill_schema.py校验tools / disallowed_tools / allowed_paths / requires_network当前为声明字段- builtin catalog 通过脚本再生成,不手改生成产物
需要以维护者视角验证 payload bundle + thin-stub 接入时,优先使用以下命令:
# 验证安装 + payload bundle + workspace stub
python3 scripts/check-install-payload-bundle-smoke.py --target codex:zh-CN
# 协议合规检查
python3 scripts/sopify_protocol_check.py check --scenario new-plan --fixture tests/fixtures/minimal_planBundle 规则:
- 全局 payload 位于
~/.codex/sopify/或~/.claude/sopify/ - 工作区内的
.sopify/sopify.json是唯一 workspace activation marker,声明bundle_version / locator_mode / capabilities - 宿主按 4 步协议入口(active_plan → plan.md → current_handoff → receipts)接续,定义在
.sopify/blueprint/protocol.md §8 - 协议状态写入走
sopify_writer;宿主不直接写 state 文件
仓库内提供 Codex-first 注册试点,用于维护者验证 scripts/sopify_mcp_server.py。它要求一个已有的 Python 3.11+ 环境和 mcp[cli]>=1.27,<2,不会自动安装依赖或修改 payload:
# 默认 dry-run
python3 scripts/sopify_mcp_register.py --python /path/to/python3
# 明确写入 Codex 用户级 MCP 配置
python3 scripts/sopify_mcp_register.py --python /path/to/python3 --apply注册脚本委托官方 codex mcp get/add,不直接编辑 TOML;同配置为 no-op,不同配置会拒绝覆盖。Codex 是首个验证对象,不是唯一具备 MCP 接入能力的宿主。Qoder、Claude、Copilot 的自动注册、依赖打包和 doctor 集成要等实测证据后再决定。
当前 installer 入口按受众分层:
- repo-local / 源码安装:
bash scripts/install-sopify.sh --target codex:zh-CN
python3 scripts/install_sopify.py --target claude:en-US- dev / maintainer 远程入口(
raw/main,不进 README 首屏):
curl -fsSL https://raw.githubusercontent.com/evidentloop/sopify/main/install.sh | \
bash -s -- --target codex:zh-CN- public stable 入口(只有在公开 GitHub Release 存在后才启用):
curl -fsSL https://github.com/evidentloop/sopify/releases/latest/download/install.sh | \
bash -s -- --target codex:zh-CN约定:
- root
install.sh/install.ps1必须保持 thin wrapper,只负责下载同 ref 的 GitHub source archive 并调用scripts/install_sopify.py main分支里的 root 脚本保留 dev 默认值(SOURCE_CHANNEL=dev、SOURCE_REF=main)- stable release asset 必须由 root 脚本按 release tag 渲染后上传,不能直接上传
main上的原文件 - 分发层必须继续走 host registry,不允许在 installer 入口里硬编码
codex/claude分支;README 应展示宿主可用性矩阵,并在 repo 侧路径就绪后纳入实验性 install target --workspace <path>当前只保留给 maintainer / internal prewarm 调试,不属于 B1 默认用户路径;正式路径是先完成全局安装,再在项目里第一次触发 Sopify,由 payload bundle 完成 bootstrap
release asset 渲染 checklist:
TAG="2026-03-25.142231"
OUT_DIR="$(mktemp -d)"
python3 scripts/render-release-installers.py --release-tag "$TAG" --output-dir "$OUT_DIR"然后:
- 将
$OUT_DIR/install.sh和$OUT_DIR/install.ps1上传到同 tag 的 GitHub Release - 在
releases/latest/download/install.sh真正可访问之前,不要切 README 首屏安装命令 - post-release manual smoke 只做维护者校验:确认 latest release asset 存在、stable installer 解析到同 tag,且输出里能看到
source channel/resolved source ref/asset name
按变更范围选择最小校验集。
Prompt 层与 metadata 同步:
bash scripts/check-version-consistency.sh
python3 scripts/generate-builtin-catalog.py
python3 -m pytest tests -v协议与 payload 验证:
python3 scripts/sopify_protocol_check.py check --scenario new-plan --fixture tests/fixtures/minimal_plan
python3 scripts/check-install-payload-bundle-smoke.py --target codex:zh-CN
python3 -m pytest tests -v文档与发布校验:
python3 scripts/check-readme-links.py
python3 -m unittest tests/test_release_hooks.py -v
python3 -m unittest tests/test_distribution.py tests/test_installer_status_doctor.py -v
bash scripts/check-version-consistency.sh仓库内置了 .githooks/pre-commit 与 commit-msg 的联动自动化。
每个 clone 只需启用一次:
git config core.hooksPath .githooks行为摘要:
pre-commit会先运行scripts/release-preflight.sh,再运行scripts/release-sync.sh- release-managed 文件会在检查通过后自动回到同一个 commit
- 当
CHANGELOG.md -> [Unreleased]为空时,release-sync会根据当前 staged files 自动生成摘要级草稿(分类 bullet,不含逐文件列表) commit-msg只有在存在 pre-commit handoff 时,才会追加Release-Sync、Release-Version、Release-Date
AI attribution 说明:
- 仓库级 AI 协作声明见 CONTRIBUTORS.md
- 仓库默认不再为 AI 助手追加标准
Co-authored-bytrailer;除非你手动填写,否则 GitHub contributor attribution 会只归属于人类 commit author SOPIFY_DISABLE_RELEASE_HOOK=1会关闭整条 release hook 链;只建议在维护/调试场景使用
常用环境变量:
SOPIFY_DISABLE_RELEASE_HOOK=1SOPIFY_SKIP_RELEASE_PREFLIGHT=1SOPIFY_AUTO_DRAFT_CHANGELOG=0SOPIFY_RELEASE_HOOK_DRY_RUN=1SOPIFY_FORCE_RELEASE_SYNC=1
提交贡献即表示你同意按目标文件对应的许可分发你的改动:
- 代码与配置:Apache 2.0
- 文档:CC BY 4.0