feat(action skills): composite/docker action 標準化流程強化(參數優先序、從零建立、Dockerfile 修正) #6

Merged
admin merged 27 commits from develop into master 2026-07-17 03:36:44 +00:00
Showing only changes of commit fc39c1254d - Show all commits
+5 -5
View File
@@ -235,19 +235,19 @@ rm -rf ~/.config/opencode/skills/{code-review,code-review-archive,code-review-re
### `code-action-docker` ### `code-action-docker`
把 GiteaGitHub「Docker 容器 action」專案標準化為 **Node 主程式+容器化**,再串接文件化流程。五階段:(A) 找出 action 專案、讀 `action.yml``action.yaml``name``description`、判斷主程式語言;(B) 主程式**非 Node 則保守改寫為 Node**(高風險,先以 AskUserQuestion 確認,保留對外行為),並把所有 `.js` 集中到 **`src/`**、同步更新 `require``import` 路徑、`package.json``action.yml`(C) 產生 `entrypoint.sh`**啟動 node 前先輸出 action 名稱/用途/更新時間**Asia/Taipei `yyyy/MM/dd HH:mm:ss`)再 `exec node`;(D) 依**六步流程**(參數處理 → 安裝套件 → 複製檔案 → 執行程序 → 縮小映像檔 → 設定入口)產生**使用最新 node 版本**的 `Dockerfile`**每步內容依主程式(`src/`)實作量身決定**(先盤點相依/是否需 build/OS 層相依/入口檔再填對應步驟,用不到的不硬塞),預設 build 基底 `node:latest`、runtime `node:slim`**多階段建置縮小映像**`ENTRYPOINT` 指向 `entrypoint.sh`(E) 對整個專案**完整執行 `/jsc:doc-funcs`**function 文件、`entrypoint.sh``Dockerfile` 逐行註解、重建 README)。 把 GiteaGitHub「Docker 容器 action」專案標準化為 **Node 主程式+容器化**,再串接文件化流程。五階段:(A) 找出 action 專案、讀 `action.yml``action.yaml``name``description`、判斷主程式語言;(B) 主程式**非 Node 則保守改寫為 Node**(高風險,先以 AskUserQuestion 確認,保留對外行為),並把**主程式依賴鏈**的 `.js` 集中到 **`src/`**(工具設定檔與測試目錄不搬)、同步更新 `require``import` 路徑、`package.json``action.yml``runs` 只設 `using: docker``image: Dockerfile`**不設相對路徑的 `entrypoint`**,入口由 Dockerfile 的絕對路徑 `ENTRYPOINT` 決定)(C) 產生 `entrypoint.sh`**啟動 node 前先輸出 action 名稱/用途/更新時間**Asia/Taipei `yyyy/MM/dd HH:mm:ss`)再 `exec node`;(D) 依**六步流程**(參數處理 → 安裝套件 → 複製檔案 → 執行程序 → 縮小映像檔 → 設定入口)產生**使用最新 LTS node 版本(固定 major tag**的 `Dockerfile`**每步內容依主程式(`src/`)實作量身決定**(先盤點相依/是否需 build/OS 層相依/入口檔並產生 `.dockerignore`再填對應步驟,用不到的不硬塞),預設 build 基底為當前 LTS(如 `node:22`、runtime 對應 `-slim`(如 `node:22-slim`),**多階段建置逐項明列必要產物**(不整包 COPY)縮小映像,`ENTRYPOINT` 指向 `entrypoint.sh`(絕對路徑)(E) 對整個專案**完整執行 `/jsc:doc-funcs`**function 文件、`entrypoint.sh``Dockerfile` 逐行註解、重建 README)。開發中需要新參數時依**參數來源優先序**處理:優先取用 runner 注入容器的 `GITHUB_*``GITEA_*` 執行期環境變數(即 `gitea.*``github.*` context 的同源資訊;docker action 的 `action.yml` 幾乎只有 `inputs``env` context 可用),無法取得才經使用者同意**新增 `inputs`**(容器內讀 `INPUT_*`);`secrets``vars` context 在 docker action 內**一律視為不可用**(GitHub 官方文件僅記載 `inputs` context、runner 不注入 secretsGitea 行為無保證),需要時宣告為 `inputs` 由呼叫端 workflow 以 `with:` 傳入,未經同意不擅改 `inputs``outputs` 契約。目錄沒有 `action.yml` 時可走**問答式從零建立**(收集名稱/輸入輸出/執行目標後產生 docker `action.yml``src/index.js` 骨架,再接後續階段)。skill 各檔的「更新時間」於最終階段(doc-funcs 完成後)**統一同步為同一時間戳**。
參數:`[--action-dir <action 根目錄>] [--node-version <node tag>] [--main <主程式檔>] [--yes]`(根目錄預設目前工作目錄;node 版本預設最新;主程式自動判斷`--yes` 略過一般確認,但主程式改寫與 doc-funcs 的實作詢問仍會中斷)。 參數:`[--action-dir <action 根目錄>] [--node-version <node tag>] [--main <主程式檔>]`(根目錄預設目前工作目錄;node 版本預設最新;主程式自動判斷)。
- **Claude Code / Antigravity**`/jsc:code-action-docker`,或 `/jsc:code-action-docker --action-dir ~/work/my-action --node-version 22` - **Claude Code / Antigravity**`/jsc:code-action-docker`,或 `/jsc:code-action-docker --action-dir ~/work/my-action --node-version 22`
- **Codex**`$code-action-docker`,或 `$code-action-docker --action-dir ~/work/my-action`,或用 `/skills` 選單 - **Codex**`$code-action-docker`,或 `$code-action-docker --action-dir ~/work/my-action`,或用 `/skills` 選單
- **OpenCode**:描述需求(如「把這個 action 主程式改成 node、所有 js 收進 src/,產生會先輸出 action 名稱/用途/更新時間再啟動 node 的 entrypoint.sh、用最新 node 版本的 Dockerfile,最後跑 doc-funcs 補文件並重建 README」)自動觸發 - **OpenCode**:描述需求(如「把這個 action 主程式改成 node、主程式相關 js 收進 src/,產生會先輸出 action 名稱/用途/更新時間再啟動 node 的 entrypoint.sh、用最新 LTS node 版本的 Dockerfile,最後跑 doc-funcs 補文件並重建 README」)自動觸發
### `code-action-composite` ### `code-action-composite`
把 GiteaGitHub「composite action」專案標準化,再串接文件化流程。四階段:(A) 找出 action 專案、讀 `action.yml``action.yaml``name``description``runs`、判斷是否為 composite(B) **已是 composite 則保留既有 `steps`**,非 compositeJSDocker)則**保守確認後對齊**為 composite(高風險先以 AskUserQuestion 確認保留 `inputs``outputs` 契約;Docker 行為無法等價塞入時標「需人工確認」並建議改用 `code-action-docker`);(C) 在 `runs.steps` **最前面注入啟動橫幅 step**,輸出 action **名稱/用途/更新時間**Asia/Taipei `yyyy/MM/dd HH:mm:ss`,固定字串),並於 `action.yml` 開頭補用途/更新時間註解區塊(既有橫幅 step 則更新而非重插);(D) 對整個專案**完整執行 `/jsc:doc-funcs`**`action.yml` 與被引用腳本逐行註解、function 文件、重建 README)。 把 GiteaGitHub「composite action」專案標準化,再串接文件化流程。四階段:(A) 找出 action 專案、讀 `action.yml``action.yaml``name``description``runs`、判斷是否為 composite(B) **已是 composite 則保留既有 `steps`**,非 compositeJSDocker)則**保守確認後對齊**為 composite(高風險先以 AskUserQuestion 確認JS action 轉換須補 `INPUT_*` env 映射與 `outputs.value` 轉接以保留 `inputs``outputs` 契約;Docker 行為無法等價塞入時標「需人工確認」並建議改用 `code-action-docker`);(C) 在 `runs.steps` **最前面注入啟動橫幅 step**,輸出 action **名稱/用途/更新時間**Asia/Taipei `yyyy/MM/dd HH:mm:ss`,固定字串),並於 `action.yml` 開頭補用途/更新時間註解區塊(既有橫幅 step 則更新而非重插);(D) 對整個專案**完整執行 `/jsc:doc-funcs`**`action.yml` 與被引用腳本逐行註解、function 文件、重建 README)。開發中需要新參數時依**參數來源優先序**處理:優先取用 `${{ gitea.* }}``${{ github.* }}` contextGitea 中兩者互為別名,composite step 內可直接使用、`run` 腳本內可讀同源 `$GITHUB_*` 環境變數),無法取得才經使用者同意**新增 `inputs`**`secrets``vars` context 在 composite action 內**一律視為不可用**GitHub 官方明文限制;Gitea act_runner 未嚴格檢查 context 可用性、行為無保證),需要時宣告為 `inputs` 由呼叫端 workflow 以 `with:` 傳入,未經同意不擅改 `inputs``outputs` 契約。目錄沒有 `action.yml` 時可走**問答式從零建立**(收集名稱/輸入輸出/執行目標後產生 composite `action.yml` 並實作 steps,再接後續階段)。skill 各檔的「更新時間」於最終階段(doc-funcs 完成後)**統一同步為同一時間戳**。
參數:`[--action-dir <action 根目錄>] [--manifest <action.yml 路徑>] [--yes]`(根目錄預設目前工作目錄;manifest 自動尋找 `action.yml``action.yaml``--yes` 略過一般確認,但「非 composite 需對齊」與 doc-funcs 的實作詢問仍會中斷)。 參數:`[--action-dir <action 根目錄>] [--manifest <action.yml 路徑>]`(根目錄預設目前工作目錄;manifest 自動尋找 `action.yml``action.yaml`)。
- **Claude Code / Antigravity**`/jsc:code-action-composite`,或 `/jsc:code-action-composite --action-dir ~/work/my-action` - **Claude Code / Antigravity**`/jsc:code-action-composite`,或 `/jsc:code-action-composite --action-dir ~/work/my-action`
- **Codex**`$code-action-composite`,或 `$code-action-composite --action-dir ~/work/my-action`,或用 `/skills` 選單 - **Codex**`$code-action-composite`,或 `$code-action-composite --action-dir ~/work/my-action`,或用 `/skills` 選單