技能盤點以前只回到對話裡,換一台機器就得重跑才知道裝了什麼。 現在新增技能盤點這個 wiki 頁類型,雜湊取「主機、工具名稱、登入帳號」三段。 每支 CLI 各有自己的 plugin 集合,也各有自己的 hook 接線,那是互相獨立的事實。 少了工具名稱那一段,同一台機器上五支 CLI 會算出同一個雜湊,五份盤點互相覆蓋, 讀的人還看不出被蓋掉。技能盤點新增寫入這兩頁的步驟,整步規定必須開 sub agent。 兩份樣板刻意分開:內容頁每次盤點覆寫整頁,目錄頁只更新自己那一列, 兩者的寫入語意剛好相反,合成一份遲早有人把別台機器的紀錄刪掉。 四支異動技能原本在部署完的同一個工作階段,就叫用剛做好的技能。 部署收尾自己立起重啟閘門,那支技能必被擋下,驗證做不完。 解法不是把它加進豁免清單。豁免擋得住閘門,擋不住「行程還載著舊版」這件事, 硬過關驗到的是舊版行為,等於假通過。所以把判路線、部署、驗證、失敗分流 抽成一份共用說明,驗證一律另開 CLI 行程執行,四支技能只留一行指標指過去。 新增腳本檢查工具,一次做完語法、執行權限與結束碼宣告三項檢查, 只被 source 的函式庫豁免後兩項,而且逐支記在錯誤輸出,不靜默略過。 新增部署路線判定工具,判定改動有沒有進存取庫的預設分支, 取代四支技能各抄一段、各自漂移的散文;判不出來就回報停下,不自己挑路線走。 同時把四支技能裡的中文段落抽到共用說明、指標改回英文, 修正六處相對路徑,把技能盤點的模糊描述改成查得出來的條件, 並讓 manifest 同步的每一個呼叫端逐碼分流。 七支技能改為併行執行:例行稽核從九步併成七步,技能盤點併成六步。 技能盤點不再重跑盤點腳本內部已經跑過的三支腳本, 而那三支原本兼作獨立交叉檢查,拿掉就少一層保護, 所以把少掉的是什麼、風險由誰擋住,明白寫進 Notes,不當作沒發生。
8.6 KiB
name, description
| name | description |
|---|---|
| skill-new | Create a new skill in the jsc skill set. Prefetch the skill list and the domain list in parallel, ask skill details via decision tree, generate the skill under the right jsc-{domain} per guidelines.md (create the domain from the template repo if missing), open a PR via jsc-git pr, then deploy and verify per references/deploy-verify.md from a fresh CLI process, and append the change report to wiki SKILLSET_{HASH}. Use when the user wants to add a skill; not for editing an existing one (use skill-update). |
skill-new — create a skill
Single source of guidelines: ../../references/guidelines.md.
Flow
-
Collect the decision tree's inputs first, then ask:
-
Prefetch both inputs — run
tools/list-skills.shandtools/sync-domains.shin parallel. They share no data, and both answers are needed before the first question, so running them after the questions only makes the user wait. Route each exit code:list-skills.shexit 0 — keep thedomain<TAB>name<TAB>descriptionrows. Exit 1 — the root could not be derived, the domain list was unreadable, or no skill was found; read stderr and fix the named cause. When stderr says the root could not be derived, setJSC_PLUGINS_ROOTto the directory that holds the domain repos and rerun: under a plugin install the script sits in the CLI's plugin cache, so its built-in guess lands in that cache instead of the domain workspace.sync-domains.shexit 0 — the only code that means every repo is present and current; keep thedomain<TAB>pathrows. Exit 3 — some repos were not updated: reconcile every path named on stderr (commit or stash the dirty tree, or fix the failing pull) and rerun; when the user confirms a dirty tree is intentional local work, record that decision and continue on the local version. Exit 2 — a domain could not be cloned. Exit 1 — the root could not be derived,gitea.shwas not found, or the canonical marketplace was unreadable; for the root case setJSC_PLUGINS_ROOTas above and rerun. Resolve 2 and 1 before continuing.
Completion condition: the skill rows and the
domain<TAB>pathrows are both in hand. -
Ask for skill details via the
jsc-ask:askdecision tree until no doubt remains:- Goal (single and not duplicating an existing skill; show the similar skills from the step 1.1 rows for comparison — options must state the impact scope of "reuse existing" versus "create new")
- Trigger (when to use, when not to, trigger keywords)
- Input and output (can a standard input/output flow move down to
tools/; does it need Gitea operations — if so, make the skill usejsc-gitea/tools/gitea.sh+ token) - Owning domain (offer the domain list from the step 1.1
domain<TAB>pathrows — the domains registered in the canonical marketplace)
Completion condition: goal, trigger, input/output and owning domain each have a recorded answer.
-
-
If the domain does not exist (
tools/sync-domains.shclones every domain registered in the marketplace, so a missing directory means the domain is unregistered — the repository itself may already exist on Gitea):-
Propose one short English word for the new domain (a single word preferred) and confirm it with the user. Completion condition: the user confirms the domain word.
-
Check before creating: run
jsc-gitea/tools/gitea.sh clone-url plugins/{domain}. A URL comes back when the repository already exists — clone it, skip creation, and go on to step 2.3 to fill in whatever content is missing. Only when no URL comes back create the repository through the tool, never by hand:gitea.sh api POST /orgs/plugins/reposwhenpluginsis an organization,POST /user/reposwhenpluginsis the token's own account (tea repo createdoes the same job). Only when the call is refused (403 — the token has write but not admin rights on the owner) ask the user to createplugins/{domain}by hand, then continue. Completion condition:gitea.sh clone-url plugins/{domain}prints a URL and cloning it succeeds. -
Build the content following the structure of
https://gitea.jsc.idv.tw/plugins/template: three plugin manifests (plugin namejsc-{domain}, version starting at0.0.1),skills/, README.md, AGENTS.md. Completion condition: the three manifests,skills/, README.md and AGENTS.md all exist in the new repo. -
Register the plugin: run
tools/sync-marketplace.sh {domain} {repo-url} {description}. It needspython3on PATH — it edits the marketplace JSON with the json module. It writes the entry into both canonical marketplace files inplugins/metaand copies both into every domain repo, so any repo works as the registration entry point. Route each exit code:- Exit 3 — written, but some domain repo is not present locally. Run
tools/sync-domains.sh, then rerun this step. - Exit 2 — usage error. Fix the three arguments and rerun.
- Exit 1 — the root could not be derived, python3 is missing, a canonical file was unreadable, or copies differ byte for byte. Read stderr and fix the named cause: install python3 for the second; for the root case set
JSC_PLUGINS_ROOTto the directory that holds the domain repos, because under a plugin install the script sits in the CLI's plugin cache and its built-in guess lands there. Then rerun. - Exit 0 — every copy holds identical bytes; the script verifies that itself.
Completion condition: the script exits 0 and prints the touched paths.
- Exit 3 — written, but some domain repo is not present locally. Run
-
-
Generate the skill per guidelines.md — this step MUST run as a sub agent:
skills/{name}/SKILL.md: entirely in English (description within either cap — ≤ 5 sentences or ≤ 5 steps — and stating when to use and when not to; body in STE100-style English)- Rules enforceable by hooks go to
jsc-hooks(never scattered in this domain); standard input/output flows go totools/
Then run
tools/sync-skill-manifest.sh {domain-path}directly (no sub agent needed) to sync the domain README's 「Skills 目錄」 section and bump the version in all three manifests. Route each exit code: 0 — the README block and all three manifests are synced; 1 — the domain path,skills/,README.md, theJSC-SKILLSmarkers, aSKILL.md, a manifest, or a manifestversionfield is missing, so fix the named cause on stderr and rerun; 2 — usage error, the script takes exactly one argument; any other code — the script runs underset -e, so treat it as an environment fault and stop, never as a successful sync. Completion condition:skills/{name}/SKILL.mdexists, the README lists the skill, and all three manifests show the same new version. -
Self-check every item of the guidelines.md audit checklist; fix anything that fails. Completion condition: every checklist item passes.
-
Call
jsc-git:prto open a Push Request. Completion condition: a PR URL comes back and is reported with the table format in../../references/pr-report.md. -
Deploy the new skill, verify it runs, then report:
- Follow
../../references/deploy-verify.mdfrom section 1 to section 5:tools/deploy-route.sh {domain-path}picks the route, the deploy route or the worktree route runs, and the verification then runs in a fresh CLI process, never in the session that ran the deploy. That session raised the restart gate itself and still holds the old skill body, so verifying inside it either gets blocked or passes on stale behavior. Verify the added skill's row intools/list-skills.sh, every tool the skill added, and one minimal prompt per checkable CLI — the per-CLI prompts run in parallel. Completion condition: every completion condition indeploy-verify.mdsections 1 to 5 holds for this domain repo. - Write the change report to wiki page
SKILLSET_{HASH}— this part MUST run as a sub agent. Calljsc-gitea:wiki;{HASH}comes from the{owner}/{repo}of the domain repo that gained the skill, and the wiki repo resolves throughJSC_WIKI_REPO_SKILLSETfirst, thenJSC_WIKI_REPO. Append a section for this change — date, 「新增」, skill name, changed files, PR URL, the step 6.1 route verdict and verification result per item — and keep every earlier section. Add the page toSKILLSET_CONTENTSwhen it is new. When the write fails — no{owner}/{repo}resolves, orjsc-gitea:wikireports an API error — hand the page name and the unwritten entry back to the user and leave this step open; never close the flow on an unwritten report. Completion condition: the page holds the new section plus all earlier sections, andSKILLSET_CONTENTSlinks it.
- Follow