From 41c224afffb9815e13425f13c30e8a4e101e2a1f Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Thu, 6 Aug 2026 15:39:33 -0500 Subject: [PATCH] feat(tools/git): explain tea's misleading `user does not exist` error `user does not exist [uid: 0, name: ]` from tea reads as a missing account. It almost always means a revoked or stale token: `tea login` keeps its own copy of the token, so rotating the credential store does not update it. The error points at the account; the cause is the cached credential. Adds explain_tea_user_does_not_exist() to detect-platform.sh and invokes it from the three tea-failure fallback paths, each guarded by `declare -F` so the call site is independent of load order and a no-op if the helper is absent. Purely additive: stderr only, no control flow, no gate or credential changes. Verified both directions: the helper emits when sourced, and the guarded call is a silent no-op (exit 1, no output) when it is not. Refs #1082 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Amf1Neca162odgcbCWMk1y --- .../mosaic/framework/tools/git/detect-platform.sh | 15 +++++++++++++++ .../mosaic/framework/tools/git/issue-create.sh | 1 + packages/mosaic/framework/tools/git/issue-view.sh | 1 + packages/mosaic/framework/tools/git/pr-create.sh | 1 + 4 files changed, 18 insertions(+) diff --git a/packages/mosaic/framework/tools/git/detect-platform.sh b/packages/mosaic/framework/tools/git/detect-platform.sh index a06452d1..5a78920c 100755 --- a/packages/mosaic/framework/tools/git/detect-platform.sh +++ b/packages/mosaic/framework/tools/git/detect-platform.sh @@ -246,6 +246,21 @@ PY } >&2 } +# Explain tea's most misleading failure. `user does not exist [uid: 0, name: ]` reads +# as a missing account; it almost always means a REVOKED OR STALE TOKEN. `tea login` +# keeps its OWN COPY of the token, so rotating the credential store does not update it. +# Diagnostic only -- stderr, no control flow, no exit. +explain_tea_user_does_not_exist() { + cat >&2 <<'MSG' +NOTE: `user does not exist [uid: 0, name: ]` from tea usually means a REVOKED OR STALE TOKEN, + not a missing account. A `tea login` stores its OWN COPY of the token; rotating the + credential store does NOT update it. + CHECK: the login's cached copy (`tea login list` -- read the FULL table, never `| head`), + then re-register that login against the current token. + DO NOT probe capability with a mutating request; a POST is the action, not a check. +MSG +} + get_gitea_login_for_host() { local host="${1:-}" local login diff --git a/packages/mosaic/framework/tools/git/issue-create.sh b/packages/mosaic/framework/tools/git/issue-create.sh index 96f890cf..5ab8f871 100755 --- a/packages/mosaic/framework/tools/git/issue-create.sh +++ b/packages/mosaic/framework/tools/git/issue-create.sh @@ -156,6 +156,7 @@ case "$PLATFORM" in exit 0 fi echo "Warning: tea issue create failed, trying Gitea API fallback..." >&2 + declare -F explain_tea_user_does_not_exist >/dev/null && explain_tea_user_does_not_exist fi gitea_issue_create_api ;; diff --git a/packages/mosaic/framework/tools/git/issue-view.sh b/packages/mosaic/framework/tools/git/issue-view.sh index eccab98e..aaf48ae6 100755 --- a/packages/mosaic/framework/tools/git/issue-view.sh +++ b/packages/mosaic/framework/tools/git/issue-view.sh @@ -71,6 +71,7 @@ elif [[ "$PLATFORM" == "gitea" ]]; then exit 0 fi echo "Warning: tea issue view failed, trying Gitea API fallback..." >&2 + declare -F explain_tea_user_does_not_exist >/dev/null && explain_tea_user_does_not_exist fi gitea_issue_view_api else diff --git a/packages/mosaic/framework/tools/git/pr-create.sh b/packages/mosaic/framework/tools/git/pr-create.sh index 46b82a64..380182ff 100755 --- a/packages/mosaic/framework/tools/git/pr-create.sh +++ b/packages/mosaic/framework/tools/git/pr-create.sh @@ -219,6 +219,7 @@ case "$PLATFORM" in exit 0 fi echo "Warning: tea pr create failed, trying Gitea API fallback..." >&2 + declare -F explain_tea_user_does_not_exist >/dev/null && explain_tea_user_does_not_exist gitea_pr_create_api ;; *)