mirror of https://github.com/garrytan/gstack.git
fix: support cursor host in setup
Enable the documented Cursor install path by wiring setup to generate Cursor-specific skills and install them under ~/.cursor/skills with a minimal gstack runtime root. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
db9447c333
commit
e727316625
140
setup
140
setup
|
|
@ -20,6 +20,8 @@ INSTALL_SKILLS_DIR="$(dirname "$INSTALL_GSTACK_DIR")"
|
||||||
BROWSE_BIN="$SOURCE_GSTACK_DIR/browse/dist/browse"
|
BROWSE_BIN="$SOURCE_GSTACK_DIR/browse/dist/browse"
|
||||||
CODEX_SKILLS="$HOME/.codex/skills"
|
CODEX_SKILLS="$HOME/.codex/skills"
|
||||||
CODEX_GSTACK="$CODEX_SKILLS/gstack"
|
CODEX_GSTACK="$CODEX_SKILLS/gstack"
|
||||||
|
CURSOR_SKILLS="$HOME/.cursor/skills"
|
||||||
|
CURSOR_GSTACK="$CURSOR_SKILLS/gstack"
|
||||||
FACTORY_SKILLS="$HOME/.factory/skills"
|
FACTORY_SKILLS="$HOME/.factory/skills"
|
||||||
FACTORY_GSTACK="$FACTORY_SKILLS/gstack"
|
FACTORY_GSTACK="$FACTORY_SKILLS/gstack"
|
||||||
OPENCODE_SKILLS="$HOME/.config/opencode/skills"
|
OPENCODE_SKILLS="$HOME/.config/opencode/skills"
|
||||||
|
|
@ -43,7 +45,7 @@ TEAM_MODE=0
|
||||||
NO_TEAM_MODE=0
|
NO_TEAM_MODE=0
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--host) [ -z "$2" ] && echo "Missing value for --host (expected claude, codex, kiro, factory, opencode, openclaw, hermes, gbrain, or auto)" >&2 && exit 1; HOST="$2"; shift 2 ;;
|
--host) [ -z "$2" ] && echo "Missing value for --host (expected claude, codex, cursor, kiro, factory, opencode, openclaw, hermes, gbrain, or auto)" >&2 && exit 1; HOST="$2"; shift 2 ;;
|
||||||
--host=*) HOST="${1#--host=}"; shift ;;
|
--host=*) HOST="${1#--host=}"; shift ;;
|
||||||
--local) LOCAL_INSTALL=1; shift ;;
|
--local) LOCAL_INSTALL=1; shift ;;
|
||||||
--prefix) SKILL_PREFIX=1; SKILL_PREFIX_FLAG=1; shift ;;
|
--prefix) SKILL_PREFIX=1; SKILL_PREFIX_FLAG=1; shift ;;
|
||||||
|
|
@ -56,7 +58,7 @@ while [ $# -gt 0 ]; do
|
||||||
done
|
done
|
||||||
|
|
||||||
case "$HOST" in
|
case "$HOST" in
|
||||||
claude|codex|kiro|factory|opencode|auto) ;;
|
claude|codex|cursor|kiro|factory|opencode|auto) ;;
|
||||||
openclaw)
|
openclaw)
|
||||||
echo ""
|
echo ""
|
||||||
echo "OpenClaw integration uses a different model — OpenClaw spawns Claude Code"
|
echo "OpenClaw integration uses a different model — OpenClaw spawns Claude Code"
|
||||||
|
|
@ -91,7 +93,7 @@ case "$HOST" in
|
||||||
echo "GBrain setup and brain skills ship from the GBrain repo."
|
echo "GBrain setup and brain skills ship from the GBrain repo."
|
||||||
echo ""
|
echo ""
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
*) echo "Unknown --host value: $HOST (expected claude, codex, kiro, factory, opencode, openclaw, hermes, gbrain, or auto)" >&2; exit 1 ;;
|
*) echo "Unknown --host value: $HOST (expected claude, codex, cursor, kiro, factory, opencode, openclaw, hermes, gbrain, or auto)" >&2; exit 1 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# ─── Resolve skill prefix preference ─────────────────────────
|
# ─── Resolve skill prefix preference ─────────────────────────
|
||||||
|
|
@ -152,23 +154,27 @@ fi
|
||||||
# For auto: detect which agents are installed
|
# For auto: detect which agents are installed
|
||||||
INSTALL_CLAUDE=0
|
INSTALL_CLAUDE=0
|
||||||
INSTALL_CODEX=0
|
INSTALL_CODEX=0
|
||||||
|
INSTALL_CURSOR=0
|
||||||
INSTALL_KIRO=0
|
INSTALL_KIRO=0
|
||||||
INSTALL_FACTORY=0
|
INSTALL_FACTORY=0
|
||||||
INSTALL_OPENCODE=0
|
INSTALL_OPENCODE=0
|
||||||
if [ "$HOST" = "auto" ]; then
|
if [ "$HOST" = "auto" ]; then
|
||||||
command -v claude >/dev/null 2>&1 && INSTALL_CLAUDE=1
|
command -v claude >/dev/null 2>&1 && INSTALL_CLAUDE=1
|
||||||
command -v codex >/dev/null 2>&1 && INSTALL_CODEX=1
|
command -v codex >/dev/null 2>&1 && INSTALL_CODEX=1
|
||||||
|
command -v cursor >/dev/null 2>&1 && INSTALL_CURSOR=1
|
||||||
command -v kiro-cli >/dev/null 2>&1 && INSTALL_KIRO=1
|
command -v kiro-cli >/dev/null 2>&1 && INSTALL_KIRO=1
|
||||||
command -v droid >/dev/null 2>&1 && INSTALL_FACTORY=1
|
command -v droid >/dev/null 2>&1 && INSTALL_FACTORY=1
|
||||||
command -v opencode >/dev/null 2>&1 && INSTALL_OPENCODE=1
|
command -v opencode >/dev/null 2>&1 && INSTALL_OPENCODE=1
|
||||||
# If none found, default to claude
|
# If none found, default to claude
|
||||||
if [ "$INSTALL_CLAUDE" -eq 0 ] && [ "$INSTALL_CODEX" -eq 0 ] && [ "$INSTALL_KIRO" -eq 0 ] && [ "$INSTALL_FACTORY" -eq 0 ] && [ "$INSTALL_OPENCODE" -eq 0 ]; then
|
if [ "$INSTALL_CLAUDE" -eq 0 ] && [ "$INSTALL_CODEX" -eq 0 ] && [ "$INSTALL_CURSOR" -eq 0 ] && [ "$INSTALL_KIRO" -eq 0 ] && [ "$INSTALL_FACTORY" -eq 0 ] && [ "$INSTALL_OPENCODE" -eq 0 ]; then
|
||||||
INSTALL_CLAUDE=1
|
INSTALL_CLAUDE=1
|
||||||
fi
|
fi
|
||||||
elif [ "$HOST" = "claude" ]; then
|
elif [ "$HOST" = "claude" ]; then
|
||||||
INSTALL_CLAUDE=1
|
INSTALL_CLAUDE=1
|
||||||
elif [ "$HOST" = "codex" ]; then
|
elif [ "$HOST" = "codex" ]; then
|
||||||
INSTALL_CODEX=1
|
INSTALL_CODEX=1
|
||||||
|
elif [ "$HOST" = "cursor" ]; then
|
||||||
|
INSTALL_CURSOR=1
|
||||||
elif [ "$HOST" = "kiro" ]; then
|
elif [ "$HOST" = "kiro" ]; then
|
||||||
INSTALL_KIRO=1
|
INSTALL_KIRO=1
|
||||||
elif [ "$HOST" = "factory" ]; then
|
elif [ "$HOST" = "factory" ]; then
|
||||||
|
|
@ -321,6 +327,15 @@ if [ "$INSTALL_OPENCODE" -eq 1 ] && [ "$NEEDS_BUILD" -eq 0 ]; then
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$INSTALL_CURSOR" -eq 1 ] && [ "$NEEDS_BUILD" -eq 0 ]; then
|
||||||
|
log "Generating .cursor/ skill docs..."
|
||||||
|
(
|
||||||
|
cd "$SOURCE_GSTACK_DIR"
|
||||||
|
bun install --frozen-lockfile 2>/dev/null || bun install
|
||||||
|
bun run gen:skill-docs --host cursor
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
# 2. Ensure Playwright's Chromium is available
|
# 2. Ensure Playwright's Chromium is available
|
||||||
if ! ensure_playwright_browser; then
|
if ! ensure_playwright_browser; then
|
||||||
echo "Installing Playwright Chromium..."
|
echo "Installing Playwright Chromium..."
|
||||||
|
|
@ -562,6 +577,41 @@ create_agents_sidecar() {
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
create_cursor_sidecar() {
|
||||||
|
local repo_root="$1"
|
||||||
|
local cursor_gstack="$repo_root/.cursor/skills/gstack"
|
||||||
|
local cursor_dir="$repo_root/.cursor/skills"
|
||||||
|
|
||||||
|
for stale in browse review qa; do
|
||||||
|
if [ -L "$cursor_gstack/$stale" ]; then
|
||||||
|
rm -f "$cursor_gstack/$stale"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
mkdir -p "$cursor_gstack" "$cursor_gstack/browse" "$cursor_gstack/gstack-upgrade" "$cursor_gstack/review"
|
||||||
|
|
||||||
|
if [ -d "$SOURCE_GSTACK_DIR/bin" ]; then
|
||||||
|
ln -snf "$SOURCE_GSTACK_DIR/bin" "$cursor_gstack/bin"
|
||||||
|
fi
|
||||||
|
if [ -d "$SOURCE_GSTACK_DIR/browse/dist" ]; then
|
||||||
|
ln -snf "$SOURCE_GSTACK_DIR/browse/dist" "$cursor_gstack/browse/dist"
|
||||||
|
fi
|
||||||
|
if [ -d "$SOURCE_GSTACK_DIR/browse/bin" ]; then
|
||||||
|
ln -snf "$SOURCE_GSTACK_DIR/browse/bin" "$cursor_gstack/browse/bin"
|
||||||
|
fi
|
||||||
|
if [ -f "$cursor_dir/gstack-upgrade/SKILL.md" ]; then
|
||||||
|
ln -snf "$cursor_dir/gstack-upgrade/SKILL.md" "$cursor_gstack/gstack-upgrade/SKILL.md"
|
||||||
|
fi
|
||||||
|
for f in checklist.md design-checklist.md greptile-triage.md TODOS-format.md; do
|
||||||
|
if [ -f "$SOURCE_GSTACK_DIR/review/$f" ]; then
|
||||||
|
ln -snf "$SOURCE_GSTACK_DIR/review/$f" "$cursor_gstack/review/$f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -f "$SOURCE_GSTACK_DIR/ETHOS.md" ]; then
|
||||||
|
ln -snf "$SOURCE_GSTACK_DIR/ETHOS.md" "$cursor_gstack/ETHOS.md"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# ─── Helper: create a minimal ~/.codex/skills/gstack runtime root ───────────
|
# ─── Helper: create a minimal ~/.codex/skills/gstack runtime root ───────────
|
||||||
# Codex scans ~/.codex/skills recursively. Exposing the whole repo here causes
|
# Codex scans ~/.codex/skills recursively. Exposing the whole repo here causes
|
||||||
# duplicate skills because source SKILL.md files and generated Codex skills are
|
# duplicate skills because source SKILL.md files and generated Codex skills are
|
||||||
|
|
@ -608,6 +658,44 @@ create_codex_runtime_root() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
create_cursor_runtime_root() {
|
||||||
|
local gstack_dir="$1"
|
||||||
|
local cursor_gstack="$2"
|
||||||
|
local cursor_dir="$gstack_dir/.cursor/skills"
|
||||||
|
|
||||||
|
if [ -L "$cursor_gstack" ]; then
|
||||||
|
rm -f "$cursor_gstack"
|
||||||
|
elif [ -d "$cursor_gstack" ] && [ "$cursor_gstack" != "$gstack_dir" ]; then
|
||||||
|
rm -rf "$cursor_gstack"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$cursor_gstack" "$cursor_gstack/browse" "$cursor_gstack/gstack-upgrade" "$cursor_gstack/review"
|
||||||
|
|
||||||
|
if [ -f "$cursor_dir/gstack/SKILL.md" ]; then
|
||||||
|
ln -snf "$cursor_dir/gstack/SKILL.md" "$cursor_gstack/SKILL.md"
|
||||||
|
fi
|
||||||
|
if [ -d "$gstack_dir/bin" ]; then
|
||||||
|
ln -snf "$gstack_dir/bin" "$cursor_gstack/bin"
|
||||||
|
fi
|
||||||
|
if [ -d "$gstack_dir/browse/dist" ]; then
|
||||||
|
ln -snf "$gstack_dir/browse/dist" "$cursor_gstack/browse/dist"
|
||||||
|
fi
|
||||||
|
if [ -d "$gstack_dir/browse/bin" ]; then
|
||||||
|
ln -snf "$gstack_dir/browse/bin" "$cursor_gstack/browse/bin"
|
||||||
|
fi
|
||||||
|
if [ -f "$cursor_dir/gstack-upgrade/SKILL.md" ]; then
|
||||||
|
ln -snf "$cursor_dir/gstack-upgrade/SKILL.md" "$cursor_gstack/gstack-upgrade/SKILL.md"
|
||||||
|
fi
|
||||||
|
for f in checklist.md design-checklist.md greptile-triage.md TODOS-format.md; do
|
||||||
|
if [ -f "$gstack_dir/review/$f" ]; then
|
||||||
|
ln -snf "$gstack_dir/review/$f" "$cursor_gstack/review/$f"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -f "$gstack_dir/ETHOS.md" ]; then
|
||||||
|
ln -snf "$gstack_dir/ETHOS.md" "$cursor_gstack/ETHOS.md"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
create_factory_runtime_root() {
|
create_factory_runtime_root() {
|
||||||
local gstack_dir="$1"
|
local gstack_dir="$1"
|
||||||
local factory_gstack="$2"
|
local factory_gstack="$2"
|
||||||
|
|
@ -699,6 +787,38 @@ create_opencode_runtime_root() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
link_cursor_skill_dirs() {
|
||||||
|
local gstack_dir="$1"
|
||||||
|
local skills_dir="$2"
|
||||||
|
local cursor_dir="$gstack_dir/.cursor/skills"
|
||||||
|
local linked=()
|
||||||
|
|
||||||
|
if [ ! -d "$cursor_dir" ]; then
|
||||||
|
echo " Generating .cursor/ skill docs..."
|
||||||
|
( cd "$gstack_dir" && bun run gen:skill-docs --host cursor )
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$cursor_dir" ]; then
|
||||||
|
echo " warning: .cursor/skills/ generation failed — run 'bun run gen:skill-docs --host cursor' manually" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
for skill_dir in "$cursor_dir"/*/; do
|
||||||
|
if [ -f "$skill_dir/SKILL.md" ]; then
|
||||||
|
skill_name="$(basename "$skill_dir")"
|
||||||
|
[ "$skill_name" = "gstack" ] && continue
|
||||||
|
target="$skills_dir/$skill_name"
|
||||||
|
if [ -L "$target" ] || [ ! -e "$target" ]; then
|
||||||
|
ln -snf "$skill_dir" "$target"
|
||||||
|
linked+=("$skill_name")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ ${#linked[@]} -gt 0 ]; then
|
||||||
|
echo " linked skills: ${linked[*]}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
link_factory_skill_dirs() {
|
link_factory_skill_dirs() {
|
||||||
local gstack_dir="$1"
|
local gstack_dir="$1"
|
||||||
local skills_dir="$2"
|
local skills_dir="$2"
|
||||||
|
|
@ -859,6 +979,15 @@ if [ "$INSTALL_CODEX" -eq 1 ]; then
|
||||||
log " codex skills: $CODEX_SKILLS"
|
log " codex skills: $CODEX_SKILLS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$INSTALL_CURSOR" -eq 1 ]; then
|
||||||
|
mkdir -p "$CURSOR_SKILLS"
|
||||||
|
create_cursor_runtime_root "$SOURCE_GSTACK_DIR" "$CURSOR_GSTACK"
|
||||||
|
link_cursor_skill_dirs "$SOURCE_GSTACK_DIR" "$CURSOR_SKILLS"
|
||||||
|
echo "gstack ready (cursor)."
|
||||||
|
echo " browse: $BROWSE_BIN"
|
||||||
|
echo " cursor skills: $CURSOR_SKILLS"
|
||||||
|
fi
|
||||||
|
|
||||||
# 6. Install for Kiro CLI (copy from .agents/skills, rewrite paths)
|
# 6. Install for Kiro CLI (copy from .agents/skills, rewrite paths)
|
||||||
if [ "$INSTALL_KIRO" -eq 1 ]; then
|
if [ "$INSTALL_KIRO" -eq 1 ]; then
|
||||||
KIRO_SKILLS="$HOME/.kiro/skills"
|
KIRO_SKILLS="$HOME/.kiro/skills"
|
||||||
|
|
@ -941,6 +1070,9 @@ fi
|
||||||
if [ "$INSTALL_CODEX" -eq 1 ]; then
|
if [ "$INSTALL_CODEX" -eq 1 ]; then
|
||||||
create_agents_sidecar "$SOURCE_GSTACK_DIR"
|
create_agents_sidecar "$SOURCE_GSTACK_DIR"
|
||||||
fi
|
fi
|
||||||
|
if [ "$INSTALL_CURSOR" -eq 1 ]; then
|
||||||
|
create_cursor_sidecar "$SOURCE_GSTACK_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
# 8. Run pending version migrations
|
# 8. Run pending version migrations
|
||||||
# Migrations handle state fixes that ./setup alone can't cover (stale config,
|
# Migrations handle state fixes that ./setup alone can't cover (stale config,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue