mirror of
https://github.com/obra/superpowers.git
synced 2026-04-29 13:29:05 +08:00
Compare commits
5 Commits
codex/pri-
...
codex/read
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
529e9b287f | ||
|
|
b1c15fd9f8 | ||
|
|
abb801b7ef | ||
|
|
88eb6679ae | ||
|
|
9b3045a8fa |
@@ -36,6 +36,9 @@
|
|||||||
"I've got an idea for something I'd like to build.",
|
"I've got an idea for something I'd like to build.",
|
||||||
"Let's add a feature to this project."
|
"Let's add a feature to this project."
|
||||||
],
|
],
|
||||||
|
"websiteURL": "https://github.com/obra/superpowers",
|
||||||
|
"privacyPolicyURL": "https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement",
|
||||||
|
"termsOfServiceURL": "https://docs.github.com/en/site-policy/github-terms/github-terms-of-service",
|
||||||
"brandColor": "#F59E0B",
|
"brandColor": "#F59E0B",
|
||||||
"composerIcon": "./assets/superpowers-small.svg",
|
"composerIcon": "./assets/superpowers-small.svg",
|
||||||
"logo": "./assets/app-icon.png",
|
"logo": "./assets/app-icon.png",
|
||||||
|
|||||||
@@ -14,10 +14,14 @@ Add superpowers to the `plugin` array in your `opencode.json` (global or project
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Restart OpenCode. That's it — the plugin auto-installs and registers all skills.
|
Restart OpenCode. The plugin installs through OpenCode's plugin manager and
|
||||||
|
registers all skills.
|
||||||
|
|
||||||
Verify by asking: "Tell me about your superpowers"
|
Verify by asking: "Tell me about your superpowers"
|
||||||
|
|
||||||
|
OpenCode uses its own plugin install. If you also use Claude Code, Codex, or
|
||||||
|
another harness, install Superpowers separately for each one.
|
||||||
|
|
||||||
## Migrating from the old symlink-based install
|
## Migrating from the old symlink-based install
|
||||||
|
|
||||||
If you previously installed superpowers using `git clone` and symlinks, remove the old setup:
|
If you previously installed superpowers using `git clone` and symlinks, remove the old setup:
|
||||||
@@ -46,7 +50,10 @@ use skill tool to load superpowers/brainstorming
|
|||||||
|
|
||||||
## Updating
|
## Updating
|
||||||
|
|
||||||
Superpowers updates automatically when you restart OpenCode.
|
OpenCode installs Superpowers through a git-backed package spec. Some OpenCode
|
||||||
|
and Bun versions pin that resolved git dependency in a lockfile or cache, so a
|
||||||
|
restart may not pick up the newest Superpowers commit. If updates do not appear,
|
||||||
|
clear OpenCode's package cache or reinstall the plugin.
|
||||||
|
|
||||||
To pin a specific version:
|
To pin a specific version:
|
||||||
|
|
||||||
@@ -64,6 +71,26 @@ To pin a specific version:
|
|||||||
2. Verify the plugin line in your `opencode.json`
|
2. Verify the plugin line in your `opencode.json`
|
||||||
3. Make sure you're running a recent version of OpenCode
|
3. Make sure you're running a recent version of OpenCode
|
||||||
|
|
||||||
|
### Windows install issues
|
||||||
|
|
||||||
|
Some Windows OpenCode builds have upstream installer issues with git-backed
|
||||||
|
plugin specs, including cache paths for `git+https` URLs and Bun not finding
|
||||||
|
`git.exe` even when it works in a normal terminal. If OpenCode cannot install
|
||||||
|
the plugin, try installing with system npm and pointing OpenCode at the local
|
||||||
|
package:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
npm install superpowers@git+https://github.com/obra/superpowers.git --prefix "$HOME\.config\opencode"
|
||||||
|
```
|
||||||
|
|
||||||
|
Then use the installed package path in `opencode.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"plugin": ["~/.config/opencode/node_modules/superpowers"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Skills not found
|
### Skills not found
|
||||||
|
|
||||||
1. Use `skill` tool to list what's discovered
|
1. Use `skill` tool to list what's discovered
|
||||||
|
|||||||
149
README.md
149
README.md
@@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
Superpowers is a complete software development methodology for your coding agents, built on top of a set of composable skills and some initial instructions that make sure your agent uses them.
|
Superpowers is a complete software development methodology for your coding agents, built on top of a set of composable skills and some initial instructions that make sure your agent uses them.
|
||||||
|
|
||||||
|
## Quickstart
|
||||||
|
|
||||||
|
Give your agent Superpowers: [Claude Code](#claude-code), [Codex CLI](#codex-cli), [Codex App](#codex-app), [Factory Droid](#factory-droid), [Gemini CLI](#gemini-cli), [OpenCode](#opencode), [Cursor](#cursor), [GitHub Copilot CLI](#github-copilot-cli).
|
||||||
|
|
||||||
## How it works
|
## How it works
|
||||||
|
|
||||||
It starts from the moment you fire up your coding agent. As soon as it sees that you're building something, it *doesn't* just jump into trying to write code. Instead, it steps back and asks you what you're really trying to do.
|
It starts from the moment you fire up your coding agent. As soon as it sees that you're building something, it *doesn't* just jump into trying to write code. Instead, it steps back and asks you what you're really trying to do.
|
||||||
@@ -26,95 +30,126 @@ Thanks!
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
**Note:** Installation differs by platform.
|
Installation differs by harness. If you use more than one, install Superpowers separately for each one.
|
||||||
|
|
||||||
### Claude Code Official Marketplace
|
### Claude Code
|
||||||
|
|
||||||
Superpowers is available via the [official Claude plugin marketplace](https://claude.com/plugins/superpowers)
|
Superpowers is available via the [official Claude plugin marketplace](https://claude.com/plugins/superpowers)
|
||||||
|
|
||||||
Install the plugin from Anthropic's official marketplace:
|
#### Official Marketplace
|
||||||
|
|
||||||
```bash
|
- Install the plugin from Anthropic's official marketplace:
|
||||||
/plugin install superpowers@claude-plugins-official
|
|
||||||
```
|
|
||||||
|
|
||||||
### Claude Code (Superpowers Marketplace)
|
```bash
|
||||||
|
/plugin install superpowers@claude-plugins-official
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Superpowers Marketplace
|
||||||
|
|
||||||
The Superpowers marketplace provides Superpowers and some other related plugins for Claude Code.
|
The Superpowers marketplace provides Superpowers and some other related plugins for Claude Code.
|
||||||
|
|
||||||
In Claude Code, register the marketplace first:
|
- Register the marketplace:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
/plugin marketplace add obra/superpowers-marketplace
|
/plugin marketplace add obra/superpowers-marketplace
|
||||||
```
|
```
|
||||||
|
|
||||||
Then install the plugin from this marketplace:
|
- Install the plugin from this marketplace:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
/plugin install superpowers@superpowers-marketplace
|
/plugin install superpowers@superpowers-marketplace
|
||||||
```
|
```
|
||||||
|
|
||||||
### OpenAI Codex CLI
|
### Codex CLI
|
||||||
|
|
||||||
- Open plugin search interface
|
Superpowers is available via the [official Codex plugin marketplace](https://github.com/openai/plugins).
|
||||||
|
|
||||||
```bash
|
- Open the plugin search interface:
|
||||||
/plugins
|
|
||||||
```
|
|
||||||
|
|
||||||
Search for Superpowers
|
```bash
|
||||||
|
/plugins
|
||||||
|
```
|
||||||
|
|
||||||
```bash
|
- Search for Superpowers:
|
||||||
superpowers
|
|
||||||
```
|
|
||||||
|
|
||||||
Select `Install Plugin`
|
```bash
|
||||||
|
superpowers
|
||||||
|
```
|
||||||
|
|
||||||
### OpenAI Codex App
|
- Select `Install Plugin`.
|
||||||
|
|
||||||
|
### Codex App
|
||||||
|
|
||||||
|
Superpowers is available via the [official Codex plugin marketplace](https://github.com/openai/plugins).
|
||||||
|
|
||||||
- In the Codex app, click on Plugins in the sidebar.
|
- In the Codex app, click on Plugins in the sidebar.
|
||||||
- You should see `Superpowers` in the Coding section.
|
- You should see `Superpowers` in the Coding section.
|
||||||
- Click the `+` next to Superpowers and follow the prompts.
|
- Click the `+` next to Superpowers and follow the prompts.
|
||||||
|
|
||||||
|
### Factory Droid
|
||||||
|
|
||||||
### Cursor (via Plugin Marketplace)
|
- Register the marketplace:
|
||||||
|
|
||||||
In Cursor Agent chat, install from marketplace:
|
```bash
|
||||||
|
droid plugin marketplace add https://github.com/obra/superpowers
|
||||||
|
```
|
||||||
|
|
||||||
```text
|
- Install the plugin:
|
||||||
/add-plugin superpowers
|
|
||||||
```
|
|
||||||
|
|
||||||
or search for "superpowers" in the plugin marketplace.
|
```bash
|
||||||
|
droid plugin install superpowers@superpowers
|
||||||
### OpenCode
|
```
|
||||||
|
|
||||||
Tell OpenCode:
|
|
||||||
|
|
||||||
```
|
|
||||||
Fetch and follow instructions from https://raw.githubusercontent.com/obra/superpowers/refs/heads/main/.opencode/INSTALL.md
|
|
||||||
```
|
|
||||||
|
|
||||||
**Detailed docs:** [docs/README.opencode.md](docs/README.opencode.md)
|
|
||||||
|
|
||||||
### GitHub Copilot CLI
|
|
||||||
|
|
||||||
```bash
|
|
||||||
copilot plugin marketplace add obra/superpowers-marketplace
|
|
||||||
copilot plugin install superpowers@superpowers-marketplace
|
|
||||||
```
|
|
||||||
|
|
||||||
### Gemini CLI
|
### Gemini CLI
|
||||||
|
|
||||||
```bash
|
- Install the extension:
|
||||||
gemini extensions install https://github.com/obra/superpowers
|
|
||||||
```
|
|
||||||
|
|
||||||
To update:
|
```bash
|
||||||
|
gemini extensions install https://github.com/obra/superpowers
|
||||||
|
```
|
||||||
|
|
||||||
```bash
|
- Update later:
|
||||||
gemini extensions update superpowers
|
|
||||||
```
|
```bash
|
||||||
|
gemini extensions update superpowers
|
||||||
|
```
|
||||||
|
|
||||||
|
### OpenCode
|
||||||
|
|
||||||
|
OpenCode uses its own plugin install; install Superpowers separately even if you
|
||||||
|
already use it in another harness.
|
||||||
|
|
||||||
|
- Tell OpenCode:
|
||||||
|
|
||||||
|
```
|
||||||
|
Fetch and follow instructions from https://raw.githubusercontent.com/obra/superpowers/refs/heads/main/.opencode/INSTALL.md
|
||||||
|
```
|
||||||
|
|
||||||
|
- Detailed docs: [docs/README.opencode.md](docs/README.opencode.md)
|
||||||
|
|
||||||
|
### Cursor
|
||||||
|
|
||||||
|
- In Cursor Agent chat, install from marketplace:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/add-plugin superpowers
|
||||||
|
```
|
||||||
|
|
||||||
|
- Or search for "superpowers" in the plugin marketplace.
|
||||||
|
|
||||||
|
### GitHub Copilot CLI
|
||||||
|
|
||||||
|
- Register the marketplace:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
copilot plugin marketplace add obra/superpowers-marketplace
|
||||||
|
```
|
||||||
|
|
||||||
|
- Install the plugin:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
copilot plugin install superpowers@superpowers-marketplace
|
||||||
|
```
|
||||||
|
|
||||||
## The Basic Workflow
|
## The Basic Workflow
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,14 @@ Add superpowers to the `plugin` array in your `opencode.json` (global or project
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Restart OpenCode. The plugin auto-installs via Bun and registers all skills automatically.
|
Restart OpenCode. The plugin installs through OpenCode's plugin manager and
|
||||||
|
registers all skills.
|
||||||
|
|
||||||
Verify by asking: "Tell me about your superpowers"
|
Verify by asking: "Tell me about your superpowers"
|
||||||
|
|
||||||
|
OpenCode uses its own plugin install. If you also use Claude Code, Codex, or
|
||||||
|
another harness, install Superpowers separately for each one.
|
||||||
|
|
||||||
### Migrating from the old symlink-based install
|
### Migrating from the old symlink-based install
|
||||||
|
|
||||||
If you previously installed superpowers using `git clone` and symlinks, remove the old setup:
|
If you previously installed superpowers using `git clone` and symlinks, remove the old setup:
|
||||||
@@ -78,7 +82,10 @@ Create project-specific skills in `.opencode/skills/` within your project.
|
|||||||
|
|
||||||
## Updating
|
## Updating
|
||||||
|
|
||||||
Superpowers updates automatically when you restart OpenCode. The plugin is re-installed from the git repository on each launch.
|
OpenCode installs Superpowers through a git-backed package spec. Some OpenCode
|
||||||
|
and Bun versions pin that resolved git dependency in a lockfile or cache, so a
|
||||||
|
restart may not pick up the newest Superpowers commit. If updates do not appear,
|
||||||
|
clear OpenCode's package cache or reinstall the plugin.
|
||||||
|
|
||||||
To pin a specific version, use a branch or tag:
|
To pin a specific version, use a branch or tag:
|
||||||
|
|
||||||
@@ -112,6 +119,26 @@ Skills written for Claude Code are automatically adapted for OpenCode:
|
|||||||
2. Verify the plugin line in your `opencode.json` is correct
|
2. Verify the plugin line in your `opencode.json` is correct
|
||||||
3. Make sure you're running a recent version of OpenCode
|
3. Make sure you're running a recent version of OpenCode
|
||||||
|
|
||||||
|
### Windows install issues
|
||||||
|
|
||||||
|
Some Windows OpenCode builds have upstream installer issues with git-backed
|
||||||
|
plugin specs, including cache paths for `git+https` URLs and Bun not finding
|
||||||
|
`git.exe` even when it works in a normal terminal. If OpenCode cannot install
|
||||||
|
the plugin, try installing with system npm and pointing OpenCode at the local
|
||||||
|
package:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
npm install superpowers@git+https://github.com/obra/superpowers.git --prefix "$HOME\.config\opencode"
|
||||||
|
```
|
||||||
|
|
||||||
|
Then use the installed package path in `opencode.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"plugin": ["~/.config/opencode/node_modules/superpowers"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Skills not found
|
### Skills not found
|
||||||
|
|
||||||
1. Use OpenCode's `skill` tool to list available skills
|
1. Use OpenCode's `skill` tool to list available skills
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
#
|
#
|
||||||
# Sync this superpowers checkout → prime-radiant-inc/openai-codex-plugins.
|
# Sync this superpowers checkout → prime-radiant-inc/openai-codex-plugins.
|
||||||
# Clones the fork fresh into a temp dir, rsyncs tracked upstream plugin content
|
# Clones the fork fresh into a temp dir, rsyncs tracked upstream plugin content
|
||||||
# (including committed Codex files under .codex-plugin/ and assets/), commits,
|
# (including committed Codex files under .codex-plugin/ and assets/), preserves
|
||||||
|
# OpenAI-owned marketplace metadata already in the destination plugin, commits,
|
||||||
# pushes a sync branch, and opens a PR.
|
# pushes a sync branch, and opens a PR.
|
||||||
# Path/user agnostic — auto-detects upstream from script location.
|
# Path/user agnostic — auto-detects upstream from script location.
|
||||||
#
|
#
|
||||||
@@ -223,6 +224,7 @@ fi
|
|||||||
DEST="$DEST_REPO/$DEST_REL"
|
DEST="$DEST_REPO/$DEST_REL"
|
||||||
PREVIEW_REPO="$DEST_REPO"
|
PREVIEW_REPO="$DEST_REPO"
|
||||||
PREVIEW_DEST="$DEST"
|
PREVIEW_DEST="$DEST"
|
||||||
|
SYNC_SOURCE=""
|
||||||
|
|
||||||
overlay_destination_paths() {
|
overlay_destination_paths() {
|
||||||
local repo="$1"
|
local repo="$1"
|
||||||
@@ -291,7 +293,7 @@ apply_to_preview_checkout() {
|
|||||||
mkdir -p "$PREVIEW_DEST"
|
mkdir -p "$PREVIEW_DEST"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
rsync "${RSYNC_ARGS[@]}" "$UPSTREAM/" "$PREVIEW_DEST/"
|
rsync "${RSYNC_ARGS[@]}" "$SYNC_SOURCE/" "$PREVIEW_DEST/"
|
||||||
}
|
}
|
||||||
|
|
||||||
preview_checkout_has_changes() {
|
preview_checkout_has_changes() {
|
||||||
@@ -316,6 +318,36 @@ for pat in "${EXCLUDES[@]}"; do RSYNC_ARGS+=(--exclude="$pat"); done
|
|||||||
append_git_ignored_directory_excludes
|
append_git_ignored_directory_excludes
|
||||||
append_git_ignored_file_excludes
|
append_git_ignored_file_excludes
|
||||||
|
|
||||||
|
copy_preserved_destination_metadata() {
|
||||||
|
local destination="$1"
|
||||||
|
local source="$2"
|
||||||
|
local path
|
||||||
|
local rel
|
||||||
|
|
||||||
|
[[ -d "$destination/skills" ]] || return 0
|
||||||
|
|
||||||
|
while IFS= read -r -d '' path; do
|
||||||
|
rel="${path#"$destination"/}"
|
||||||
|
mkdir -p "$source/$(dirname "$rel")"
|
||||||
|
cp -p "$path" "$source/$rel"
|
||||||
|
done < <(find "$destination/skills" -path '*/agents/openai.yaml' -type f -print0)
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare_sync_source() {
|
||||||
|
local destination="$1"
|
||||||
|
|
||||||
|
[[ -n "$CLEANUP_DIR" ]] || CLEANUP_DIR="$(mktemp -d)"
|
||||||
|
|
||||||
|
SYNC_SOURCE="$CLEANUP_DIR/source-overlay"
|
||||||
|
rm -rf "$SYNC_SOURCE"
|
||||||
|
mkdir -p "$SYNC_SOURCE"
|
||||||
|
|
||||||
|
rsync "${RSYNC_ARGS[@]}" "$UPSTREAM/" "$SYNC_SOURCE/" >/dev/null
|
||||||
|
copy_preserved_destination_metadata "$destination" "$SYNC_SOURCE"
|
||||||
|
}
|
||||||
|
|
||||||
|
prepare_sync_source "$PREVIEW_DEST"
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Dry run preview (always shown)
|
# Dry run preview (always shown)
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -331,7 +363,7 @@ if [[ $BOOTSTRAP -eq 1 ]]; then
|
|||||||
fi
|
fi
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== Preview (rsync --dry-run) ==="
|
echo "=== Preview (rsync --dry-run) ==="
|
||||||
rsync "${RSYNC_ARGS[@]}" --dry-run --itemize-changes "$UPSTREAM/" "$PREVIEW_DEST/"
|
rsync "${RSYNC_ARGS[@]}" --dry-run --itemize-changes "$SYNC_SOURCE/" "$PREVIEW_DEST/"
|
||||||
echo "=== End preview ==="
|
echo "=== End preview ==="
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
@@ -368,7 +400,7 @@ echo "Syncing upstream content..."
|
|||||||
if [[ $BOOTSTRAP -eq 1 ]]; then
|
if [[ $BOOTSTRAP -eq 1 ]]; then
|
||||||
mkdir -p "$DEST"
|
mkdir -p "$DEST"
|
||||||
fi
|
fi
|
||||||
rsync "${RSYNC_ARGS[@]}" "$UPSTREAM/" "$DEST/"
|
rsync "${RSYNC_ARGS[@]}" "$SYNC_SOURCE/" "$DEST/"
|
||||||
|
|
||||||
# Bail early if nothing actually changed
|
# Bail early if nothing actually changed
|
||||||
cd "$DEST_REPO"
|
cd "$DEST_REPO"
|
||||||
|
|||||||
@@ -73,6 +73,19 @@ assert_matches() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert_not_matches() {
|
||||||
|
local haystack="$1"
|
||||||
|
local pattern="$2"
|
||||||
|
local description="$3"
|
||||||
|
|
||||||
|
if printf '%s' "$haystack" | grep -Eq -- "$pattern"; then
|
||||||
|
fail "$description"
|
||||||
|
echo " did not expect to match: $pattern"
|
||||||
|
else
|
||||||
|
pass "$description"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
assert_path_absent() {
|
assert_path_absent() {
|
||||||
local path="$1"
|
local path="$1"
|
||||||
local description="$2"
|
local description="$2"
|
||||||
@@ -244,6 +257,22 @@ EOF
|
|||||||
commit_fixture "$repo" "Initial destination fixture"
|
commit_fixture "$repo" "Initial destination fixture"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add_openai_agent_metadata_fixture() {
|
||||||
|
local repo="$1"
|
||||||
|
|
||||||
|
mkdir -p "$repo/plugins/superpowers/skills/example/agents"
|
||||||
|
|
||||||
|
cat > "$repo/plugins/superpowers/skills/example/agents/openai.yaml" <<'EOF'
|
||||||
|
interface:
|
||||||
|
display_name: "Example"
|
||||||
|
short_description: "Destination-owned OpenAI metadata"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
git -C "$repo" add plugins/superpowers/skills/example/agents/openai.yaml
|
||||||
|
|
||||||
|
commit_fixture "$repo" "Add OpenAI agent metadata fixture"
|
||||||
|
}
|
||||||
|
|
||||||
dirty_tracked_destination_skill() {
|
dirty_tracked_destination_skill() {
|
||||||
local repo="$1"
|
local repo="$1"
|
||||||
|
|
||||||
@@ -261,6 +290,7 @@ write_synced_destination_fixture() {
|
|||||||
"$repo/plugins/superpowers/.codex-plugin" \
|
"$repo/plugins/superpowers/.codex-plugin" \
|
||||||
"$repo/plugins/superpowers/.private-journal" \
|
"$repo/plugins/superpowers/.private-journal" \
|
||||||
"$repo/plugins/superpowers/assets" \
|
"$repo/plugins/superpowers/assets" \
|
||||||
|
"$repo/plugins/superpowers/skills/example/agents" \
|
||||||
"$repo/plugins/superpowers/skills/example"
|
"$repo/plugins/superpowers/skills/example"
|
||||||
|
|
||||||
cat > "$repo/plugins/superpowers/.codex-plugin/plugin.json" <<EOF
|
cat > "$repo/plugins/superpowers/.codex-plugin/plugin.json" <<EOF
|
||||||
@@ -282,12 +312,19 @@ EOF
|
|||||||
Fixture content.
|
Fixture content.
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
cat > "$repo/plugins/superpowers/skills/example/agents/openai.yaml" <<'EOF'
|
||||||
|
interface:
|
||||||
|
display_name: "Example"
|
||||||
|
short_description: "Destination-owned OpenAI metadata"
|
||||||
|
EOF
|
||||||
|
|
||||||
printf 'tracked keep\n' > "$repo/plugins/superpowers/.private-journal/keep.txt"
|
printf 'tracked keep\n' > "$repo/plugins/superpowers/.private-journal/keep.txt"
|
||||||
|
|
||||||
git -C "$repo" add \
|
git -C "$repo" add \
|
||||||
plugins/superpowers/.codex-plugin/plugin.json \
|
plugins/superpowers/.codex-plugin/plugin.json \
|
||||||
plugins/superpowers/assets/app-icon.png \
|
plugins/superpowers/assets/app-icon.png \
|
||||||
plugins/superpowers/assets/superpowers-small.svg \
|
plugins/superpowers/assets/superpowers-small.svg \
|
||||||
|
plugins/superpowers/skills/example/agents/openai.yaml \
|
||||||
plugins/superpowers/skills/example/SKILL.md \
|
plugins/superpowers/skills/example/SKILL.md \
|
||||||
plugins/superpowers/.private-journal/keep.txt
|
plugins/superpowers/.private-journal/keep.txt
|
||||||
|
|
||||||
@@ -415,6 +452,7 @@ main() {
|
|||||||
local help_output
|
local help_output
|
||||||
local script_source
|
local script_source
|
||||||
local dirty_skill_path
|
local dirty_skill_path
|
||||||
|
local noop_openai_metadata_path
|
||||||
|
|
||||||
echo "=== Test: sync-to-codex-plugin dry-run regression ==="
|
echo "=== Test: sync-to-codex-plugin dry-run regression ==="
|
||||||
|
|
||||||
@@ -443,6 +481,7 @@ main() {
|
|||||||
|
|
||||||
init_repo "$dest"
|
init_repo "$dest"
|
||||||
write_destination_fixture "$dest"
|
write_destination_fixture "$dest"
|
||||||
|
add_openai_agent_metadata_fixture "$dest"
|
||||||
checkout_fixture_branch "$dest" "$dest_branch"
|
checkout_fixture_branch "$dest" "$dest_branch"
|
||||||
dirty_tracked_destination_skill "$dest"
|
dirty_tracked_destination_skill "$dest"
|
||||||
|
|
||||||
@@ -490,6 +529,7 @@ main() {
|
|||||||
preview_section="$(printf '%s\n' "$preview_output" | sed -n '/^=== Preview (rsync --dry-run) ===$/,/^=== End preview ===$/p')"
|
preview_section="$(printf '%s\n' "$preview_output" | sed -n '/^=== Preview (rsync --dry-run) ===$/,/^=== End preview ===$/p')"
|
||||||
stale_preview_section="$(printf '%s\n' "$stale_preview_output" | sed -n '/^=== Preview (rsync --dry-run) ===$/,/^=== End preview ===$/p')"
|
stale_preview_section="$(printf '%s\n' "$stale_preview_output" | sed -n '/^=== Preview (rsync --dry-run) ===$/,/^=== End preview ===$/p')"
|
||||||
dirty_skill_path="$dirty_apply_dest/plugins/superpowers/skills/example/SKILL.md"
|
dirty_skill_path="$dirty_apply_dest/plugins/superpowers/skills/example/SKILL.md"
|
||||||
|
noop_openai_metadata_path="$noop_apply_dest/plugins/superpowers/skills/example/agents/openai.yaml"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Preview assertions..."
|
echo "Preview assertions..."
|
||||||
@@ -505,6 +545,7 @@ main() {
|
|||||||
assert_not_contains "$preview_output" "Overlay file (.codex-plugin/plugin.json) will be regenerated" "Preview omits overlay regeneration note"
|
assert_not_contains "$preview_output" "Overlay file (.codex-plugin/plugin.json) will be regenerated" "Preview omits overlay regeneration note"
|
||||||
assert_not_contains "$preview_output" "Assets (superpowers-small.svg, app-icon.png) will be seeded from" "Preview omits assets seeding note"
|
assert_not_contains "$preview_output" "Assets (superpowers-small.svg, app-icon.png) will be seeded from" "Preview omits assets seeding note"
|
||||||
assert_contains "$preview_section" "skills/example/SKILL.md" "Preview reflects dirty tracked destination file"
|
assert_contains "$preview_section" "skills/example/SKILL.md" "Preview reflects dirty tracked destination file"
|
||||||
|
assert_not_matches "$preview_section" "\\*deleting +skills/example/agents/openai\\.yaml" "Preview preserves destination-owned OpenAI agent metadata"
|
||||||
assert_current_branch "$dest" "$dest_branch" "Preview leaves destination checkout on its original branch"
|
assert_current_branch "$dest" "$dest_branch" "Preview leaves destination checkout on its original branch"
|
||||||
assert_branch_absent "$dest" "sync/superpowers-*" "Preview does not create sync branch in destination checkout"
|
assert_branch_absent "$dest" "sync/superpowers-*" "Preview does not create sync branch in destination checkout"
|
||||||
|
|
||||||
@@ -542,6 +583,9 @@ Locally modified fixture content." "Dirty local apply preserves tracked working-
|
|||||||
assert_contains "$noop_apply_output" "No changes — embedded plugin was already in sync with upstream" "Clean no-op local apply reports no changes"
|
assert_contains "$noop_apply_output" "No changes — embedded plugin was already in sync with upstream" "Clean no-op local apply reports no changes"
|
||||||
assert_current_branch "$noop_apply_dest" "$noop_apply_dest_branch" "Clean no-op local apply leaves destination checkout on its original branch"
|
assert_current_branch "$noop_apply_dest" "$noop_apply_dest_branch" "Clean no-op local apply leaves destination checkout on its original branch"
|
||||||
assert_branch_absent "$noop_apply_dest" "sync/superpowers-*" "Clean no-op local apply does not create sync branch in destination checkout"
|
assert_branch_absent "$noop_apply_dest" "sync/superpowers-*" "Clean no-op local apply does not create sync branch in destination checkout"
|
||||||
|
assert_file_equals "$noop_openai_metadata_path" "interface:
|
||||||
|
display_name: \"Example\"
|
||||||
|
short_description: \"Destination-owned OpenAI metadata\"" "Clean no-op local apply preserves OpenAI agent metadata"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Missing manifest assertions..."
|
echo "Missing manifest assertions..."
|
||||||
|
|||||||
Reference in New Issue
Block a user