mirror of
https://github.com/obra/superpowers.git
synced 2026-04-21 08:59:04 +08:00
Compare commits
6 Commits
v3.2.2
...
enable-cod
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22f57e7cb0 | ||
|
|
da9f4f1edd | ||
|
|
5831c4dfea | ||
|
|
26487902f8 | ||
|
|
19e2997334 | ||
|
|
c88b0d674f |
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "superpowers",
|
"name": "superpowers",
|
||||||
"description": "Core skills library for Claude Code: TDD, debugging, collaboration patterns, and proven techniques",
|
"description": "Core skills library for Claude Code: TDD, debugging, collaboration patterns, and proven techniques",
|
||||||
"version": "3.2.2",
|
"version": "3.2.3",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Jesse Vincent",
|
"name": "Jesse Vincent",
|
||||||
"email": "jesse@fsck.com"
|
"email": "jesse@fsck.com"
|
||||||
|
|||||||
35
.codex/INSTALL.md
Normal file
35
.codex/INSTALL.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# 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
|
||||||
|
|
||||||
|
<EXTREMELY_IMPORTANT>
|
||||||
|
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.
|
||||||
|
</EXTREMELY_IMPORTANT>
|
||||||
|
```
|
||||||
|
|
||||||
|
## 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.
|
||||||
33
.codex/superpowers-bootstrap.md
Normal file
33
.codex/superpowers-bootstrap.md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
# Superpowers Bootstrap for Codex
|
||||||
|
|
||||||
|
<EXTREMELY_IMPORTANT>
|
||||||
|
You have superpowers.
|
||||||
|
|
||||||
|
**Tool for running skills:**
|
||||||
|
- `~/.codex/superpowers/.codex/superpowers-codex use-skill <skill-name>`
|
||||||
|
|
||||||
|
**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.
|
||||||
|
</EXTREMELY_IMPORTANT>
|
||||||
388
.codex/superpowers-codex
Executable file
388
.codex/superpowers-codex
Executable file
@@ -0,0 +1,388 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const os = require('os');
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
|
// 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 checkForUpdates() {
|
||||||
|
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: superpowersRepoDir,
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractFrontmatter(filePath) {
|
||||||
|
try {
|
||||||
|
const content = fs.readFileSync(filePath, 'utf8');
|
||||||
|
const lines = content.split('\n');
|
||||||
|
|
||||||
|
let inFrontmatter = false;
|
||||||
|
let name = '';
|
||||||
|
let description = '';
|
||||||
|
let whenToUse = '';
|
||||||
|
|
||||||
|
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;
|
||||||
|
case 'when_to_use': whenToUse = value.trim(); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { name, description, whenToUse };
|
||||||
|
} catch (error) {
|
||||||
|
return { name: '', description: '', whenToUse: '' };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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, whenToUse } = extractFrontmatter(skillFile);
|
||||||
|
|
||||||
|
if (description) console.log(` ${description}`);
|
||||||
|
if (whenToUse) console.log(` When to use: ${whenToUse}`);
|
||||||
|
console.log('');
|
||||||
|
}
|
||||||
|
|
||||||
|
function findSkillsInDir(dir, sourceType, maxDepth = 1) {
|
||||||
|
const skills = [];
|
||||||
|
|
||||||
|
if (!fs.existsSync(dir)) return skills;
|
||||||
|
|
||||||
|
function searchDir(currentDir, currentDepth) {
|
||||||
|
if (currentDepth > maxDepth) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
||||||
|
|
||||||
|
for (const entry of entries) {
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
const skillDir = path.join(currentDir, entry.name);
|
||||||
|
const skillFile = path.join(skillDir, 'SKILL.md');
|
||||||
|
|
||||||
|
if (fs.existsSync(skillFile)) {
|
||||||
|
skills.push(skillDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// For personal skills, search deeper (category/skill structure)
|
||||||
|
if (sourceType === 'personal' && currentDepth < maxDepth) {
|
||||||
|
searchDir(skillDir, currentDepth + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// Ignore permission errors or other issues
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
searchDir(dir, 0);
|
||||||
|
return skills;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Commands
|
||||||
|
function runFindSkills() {
|
||||||
|
console.log('Available skills:');
|
||||||
|
console.log('==================');
|
||||||
|
console.log('');
|
||||||
|
|
||||||
|
const foundSkills = new Set();
|
||||||
|
|
||||||
|
// Find personal skills first (these take precedence)
|
||||||
|
const personalSkills = findSkillsInDir(personalSkillsDir, 'personal', 2);
|
||||||
|
for (const skillPath of personalSkills) {
|
||||||
|
const relPath = path.relative(personalSkillsDir, skillPath);
|
||||||
|
foundSkills.add(relPath);
|
||||||
|
printSkill(skillPath, 'personal');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find superpowers skills (only if not already found in personal)
|
||||||
|
const superpowersSkills = findSkillsInDir(superpowersSkillsDir, 'superpowers', 1);
|
||||||
|
for (const skillPath of superpowersSkills) {
|
||||||
|
const relPath = path.relative(superpowersSkillsDir, skillPath);
|
||||||
|
if (!foundSkills.has(relPath)) {
|
||||||
|
printSkill(skillPath, 'superpowers');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Usage:');
|
||||||
|
console.log(' superpowers-codex use-skill <skill-name> # 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 (checkForUpdates()) {
|
||||||
|
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 <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 <skill-name>');
|
||||||
|
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
|
||||||
|
let content, frontmatter;
|
||||||
|
try {
|
||||||
|
const fullContent = fs.readFileSync(skillFile, 'utf8');
|
||||||
|
const { name, description, whenToUse } = extractFrontmatter(skillFile);
|
||||||
|
|
||||||
|
// Extract just the content after frontmatter
|
||||||
|
const lines = fullContent.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
content = contentLines.join('\n').trim();
|
||||||
|
frontmatter = { name, description, whenToUse };
|
||||||
|
} 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}`);
|
||||||
|
}
|
||||||
|
if (frontmatter.whenToUse) {
|
||||||
|
console.log(`# When to use: ${frontmatter.whenToUse}`);
|
||||||
|
}
|
||||||
|
console.log(`# Supporting tools and docs are 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 <skill-name> # 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;
|
||||||
|
}
|
||||||
10
README.md
10
README.md
@@ -1,6 +1,6 @@
|
|||||||
# Superpowers
|
# Superpowers
|
||||||
|
|
||||||
Give Claude Code superpowers with a comprehensive skills library of proven techniques, patterns, and workflows.
|
A comprehensive skills library of proven techniques, patterns, and workflows for AI coding assistants.
|
||||||
|
|
||||||
## What You Get
|
## What You Get
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ Read the introduction: [Superpowers for Claude Code](https://blog.fsck.com/2025/
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### Via Plugin Marketplace (Recommended)
|
### Claude Code (via Plugin Marketplace)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# In Claude Code
|
# In Claude Code
|
||||||
@@ -41,6 +41,12 @@ Read the introduction: [Superpowers for Claude Code](https://blog.fsck.com/2025/
|
|||||||
# /superpowers:execute-plan - Execute plan in batches
|
# /superpowers:execute-plan - Execute plan in batches
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Codex (Experimental)
|
||||||
|
|
||||||
|
**Note:** Codex support is experimental and may require refinement based on user feedback.
|
||||||
|
|
||||||
|
Tell Codex to fetch https://raw.githubusercontent.com/obra/superpowers/refs/heads/main/.codex/INSTALL.md and follow the instructions.
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
### Using Slash Commands
|
### Using Slash Commands
|
||||||
|
|||||||
@@ -1,5 +1,48 @@
|
|||||||
# Superpowers Release Notes
|
# Superpowers Release Notes
|
||||||
|
|
||||||
|
## v3.3.0 (2025-10-28)
|
||||||
|
|
||||||
|
### New Features
|
||||||
|
|
||||||
|
**Experimental Codex Support**
|
||||||
|
- Added unified `superpowers-codex` script with bootstrap/use-skill/find-skills commands
|
||||||
|
- Cross-platform Node.js implementation (works on Windows, macOS, Linux)
|
||||||
|
- Namespaced skills: `superpowers:skill-name` for superpowers skills, `skill-name` for personal
|
||||||
|
- Personal skills override superpowers skills when names match
|
||||||
|
- Clean skill display: shows name/description without raw frontmatter
|
||||||
|
- Helpful context: shows supporting files directory for each skill
|
||||||
|
- Tool mapping for Codex: TodoWrite→update_plan, subagents→manual fallback, etc.
|
||||||
|
- Bootstrap integration with minimal AGENTS.md for automatic startup
|
||||||
|
- Complete installation guide and bootstrap instructions specific to Codex
|
||||||
|
|
||||||
|
**Key differences from Claude Code integration:**
|
||||||
|
- Single unified script instead of separate tools
|
||||||
|
- Tool substitution system for Codex-specific equivalents
|
||||||
|
- Simplified subagent handling (manual work instead of delegation)
|
||||||
|
- Updated terminology: "Superpowers skills" instead of "Core skills"
|
||||||
|
|
||||||
|
### Files Added
|
||||||
|
- `codex/INSTALL.md` - Installation guide for Codex users
|
||||||
|
- `codex/superpowers-bootstrap.md` - Bootstrap instructions with Codex adaptations
|
||||||
|
- `scripts/superpowers-codex` - Unified Node.js executable with all functionality
|
||||||
|
|
||||||
|
**Note:** Codex support is experimental. The integration provides core superpowers functionality but may require refinement based on user feedback.
|
||||||
|
|
||||||
|
## v3.2.3 (2025-10-23)
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
|
||||||
|
**Updated using-superpowers skill to use Skill tool instead of Read tool**
|
||||||
|
- Changed skill invocation instructions from Read tool to Skill tool
|
||||||
|
- Updated description: "using Read tool" → "using Skill tool"
|
||||||
|
- Updated step 3: "Use the Read tool" → "Use the Skill tool to read and run"
|
||||||
|
- Updated rationalization list: "Read the current version" → "Run the current version"
|
||||||
|
|
||||||
|
The Skill tool is the proper mechanism for invoking skills in Claude Code. This update corrects the bootstrap instructions to guide agents toward the correct tool.
|
||||||
|
|
||||||
|
### Files Changed
|
||||||
|
- Updated: `skills/using-superpowers/SKILL.md` - Changed tool references from Read to Skill
|
||||||
|
|
||||||
## v3.2.2 (2025-10-21)
|
## v3.2.2 (2025-10-21)
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: using-superpowers
|
name: using-superpowers
|
||||||
description: Use when starting any conversation - establishes mandatory workflows for finding and using skills, including using Read tool before announcing usage, following brainstorming before coding, and creating TodoWrite todos for checklists
|
description: Use when starting any conversation - establishes mandatory workflows for finding and using skills, including using Skill tool before announcing usage, following brainstorming before coding, and creating TodoWrite todos for checklists
|
||||||
---
|
---
|
||||||
|
|
||||||
<EXTREMELY-IMPORTANT>
|
<EXTREMELY-IMPORTANT>
|
||||||
@@ -19,7 +19,7 @@ Before responding to ANY user message, you MUST complete this checklist:
|
|||||||
|
|
||||||
1. ☐ List available skills in your mind
|
1. ☐ List available skills in your mind
|
||||||
2. ☐ Ask yourself: "Does ANY skill match this request?"
|
2. ☐ Ask yourself: "Does ANY skill match this request?"
|
||||||
3. ☐ If yes → Use the Read tool to read the skill file
|
3. ☐ If yes → Use the Skill tool to read and run the skill file
|
||||||
4. ☐ Announce which skill you're using
|
4. ☐ Announce which skill you're using
|
||||||
5. ☐ Follow the skill exactly
|
5. ☐ Follow the skill exactly
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ If you catch yourself thinking ANY of these thoughts, STOP. You are rationalizin
|
|||||||
- "I can check git/files quickly" → WRONG. Files don't have conversation context. Check for skills.
|
- "I can check git/files quickly" → WRONG. Files don't have conversation context. Check for skills.
|
||||||
- "Let me gather information first" → WRONG. Skills tell you HOW to gather information. Check for skills.
|
- "Let me gather information first" → WRONG. Skills tell you HOW to gather information. Check for skills.
|
||||||
- "This doesn't need a formal skill" → WRONG. If a skill exists for it, use it.
|
- "This doesn't need a formal skill" → WRONG. If a skill exists for it, use it.
|
||||||
- "I remember this skill" → WRONG. Skills evolve. Read the current version.
|
- "I remember this skill" → WRONG. Skills evolve. Run the current version.
|
||||||
- "This doesn't count as a task" → WRONG. If you're taking action, it's a task. Check for skills.
|
- "This doesn't count as a task" → WRONG. If you're taking action, it's a task. Check for skills.
|
||||||
- "The skill is overkill for this" → WRONG. Skills exist because simple things become complex. Use it.
|
- "The skill is overkill for this" → WRONG. Skills exist because simple things become complex. Use it.
|
||||||
- "I'll just do this one thing first" → WRONG. Check for skills BEFORE doing anything.
|
- "I'll just do this one thing first" → WRONG. Check for skills BEFORE doing anything.
|
||||||
|
|||||||
Reference in New Issue
Block a user