From b332364b43b51d953b405db76d5f7def4d3027ee Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Wed, 18 Mar 2026 23:45:27 -0700 Subject: [PATCH] refactor: add PROJECTS_DIR to gstack-slug and getProjectsDir() to util.ts gstack-slug now outputs PROJECTS_DIR (respecting GSTACK_STATE_DIR env var). lib/util.ts gets getProjectsDir(slug?) as single source of truth for TypeScript consumers. Co-Authored-By: Claude Opus 4.6 (1M context) --- bin/gstack-slug | 3 +++ lib/util.ts | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/bin/gstack-slug b/bin/gstack-slug index d31cd5a3..6d6cd63d 100755 --- a/bin/gstack-slug +++ b/bin/gstack-slug @@ -5,5 +5,8 @@ set -euo pipefail SLUG=$(git remote get-url origin 2>/dev/null | sed 's|.*[:/]\([^/]*/[^/]*\)\.git$|\1|;s|.*[:/]\([^/]*/[^/]*\)$|\1|' | tr '/' '-' | tr '[:upper:]' '[:lower:]') BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null | tr '/' '-') +STATE_DIR="${GSTACK_STATE_DIR:-$HOME/.gstack}" +PROJECTS_DIR="${STATE_DIR}/projects" echo "SLUG=$SLUG" echo "BRANCH=$BRANCH" +echo "PROJECTS_DIR=$PROJECTS_DIR" diff --git a/lib/util.ts b/lib/util.ts index b5b6df02..becc3490 100644 --- a/lib/util.ts +++ b/lib/util.ts @@ -15,6 +15,12 @@ import { spawnSync } from 'child_process'; export const GSTACK_STATE_DIR = process.env.GSTACK_STATE_DIR || path.join(os.homedir(), '.gstack'); export const GSTACK_DEV_DIR = path.join(os.homedir(), '.gstack-dev'); +/** Get the projects directory, optionally scoped to a specific project slug. */ +export function getProjectsDir(slug?: string): string { + const base = path.join(GSTACK_STATE_DIR, 'projects'); + return slug ? path.join(base, slug) : base; +} + // --- File I/O --- /** Atomic write: write to .tmp then rename. Non-fatal on error. */