refactor(skills 共用規範): 抽出共用規範至 generic spec-*,以引用+一行 fallback 摘要取代重複內容
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
fc39c1254d
commit
7814e2edea
+18
-25
@@ -16,14 +16,21 @@ argument-hint: "[--project-dir <專案根目錄>] [--dockerfile <Dockerfile 路
|
||||
|
||||
---
|
||||
|
||||
## 輸出規範(務必遵守)
|
||||
## 共用規範(generic plugin,必要前置)
|
||||
|
||||
- **語言**:所有面向使用者的輸出(計畫、進度、總結、反問)一律使用**繁體中文(台灣用語)**;僅識別字、檔名、git/docker 指令、API 路徑、程式碼等技術標識保留原文,**不可**使用簡體字。
|
||||
- **編碼無亂碼**:凡輸出含繁體中文、全形標點、emoji,一律 **UTF-8(不含 BOM)**,不得出現問號方框或錯碼。產生/覆寫的 `Dockerfile`、`README.md` 同樣需 UTF-8(不含 BOM)。
|
||||
- **自動執行原則**:除非使用者明確要求先確認,或遇到不可忽略的必要決策,否則各階段只需輸出簡短計畫/進度後直接執行到完成。**一定會中斷詢問的點**:階段 B「重整無法可靠保證建置行為等價」時(破壞性,須先確認),以及階段 C 由 `/jsc:doc-funcs` 自身的「如何實作」詢問。
|
||||
- **不破壞既有工作**:覆寫 `Dockerfile` 前,若工作區有未提交變更,先提醒使用者建議先 commit/備份;**絕不** `reset --hard`/`checkout -f`/`clean`,也不刪除使用者既有原始碼。
|
||||
- **保留建置行為**:重整只「重新組織與分層」既有指令,不得擅自改變最終映像的內容、檔案落點、相依版本、暴露的 port、`ENV`、`ENTRYPOINT`/`CMD` 對外契約或建置副作用;任何無法可靠等價推論的調整一律不做,並以註解或回報標註「需人工確認」。多階段建置縮小映像時,runtime 階段必須帶齊執行所需的所有產物(執行檔、相依、靜態資源、`ENV`、暴露 port),不得遺漏導致容器無法啟動。
|
||||
- **不擴及無關檔案**:本 skill 階段 A/B 只動目標 `Dockerfile`(及與其直接相關、為保留行為而必須同步的 `.dockerignore`);其餘檔案僅在階段 C 由 doc-funcs 流程依其規範處理。排除 `node_modules`/`.git`/`.docs`/`bin`/`obj`/第三方依賴。
|
||||
執行本 skill 前,先以 Skill 工具載入下列共用規範並全程遵守;**任一載入不到(generic plugin 未安裝)時,先詢問使用者是否安裝 generic plugin(`https://gitea.jsc.idv.tw/plugins/generic.git`),使用者不安裝則直接中斷本 skill**,不得只憑下方一行摘要繼續執行:
|
||||
|
||||
- `/jsc:spec-output`:繁體中文(台灣用語)、UTF-8(不含 BOM)無亂碼。
|
||||
- `/jsc:spec-execution`:自動執行原則(必要決策才中斷)、不臆測/需人工確認、不擴及無關檔案。
|
||||
- `/jsc:spec-git-safety`:不破壞既有工作(絕不 `reset --hard`/`clean`)。
|
||||
- `/jsc:spec-dockerfile`:Dockerfile 六步流程、多階段建置、對外契約不動、自我檢查。
|
||||
- `/jsc:spec-doc-funcs-handoff`:最終階段完整執行 `/jsc:doc-funcs` 的標準流程。
|
||||
|
||||
本 skill 特有補充:
|
||||
|
||||
- **一定會中斷詢問的點**:階段 B「重整無法可靠保證建置行為等價」時(破壞性,須先確認),以及階段 C 由 `/jsc:doc-funcs` 自身的「如何實作」詢問。
|
||||
- **保留建置行為**:重整只「重新組織與分層」既有指令,不得擅自改變最終映像的內容、檔案落點、相依版本、暴露的 port、`ENV`、`ENTRYPOINT`/`CMD` 對外契約或建置副作用;多階段建置縮小映像時,runtime 階段必須帶齊執行所需的所有產物,不得遺漏導致容器無法啟動。
|
||||
- **本 skill 只動**:階段 A/B 只動目標 `Dockerfile`(及與其直接相關、為保留行為而必須同步的 `.dockerignore`);其餘檔案僅在階段 C 由 doc-funcs 流程依其規範處理。
|
||||
|
||||
---
|
||||
|
||||
@@ -69,14 +76,7 @@ argument-hint: "[--project-dir <專案根目錄>] [--dockerfile <Dockerfile 路
|
||||
|
||||
## 階段 B:整理 Dockerfile 為六步流程
|
||||
|
||||
在**保留建置行為**的前提下,把目標 `Dockerfile` 的指令重整/歸位為**固定六步流程**,並採**多階段建置**縮小最終映像。各步驟對應如下:
|
||||
|
||||
1. **參數處理**:把可調參數集中到檔案開頭,以 `ARG` 注入(base image 版本、build flag、路徑等);`# syntax` 指示與全域 `ARG` 置於最前。
|
||||
2. **安裝套件**:先 `COPY` 相依描述檔(如 `package*.json`/`requirements.txt`/`go.mod go.sum`/`*.csproj`)再安裝,以利 layer 快取;OS 套件與語言相依在此安裝,安裝後清理快取(如 `apt-get clean`/`rm -rf /var/lib/apt/lists/*`、`--no-cache`)以縮小該層。
|
||||
3. **複製檔案**:`COPY` 其餘原始碼到映像(搭配 `.dockerignore` 排除無關檔案)。
|
||||
4. **執行程序**:build/compile/transpile(如 `npm run build`/`go build`/`dotnet publish`)與必要的權限設定(`chmod`)於此執行。
|
||||
5. **縮小映像檔**:多階段建置,runtime 階段改用較小的基底(如 `*-slim`/`*-alpine`/`distroless`/`scratch`,依語言與既有 base 對應),只 `COPY --from=<build>` 帶入**執行所必需**的產物(執行檔/發佈輸出/必要相依/靜態資源),避免把 build 階段的快取、原始碼與 dev 工具帶進最終映像;同步搬移 runtime 階段需要的 `ENV`/`WORKDIR`/`EXPOSE`/`USER`。
|
||||
6. **設定入口**:`ENTRYPOINT`/`CMD` 置於最後,語意與原檔一致。
|
||||
在**保留建置行為**的前提下,把目標 `Dockerfile` 的指令重整/歸位為 `/jsc:spec-dockerfile` 定義的**固定六步流程**(參數處理 → 安裝套件 → 複製檔案 → 執行程序 → 縮小映像檔 → 設定入口),並採**多階段建置**縮小最終映像;各步要點(ARG 集中檔首、相依描述先 `COPY`、同層清理快取、`COPY --from` 逐項明列、搬移 runtime 需要的 `ENV`/`WORKDIR`/`EXPOSE`/`USER`)依該 spec。
|
||||
|
||||
**重整原則(關鍵)**
|
||||
|
||||
@@ -84,7 +84,7 @@ argument-hint: "[--project-dir <專案根目錄>] [--dockerfile <Dockerfile 路
|
||||
- **已是多階段** → 將既有各階段對應到六步(build 階段涵蓋 1–4、runtime 階段涵蓋 5–6),補齊缺漏的快取最佳化與清理,不破壞既有 `--from` 依賴。
|
||||
- **單階段改多階段** → 僅在能可靠判斷 runtime 真正需要哪些產物時才做;無法可靠判斷時,**不臆測**,標 `# 需人工確認:runtime 需要的產物清單` 並回報,退回「最小重排+補註解」。
|
||||
- **多階段不適用** → 若該映像本質上無法受益於多階段(例如純資料映像、最終就是要完整建置環境),保留單階段,於步驟 5 以註解說明「此映像不適用多階段縮小」,其餘步驟仍依序歸位。
|
||||
- **對外契約不動**:`ENTRYPOINT`/`CMD`/`EXPOSE`/`ENV`/`VOLUME`/`HEALTHCHECK`/`USER` 的語意保持與原檔一致;只可調整位置與分層,不可改變值或刪除。
|
||||
- **對外契約不動**:依 `/jsc:spec-dockerfile`(`ENTRYPOINT`/`CMD`/`EXPOSE`/`ENV`/`VOLUME`/`HEALTHCHECK`/`USER` 語意與原檔一致,只可調整位置與分層)。
|
||||
- **`.dockerignore`**:若為了「複製檔案」步驟的正確性需要排除建置產物/`node_modules`/`.git`,可建立或補強 `.dockerignore`(僅新增排除項,不刪既有),並回報。
|
||||
|
||||
重整骨架(實際指令、base image、語言依階段 A 偵測結果填入;非 Node 專案請換成對應語言的安裝/建置指令與 runtime 基底):
|
||||
@@ -120,7 +120,7 @@ COPY --from=build /app/<artifacts> ./<artifacts>
|
||||
ENTRYPOINT [<entrypoint>]
|
||||
```
|
||||
|
||||
- **自我檢查**:重整後確認 (1) `ARG` 在使用它的 `FROM` 之後有重新宣告(跨階段 `ARG` 規則);(2) runtime 階段 `COPY --from` 帶齊執行所需全部產物;(3) `ENTRYPOINT`/`CMD`/`EXPOSE`/`ENV` 與原檔語意一致;(4) 路徑(`WORKDIR`/`COPY` 落點)一致、容器能找到入口。
|
||||
- **自我檢查**:依 `/jsc:spec-dockerfile` 的自我檢查清單(跨階段 `ARG` 重新宣告、runtime 帶齊產物、對外契約一致、路徑一致)。
|
||||
- 此檔的「用途/更新日期」開頭註解區塊與逐行註解,於階段 C 由 `/jsc:doc-funcs` 的指令檔流程統一補齊/覆寫為標準格式;本階段先確保**建置行為**正確、六步結構清楚即可。
|
||||
- **建置驗證**:若環境可執行 `docker build`,重整後做一次建置驗證(或至少 `docker build --check`/語法檢查)確認可建置;無法執行時明確說明原因並標註風險(階段 C doc-funcs 第 11 步亦會做語法驗證)。
|
||||
|
||||
@@ -128,14 +128,7 @@ ENTRYPOINT [<entrypoint>]
|
||||
|
||||
## 階段 C:完整執行 /jsc:doc-funcs 處理流程
|
||||
|
||||
Dockerfile 六步整理完成後,對**整個專案**完整執行 `/jsc:doc-funcs` 流程,替程式碼與指令檔補文件並重建 README:
|
||||
|
||||
- 以階段 A1 的專案根目錄為目標,執行 `doc-funcs` skill 的完整流程(判斷語言 → 掃描 function 與指令檔 → 建立 `.docs/` 草稿 → 草稿品質檢查 → 詢問使用者如何實作 → 依選擇寫回 → 保守優化 → 重建 README → 錨點檢查 → 清理草稿 → 建置/語法驗證)。
|
||||
- doc-funcs 會把本次整理的 `Dockerfile` 視為部署設定檔處理:補齊「用途+更新日期同一註解區塊」與逐行註解(每行有效指令上方或行尾說明其作用、為何需要、重要參數或副作用);專案內各 function 補文件註解;其他指令檔(腳本/CI/`docker-compose*` 等)一併處理。
|
||||
- doc-funcs 的「如何實作」詢問(全部一起/逐個/其他)由使用者於該流程內裁示,本 skill 不代為決定。
|
||||
- 完成後依 doc-funcs 規範重建根目錄 `README.md`(含台灣時區更新時間、專案列表、功能列表、使用範例)。
|
||||
|
||||
> 銜接方式:在本 skill 環境中以 `/jsc:doc-funcs`(或 Skill 工具)啟動 doc-funcs 流程;若該流程需參數,沿用本 skill 的專案根目錄為目標專案。
|
||||
Dockerfile 六步整理完成後,以階段 A1 的專案根目錄為目標,依 `/jsc:spec-doc-funcs-handoff` 對**整個專案**完整執行 `/jsc:doc-funcs` 流程(前置可用性檢查、完整流程、由使用者裁示實作方式、重建 README;本次整理的 `Dockerfile` 會被視為部署設定檔補齊標頭與逐行註解)。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user