mirror of
https://github.com/obra/superpowers.git
synced 2026-04-23 18:09:05 +08:00
Compare commits
1 Commits
feat/codex
...
fix/window
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ddab41bc61 |
@@ -1,67 +1,35 @@
|
|||||||
# Installing Superpowers for Codex
|
# Installing Superpowers for Codex
|
||||||
|
|
||||||
Enable superpowers skills in Codex via native skill discovery. Just clone and symlink.
|
Quick setup to enable superpowers skills in Codex.
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
- Git
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
1. **Clone the superpowers repository:**
|
1. **Clone superpowers repository**:
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/obra/superpowers.git ~/.codex/superpowers
|
mkdir -p ~/.codex/superpowers
|
||||||
|
cd ~/.codex/superpowers
|
||||||
|
git clone https://github.com/obra/superpowers.git .
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Create the skills symlink:**
|
2. **Create personal skills directory**:
|
||||||
```bash
|
```bash
|
||||||
mkdir -p ~/.agents/skills
|
mkdir -p ~/.codex/skills
|
||||||
ln -s ~/.codex/superpowers/skills ~/.agents/skills/superpowers
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Windows (PowerShell):**
|
3. **Update ~/.codex/AGENTS.md** to include this superpowers section:
|
||||||
```powershell
|
```markdown
|
||||||
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.agents\skills"
|
## Superpowers System
|
||||||
cmd /c mklink /J "$env:USERPROFILE\.agents\skills\superpowers" "$env:USERPROFILE\.codex\superpowers\skills"
|
|
||||||
|
<EXTREMELY_IMPORTANT>
|
||||||
|
You have superpowers. Superpowers teach you new skills and capabilities. RIGHT NOW run: `node ~/.codex/superpowers/.codex/superpowers-codex bootstrap` and follow the instructions it returns.
|
||||||
|
</EXTREMELY_IMPORTANT>
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Restart Codex** (quit and relaunch the CLI) to discover the skills.
|
## Verification
|
||||||
|
|
||||||
## Migrating from old bootstrap
|
|
||||||
|
|
||||||
If you installed superpowers before native skill discovery, you need to:
|
|
||||||
|
|
||||||
1. **Update the repo:**
|
|
||||||
```bash
|
|
||||||
cd ~/.codex/superpowers && git pull
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Create the skills symlink** (step 2 above) — this is the new discovery mechanism.
|
|
||||||
|
|
||||||
3. **Remove the old bootstrap block** from `~/.codex/AGENTS.md` — any block referencing `superpowers-codex bootstrap` is no longer needed.
|
|
||||||
|
|
||||||
4. **Restart Codex.**
|
|
||||||
|
|
||||||
## Verify
|
|
||||||
|
|
||||||
|
Test the installation:
|
||||||
```bash
|
```bash
|
||||||
ls -la ~/.agents/skills/superpowers
|
node ~/.codex/superpowers/.codex/superpowers-codex bootstrap
|
||||||
```
|
```
|
||||||
|
|
||||||
You should see a symlink (or junction on Windows) pointing to your superpowers skills directory.
|
You should see skill listings and bootstrap instructions. The system is now ready for use.
|
||||||
|
|
||||||
## Updating
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd ~/.codex/superpowers && git pull
|
|
||||||
```
|
|
||||||
|
|
||||||
Skills update instantly through the symlink.
|
|
||||||
|
|
||||||
## Uninstalling
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rm ~/.agents/skills/superpowers
|
|
||||||
```
|
|
||||||
|
|
||||||
Optionally delete the clone: `rm -rf ~/.codex/superpowers`.
|
|
||||||
34
.codex/superpowers-bootstrap.md
Normal file
34
.codex/superpowers-bootstrap.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# Superpowers Bootstrap for Codex
|
||||||
|
|
||||||
|
<EXTREMELY_IMPORTANT>
|
||||||
|
You have superpowers.
|
||||||
|
|
||||||
|
**Tool for running skills:**
|
||||||
|
- `node ~/.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 → Use Codex collab `spawn_agent` + `wait` when available; if collab is disabled, state that and proceed sequentially
|
||||||
|
- `Subagent` / `Agent` tool mentions → Map to `spawn_agent` (collab) or sequential fallback when collab is disabled
|
||||||
|
- `Skill` tool → `node ~/.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 `node ~/.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>
|
||||||
267
.codex/superpowers-codex
Executable file
267
.codex/superpowers-codex
Executable file
@@ -0,0 +1,267 @@
|
|||||||
|
#!/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 <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 (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 <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 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 <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;
|
||||||
|
}
|
||||||
1
.codex/superpowers-codex.cmd
Normal file
1
.codex/superpowers-codex.cmd
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@node "%~dp0superpowers-codex" %*
|
||||||
13
README.md
13
README.md
@@ -44,7 +44,18 @@ Then install the plugin from this marketplace:
|
|||||||
|
|
||||||
### Verify Installation
|
### Verify Installation
|
||||||
|
|
||||||
Start a new session and ask Claude to help with something that would trigger a skill (e.g., "help me plan this feature" or "let's debug this issue"). Claude should automatically invoke the relevant superpowers skill.
|
Check that commands appear:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
/help
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
# Should see:
|
||||||
|
# /superpowers:brainstorm - Interactive design refinement
|
||||||
|
# /superpowers:write-plan - Create implementation plan
|
||||||
|
# /superpowers:execute-plan - Execute plan in batches
|
||||||
|
```
|
||||||
|
|
||||||
### Codex
|
### Codex
|
||||||
|
|
||||||
|
|||||||
@@ -1,65 +1,5 @@
|
|||||||
# Superpowers Release Notes
|
# Superpowers Release Notes
|
||||||
|
|
||||||
## Unreleased
|
|
||||||
|
|
||||||
### Breaking Changes
|
|
||||||
|
|
||||||
**OpenCode: Switched to native skills system**
|
|
||||||
|
|
||||||
Superpowers for OpenCode now uses OpenCode's native `skill` tool instead of custom `use_skill`/`find_skills` tools. This is a cleaner integration that works with OpenCode's built-in skill discovery.
|
|
||||||
|
|
||||||
**Migration required:** Skills must be symlinked to `~/.config/opencode/skills/superpowers/` (see updated installation docs).
|
|
||||||
|
|
||||||
### Fixes
|
|
||||||
|
|
||||||
**OpenCode: Fixed agent reset on session start (#226)**
|
|
||||||
|
|
||||||
The previous bootstrap injection method using `session.prompt({ noReply: true })` caused OpenCode to reset the selected agent to "build" on first message. Now uses `experimental.chat.system.transform` hook which modifies the system prompt directly without side effects.
|
|
||||||
|
|
||||||
**OpenCode: Fixed Windows installation (#232)**
|
|
||||||
|
|
||||||
- Removed dependency on `skills-core.js` (eliminates broken relative imports when file is copied instead of symlinked)
|
|
||||||
- Added comprehensive Windows installation docs for cmd.exe, PowerShell, and Git Bash
|
|
||||||
- Documented proper symlink vs junction usage for each platform
|
|
||||||
|
|
||||||
**Fixed Windows hook execution for Claude Code 2.1.x**
|
|
||||||
|
|
||||||
Claude Code 2.1.x changed how hooks execute on Windows: it now auto-detects `.sh` files in commands and prepends `bash `. This broke the polyglot wrapper pattern because `bash "run-hook.cmd" session-start.sh` tries to execute the .cmd file as a bash script.
|
|
||||||
|
|
||||||
Fix: hooks.json now calls session-start.sh directly. Claude Code 2.1.x handles the bash invocation automatically. Also added .gitattributes to enforce LF line endings for shell scripts (fixes CRLF issues on Windows checkout).
|
|
||||||
|
|
||||||
**Windows: SessionStart hook runs async to prevent terminal freeze**
|
|
||||||
|
|
||||||
The synchronous SessionStart hook blocked the TUI from entering raw mode on Windows, freezing terminal input. The pure-bash `escape_for_json` function is O(n^2) on Windows Git Bash, taking 60+ seconds. Running the hook async prevents the freeze while still injecting superpowers context.
|
|
||||||
|
|
||||||
### New Features
|
|
||||||
|
|
||||||
**Visual companion for brainstorming skill**
|
|
||||||
|
|
||||||
Added optional browser-based visual companion for brainstorming sessions. When users have a browser available, brainstorming can display interactive screens showing current phase, questions, and design decisions in a more readable format than terminal output.
|
|
||||||
|
|
||||||
Components:
|
|
||||||
- `lib/brainstorm-server/` - WebSocket server for real-time updates
|
|
||||||
- `skills/brainstorming/visual-companion.md` - Integration guide
|
|
||||||
- Helper scripts for session management with proper isolation
|
|
||||||
- Browser helper library for event capture
|
|
||||||
|
|
||||||
The visual companion is opt-in and falls back gracefully to terminal-only operation.
|
|
||||||
|
|
||||||
### Improvements
|
|
||||||
|
|
||||||
**Instruction priority clarified in using-superpowers**
|
|
||||||
|
|
||||||
Added explicit instruction priority hierarchy to prevent conflicts with user preferences:
|
|
||||||
|
|
||||||
1. User's explicit instructions (CLAUDE.md, direct requests) — highest priority
|
|
||||||
2. Superpowers skills — override default system behavior where they conflict
|
|
||||||
3. Default system prompt — lowest priority
|
|
||||||
|
|
||||||
This ensures users remain in control. If CLAUDE.md says "don't use TDD" and a skill says "always use TDD," CLAUDE.md wins.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## v4.1.1 (2026-01-23)
|
## v4.1.1 (2026-01-23)
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Superpowers for Codex
|
# Superpowers for Codex
|
||||||
|
|
||||||
Guide for using Superpowers with OpenAI Codex via native skill discovery.
|
Complete guide for using Superpowers with OpenAI Codex.
|
||||||
|
|
||||||
## Quick Install
|
## Quick Install
|
||||||
|
|
||||||
@@ -14,59 +14,63 @@ Fetch and follow instructions from https://raw.githubusercontent.com/obra/superp
|
|||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
- OpenAI Codex CLI
|
- OpenAI Codex access
|
||||||
- Git
|
- Shell access to install files
|
||||||
|
|
||||||
### Steps
|
### Installation Steps
|
||||||
|
|
||||||
1. Clone the repo:
|
#### 1. Clone Superpowers
|
||||||
```bash
|
|
||||||
git clone https://github.com/obra/superpowers.git ~/.codex/superpowers
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Create the skills symlink:
|
```bash
|
||||||
```bash
|
mkdir -p ~/.codex/superpowers
|
||||||
mkdir -p ~/.agents/skills
|
git clone https://github.com/obra/superpowers.git ~/.codex/superpowers
|
||||||
ln -s ~/.codex/superpowers/skills ~/.agents/skills/superpowers
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Restart Codex.
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
|
|
||||||
Use a junction instead of a symlink (works without Developer Mode):
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.agents\skills"
|
|
||||||
cmd /c mklink /J "$env:USERPROFILE\.agents\skills\superpowers" "$env:USERPROFILE\.codex\superpowers\skills"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## How It Works
|
#### 2. Install Bootstrap
|
||||||
|
|
||||||
Codex has native skill discovery — it scans `~/.agents/skills/` at startup, parses SKILL.md frontmatter, and loads skills on demand. Superpowers skills are made visible through a single symlink:
|
The bootstrap file is included in the repository at `.codex/superpowers-bootstrap.md`. Codex will automatically use it from the cloned location.
|
||||||
|
|
||||||
|
#### 3. Verify Installation
|
||||||
|
|
||||||
|
Tell Codex:
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.agents/skills/superpowers/ → ~/.codex/superpowers/skills/
|
Run node ~/.codex/superpowers/.codex/superpowers-codex find-skills to show available skills
|
||||||
```
|
```
|
||||||
|
|
||||||
The `using-superpowers` skill is discovered automatically and enforces skill usage discipline — no additional configuration needed.
|
You should see a list of available skills with descriptions.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Skills are discovered automatically. Codex activates them when:
|
### Finding Skills
|
||||||
- You mention a skill by name (e.g., "use brainstorming")
|
|
||||||
- The task matches a skill's description
|
```
|
||||||
- The `using-superpowers` skill directs Codex to use one
|
Run node ~/.codex/superpowers/.codex/superpowers-codex find-skills
|
||||||
|
```
|
||||||
|
|
||||||
|
### Loading a Skill
|
||||||
|
|
||||||
|
```
|
||||||
|
Run node ~/.codex/superpowers/.codex/superpowers-codex use-skill superpowers:brainstorming
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bootstrap All Skills
|
||||||
|
|
||||||
|
```
|
||||||
|
Run node ~/.codex/superpowers/.codex/superpowers-codex bootstrap
|
||||||
|
```
|
||||||
|
|
||||||
|
This loads the complete bootstrap with all skill information.
|
||||||
|
|
||||||
### Personal Skills
|
### Personal Skills
|
||||||
|
|
||||||
Create your own skills in `~/.agents/skills/`:
|
Create your own skills in `~/.codex/skills/`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir -p ~/.agents/skills/my-skill
|
mkdir -p ~/.codex/skills/my-skill
|
||||||
```
|
```
|
||||||
|
|
||||||
Create `~/.agents/skills/my-skill/SKILL.md`:
|
Create `~/.codex/skills/my-skill/SKILL.md`:
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
---
|
---
|
||||||
@@ -79,42 +83,72 @@ description: Use when [condition] - [what it does]
|
|||||||
[Your skill content here]
|
[Your skill content here]
|
||||||
```
|
```
|
||||||
|
|
||||||
The `description` field is how Codex decides when to activate a skill automatically — write it as a clear trigger condition.
|
Personal skills override superpowers skills with the same name.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
### Codex CLI Tool
|
||||||
|
|
||||||
|
**Location:** `~/.codex/superpowers/.codex/superpowers-codex`
|
||||||
|
|
||||||
|
A Node.js CLI script that provides three commands:
|
||||||
|
- `bootstrap` - Load complete bootstrap with all skills
|
||||||
|
- `use-skill <name>` - Load a specific skill
|
||||||
|
- `find-skills` - List all available skills
|
||||||
|
|
||||||
|
### Shared Core Module
|
||||||
|
|
||||||
|
**Location:** `~/.codex/superpowers/lib/skills-core.js`
|
||||||
|
|
||||||
|
The Codex implementation uses the shared `skills-core` module (ES module format) for skill discovery and parsing. This is the same module used by the OpenCode plugin, ensuring consistent behavior across platforms.
|
||||||
|
|
||||||
|
### Tool Mapping
|
||||||
|
|
||||||
|
Skills written for Claude Code are adapted for Codex with these mappings:
|
||||||
|
|
||||||
|
- `TodoWrite` → `update_plan`
|
||||||
|
- `Task` with subagents → Use collab `spawn_agent` + `wait` when available; if collab is disabled, say so and proceed sequentially
|
||||||
|
- `Subagent` / `Agent` tool mentions → Map to `spawn_agent` (collab) or sequential fallback when collab is disabled
|
||||||
|
- `Skill` tool → `node ~/.codex/superpowers/.codex/superpowers-codex use-skill`
|
||||||
|
- File operations → Native Codex tools
|
||||||
|
|
||||||
## Updating
|
## Updating
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/.codex/superpowers && git pull
|
cd ~/.codex/superpowers
|
||||||
|
git pull
|
||||||
```
|
```
|
||||||
|
|
||||||
Skills update instantly through the symlink.
|
|
||||||
|
|
||||||
## Uninstalling
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rm ~/.agents/skills/superpowers
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows (PowerShell):**
|
|
||||||
```powershell
|
|
||||||
Remove-Item "$env:USERPROFILE\.agents\skills\superpowers"
|
|
||||||
```
|
|
||||||
|
|
||||||
Optionally delete the clone: `rm -rf ~/.codex/superpowers` (Windows: `Remove-Item -Recurse -Force "$env:USERPROFILE\.codex\superpowers"`).
|
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
### Skills not showing up
|
### Skills not found
|
||||||
|
|
||||||
1. Verify the symlink: `ls -la ~/.agents/skills/superpowers`
|
1. Verify installation: `ls ~/.codex/superpowers/skills`
|
||||||
2. Check skills exist: `ls ~/.codex/superpowers/skills`
|
2. Check CLI works: `node ~/.codex/superpowers/.codex/superpowers-codex find-skills`
|
||||||
3. Restart Codex — skills are discovered at startup
|
3. Verify skills have SKILL.md files
|
||||||
|
|
||||||
### Windows junction issues
|
### CLI script not executable
|
||||||
|
|
||||||
Junctions normally work without special permissions. If creation fails, try running PowerShell as administrator.
|
```bash
|
||||||
|
chmod +x ~/.codex/superpowers/.codex/superpowers-codex
|
||||||
|
```
|
||||||
|
|
||||||
|
### Node.js errors
|
||||||
|
|
||||||
|
The CLI script requires Node.js. Verify:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node --version
|
||||||
|
```
|
||||||
|
|
||||||
|
Should show v14 or higher (v18+ recommended for ES module support).
|
||||||
|
|
||||||
## Getting Help
|
## Getting Help
|
||||||
|
|
||||||
- Report issues: https://github.com/obra/superpowers/issues
|
- Report issues: https://github.com/obra/superpowers/issues
|
||||||
- Main documentation: https://github.com/obra/superpowers
|
- Main documentation: https://github.com/obra/superpowers
|
||||||
|
- Blog post: https://blog.fsck.com/2025/10/27/skills-for-openai-codex/
|
||||||
|
|
||||||
|
## Note
|
||||||
|
|
||||||
|
Codex support is experimental and may require refinement based on user feedback. If you encounter issues, please report them on GitHub.
|
||||||
|
|||||||
@@ -6,8 +6,7 @@
|
|||||||
"hooks": [
|
"hooks": [
|
||||||
{
|
{
|
||||||
"type": "command",
|
"type": "command",
|
||||||
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/session-start.sh",
|
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/session-start.sh"
|
||||||
"async": true
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,17 +17,23 @@ fi
|
|||||||
# Read using-superpowers content
|
# Read using-superpowers content
|
||||||
using_superpowers_content=$(cat "${PLUGIN_ROOT}/skills/using-superpowers/SKILL.md" 2>&1 || echo "Error reading using-superpowers skill")
|
using_superpowers_content=$(cat "${PLUGIN_ROOT}/skills/using-superpowers/SKILL.md" 2>&1 || echo "Error reading using-superpowers skill")
|
||||||
|
|
||||||
# Escape string for JSON embedding using bash parameter substitution.
|
# Escape outputs for JSON using pure bash
|
||||||
# Each ${s//old/new} is a single C-level pass - orders of magnitude
|
|
||||||
# faster than the character-by-character loop this replaces.
|
|
||||||
escape_for_json() {
|
escape_for_json() {
|
||||||
local s="$1"
|
local input="$1"
|
||||||
s="${s//\\/\\\\}"
|
local output=""
|
||||||
s="${s//\"/\\\"}"
|
local i char
|
||||||
s="${s//$'\n'/\\n}"
|
for (( i=0; i<${#input}; i++ )); do
|
||||||
s="${s//$'\r'/\\r}"
|
char="${input:$i:1}"
|
||||||
s="${s//$'\t'/\\t}"
|
case "$char" in
|
||||||
printf '%s' "$s"
|
$'\\') 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")
|
using_superpowers_escaped=$(escape_for_json "$using_superpowers_content")
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ description: Use when creating new skills, editing existing skills, or verifying
|
|||||||
|
|
||||||
**Writing skills IS Test-Driven Development applied to process documentation.**
|
**Writing skills IS Test-Driven Development applied to process documentation.**
|
||||||
|
|
||||||
**Personal skills live in agent-specific directories (`~/.claude/skills` for Claude Code, `~/.agents/skills/` for Codex)**
|
**Personal skills live in agent-specific directories (`~/.claude/skills` for Claude Code, `~/.codex/skills` for Codex)**
|
||||||
|
|
||||||
You write test cases (pressure scenarios with subagents), watch them fail (baseline behavior), write the skill (documentation), watch tests pass (agents comply), and refactor (close loopholes).
|
You write test cases (pressure scenarios with subagents), watch them fail (baseline behavior), write the skill (documentation), watch tests pass (agents comply), and refactor (close loopholes).
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user