mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-02 23:14:33 +01:00
* feat: a .gstack-project marker makes a nested repo or umbrella folder its own project (#2649, #1923) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test: marker tests ignore an ambient GSTACK_STATE_ROOT Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: pre-landing review fixes (per-repo records ignore every marker, worktree binding in remote-slug and under a git HOME) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(slug): a linked worktree finds its main checkout's marker on its first run The worktree binding was written only when the main checkout resolved, so a worktree outside an umbrella resolved first kept its old bucket and later switched. Walk up from the main checkout on a miss instead (under its own $HOME rule) and drop the binding file. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs/test: pregate user policy names REPO_SLUG; pin greptile consent to REPO_SLUG Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(slug): no-clobber checkpoint recovery, unambiguous marker cache keys, ignore unusable folder names; remote-slug resolves once Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(slug): remote-slug reads a quoted marker path; repo mode stays per repository Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(slug): the review log and /ship spend-cap pointer stay with the repository under a marker; recovered checkpoints keep their repository; a linked worktree's own marker stands for its main checkout Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs(captain): approvals live under the repository's own slug Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --------- Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
49 lines
2.6 KiB
Bash
Executable File
49 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# gstack-review-read — read review log and config for dashboard
|
|
# Usage: gstack-review-read
|
|
#
|
|
# Emits, in order: reviews JSONL with computed review_freshness, ---CONFIG--- (skip_eng_review),
|
|
# ---HEAD--- (short sha), ---WTREE--- (current working-tree fingerprint from
|
|
# bin/gstack-wtree, or "unknown"), ---TREE--- (HEAD tree, informational) and
|
|
# ---DIRTY--- (tracked-file dirty flag). Consumers grade diff-scoped review
|
|
# rows using review_freshness; legacy or uncaptured diff evidence cannot fall
|
|
# back to HEAD equality. Plan rows are unchanged.
|
|
set -euo pipefail
|
|
GSTACK_BUN_CONFIG=/dev/null; case "${OSTYPE:-}" in msys*|cygwin*) if command -v cygpath >/dev/null 2>&1; then GSTACK_BUN_CONFIG=NUL; fi ;; esac
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
case "$(uname -s)" in
|
|
MINGW*|MSYS*|CYGWIN*) command -v cygpath >/dev/null 2>&1 && SCRIPT_DIR="$(cygpath -m "$SCRIPT_DIR")" ;;
|
|
esac
|
|
eval "$("$SCRIPT_DIR/gstack-slug" 2>/dev/null)"
|
|
SLUG=$("$SCRIPT_DIR/gstack-slug" --get REPO_SLUG 2>/dev/null || true)
|
|
. "$(dirname "$0")/gstack-state-root.sh" 2>/dev/null || { echo "$0: cannot resolve the gstack state root: $(dirname "$0")/gstack-state-root.sh is missing. fix: reinstall with ./setup or /gstack-upgrade (docs/state-root.md)" >&2; exit 1; }
|
|
gstack_state_root_select
|
|
GSTACK_HOME="$_gstack_sr_root"
|
|
WTREE=$("$SCRIPT_DIR/gstack-wtree" 2>/dev/null || echo "unknown")
|
|
if [ -f "$GSTACK_HOME/projects/$SLUG/$BRANCH-reviews.jsonl" ]; then
|
|
GSTACK_REVIEW_LIB="$SCRIPT_DIR/../lib/review-evidence.ts" GSTACK_REVIEW_WTREE="$WTREE" bun --no-env-file --config="${GSTACK_BUN_CONFIG:-/dev/null}" -e '
|
|
const { reviewFreshness } = await import(process.env.GSTACK_REVIEW_LIB);
|
|
for (const line of (await Bun.stdin.text()).split("\n").filter(Boolean)) {
|
|
try {
|
|
const rec = JSON.parse(line);
|
|
delete rec.review_freshness;
|
|
const freshness = reviewFreshness(rec, process.env.GSTACK_REVIEW_WTREE);
|
|
if (freshness) rec.review_freshness = freshness;
|
|
console.log(JSON.stringify(rec));
|
|
} catch { console.error("gstack-review-read: skipping malformed review row"); }
|
|
}
|
|
' < "$GSTACK_HOME/projects/$SLUG/$BRANCH-reviews.jsonl"
|
|
else
|
|
echo "NO_REVIEWS"
|
|
fi
|
|
echo "---CONFIG---"
|
|
"$SCRIPT_DIR/gstack-config" get skip_eng_review 2>/dev/null || echo "false"
|
|
echo "---HEAD---"
|
|
git rev-parse --short HEAD 2>/dev/null || echo "unknown"
|
|
echo "---WTREE---"
|
|
echo "$WTREE"
|
|
echo "---TREE---"
|
|
git rev-parse 'HEAD^{tree}' 2>/dev/null || echo "unknown"
|
|
echo "---DIRTY---"
|
|
if [ -n "$(git status --porcelain -uno 2>/dev/null | head -1)" ]; then echo "true"; else echo "false"; fi
|