開源發布管線技能
透過三階段管線安全地將任何專案開源:Fork(清除機密)→ Sanitize(驗證乾淨)→ Package(生成 CLAUDE.md + setup.sh + README)。
觸發時機
- 使用者說「將此專案開源」或「將其公開」
- 使用者想要準備私人儲存庫以供公開發布
- 使用者需要在推送到 GitHub 前清除機密
- 使用者呼叫
/opensource fork、/opensource verify或/opensource package
命令
| 命令 | 動作 |
|---|---|
/opensource fork PROJECT | 完整管線:fork + sanitize + package |
/opensource verify PROJECT | 對現有儲存庫執行 sanitizer |
/opensource package PROJECT | 生成 CLAUDE.md + setup.sh + README |
/opensource list | 顯示所有已暫存的專案 |
/opensource status PROJECT | 顯示某個暫存專案的報告 |
協定
/opensource fork PROJECT
完整管線 —— 主要工作流程。
步驟 1:收集參數
解析專案路徑。如果 PROJECT 包含 /,則視為路徑(絕對或相對)。否則依序檢查:目前工作目錄、$HOME/PROJECT,然後詢問使用者。
SOURCE_PATH="<解析後的絕對路徑>"
STAGING_PATH="$HOME/opensource-staging/${PROJECT_NAME}"
詢問使用者:
- 「哪個專案?」(如果找不到)
- 「授權條款?(MIT / Apache-2.0 / GPL-3.0 / BSD-3-Clause)」
- 「GitHub 組織或使用者名稱?」(預設:透過
gh api user -q .login偵測) - 「GitHub 儲存庫名稱?」(預設:專案名稱)
- 「README 的說明文字?」(分析專案以提供建議)
步驟 2:建立暫存目錄
mkdir -p $HOME/opensource-staging/
步驟 3:執行 Forker 代理程式
產生 opensource-forker 代理程式:
Agent(
description="將 {PROJECT} fork 為開源版本",
subagent_type="opensource-forker",
prompt="""
為開源發布 fork 專案。
來源:{SOURCE_PATH}
目標:{STAGING_PATH}
授權條款:{chosen_license}
遵循完整的 fork 協定:
1. 複製檔案(排除 .git、node_modules、__pycache__、.venv)
2. 清除所有機密與憑證
3. 將內部引用替換為佔位符
4. 生成 .env.example
5. 清理 Git 歷史
6. 在 {STAGING_PATH}/FORK_REPORT.md 生成 FORK_REPORT.md
"""
)
等待完成。讀取 {STAGING_PATH}/FORK_REPORT.md。
步驟 4:執行 Sanitizer 代理程式
產生 opensource-sanitizer 代理程式:
Agent(
description="驗證 {PROJECT} 的清理結果",
subagent_type="opensource-sanitizer",
prompt="""
驗證開源 fork 的清理狀態。
專案:{STAGING_PATH}
來源(參考用):{SOURCE_PATH}
執行所有掃描類別:
1. 機密掃描(CRITICAL)
2. PII 掃描(CRITICAL)
3. 內部引用掃描(CRITICAL)
4. 危險檔案檢查(CRITICAL)
5. 配置完整性檢查(WARNING)
6. Git 歷史審計
在 {STAGING_PATH}/ 內生成 SANITIZATION_REPORT.md,包含 PASS/FAIL 判定。
"""
)
等待完成。讀取 {STAGING_PATH}/SANITIZATION_REPORT.md。
如果 FAIL: 向使用者顯示發現的問題。詢問:「修復這些問題後重新掃描,還是中止?」
- 如果修復:套用修正,重新執行 sanitizer(最多重試 3 次 — 若 3 次 FAIL 後,呈現所有發現的問題,請使用者手動修復)
- 如果中止:清理暫存目錄
如果 PASS 或 PASS WITH WARNINGS: 繼續到步驟 5。
步驟 5:執行 Packager 代理程式
產生 opensource-packager 代理程式:
Agent(
description="為 {PROJECT} 打包開源版本",
subagent_type="opensource-packager",
prompt="""
為專案生成開源打包檔案。
專案:{STAGING_PATH}
授權條款:{chosen_license}
專案名稱:{PROJECT_NAME}
說明:{description}
GitHub 儲存庫:{github_repo}
生成:
1. CLAUDE.md(命令、架構、關鍵檔案)
2. setup.sh(一行指令啟動,設為可執行)
3. README.md(或加強現有檔案)
4. LICENSE
5. CONTRIBUTING.md
6. .github/ISSUE_TEMPLATE/(bug_report.md、feature_request.md)
"""
)
步驟 6:最終審查
向使用者顯示:
開源 Fork 就緒:{PROJECT_NAME}
位置:{STAGING_PATH}
授權條款:{license}
已生成檔案:
- CLAUDE.md
- setup.sh(可執行)
- README.md
- LICENSE
- CONTRIBUTING.md
- .env.example({N} 個變數)
清理結果:{sanitization_verdict}
後續步驟:
1. 審查:cd {STAGING_PATH}
2. 建立儲存庫:gh repo create {github_org}/{github_repo} --public
3. 推送:git remote add origin ... && git push -u origin main
是否繼續建立 GitHub 儲存庫?(是 / 否 / 先審查)
步驟 7:發布至 GitHub(經使用者核准後)
cd "{STAGING_PATH}"
gh repo create "{github_org}/{github_repo}" --public --source=. --push --description "{description}"
/opensource verify PROJECT
獨立執行 sanitizer。解析路徑:如果 PROJECT 包含 /,則視為路徑。否則依序檢查 $HOME/opensource-staging/PROJECT、$HOME/PROJECT,然後是目前目錄。
Agent(
subagent_type="opensource-sanitizer",
prompt="驗證清理狀態:{resolved_path}。執行全部 6 類掃描並生成 SANITIZATION_REPORT.md。"
)
/opensource package PROJECT
獨立執行 packager。詢問「授權條款?」和「說明文字?」,然後:
Agent(
subagent_type="opensource-packager",
prompt="打包:{resolved_path} ..."
)
/opensource list
ls -d $HOME/opensource-staging/*/
顯示每個專案及其管線進度(FORK_REPORT.md、SANITIZATION_REPORT.md、CLAUDE.md 是否存在)。
/opensource status PROJECT
cat $HOME/opensource-staging/${PROJECT}/SANITIZATION_REPORT.md
cat $HOME/opensource-staging/${PROJECT}/FORK_REPORT.md
暫存目錄結構
$HOME/opensource-staging/
my-project/
FORK_REPORT.md # 來自 forker 代理程式
SANITIZATION_REPORT.md # 來自 sanitizer 代理程式
CLAUDE.md # 來自 packager 代理程式
setup.sh # 來自 packager 代理程式
README.md # 來自 packager 代理程式
.env.example # 來自 forker 代理程式
... # 已清理的專案檔案
反模式
- 絕不未經使用者核准就推送至 GitHub
- 絕不跳過 sanitizer —— 它是安全閘門
- 絕不在 sanitizer 判定 FAIL 且未修復所有關鍵發現前繼續執行
- 絕不將
.env、*.pem或credentials.json留在暫存目錄中
最佳實踐
- 對新發布版本,始終執行完整管線(fork → sanitize → package)
- 暫存目錄會持續存在,直到明確清理為止 —— 可用於審查
- 在發布前,若進行任何手動修正,務必重新執行 sanitizer
- 將機密參數化,而非直接刪除 —— 以保留專案功能
相關技能
請參閱 security-review,以了解 sanitizer 使用的機密偵測模式。