Merge develop

三份 manifest 取分支上的較高版號:develop 那邊到 0.3.6,這條分支本來就是為了
讓開那一號才升到 0.3.7,取低的等於把版號往回退。

行為清單第 10 行兩邊各改了同一行的不同地方,合起來留:develop 加的是委派
清單檢核多判一種填錯的 probe、以及修法要回該技能的存取庫核對過再改寫;這條
分支加的是第一組多跑一項腳本路徑檢查。兩件事互不相干,取任一邊都會弄丟另
一邊。外部呼叫那一行 develop 沒動過,直接取分支上的。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 11:29:00 +08:00
co-authored by Claude Opus 5
9 changed files with 209 additions and 78 deletions
+80 -13
View File
@@ -4,12 +4,13 @@
# 用法: check-delegate.sh [<plugins-root>]
# 不給參數就交給 tools/plugins-root.sh 推導根目錄,判準與 list-skills.sh 完全相同。
#
# 檢查四項:
# 檢查五項:
# 1. 一一對應 — 清單一支技能一列,跟 list-skills.sh 的實際技能不多不少,也不重複。
# 2. 欄位齊全 — 11 欄,每一欄非空;四種結論各自的必填欄位都填了,不該填的填 -。
# 2. 欄位齊全 — 12 欄,每一欄非空;四種結論各自的必填欄位都填了,不該填的填 -。
# 3. 欄位可填值 — verdict、way、trigger、recur、origin 只認固定詞彙;next 要指到
# 一支真的存在的技能。指到不存在的技能,助理會一路重試一支叫不出來的東西。
# 4. 版本號與來源 — 只印提示,不影響結束碼,理由見下。
# 4. 唯讀指令 — probe 的填法與那一支腳本在不在,判準見下。
# 5. 版本號與來源 — 只印提示,不影響結束碼,理由見下。
#
# 為什麼要這支: 技能組每天在動,手工盤點只會過期。清單缺一列,助理就永遠不知道那支技能
# 存在;清單多一列,助理會去觸發一支不存在的技能,而且失敗不會自動暫停。這兩件事靠眼睛
@@ -23,11 +24,25 @@
# 知道它待複核。它是「已經有結論、但要再確認一次」,不是「漏填」。列成缺失會讓清單從
# 第一天就是紅的,紅到全部複核完為止,這段期間所有真的缺失都會被蓋掉。
#
# probe 什麼算缺失、什麼只算提示: 缺失的判準只有一條——這一列照著跑,無人值守那一輪會出事。
# 四種算缺失:
# 一、way 含 invoke 或這一列不交,probe 卻填了指令。種入那一支會改拿指令當待辦簿的動作,
# 整支交出於是變成只跑一支腳本,那支技能該寫的頁一頁都不會寫,而且看起來完全正常。
# 二、way 只有 patrol 或 remind,probe 卻是減號。那幾列的動作原本一律退回只提醒,
# 等於判過要交、實際什麼都沒交出去。接不上就寫 pending 並講明理由,別留減號。
# 三、指令裡有金錢符號或波浪號,或用了 root、cli、repo 以外的代入點。前者在無人值守
# 那一輪解不出來也進不了允許清單,後者代不進去會原樣送進指令,兩種都是靜靜失敗。
# 四、指令指到的腳本在本機不存在。助理每一輪都會叫不到它,而失敗不會自動暫停。
# 兩種只算提示:
# 一、pending:{理由}。入口還沒接上是判過的結論,跟 origin=seed 同一類,不是漏填。
# 二、指令指到的 domain 本機沒有裝。那是這台機器少裝一個 domain,不是清單填錯——
# 算成缺失的話,只裝半套的機器每一輪都亮紅,真的填錯反而看不見。
#
# 輸出: 缺失一行一個,格式 {清單路徑}:{domain}/{name}:{說明}(stderr);
# 提示同格式(stdout),讓呼叫端分得開缺失與提示;統計摘要走 stderr。
# 結束碼: 0=清單與實際技能一一對應、必填欄位齊全(可能帶提示,提示不影響這一碼)
# 1=缺列、多列、重複列、欄位空著、欄位值不合法,或 next 指到不存在的技能,
# 清單在 stderr
# 1=缺列、多列、重複列、欄位空著、欄位值不合法、next 指到不存在的技能,
# 或 probe 填錯欄位、指到不存在的腳本、用了認不得的代入點,清單在 stderr
# 2=用法錯誤(本腳本最多吃一個參數)
# 3=找不到 tools/delegate-spec.tsv、推導不出根目錄,或列不出任何技能——
# **什麼都沒查**,不等於通過
@@ -63,8 +78,9 @@ TAB=$(printf '\t')
cut -f1,2 "$TMPD/raw.txt" | LC_ALL=C sort > "$TMPD/skills.txt"
[ -s "$TMPD/skills.txt" ] || { echo "掃不到任何技能:$ROOT" >&2; exit 3; }
# 各 domain 的現行版本號。domain 名以 plugin.json 的 name 為準,checkout 目錄名只是退路:
# 目錄名是誰 clone 誰決定的,換一台機器就可能叫別的名字。
# 各 domain 的現行版本號與本機目錄。domain 名以 plugin.json 的 name 為準,checkout 目錄名
# 只是退路:目錄名是誰 clone 誰決定的,換一台機器就可能叫別的名字。第三欄記那個目錄,
# probe 要拿它把 {root}/jsc-{domain} 換成本機的實際位置,才驗得到腳本在不在。
: > "$TMPD/versions.txt"
for p in "$ROOT"/*/plugin.json; do
[ -f "$p" ] || continue
@@ -75,7 +91,7 @@ for p in "$ROOT"/*/plugin.json; do
*) continue ;;
esac
[ -n "$v" ] || continue
printf '%s\t%s\n' "${n#jsc-}" "$v" >> "$TMPD/versions.txt"
printf '%s\t%s\t%s\n' "${n#jsc-}" "$v" "${p%/plugin.json}" >> "$TMPD/versions.txt"
done
# 清單資料列:# 開頭的註解與空行都不算。
@@ -112,7 +128,7 @@ while IFS="$TAB" read -r d n; do
report "$d/$n" '清單多這一列,本機沒有這支技能。請刪掉,否則助理會去觸發叫不出來的技能'
done < "$TMPD/extra.txt"
# --- 2~4. 逐列查欄位。多出來的列上面已經報過,這裡跳過,同一個缺陷不印兩遍。 ---
# --- 2~5. 逐列查欄位。多出來的列上面已經報過,這裡跳過,同一個缺陷不印兩遍。 ---
awk -F"$TAB" \
-v SPEC="$SPEC" -v SKILLS="$TMPD/skills.txt" -v VERS="$TMPD/versions.txt" \
-v FAILS="$TMPD/fail-row.txt" -v HINTS="$TMPD/hint.txt" '
@@ -139,23 +155,44 @@ function trig_ok(t, e) {
if (t ~ /^after:..*$/) { e = substr(t, 7); sub(/:.*$/, "", e); return (e in EV) }
return 0
}
# probe 裡認不得的代入點,回傳第一個;全部認得回傳空字串。認不得的代入點代不進去,
# 會原樣送進指令,於是那一輪安安靜靜跑錯東西。
function ph_bad(s, t, p) {
t = s
while (match(t, /\{[^}]*\}/)) {
p = substr(t, RSTART + 1, RLENGTH - 2)
if (!(p in PH)) return p
t = substr(t, RSTART + RLENGTH)
}
return ""
}
# probe 的第一個非環境變數指派詞,也就是腳本路徑本身。
function script_of(s, n, a, i) {
n = split(s, a, " ")
for (i = 1; i <= n; i++) {
if (a[i] ~ /^[A-Za-z_][A-Za-z0-9_]*=/) continue
return a[i]
}
return ""
}
BEGIN {
split("full slice cond none", a, " "); for (i in a) VERDICT[a[i]] = 1
split("invoke patrol remind", b, " "); for (i in b) WAY[b[i]] = 1
split("seed judged", c, " "); for (i in c) ORIGIN[c[i]] = 1
split("worklog-written wp-merged stage-entered analyze-completed hook-error session-start session-end", \
d, " "); for (i in d) EV[d[i]] = 1
split("root cli repo", e, " "); for (i in e) PH[e[i]] = 1
}
FILENAME == SKILLS { sk[$1 "\t" $2] = 1; next }
FILENAME == VERS { cur[$1] = $2; next }
FILENAME == VERS { cur[$1] = $2; ddir[$1] = $3; next }
{
key = $1 "/" $2
if (NF != 11) { bad(key, "這一列有 " NF " 欄,合約規定 11 欄"); next }
if (NF != 12) { bad(key, "這一列有 " NF " 欄,合約規定 12 欄"); next }
if (!(($1 "\t" $2) in sk)) next
verdict = $3; way = $4; slice = $5; human = $6
trig = $7; rec = $8; nxt = $9; ver = $10; org = $11
trig = $7; rec = $8; nxt = $9; ver = $10; org = $11; probe = $12
for (i = 1; i <= 11; i++)
for (i = 1; i <= 12; i++)
if ($i == "") bad(key, "第 " i " 欄是空的。TSV 沒有空格這種值,不填就寫一個減號")
if (!(verdict in VERDICT)) {
@@ -202,6 +239,36 @@ FILENAME == VERS { cur[$1] = $2; next }
if (ver !~ /^[0-9]+(\.[0-9]+)*$/) bad(key, "version 要是 plugin 版本號,實際是「" ver "」")
else if (($1 in cur) && vlt(ver, cur[$1]))
hint(key, "判定時記的版本號 " ver " 落後 jsc-" $1 " 現行的 " cur[$1] ",要複判")
# --- probe:那一段唯讀盤點實際要跑的指令。判準見檔頭「什麼算缺失、什麼只算提示」。 ---
if (verdict == "none" || way ~ /(^|,)invoke(,|$)/) {
if (probe != "-")
bad(key, "way 含 invoke 或這一列不交,probe 要寫 -,實際是「" probe "」。填了指令,種入那一支會改拿指令當動作,整支交出就變成只跑一支腳本")
} else if (probe == "-") {
bad(key, "way 只有 patrol 或 remind,probe 不可以是 -:沒有指令的那幾筆一律退回只提醒,等於判過要交卻什麼都沒交出去。接不上就寫 pending:{理由}")
}
if (probe ~ /^pending:/) {
if (probe == "pending:") bad(key, "pending 後面要寫不接的理由,留白的話下一輪分不出是刻意還是漏填")
else hint(key, "probe=" probe ":唯讀盤點的入口還沒接上,待接線")
} else if (probe != "-") {
if (probe ~ /[$~]/)
bad(key, "probe 裡有金錢符號或波浪號,實際是「" probe "」。那兩種寫法在無人值守那一輪解不出來,也進不了允許清單,會被靜靜擋掉")
p2 = ph_bad(probe)
if (p2 != "")
bad(key, "probe 用了認不得的代入點「{" p2 "}」,只認 {root}、{cli}、{repo}。代不進去的字面值會原樣送進指令")
sp = script_of(probe)
if (sp !~ /^\{root\}\/jsc-[a-z0-9-]+\/..*$/)
bad(key, "probe 的腳本路徑要寫成 {root}/jsc-{domain}/… ,實際是「" sp "」")
else {
pd = sp; sub(/^\{root\}\/jsc-/, "", pd); sub(/\/.*$/, "", pd)
rest = sp; sub(/^\{root\}\/jsc-[a-z0-9-]+\//, "", rest)
if (!(pd in ddir))
hint(key, "probe 指到的 jsc-" pd " 本機沒有裝,這一列的腳本這一次驗不到")
else if (system("test -f '\''" ddir[pd] "/" rest "'\''") != 0)
bad(key, "probe 指到的腳本不存在:" ddir[pd] "/" rest "。助理每一輪都會叫不到它,而失敗不會自動暫停")
}
}
}
' "$TMPD/skills.txt" "$TMPD/versions.txt" "$TMPD/rows.txt"
+64 -36
View File
@@ -7,7 +7,7 @@
# 有被各 CLI 的技能驗證擋掉的風險。新增或刪除技能時同時補上或刪掉這一列,
# tools/check-delegate.sh 才對得起來;缺列的技能,助理永遠不知道它存在。
#
# 欄位:domain<TAB>name<TAB>verdict<TAB>way<TAB>slice<TAB>human<TAB>trigger<TAB>recur<TAB>next<TAB>version<TAB>origin
# 欄位:domain<TAB>name<TAB>verdict<TAB>way<TAB>slice<TAB>human<TAB>trigger<TAB>recur<TAB>next<TAB>version<TAB>origin<TAB>probe
# domain 技能所屬 domain,去掉開頭的 jsc-。形狀比照 list-skills.sh 第一欄
# name 技能名。形狀比照 list-skills.sh 第二欄,兩欄合起來就是一支技能的身分
# verdict full=全交 slice=切片交 cond=條件式交 none=不交
@@ -35,39 +35,67 @@
# 當成缺失的話每次發版整個 domain 都亮紅,提示很快就被當雜訊忽略
# origin seed=依既有盤點種入、待複核 judged=正式走過決策樹判定。
# seed 只印成待複核提示,不算缺失;技能有異動時就地走一次決策樹,轉成 judged
# probe 那一段唯讀盤點實際要跑的指令。只認三種寫法:
# 一、一行指令。腳本路徑一律寫成 {root}/jsc-{domain}/… 開頭。{root} 是種入那一支
# 拿到的字面絕對根目錄,由它自己代入;那一層的目錄名以 jsc-{domain} 為準,
# 找不到就退回不帶前綴的 {domain},比照它找這一份清單本身的作法。
# 指令裡不可以出現金錢符號或波浪號:那兩種寫法在無人值守那一輪解不出來,
# 也進不了允許清單,會被靜靜擋掉。要帶環境變數就寫在指令最前面,
# 例如 JSC_READONLY=1。另外兩個代入點,一個目標跑一次:{cli} 是助理偵測到的
# CLI 代號,{repo} 是助理掃到的存取庫工作目錄。這三個以外的大括號一律算填錯——
# 代不進去的字面值會原樣送進指令。
# 填之前一定要真的跑一次那一行,不能照技能文件的措辭抄。實際踩過兩次:
# 一次抄來的子命令那支腳本根本沒有,跑起來是用法錯誤;一次抄來的子命令會
# 在標準輸入沒人關閉時無限等待,換成同一支的另一個子命令才回得來。兩種都
# 不會在種入那一刻報錯,要等無人值守那一輪才發作,而那一輪沒有人在看。
# 二、pending:{理由}。這一段切得出唯讀盤點,入口還沒接上;冒號後面寫不接的理由,
# 留白的話下一輪分不出是刻意還是漏填。
# 三、-。這一列沒有唯讀盤點入口。
# 哪一種列填哪一種:way 含 invoke 的列與不交的列一律填 -。觸發的意思是呼叫整支
# 技能,這一欄填了指令會讓種入那一支改拿指令當待辦簿的動作,於是整支交出變成
# 只跑一支腳本,那支技能該寫的頁一頁都不會寫,而且看起來完全正常。way 只有
# patrol 或 remind 的列一定要有值:那幾列的動作原本一律退回只提醒,有值才有
# 事情做。
# 為什麼要連網的先不填:連網要金鑰,金鑰一過期就讓那一項每輪失敗,或每輪靜靜
# 回報沒事——後者更難查。純本機讀取本來一輪都不會失敗。先填會連網的那一種,等於
# 用一批每輪報錯的項目把真的發現蓋掉。所以要連網的先寫 pending,理由寫清楚,
# 等入口與金鑰都有著落再換成指令。
# 檢核怎麼看:pending 只印成待接線提示,不算缺失,同 origin=seed 那一條——它是
# 「判過、知道還沒接」,不是漏填。填錯欄位、指到不存在的腳本、用了認不得的
# 代入點,都算缺失。
#
ask ask slice patrol 唯讀查 QUESTION_CONTENTS,確認要交辦的事是不是早就有答案 問答本身。助理在背景問不到人,沒有人在場就收不到答案 at:now every:1d jsc-gitea:wiki 0.1.3 seed
assist assistant none - - 助理本身。讓它自我發動,一輪巡檢會在背景又叫起另一輪,誰都停不下來 - - jsc-log:stats 0.1.6 seed
cli delegate cond invoke 條件是這一項任務唯讀:唯讀巡檢可以委派給別支 CLI,省當前 CLI 的額度。條件不成立,也就是會改檔案的任務,一律不委派;委派失敗就退回自己跑 判斷哪一項算唯讀、額度要不要省,還有委派給哪一支 CLI at:now every:1d jsc-log:stats 0.3.4 seed
cli deploy slice remind 遠端有新版就提醒 安裝、更新、卸除、要求重啟 at:now every:1d jsc-hooks:hooks-install 0.3.4 seed
cli doctor cond invoke 條件式:只有在 doctor 呼叫自家 tools/ 與 templates/ 的路徑不再帶版本號之後才可以交。交出的那一段是定期整輪健檢、寫 CHECK_{HASH}。條件不成立時的行為:一律不交,維持人在現場叫用 修——那是 jsc-cli:setup,逐項確認。另外,條件沒滿足之前整支都留在人手上:doctor 自家腳本走的是 CLI 載入技能時給的外掛基底目錄,那條路徑帶版本號、進不了允許清單,無人值守的每一輪都會無聲卡在第一支腳本 at:now every:7d jsc-cli:setup 0.3.4 seed
cli models slice invoke 定期跑 model-tags.sh sync 重建能力標籤表,並盤點各 CLI 可用模型 換模型、改設定 at:now every:7d jsc-cli:doctor 0.3.4 seed
cli setup none - - 改設定與接線,要逐項確認 - - jsc-cli:doctor 0.3.4 seed
git commit none - - 對外不可逆 - - jsc-git:pr 0.1.5 seed
git pr none - - 對外不可逆 - - jsc-log:worklog 0.1.5 seed
gitea html-export none - - 要人指定是哪一頁或哪一個議題。助理在背景猜不到,猜錯就匯出別人的頁 - - jsc-gitea:html-style 0.2.5 seed
gitea html-style none - - 版型與樣式是使用者的偏好,要逐項確認才寫得下去 - - jsc-gitea:html-export 0.2.5 seed
gitea repo-sync slice patrol 盤點哪些存取庫落後遠端、哪些還沒同步下來 clone 與 update——會動工作目錄 at:now every:1d jsc-git:pr 0.2.5 seed
gitea wiki none - - 助理的手腳,不獨立排程。助理所有 wiki 讀寫都經過它,一律附加 - - jsc-gitea:html-export 0.2.5 seed
gitea wiki-to-issue none - - 對外不可逆 - - jsc-sdlc:analyze 0.2.5 seed
hooks hooks-install slice patrol wire-cli.sh status 唯讀盤點接線 重新接線 at:now every:1d jsc-hooks:repair 0.4.4 seed
hooks repair slice invoke 巡檢抓到 hook 錯誤就發動修復 診斷、改哪一支、開 PR,全照 repair 自己的流程 after:hook-error every:1h jsc-git:pr 0.4.4 seed
log learn slice patrol 發動技能前先查過去教訓,也就是 consult 那一段 記錄教訓的判斷。哪一次值得留下來要人說 at:now every:1d jsc-log:worklog 0.1.9 seed
log report slice invoke 週期到了就產週報、月報、年報 報告要不要改寫、要不要送人看 at:now every:7d jsc-log:learn 0.1.9 seed
log stats full invoke - - at:now every:7d jsc-log:report 0.1.9 seed
log worklog slice patrol,remind 任務結束時收口計時與 token,補進 worklog-pending;該寫沒寫就催 寫日誌本體——狀態、細節、難處要人給 after:session-end every:1h jsc-log:learn 0.1.9 seed
meta skill-check cond invoke 條件是只交機械檢核那一段:腳本語法、manifest 版本一致、README 技能清單與實際技能對得上。條件不成立的那一段,也就是語意審查與流程效率判斷,一律不交,那要讀完整份 SKILL.md 語意審查、流程與成本效率判斷,還有要不要套用建議 at:now every:7d jsc-meta:skill-update 0.3.1 seed
meta skill-delete none - - 改技能組本身,等於助理改自己 - - jsc-meta:skill-check 0.3.1 seed
meta skill-new none - - 改技能組本身,等於助理改自己 - - jsc-meta:skill-check 0.3.1 seed
meta skill-update none - - 改技能組本身,等於助理改自己 - - jsc-meta:skill-check 0.3.1 seed
meta skillset-update none - - 改技能組本身,等於助理改自己 - - jsc-meta:skill-check 0.3.1 seed
meta ste100-sync slice patrol,remind 定期比對上游版本,落後就提醒 套用上游變更 at:now every:7d jsc-meta:skill-check 0.3.1 seed
meta tooling-guide full invoke - - at:now every:7d jsc-meta:skill-check 0.3.1 seed
pkg pkg-update slice patrol 用 list-packages.sh、latest-version.sh 唯讀盤點落後最新穩定版的套件 升版、跑建置與測試 at:now every:7d jsc-review:code-review 0.1.0 seed
review api-doc none - - 審查要判斷,判準要讀完整份文件與程式碼;助理在背景判不出來 - - jsc-git:pr 0.1.3 seed
review code-review none - - 審查要判斷,而且要不要照著改由呼叫端決定 - - jsc-review:api-doc 0.1.3 seed
review comment-cleanup none - - 會改專案檔案 - - jsc-git:commit 0.1.3 seed
sdlc analyze slice patrol,remind 盤點 ANALYZE_CONTENTS 未完成的分析並先把選項清單備好;另巡檢分析頁勾選與工作包議題狀態對不對得上 分析本體全部要決策。勾選與議題對不上時要對齊哪一邊,是真實來源衝突,也要人判 at:now every:1d jsc-sdlc:implement 0.3.2 seed
sdlc implement slice patrol,remind wp-gate.sh check-deps 盤點哪些工作包可以開始;階段鎖殘留就提醒 挑工作包、寫程式碼、開 PR。鎖檔不自己刪 at:now every:1d jsc-log:worklog 0.3.2 seed
sdlc maintain none - - 核心是決策與寫程式碼 - - jsc-log:worklog 0.3.2 seed
sdlc plan slice patrol,remind 盤點 PLAN_CONTENTS 還沒分析的計畫,先把選項清單備好 規劃本體全部要決策 at:now every:1d jsc-sdlc:analyze 0.3.2 seed
ask ask slice patrol 唯讀查 QUESTION_CONTENTS,確認要交辦的事是不是早就有答案 問答本身。助理在背景問不到人,沒有人在場就收不到答案 at:now every:1d jsc-gitea:wiki 0.1.3 seed pending:要連 wiki 讀 QUESTION 目錄頁,得帶金鑰
assist assistant none - - 助理本身。讓它自我發動,一輪巡檢會在背景又叫起另一輪,誰都停不下來 - - jsc-log:stats 0.1.6 seed -
cli delegate cond invoke 條件是這一項任務唯讀:唯讀巡檢可以委派給別支 CLI,省當前 CLI 的額度。條件不成立,也就是會改檔案的任務,一律不委派;委派失敗就退回自己跑 判斷哪一項算唯讀、額度要不要省,還有委派給哪一支 CLI at:now every:1d jsc-log:stats 0.3.4 seed -
cli deploy slice remind 遠端有新版就提醒 安裝、更新、卸除、要求重啟 at:now every:1d jsc-hooks:hooks-install 0.3.4 seed pending:查遠端發佈版本要連 Gitea 並帶金鑰
cli doctor cond invoke 條件式:只有在 doctor 呼叫自家 tools/ 與 templates/ 的路徑不再帶版本號之後才可以交。交出的那一段是定期整輪健檢、寫 CHECK_{HASH}。條件不成立時的行為:一律不交,維持人在現場叫用 修——那是 jsc-cli:setup,逐項確認。另外,條件沒滿足之前整支都留在人手上:doctor 自家腳本走的是 CLI 載入技能時給的外掛基底目錄,那條路徑帶版本號、進不了允許清單,無人值守的每一輪都會無聲卡在第一支腳本 at:now every:7d jsc-cli:setup 0.3.4 seed -
cli models slice invoke 定期跑 model-tags.sh sync 重建能力標籤表,並盤點各 CLI 可用模型 換模型、改設定 at:now every:7d jsc-cli:doctor 0.3.4 seed -
cli setup none - - 改設定與接線,要逐項確認 - - jsc-cli:doctor 0.3.4 seed -
git commit none - - 對外不可逆 - - jsc-git:pr 0.1.5 seed -
git pr none - - 對外不可逆 - - jsc-log:worklog 0.1.5 seed -
gitea html-export none - - 要人指定是哪一頁或哪一個議題。助理在背景猜不到,猜錯就匯出別人的頁 - - jsc-gitea:html-style 0.2.5 seed -
gitea html-style none - - 版型與樣式是使用者的偏好,要逐項確認才寫得下去 - - jsc-gitea:html-export 0.2.5 seed -
gitea repo-sync slice patrol 盤點哪些存取庫落後遠端、哪些還沒同步下來 clone 與 update——會動工作目錄 at:now every:1d jsc-git:pr 0.2.5 seed pending:repo-sync.sh 會 clone 與 pull,沒有唯讀子命令;盤點落後也要連遠端
gitea wiki none - - 助理的手腳,不獨立排程。助理所有 wiki 讀寫都經過它,一律附加 - - jsc-gitea:html-export 0.2.5 seed -
gitea wiki-to-issue none - - 對外不可逆 - - jsc-sdlc:analyze 0.2.5 seed -
hooks hooks-install slice patrol wire-cli.sh status 唯讀盤點接線 重新接線 at:now every:1d jsc-hooks:repair 0.4.4 seed JSC_READONLY=1 {root}/jsc-hooks/tools/wire-cli.sh status {cli}
hooks repair slice invoke 巡檢抓到 hook 錯誤就發動修復 診斷、改哪一支、開 PR,全照 repair 自己的流程 after:hook-error every:1h jsc-git:pr 0.4.4 seed -
log learn slice patrol 發動技能前先查過去教訓,也就是 consult 那一段 記錄教訓的判斷。哪一次值得留下來要人說 at:now every:1d jsc-log:worklog 0.1.9 seed pending:要連 wiki 讀 LEARN 目錄頁,得帶金鑰
log report slice invoke 週期到了就產週報、月報、年報 報告要不要改寫、要不要送人看 at:now every:7d jsc-log:learn 0.1.9 seed -
log stats full invoke - - at:now every:7d jsc-log:report 0.1.9 seed -
log worklog slice patrol,remind 任務結束時收口計時與 token,補進 worklog-pending;該寫沒寫就催 寫日誌本體——狀態、細節、難處要人給 after:session-end every:1h jsc-log:learn 0.1.9 seed pending:worklog-pending.sh 七個子命令全部要先給工作階段雜湊,沒有不帶參數的盤點入口,掃不出「該寫沒寫」的那幾筆
meta skill-check cond invoke 條件是只交機械檢核那一段:腳本語法、manifest 版本一致、README 技能清單與實際技能對得上。條件不成立的那一段,也就是語意審查與流程效率判斷,一律不交,那要讀完整份 SKILL.md 語意審查、流程與成本效率判斷,還有要不要套用建議 at:now every:7d jsc-meta:skill-update 0.3.1 seed -
meta skill-delete none - - 改技能組本身,等於助理改自己 - - jsc-meta:skill-check 0.3.1 seed -
meta skill-new none - - 改技能組本身,等於助理改自己 - - jsc-meta:skill-check 0.3.1 seed -
meta skill-update none - - 改技能組本身,等於助理改自己 - - jsc-meta:skill-check 0.3.1 seed -
meta skillset-update none - - 改技能組本身,等於助理改自己 - - jsc-meta:skill-check 0.3.1 seed -
meta ste100-sync slice patrol,remind 定期比對上游版本,落後就提醒 套用上游變更 at:now every:7d jsc-meta:skill-check 0.3.1 seed pending:比對上游版本要連上游站台
meta tooling-guide full invoke - - at:now every:7d jsc-meta:skill-check 0.3.1 seed -
pkg pkg-update slice patrol 用 list-packages.sh、latest-version.sh 唯讀盤點落後最新穩定版的套件 升版、跑建置與測試 at:now every:7d jsc-review:code-review 0.1.0 seed {root}/jsc-pkg/tools/list-packages.sh {repo}
review api-doc none - - 審查要判斷,判準要讀完整份文件與程式碼;助理在背景判不出來 - - jsc-git:pr 0.1.3 seed -
review code-review none - - 審查要判斷,而且要不要照著改由呼叫端決定 - - jsc-review:api-doc 0.1.3 seed -
review comment-cleanup none - - 會改專案檔案 - - jsc-git:commit 0.1.3 seed -
sdlc analyze slice patrol,remind 盤點 ANALYZE_CONTENTS 未完成的分析並先把選項清單備好;另巡檢分析頁勾選與工作包議題狀態對不對得上 分析本體全部要決策。勾選與議題對不上時要對齊哪一邊,是真實來源衝突,也要人判 at:now every:1d jsc-sdlc:implement 0.3.2 seed pending:要連 wiki 讀 ANALYZE 目錄頁,得帶金鑰
sdlc implement slice patrol,remind wp-gate.sh check-deps 盤點哪些工作包可以開始;階段鎖殘留就提醒 挑工作包、寫程式碼、開 PR。鎖檔不自己刪 at:now every:1d jsc-log:worklog 0.3.2 seed {root}/jsc-hooks/hooks/sdlc-gate.sh wp-report
sdlc maintain none - - 核心是決策與寫程式碼 - - jsc-log:worklog 0.3.2 seed -
sdlc plan slice patrol,remind 盤點 PLAN_CONTENTS 還沒分析的計畫,先把選項清單備好 規劃本體全部要決策 at:now every:1d jsc-sdlc:analyze 0.3.2 seed pending:要連 wiki 讀 PLAN 目錄頁,得帶金鑰
1 # delegate-spec.tsv — jsc 技能組的委派判定清單。一支技能一列,記「這一支能不能交給背景助理」。
7 # 有被各 CLI 的技能驗證擋掉的風險。新增或刪除技能時同時補上或刪掉這一列,
8 # tools/check-delegate.sh 才對得起來;缺列的技能,助理永遠不知道它存在。
9 #
10 # 欄位:domain<TAB>name<TAB>verdict<TAB>way<TAB>slice<TAB>human<TAB>trigger<TAB>recur<TAB>next<TAB>version<TAB>origin # 欄位:domain<TAB>name<TAB>verdict<TAB>way<TAB>slice<TAB>human<TAB>trigger<TAB>recur<TAB>next<TAB>version<TAB>origin<TAB>probe
11 # domain 技能所屬 domain,去掉開頭的 jsc-。形狀比照 list-skills.sh 第一欄
12 # name 技能名。形狀比照 list-skills.sh 第二欄,兩欄合起來就是一支技能的身分
13 # verdict full=全交 slice=切片交 cond=條件式交 none=不交
35 # 當成缺失的話每次發版整個 domain 都亮紅,提示很快就被當雜訊忽略
36 # origin seed=依既有盤點種入、待複核 judged=正式走過決策樹判定。
37 # seed 只印成待複核提示,不算缺失;技能有異動時就地走一次決策樹,轉成 judged
38 # probe 那一段唯讀盤點實際要跑的指令。只認三種寫法:
39 # 一、一行指令。腳本路徑一律寫成 {root}/jsc-{domain}/… 開頭。{root} 是種入那一支
40 # 拿到的字面絕對根目錄,由它自己代入;那一層的目錄名以 jsc-{domain} 為準,
41 # 找不到就退回不帶前綴的 {domain},比照它找這一份清單本身的作法。
42 # 指令裡不可以出現金錢符號或波浪號:那兩種寫法在無人值守那一輪解不出來,
43 # 也進不了允許清單,會被靜靜擋掉。要帶環境變數就寫在指令最前面,
44 # 例如 JSC_READONLY=1。另外兩個代入點,一個目標跑一次:{cli} 是助理偵測到的
45 # CLI 代號,{repo} 是助理掃到的存取庫工作目錄。這三個以外的大括號一律算填錯——
46 # 代不進去的字面值會原樣送進指令。
47 # 填之前一定要真的跑一次那一行,不能照技能文件的措辭抄。實際踩過兩次:
48 # 一次抄來的子命令那支腳本根本沒有,跑起來是用法錯誤;一次抄來的子命令會
49 # 在標準輸入沒人關閉時無限等待,換成同一支的另一個子命令才回得來。兩種都
50 # 不會在種入那一刻報錯,要等無人值守那一輪才發作,而那一輪沒有人在看。
51 # 二、pending:{理由}。這一段切得出唯讀盤點,入口還沒接上;冒號後面寫不接的理由,
52 # 留白的話下一輪分不出是刻意還是漏填。
53 # 三、-。這一列沒有唯讀盤點入口。
54 # 哪一種列填哪一種:way 含 invoke 的列與不交的列一律填 -。觸發的意思是呼叫整支
55 # 技能,這一欄填了指令會讓種入那一支改拿指令當待辦簿的動作,於是整支交出變成
56 # 只跑一支腳本,那支技能該寫的頁一頁都不會寫,而且看起來完全正常。way 只有
57 # patrol 或 remind 的列一定要有值:那幾列的動作原本一律退回只提醒,有值才有
58 # 事情做。
59 # 為什麼要連網的先不填:連網要金鑰,金鑰一過期就讓那一項每輪失敗,或每輪靜靜
60 # 回報沒事——後者更難查。純本機讀取本來一輪都不會失敗。先填會連網的那一種,等於
61 # 用一批每輪報錯的項目把真的發現蓋掉。所以要連網的先寫 pending,理由寫清楚,
62 # 等入口與金鑰都有著落再換成指令。
63 # 檢核怎麼看:pending 只印成待接線提示,不算缺失,同 origin=seed 那一條——它是
64 # 「判過、知道還沒接」,不是漏填。填錯欄位、指到不存在的腳本、用了認不得的
65 # 代入點,都算缺失。
66 #
67 ask
68 assist
69 cli
70 cli
71 cli
72 cli
73 cli
74 git
75 git
76 gitea
77 gitea
78 gitea
79 gitea
80 gitea
81 hooks
82 hooks
83 log
84 log
85 log
86 log
87 meta
88 meta
89 meta
90 meta
91 meta
92 meta
93 meta
94 pkg
95 review
96 review
97 review
98 sdlc
99 sdlc
100 sdlc
101 sdlc