mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-02 15:04:37 +01:00
v1.92.22.0 feat: Gemini CLI host, and older installs drop the dev toolchain (#3778)
* setup: explicit contributor marker; move pre-v1.91.231.0 installs to production deps (#3447) ./setup used node_modules/typescript as its contributor signal, so every install made before v1.91.231.0 (a full bun install) kept ~520 MB of test and eval packages forever. The contributor is now the clone bin/dev-setup marks with git config gstack.contributor true, or GSTACK_CONTRIBUTOR=1. An unmarked clone with the dev toolchain moves node_modules aside under a checkout lock, installs production-only, verifies every dependency, and drops the backup; any failure puts the full install back with SETUP_DEPS_MIGRATE_FAILED. CI and a clone whose git config cannot be read never migrate. Bun cache entries for the pinned Agent SDK are removed only when no other project links to them. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * hosts: add Gemini CLI as an experimental host (#1247) ./setup --host gemini (alias gemini-cli; --host auto when gemini is on PATH) installs gstack-<skill> directories into ~/.gemini/skills, which Gemini CLI 0.66.0 lists with gemini skills list, plus the ~/.gemini/skills/gstack runtime root. Renders go to .gemini-cli/ (gitignored) with name+description frontmatter whose names match their directories, CLAUDE.md rewritten to GEMINI.md, and a tool glossary for Gemini CLI's names (and Antigravity's, which can read the same folder). gstack-uninstall removes only gstack-managed entries there, so the user's own skills stay. Docs: ADDING_A_HOST.md verified facts, hosts.md, uninstall.md, README. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix: pre-landing review fixes (leave Bun's shared cache alone) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * changelog: Gemini CLI host and contributor marker (#1247, #3447) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs: host lists name Copilot, Antigravity and Gemini CLI Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test: the plan-mode re-render guard count includes the Gemini CLI host Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs: troubleshooting's runtime-root guard host list names Gemini CLI 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>
This commit is contained in:
1 parent
c03f185d15
commit
e4e4e42967
34 files changed
+910
-74
No files matched your search
+6
-3
@@ -22,9 +22,12 @@ if [ ! -f "$REPO_ROOT/.env" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# 2. Install dependencies, devDependencies included. Always run: a checkout
|
||||
# first installed by ./setup has production dependencies only, and an
|
||||
# up-to-date install is a no-op.
|
||||
# 2. Install dependencies, devDependencies included, and mark this clone as a
|
||||
# contributor's (#3447) so ./setup keeps the dev toolchain instead of moving it
|
||||
# to the production-only install. Always run: a checkout first installed by
|
||||
# ./setup has production dependencies only, and an up-to-date install is a no-op.
|
||||
git -C "$REPO_ROOT" config --local gstack.contributor true 2>/dev/null \
|
||||
|| echo "Warning: could not set git config gstack.contributor in $REPO_ROOT; export GSTACK_CONTRIBUTOR=1 before ./setup to keep the dev toolchain." >&2
|
||||
echo "Installing dependencies..."
|
||||
(cd "$REPO_ROOT" && bun install)
|
||||
|
||||
|
||||
@@ -141,6 +141,7 @@ gstack_result_anchor() {
|
||||
BROWSER_UNAVAILABLE) printf '%s' 'browser-ensure-failed' ;;
|
||||
INSTALL_PREFLIGHT_FAILED) printf '%s' 'capy-install-preflight-failed' ;;
|
||||
SETUP_PS1_EMPTY_ARGUMENT) printf '%s' 'setup-ps1-empty-argument' ;;
|
||||
SETUP_DEPS_MIGRATE_FAILED) printf '%s' 'setup-deps-migrate-failed' ;;
|
||||
POLICY_SOURCE_UNAVAILABLE) printf '%s' 'policy-source-unavailable' ;;
|
||||
POLICY_INVALID) printf '%s' 'policy-invalid' ;;
|
||||
POLICY_CONTAINMENT) printf '%s' 'policy-containment' ;;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
# host:render-dir for every host whose render lives in its own checkout dir.
|
||||
# Claude renders into the tracked tree. test/host-renders.test.ts keeps this
|
||||
# equal to hostSubdir in hosts/*.ts.
|
||||
GSTACK_HOST_RENDER_DIRS="codex:.agents kiro:.kiro factory:.factory opencode:.opencode cursor:.cursor copilot:.copilot agy:.agy slate:.slate openclaw:.openclaw hermes:.hermes gbrain:.gbrain"
|
||||
GSTACK_HOST_RENDER_DIRS="codex:.agents kiro:.kiro factory:.factory opencode:.opencode cursor:.cursor copilot:.copilot agy:.agy gemini:.gemini-cli slate:.slate openclaw:.openclaw hermes:.hermes gbrain:.gbrain"
|
||||
|
||||
gstack_render_hosts_file() { printf '%s/.gstack-installed-hosts\n' "$1"; }
|
||||
|
||||
|
||||
@@ -184,7 +184,7 @@ gstack_install_render_for() {
|
||||
gstack_host_tier() {
|
||||
case "$1" in
|
||||
claude) echo full ;;
|
||||
codex|kiro|factory|opencode|cursor|copilot|agy|openclaw|hermes) echo experimental ;;
|
||||
codex|kiro|factory|opencode|cursor|copilot|agy|gemini|openclaw|hermes) echo experimental ;;
|
||||
slate|gbrain) echo instruction-only ;;
|
||||
*) echo unknown ;;
|
||||
esac
|
||||
@@ -256,6 +256,7 @@ gstack_install_known_roots() {
|
||||
printf 'cursor\tglobal\t%s\t%s\n' "$HOME/.cursor/skills" "$HOME/.cursor/skills/gstack"
|
||||
printf 'copilot\tglobal\t%s\t%s\n' "$HOME/.copilot/skills" "$HOME/.copilot/skills/gstack"
|
||||
printf 'agy\tglobal\t%s\t%s\n' "$HOME/.gemini/antigravity-cli/skills" "$HOME/.gemini/antigravity-cli/skills/gstack"
|
||||
printf 'gemini\tglobal\t%s\t%s\n' "$HOME/.gemini/skills" "$HOME/.gemini/skills/gstack"
|
||||
proj="$(git rev-parse --show-toplevel 2>/dev/null || true)"
|
||||
if [ -n "$proj" ] && [ "$proj" != "$HOME" ]; then
|
||||
printf 'claude\tproject\t%s\t%s\n' "$proj/.claude/skills" "$proj/.claude/skills/gstack"
|
||||
|
||||
@@ -82,7 +82,7 @@ else
|
||||
|
||||
```bash
|
||||
_GS=""
|
||||
for _D in "${GSTACK_ROOT:-}" "$HOME/.claude/skills/gstack" "$HOME/.codex/skills/gstack" "$HOME/.factory/skills/gstack" "$HOME/.kiro/skills/gstack" "$HOME/.config/opencode/skills/gstack" "$HOME/.slate/skills/gstack" "$HOME/.cursor/skills/gstack" "$HOME/.openclaw/skills/gstack" "$HOME/.hermes/skills/gstack" "$HOME/.gbrain/skills/gstack" "$HOME/.copilot/skills/gstack" "$HOME/.gemini/antigravity-cli/skills/gstack" "$HOME/.gstack/repos/gstack"; do
|
||||
for _D in "${GSTACK_ROOT:-}" "$HOME/.claude/skills/gstack" "$HOME/.codex/skills/gstack" "$HOME/.factory/skills/gstack" "$HOME/.kiro/skills/gstack" "$HOME/.config/opencode/skills/gstack" "$HOME/.slate/skills/gstack" "$HOME/.cursor/skills/gstack" "$HOME/.openclaw/skills/gstack" "$HOME/.hermes/skills/gstack" "$HOME/.gbrain/skills/gstack" "$HOME/.copilot/skills/gstack" "$HOME/.gemini/antigravity-cli/skills/gstack" "$HOME/.gemini/skills/gstack" "$HOME/.gstack/repos/gstack"; do
|
||||
[ -z "$_GS" ] && [ -n "$_D" ] && [ -d "$_D/bin" ] && _GS="$_D"
|
||||
done
|
||||
[ -n "$_GS" ] && echo "GSTACK_OK: $_GS" || echo "GSTACK_MISSING"
|
||||
@@ -153,7 +153,7 @@ const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
||||
const roots = [process.env.GSTACK_ROOT || ''].concat([
|
||||
'.claude/skills/gstack', '.codex/skills/gstack', '.factory/skills/gstack', '.kiro/skills/gstack',
|
||||
'.config/opencode/skills/gstack', '.slate/skills/gstack', '.cursor/skills/gstack', '.openclaw/skills/gstack',
|
||||
'.hermes/skills/gstack', '.gbrain/skills/gstack', '.copilot/skills/gstack', '.gemini/antigravity-cli/skills/gstack', '.gstack/repos/gstack',
|
||||
'.hermes/skills/gstack', '.gbrain/skills/gstack', '.copilot/skills/gstack', '.gemini/antigravity-cli/skills/gstack', '.gemini/skills/gstack', '.gstack/repos/gstack',
|
||||
].map((rel) => path.join(home, rel)));
|
||||
const gstackRoot = roots.find((root) => {
|
||||
try { return root !== '' && fs.statSync(path.join(root, 'bin')).isDirectory(); } catch { return false; }
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
# ~/.config/opencode/skills/gstack* — OpenCode skill install + per-skill symlinks
|
||||
# ~/.copilot/skills/gstack* — GitHub Copilot CLI skill install + per-skill symlinks
|
||||
# ~/.gemini/antigravity-cli/skills/gstack* — Antigravity CLI skill install + per-skill symlinks
|
||||
# ~/.gemini/skills/gstack* — Gemini CLI skill install + per-skill symlinks (gstack-managed only)
|
||||
# harness registrations — every file gstack-harness wrote into OpenClaw,
|
||||
# Hermes, a Dot or another harness (from its
|
||||
# ledger; edited files move to a backup), and
|
||||
@@ -141,6 +142,7 @@ if [ "$FORCE" -eq 0 ]; then
|
||||
[ -d "$HOME/.config/opencode/skills" ] && echo " ~/.config/opencode/skills/gstack*"
|
||||
[ -d "$HOME/.copilot/skills" ] && echo " ~/.copilot/skills/gstack*"
|
||||
[ -d "$HOME/.gemini/antigravity-cli/skills" ] && echo " ~/.gemini/antigravity-cli/skills/gstack*"
|
||||
[ -d "$HOME/.gemini/skills" ] && echo " ~/.gemini/skills/gstack*"
|
||||
[ "$KEEP_STATE" -eq 0 ] && [ -d "$STATE_DIR" ] && echo " $STATE_DIR"
|
||||
[ -n "$_LEAVE_ROOT" ] && echo " (kept) $_LEAVE_ROOT: state root selected by $RESOLVED_VAR; left in place"
|
||||
|
||||
@@ -546,6 +548,22 @@ if [ -d "$ANTIGRAVITY_SKILLS" ]; then
|
||||
done
|
||||
fi
|
||||
|
||||
# ─── Remove Gemini CLI skills ───────────────────────────────
|
||||
# Same provenance gate. ~/.gemini/skills also holds the user's own skills, so
|
||||
# only gstack-managed gstack* entries go.
|
||||
GEMINI_SKILLS="$HOME/.gemini/skills"
|
||||
if [ -d "$GEMINI_SKILLS" ]; then
|
||||
for _ITEM in "$GEMINI_SKILLS"/gstack*; do
|
||||
[ -e "$_ITEM" ] || [ -L "$_ITEM" ] || continue
|
||||
if _cursor_item_is_gstack_managed "$_ITEM"; then
|
||||
rm -rf "$_ITEM"
|
||||
REMOVED+=("gemini/$(basename "$_ITEM")")
|
||||
else
|
||||
_SKIPPED_DIRS+=("$_ITEM")
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# ─── Reconcile the install registry ─────────────────────────
|
||||
# A registry that survives (--keep-state, or a state root selected by an env
|
||||
# var and left in place) must forget the installs removed above, or the next
|
||||
|
||||
Reference in new issue
Block a user