Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .devin-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "superpowers",
"version": "6.1.1",
"description": "An agentic skills framework & software development methodology that works: planning, TDD, debugging, and collaboration workflows.",
"author": {
"name": "Jesse Vincent",
"email": "jesse@fsck.com"
},
"homepage": "https://github.com/obra/superpowers",
"repository": "https://github.com/obra/superpowers",
"license": "MIT",
"keywords": [
"brainstorming",
"subagent-driven-development",
"skills",
"planning",
"tdd",
"debugging",
"code-review",
"workflow"
]
}
1 change: 1 addition & 0 deletions .version-bump.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
{ "path": ".claude-plugin/plugin.json", "field": "version" },
{ "path": ".cursor-plugin/plugin.json", "field": "version" },
{ "path": ".codex-plugin/plugin.json", "field": "version" },
{ "path": ".devin-plugin/plugin.json", "field": "version" },
{ "path": ".kimi-plugin/plugin.json", "field": "version" },
{ "path": ".claude-plugin/marketplace.json", "field": "plugins.0.version" },
{ "path": "gemini-extension.json", "field": "version" }
Expand Down
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ If this sounds like someone you know, definitely send them our way.

## Quickstart

Give your agent Superpowers: [Claude Code](#claude-code), [Antigravity](#antigravity), [Codex App](#codex-app), [Codex CLI](#codex-cli), [Cursor](#cursor), [Factory Droid](#factory-droid), [Gemini CLI](#gemini-cli), [GitHub Copilot CLI](#github-copilot-cli), [Kimi Code](#kimi-code), [OpenCode](#opencode), [Pi](#pi).
Give your agent Superpowers: [Claude Code](#claude-code), [Antigravity](#antigravity), [Codex App](#codex-app), [Codex CLI](#codex-cli), [Cursor](#cursor), [Devin CLI](#devin-cli), [Factory Droid](#factory-droid), [Gemini CLI](#gemini-cli), [GitHub Copilot CLI](#github-copilot-cli), [Kimi Code](#kimi-code), [OpenCode](#opencode), [Pi](#pi).

## How it works

Expand Down Expand Up @@ -108,6 +108,20 @@ Superpowers is available via the [official Codex plugin marketplace](https://git

- Or search for "superpowers" in the plugin marketplace.

### Devin CLI

- Install the plugin from this repository:

```bash
devin plugins install obra/superpowers
```

- Update to the latest version with:

```bash
devin plugins update superpowers
```

### Factory Droid

- Register the marketplace:
Expand Down
1 change: 1 addition & 0 deletions scripts/sync-to-codex-plugin.sh
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ EXCLUDES=(
"/.claude-plugin/"
"/.codex/"
"/.cursor-plugin/"
"/.devin-plugin/"
"/.git/"
"/.gitattributes"
"/.github/"
Expand Down
63 changes: 63 additions & 0 deletions tests/devin/test-devin-plugin.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#!/usr/bin/env bash
# Validate the Devin CLI integration. `devin plugins install obra/superpowers`
# reads `.devin-plugin/plugin.json` and auto-discovers the co-located `skills/`
# directory; Devin CLI surfaces every installed skill's name + description in
# the system prompt at session start and invokes them via its native `skill`
# tool, and its system prompt already documents its own tools (subagent
# profiles, todo tracking, question prompts), so there is no hook, injector,
# or tool-mapping scaffold to test. What IS Devin-specific is the manifest.
#
# Mirrors tests/kimi/test-plugin-manifest.sh. CI-safe: does not require
# `devin` installed.
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"

MANIFEST="$REPO_ROOT/.devin-plugin/plugin.json"

fail() { echo "FAIL: $*" >&2; exit 1; }

echo "test-devin-plugin: checking Devin CLI manifest"

# --- Manifest is valid and matches the repo version -------------------------
[ -f "$MANIFEST" ] || fail "manifest missing at $MANIFEST"

python3 - "$MANIFEST" <<'PY'
import json
import sys
from pathlib import Path

manifest_path = Path(sys.argv[1])
manifest = json.loads(manifest_path.read_text(encoding="utf-8"))
repo_root = manifest_path.parents[1]

if manifest.get("name") != "superpowers":
raise AssertionError(f"plugin name: expected 'superpowers', got {manifest.get('name')!r}")

package = json.loads((repo_root / "package.json").read_text(encoding="utf-8"))
if manifest.get("version") != package.get("version"):
raise AssertionError(
f"manifest version {manifest.get('version')!r} != package.json version {package.get('version')!r}"
)

# Devin CLI plugins carry skills only (auto-discovered from ./skills/); the
# manifest supports metadata + dependency lists, nothing executable.
unsupported = ["skills", "hooks", "commands", "sessionStart", "contextFileName", "inject"]
present = sorted(field for field in unsupported if field in manifest)
if present:
raise AssertionError("unsupported Devin manifest fields present: " + ", ".join(present))

version_config = json.loads((repo_root / ".version-bump.json").read_text(encoding="utf-8"))
entries = version_config.get("files")
if not isinstance(entries, list) or not any(
entry.get("path") == ".devin-plugin/plugin.json" and entry.get("field") == "version"
for entry in entries
if isinstance(entry, dict)
):
raise AssertionError(".version-bump.json must update .devin-plugin/plugin.json version")

print("Devin plugin manifest looks good")
PY

echo "PASS: Devin CLI plugin valid (manifest)"