#!/usr/bin/env bash # 單一 component 註冊到 registry index # SDD: matrix/arcrun/.agents/specs/component-registry-canon/design.md Phase 2 # # 用法: # bash scripts/register-component.sh # REGISTRY_URL=https://registry.arcrun.dev bash scripts/register-component.sh kbdb_ingest # # CI deploy 流程內也使用同樣邏輯(見 .github/workflows/deploy.yml 的 Register step) # 此 script 是「本地 / hook 一致性」的 SSOT,CI 改邏輯時 script 跟著改 set -uo pipefail REGISTRY_URL="${REGISTRY_URL:-https://registry.arcrun.dev}" COMPONENT_NAME="${1:-}" if [[ -z "$COMPONENT_NAME" ]]; then echo "Usage: $0 " >&2 exit 1 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" COMPONENT_DIR="$SCRIPT_DIR/../components/$COMPONENT_NAME" CONTRACT="$COMPONENT_DIR/component.contract.yaml" if [[ ! -f "$CONTRACT" ]]; then echo "::warning::no component.contract.yaml at $COMPONENT_DIR" >&2 exit 0 fi python3 -c "import yaml" 2>/dev/null || { echo "需要 python3 + pyyaml" >&2 exit 1 } contract_json=$(python3 -c " import yaml, json with open('$CONTRACT') as f: c = yaml.safe_load(f) print(json.dumps({'contract': c})) ") || { echo "::warning::無法解析 $CONTRACT" >&2 exit 0 } echo "Registering $COMPONENT_NAME to $REGISTRY_URL ..." http_code=$(curl -s -o /tmp/reg-response.json -w "%{http_code}" \ -X POST "$REGISTRY_URL/components/index-only" \ -H "Content-Type: application/json" \ -d "$contract_json") if [[ "$http_code" =~ ^(200|201)$ ]]; then echo "✓ $COMPONENT_NAME registered (HTTP $http_code)" cat /tmp/reg-response.json echo else echo "::warning::Registry 註冊失敗 HTTP $http_code" >&2 cat /tmp/reg-response.json || true exit 1 fi