mirror of
https://github.com/obra/superpowers
synced 2026-07-15 23:24:29 +00:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 67714e036c | |||
| 75ef64f3df | |||
| 0aff5d6c64 | |||
| 12960fbaf7 | |||
| 10f4868e4d | |||
| 2e039d0229 | |||
| 3adac24a6c | |||
| 232993b395 | |||
| dee15bcb9e | |||
| 447edeea29 | |||
| 880b9b84d5 | |||
| 37d9a63d45 |
@@ -784,10 +784,10 @@ Use this as the live index; when in doubt, read the files, not this table.
|
|||||||
|
|
||||||
| Harness | Entry point | Bootstrap mechanism | Tool mapping | Tests | Distribution |
|
| Harness | Entry point | Bootstrap mechanism | Tool mapping | Tests | Distribution |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| Claude Code | `.claude-plugin/plugin.json` + `hooks/hooks.json` | shell hook → `hooks/session-start` (`hookSpecificOutput.additionalContext`) | native `Skill` tool; no adapter file needed | `tests/hooks/` | marketplace |
|
| Claude Code | `.claude-plugin/plugin.json` + `hooks/hooks.json` | shell hook → `hooks/session-start` (`hookSpecificOutput.additionalContext`) | native `Skill` tool; `references/claude-code-tools.md` | `tests/hooks/` | marketplace |
|
||||||
| Codex | `.codex-plugin/plugin.json` (declares empty `hooks`) | native skill discovery (no session-start hook) | `references/codex-tools.md` | `tests/codex/`, `tests/codex-plugin-sync/` | fork sync (`scripts/sync-to-codex-plugin.sh`) |
|
| Codex | `.codex-plugin/plugin.json` (declares empty `hooks`) | native skill discovery (no session-start hook) | `references/codex-tools.md` | `tests/codex/`, `tests/codex-plugin-sync/` | fork sync (`scripts/sync-to-codex-plugin.sh`) |
|
||||||
| Cursor | `.cursor-plugin/plugin.json` + `hooks/hooks-cursor.json` | shell hook → `hooks/session-start` (`additional_context`) | none needed (Claude Code–compatible tool surface) | `tests/hooks/` | hand-authored |
|
| Cursor | `.cursor-plugin/plugin.json` + `hooks/hooks-cursor.json` | shell hook → `hooks/session-start` (`additional_context`) | `references/claude-code-tools.md` | `tests/hooks/` | hand-authored |
|
||||||
| Copilot CLI | (shares Claude Code hook path; `COPILOT_CLI` env) | shell hook → `hooks/session-start` (`additionalContext`) | none needed (Claude Code–compatible tool surface) | `tests/hooks/` | — |
|
| Copilot CLI | (shares Claude Code hook path; `COPILOT_CLI` env) | shell hook → `hooks/session-start` (`additionalContext`) | `references/copilot-tools.md` | `tests/hooks/` | — |
|
||||||
| Gemini CLI | `gemini-extension.json` + `GEMINI.md` | instructions file `@`-includes bootstrap + mapping | `references/gemini-tools.md` | — | `gemini extensions install` |
|
| Gemini CLI | `gemini-extension.json` + `GEMINI.md` | instructions file `@`-includes bootstrap + mapping | `references/gemini-tools.md` | — | `gemini extensions install` |
|
||||||
| Kimi Code | `.kimi-plugin/plugin.json` | manifest `sessionStart.skill` loads `using-superpowers` | inline `skillInstructions` in manifest | `tests/kimi/` | marketplace or `/plugins install` GitHub URL |
|
| Kimi Code | `.kimi-plugin/plugin.json` | manifest `sessionStart.skill` loads `using-superpowers` | inline `skillInstructions` in manifest | `tests/kimi/` | marketplace or `/plugins install` GitHub URL |
|
||||||
| OpenCode | `.opencode/plugins/superpowers.js` (declared via root `package.json` `main`) | in-process: `config` hook registers skills dir; `experimental.chat.messages.transform` injects user message | inline in `superpowers.js` | `tests/opencode/` | `opencode.json` plugin git URL |
|
| OpenCode | `.opencode/plugins/superpowers.js` (declared via root `package.json` `main`) | in-process: `config` hook registers skills dir; `experimental.chat.messages.transform` injects user message | inline in `superpowers.js` | `tests/opencode/` | `opencode.json` plugin git URL |
|
||||||
|
|||||||
@@ -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 your runtime's skills directory** (`~/.claude/skills/` on Claude Code) — see [codex-tools.md](../using-superpowers/references/codex-tools.md) or [gemini-tools.md](../using-superpowers/references/gemini-tools.md) for the path on those runtimes. Codex, Copilot CLI, and Gemini CLI all also recognize `~/.agents/skills/` as a cross-runtime alias.
|
**Personal skills live in your runtime's skills directory** — see [claude-code-tools.md](../using-superpowers/references/claude-code-tools.md), [codex-tools.md](../using-superpowers/references/codex-tools.md), [copilot-tools.md](../using-superpowers/references/copilot-tools.md), or [gemini-tools.md](../using-superpowers/references/gemini-tools.md) for the path on your runtime. Codex, Copilot CLI, and Gemini CLI all also recognize `~/.agents/skills/` as a cross-runtime alias.
|
||||||
|
|
||||||
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).
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,8 @@
|
|||||||
# Validate the Antigravity (agy) integration. agy installs the existing plugin
|
# Validate the Antigravity (agy) integration. agy installs the existing plugin
|
||||||
# directly (`agy plugin install <repo-url>`): it loads the bundled skills and
|
# directly (`agy plugin install <repo-url>`): it loads the bundled skills and
|
||||||
# runs the SessionStart hook for bootstrap, so there is no agy-specific scaffold
|
# runs the SessionStart hook for bootstrap, so there is no agy-specific scaffold
|
||||||
# to test. What IS agy-specific is the tool mapping — subagent dispatch via
|
# to test. What IS agy-specific is the tool mapping — agy has no `Skill` tool and
|
||||||
# invoke_subagent (self/research types) and task tracking via a task artifact —
|
# loads skills by reading SKILL.md with view_file — and SKILL.md pointing at it.
|
||||||
# and SKILL.md pointing at it.
|
|
||||||
#
|
#
|
||||||
# Mirrors tests/pi/test-pi-extension.mjs's "tools reference documents
|
# Mirrors tests/pi/test-pi-extension.mjs's "tools reference documents
|
||||||
# harness-specific mappings" check. CI-safe: does not require `agy` installed.
|
# harness-specific mappings" check. CI-safe: does not require `agy` installed.
|
||||||
@@ -23,8 +22,16 @@ echo "test-antigravity-tools: checking Antigravity tool mapping"
|
|||||||
# --- Mapping exists ---------------------------------------------------------
|
# --- Mapping exists ---------------------------------------------------------
|
||||||
[ -f "$MAPPING" ] || fail "tool mapping missing at $MAPPING"
|
[ -f "$MAPPING" ] || fail "tool mapping missing at $MAPPING"
|
||||||
|
|
||||||
|
# --- Skill-load mechanism: view_file on SKILL.md (IsSkillFile), no Skill tool -
|
||||||
|
grep -qiE "view_file" "$MAPPING" \
|
||||||
|
|| fail "mapping does not document view_file as the file/skill-read tool"
|
||||||
|
grep -qiE "SKILL\.md" "$MAPPING" \
|
||||||
|
|| fail "mapping does not document reading SKILL.md as the skill-load path"
|
||||||
|
grep -q "IsSkillFile" "$MAPPING" \
|
||||||
|
|| fail "mapping does not document setting IsSkillFile when loading a skill"
|
||||||
|
|
||||||
# --- Core action→tool mappings are documented -------------------------------
|
# --- Core action→tool mappings are documented -------------------------------
|
||||||
for tool in write_to_file replace_file_content invoke_subagent; do
|
for tool in write_to_file replace_file_content run_command grep_search invoke_subagent; do
|
||||||
grep -q "$tool" "$MAPPING" \
|
grep -q "$tool" "$MAPPING" \
|
||||||
|| fail "mapping does not document the '$tool' tool"
|
|| fail "mapping does not document the '$tool' tool"
|
||||||
done
|
done
|
||||||
@@ -43,4 +50,4 @@ grep -qE 'ArtifactType.*task|task. artifact' "$MAPPING" \
|
|||||||
grep -q "antigravity-tools.md" "$SKILL" \
|
grep -q "antigravity-tools.md" "$SKILL" \
|
||||||
|| fail "SKILL.md Platform Adaptation does not reference antigravity-tools.md"
|
|| fail "SKILL.md Platform Adaptation does not reference antigravity-tools.md"
|
||||||
|
|
||||||
echo "PASS: Antigravity tool mapping valid (subagent dispatch, task artifact, SKILL.md link)"
|
echo "PASS: Antigravity tool mapping valid (view_file skill-load, agy tools, SKILL.md link)"
|
||||||
|
|||||||
@@ -122,16 +122,7 @@ test('pi tools reference documents pi-specific mappings', async () => {
|
|||||||
assert.equal(existsSync(piToolsPath), true, 'pi-tools.md should exist');
|
assert.equal(existsSync(piToolsPath), true, 'pi-tools.md should exist');
|
||||||
const text = await readFile(piToolsPath, 'utf8');
|
const text = await readFile(piToolsPath, 'utf8');
|
||||||
|
|
||||||
// Assert against the mapping-table rows only. The surrounding prose mentions
|
for (const expected of ['Skill', 'Task', 'TodoWrite', 'read', 'write', 'edit', 'bash']) {
|
||||||
// these same tokens, so matching the whole file would still pass if the table
|
assert.match(text, new RegExp(expected));
|
||||||
// were deleted — the exact regression this test exists to catch.
|
}
|
||||||
const rows = text.split('\n').filter((line) => line.startsWith('|'));
|
|
||||||
assert.ok(
|
|
||||||
rows.some((row) => /subagent/i.test(row)),
|
|
||||||
'mapping table documents subagent dispatch',
|
|
||||||
);
|
|
||||||
assert.ok(
|
|
||||||
rows.some((row) => /todo|task/i.test(row)),
|
|
||||||
'mapping table documents task tracking',
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user