Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "superloopy",
"source": "./",
"description": "Strict evidence loop harness: repo-local loop state, success criteria, append-only ledgers, evidence-gated completion, plus skills (loop, research, frontend, clone) and a read-only/worker crew. Works on Claude Code and Codex from one repo.",
"version": "0.12.2",
"version": "0.12.3",
"license": "MIT",
"keywords": [
"claude-code",
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "superloopy",
"version": "0.12.2",
"version": "0.12.3",
"description": "Lightweight loop harness with strict evidence gates — Claude Code edition.",
"homepage": "https://github.com/beefiker/superloopy#readme",
"repository": "https://github.com/beefiker/superloopy",
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "superloopy",
"version": "0.12.2",
"version": "0.12.3",
"description": "Lightweight loop harness with strict evidence gates.",
"homepage": "https://github.com/beefiker/superloopy#readme",
"repository": "https://github.com/beefiker/superloopy",
Expand Down
2 changes: 2 additions & 0 deletions .codex/agents/nami.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ description = "Read-only codebase navigator for Superloopy subagent-driven work.
model = "gpt-5.6-luna"
model_reasoning_effort = "low"
service_tier = "fast"
sandbox_mode = "read-only"
approval_policy = "never"
developer_instructions = """
You are nami, a read-only codebase navigator for Superloopy. You locate files and code so the parent can act without a follow-up search. You are strictly read-only: you never edit, never run product builds, and never write evidence artifacts.

Expand Down
13 changes: 9 additions & 4 deletions README.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,15 +167,15 @@ Las instalaciones desde checkout no están gestionadas por `npx`. El self-update

### Claude Code

Actualiza el marketplace, reinstala para resolver la versión nueva y luego recarga; no hace falta reiniciar:
Actualiza el marketplace, actualiza el plugin instalado y luego recarga; no hace falta reiniciar:

```
/plugin marketplace update beefiker
/plugin install superloopy@beefiker
/plugin update superloopy@beefiker
/reload-plugins
```

No hay un comando `/plugin update` aparte: reinstalar desde el marketplace actualizado resuelve la versión nueva, y `/reload-plugins` la aplica en la sesión actual (sin reiniciar Claude Code, y los hooks no necesitan volver a aprobarse). Verifica con `node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json`. Si cargaste un checkout con `--plugin-dir`, basta con `git pull --ff-only` y ejecutar `/reload-plugins`.
`/plugin update` resuelve la versión nueva desde el marketplace actualizado, y `/reload-plugins` la aplica en la sesión actual (sin reiniciar Claude Code, y los hooks no necesitan volver a aprobarse). Verifica con `node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json`. Si cargaste un checkout con `--plugin-dir`, basta con `git pull --ff-only` y ejecutar `/reload-plugins`.

## Solución de problemas

Expand Down Expand Up @@ -203,11 +203,16 @@ codex plugin marketplace remove beefiker

Reinicia Codex después de desinstalar. Limpieza opcional del bootstrap local: eliminar el plugin cubre la config y cache de plugins de Codex, pero el wrapper `superloopy` y los agents personales copiados pueden quedar. Revísalos antes de borrarlos, sobre todo si personalizaste algún archivo de agent.

```
```sh
rm -f ~/.local/bin/superloopy
rm -f ~/.codex/agents/franky.toml ~/.codex/agents/zoro.toml ~/.codex/agents/usopp.toml ~/.codex/agents/jinbe.toml ~/.codex/agents/robin.toml ~/.codex/agents/nami.toml
```

```powershell
Remove-Item "$env:APPDATA\npm\superloopy.cmd" -ErrorAction SilentlyContinue
Remove-Item "$env:USERPROFILE\.codex\agents\franky.toml", "$env:USERPROFILE\.codex\agents\zoro.toml", "$env:USERPROFILE\.codex\agents\usopp.toml", "$env:USERPROFILE\.codex\agents\jinbe.toml", "$env:USERPROFILE\.codex\agents\robin.toml", "$env:USERPROFILE\.codex\agents\nami.toml" -ErrorAction SilentlyContinue
```

Si instalaste con `CODEX_HOME`, `SUPERLOOPY_BIN_DIR` o `CODEX_LOCAL_BIN_DIR`, limpia esas rutas configuradas.

### Claude Code
Expand Down
13 changes: 9 additions & 4 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,15 +167,15 @@ checkout インストールは `npx` 管理ではありません。`npx` self-up

### Claude Code

marketplace を更新し、新しいバージョンを解決するために再インストールしてから再読み込みします。再起動は不要です。
marketplace を更新し、インストール済みプラグインを更新してから再読み込みします。再起動は不要です。

```
/plugin marketplace update beefiker
/plugin install superloopy@beefiker
/plugin update superloopy@beefiker
/reload-plugins
```

別途 `/plugin update` コマンドはありません。更新済み marketplace から再インストールすると新しいバージョンが解決され、`/reload-plugins` が現在のセッションにそれを適用します(Claude Code の再起動は不要で、hooks の再承認も必要ありません)。`node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json` で確認してください。`--plugin-dir` で checkout を読み込んでいる場合は、`git pull --ff-only` を実行して `/reload-plugins` するだけです。
`/plugin update` が更新済み marketplace から新しいバージョンを解決し、`/reload-plugins` が現在のセッションにそれを適用します(Claude Code の再起動は不要で、hooks の再承認も必要ありません)。`node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json` で確認してください。`--plugin-dir` で checkout を読み込んでいる場合は、`git pull --ff-only` を実行して `/reload-plugins` するだけです。

## トラブルシューティング

Expand Down Expand Up @@ -203,11 +203,16 @@ codex plugin marketplace remove beefiker

アンインストール後に Codex を再起動してください。任意の local bootstrap cleanup: plugin の削除は Codex の plugin config と cache を扱いますが、`superloopy` wrapper と個人ディレクトリへコピーされた agents は残ることがあります。agent ファイルをカスタマイズしている場合は、削除前に確認してください。

```
```sh
rm -f ~/.local/bin/superloopy
rm -f ~/.codex/agents/franky.toml ~/.codex/agents/zoro.toml ~/.codex/agents/usopp.toml ~/.codex/agents/jinbe.toml ~/.codex/agents/robin.toml ~/.codex/agents/nami.toml
```

```powershell
Remove-Item "$env:APPDATA\npm\superloopy.cmd" -ErrorAction SilentlyContinue
Remove-Item "$env:USERPROFILE\.codex\agents\franky.toml", "$env:USERPROFILE\.codex\agents\zoro.toml", "$env:USERPROFILE\.codex\agents\usopp.toml", "$env:USERPROFILE\.codex\agents\jinbe.toml", "$env:USERPROFILE\.codex\agents\robin.toml", "$env:USERPROFILE\.codex\agents\nami.toml" -ErrorAction SilentlyContinue
```

`CODEX_HOME`、`SUPERLOOPY_BIN_DIR`、`CODEX_LOCAL_BIN_DIR` を使ってインストール先を変えた場合は、その設定先を削除してください。

### Claude Code
Expand Down
13 changes: 9 additions & 4 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,15 +179,15 @@ checkout 설치는 `npx` 관리 대상이 아닙니다. `npx` self-update는 안

### Claude Code

marketplace를 갱신하고, 새 버전을 받도록 다시 설치한 뒤 리로드하세요. 재시작은 필요 없습니다.
marketplace를 갱신하고, 설치된 플러그인을 업데이트한 뒤 리로드하세요. 재시작은 필요 없습니다.

```
/plugin marketplace update beefiker
/plugin install superloopy@beefiker
/plugin update superloopy@beefiker
/reload-plugins
```

별도의 `/plugin update` 명령은 없습니다. 갱신된 marketplace에서 다시 설치하면 새 버전이 잡히고, `/reload-plugins`가 현재 세션에 적용합니다(Claude Code 재시작이 필요 없고, hooks도 다시 승인할 필요가 없습니다). 확인은 `node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json`으로 합니다. `--plugin-dir`로 checkout을 로드했다면 `git pull --ff-only` 후 `/reload-plugins`만 하면 됩니다.
`/plugin update`갱신된 marketplace에서 새 버전을 받고, `/reload-plugins`가 현재 세션에 적용합니다(Claude Code 재시작이 필요 없고, hooks도 다시 승인할 필요가 없습니다). 확인은 `node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json`으로 합니다. `--plugin-dir`로 checkout을 로드했다면 `git pull --ff-only` 후 `/reload-plugins`만 하면 됩니다.

## 트러블슈팅

Expand Down Expand Up @@ -215,11 +215,16 @@ codex plugin marketplace remove beefiker

제거 뒤 Codex를 재시작하세요. 선택적 local bootstrap cleanup: plugin 제거는 Codex의 plugin config와 cache를 지우지만, `superloopy` wrapper와 개인 agents 사본은 남을 수 있습니다. agent 파일을 수정한 적이 있다면 지우기 전에 꼭 확인하세요.

```
```sh
rm -f ~/.local/bin/superloopy
rm -f ~/.codex/agents/franky.toml ~/.codex/agents/zoro.toml ~/.codex/agents/usopp.toml ~/.codex/agents/jinbe.toml ~/.codex/agents/robin.toml ~/.codex/agents/nami.toml
```

```powershell
Remove-Item "$env:APPDATA\npm\superloopy.cmd" -ErrorAction SilentlyContinue
Remove-Item "$env:USERPROFILE\.codex\agents\franky.toml", "$env:USERPROFILE\.codex\agents\zoro.toml", "$env:USERPROFILE\.codex\agents\usopp.toml", "$env:USERPROFILE\.codex\agents\jinbe.toml", "$env:USERPROFILE\.codex\agents\robin.toml", "$env:USERPROFILE\.codex\agents\nami.toml" -ErrorAction SilentlyContinue
```

`CODEX_HOME`, `SUPERLOOPY_BIN_DIR`, `CODEX_LOCAL_BIN_DIR`로 설치 위치를 바꿨다면 그 경로를 정리하세요.

### Claude Code
Expand Down
14 changes: 9 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,15 +187,15 @@ Checkout installs are not `npx`-managed. `npx` self-update is reserved for a fut

### Claude Code

Refresh the marketplace, reinstall to resolve the new version, then reload — no restart needed:
Refresh the marketplace, update the installed plugin, then reload — no restart needed:

```
/plugin marketplace update beefiker
/plugin install superloopy@beefiker
/plugin update superloopy@beefiker
/reload-plugins
```

There is no separate `/plugin update` command: reinstalling from the refreshed marketplace resolves the new version, and `/reload-plugins` applies it in the current session (no Claude Code restart, and hooks do not need re-approval). Verify with `node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json`. If you loaded a checkout with `--plugin-dir`, just `git pull --ff-only` and run `/reload-plugins`.
`/plugin update` resolves the new version from the refreshed marketplace, and `/reload-plugins` applies it in the current session (no Claude Code restart, and hooks do not need re-approval). Verify with `node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json`. If you loaded a checkout with `--plugin-dir`, just `git pull --ff-only` and run `/reload-plugins`.

## Troubleshooting

Expand Down Expand Up @@ -223,12 +223,16 @@ codex plugin marketplace remove beefiker

Restart Codex after uninstalling. Optional local bootstrap cleanup: plugin removal handles Codex's plugin config and cache, but the `superloopy` wrapper and copied personal agents can remain. Review before deleting them, especially if you customized any agent file.

```
```sh
rm -f ~/.local/bin/superloopy
Remove-Item "$env:APPDATA\npm\superloopy.cmd" -ErrorAction SilentlyContinue
rm -f ~/.codex/agents/franky.toml ~/.codex/agents/zoro.toml ~/.codex/agents/usopp.toml ~/.codex/agents/jinbe.toml ~/.codex/agents/robin.toml ~/.codex/agents/nami.toml
```

```powershell
Remove-Item "$env:APPDATA\npm\superloopy.cmd" -ErrorAction SilentlyContinue
Remove-Item "$env:USERPROFILE\.codex\agents\franky.toml", "$env:USERPROFILE\.codex\agents\zoro.toml", "$env:USERPROFILE\.codex\agents\usopp.toml", "$env:USERPROFILE\.codex\agents\jinbe.toml", "$env:USERPROFILE\.codex\agents\robin.toml", "$env:USERPROFILE\.codex\agents\nami.toml" -ErrorAction SilentlyContinue
```

If you installed with `CODEX_HOME`, `SUPERLOOPY_BIN_DIR`, or `CODEX_LOCAL_BIN_DIR`, clean up those configured paths instead.

### Claude Code
Expand Down
13 changes: 9 additions & 4 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,15 +167,15 @@ checkout 安装不是 `npx` 管理的。`npx` self-update 只会在未来有稳

### Claude Code

刷新 marketplace,重新安装以解析新版本,然后重新加载——无需重启:
刷新 marketplace,更新已安装的插件,然后重新加载——无需重启:

```
/plugin marketplace update beefiker
/plugin install superloopy@beefiker
/plugin update superloopy@beefiker
/reload-plugins
```

没有单独的 `/plugin update` 命令:从已刷新的 marketplace 重新安装即可解析出新版本,`/reload-plugins` 会在当前会话中应用它(无需重启 Claude Code,hooks 也不需要重新批准)。用 `node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json` 验证。如果你用 `--plugin-dir` 加载了一个 checkout,只需 `git pull --ff-only` 再运行 `/reload-plugins`。
`/plugin update` 会从已刷新的 marketplace 解析新版本,`/reload-plugins` 会在当前会话中应用它(无需重启 Claude Code,hooks 也不需要重新批准)。用 `node "${CLAUDE_PLUGIN_ROOT}/src/cli.js" doctor --json` 验证。如果你用 `--plugin-dir` 加载了一个 checkout,只需 `git pull --ff-only` 再运行 `/reload-plugins`。

## 故障排除

Expand Down Expand Up @@ -203,11 +203,16 @@ codex plugin marketplace remove beefiker

卸载后重启 Codex。可选的 local bootstrap cleanup:plugin 删除会移除 Codex 的 plugin config 和 cache,但 `superloopy` wrapper 以及复制到个人目录的 agents 可能会保留。删除前请先检查,尤其是你修改过 agent 文件时。

```
```sh
rm -f ~/.local/bin/superloopy
rm -f ~/.codex/agents/franky.toml ~/.codex/agents/zoro.toml ~/.codex/agents/usopp.toml ~/.codex/agents/jinbe.toml ~/.codex/agents/robin.toml ~/.codex/agents/nami.toml
```

```powershell
Remove-Item "$env:APPDATA\npm\superloopy.cmd" -ErrorAction SilentlyContinue
Remove-Item "$env:USERPROFILE\.codex\agents\franky.toml", "$env:USERPROFILE\.codex\agents\zoro.toml", "$env:USERPROFILE\.codex\agents\usopp.toml", "$env:USERPROFILE\.codex\agents\jinbe.toml", "$env:USERPROFILE\.codex\agents\robin.toml", "$env:USERPROFILE\.codex\agents\nami.toml" -ErrorAction SilentlyContinue
```

如果安装时使用了 `CODEX_HOME`、`SUPERLOOPY_BIN_DIR` 或 `CODEX_LOCAL_BIN_DIR`,请清理对应路径。

### Claude Code
Expand Down
4 changes: 2 additions & 2 deletions docs/superloopy-claude-validation.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Then dispatch any subagent (e.g. start a `loopy team` task that spawns `franky`,
- [ ] Functional check: have a worker end with `SUPERLOOPY_EVIDENCE: <path-under-evidence-root>`. Expect the SubagentStop hook to **accept silently** (no "evidence receipt missing" re-prompt). A worker that omits the receipt should be re-prompted (up to 3 attempts).

### Linchpin B — agent_type namespacing
- [ ] Is `agent_type` `franky` or `superloopy:franky`? Either is fine — the matcher `(?:superloopy:)?(?:franky|…)` and `normalizeAgentType()` handle both. Confirm the worker hook actually fired for the dispatched role (and the `robin` auditor routes to `subagent-stop-audit`).
- [ ] Is `agent_type` exactly `superloopy:franky`? Claude's worker matcher is `^superloopy:(?:franky|zoro|usopp|jinbe|nami)$`; bare or foreign-namespaced identities must not satisfy it. Confirm the worker hook actually fired for the dispatched role and exact `superloopy:robin` routes to `subagent-stop-audit`.

## 3. Linchpin C — plugin env vars reach the hook subprocess

Expand Down Expand Up @@ -65,7 +65,7 @@ End-to-end live run on real Claude Code (2026-07-01), hardened build loaded via
| --- | --- | --- | --- | --- |
| Install + components | superloopy + 6 agents + skills load | Plugin loaded from the checkout via `--plugin-dir`; 6 namespaced agents dispatchable (dispatched `superloopy:franky` ×2 and `superloopy:nami` live); skills present; `doctor` from the plugin root `ok:true`, 16 checks incl. `claudeHostWiring`/`claudeModelPolicy`. | ✅ | `doctor` audits its cwd — running it from an empty dir reports `ok:false`; run it from the plugin root. |
| A: receipt field | valid receipt accepted silently; missing receipt re-prompted (≤3), transcript fallback recovers path | **Live 3-way contrast:** `franky` w/ valid `SUPERLOOPY_EVIDENCE:` + real artifact → **0 re-prompts (silent accept)**; `franky` told to omit the receipt → **re-prompted once** (`"Attempt 1 of 3"` injected by the hook), then wrote a real artifact + emitted the receipt; `nami` (excluded set) → 0 re-prompts. Deterministic replay of the real `franky` message: valid→empty accept, receipt-stripped→`decision:block`, receipt-for-nonexistent-file→`decision:block` (validates artifact existence, not just the string). | ✅ | Raw `last_assistant_message` not re-captured (mid-session observation hook didn't hot-reload); a prior session confirmed the direct field present. The live re-prompt/accept contrast proves recovery works on the real Claude payload regardless. |
| B: agent_type | matcher fires (bare or namespaced) | Live dispatches carried `agent_type` `superloopy:franky`/`superloopy:nami`. Anchored matcher `^(?:superloopy:)?(?:franky\|zoro\|usopp\|jinbe\|nami)$` matches namespaced **and** bare; `normalizeAgentType` → `franky`/`nami`; `robin`/`superloopy:robin` route to the separate audit matcher; `frankyx`/`superloopy:otherthing` correctly rejected. `nami` is outside the evidence-receipt set → silent no-op (correct for the read-only navigator). | ✅ | — |
| B: agent_type | exact namespaced matcher fires | Live dispatches carried `agent_type` `superloopy:franky`/`superloopy:nami`. The hardened contract now matches exact host-owned identities: Claude workers use `^superloopy:(?:franky\|zoro\|usopp\|jinbe\|nami)$`, the auditor uses exact `superloopy:robin`, and bare or foreign-namespaced identities are rejected. `nami` is outside the evidence-receipt set → silent no-op (correct for the read-only navigator). | ✅ | — |
| C: env vars | Stop continuation while criteria remain + auto-context toggle | Exercised as subprocesses with the exact env Claude injects (`CLAUDE_PLUGIN_ROOT` set ⇒ host=claude; settings `env`): `Stop`+`SUPERLOOPY_STOP_HOOK=on`, criteria remaining → `decision:block` (continue) + `loop_iteration` recorded; unset → empty (inert). `SessionStart`/`UserPromptSubmit`+`SUPERLOOPY_AUTO_CONTEXT=on` → inject "Superloopy context"; unset → empty. Post-completion `Stop` → empty and `loop-control.json` cleared (engine terminates cleanly). | ✅ | Full end-to-end (settings.json `env` + restart) not run — no restart available this session. `settings.json` `env` is the toggle location and takes effect on next session start. |
| D: steering JSON | directive applied, no parse error | `SUPERLOOPY_STEER: {"kind":"annotate",…}` → hook emitted **valid JSON** (keys `ok,kind,plan,summary,guide`), **no parse error**; the annotation landed durably in the ledger (`steering_annotated` with the exact `evidence`/`rationale`). | ✅ | The annotate envelope is not Claude's `hookSpecificOutput.additionalContext` shape, so Claude ignores its display fields (no error / no rejection) — the recorded annotation is the applied, degrade-safe effect. |
| Full loop | gated begin→prove→check→finish | Ran `begin → prove(C001) → prove(C002) → check → finish` on the hardened build. `finish` refused at 0/2 proven (*"unresolved criteria: G001/C001, G001/C002"*) and at 1/2 (*"…G001/C002"*); completed only after both command-backed criteria passed — wrote a valid `gate.json` (`status:passed`, 2 artifacts) and set `aggregateComplete:true`. `finish` re-derived both criteria (audit `*-rerun.txt`). | ✅ | — |
Expand Down
Loading
Loading