diff --git a/README.md b/README.md index eef42ec..43b58c7 100644 --- a/README.md +++ b/README.md @@ -235,19 +235,19 @@ rm -rf ~/.config/opencode/skills/{code-review,code-review-archive,code-review-re ### `code-action-docker` -把 Gitea/GitHub「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)。 +把 Gitea/GitHub「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 不注入 secrets;Gitea 行為無保證),需要時宣告為 `inputs` 由呼叫端 workflow 以 `with:` 傳入,未經同意不擅改 `inputs`/`outputs` 契約。目錄沒有 `action.yml` 時可走**問答式從零建立**(收集名稱/輸入輸出/執行目標後產生 docker `action.yml` 與 `src/index.js` 骨架,再接後續階段)。skill 各檔的「更新時間」於最終階段(doc-funcs 完成後)**統一同步為同一時間戳**。 -參數:`[--action-dir ] [--node-version ] [--main <主程式檔>] [--yes]`(根目錄預設目前工作目錄;node 版本預設最新;主程式自動判斷;`--yes` 略過一般確認,但主程式改寫與 doc-funcs 的實作詢問仍會中斷)。 +參數:`[--action-dir ] [--node-version ] [--main <主程式檔>]`(根目錄預設目前工作目錄;node 版本預設最新;主程式自動判斷)。 - **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` 選單 -- **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` -把 Gitea/GitHub「composite action」專案標準化,再串接文件化流程。四階段:(A) 找出 action 專案、讀 `action.yml`/`action.yaml` 的 `name`/`description`/`runs`、判斷是否為 composite;(B) **已是 composite 則保留既有 `steps`**,非 composite(JS/Docker)則**保守確認後對齊**為 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)。 +把 Gitea/GitHub「composite action」專案標準化,再串接文件化流程。四階段:(A) 找出 action 專案、讀 `action.yml`/`action.yaml` 的 `name`/`description`/`runs`、判斷是否為 composite;(B) **已是 composite 則保留既有 `steps`**,非 composite(JS/Docker)則**保守確認後對齊**為 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.* }}` context(Gitea 中兩者互為別名,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 ] [--manifest ] [--yes]`(根目錄預設目前工作目錄;manifest 自動尋找 `action.yml`/`action.yaml`;`--yes` 略過一般確認,但「非 composite 需對齊」與 doc-funcs 的實作詢問仍會中斷)。 +參數:`[--action-dir ] [--manifest ]`(根目錄預設目前工作目錄;manifest 自動尋找 `action.yml`/`action.yaml`)。 - **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` 選單