Compare commits

..

1 Commits

Author SHA1 Message Date
Jesse Vincent
e6a4316e11 docs: document packaging a release for the Codex portal
The portal zip flow (scripts/package-codex-plugin.sh) had no release
docs: how to seed the OpenAI-owned openai.yaml metadata source, build
the rootless archive from the release tag, verify it, and what breaks
when a release adds a new skill. Written after packaging v6.2.0.
2026-07-24 13:16:45 -07:00
3 changed files with 97 additions and 13 deletions

View File

@@ -3,6 +3,12 @@
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.
## We're Hiring!
We're hiring someone to help out full time with Superpowers community and code work.
You can read about the job at https://primeradiant.com/jobs/superpowers-community-engineer/
If this sounds like someone you know, definitely send them our way.
## Quickstart ## 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), [Factory Droid](#factory-droid), [Gemini CLI](#gemini-cli), [GitHub Copilot CLI](#github-copilot-cli), [Kimi Code](#kimi-code), [OpenCode](#opencode), [Pi](#pi).

View File

@@ -0,0 +1,85 @@
# Releasing to the Codex portal
How to package a Superpowers release as the zip artifact OpenAI's Codex
plugin portal expects, and what to check before handing it over.
This is distinct from the older flow of syncing files into a fork of
`openai/plugins` and opening a PR, which
`scripts/sync-to-codex-plugin.sh` still implements — see the distribution
table in [porting-to-a-new-harness.md](porting-to-a-new-harness.md). The portal
artifact is a standalone, rootless archive: `.codex-plugin/`, `assets/`,
`skills/`, `README.md`, `LICENSE`, and `CODE_OF_CONDUCT.md` sit at the
archive root. Hooks, tests, docs, scripts, and other harnesses' manifests
are deliberately not shipped.
## Prerequisite: the OpenAI metadata source
Each packaged skill must carry `skills/<name>/agents/openai.yaml`. That
metadata is OpenAI-owned — it does not live in this repo — so the packaging
script seeds it from a prior official package. By default it looks for, in
order:
1. `../_tmp/sup-codex-packaging/superpowers/` (an unpacked package)
2. `../_tmp/sup-codex-packaging/superpowers.zip`
3. `../_tmp/sup-codex-packaging/superpowers.tar.gz`
or pass `--metadata-source <dir|.zip|.tar.gz>` explicitly.
If you have no prior package on disk, extract one from `openai/plugins`
(the upstream repo still carries the plugin, including the metadata):
```bash
# from a clone with an `upstream` remote pointing at github.com/openai/plugins
git fetch upstream
mkdir -p ../_tmp/sup-codex-packaging/superpowers
git archive upstream/main -- plugins/superpowers |
tar -x --strip-components 2 -C ../_tmp/sup-codex-packaging/superpowers
```
**New skills fail the build.** The script requires one `openai.yaml` per
skill directory; otherwise it prints `Missing OpenAI agent metadata for
skill: <name>` for each gap and dies with `metadata source is incomplete`.
If a release adds a skill, there is no metadata for it yet;
you need an updated official package (or metadata added upstream in
`openai/plugins`) before you can package. Don't hand-invent the yaml.
## Build the archive
From a clean working tree, package the release tag:
```bash
scripts/package-codex-plugin.sh --ref vX.X.X
```
The script reads the version from `.codex-plugin/plugin.json` (bumped by
`scripts/bump-version.sh`, so it matches the release tag), stages the tree
from the git ref — never from the working copy — and writes
`../_tmp/sup-codex-packaging/superpowers-VERSION.zip`, printing entry
count, skill count, and a SHA-256. Timestamps and file order are pinned so
rebuilding the same ref reproduces the same archive.
Useful flags: `--output PATH`, `--format zip|tar.gz`, `--allow-dirty`
(archive still comes from `--ref`), `--keep-stage` (inspect the staging
dir). `--help` has the full list.
## Verify
The script already refuses archives containing source-only paths and
mismatched metadata counts. Sanity-check the result anyway:
```bash
unzip -Z1 ../_tmp/sup-codex-packaging/superpowers-X.X.X.zip | head
unzip -Z1 ../_tmp/sup-codex-packaging/superpowers-X.X.X.zip | grep -c 'agents/openai.yaml'
unzip -p ../_tmp/sup-codex-packaging/superpowers-X.X.X.zip .codex-plugin/plugin.json | jq -r .version
```
Expect: rootless top-level entries (`.codex-plugin/`, `assets/`,
`skills/`), one `openai.yaml` per skill, and the release version.
The script itself is covered by `tests/codex/test-package-codex-plugin.sh`.
## Upload
Upload the zip through OpenAI's Codex plugin portal. This is a manual step
outside this repo; record the SHA-256 the script printed so the uploaded
artifact can be matched to the build.

View File

@@ -142,24 +142,17 @@ a ledger file, not only in todos.
Read the plan once, note its context and Global Constraints, and create a Read the plan once, note its context and Global Constraints, and create a
todo per task. todo per task.
Before dispatching Task 1, scan the plan once for conflicts, writing down Before dispatching Task 1, scan the plan once for conflicts:
what you checked as you check it:
- tasks that contradict each other or the plan's Global Constraints - tasks that contradict each other or the plan's Global Constraints
- anything the plan explicitly mandates that the review rubric treats as a - anything the plan explicitly mandates that the review rubric treats as a
defect (a test that asserts nothing, verbatim duplication of a logic block) defect (a test that asserts nothing, verbatim duplication of a logic block)
The scan's output is a table, not a verdict. One row for every pair of tasks Present everything you find to your human partner as one batched question —
that share a file or an interface: the two tasks, what one produces against each finding beside the plan text that mandates it, asking which governs —
what the other consumes, and what you found. One row for every task: whether before execution begins, not one interrupt per discovery mid-plan. If the
its own text agrees with itself — the tests it specifies against the code it scan is clean, proceed without comment. The review loop remains the net for
specifies, the files it creates against the files it later touches. "The scan conflicts that only emerge from implementation.
is clean" without those rows is not a scan you ran.
Write the table to the ledger. Rule on each conflict it surfaces — the spec
is the binding authority, the plan is its argument — record the ruling beside
its row, and dispatch Task 1. The review loop remains the net for conflicts
that only emerge from implementation.
## Model Selection ## Model Selection