4141 README_BACKUP=""
4242 README_CREATED="false"
4343 BACKUP_PKG="${PKG_DIR}/.package.json.release.bak"
44+ GROUP_COUNT=0
45+
46+ open_group() {
47+ echo "::group::$1"
48+ GROUP_COUNT=$((GROUP_COUNT + 1))
49+ }
50+
51+ close_group() {
52+ if [ "$GROUP_COUNT" -gt 0 ]; then
53+ echo "::endgroup::"
54+ GROUP_COUNT=$((GROUP_COUNT - 1))
55+ fi
56+ }
4457
4558 cleanup() {
4659 if [ -f "$BACKUP_PKG" ]; then
@@ -53,32 +66,47 @@ jobs:
5366 elif [ "$README_CREATED" = "true" ] && [ -f "$README_DEST" ]; then
5467 rm -f "$README_DEST" || true
5568 fi
69+ while [ "$GROUP_COUNT" -gt 0 ]; do
70+ close_group
71+ done
5672 rm -rf "$TMP_DIR"
5773 }
5874 trap cleanup EXIT
5975
6076 mkdir -p "$LOCAL_PACK_DIR" "$REMOTE_PACK_DIR"
6177
78+ open_group "Resolve package metadata"
6279 if [ -n "${NPM_TOKEN:-}" ]; then
6380 printf '%s\n' "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > "$HOME/.npmrc"
6481 fi
6582
6683 if ! LATEST_VERSION="$(npm view "${PKG_NAME}" version 2>/dev/null)"; then
84+ close_group
6785 echo "Package ${PKG_NAME} not found on npm; proceeding with release."
6886 echo "should_release=true" >> "$GITHUB_OUTPUT"
6987 exit 0
7088 fi
89+ echo "Package: ${PKG_NAME}"
90+ echo "Latest npm version: ${LATEST_VERSION}"
91+ close_group
7192
72- REMOTE_TARBALL="$(npm pack "${PKG_NAME}@${LATEST_VERSION}" --silent --pack-destination "$REMOTE_PACK_DIR" | tail -n 1)"
93+ open_group "Download remote package"
94+ REMOTE_TARBALL="$(npm pack "${PKG_NAME}@${LATEST_VERSION}" --pack-destination "$REMOTE_PACK_DIR" | tail -n 1)"
7395 REMOTE_TAR_PATH="$REMOTE_PACK_DIR/$REMOTE_TARBALL"
96+ echo "Remote tarball: ${REMOTE_TAR_PATH}"
7497 if [ ! -f "$REMOTE_TAR_PATH" ]; then
98+ close_group
7599 echo "Unable to download ${PKG_NAME}@${LATEST_VERSION}; proceeding with release."
76100 echo "should_release=true" >> "$GITHUB_OUTPUT"
77101 exit 0
78102 fi
103+ close_group
79104
105+ open_group "Build current package"
80106 bun run --cwd packages/app build
107+ close_group
81108
109+ open_group "Prepare package README"
82110 if [ -f "$README_DEST" ]; then
83111 README_BACKUP="${TMP_DIR}/README.backup"
84112 cp "$README_DEST" "$README_BACKUP"
@@ -87,47 +115,60 @@ jobs:
87115 fi
88116 mkdir -p "$(dirname "$README_DEST")"
89117 cp README.md "$README_DEST"
118+ close_group
90119
120+ open_group "Prune package manifest"
91121 cp "$PKG_PATH" "$BACKUP_PKG"
92122 bun x @prover-coder-ai/dist-deps-prune apply \
93123 --package "$PKG_PATH" \
94124 --prune-dev true \
95- --write \
96- --silent
125+ --write
126+ close_group
97127
128+ open_group "Pack current package"
98129 LOCAL_TAR_PATH="$(cd "$PKG_DIR" && bun pm pack --quiet --ignore-scripts --destination "$LOCAL_PACK_DIR" | tail -n 1 | tr -d '\r')"
130+ echo "Local tarball: ${LOCAL_TAR_PATH}"
99131 if [ ! -f "$LOCAL_TAR_PATH" ]; then
132+ close_group
100133 echo "Unable to pack local ${PKG_NAME}; proceeding with release."
101134 echo "should_release=true" >> "$GITHUB_OUTPUT"
102135 exit 0
103136 fi
137+ close_group
104138
105139 LOCAL_DIR="${TMP_DIR}/local"
106140 REMOTE_DIR="${TMP_DIR}/remote"
107141 mkdir -p "$LOCAL_DIR" "$REMOTE_DIR"
108142
143+ open_group "Extract tarballs"
109144 tar -xzf "$LOCAL_TAR_PATH" -C "$LOCAL_DIR"
110145 tar -xzf "$REMOTE_TAR_PATH" -C "$REMOTE_DIR"
146+ close_group
111147
112148 LOCAL_PKG="${LOCAL_DIR}/package/package.json"
113149 REMOTE_PKG="${REMOTE_DIR}/package/package.json"
114150
151+ open_group "Normalize package metadata"
115152 if [ ! -f "$LOCAL_PKG" ] || [ ! -f "$REMOTE_PKG" ]; then
153+ close_group
116154 echo "package.json missing in tarball; proceeding with release."
117155 echo "should_release=true" >> "$GITHUB_OUTPUT"
118156 exit 0
119157 fi
120158
121159 bun -e "const p=process.argv[1];const sort=(v)=>Array.isArray(v)?v.map(sort):v&&typeof v==='object'?Object.keys(v).sort().reduce((acc,k)=>{acc[k]=sort(v[k]);return acc;},{}):v;const pkg=JSON.parse(await Bun.file(p).text());delete pkg.gitHead;pkg.version='0.0.0';const norm=sort(pkg);await Bun.write(p, JSON.stringify(norm, null, 2)+'\n');" "$LOCAL_PKG"
122160 bun -e "const p=process.argv[1];const sort=(v)=>Array.isArray(v)?v.map(sort):v&&typeof v==='object'?Object.keys(v).sort().reduce((acc,k)=>{acc[k]=sort(v[k]);return acc;},{}):v;const pkg=JSON.parse(await Bun.file(p).text());delete pkg.gitHead;pkg.version='0.0.0';const norm=sort(pkg);await Bun.write(p, JSON.stringify(norm, null, 2)+'\n');" "$REMOTE_PKG"
161+ close_group
123162
163+ open_group "Compare package contents"
124164 if diff -qr "$LOCAL_DIR/package" "$REMOTE_DIR/package" >/dev/null 2>&1; then
125165 echo "::notice::No changes compared to ${PKG_NAME}@${LATEST_VERSION}. Skipping release."
126166 echo "should_release=false" >> "$GITHUB_OUTPUT"
127167 else
128168 echo "Package differs from ${PKG_NAME}@${LATEST_VERSION}; proceeding with release."
129169 echo "should_release=true" >> "$GITHUB_OUTPUT"
130170 fi
171+ close_group
131172 - name : Auto changeset (patch if no changeset exists)
132173 if : steps.compare_npm.outputs.should_release != 'false' && github.actor != 'github-actions[bot]'
133174 shell : bash
0 commit comments