發佈 jsc-gitea 0.0.5:認證缺值改詢問使用者、wiki 新增 LEARN 頁型 #8

Merged
admin merged 7 commits from develop into master 2026-08-24 08:26:59 +00:00
10 changed files with 51 additions and 28 deletions
+24 -10
View File
@@ -1,75 +1,89 @@
{ {
"name": "jsc", "name": "jsc",
"description": "jsc 跨 AI 助理技能組的統一 marketplace(claude / codex / copilot / antigravity / kiro)。",
"owner": {
"name": "JSC"
},
"plugins": [ "plugins": [
{ {
"name": "jsc-ask", "name": "jsc-ask",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/ask.git" "url": "https://gitea.jsc.idv.tw/plugins/ask.git"
} },
"description": "決策樹問詢與問詢紀錄(QUESTION_* wiki 頁)"
}, },
{ {
"name": "jsc-cli", "name": "jsc-cli",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/cli.git" "url": "https://gitea.jsc.idv.tw/plugins/cli.git"
} },
"description": "CLI 偵測、模型能力標籤與技能庫批次部署"
}, },
{ {
"name": "jsc-git", "name": "jsc-git",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/git.git" "url": "https://gitea.jsc.idv.tw/plugins/git.git"
} },
"description": "Commit 分組認可與 Push Request 建立"
}, },
{ {
"name": "jsc-gitea", "name": "jsc-gitea",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/gitea.git" "url": "https://gitea.jsc.idv.tw/plugins/gitea.git"
} },
"description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步"
}, },
{ {
"name": "jsc-hooks", "name": "jsc-hooks",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/hooks.git" "url": "https://gitea.jsc.idv.tw/plugins/hooks.git"
} },
"description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄"
}, },
{ {
"name": "jsc-log", "name": "jsc-log",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/log.git" "url": "https://gitea.jsc.idv.tw/plugins/log.git"
} },
"description": "工作日誌(LOG_* wiki 頁)與技能使用統計"
}, },
{ {
"name": "jsc-meta", "name": "jsc-meta",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/meta.git" "url": "https://gitea.jsc.idv.tw/plugins/meta.git"
} },
"description": "技能組自我管理:新建、更新、刪除技能與技能準則"
}, },
{ {
"name": "jsc-pkg", "name": "jsc-pkg",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/pkg.git" "url": "https://gitea.jsc.idv.tw/plugins/pkg.git"
} },
"description": "套件批次更新(nodejs/python/dotnet),失敗還原"
}, },
{ {
"name": "jsc-review", "name": "jsc-review",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/review.git" "url": "https://gitea.jsc.idv.tw/plugins/review.git"
} },
"description": "程式碼審查:Refactoring 壞味道六組 + 註解規範 + 淺模組"
}, },
{ {
"name": "jsc-sdlc", "name": "jsc-sdlc",
"source": { "source": {
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/sdlc.git" "url": "https://gitea.jsc.idv.tw/plugins/sdlc.git"
} },
"description": "開發生命週期:規劃/分析/實作/維護(wiki 追蹤)"
} }
] ]
} }
+1 -1
View File
@@ -59,7 +59,7 @@
"source": "url", "source": "url",
"url": "https://gitea.jsc.idv.tw/plugins/meta.git" "url": "https://gitea.jsc.idv.tw/plugins/meta.git"
}, },
"description": "技能組自我管理:新建/更新/刪除技能與技能準則" "description": "技能組自我管理:新建、更新、刪除技能與技能準則"
}, },
{ {
"name": "jsc-pkg", "name": "jsc-pkg",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jsc-gitea", "name": "jsc-gitea",
"version": "0.0.3", "version": "0.0.5",
"description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步", "description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步",
"skills": "./skills", "skills": "./skills",
"author": { "author": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jsc-gitea", "name": "jsc-gitea",
"version": "0.0.3", "version": "0.0.5",
"description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步", "description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步",
"skills": "./skills" "skills": "./skills"
} }
+3 -3
View File
@@ -26,7 +26,7 @@ gitea.sh repos <owner> # 列出 owner 的 repo 全名
gitea.sh default-branch <owner>/<repo> gitea.sh default-branch <owner>/<repo>
gitea.sh clone-url <owner>/<repo> gitea.sh clone-url <owner>/<repo>
gitea.sh hash-id <text> # 產生 8 碼大寫 SHA-1;首碼 0-9/A/B/C 時改成 Hxxxxxxx gitea.sh hash-id <text> # 產生 8 碼大寫 SHA-1;首碼 0-9/A/B/C 時改成 Hxxxxxxx
gitea.sh wiki-repo <TYPE> # 解析頁面類型的 wiki 位置(TYPE = QUESTION / PLAN / ANALYZE / MAINTAIN / REPO / LOG / ERROR) gitea.sh wiki-repo <TYPE> # 解析頁面類型的 wiki 位置(TYPE = QUESTION / PLAN / ANALYZE / MAINTAIN / REPO / LOG / LEARN / ERROR)
gitea.sh wiki-list <owner>/<repo> gitea.sh wiki-list <owner>/<repo>
gitea.sh wiki-get <owner>/<repo> <page> # 不存在 exit 4 gitea.sh wiki-get <owner>/<repo> <page> # 不存在 exit 4
gitea.sh wiki-put <owner>/<repo> <page> <file> # 自動判斷新建或更新 gitea.sh wiki-put <owner>/<repo> <page> <file> # 自動判斷新建或更新
@@ -44,7 +44,7 @@ check-wiki-rules.sh # 驗證 wiki repo 解析與 ha
### `wiki` ### `wiki`
Gitea wiki 頁讀寫的統一入口:依頁面類型(QUESTION / PLAN / ANALYZE / MAINTAIN / REPO / LOG / ERROR)解析 wiki 所在的 `{owner}/{repo}`,先讀對應的 `JSC_WIKI_REPO_{TYPE}`,再退回 `JSC_WIKI_REPO`,不同類型不可互相代用。頁面內容以圖表優先(mermaid 圖、markdown 表格),純文字為最後手段。 Gitea wiki 頁讀寫的統一入口:依頁面類型(QUESTION / PLAN / ANALYZE / MAINTAIN / REPO / LOG / LEARN / ERROR)解析 wiki 所在的 `{owner}/{repo}`,先讀對應的 `JSC_WIKI_REPO_{TYPE}`,再退回 `JSC_WIKI_REPO`,不同類型不可互相代用。頁面內容以圖表優先(mermaid 圖、markdown 表格),純文字為最後手段。
### `repo-sync` ### `repo-sync`
@@ -58,7 +58,7 @@ Gitea wiki 頁讀寫的統一入口:依頁面類型(QUESTION / PLAN / ANALYZ
| --- | --- | --- | | --- | --- | --- |
| `GITEA_HOST` | Gitea 站台(可省略 scheme,預設 https) | 詢問使用者 | | `GITEA_HOST` | Gitea 站台(可省略 scheme,預設 https) | 詢問使用者 |
| `GITEA_TOKEN` | Gitea API token;缺少或遇 401/403 時自動退回 tea CLI 登入 token | 詢問使用者 | | `GITEA_TOKEN` | Gitea API token;缺少或遇 401/403 時自動退回 tea CLI 登入 token | 詢問使用者 |
| `JSC_WIKI_REPO_{TYPE}` | 各類型 wiki 頁的 `{owner}/{repo}`;TYPE = QUESTION / PLAN / ANALYZE / MAINTAIN / REPO / LOG / ERROR | 退回 `JSC_WIKI_REPO`,不做跨類型代用 | | `JSC_WIKI_REPO_{TYPE}` | 各類型 wiki 頁的 `{owner}/{repo}`;TYPE = QUESTION / PLAN / ANALYZE / MAINTAIN / REPO / LOG / LEARN / ERROR | 退回 `JSC_WIKI_REPO`,不做跨類型代用 |
| `JSC_WIKI_REPO` | 共用預設的 wiki `{owner}/{repo}` | 詢問使用者 | | `JSC_WIKI_REPO` | 共用預設的 wiki `{owner}/{repo}` | 詢問使用者 |
## Hash 規則 ## Hash 規則
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jsc-gitea", "name": "jsc-gitea",
"version": "0.0.3", "version": "0.0.5",
"description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步", "description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步",
"skills": "./skills/" "skills": "./skills/"
} }
+6 -5
View File
@@ -7,11 +7,12 @@ description: Batch-sync all readable repos of a chosen Gitea owner into the work
## Steps ## Steps
1. Run `tools/gitea.sh owners` to list every `{owner}` the user can read. 1. Before calling `tools/gitea.sh`, resolve `GITEA_HOST` and `GITEA_TOKEN` from the current shell environment (also check `tea login list` for a usable login token when `GITEA_TOKEN` is unset). If `GITEA_HOST` is unresolvable, or `GITEA_TOKEN` is unset and no tea login token exists either, ask the user for the missing value per the `jsc-ask:ask` rules before proceeding to any `tools/gitea.sh` call.
2. Ask the user which `{owner}` to sync, per the `jsc-ask:ask` rules. Every option states the owner's repo count and impact scope. 2. Run `tools/gitea.sh owners` to list every `{owner}` the user can read.
3. Run `tools/gitea.sh repos {owner}` to list every readable `{repo}` under that owner. 3. Ask the user which `{owner}` to sync, per the `jsc-ask:ask` rules. Every option states the owner's repo count and impact scope.
4. Sync each `{repo}` one by one. This step **MUST run as a sub agent** (one sub agent per repo): 4. Run `tools/gitea.sh repos {owner}` to list every readable `{repo}` under that owner.
5. Sync each `{repo}` one by one. This step **MUST run as a sub agent** (one sub agent per repo):
1. Missing locally → `git clone` into the working directory (clone URL from `tools/gitea.sh clone-url`). 1. Missing locally → `git clone` into the working directory (clone URL from `tools/gitea.sh clone-url`).
2. Present locally → switch to `develop`, else `master` (or the result of `tools/gitea.sh default-branch`), then `git pull`. 2. Present locally → switch to `develop`, else `master` (or the result of `tools/gitea.sh default-branch`), then `git pull`.
3. Local file changes → create a branch from develop or master, commit via `jsc-git:commit`, push, then open a PR back to develop or master via `jsc-git:pr`. 3. Local file changes → create a branch from develop or master, commit via `jsc-git:commit`, push, then open a PR back to develop or master via `jsc-git:pr`.
5. Report the sync result for every repo: cloned, updated, PR created, or the failure reason. 6. Report the sync result for every repo: cloned, updated, PR created, or the failure reason.
+4 -4
View File
@@ -9,10 +9,10 @@ Every wiki operation in the jsc skill set goes through this skill. One entry poi
## Resolve the wiki location ## Resolve the wiki location
Different page types can live in different `{owner}/{repo}` repos, classified by page-name prefix: `QUESTION`, `PLAN`, `ANALYZE`, `MAINTAIN`, `REPO`, `LOG`, `ERROR`. Different page types can live in different `{owner}/{repo}` repos, classified by page-name prefix: `QUESTION`, `PLAN`, `ANALYZE`, `MAINTAIN`, `REPO`, `LOG`, `LEARN`, `ERROR`.
1. Before asking the user, inspect the current shell environment for the needed repo variables and Gitea connection variables: `JSC_WIKI_REPO_{TYPE}`, `JSC_WIKI_REPO`, `GITEA_HOST`, and `GITEA_TOKEN`. Use inherited shell values first; only ask when the needed repo cannot be resolved after that check. 1. Before asking the user, inspect the current shell environment for the needed repo variables and Gitea connection variables: `JSC_WIKI_REPO_{TYPE}`, `JSC_WIKI_REPO`, `GITEA_HOST`, and `GITEA_TOKEN` (also check `tea login list` for a usable login token when `GITEA_TOKEN` is unset). Use inherited shell values first; only ask when the needed repo or connection value cannot be resolved after that check. `GITEA_HOST` and `GITEA_TOKEN` are both covered by this ask-if-unresolvable rule, the same as the wiki-repo variables below.
2. Run `tools/gitea.sh wiki-repo {TYPE}` (TYPE = the page-name prefix). Allowed types are `QUESTION`, `PLAN`, `ANALYZE`, `MAINTAIN`, `REPO`, `LOG`, and `ERROR`. Resolution order is `JSC_WIKI_REPO_{TYPE}` first, then `JSC_WIKI_REPO`. Never borrow another type's repo. 2. Run `tools/gitea.sh wiki-repo {TYPE}` (TYPE = the page-name prefix). Allowed types are `QUESTION`, `PLAN`, `ANALYZE`, `MAINTAIN`, `REPO`, `LOG`, `LEARN`, and `ERROR`. Resolution order is `JSC_WIKI_REPO_{TYPE}` first, then `JSC_WIKI_REPO`. Never borrow another type's repo.
3. On exit 3 (neither is set after env inspection), ask the user for that page type's `{owner}/{repo}` per the `jsc-ask:ask` rules, and suggest setting `JSC_WIKI_REPO_{TYPE}` (can differ per type) or `JSC_WIKI_REPO` (shared default). 3. On exit 3 (neither is set after env inspection), ask the user for that page type's `{owner}/{repo}` per the `jsc-ask:ask` rules, and suggest setting `JSC_WIKI_REPO_{TYPE}` (can differ per type) or `JSC_WIKI_REPO` (shared default).
## Operations ## Operations
@@ -30,4 +30,4 @@ Different page types can live in different `{owner}/{repo}` repos, classified by
3. To update a contents page (`*_CONTENTS`): `wiki-get` it first, apply the template to append or modify, then `wiki-put` the whole page back. Never overwrite entries owned by others. 3. To update a contents page (`*_CONTENTS`): `wiki-get` it first, apply the template to append or modify, then `wiki-put` the whole page back. Never overwrite entries owned by others.
4. Write all wiki content in UTF-8 Traditional Chinese, per the STE100 output rule. 4. Write all wiki content in UTF-8 Traditional Chinese, per the STE100 output rule.
5. Prefer visual forms for page content: use mermaid diagrams (flowchart, sequence, gantt, pie) and markdown tables wherever the information allows. Plain running text is the last resort, kept short. 5. Prefer visual forms for page content: use mermaid diagrams (flowchart, sequence, gantt, pie) and markdown tables wherever the information allows. Plain running text is the last resort, kept short.
6. Authentication fallback is built into `tools/gitea.sh`: on a missing GITEA_TOKEN or a 401/403 response it retries with the tea CLI login token automatically, so only report an auth failure when both paths fail. 6. Authentication fallback is built into `tools/gitea.sh`: on a missing GITEA_TOKEN or a 401/403 response it retries with the tea CLI login token automatically. But before calling it, resolve `GITEA_HOST` and `GITEA_TOKEN` per rule 1: if `GITEA_HOST` is unresolvable, or `GITEA_TOKEN` is unset and no tea login token exists either, ask the user for the missing value per the `jsc-ask:ask` rules — same decision-tree pattern as the missing-wiki-repo case above — before calling `tools/gitea.sh`. Only report a genuine failure when the user has no answer to give or Gitea itself rejects the request (e.g. a 401/403 even after the tea fallback).
+8
View File
@@ -52,6 +52,14 @@ check_repo ANALYZE 'ANALYZE falls back to shared only' 'shared/wiki' \
JSC_WIKI_REPO_REPO='records/REPO' \ JSC_WIKI_REPO_REPO='records/REPO' \
JSC_WIKI_REPO='shared/wiki' JSC_WIKI_REPO='shared/wiki'
check_repo LEARN 'LEARN specific wins' 'lessons/LEARN' \
JSC_WIKI_REPO_LEARN='lessons/LEARN' \
JSC_WIKI_REPO='shared/wiki'
check_repo LEARN 'LEARN falls back to shared only' 'shared/wiki' \
JSC_WIKI_REPO_LOG='records/LOG' \
JSC_WIKI_REPO='shared/wiki'
check_repo ERROR 'ERROR uses its own repo' 'errors/wiki' \ check_repo ERROR 'ERROR uses its own repo' 'errors/wiki' \
JSC_WIKI_REPO_ERROR='errors/wiki' \ JSC_WIKI_REPO_ERROR='errors/wiki' \
JSC_WIKI_REPO='shared/wiki' JSC_WIKI_REPO='shared/wiki'
+2 -2
View File
@@ -7,7 +7,7 @@
# gitea.sh clone-url <owner>/<repo> # 印出 clone URL # gitea.sh clone-url <owner>/<repo> # 印出 clone URL
# gitea.sh hash-id <text> # 產生 8 碼大寫 SHA-1 hash;首碼為 0-9/A/B/C 時改成 Hxxxxxxx # gitea.sh hash-id <text> # 產生 8 碼大寫 SHA-1 hash;首碼為 0-9/A/B/C 時改成 Hxxxxxxx
# gitea.sh wiki-repo <TYPE> # 解析頁面類型的 wiki 位置: # gitea.sh wiki-repo <TYPE> # 解析頁面類型的 wiki 位置:
# TYPE = QUESTION|PLAN|ANALYZE|MAINTAIN|REPO|LOG|ERROR(即頁名前綴) # TYPE = QUESTION|PLAN|ANALYZE|MAINTAIN|REPO|LOG|LEARN|ERROR(即頁名前綴)
# 依序取 JSC_WIKI_REPO_{TYPE} > JSC_WIKI_REPO;不得跨類型代用;都未設定 exit 3 # 依序取 JSC_WIKI_REPO_{TYPE} > JSC_WIKI_REPO;不得跨類型代用;都未設定 exit 3
# gitea.sh wiki-list <owner>/<repo> # 列出 wiki 頁名 # gitea.sh wiki-list <owner>/<repo> # 列出 wiki 頁名
# gitea.sh wiki-get <owner>/<repo> <page> # 印出 wiki 頁 markdown;不存在時 exit 4 # gitea.sh wiki-get <owner>/<repo> <page> # 印出 wiki 頁 markdown;不存在時 exit 4
@@ -27,7 +27,7 @@ script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
resolve_wiki_repo() { # TYPE -> JSC_WIKI_REPO_{TYPE} -> JSC_WIKI_REPO resolve_wiki_repo() { # TYPE -> JSC_WIKI_REPO_{TYPE} -> JSC_WIKI_REPO
type=$(printf '%s' "${1:?TYPE required}" | tr a-z A-Z) type=$(printf '%s' "${1:?TYPE required}" | tr a-z A-Z)
case "$type" in case "$type" in
QUESTION|PLAN|ANALYZE|MAINTAIN|REPO|LOG|ERROR) ;; QUESTION|PLAN|ANALYZE|MAINTAIN|REPO|LOG|LEARN|ERROR) ;;
*) echo "unknown wiki type: $type" >&2; exit 2 ;; *) echo "unknown wiki type: $type" >&2; exit 2 ;;
esac esac
eval "v=\${JSC_WIKI_REPO_${type}:-}" eval "v=\${JSC_WIKI_REPO_${type}:-}"