diff --git a/.devin-plugin/plugin.json b/.devin-plugin/plugin.json new file mode 100644 index 00000000..5299cca8 --- /dev/null +++ b/.devin-plugin/plugin.json @@ -0,0 +1,22 @@ +{ + "name": "superpowers", + "version": "6.2.0", + "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" + ] +} diff --git a/.version-bump.json b/.version-bump.json index 8b9c6d99..8df0a977 100644 --- a/.version-bump.json +++ b/.version-bump.json @@ -5,6 +5,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" } diff --git a/README.md b/README.md index cab41fff..652819a9 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Superpowers is a complete software development methodology for your coding agent - [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) @@ -31,7 +32,7 @@ Superpowers is a complete software development methodology for your coding agent ## 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), [Grok Build CLI](#grok-build-cli), [Hermes Agent](#hermes-agent), [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), [Grok Build CLI](#grok-build-cli), [Hermes Agent](#hermes-agent), [Kimi Code](#kimi-code), [OpenCode](#opencode), [Pi](#pi). ## How it works @@ -128,6 +129,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: diff --git a/scripts/sync-to-codex-plugin.sh b/scripts/sync-to-codex-plugin.sh index ef8e0839..bdaa13a3 100755 --- a/scripts/sync-to-codex-plugin.sh +++ b/scripts/sync-to-codex-plugin.sh @@ -48,6 +48,7 @@ EXCLUDES=( "/.claude-plugin/" "/.codex/" "/.cursor-plugin/" + "/.devin-plugin/" "/.git/" "/.gitattributes" "/.github/" diff --git a/skills/using-superpowers/SKILL.md b/skills/using-superpowers/SKILL.md index 7ab2eb67..ec24a876 100644 --- a/skills/using-superpowers/SKILL.md +++ b/skills/using-superpowers/SKILL.md @@ -57,6 +57,7 @@ If your harness appears here, read its reference file for special instructions: - Pi: `references/pi-tools.md` - Antigravity: `references/antigravity-tools.md` - Hermes Agent: `references/hermes-tools.md` +- Devin CLI: `references/devin-tools.md` ## User Instructions diff --git a/skills/using-superpowers/references/devin-tools.md b/skills/using-superpowers/references/devin-tools.md new file mode 100644 index 00000000..dc40d633 --- /dev/null +++ b/skills/using-superpowers/references/devin-tools.md @@ -0,0 +1,18 @@ +# Devin CLI Tool Mapping + +Skills speak in actions ("dispatch a subagent", "create a todo", "read a file"). On Devin CLI these resolve to the tools below. + +| Action skills request | Devin CLI equivalent | +| --- | --- | +| Invoke a skill | The native `skill` tool (skills also appear as `/superpowers:` slash commands) | +| Dispatch a subagent (`Subagent (general-purpose):` template) | `run_subagent` with the `subagent_general` profile; use `subagent_explore` for read-only exploration | +| Task tracking ("create a todo", "mark complete") | `todo_write` | +| Ask the user / present options | `ask_user_question` (native multiple-choice prompts; fall back to plain text in non-interactive mode) | + +## Subagents + +`run_subagent` subagents are stateless and cannot ask clarifying questions — front-load the full context and exact instructions in the task prompt, as the subagent-driven-development templates already do. Run independent tasks in parallel with `is_background: true`; keep dependent tasks sequential. + +## File, shell, and search tools + +Devin CLI exposes native tools for reading, writing, and editing files, running shell commands, and searching (grep/glob). Exact tool names can vary by session mode — use whichever file/shell/search tools your session exposes rather than names remembered from another harness. diff --git a/tests/devin/test-devin-plugin.sh b/tests/devin/test-devin-plugin.sh new file mode 100755 index 00000000..312990d7 --- /dev/null +++ b/tests/devin/test-devin-plugin.sh @@ -0,0 +1,85 @@ +#!/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, so there is no hook or injector scaffold to test. What IS Devin-specific +# is the manifest and the tool mapping — subagent dispatch via run_subagent +# profiles and task tracking via todo_write — and SKILL.md pointing at it. +# +# Mirrors tests/kimi/test-plugin-manifest.sh (manifest) and +# tests/antigravity/test-antigravity-tools.sh (mapping). 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" +MAPPING="$REPO_ROOT/skills/using-superpowers/references/devin-tools.md" +SKILL="$REPO_ROOT/skills/using-superpowers/SKILL.md" + +fail() { echo "FAIL: $*" >&2; exit 1; } + +echo "test-devin-plugin: checking Devin CLI manifest and tool mapping" + +# --- 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 + +# --- Mapping exists ---------------------------------------------------------- +[ -f "$MAPPING" ] || fail "tool mapping missing at $MAPPING" + +# --- Core action→tool mappings are documented -------------------------------- +for tool in skill run_subagent todo_write ask_user_question; do + grep -q "$tool" "$MAPPING" \ + || fail "mapping does not document the '$tool' tool" +done + +# --- Subagents use the built-in profiles -------------------------------------- +grep -q 'subagent_general' "$MAPPING" \ + || fail "mapping does not document the 'subagent_general' profile" +grep -q 'subagent_explore' "$MAPPING" \ + || fail "mapping does not document the 'subagent_explore' profile" + +# --- SKILL.md Platform Adaptation links the mapping --------------------------- +grep -q "devin-tools.md" "$SKILL" \ + || fail "SKILL.md Platform Adaptation does not reference devin-tools.md" + +echo "PASS: Devin CLI plugin valid (manifest, tool mapping, SKILL.md link)"