把開源前的雜事做成一個 skill






我手上有幾個 side project,一直想開源,但每次都卡在同一個地方——不是 code 沒寫完,是開源前那一串雜事。
README 要重寫、授權要選、設定檔裡的金鑰要清乾淨、還得留一份範例設定給別人跑……想到就累,於是專案又繼續躺在私有 repo 裡。
這次我乾脆把它寫成一個 Claude Code skill(幫 AI 綁好一套固定流程的小擴充,喊一聲就照著做),叫 open-source-prep,一句話就把「只有我看得懂的私人專案」帶到「可以安全公開的 repo」。這篇分享它幫你做哪些事、我在設計時最在意的一個原則、最容易漏掉也最危險的那一步,還有一關工程師最常略過的「你到底有沒有權利開源」。
開源前要做的那一串雜事
把一個私人專案公開,通常逃不掉這幾樣:
- README:別人打開第一眼看的東西。這是什麼、解決什麼、怎麼裝、怎麼跑。沒有 README 的 repo,等於沒開源。
- LICENSE:沒放授權,法律上等於「保留所有權利」——就算公開了,別人還是不能合法拿去用、改、散布。
- 清金鑰:把寫死在 code 或 .env 裡的 API key、密碼、token 全部拿掉。這一步最容易出事,等一下單獨講。
- .env.example:把 .env 複製一份、值全部清空,讓別人知道要設哪些環境變數,又不會看到你真正的 key。
- 一堆社群檔:貢獻指南、行為準則、安全漏洞怎麼回報、issue 跟 PR 的範本。單一份都不難,難的是每次都要記得全部做完。
skill 會把這些能自動生的都先生一份骨架讓我改,內容從專案本身讀出來(名字、用途、怎麼跑),而不是套一份罐頭範本了事。
最容易漏掉、也最危險的一步
大部分人清金鑰的做法是:把 .env 刪掉、commit、推上去,覺得乾淨了。
但公開一個 repo,攤出去的不是「現在這一版檔案」,是「每一次存檔(commit)、每一條分支(branch)的完整歷史」。你這一版把金鑰刪掉了,可是當初存進去的那一版還躺在歷史裡,任何人把整個專案抓下來、翻一下紀錄就看到。所以要掃的是兩個面:現在的檔案,還有整段歷史。
這裡還有兩個很多人踩的坑:
.gitignore只管「還沒被追蹤的檔案」。一個已經 commit 過的檔案,就算後來加進 .gitignore,git 還是繼續追蹤、繼續發布。要真的不追蹤,得git rm --cached(本地留著,只是不再進版控)。- 而
git rm --cached也只清「從現在往後」。歷史裡那一份還在,得改寫歷史(git-filter-repo 或 BFG 這類工具)再強制推上去。
更重要的是——這也是這整篇最不能漏的一句:那把 key 只要曾經進過歷史,就算你把歷史改乾淨了,也得當成已經外洩,回去把它作廢、重發一把新的。改寫歷史只是把紀錄擦掉,作廢才是讓外洩的 key 真的失效;歷史該不該改寫,看那把 key 值不值得繼續信任來決定。
掃描這關我沒有接 gitleaks 那種外部工具,而是自己寫了一個不用裝任何東西的掃描器:有 ripgrep 就用 ripgrep,沒有就退回 grep,把工作目錄跟整段歷史都翻一遍,比對 AWS、GitHub、OpenAI 這些 key 的格式。它寧可誤報,也不漏抓——但它只負責標出來,要不要當真、要不要作廢,都留給我判斷。(順帶一提,GitHub 對公開 repo 有免費的自動掃描,但那是公開「之後」才跑,救不了已經流出去的東西。)
我設計時最在意的一件事
一個幫你「開源」的工具,最怕的就是自作主張。所以我立了一條原則:能自動、又能反悔的,就自動做;一旦做了就收不回來的,一定停下來問我。
自動做的:掃描、生 README/LICENSE/各種文件、git rm --cached、補 .gitignore——這些都能檢查、能還原,不用我一直盯。
但有三件事,skill 一定會停下來、等我親口說「做」,絕不自己來:
- 改寫 git 歷史——會改掉一連串 commit 的編號,逼所有 clone 過的人重來一遍。
- 作廢或重發外洩的憑證——這跟服務綁在一起,只有我自己動手才安全。
- 公開——一旦上網,搜尋引擎、clone、fork 立刻備份,收不回來。
前面那些雜事做錯了頂多重來;這三件做錯了是真的回不去。把這條線分清楚,比把流程做得多完整都重要。
還有一關是「你到底有沒有權利開源」
這一關最容易被工程師整個略過:你手上的 code,你真的有權利公開嗎?
自己一個人寫的、或你公司的,可以自由授權;但如果是多人一起寫的,每個有貢獻的人在著作權上都算一份,理論上都得點頭(skill 會用 git shortlog -sne 把貢獻者列出來給你看)。如果是上班時間、因為工作寫出來的,著作權很可能在公司——這種通常得先問過再說。
還有你用到的套件:大部分寬鬆授權(MIT、Apache)隨你挑,但只要用到一個 copyleft 的相依套件(GPL、AGPL),可能反過來逼你整個專案跟著它走。skill 會把這些標出來提醒你,但講明這是「值得查一下」,不是法律意見。
選授權本身倒是不難:不確定就 MIT(最寬鬆,但別人可以拿去做成閉源的),想強制衍生作品也要一起開源就 GPL。
做成 skill,下一個專案就是一句話
一次性的雜事,做成 skill 的好處是:成本付一次,之後每個專案都省。
手動的問題不是慢,是會漏——尤其掃歷史那一步,越趕越容易跳過,而它剛好是最不能跳的。交給 skill,等於把「最該做又最想偷懶」的那一步,變成不做都不行。
想自己跑一次?兩行就裝好
如果你也有專案卡在開源前,這個 skill 已經放上我的 plugin marketplace,Claude Code 裡兩行就裝好:
/plugin marketplace add https://gitlab.com/andrew54068/claude-plugins
/plugin install open-source-prep@andrew54068
裝完在你的專案裡喊一聲 open-source-prep,它就照上面整套流程跑一遍——掃金鑰、生 README/LICENSE、補 .gitignore 這些自動來;改寫歷史、作廢金鑰、真正公開這三件,一定停下來等你親口說「做」。
設計就先講到這。等我真的拿一個專案從頭跑到公開,再回來報告省到多少、踩到什麼雷。
想開源的念頭,常常不是被難題勸退的,是被雜事勸退的。
最近開始做免費的一對一諮詢,幫你把 AI 接進自己的工作流——有需要的話可以約:https://www.dawsonwang.com/