openpencil/scripts/publish-beta.sh
Kayshen Xu 370e51c0f7
V0.5.1 (#78)
* fix(docker): support multi-platform builds and fix monorepo paths

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* perf(renderer): cache pre-rasterized paragraph images to avoid per-frame glyph rasterization   (#76)

* fix(canvas): stabilize frame label size during zoom

  Draw frame labels in screen-space after the viewport transform
  restore, converting scene coords manually. Previously fontSize=12/zoom
  fed into Math.ceil caused integer-boundary jumps that made labels
  flicker during zoom. Also skip shadow rendering while actively
  zooming for smoother performance.

* perf(renderer): cache pre-rasterized paragraph images to avoid per-frame glyph rasterization

   - Add paraImageCache (SkImage, 128 MB LRU limit) keyed on the same key as paraCache
   - Use drawImageRect instead of drawParagraph on cache hit, skipping per-frame glyph shaping and rasterization
   - Fall back to direct drawParagraph only when off-screen surface creation (MakeSurface) fails
   - Extract _dpr getter to deduplicate device-pixel-ratio resolution logic across draw paths
   - Evict oldest entries when cache exceeds byte limit; delete SkImage on eviction and dispose()

* feat(cli): introduce OpenPencil CLI for terminal control of the design tool

- Added a new CLI application under `apps/cli` to manage OpenPencil from the terminal.
- Implemented commands for app control (`start`, `stop`, `status`), document operations (`open`, `save`, `get`, `selection`), and design manipulation (`design`, `import`).
- Enhanced documentation with usage instructions and platform support details.
- Updated build scripts to include CLI compilation and publishing processes.
- Introduced a new GitHub Actions workflow for publishing the CLI to npm.
- Updated existing workflows to integrate CLI build steps and ensure proper versioning across packages.

* docs: update README files to include CLI tool details and multi-platform code export

- Added CLI section to README files in multiple languages, detailing commands for terminal control of the design tool.
- Included instructions for global installation and usage examples for the CLI.
- Expanded documentation on multi-platform code export capabilities from a single `.op` file to various frameworks.
- Updated CLAUDE.md to reference the new CLI documentation and its integration with the design tool.

* chore(bun.lock): update package dependencies to specific versions

- Removed workspace references for several packages in the bun.lock file.
- Updated dependencies for `@zseven-w/pen-core`, `@zseven-w/pen-types`, `@zseven-w/pen-codegen`, `@zseven-w/pen-figma`, and `@zseven-w/pen-renderer` to version `0.5.1-beta.1`.
- Ensured consistency in dependency management across the project.

* fix(docker): add missing CLI package.json to build context

The Dockerfile was missing COPY for apps/cli/package.json, causing
bun install --frozen-lockfile to fail because the CLI workspace
dependency could not be resolved.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat: add unpublish script and enhance CLI publish workflow

- Introduced a new `unpublish` script to manage unpublishing of all @zseven-w packages from npm, with options for specific versions, all versions, or deprecation.
- Updated the GitHub Actions workflow to check if a version is already published before proceeding with the publish step, ensuring better error handling and preventing conflicts.
- Removed the fallback for npm publish commands to fail fast on errors, improving the reliability of the publishing process.

* chore(bun.lock): update package versions and configuration

- Bumped the configVersion from 0 to 1 in bun.lock.
- Updated several package dependencies to their latest versions, including:
  - @anthropic-ai/claude-agent-sdk to 0.2.81
  - @babel/helpers to 7.29.2
  - @babel/parser to 7.29.2
  - @babel/runtime to 7.29.2
  - @csstools/color-helpers to 6.0.2
  - @csstools/css-color-parser to 4.0.2
- Ensured consistency in dependency management across the project.

* docs: restore Feishu group QR code in Chinese README

* chore: update dependencies and add workspace references

- Added "h3" package with version "^2.0.1-rc.18" to bun.lock, package.json, and apps/web/package.json.
- Updated dependencies in multiple packages to use "workspace:*" for better management and consistency across the project.
- Ensured all relevant packages are aligned with the latest workspace structure.

* chore: update package versions in bun.lock and package.json

- Updated several @tanstack packages to their latest versions, including:
  - @tanstack/react-devtools to 0.10.0
  - @tanstack/react-router to 1.168.1
  - @tanstack/react-router-devtools to 1.166.11
  - @tanstack/react-router-ssr-query to 1.166.10
  - @tanstack/react-start to 1.167.2
  - @tanstack/router-plugin to 1.167.1
- Bumped @tanstack/devtools-vite to 0.6.0 in devDependencies.
- Mocked 'paper' module in security tests to prevent crashes in jsdom environment.

* chore: update CLI and MCP compile scripts to include package aliases

- Enhanced the `mcp:compile` and `cli:compile` scripts in `package.json` and `apps/cli/package.json` to include additional package aliases for better module resolution.
- This change improves the build process by ensuring that the correct paths are used for various dependencies.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: leinaldo <60176594+leinaldo@users.noreply.github.com>
Co-authored-by: Fini <fini.yang@gmail.com>
2026-03-23 22:31:06 +08:00

126 lines
3.6 KiB
Bash
Executable file

#!/bin/bash
# Publish all @zseven-w packages to npm with auto-incrementing beta version.
#
# Usage:
# bun run publish:beta # auto-increment beta number
# bun run publish:beta 5 # force beta.5
#
# Publishes: pen-types → pen-core → pen-codegen, pen-figma → pen-renderer → pen-sdk → openpencil CLI
# All under the "beta" dist-tag, so `npm install` won't pick them up by default.
# Install with: npm install @zseven-w/openpencil@beta
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
BASE_VERSION=$(jq -r .version "$ROOT/package.json")
FORCE_NUM="${1:-}"
# --- Guard: block beta publish if release version already exists on npm ---
RELEASE_CHECK=$(npm view "@zseven-w/pen-types@${BASE_VERSION}" version 2>/dev/null || true)
if [ -n "$RELEASE_CHECK" ]; then
echo "ERROR: Release version ${BASE_VERSION} already exists on npm."
echo "Publishing a beta for an already-released version creates conflicting dependencies."
echo "Bump the version first (e.g. bun run bump 0.5.2), then publish beta."
exit 1
fi
# Packages in topological order
PACKAGES=(
packages/pen-types
packages/pen-core
packages/pen-codegen
packages/pen-figma
packages/pen-renderer
packages/pen-sdk
apps/cli
)
# --- Determine beta number ---
if [ -n "$FORCE_NUM" ]; then
BETA_NUM="$FORCE_NUM"
else
# Query npm for the latest beta of this base version.
# npm view returns a string (1 version) or array (multiple), or errors (404) if not found.
RAW=$(npm view "@zseven-w/pen-types" versions --json 2>/dev/null || true)
LATEST=$(echo "$RAW" | jq -r --arg base "$BASE_VERSION" '
if type == "object" and .error then empty # npm 404 error object
elif type == "array" then
map(select(type == "string" and startswith($base + "-beta."))) | last // empty
elif type == "string" and startswith($base + "-beta.") then .
else empty
end
' 2>/dev/null || true)
if [ -n "$LATEST" ]; then
PREV_NUM=$(echo "$LATEST" | sed "s/${BASE_VERSION}-beta\.//")
BETA_NUM=$((PREV_NUM + 1))
else
BETA_NUM=0
fi
fi
BETA_VERSION="${BASE_VERSION}-beta.${BETA_NUM}"
echo "Publishing version: $BETA_VERSION"
echo ""
# --- Set beta version in all package.json files ---
MODIFIED_FILES=()
for pkg in "${PACKAGES[@]}"; do
f="$ROOT/$pkg/package.json"
if [ -f "$f" ]; then
# Backup original
cp "$f" "$f.bak"
MODIFIED_FILES+=("$f")
# Set version and replace workspace:* refs
jq --arg v "$BETA_VERSION" '
.version = $v |
if .dependencies then
.dependencies |= with_entries(
if .value == "workspace:*" then .value = $v else . end
)
else . end |
if .devDependencies then
.devDependencies |= with_entries(
if .value == "workspace:*" then .value = $v else . end
)
else . end
' "$f" > "$f.tmp" && mv "$f.tmp" "$f"
fi
done
# --- Restore on exit ---
cleanup() {
echo ""
echo "Restoring original package.json files..."
for f in "${MODIFIED_FILES[@]}"; do
if [ -f "$f.bak" ]; then
mv "$f.bak" "$f"
fi
done
echo "Done."
}
trap cleanup EXIT
# --- Compile CLI ---
echo "Compiling CLI..."
(cd "$ROOT" && bun run cli:compile)
echo ""
# --- Verify CLI ---
node "$ROOT/apps/cli/dist/openpencil-cli.cjs" --version
echo ""
# --- Publish ---
for pkg in "${PACKAGES[@]}"; do
dir="$ROOT/$pkg"
name=$(jq -r .name "$dir/package.json")
echo "Publishing $name@$BETA_VERSION ..."
(cd "$dir" && npm publish --access public --tag beta) || echo " ⚠ Failed (may already exist)"
echo ""
done
echo "================================"
echo "Published: $BETA_VERSION"
echo "Install: npm install @zseven-w/openpencil@beta"
echo "================================"