Product Spec Harness
HomeTrang chủ GuidesHướng dẫn releaserelease
For developersCho lập trình viên

release

v1.2.0

Two halves of one job: pack a curated .claude/ subset into a deterministic tar.gz, and run the release lifecycle on the root CHANGELOG.md. Same inputs → byte-identical bundle, every time.Hai nửa của một việc: đóng gói tập con .claude/ chọn lọc thành tar.gz deterministic, và chạy vòng đời phát hành trên CHANGELOG.md gốc. Cùng đầu vào → bundle giống nhau từng byte, mọi lần.

✓ Reach for it when✓ Dùng khi

  • sharing/installing a curated .claude/ subsetchia sẻ/cài một tập con .claude/ chọn lọc
  • cutting a versioned release (lock changelog, bump, tag)cắt một bản phát hành có version (khóa changelog, bump, tag)
  • you need a reproducible, hashed artifactbạn cần hiện vật tái lập, có hash

✗ Won't do✗ Sẽ không làm

  • pack secrets — the safety filter is non-removableđóng gói secret — bộ lọc an toàn không tắt được
  • push the tag for you — that's owner-ownedtự push tag — đó là việc của chủ kit
  • make any network call at runtimegọi mạng khi chạy
Worked exampleVí dụ thật

Preview the pack — deterministic & hashedXem trước bản đóng gói — tất định & có hash

--dry-run --compute-sha lists what would ship and the exact SHA-256 of the bundle — without writing a tarball. Run twice, same hash. real output --dry-run --compute-sha liệt kê những gì sẽ đóng gói và đúng SHA-256 của bundle — mà không ghi tarball. Chạy hai lần, cùng một hash. đầu ra thật

python -m pack --root . --dry-run --compute-sha
bundle_root: product-spec-2.4.0
file_count: 318
total_bytes: 4626012
output_path: /home/hieubt15/Documents/vsf/product-spec/.claude/skills/release/scripts/dist/product-spec-2.4.0.tar.gz
max_size: 104857600
would_be_sha256: 414c2cbac29472cdba8f8e4a95f4cb784be6ad092b730844ba7ba806dbc8ba8f
over_max_size: False

The safety filter, doing its jobBộ lọc an toàn, đang làm việc

Plant secrets in a tree, then scan it. Legit files stay; secrets are dropped by an immutable rule — no flag pulls them back. real scan Cấy secret vào một cây rồi quét. File hợp lệ ở lại; secret bị loại bởi một luật không thể sửa — không cờ nào kéo lại được. quét thật

.claude/skills/acme/SKILL.mdkeptgiữ
.claude/skills/acme/run.pykeptgiữ
.claude/skills/acme/.envalways-drop:exact:.envdroppedloại
.claude/skills/acme/aws-secret.jsonpattern:**/*secret*.jsondroppedloại
.claude/skills/acme/server.pempattern:**/*.pemdroppedloại

Always-dropped: .env & secrets/keys, .git/, runtime caches, session state, telemetry/*.jsonl, tests. Settings & CK-config are opt-in only.Luôn loại: .env & secret/key, .git/, cache runtime, session state, telemetry/*.jsonl, tests. Settings & CK-config phải opt-in.

The deterministic pack flowLuồng đóng gói deterministic

manifest
source of truthsource of truth
safety_check
always-dropluôn loại bỏ
sorted walkduyệt đã sắp
mtime=0
tarball
.tar.gz
.sha256
sidecarsidecar
PAX format mtime=0 uid=gid=0 gzip header mtime=0 byte-identicalgiống từng byte

The safety filter — non-removableBộ lọc an toàn — không thể tắt

No flag pulls these back into a bundle. Settings & CK-config are opt-in only.Không cờ nào kéo những thứ này lại vào bundle. Settings & CK-config phải opt-in.

.env / secrets / keys.git/runtime cachessession statetelemetry/*.jsonl__tests__

Release lifecycle (release.py)Vòng đời phát hành (release.py)

Lock [Unreleased][X.Y.Z], bump the manifest, hand the owner the tag push. The tag — never auto-pushed — fires the CI that publishes the GitHub Release.Khóa [Unreleased][X.Y.Z], bump manifest, đưa chủ kit lệnh push tag. Tag — không bao giờ tự push — kích CI để phát hành GitHub Release.

--extract--release X.Y.Z--bump major|minor|patch--pre-release--date--apply--push

Pack flagsCờ đóng gói

--manifest--skills--agents--hooks--rules--extra--version--bundle-name--out--dry-run--compute-sha--include-settings--include-ck-config--include-shared--max-size--source-date-epoch--strict--json