diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json
deleted file mode 100644
index f09ebef0b..000000000
--- a/.claude-plugin/marketplace.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "superpowers-dev",
- "description": "Development marketplace for Superpowers core skills library",
- "owner": {
- "name": "Jesse Vincent",
- "email": "jesse@fsck.com"
- },
- "plugins": [
- {
- "name": "superpowers",
- "description": "Core skills library for Claude Code: TDD, debugging, collaboration patterns, and proven techniques",
- "version": "4.0.3",
- "source": "./",
- "author": {
- "name": "Jesse Vincent",
- "email": "jesse@fsck.com"
- }
- }
- ]
-}
diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json
deleted file mode 100644
index 0e37c2c16..000000000
--- a/.claude-plugin/plugin.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": "superpowers",
- "description": "Core skills library for Claude Code: TDD, debugging, collaboration patterns, and proven techniques",
- "version": "4.0.3",
- "author": {
- "name": "Jesse Vincent",
- "email": "jesse@fsck.com"
- },
- "homepage": "https://github.com/obra/superpowers",
- "repository": "https://github.com/obra/superpowers",
- "license": "MIT",
- "keywords": ["skills", "tdd", "debugging", "collaboration", "best-practices", "workflows"]
-}
diff --git a/.codex/INSTALL.md b/.codex/INSTALL.md
deleted file mode 100644
index 1250f5e07..000000000
--- a/.codex/INSTALL.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Installing Superpowers for Codex
-
-Quick setup to enable superpowers skills in Codex.
-
-## Installation
-
-1. **Clone superpowers repository**:
- ```bash
- mkdir -p ~/.codex/superpowers
- cd ~/.codex/superpowers
- git clone https://github.com/obra/superpowers.git .
- ```
-
-2. **Create personal skills directory**:
- ```bash
- mkdir -p ~/.codex/skills
- ```
-
-3. **Update ~/.codex/AGENTS.md** to include this superpowers section:
- ```markdown
- ## Superpowers System
-
-
- You have superpowers. Superpowers teach you new skills and capabilities. RIGHT NOW run: `~/.codex/superpowers/.codex/superpowers-codex bootstrap` and follow the instructions it returns.
-
- ```
-
-## Verification
-
-Test the installation:
-```bash
-~/.codex/superpowers/.codex/superpowers-codex bootstrap
-```
-
-You should see skill listings and bootstrap instructions. The system is now ready for use.
\ No newline at end of file
diff --git a/.codex/superpowers-bootstrap.md b/.codex/superpowers-bootstrap.md
deleted file mode 100644
index 18fe657f0..000000000
--- a/.codex/superpowers-bootstrap.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Superpowers Bootstrap for Codex
-
-
-You have superpowers.
-
-**Tool for running skills:**
-- `~/.codex/superpowers/.codex/superpowers-codex use-skill `
-
-**Tool Mapping for Codex:**
-When skills reference tools you don't have, substitute your equivalent tools:
-- `TodoWrite` → `update_plan` (your planning/task tracking tool)
-- `Task` tool with subagents → Tell the user that subagents aren't available in Codex yet and you'll do the work the subagent would do
-- `Skill` tool → `~/.codex/superpowers/.codex/superpowers-codex use-skill` command (already available)
-- `Read`, `Write`, `Edit`, `Bash` → Use your native tools with similar functions
-
-**Skills naming:**
-- Superpowers skills: `superpowers:skill-name` (from ~/.codex/superpowers/skills/)
-- Personal skills: `skill-name` (from ~/.codex/skills/)
-- Personal skills override superpowers skills when names match
-
-**Critical Rules:**
-- Before ANY task, review the skills list (shown below)
-- If a relevant skill exists, you MUST use `~/.codex/superpowers/.codex/superpowers-codex use-skill` to load it
-- Announce: "I've read the [Skill Name] skill and I'm using it to [purpose]"
-- Skills with checklists require `update_plan` todos for each item
-- NEVER skip mandatory workflows (brainstorming before coding, TDD, systematic debugging)
-
-**Skills location:**
-- Superpowers skills: ~/.codex/superpowers/skills/
-- Personal skills: ~/.codex/skills/ (override superpowers when names match)
-
-IF A SKILL APPLIES TO YOUR TASK, YOU DO NOT HAVE A CHOICE. YOU MUST USE IT.
-
\ No newline at end of file
diff --git a/.codex/superpowers-codex b/.codex/superpowers-codex
deleted file mode 100755
index 1d9a0efb6..000000000
--- a/.codex/superpowers-codex
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/usr/bin/env node
-
-const fs = require('fs');
-const path = require('path');
-const os = require('os');
-const skillsCore = require('../lib/skills-core');
-
-// Paths
-const homeDir = os.homedir();
-const superpowersSkillsDir = path.join(homeDir, '.codex', 'superpowers', 'skills');
-const personalSkillsDir = path.join(homeDir, '.codex', 'skills');
-const bootstrapFile = path.join(homeDir, '.codex', 'superpowers', '.codex', 'superpowers-bootstrap.md');
-const superpowersRepoDir = path.join(homeDir, '.codex', 'superpowers');
-
-// Utility functions
-function printSkill(skillPath, sourceType) {
- const skillFile = path.join(skillPath, 'SKILL.md');
- const relPath = sourceType === 'personal'
- ? path.relative(personalSkillsDir, skillPath)
- : path.relative(superpowersSkillsDir, skillPath);
-
- // Print skill name with namespace
- if (sourceType === 'personal') {
- console.log(relPath.replace(/\\/g, '/')); // Personal skills are not namespaced
- } else {
- console.log(`superpowers:${relPath.replace(/\\/g, '/')}`); // Superpowers skills get superpowers namespace
- }
-
- // Extract and print metadata
- const { name, description } = skillsCore.extractFrontmatter(skillFile);
-
- if (description) console.log(` ${description}`);
- console.log('');
-}
-
-// Commands
-function runFindSkills() {
- console.log('Available skills:');
- console.log('==================');
- console.log('');
-
- const foundSkills = new Set();
-
- // Find personal skills first (these take precedence)
- const personalSkills = skillsCore.findSkillsInDir(personalSkillsDir, 'personal', 2);
- for (const skill of personalSkills) {
- const relPath = path.relative(personalSkillsDir, skill.path);
- foundSkills.add(relPath);
- printSkill(skill.path, 'personal');
- }
-
- // Find superpowers skills (only if not already found in personal)
- const superpowersSkills = skillsCore.findSkillsInDir(superpowersSkillsDir, 'superpowers', 1);
- for (const skill of superpowersSkills) {
- const relPath = path.relative(superpowersSkillsDir, skill.path);
- if (!foundSkills.has(relPath)) {
- printSkill(skill.path, 'superpowers');
- }
- }
-
- console.log('Usage:');
- console.log(' superpowers-codex use-skill # Load a specific skill');
- console.log('');
- console.log('Skill naming:');
- console.log(' Superpowers skills: superpowers:skill-name (from ~/.codex/superpowers/skills/)');
- console.log(' Personal skills: skill-name (from ~/.codex/skills/)');
- console.log(' Personal skills override superpowers skills when names match.');
- console.log('');
- console.log('Note: All skills are disclosed at session start via bootstrap.');
-}
-
-function runBootstrap() {
- console.log('# Superpowers Bootstrap for Codex');
- console.log('# ================================');
- console.log('');
-
- // Check for updates (with timeout protection)
- if (skillsCore.checkForUpdates(superpowersRepoDir)) {
- console.log('## Update Available');
- console.log('');
- console.log('⚠️ Your superpowers installation is behind the latest version.');
- console.log('To update, run: `cd ~/.codex/superpowers && git pull`');
- console.log('');
- console.log('---');
- console.log('');
- }
-
- // Show the bootstrap instructions
- if (fs.existsSync(bootstrapFile)) {
- console.log('## Bootstrap Instructions:');
- console.log('');
- try {
- const content = fs.readFileSync(bootstrapFile, 'utf8');
- console.log(content);
- } catch (error) {
- console.log(`Error reading bootstrap file: ${error.message}`);
- }
- console.log('');
- console.log('---');
- console.log('');
- }
-
- // Run find-skills to show available skills
- console.log('## Available Skills:');
- console.log('');
- runFindSkills();
-
- console.log('');
- console.log('---');
- console.log('');
-
- // Load the using-superpowers skill automatically
- console.log('## Auto-loading superpowers:using-superpowers skill:');
- console.log('');
- runUseSkill('superpowers:using-superpowers');
-
- console.log('');
- console.log('---');
- console.log('');
- console.log('# Bootstrap Complete!');
- console.log('# You now have access to all superpowers skills.');
- console.log('# Use "superpowers-codex use-skill " to load and apply skills.');
- console.log('# Remember: If a skill applies to your task, you MUST use it!');
-}
-
-function runUseSkill(skillName) {
- if (!skillName) {
- console.log('Usage: superpowers-codex use-skill ');
- console.log('Examples:');
- console.log(' superpowers-codex use-skill superpowers:brainstorming # Load superpowers skill');
- console.log(' superpowers-codex use-skill brainstorming # Load personal skill (or superpowers if not found)');
- console.log(' superpowers-codex use-skill my-custom-skill # Load personal skill');
- return;
- }
-
- // Handle namespaced skill names
- let actualSkillPath;
- let forceSuperpowers = false;
-
- if (skillName.startsWith('superpowers:')) {
- // Remove the superpowers: namespace prefix
- actualSkillPath = skillName.substring('superpowers:'.length);
- forceSuperpowers = true;
- } else {
- actualSkillPath = skillName;
- }
-
- // Remove "skills/" prefix if present
- if (actualSkillPath.startsWith('skills/')) {
- actualSkillPath = actualSkillPath.substring('skills/'.length);
- }
-
- // Function to find skill file
- function findSkillFile(searchPath) {
- // Check for exact match with SKILL.md
- const skillMdPath = path.join(searchPath, 'SKILL.md');
- if (fs.existsSync(skillMdPath)) {
- return skillMdPath;
- }
-
- // Check for direct SKILL.md file
- if (searchPath.endsWith('SKILL.md') && fs.existsSync(searchPath)) {
- return searchPath;
- }
-
- return null;
- }
-
- let skillFile = null;
-
- // If superpowers: namespace was used, only check superpowers skills
- if (forceSuperpowers) {
- if (fs.existsSync(superpowersSkillsDir)) {
- const superpowersPath = path.join(superpowersSkillsDir, actualSkillPath);
- skillFile = findSkillFile(superpowersPath);
- }
- } else {
- // First check personal skills directory (takes precedence)
- if (fs.existsSync(personalSkillsDir)) {
- const personalPath = path.join(personalSkillsDir, actualSkillPath);
- skillFile = findSkillFile(personalPath);
- if (skillFile) {
- console.log(`# Loading personal skill: ${actualSkillPath}`);
- console.log(`# Source: ${skillFile}`);
- console.log('');
- }
- }
-
- // If not found in personal, check superpowers skills
- if (!skillFile && fs.existsSync(superpowersSkillsDir)) {
- const superpowersPath = path.join(superpowersSkillsDir, actualSkillPath);
- skillFile = findSkillFile(superpowersPath);
- if (skillFile) {
- console.log(`# Loading superpowers skill: superpowers:${actualSkillPath}`);
- console.log(`# Source: ${skillFile}`);
- console.log('');
- }
- }
- }
-
- // If still not found, error
- if (!skillFile) {
- console.log(`Error: Skill not found: ${actualSkillPath}`);
- console.log('');
- console.log('Available skills:');
- runFindSkills();
- return;
- }
-
- // Extract frontmatter and content using shared core functions
- let content, frontmatter;
- try {
- const fullContent = fs.readFileSync(skillFile, 'utf8');
- const { name, description } = skillsCore.extractFrontmatter(skillFile);
- content = skillsCore.stripFrontmatter(fullContent);
- frontmatter = { name, description };
- } catch (error) {
- console.log(`Error reading skill file: ${error.message}`);
- return;
- }
-
- // Display skill header with clean info
- const displayName = forceSuperpowers ? `superpowers:${actualSkillPath}` :
- (skillFile.includes(personalSkillsDir) ? actualSkillPath : `superpowers:${actualSkillPath}`);
-
- const skillDirectory = path.dirname(skillFile);
-
- console.log(`# ${frontmatter.name || displayName}`);
- if (frontmatter.description) {
- console.log(`# ${frontmatter.description}`);
- }
- console.log(`# Skill-specific tools and reference files live in ${skillDirectory}`);
- console.log('# ============================================');
- console.log('');
-
- // Display the skill content (without frontmatter)
- console.log(content);
-
-}
-
-// Main CLI
-const command = process.argv[2];
-const arg = process.argv[3];
-
-switch (command) {
- case 'bootstrap':
- runBootstrap();
- break;
- case 'use-skill':
- runUseSkill(arg);
- break;
- case 'find-skills':
- runFindSkills();
- break;
- default:
- console.log('Superpowers for Codex');
- console.log('Usage:');
- console.log(' superpowers-codex bootstrap # Run complete bootstrap with all skills');
- console.log(' superpowers-codex use-skill # Load a specific skill');
- console.log(' superpowers-codex find-skills # List all available skills');
- console.log('');
- console.log('Examples:');
- console.log(' superpowers-codex bootstrap');
- console.log(' superpowers-codex use-skill superpowers:brainstorming');
- console.log(' superpowers-codex use-skill my-custom-skill');
- break;
-}
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index f646aa73b..000000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-# These are supported funding model platforms
-
-github: [obra]
diff --git a/.opencode/plugin/.orphaned_at b/.opencode/plugin/.orphaned_at
new file mode 100644
index 000000000..1b1263c4d
--- /dev/null
+++ b/.opencode/plugin/.orphaned_at
@@ -0,0 +1 @@
+1768873298662
\ No newline at end of file
diff --git a/agents/code-reviewer.md b/agents/code-reviewer.md
deleted file mode 100644
index 4e14076b3..000000000
--- a/agents/code-reviewer.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-name: code-reviewer
-description: |
- Use this agent when a major project step has been completed and needs to be reviewed against the original plan and coding standards. Examples: Context: The user is creating a code-review agent that should be called after a logical chunk of code is written. user: "I've finished implementing the user authentication system as outlined in step 3 of our plan" assistant: "Great work! Now let me use the code-reviewer agent to review the implementation against our plan and coding standards" Since a major project step has been completed, use the code-reviewer agent to validate the work against the plan and identify any issues. Context: User has completed a significant feature implementation. user: "The API endpoints for the task management system are now complete - that covers step 2 from our architecture document" assistant: "Excellent! Let me have the code-reviewer agent examine this implementation to ensure it aligns with our plan and follows best practices" A numbered step from the planning document has been completed, so the code-reviewer agent should review the work.
-model: inherit
----
-
-You are a Senior Code Reviewer with expertise in software architecture, design patterns, and best practices. Your role is to review completed project steps against original plans and ensure code quality standards are met.
-
-When reviewing completed work, you will:
-
-1. **Plan Alignment Analysis**:
- - Compare the implementation against the original planning document or step description
- - Identify any deviations from the planned approach, architecture, or requirements
- - Assess whether deviations are justified improvements or problematic departures
- - Verify that all planned functionality has been implemented
-
-2. **Code Quality Assessment**:
- - Review code for adherence to established patterns and conventions
- - Check for proper error handling, type safety, and defensive programming
- - Evaluate code organization, naming conventions, and maintainability
- - Assess test coverage and quality of test implementations
- - Look for potential security vulnerabilities or performance issues
-
-3. **Architecture and Design Review**:
- - Ensure the implementation follows SOLID principles and established architectural patterns
- - Check for proper separation of concerns and loose coupling
- - Verify that the code integrates well with existing systems
- - Assess scalability and extensibility considerations
-
-4. **Documentation and Standards**:
- - Verify that code includes appropriate comments and documentation
- - Check that file headers, function documentation, and inline comments are present and accurate
- - Ensure adherence to project-specific coding standards and conventions
-
-5. **Issue Identification and Recommendations**:
- - Clearly categorize issues as: Critical (must fix), Important (should fix), or Suggestions (nice to have)
- - For each issue, provide specific examples and actionable recommendations
- - When you identify plan deviations, explain whether they're problematic or beneficial
- - Suggest specific improvements with code examples when helpful
-
-6. **Communication Protocol**:
- - If you find significant deviations from the plan, ask the coding agent to review and confirm the changes
- - If you identify issues with the original plan itself, recommend plan updates
- - For implementation problems, provide clear guidance on fixes needed
- - Always acknowledge what was done well before highlighting issues
-
-Your output should be structured, actionable, and focused on helping maintain high code quality while ensuring project goals are met. Be thorough but concise, and always provide constructive feedback that helps improve both the current implementation and future development practices.
diff --git a/commands/brainstorm.md b/commands/brainstorm.md
deleted file mode 100644
index 0fb3a8945..000000000
--- a/commands/brainstorm.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-description: "You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores requirements and design before implementation."
-disable-model-invocation: true
----
-
-Invoke the superpowers:brainstorming skill and follow it exactly as presented to you
diff --git a/commands/execute-plan.md b/commands/execute-plan.md
deleted file mode 100644
index c48f14005..000000000
--- a/commands/execute-plan.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-description: Execute plan in batches with review checkpoints
-disable-model-invocation: true
----
-
-Invoke the superpowers:executing-plans skill and follow it exactly as presented to you
diff --git a/commands/write-plan.md b/commands/write-plan.md
deleted file mode 100644
index 12962fd78..000000000
--- a/commands/write-plan.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-description: Create detailed implementation plan with bite-sized tasks
-disable-model-invocation: true
----
-
-Invoke the superpowers:writing-plans skill and follow it exactly as presented to you
diff --git a/docs/plans/.orphaned_at b/docs/plans/.orphaned_at
new file mode 100644
index 000000000..a840c297d
--- /dev/null
+++ b/docs/plans/.orphaned_at
@@ -0,0 +1 @@
+1768873298663
\ No newline at end of file
diff --git a/docs/windows/.orphaned_at b/docs/windows/.orphaned_at
new file mode 100644
index 000000000..a840c297d
--- /dev/null
+++ b/docs/windows/.orphaned_at
@@ -0,0 +1 @@
+1768873298663
\ No newline at end of file
diff --git a/hooks/hooks.json b/hooks/hooks.json
deleted file mode 100644
index d1745650c..000000000
--- a/hooks/hooks.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "hooks": {
- "SessionStart": [
- {
- "matcher": "startup|resume|clear|compact",
- "hooks": [
- {
- "type": "command",
- "command": "\"${CLAUDE_PLUGIN_ROOT}/hooks/run-hook.cmd\" session-start.sh"
- }
- ]
- }
- ]
- }
-}
diff --git a/hooks/run-hook.cmd b/hooks/run-hook.cmd
deleted file mode 100755
index 8d8458fcb..000000000
--- a/hooks/run-hook.cmd
+++ /dev/null
@@ -1,19 +0,0 @@
-: << 'CMDBLOCK'
-@echo off
-REM Polyglot wrapper: runs .sh scripts cross-platform
-REM Usage: run-hook.cmd [args...]
-REM The script should be in the same directory as this wrapper
-
-if "%~1"=="" (
- echo run-hook.cmd: missing script name >&2
- exit /b 1
-)
-"C:\Program Files\Git\bin\bash.exe" -l "%~dp0%~1" %2 %3 %4 %5 %6 %7 %8 %9
-exit /b
-CMDBLOCK
-
-# Unix shell runs from here
-SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
-SCRIPT_NAME="$1"
-shift
-"${SCRIPT_DIR}/${SCRIPT_NAME}" "$@"
diff --git a/hooks/session-start.sh b/hooks/session-start.sh
deleted file mode 100755
index f5d94497d..000000000
--- a/hooks/session-start.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env bash
-# SessionStart hook for superpowers plugin
-
-set -euo pipefail
-
-# Determine plugin root directory
-SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
-PLUGIN_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
-
-# Check if legacy skills directory exists and build warning
-warning_message=""
-legacy_skills_dir="${HOME}/.config/superpowers/skills"
-if [ -d "$legacy_skills_dir" ]; then
- warning_message="\n\nIN YOUR FIRST REPLY AFTER SEEING THIS MESSAGE YOU MUST TELL THE USER:⚠️ **WARNING:** Superpowers now uses Claude Code's skills system. Custom skills in ~/.config/superpowers/skills will not be read. Move custom skills to ~/.claude/skills instead. To make this message go away, remove ~/.config/superpowers/skills"
-fi
-
-# Read using-superpowers content
-using_superpowers_content=$(cat "${PLUGIN_ROOT}/skills/using-superpowers/SKILL.md" 2>&1 || echo "Error reading using-superpowers skill")
-
-# Escape outputs for JSON using pure bash
-escape_for_json() {
- local input="$1"
- local output=""
- local i char
- for (( i=0; i<${#input}; i++ )); do
- char="${input:$i:1}"
- case "$char" in
- $'\\') output+='\\' ;;
- '"') output+='\"' ;;
- $'\n') output+='\n' ;;
- $'\r') output+='\r' ;;
- $'\t') output+='\t' ;;
- *) output+="$char" ;;
- esac
- done
- printf '%s' "$output"
-}
-
-using_superpowers_escaped=$(escape_for_json "$using_superpowers_content")
-warning_escaped=$(escape_for_json "$warning_message")
-
-# Output context injection as JSON
-cat <\nYou have superpowers.\n\n**Below is the full content of your 'superpowers:using-superpowers' skill - your introduction to using skills. For all other skills, use the 'Skill' tool:**\n\n${using_superpowers_escaped}\n\n${warning_escaped}\n"
- }
-}
-EOF
-
-exit 0
diff --git a/lib/skills-core.js b/lib/skills-core.js
deleted file mode 100644
index 5e5bb7012..000000000
--- a/lib/skills-core.js
+++ /dev/null
@@ -1,208 +0,0 @@
-import fs from 'fs';
-import path from 'path';
-import { execSync } from 'child_process';
-
-/**
- * Extract YAML frontmatter from a skill file.
- * Current format:
- * ---
- * name: skill-name
- * description: Use when [condition] - [what it does]
- * ---
- *
- * @param {string} filePath - Path to SKILL.md file
- * @returns {{name: string, description: string}}
- */
-function extractFrontmatter(filePath) {
- try {
- const content = fs.readFileSync(filePath, 'utf8');
- const lines = content.split('\n');
-
- let inFrontmatter = false;
- let name = '';
- let description = '';
-
- for (const line of lines) {
- if (line.trim() === '---') {
- if (inFrontmatter) break;
- inFrontmatter = true;
- continue;
- }
-
- if (inFrontmatter) {
- const match = line.match(/^(\w+):\s*(.*)$/);
- if (match) {
- const [, key, value] = match;
- switch (key) {
- case 'name':
- name = value.trim();
- break;
- case 'description':
- description = value.trim();
- break;
- }
- }
- }
- }
-
- return { name, description };
- } catch (error) {
- return { name: '', description: '' };
- }
-}
-
-/**
- * Find all SKILL.md files in a directory recursively.
- *
- * @param {string} dir - Directory to search
- * @param {string} sourceType - 'personal' or 'superpowers' for namespacing
- * @param {number} maxDepth - Maximum recursion depth (default: 3)
- * @returns {Array<{path: string, name: string, description: string, sourceType: string}>}
- */
-function findSkillsInDir(dir, sourceType, maxDepth = 3) {
- const skills = [];
-
- if (!fs.existsSync(dir)) return skills;
-
- function recurse(currentDir, depth) {
- if (depth > maxDepth) return;
-
- const entries = fs.readdirSync(currentDir, { withFileTypes: true });
-
- for (const entry of entries) {
- const fullPath = path.join(currentDir, entry.name);
-
- if (entry.isDirectory()) {
- // Check for SKILL.md in this directory
- const skillFile = path.join(fullPath, 'SKILL.md');
- if (fs.existsSync(skillFile)) {
- const { name, description } = extractFrontmatter(skillFile);
- skills.push({
- path: fullPath,
- skillFile: skillFile,
- name: name || entry.name,
- description: description || '',
- sourceType: sourceType
- });
- }
-
- // Recurse into subdirectories
- recurse(fullPath, depth + 1);
- }
- }
- }
-
- recurse(dir, 0);
- return skills;
-}
-
-/**
- * Resolve a skill name to its file path, handling shadowing
- * (personal skills override superpowers skills).
- *
- * @param {string} skillName - Name like "superpowers:brainstorming" or "my-skill"
- * @param {string} superpowersDir - Path to superpowers skills directory
- * @param {string} personalDir - Path to personal skills directory
- * @returns {{skillFile: string, sourceType: string, skillPath: string} | null}
- */
-function resolveSkillPath(skillName, superpowersDir, personalDir) {
- // Strip superpowers: prefix if present
- const forceSuperpowers = skillName.startsWith('superpowers:');
- const actualSkillName = forceSuperpowers ? skillName.replace(/^superpowers:/, '') : skillName;
-
- // Try personal skills first (unless explicitly superpowers:)
- if (!forceSuperpowers && personalDir) {
- const personalPath = path.join(personalDir, actualSkillName);
- const personalSkillFile = path.join(personalPath, 'SKILL.md');
- if (fs.existsSync(personalSkillFile)) {
- return {
- skillFile: personalSkillFile,
- sourceType: 'personal',
- skillPath: actualSkillName
- };
- }
- }
-
- // Try superpowers skills
- if (superpowersDir) {
- const superpowersPath = path.join(superpowersDir, actualSkillName);
- const superpowersSkillFile = path.join(superpowersPath, 'SKILL.md');
- if (fs.existsSync(superpowersSkillFile)) {
- return {
- skillFile: superpowersSkillFile,
- sourceType: 'superpowers',
- skillPath: actualSkillName
- };
- }
- }
-
- return null;
-}
-
-/**
- * Check if a git repository has updates available.
- *
- * @param {string} repoDir - Path to git repository
- * @returns {boolean} - True if updates are available
- */
-function checkForUpdates(repoDir) {
- try {
- // Quick check with 3 second timeout to avoid delays if network is down
- const output = execSync('git fetch origin && git status --porcelain=v1 --branch', {
- cwd: repoDir,
- timeout: 3000,
- encoding: 'utf8',
- stdio: 'pipe'
- });
-
- // Parse git status output to see if we're behind
- const statusLines = output.split('\n');
- for (const line of statusLines) {
- if (line.startsWith('## ') && line.includes('[behind ')) {
- return true; // We're behind remote
- }
- }
- return false; // Up to date
- } catch (error) {
- // Network down, git error, timeout, etc. - don't block bootstrap
- return false;
- }
-}
-
-/**
- * Strip YAML frontmatter from skill content, returning just the content.
- *
- * @param {string} content - Full content including frontmatter
- * @returns {string} - Content without frontmatter
- */
-function stripFrontmatter(content) {
- const lines = content.split('\n');
- let inFrontmatter = false;
- let frontmatterEnded = false;
- const contentLines = [];
-
- for (const line of lines) {
- if (line.trim() === '---') {
- if (inFrontmatter) {
- frontmatterEnded = true;
- continue;
- }
- inFrontmatter = true;
- continue;
- }
-
- if (frontmatterEnded || !inFrontmatter) {
- contentLines.push(line);
- }
- }
-
- return contentLines.join('\n').trim();
-}
-
-export {
- extractFrontmatter,
- findSkillsInDir,
- resolveSkillPath,
- checkForUpdates,
- stripFrontmatter
-};
diff --git a/skills/brainstorming/.orphaned_at b/skills/brainstorming/.orphaned_at
new file mode 100644
index 000000000..f1f2bed35
--- /dev/null
+++ b/skills/brainstorming/.orphaned_at
@@ -0,0 +1 @@
+1768873298665
\ No newline at end of file
diff --git a/skills/dispatching-parallel-agents/.orphaned_at b/skills/dispatching-parallel-agents/.orphaned_at
new file mode 100644
index 000000000..3d2f31c89
--- /dev/null
+++ b/skills/dispatching-parallel-agents/.orphaned_at
@@ -0,0 +1 @@
+1768873298664
\ No newline at end of file
diff --git a/skills/executing-plans/.orphaned_at b/skills/executing-plans/.orphaned_at
new file mode 100644
index 000000000..3d2f31c89
--- /dev/null
+++ b/skills/executing-plans/.orphaned_at
@@ -0,0 +1 @@
+1768873298664
\ No newline at end of file
diff --git a/skills/finishing-a-development-branch/.orphaned_at b/skills/finishing-a-development-branch/.orphaned_at
new file mode 100644
index 000000000..f1f2bed35
--- /dev/null
+++ b/skills/finishing-a-development-branch/.orphaned_at
@@ -0,0 +1 @@
+1768873298665
\ No newline at end of file
diff --git a/skills/receiving-code-review/.orphaned_at b/skills/receiving-code-review/.orphaned_at
new file mode 100644
index 000000000..f1f2bed35
--- /dev/null
+++ b/skills/receiving-code-review/.orphaned_at
@@ -0,0 +1 @@
+1768873298665
\ No newline at end of file
diff --git a/skills/requesting-code-review/.orphaned_at b/skills/requesting-code-review/.orphaned_at
new file mode 100644
index 000000000..f1f2bed35
--- /dev/null
+++ b/skills/requesting-code-review/.orphaned_at
@@ -0,0 +1 @@
+1768873298665
\ No newline at end of file
diff --git a/skills/subagent-driven-development/.orphaned_at b/skills/subagent-driven-development/.orphaned_at
new file mode 100644
index 000000000..f1f2bed35
--- /dev/null
+++ b/skills/subagent-driven-development/.orphaned_at
@@ -0,0 +1 @@
+1768873298665
\ No newline at end of file
diff --git a/skills/systematic-debugging/.orphaned_at b/skills/systematic-debugging/.orphaned_at
new file mode 100644
index 000000000..3d2f31c89
--- /dev/null
+++ b/skills/systematic-debugging/.orphaned_at
@@ -0,0 +1 @@
+1768873298664
\ No newline at end of file
diff --git a/skills/test-driven-development/.orphaned_at b/skills/test-driven-development/.orphaned_at
new file mode 100644
index 000000000..3d2f31c89
--- /dev/null
+++ b/skills/test-driven-development/.orphaned_at
@@ -0,0 +1 @@
+1768873298664
\ No newline at end of file
diff --git a/skills/using-git-worktrees/.orphaned_at b/skills/using-git-worktrees/.orphaned_at
new file mode 100644
index 000000000..3d2f31c89
--- /dev/null
+++ b/skills/using-git-worktrees/.orphaned_at
@@ -0,0 +1 @@
+1768873298664
\ No newline at end of file
diff --git a/skills/using-superpowers/.orphaned_at b/skills/using-superpowers/.orphaned_at
new file mode 100644
index 000000000..3d2f31c89
--- /dev/null
+++ b/skills/using-superpowers/.orphaned_at
@@ -0,0 +1 @@
+1768873298664
\ No newline at end of file
diff --git a/skills/verification-before-completion/.orphaned_at b/skills/verification-before-completion/.orphaned_at
new file mode 100644
index 000000000..f1f2bed35
--- /dev/null
+++ b/skills/verification-before-completion/.orphaned_at
@@ -0,0 +1 @@
+1768873298665
\ No newline at end of file
diff --git a/skills/writing-plans/.orphaned_at b/skills/writing-plans/.orphaned_at
new file mode 100644
index 000000000..f1f2bed35
--- /dev/null
+++ b/skills/writing-plans/.orphaned_at
@@ -0,0 +1 @@
+1768873298665
\ No newline at end of file
diff --git a/skills/writing-skills/.orphaned_at b/skills/writing-skills/.orphaned_at
new file mode 100644
index 000000000..f1f2bed35
--- /dev/null
+++ b/skills/writing-skills/.orphaned_at
@@ -0,0 +1 @@
+1768873298665
\ No newline at end of file
diff --git a/tests/claude-code/.orphaned_at b/tests/claude-code/.orphaned_at
new file mode 100644
index 000000000..1b1263c4d
--- /dev/null
+++ b/tests/claude-code/.orphaned_at
@@ -0,0 +1 @@
+1768873298662
\ No newline at end of file
diff --git a/tests/explicit-skill-requests/.orphaned_at b/tests/explicit-skill-requests/.orphaned_at
new file mode 100644
index 000000000..1b1263c4d
--- /dev/null
+++ b/tests/explicit-skill-requests/.orphaned_at
@@ -0,0 +1 @@
+1768873298662
\ No newline at end of file
diff --git a/tests/opencode/.orphaned_at b/tests/opencode/.orphaned_at
new file mode 100644
index 000000000..1b1263c4d
--- /dev/null
+++ b/tests/opencode/.orphaned_at
@@ -0,0 +1 @@
+1768873298662
\ No newline at end of file
diff --git a/tests/skill-triggering/.orphaned_at b/tests/skill-triggering/.orphaned_at
new file mode 100644
index 000000000..1b1263c4d
--- /dev/null
+++ b/tests/skill-triggering/.orphaned_at
@@ -0,0 +1 @@
+1768873298662
\ No newline at end of file
diff --git a/tests/subagent-driven-dev/.orphaned_at b/tests/subagent-driven-dev/.orphaned_at
new file mode 100644
index 000000000..1b1263c4d
--- /dev/null
+++ b/tests/subagent-driven-dev/.orphaned_at
@@ -0,0 +1 @@
+1768873298662
\ No newline at end of file