diff --git a/bin/gstack-uninstall b/bin/gstack-uninstall index 6bad7c1b..2cf3d528 100755 --- a/bin/gstack-uninstall +++ b/bin/gstack-uninstall @@ -10,6 +10,7 @@ # ~/.claude/skills/gstack — global Claude skill install (git clone or vendored) # ~/.claude/skills/{skill} — per-skill symlinks created by setup # ~/.codex/skills/gstack* — Codex skill install + per-skill symlinks +# ~/.factory/skills/gstack* — Factory Droid skill install + per-skill symlinks # ~/.kiro/skills/gstack* — Kiro skill install + per-skill symlinks # ~/.gstack/ — global state (config, analytics, sessions, projects, # repos, installation-id, browse error logs) @@ -63,6 +64,7 @@ if [ "$FORCE" -eq 0 ]; then echo "This will remove gstack from your system:" { [ -d "$HOME/.claude/skills/gstack" ] || [ -L "$HOME/.claude/skills/gstack" ]; } && echo " ~/.claude/skills/gstack (+ per-skill symlinks)" [ -d "$HOME/.codex/skills" ] && echo " ~/.codex/skills/gstack*" + [ -d "$HOME/.factory/skills" ] && echo " ~/.factory/skills/gstack*" [ -d "$HOME/.kiro/skills" ] && echo " ~/.kiro/skills/gstack*" [ "$KEEP_STATE" -eq 0 ] && [ -d "$STATE_DIR" ] && echo " $STATE_DIR" @@ -169,6 +171,16 @@ if [ -d "$CODEX_SKILLS" ]; then done fi +# ─── Remove Factory Droid skills ──────────────────────────── +FACTORY_SKILLS="$HOME/.factory/skills" +if [ -d "$FACTORY_SKILLS" ]; then + for _ITEM in "$FACTORY_SKILLS"/gstack*; do + [ -e "$_ITEM" ] || [ -L "$_ITEM" ] || continue + rm -rf "$_ITEM" + REMOVED+=("factory/$(basename "$_ITEM")") + done +fi + # ─── Remove Kiro skills ───────────────────────────────────── KIRO_SKILLS="$HOME/.kiro/skills" if [ -d "$KIRO_SKILLS" ]; then @@ -191,6 +203,18 @@ if [ -n "$_GIT_ROOT" ] && [ -d "$_GIT_ROOT/.agents/skills" ]; then rmdir "$_GIT_ROOT/.agents" 2>/dev/null || true fi +# ─── Remove per-project .factory/ sidecar ──────────────────── +if [ -n "$_GIT_ROOT" ] && [ -d "$_GIT_ROOT/.factory/skills" ]; then + for _ITEM in "$_GIT_ROOT/.factory/skills"/gstack*; do + [ -e "$_ITEM" ] || [ -L "$_ITEM" ] || continue + rm -rf "$_ITEM" + REMOVED+=("factory/$(basename "$_ITEM")") + done + + rmdir "$_GIT_ROOT/.factory/skills" 2>/dev/null || true + rmdir "$_GIT_ROOT/.factory" 2>/dev/null || true +fi + # ─── Remove per-project state ─────────────────────────────── if [ -n "$_GIT_ROOT" ]; then if [ -d "$_GIT_ROOT/.gstack" ]; then diff --git a/scripts/skill-check.ts b/scripts/skill-check.ts index 9d78cf54..e859d9b5 100644 --- a/scripts/skill-check.ts +++ b/scripts/skill-check.ts @@ -111,6 +111,37 @@ if (fs.existsSync(AGENTS_DIR)) { console.log('\n Codex Skills: .agents/skills/ not found (run: bun run gen:skill-docs --host codex)'); } +// ─── Factory Skills ───────────────────────────────────────── + +const FACTORY_DIR = path.join(ROOT, '.factory', 'skills'); +if (fs.existsSync(FACTORY_DIR)) { + console.log('\n Factory Skills (.factory/skills/):'); + const factoryDirs = fs.readdirSync(FACTORY_DIR).sort(); + let factoryCount = 0; + let factoryMissing = 0; + for (const dir of factoryDirs) { + const skillMd = path.join(FACTORY_DIR, dir, 'SKILL.md'); + if (fs.existsSync(skillMd)) { + factoryCount++; + const content = fs.readFileSync(skillMd, 'utf-8'); + const hasClaude = content.includes('.claude/skills'); + if (hasClaude) { + hasErrors = true; + console.log(` \u274c ${dir.padEnd(30)} — contains .claude/skills reference`); + } else { + console.log(` \u2705 ${dir.padEnd(30)} — OK`); + } + } else { + factoryMissing++; + hasErrors = true; + console.log(` \u274c ${dir.padEnd(30)} — SKILL.md missing`); + } + } + console.log(` Total: ${factoryCount} skills, ${factoryMissing} missing`); +} else { + console.log('\n Factory Skills: .factory/skills/ not found (run: bun run gen:skill-docs --host factory)'); +} + // ─── Freshness ────────────────────────────────────────────── console.log('\n Freshness (Claude):'); @@ -141,5 +172,19 @@ try { console.log(' Run: bun run gen:skill-docs --host codex'); } +console.log('\n Freshness (Factory):'); +try { + execSync('bun run scripts/gen-skill-docs.ts --host factory --dry-run', { cwd: ROOT, stdio: 'pipe' }); + console.log(' \u2705 All Factory generated files are fresh'); +} catch (err: any) { + hasErrors = true; + const output = err.stdout?.toString() || ''; + console.log(' \u274c Factory generated files are stale:'); + for (const line of output.split('\n').filter((l: string) => l.startsWith('STALE'))) { + console.log(` ${line}`); + } + console.log(' Run: bun run gen:skill-docs --host factory'); +} + console.log(''); process.exit(hasErrors ? 1 : 0);