From 410ada409c7d110aa4a047e4b5c97949d35d92d6 Mon Sep 17 00:00:00 2001 From: Jarvis Date: Mon, 25 May 2026 11:27:58 -0500 Subject: [PATCH 1/4] fix: handle legacy woodpecker mosaic credentials --- .../framework/tools/_lib/credentials.sh | 40 +++++++++++++++---- .../tools/woodpecker/pipeline-list.sh | 2 +- .../tools/woodpecker/pipeline-status.sh | 2 +- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/packages/mosaic/framework/tools/_lib/credentials.sh b/packages/mosaic/framework/tools/_lib/credentials.sh index 77d3a6a..bbb942c 100755 --- a/packages/mosaic/framework/tools/_lib/credentials.sh +++ b/packages/mosaic/framework/tools/_lib/credentials.sh @@ -52,6 +52,20 @@ _mosaic_sync_woodpecker_env() { printf '%s\n' "$expected" > "$env_file" } +# Load legacy flat Woodpecker credentials (.woodpecker.url / .woodpecker.token). +# Some environments export WOODPECKER_INSTANCE=mosaic, but the current +# credentials.json may still use the legacy flat schema. Treat "mosaic" as the +# default flat instance when a nested .woodpecker.mosaic object is absent. +_mosaic_load_woodpecker_legacy() { + export WOODPECKER_URL="$(_mosaic_read_cred '.woodpecker.url')" + export WOODPECKER_TOKEN="$(_mosaic_read_cred '.woodpecker.token')" + export WOODPECKER_INSTANCE="${WOODPECKER_INSTANCE:-mosaic}" + WOODPECKER_URL="${WOODPECKER_URL%/}" + [[ -n "$WOODPECKER_URL" ]] || { echo "Error: woodpecker.url not found" >&2; return 1; } + [[ -n "$WOODPECKER_TOKEN" ]] || { echo "Error: woodpecker.token not found" >&2; return 1; } + _mosaic_sync_woodpecker_env "$WOODPECKER_INSTANCE" "$WOODPECKER_URL" "$WOODPECKER_TOKEN" +} + load_credentials() { local service="$1" @@ -155,7 +169,14 @@ EOF ;; woodpecker-*) local wp_instance="${service#woodpecker-}" - # credentials.json is authoritative — always read from it, ignore env + # credentials.json is authoritative — always read from it, ignore env. + # Backward compatibility: the default Mosaic Woodpecker instance may be + # stored in the legacy flat schema (.woodpecker.url/.token) instead of + # .woodpecker.mosaic.url/.token. + if [[ "$wp_instance" == "mosaic" ]] && [[ -z "$(_mosaic_read_cred '.woodpecker.mosaic.url')" ]] && [[ -n "$(_mosaic_read_cred '.woodpecker.url')" ]]; then + WOODPECKER_INSTANCE="mosaic" _mosaic_load_woodpecker_legacy + return $? + fi export WOODPECKER_URL="$(_mosaic_read_cred ".woodpecker.${wp_instance}.url")" export WOODPECKER_TOKEN="$(_mosaic_read_cred ".woodpecker.${wp_instance}.token")" export WOODPECKER_INSTANCE="$wp_instance" @@ -166,7 +187,10 @@ EOF _mosaic_sync_woodpecker_env "$wp_instance" "$WOODPECKER_URL" "$WOODPECKER_TOKEN" ;; woodpecker) - # Resolve default instance, then load it + # Resolve default instance, then load it. If WOODPECKER_INSTANCE is set to + # "mosaic" by a shell/profile but credentials.json still uses the legacy + # flat .woodpecker.url/.token schema, load the flat credentials instead of + # failing with "woodpecker.mosaic.url not found". local wp_default wp_default="${WOODPECKER_INSTANCE:-$(_mosaic_read_cred '.woodpecker.default')}" if [[ -z "$wp_default" ]]; then @@ -174,18 +198,18 @@ EOF local legacy_url legacy_url="$(_mosaic_read_cred '.woodpecker.url')" if [[ -n "$legacy_url" ]]; then - export WOODPECKER_URL="${WOODPECKER_URL:-$legacy_url}" - export WOODPECKER_TOKEN="${WOODPECKER_TOKEN:-$(_mosaic_read_cred '.woodpecker.token')}" - WOODPECKER_URL="${WOODPECKER_URL%/}" - [[ -n "$WOODPECKER_URL" ]] || { echo "Error: woodpecker.url not found" >&2; return 1; } - [[ -n "$WOODPECKER_TOKEN" ]] || { echo "Error: woodpecker.token not found" >&2; return 1; } + _mosaic_load_woodpecker_legacy else echo "Error: woodpecker.default not set and no WOODPECKER_INSTANCE env var" >&2 echo "Available instances: $(jq -r '.woodpecker | keys | join(", ")' "$MOSAIC_CREDENTIALS_FILE" 2>/dev/null)" >&2 return 1 fi else - load_credentials "woodpecker-${wp_default}" + if [[ "$wp_default" == "mosaic" ]] && [[ -z "$(_mosaic_read_cred '.woodpecker.mosaic.url')" ]] && [[ -n "$(_mosaic_read_cred '.woodpecker.url')" ]]; then + WOODPECKER_INSTANCE="mosaic" _mosaic_load_woodpecker_legacy + else + load_credentials "woodpecker-${wp_default}" + fi fi ;; cloudflare-*) diff --git a/packages/mosaic/framework/tools/woodpecker/pipeline-list.sh b/packages/mosaic/framework/tools/woodpecker/pipeline-list.sh index 8eae7b7..d77ca37 100755 --- a/packages/mosaic/framework/tools/woodpecker/pipeline-list.sh +++ b/packages/mosaic/framework/tools/woodpecker/pipeline-list.sh @@ -50,7 +50,7 @@ REPO_ID=$(wp_resolve_repo_id "$REPO") || exit 1 response=$(curl -sk -w "\n%{http_code}" \ -H "Authorization: Bearer $WOODPECKER_TOKEN" \ - "${WOODPECKER_URL}/api/repos/${REPO_ID}/pipelines?per_page=${LIMIT}") + "${WOODPECKER_URL}/api/repos/${REPO_ID}/pipelines?perPage=${LIMIT}") http_code=$(echo "$response" | tail -n1) body=$(echo "$response" | sed '$d') diff --git a/packages/mosaic/framework/tools/woodpecker/pipeline-status.sh b/packages/mosaic/framework/tools/woodpecker/pipeline-status.sh index eb98f68..6fbd186 100755 --- a/packages/mosaic/framework/tools/woodpecker/pipeline-status.sh +++ b/packages/mosaic/framework/tools/woodpecker/pipeline-status.sh @@ -64,7 +64,7 @@ _wp_fetch() { if [[ -z "$NUMBER" ]]; then # Get latest pipeline number from list, then fetch full detail - list_body=$(_wp_fetch "${WOODPECKER_URL}/api/repos/${REPO_ID}/pipelines?per_page=1") || exit 1 + list_body=$(_wp_fetch "${WOODPECKER_URL}/api/repos/${REPO_ID}/pipelines?perPage=1") || exit 1 NUMBER=$(echo "$list_body" | jq -r '.[0].number // empty') if [[ -z "$NUMBER" ]]; then echo "Error: No pipelines found" >&2 -- 2.49.1 From 2d4d799c2607244ea0c920c6d3f459e85f40e6bd Mon Sep 17 00:00:00 2001 From: Jarvis Date: Mon, 25 May 2026 14:08:45 -0500 Subject: [PATCH 2/4] fix(ci): avoid postgres service collision in k8s backend --- .woodpecker/ci.yml | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/.woodpecker/ci.yml b/.woodpecker/ci.yml index aaf47db..07484b7 100644 --- a/.woodpecker/ci.yml +++ b/.woodpecker/ci.yml @@ -46,18 +46,28 @@ steps: test: image: *node_image environment: - DATABASE_URL: postgresql://mosaic:mosaic@postgres:5432/mosaic + # Avoid the namespace-level Woodpecker DB service named "postgres". + # The Kubernetes backend exposes service containers by step name. + DATABASE_URL: postgresql://mosaic:mosaic@ci-postgres:5432/mosaic commands: - *enable_pnpm # Install postgresql-client for pg_isready - apk add --no-cache postgresql-client - # Wait up to 30s for postgres to be ready + # Wait up to 60s for CI postgres to be ready; fail fast if it never comes up. - | - for i in $(seq 1 30); do - pg_isready -h postgres -p 5432 -U mosaic && break - echo "Waiting for postgres ($i/30)..." + ready=0 + for i in $(seq 1 60); do + if pg_isready -h ci-postgres -p 5432 -U mosaic; then + ready=1 + break + fi + echo "Waiting for ci-postgres ($i/60)..." sleep 1 done + if [ "$ready" -ne 1 ]; then + echo "ci-postgres did not become ready" >&2 + exit 1 + fi # Run migrations (DATABASE_URL is set in environment above) - pnpm --filter @mosaicstack/db run db:migrate # Run all tests @@ -66,7 +76,7 @@ steps: - typecheck services: - postgres: + ci-postgres: image: pgvector/pgvector:pg17 environment: POSTGRES_USER: mosaic -- 2.49.1 From 4741b3e16fd27f10ab99f36e2b77e119a2780dd2 Mon Sep 17 00:00:00 2001 From: Jarvis Date: Mon, 25 May 2026 14:19:52 -0500 Subject: [PATCH 3/4] fix(git): pass explicit repo to Gitea wrappers --- .../mosaic/framework/tools/git/issue-list.sh | 45 ++++++++++++------- .../mosaic/framework/tools/git/pr-ci-wait.sh | 35 ++++++++++----- .../mosaic/framework/tools/git/pr-diff.sh | 43 ++++++++++-------- .../mosaic/framework/tools/git/pr-list.sh | 37 +++++++++++---- .../mosaic/framework/tools/git/pr-view.sh | 27 ++++++++--- 5 files changed, 129 insertions(+), 58 deletions(-) diff --git a/packages/mosaic/framework/tools/git/issue-list.sh b/packages/mosaic/framework/tools/git/issue-list.sh index 37e00c5..5c94350 100755 --- a/packages/mosaic/framework/tools/git/issue-list.sh +++ b/packages/mosaic/framework/tools/git/issue-list.sh @@ -1,6 +1,6 @@ #!/bin/bash # issue-list.sh - List issues on Gitea or GitHub -# Usage: issue-list.sh [-s state] [-l label] [-m milestone] [-a assignee] +# Usage: issue-list.sh [-r owner/repo] [-s state] [-l label] [-m milestone] [-a assignee] set -e @@ -13,6 +13,7 @@ LABEL="" MILESTONE="" ASSIGNEE="" LIMIT=100 +REPO_OVERRIDE="" usage() { cat </dev/null || echo gitea) +else + PLATFORM=$(detect_platform) + REPO_INFO=$(get_repo_info) +fi + +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2 + exit 1 +fi case "$PLATFORM" in github) - CMD="gh issue list --state $STATE --limit $LIMIT" - [[ -n "$LABEL" ]] && CMD="$CMD --label \"$LABEL\"" - [[ -n "$MILESTONE" ]] && CMD="$CMD --milestone \"$MILESTONE\"" - [[ -n "$ASSIGNEE" ]] && CMD="$CMD --assignee \"$ASSIGNEE\"" - eval "$CMD" + CMD=(gh issue list --repo "$REPO_INFO" --state "$STATE" --limit "$LIMIT") + [[ -n "$LABEL" ]] && CMD+=(--label "$LABEL") + [[ -n "$MILESTONE" ]] && CMD+=(--milestone "$MILESTONE") + [[ -n "$ASSIGNEE" ]] && CMD+=(--assignee "$ASSIGNEE") + "${CMD[@]}" ;; gitea) - CMD="tea issues list --state $STATE --limit $LIMIT" - [[ -n "$LABEL" ]] && CMD="$CMD --labels \"$LABEL\"" - [[ -n "$MILESTONE" ]] && CMD="$CMD --milestones \"$MILESTONE\"" - # Note: tea may not support assignee filter directly - eval "$CMD" - if [[ -n "$ASSIGNEE" ]]; then - echo "Note: Assignee filtering may require manual review for Gitea" >&2 - fi + CMD=(tea issues list --repo "$REPO_INFO" --state "$STATE" --limit "$LIMIT") + [[ -n "$LABEL" ]] && CMD+=(--labels "$LABEL") + [[ -n "$MILESTONE" ]] && CMD+=(--milestones "$MILESTONE") + [[ -n "$ASSIGNEE" ]] && CMD+=(--assignee "$ASSIGNEE") + "${CMD[@]}" ;; *) echo "Error: Could not detect git platform" >&2 diff --git a/packages/mosaic/framework/tools/git/pr-ci-wait.sh b/packages/mosaic/framework/tools/git/pr-ci-wait.sh index 4844a21..bdddb58 100755 --- a/packages/mosaic/framework/tools/git/pr-ci-wait.sh +++ b/packages/mosaic/framework/tools/git/pr-ci-wait.sh @@ -1,6 +1,6 @@ #!/bin/bash # pr-ci-wait.sh - Wait for PR CI status to reach terminal state (GitHub/Gitea) -# Usage: pr-ci-wait.sh -n [-t timeout_sec] [-i interval_sec] +# Usage: pr-ci-wait.sh -n [-r owner/repo] [-t timeout_sec] [-i interval_sec] set -euo pipefail @@ -10,6 +10,7 @@ source "$SCRIPT_DIR/detect-platform.sh" PR_NUMBER="" TIMEOUT_SEC=1800 INTERVAL_SEC=15 +REPO_OVERRIDE="" usage() { cat < [-t timeout_sec] [-i interval_sec] Options: -n, --number NUMBER PR number (required) + -r, --repo OWNER/REPO Repository slug (default: infer from git origin) -t, --timeout SECONDS Max wait time in seconds (default: 1800) -i, --interval SECONDS Poll interval in seconds (default: 15) -h, --help Show this help Examples: $(basename "$0") -n 643 + $(basename "$0") -n 643 --repo ddk/ai-bma $(basename "$0") -n 643 -t 900 -i 10 EOF } @@ -95,7 +98,7 @@ PY } github_get_pr_head_sha() { - gh pr view "$PR_NUMBER" --json headRefOid --jq '.headRefOid' + gh pr view "$PR_NUMBER" --repo "$OWNER/$REPO" --json headRefOid --jq '.headRefOid' } github_get_commit_status_json() { @@ -132,6 +135,10 @@ while [[ $# -gt 0 ]]; do PR_NUMBER="$2" shift 2 ;; + -r|--repo) + REPO_OVERRIDE="$2" + shift 2 + ;; -t|--timeout) TIMEOUT_SEC="$2" shift 2 @@ -163,10 +170,21 @@ if ! [[ "$TIMEOUT_SEC" =~ ^[0-9]+$ ]] || ! [[ "$INTERVAL_SEC" =~ ^[0-9]+$ ]]; th exit 1 fi -detect_platform > /dev/null +if [[ -n "$REPO_OVERRIDE" ]]; then + REPO_INFO="$REPO_OVERRIDE" + PLATFORM=$(detect_platform 2>/dev/null || echo gitea) +else + detect_platform > /dev/null + REPO_INFO=$(get_repo_info) +fi -OWNER=$(get_repo_owner) -REPO=$(get_repo_name) +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* || "$REPO_INFO" != */* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo owner/repo." >&2 + exit 1 +fi + +OWNER=${REPO_INFO%%/*} +REPO=${REPO_INFO##*/} START_TS=$(date +%s) DEADLINE_TS=$((START_TS + TIMEOUT_SEC)) @@ -182,10 +200,7 @@ if [[ "$PLATFORM" == "github" ]]; then fi echo "[pr-ci-wait] Platform=github PR=#${PR_NUMBER} head_sha=${HEAD_SHA}" elif [[ "$PLATFORM" == "gitea" ]]; then - HOST=$(get_remote_host) || { - echo "Error: Could not determine remote host." >&2 - exit 1 - } + HOST=$(get_remote_host 2>/dev/null || echo "git.mosaicstack.dev") TOKEN=$(get_gitea_token "$HOST") || { echo "Error: Gitea token not found. Set GITEA_TOKEN or configure ~/.git-credentials." >&2 exit 1 @@ -195,7 +210,7 @@ elif [[ "$PLATFORM" == "gitea" ]]; then echo "Error: Could not resolve head SHA for PR #$PR_NUMBER." >&2 exit 1 fi - echo "[pr-ci-wait] Platform=gitea host=${HOST} PR=#${PR_NUMBER} head_sha=${HEAD_SHA}" + echo "[pr-ci-wait] Platform=gitea host=${HOST} repo=${OWNER}/${REPO} PR=#${PR_NUMBER} head_sha=${HEAD_SHA}" else echo "Error: Unsupported platform '${PLATFORM}'." >&2 exit 1 diff --git a/packages/mosaic/framework/tools/git/pr-diff.sh b/packages/mosaic/framework/tools/git/pr-diff.sh index 0fdafd6..c905029 100755 --- a/packages/mosaic/framework/tools/git/pr-diff.sh +++ b/packages/mosaic/framework/tools/git/pr-diff.sh @@ -1,6 +1,6 @@ #!/bin/bash # pr-diff.sh - Get the diff for a pull request on GitHub or Gitea -# Usage: pr-diff.sh -n [-o ] +# Usage: pr-diff.sh -n [-r owner/repo] [-o ] set -e @@ -10,6 +10,7 @@ source "$SCRIPT_DIR/detect-platform.sh" # Parse arguments PR_NUMBER="" OUTPUT_FILE="" +REPO_OVERRIDE="" while [[ $# -gt 0 ]]; do case $1 in @@ -21,11 +22,16 @@ while [[ $# -gt 0 ]]; do OUTPUT_FILE="$2" shift 2 ;; + -r|--repo) + REPO_OVERRIDE="$2" + shift 2 + ;; -h|--help) - echo "Usage: pr-diff.sh -n [-o ]" + echo "Usage: pr-diff.sh -n [-r owner/repo] [-o ]" echo "" echo "Options:" echo " -n, --number PR number (required)" + echo " -r, --repo Repository slug (default: infer from git origin)" echo " -o, --output Output file (optional, prints to stdout if omitted)" echo " -h, --help Show this help" exit 0 @@ -42,31 +48,30 @@ if [[ -z "$PR_NUMBER" ]]; then exit 1 fi -detect_platform > /dev/null +if [[ -n "$REPO_OVERRIDE" ]]; then + REPO_INFO="$REPO_OVERRIDE" + PLATFORM=$(detect_platform 2>/dev/null || echo gitea) +else + detect_platform > /dev/null + REPO_INFO=$(get_repo_info) +fi + +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2 + exit 1 +fi if [[ "$PLATFORM" == "github" ]]; then if [[ -n "$OUTPUT_FILE" ]]; then - gh pr diff "$PR_NUMBER" > "$OUTPUT_FILE" + gh pr diff "$PR_NUMBER" --repo "$REPO_INFO" --repo "$REPO_INFO" > "$OUTPUT_FILE" else - gh pr diff "$PR_NUMBER" + gh pr diff "$PR_NUMBER" --repo "$REPO_INFO" fi elif [[ "$PLATFORM" == "gitea" ]]; then # tea doesn't have a direct diff command — use the API - OWNER=$(get_repo_owner) - REPO=$(get_repo_name) - REMOTE_URL=$(git remote get-url origin 2>/dev/null) + HOST=$(get_remote_host 2>/dev/null || echo "git.mosaicstack.dev") - # Extract host from remote URL - if [[ "$REMOTE_URL" == https://* ]]; then - HOST=$(echo "$REMOTE_URL" | sed -E 's|https://([^/]+)/.*|\1|') - elif [[ "$REMOTE_URL" == git@* ]]; then - HOST=$(echo "$REMOTE_URL" | sed -E 's|git@([^:]+):.*|\1|') - else - echo "Error: Cannot determine host from remote URL" >&2 - exit 1 - fi - - DIFF_URL="https://${HOST}/api/v1/repos/${OWNER}/${REPO}/pulls/${PR_NUMBER}.diff" + DIFF_URL="https://${HOST}/api/v1/repos/${REPO_INFO}/pulls/${PR_NUMBER}.diff" GITEA_API_TOKEN=$(get_gitea_token "$HOST" || true) diff --git a/packages/mosaic/framework/tools/git/pr-list.sh b/packages/mosaic/framework/tools/git/pr-list.sh index 27a03cd..cc25301 100755 --- a/packages/mosaic/framework/tools/git/pr-list.sh +++ b/packages/mosaic/framework/tools/git/pr-list.sh @@ -1,6 +1,6 @@ #!/bin/bash # pr-list.sh - List pull requests on Gitea or GitHub -# Usage: pr-list.sh [-s state] [-l label] [-a author] +# Usage: pr-list.sh [-r owner/repo] [-s state] [-l label] [-a author] set -e @@ -12,6 +12,7 @@ STATE="open" LABEL="" AUTHOR="" LIMIT=100 +REPO_OVERRIDE="" usage() { cat </dev/null || echo gitea) +else + PLATFORM=$(detect_platform) + REPO_INFO=$(get_repo_info) +fi + +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2 + exit 1 +fi case "$PLATFORM" in github) - CMD="gh pr list --state $STATE --limit $LIMIT" - [[ -n "$LABEL" ]] && CMD="$CMD --label \"$LABEL\"" - [[ -n "$AUTHOR" ]] && CMD="$CMD --author \"$AUTHOR\"" - eval "$CMD" + CMD=(gh pr list --repo "$REPO_INFO" --state "$STATE" --limit "$LIMIT") + [[ -n "$LABEL" ]] && CMD+=(--label "$LABEL") + [[ -n "$AUTHOR" ]] && CMD+=(--author "$AUTHOR") + "${CMD[@]}" ;; gitea) - # tea pr list - note: tea uses 'pulls' subcommand in some versions - CMD="tea pr list --state $STATE --limit $LIMIT" + CMD=(tea pr list --repo "$REPO_INFO" --state "$STATE" --limit "$LIMIT") # tea filtering may be limited if [[ -n "$LABEL" ]]; then @@ -84,7 +103,7 @@ case "$PLATFORM" in echo "Note: Author filtering may require manual review for Gitea" >&2 fi - eval "$CMD" + "${CMD[@]}" ;; *) echo "Error: Could not detect git platform" >&2 diff --git a/packages/mosaic/framework/tools/git/pr-view.sh b/packages/mosaic/framework/tools/git/pr-view.sh index 7836e09..4f6c996 100755 --- a/packages/mosaic/framework/tools/git/pr-view.sh +++ b/packages/mosaic/framework/tools/git/pr-view.sh @@ -1,6 +1,6 @@ #!/bin/bash # pr-view.sh - View pull request details on GitHub or Gitea -# Usage: pr-view.sh -n +# Usage: pr-view.sh -n [-r owner/repo] set -e @@ -9,6 +9,7 @@ source "$SCRIPT_DIR/detect-platform.sh" # Parse arguments PR_NUMBER="" +REPO_OVERRIDE="" while [[ $# -gt 0 ]]; do case $1 in @@ -16,11 +17,16 @@ while [[ $# -gt 0 ]]; do PR_NUMBER="$2" shift 2 ;; + -r|--repo) + REPO_OVERRIDE="$2" + shift 2 + ;; -h|--help) - echo "Usage: pr-view.sh -n " + echo "Usage: pr-view.sh -n [-r owner/repo]" echo "" echo "Options:" echo " -n, --number PR number (required)" + echo " -r, --repo Repository slug (default: infer from git origin)" echo " -h, --help Show this help" exit 0 ;; @@ -36,12 +42,23 @@ if [[ -z "$PR_NUMBER" ]]; then exit 1 fi -detect_platform +if [[ -n "$REPO_OVERRIDE" ]]; then + REPO_INFO="$REPO_OVERRIDE" + PLATFORM=$(detect_platform 2>/dev/null || echo gitea) +else + detect_platform > /dev/null + REPO_INFO=$(get_repo_info) +fi + +if [[ -z "$REPO_INFO" || "$REPO_INFO" == error:* ]]; then + echo "Error: Could not determine repository from git origin. Run from a repo or pass --repo." >&2 + exit 1 +fi if [[ "$PLATFORM" == "github" ]]; then - gh pr view "$PR_NUMBER" + gh pr view "$PR_NUMBER" --repo "$REPO_INFO" elif [[ "$PLATFORM" == "gitea" ]]; then - tea pr "$PR_NUMBER" + tea pr "$PR_NUMBER" --repo "$REPO_INFO" else echo "Error: Unknown platform" exit 1 -- 2.49.1 From 2f5b6ca2e7751c484479031280855c34798727d3 Mon Sep 17 00:00:00 2001 From: Jarvis Date: Mon, 25 May 2026 14:20:13 -0500 Subject: [PATCH 4/4] fix(git): avoid duplicate gh repo flag in pr-diff --- packages/mosaic/framework/tools/git/pr-diff.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mosaic/framework/tools/git/pr-diff.sh b/packages/mosaic/framework/tools/git/pr-diff.sh index c905029..2b2cfc7 100755 --- a/packages/mosaic/framework/tools/git/pr-diff.sh +++ b/packages/mosaic/framework/tools/git/pr-diff.sh @@ -63,7 +63,7 @@ fi if [[ "$PLATFORM" == "github" ]]; then if [[ -n "$OUTPUT_FILE" ]]; then - gh pr diff "$PR_NUMBER" --repo "$REPO_INFO" --repo "$REPO_INFO" > "$OUTPUT_FILE" + gh pr diff "$PR_NUMBER" --repo "$REPO_INFO" > "$OUTPUT_FILE" else gh pr diff "$PR_NUMBER" --repo "$REPO_INFO" fi -- 2.49.1