|
13 | 13 | rm -rf "$OUT_DIR" |
14 | 14 | mkdir -p "$OUT_DIR" |
15 | 15 |
|
16 | | -build_one() { |
| 16 | +STAGE_DIR="$(mktemp -d)" |
| 17 | +trap 'rm -rf "$STAGE_DIR"' EXIT |
| 18 | + |
| 19 | +stage_one() { |
17 | 20 | local skill_dir="$1" |
18 | 21 | local name |
19 | | - local work_dir |
20 | | - local package_path |
| 22 | + local target |
21 | 23 | local refs |
22 | 24 |
|
23 | 25 | name="$(basename "$skill_dir")" |
24 | | - work_dir="$(mktemp -d)" |
25 | | - package_path="$OUT_DIR/${name}-${VERSION}.skill" |
| 26 | + target="$STAGE_DIR/$name" |
| 27 | + mkdir -p "$target" |
26 | 28 |
|
27 | | - cp "$skill_dir/SKILL.md" "$work_dir/SKILL.md" |
| 29 | + cp "$skill_dir/SKILL.md" "$target/SKILL.md" |
28 | 30 |
|
29 | 31 | refs="$(grep -Eo '知识库/[^`,。 、)]*\.md' "$skill_dir/SKILL.md" || true)" |
30 | 32 | if [ -n "$refs" ]; then |
31 | 33 | while IFS= read -r ref; do |
32 | 34 | [ -n "$ref" ] || continue |
33 | 35 | if [ -f "$ROOT_DIR/$ref" ]; then |
34 | | - mkdir -p "$work_dir/$(dirname "$ref")" |
35 | | - cp "$ROOT_DIR/$ref" "$work_dir/$ref" |
| 36 | + mkdir -p "$target/$(dirname "$ref")" |
| 37 | + cp "$ROOT_DIR/$ref" "$target/$ref" |
36 | 38 | fi |
37 | 39 | done <<< "$refs" |
38 | 40 | fi |
39 | 41 |
|
40 | | - python3 - "$work_dir" "$package_path" <<'PY' |
41 | | -import os |
42 | | -import sys |
43 | | -import zipfile |
44 | | -
|
45 | | -source_dir, package_path = sys.argv[1], sys.argv[2] |
46 | | -
|
47 | | -with zipfile.ZipFile(package_path, "w", compression=zipfile.ZIP_DEFLATED) as archive: |
48 | | - for root, _, files in os.walk(source_dir): |
49 | | - for filename in files: |
50 | | - path = os.path.join(root, filename) |
51 | | - archive.write(path, os.path.relpath(path, source_dir)) |
52 | | -PY |
53 | | - |
54 | | - rm -rf "$work_dir" |
55 | | - echo "built $(basename "$package_path")" |
| 42 | + echo "staged $name" |
56 | 43 | } |
57 | 44 |
|
58 | 45 | for skill_md in "$ROOT_DIR"/skills/*/SKILL.md; do |
59 | | - build_one "$(dirname "$skill_md")" |
| 46 | + stage_one "$(dirname "$skill_md")" |
60 | 47 | done |
61 | 48 |
|
62 | | -python3 - "$OUT_DIR" "dbskill-${VERSION}.zip" <<'PY' |
| 49 | +python3 - "$STAGE_DIR" "$OUT_DIR/dbskill-${VERSION}.zip" <<'PY' |
63 | 50 | import os |
64 | 51 | import sys |
65 | 52 | import zipfile |
66 | 53 |
|
67 | | -out_dir, archive_name = sys.argv[1], sys.argv[2] |
68 | | -archive_path = os.path.join(out_dir, archive_name) |
| 54 | +stage_dir, archive_path = sys.argv[1], sys.argv[2] |
69 | 55 |
|
70 | 56 | with zipfile.ZipFile(archive_path, "w", compression=zipfile.ZIP_DEFLATED) as archive: |
71 | | - for filename in sorted(os.listdir(out_dir)): |
72 | | - if filename.endswith(".skill"): |
73 | | - archive.write(os.path.join(out_dir, filename), filename) |
| 57 | + for root, _, files in os.walk(stage_dir): |
| 58 | + for filename in files: |
| 59 | + path = os.path.join(root, filename) |
| 60 | + archive.write(path, os.path.relpath(path, stage_dir)) |
74 | 61 | PY |
75 | 62 |
|
76 | 63 | cat > "$OUT_DIR/README.md" <<EOF |
77 | 64 | # dbskill skill 包 |
78 | 65 |
|
79 | 66 | 版本:${VERSION} |
80 | 67 |
|
81 | | -从 GitHub Releases 下载 dbskill-${VERSION}.zip 解压后,里面是 17 个 .skill 文件。每个 .skill 是一个 zip,根目录是 SKILL.md(带 YAML frontmatter,含 name + description),并自动带上该 skill 引用的知识库文件。 |
| 68 | +从 GitHub Releases 下载 dbskill-${VERSION}.zip。zip 的根目录是 17 个 skill 子文件夹,每个子文件夹里有一个标准命名的 SKILL.md(带 YAML frontmatter,含 name + description),并附带该 skill 引用的知识库文件。 |
82 | 69 |
|
83 | | -格式遵循 Anthropic Skills 规范,可用于 Trae Solo、Claude Code 等支持该格式的产品。把 .skill 逐个上传即可。 |
| 70 | +格式遵循 Anthropic Skills 规范,可用于 Trae Solo、Claude Code 等支持该格式的产品。整体上传 zip,或拆出需要的子文件夹打包后单独上传都可以。 |
84 | 71 | EOF |
85 | 72 |
|
86 | 73 | echo |
87 | | -echo "done: $OUT_DIR" |
| 74 | +echo "done: $OUT_DIR/dbskill-${VERSION}.zip" |
0 commit comments