Shell script reads .pkg ZIPs, extracts manifests, and emits a registry.json for self-hosted package discovery. Docs cover the JSON format, admin config, and self-hosting setup. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
82 lines
2.5 KiB
Bash
Executable File
82 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# generate-registry.sh — Build a registry.json from a directory of .pkg files.
|
|
#
|
|
# Usage:
|
|
# ./scripts/generate-registry.sh [PKG_DIR] [BASE_URL]
|
|
#
|
|
# Arguments:
|
|
# PKG_DIR Directory containing .pkg files (default: dist/)
|
|
# BASE_URL HTTPS base URL for download links (default: https://example.com/packages)
|
|
#
|
|
# Output:
|
|
# Writes registry.json to stdout. Redirect to a file:
|
|
# ./scripts/generate-registry.sh dist/ https://cdn.example.com/pkg > registry.json
|
|
|
|
set -euo pipefail
|
|
|
|
PKG_DIR="${1:-dist}"
|
|
BASE_URL="${2:-https://example.com/packages}"
|
|
|
|
# Strip trailing slash
|
|
BASE_URL="${BASE_URL%/}"
|
|
|
|
if [ ! -d "$PKG_DIR" ]; then
|
|
echo "Error: directory '$PKG_DIR' not found" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Collect entries
|
|
entries=()
|
|
|
|
for pkg in "$PKG_DIR"/*.pkg; do
|
|
[ -f "$pkg" ] || continue
|
|
|
|
# Extract manifest.json from the ZIP archive
|
|
manifest=$(unzip -p "$pkg" manifest.json 2>/dev/null) || {
|
|
echo "Warning: skipping $pkg (no manifest.json)" >&2
|
|
continue
|
|
}
|
|
|
|
# Read fields from manifest
|
|
id=$(echo "$manifest" | jq -r '.id // empty')
|
|
title=$(echo "$manifest" | jq -r '.title // .id')
|
|
version=$(echo "$manifest" | jq -r '.version // "0.0.0"')
|
|
description=$(echo "$manifest" | jq -r '.description // ""')
|
|
author=$(echo "$manifest" | jq -r '.author // ""')
|
|
type=$(echo "$manifest" | jq -r '.type // "extension"')
|
|
tier=$(echo "$manifest" | jq -r '.tier // "community"')
|
|
|
|
if [ -z "$id" ]; then
|
|
echo "Warning: skipping $pkg (no id in manifest)" >&2
|
|
continue
|
|
fi
|
|
|
|
filename=$(basename "$pkg")
|
|
size=$(stat -c%s "$pkg" 2>/dev/null || stat -f%z "$pkg" 2>/dev/null || echo 0)
|
|
updated_at=$(date -r "$pkg" -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
|
|
entry=$(jq -n \
|
|
--arg id "$id" \
|
|
--arg title "$title" \
|
|
--arg version "$version" \
|
|
--arg description "$description" \
|
|
--arg author "$author" \
|
|
--arg type "$type" \
|
|
--arg tier "$tier" \
|
|
--arg download_url "$BASE_URL/$filename" \
|
|
--argjson size "$size" \
|
|
--arg updated_at "$updated_at" \
|
|
'{id: $id, title: $title, version: $version, description: $description,
|
|
author: $author, type: $type, tier: $tier, download_url: $download_url,
|
|
size: $size, updated_at: $updated_at}')
|
|
|
|
entries+=("$entry")
|
|
done
|
|
|
|
# Build final JSON
|
|
if [ ${#entries[@]} -eq 0 ]; then
|
|
echo '{"packages": []}' | jq .
|
|
else
|
|
printf '%s\n' "${entries[@]}" | jq -s '{packages: .}'
|
|
fi
|