feat(workflow): adopt Matt Pocock ticket workflow

Replace the Superpowers plan pipeline with grill-with-docs, specs, local tickets, and ticket-native execution.

BREAKING CHANGE: Remove the legacy Plan CLI, prompt templates, and Superpowers skills.
This commit is contained in:
csh
2026-08-10 16:55:46 +08:00
parent 29d110110b
commit 699b431cac
164 changed files with 9039 additions and 12273 deletions
+4 -3
View File
@@ -29,12 +29,13 @@ env:
jobs:
checks:
# 仅在 Prepare 成功后触发。Prepare 覆盖 push(main) / pull_request /
# schedule / dispatch,故 checks 在这些场景均会运行。
# 仅在 Prepare 成功后触发;排除 schedule:每日 cron 仅为刷新 thirdparty
# main 代码未变,无需对同一 HEAD 空跑 lint+全量测试。Prepare 覆盖
# push(main) / pull_request / dispatchchecks 在这些场景运行。
# lint 与 test 合并为单 job:共用一个临时 worktree,准备一次,顺序执行
# lint 在前 fail-fast,失败即不跑 test)。二者跑同一 SOURCE_SHA、皆只读、
# 无依赖,无需拆分为并行 job(那会重复整段 worktree 准备逻辑 + 多一个 worktree)。
if: ${{ github.event.workflow_run.conclusion == 'success' }}
if: ${{ github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event != 'schedule' }}
name: 🔎 规范检查 + 全量测试
runs-on: standard-ubuntu-22
permissions:
+2
View File
@@ -91,6 +91,8 @@ jobs:
fi
done
python3 -c 'import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else "Python 3.11 or newer is required")'
{
echo "## Prepare 环境"
echo ""
+3 -2
View File
@@ -33,8 +33,9 @@ env:
jobs:
sync:
# 仅在 Prepare 于主分支成功后触发
if: ${{ github.event.workflow_run.conclusion == 'success' && (github.event.workflow_run.head_branch == 'main' || github.event.workflow_run.head_branch == 'master') }}
# 仅在 Prepare 于主分支成功后触发;排除 schedule:每日 cron 仅为刷新
# thirdpartymain 代码未变,重建 tsl-playbook 属纯浪费(幂等空推)。
if: ${{ github.event.workflow_run.conclusion == 'success' && (github.event.workflow_run.head_branch == 'main' || github.event.workflow_run.head_branch == 'master') && github.event.workflow_run.event != 'schedule' }}
name: 🔨 构建并发布 tsl-playbook
runs-on: standard-ubuntu-22
permissions:
+36 -25
View File
@@ -416,7 +416,12 @@ jobs:
entry["snapshot_dir"],
entry["sync_mode"],
entry["source_list"],
entry.get("skills_subdir", ""),
"\x1e".join(
entry.get(
"skills_subdirs",
[entry.get("skills_subdir", "")],
)
),
entry.get("output_name", entry["id"]),
entry.get("platform_config", ""),
entry.get("template_root", ""),
@@ -541,7 +546,7 @@ jobs:
exit 1
fi
while IFS=$'\x1f' read -r source_id snapshot_dir sync_mode source_list skills_subdir output_name platform_config template_root data_dir scripts_dir include_skill_dirs; do
while IFS=$'\x1f' read -r source_id snapshot_dir sync_mode source_list skills_subdirs output_name platform_config template_root data_dir scripts_dir include_skill_dirs; do
[ -n "$source_id" ] || continue
if [ -f "$source_list" ]; then
@@ -553,7 +558,7 @@ jobs:
done < "$sources_file"
declare -A owners=()
while IFS=$'\x1f' read -r source_id snapshot_dir sync_mode source_list skills_subdir output_name platform_config template_root data_dir scripts_dir include_skill_dirs; do
while IFS=$'\x1f' read -r source_id snapshot_dir sync_mode source_list skills_subdirs output_name platform_config template_root data_dir scripts_dir include_skill_dirs; do
[ -n "$source_id" ] || continue
git archive --format=tar "origin/${THIRDPARTY_BRANCH}" "$snapshot_dir" | tar -xf - -C "$tmp_dir"
@@ -562,31 +567,37 @@ jobs:
names=()
case "$sync_mode" in
copy_skill_dirs)
source_skills_dir="$snapshot_root/$skills_subdir"
if [ ! -d "$source_skills_dir" ]; then
echo "ERROR: $skills_subdir not found in snapshot $snapshot_dir" >&2
exit 1
fi
for dir in "$source_skills_dir"/*; do
[ -d "$dir" ] || continue
name="$(basename "$dir")"
if ! skill_dir_included "$name" "$include_skill_dirs"; then
continue
fi
if [ -n "${owners[$name]:-}" ] && [ "${owners[$name]}" != "$source_id" ]; then
echo "ERROR: duplicate third-party skill name: $name" >&2
exit 1
fi
if tracked_skill_exists "$name"; then
echo "ERROR: skill name conflict with tracked skill: $name" >&2
local_ifs="$IFS"
IFS=$'\x1e'
read -r -a skill_roots <<< "$skills_subdirs"
IFS="$local_ifs"
for skills_subdir in "${skill_roots[@]}"; do
source_skills_dir="$snapshot_root/$skills_subdir"
if [ ! -d "$source_skills_dir" ]; then
echo "ERROR: $skills_subdir not found in snapshot $snapshot_dir" >&2
exit 1
fi
rm -rf "skills/thirdparty/$name"
cp -R "$dir" "skills/thirdparty/$name"
names+=("$name")
owners["$name"]="$source_id"
for dir in "$source_skills_dir"/*; do
[ -d "$dir" ] || continue
name="$(basename "$dir")"
if ! skill_dir_included "$name" "$include_skill_dirs"; then
continue
fi
if [ -n "${owners[$name]:-}" ] && [ "${owners[$name]}" != "$source_id" ]; then
echo "ERROR: duplicate third-party skill name: $name" >&2
exit 1
fi
if tracked_skill_exists "$name"; then
echo "ERROR: skill name conflict with tracked skill: $name" >&2
exit 1
fi
rm -rf "skills/thirdparty/$name"
cp -R "$dir" "skills/thirdparty/$name"
names+=("$name")
owners["$name"]="$source_id"
done
done
;;
render_skill)