
Company News
Socket Joins New OpenJS Program to Fund Node.js Security Work
Socket is joining the OpenJS Security Stewardship Program to fund Node.js vulnerability research, maintainer remediation, and security releases.
session-orchestrator
Advanced tools
Loop engineering for AI coding agents — turn ad-hoc sessions into a repeatable research → plan → wave-execute → close loop with verification gates. Runs on Claude Code, Codex CLI, Cursor, and Pi.
Loop engineering for AI coding agents — turn ad-hoc sessions into a repeatable research → plan → wave-execute → close loop with verification gates. Runs on Claude Code, Codex CLI, Cursor IDE, and Pi, as a community plugin (MIT, community-maintained) for solo devs and small teams.
The same skills and commands are available on all four harnesses; enforcement depth differs — scope enforcement is full on Claude Code, bridged on Cursor and Pi, and currently unavailable on Codex CLI (see Platform support).
| Node.js | 24 or later (node --version) — package.json engines.node is >=24.0.0. The plugin is ES modules and needs a real Node runtime. Install Node.js. |
| A coding agent | Claude Code, Codex CLI, Cursor IDE, or Pi. This is a workflow layer on top of one of them, not a replacement. |
| Harness version | Codex CLI 0.144.4 or later (docs/codex-setup.md). No minimum is pinned for Claude Code, Cursor, or Pi — if /plugin (or the Cursor/Pi installer) runs, the plugin loads. |
| OS | macOS and Linux are first-class and run in CI (ubuntu-latest, macos-latest). Windows is not covered by CI and has not been tested natively — treat it as best-effort. The Node core is portable (paths via path.join, tmp via os.tmpdir()), but hooks/hooks.json invokes hook commands via sh (see line 14) and the optional MCP server (scripts/mcp-server.sh) is a Bash script that needs jq on PATH — both need WSL or Git Bash on Windows. |
| Git | A git repository. Session-orchestrator reads git state at every session start and commits at close. |
| Platform | Install |
|---|---|
| Claude Code | /plugin marketplace add Kanevry/session-orchestrator then /plugin install session-orchestrator@kanevry (run both inside Claude Code). |
| Codex CLI | git clone https://github.com/Kanevry/session-orchestrator.git ~/Projects/session-orchestrator && cd ~/Projects/session-orchestrator && npm install && node scripts/codex-install.mjs |
| Cursor IDE | git clone https://github.com/Kanevry/session-orchestrator.git ~/Projects/session-orchestrator && cd ~/Projects/session-orchestrator && npm install && node scripts/cursor-install.mjs /path/to/your/project |
| Pi | pi install npm:session-orchestrator — or dev-fallback: git clone https://github.com/Kanevry/session-orchestrator.git ~/Projects/session-orchestrator && cd ~/Projects/session-orchestrator && npm install && node scripts/pi-install.mjs /path/to/your/project --settings-only |
For Claude Code, also install Node dependencies once (hooks import zx) and restart Claude Code:
# Claude Code has no `plugin dir` subcommand, so resolve the install path from the cache.
SO_DIR="$(dirname "$(find ~/.claude/plugins/cache -path '*session-orchestrator*' -name package.json 2>/dev/null | head -1)")"
cd "$SO_DIR" && npm install
If SO_DIR comes back empty, the plugin is not installed from a marketplace — check /plugin list inside Claude Code first.
Setup guides: Codex · Cursor IDE · Pi. Per-IDE notes on CLAUDE.md vs AGENTS.md: instruction-file-resolution.
/plugin update session-orchestrator@kanevry # Claude Code
Restart the harness afterwards, and re-run npm install in the plugin directory when the release adds dependencies. On Codex CLI, Cursor, and Pi the upgrade is git pull in your clone followed by the same install script you originally ran.
Session-start tells you when the running copy is behind: scripts/lib/plugin-update-banner.mjs compares the version of the code that is actually loaded against the published npm version and warns in the session-start banner (minor or major; patch-only updates stay silent). It fails silent — offline, a non-2xx response, or a malformed answer produces no statement, never a false "up to date".
Upgrading across a major version: docs/migration-v4.md is the current one — v4.0.0 removes five skills, three commands and eight top-level scripts, each on a measured 90-day two-signal rule rather than a judgement call, and it names what replaces every removed invocation. docs/migration-v3.md documents the older v2 → v3 path and the shape both guides follow (what changes · prerequisites · per-platform steps · what stays · known issues · rollback).
Remove the plugin through your harness's own plugin manager — /plugin in Claude Code (marketplace entry session-orchestrator@kanevry), codex plugin remove on Codex CLI (docs/codex-setup.md). On Cursor and Pi, delete the files the installer wrote into your project.
What stays behind in your repo — none of it is removed by uninstalling, and all of it is plain text you can delete by hand:
.orchestrator/ — bootstrap.lock, metrics/ (your session and learning JSONL records), policy/, steering/, runtime/, peers/, session.lockSTATE.md under your harness's state directory (.claude/STATE.md on Claude Code — see Platform support)## Session Config block you added to CLAUDE.md / AGENTS.md.claude/rules/*.md if you vendored the rule library via /bootstrap --sync-rulesDeleting .orchestrator/metrics/ deletes your session history. Nothing is sent anywhere without your explicit consent (see Data & telemetry) — the one exception is the session-start update check (scripts/lib/plugin-update-banner.mjs): a single anonymous GET to the npm registry, at most once per day per repo, comparing your installed version against the latest release. Set SO_DISABLE_UPDATE_CHECK=1 (or DO_NOT_TRACK=1) to turn it off. Beyond that, there is nothing else to revoke.
1. Bootstrap the repo once. Run /bootstrap in your project — it scaffolds the minimum structure and writes .orchestrator/bootstrap.lock, which session-start requires before /session will run.
2. Declare a Session Config. Add a ## Session Config section to your project's CLAUDE.md (Claude Code, Cursor IDE) or AGENTS.md (Codex CLI, Pi) — see instruction-file-resolution for which file each platform reads. The smallest valid config is seven fields:
## Session Config
test-command: npm test
typecheck-command: npm run typecheck
lint-command: npm run lint
agents-per-wave: 6
waves: 5
persistence: true
enforcement: warn
Everything else is opt-in. Full template: docs/session-config-template.md. Canonical types and defaults: docs/session-config-reference.md.
3. What the first /session writes into your repo. Nothing outside these paths, all plain text, all local:
.orchestrator/bootstrap.lock # written by /bootstrap, the gate for every later run
.orchestrator/current-session.json # which session owns this working copy right now
.orchestrator/session.lock # heartbeat lock — stops two sessions colliding in one checkout
.orchestrator/host.json # host-local identity for peer-session detection
.orchestrator/metrics/*.jsonl # append-only session, learning, event and subagent records
.orchestrator/steering/ # stable product/tech/structure context injected each session
.claude/STATE.md # wave progress and deviations (harness-specific directory)
/session feature # research + Q&A — inspect git, issues, history, then agree on scope
/go # execute in five typed waves (fixed roles), with a quality gate between each
/close # verify every item, commit cleanly, file carryover issues for the rest
That is the whole loop. /plan and /evolve extend it, but you can start with just these three.
The rendered diagram above (assets/wave-lifecycle.svg) survives anywhere Markdown does. The Mermaid source below is the maintainable version of the same two flows:
flowchart TD
Z["/bootstrap"] -->|once per repo, writes bootstrap.lock| B["/session [type]"]
A["/plan [feature|retro]"] -->|optional, defines WHAT| B
B -->|research + Q&A| C["/go"]
C -->|5 waves with quality gates| D["/close"]
D -->|verifies + commits| E["/evolve [analyze]"]
E -->|extracts cross-session learnings| B
style Z fill:#475569,color:#fff
style C fill:#1f6feb,color:#fff
style D fill:#238636,color:#fff
flowchart LR
W1["1·Discovery<br/>read-only audit"] --> G1{Gate}
G1 --> W2["2·Impl-Core<br/>primary code"]
W2 --> G2{Gate}
G2 --> W3["3·Impl-Polish<br/>integration, edges"]
W3 --> G3{Gate}
G3 --> W4["4·Quality<br/>simplify + tests"]
W4 --> G4{Full Gate}
G4 --> W5["5·Finalization<br/>commit + close"]
style G4 fill:#d29922,color:#000
/plan is optional — you can create issues manually and jump straight to /session. /evolve runs deliberately after 5+ sessions, not automatically. Both diagrams show the happy path; a failing gate stops the wave and hands the findings back.
For sessions that outgrow five waves there is a named ultradeep profile: a profile over session-type: deep that runs seven waves — Research + Code-Discovery, a blocking coordinator Synthesis-Gate, Impl-Core, Impl-Polish, a read-only Review-Panel, Quality, Release — instead of a fourth session-type enum value. Downstream tooling still sees deep.
Most agentic-coding tools jump straight into writing code. Session Orchestrator adds a structured loop on top: research first, agree on scope, then execute in typed waves with verification gates between them.
When you type /session feature:
/go executes — agents work in parallel within a wave. A session-reviewer audits the output between waves on eight dimensions; only findings at confidence ≥ 80 reach you./close ships it — every planned item is verified, quality gates run full, and unfinished work becomes carryover issues. Files are staged individually, so parallel sessions can't stomp each other.Two complementary commands round out the loop: /plan runs before a session when you need a PRD or retrospective; /evolve runs occasionally to surface patterns across sessions and feed them back at the next start.
The system is markdown-driven config plus a thin Node runtime — skills, commands, and agents are Markdown with YAML frontmatter; scripts/lib/*.mjs and hooks/*.mjs handle dispatch, validation, and telemetry. Everything is plain text: if something goes wrong, you can read every file and see what happened.
Counts measured on 2026-09-06 with the command in brackets:
ls -d skills/*/ | grep -v _shared | wc -l)/session, /go, /close, /discovery, /plan, /grill, /evolve, /autopilot, /dispatcher, /reconcile, /eval, /test, /debug, …) (ls commands/*.md | wc -l)ls agents/*.md | wc -l)ls hooks/*.mjs | wc -l)ls .claude/rules/*.md | wc -l, ls docs/adr/*.md | wc -l)it()/test() definitions at that measurement, and the runtime total is higher because of parameterised blocks (methodology) (find tests -name '*.test.mjs' | wc -l)Portable across harnesses by construction. The repo ships a root AGENTS.md generated byte-identical from CLAUDE.md, a root plugin.json following the agent-plugins.org 1.0.0 schema, and a .agents/skills/<name>/SKILL.md mirror of all 43 skills carrying spec-legal frontmatter plus a pointer body. All three are generated by scripts/generate-agents-skills.mjs and drift-checked in scripts/validate-plugin.mjs — never hand-edited.
Full component inventory: docs/components.md. Version history and per-release detail: CHANGELOG.md.
STATE.md records wave progress and deviations; the next /session offers to resume from the last completed wave.STATE.md. A heartbeat session lock, peer-scope manifests, and the PSA rule set in .claude/rules/parallel-sessions.md exist for exactly that axis./evolve analyze extracts confidence-scored patterns you can read and prune. Nothing is hidden.How this compares to other orchestrators — with the parts that are measured and the parts that are not: docs/components.md § Comparisons.
v4.0.0 is the first release that REMOVES public surfaces, so read docs/migration-v4.md before upgrading. Highlights of the v4.0.0 line: less surface, an instruction layer that loads on demand, and three instruments that were reporting numbers nobody could reproduce:
skills/domain-model/ was merged into skills/architecture/ rather than dropped..claude/rules/ goes 61 → 26 files. Forty-three machine-generated learning files were consolidated into eight thematic ones, each keeping its provenance markers so the reconcile engine still dedupes on them.session-start, session-end and the wave loop keep every phase; the bodies move into per-phase files under references/, and the top-level file becomes an index that is heading-complete against the original. Nothing was summarised away.ultradeep is a profile over deep, not a fourth session type. Seven waves with a blocking synthesis gate and a read-only review panel. Downstream tooling still sees deep, which is why it costs about eight touchpoints instead of forty-eight.AGENTS.md, a root plugin.json and a portable .agents/skills/ mirror. The repo now speaks the cross-harness instruction conventions it documents, generated and validated rather than hand-maintained.Full list, with the evidence for each claim: CHANGELOG.md.
| Feature | Claude Code | Codex CLI | Cursor IDE | Pi |
|---|---|---|---|---|
| All 25 commands | Native slash commands | Native plugin commands | Native .cursor/commands slash commands | Prompt templates |
| Parallel agents | Agent tool | Multi-agent roles | Sequential only | Sequential (parallel planned) |
| Session persistence | .claude/STATE.md | .codex/STATE.md | .cursor/STATE.md | .pi/STATE.md |
| Scope enforcement | PreToolUse hooks | Unavailable — pending a real apply_patch adapter | preToolUse + beforeShellExecution via cursor-hook-bridge; afterFileEdit post-hoc | tool_call bridge |
| AskUserQuestion | Native tool | Numbered-list fallback | Numbered-list fallback | Numbered-list fallback |
| Quality gates | Full | Full | Full | Full |
All platforms share the same skills, commands, and scripts; hooks use platform-specific adapters and event subsets. Codex intentionally wires only its six supported project event slots and omits Claude-only events plus Edit/Write payload handlers until a real Codex apply_patch adapter exists, so scope enforcement is currently unavailable there. Platform detection lives in scripts/lib/platform.mjs. Cursor and Pi have known event-coverage caveats — see docs/cursor-setup.md and docs/pi-setup.md.
Your data stays in your repo. Session Orchestrator runs locally, requires no account, and writes its records as append-only JSONL under .orchestrator/metrics/ in your repository — sessions, learnings, events, subagent records. Those files are yours: readable, greppable, deletable. Optional anonymous usage telemetry is off until you explicitly consent and is separate from the local records (docs/telemetry.md says exactly what it would collect and how to turn it off). Reported metrics describe this repository under its own conditions and will not transfer unchanged to yours (details).
Destructive-command guard. hooks/pre-bash-destructive-guard.mjs enforces .orchestrator/policy/blocked-commands.json — 14 rules, of which 10 block outright (git reset --hard, rm -rf, git push --force, and more) and 4 warn — in the main session and in subagent waves. Bypass per session only for intentional maintenance:
allow-destructive-ops: true
The rule source of truth is .claude/rules/parallel-sessions.md (PSA-003), vendored to consumer repos via /bootstrap.
Import probe. hooks/post-edit-import-probe.mjs (PostToolUse on Edit/Write/MultiEdit) guards the other direction: a hook-reachable helper saved in a broken intermediate state makes every Bash/Edit/Write call fail with "Internal hook error — request blocked", host-wide, for every session sharing the working copy. Right after such a file is saved the probe runs ESLint no-undef on it (plus a child-process import() for scripts/lib/**) and reports the blast radius; it never blocks and always exits 0. It only fires for files listed in the committed allowlist hooks/_lib/hook-import-set.json, regenerated by node scripts/generate-hook-import-set.mjs. Kill switch: SO_DISABLED_HOOKS=post-edit-import-probe.
Codex plugin or hooks not loading. Start with codex plugin list --available --json. Confirm session-orchestrator@kanevry is installed, enabled, unique, and at the tracked manifest version; then start a fresh task and review /hooks. Remove only the two allowlisted legacy IDs through codex plugin remove, and resolve marketplace conflicts through the public marketplace remove/add lifecycle before reinstalling. Any other pre-public plugin/config/cache/hook-state residue is unsupported: do not modify private Codex files; file an issue with codex --version plus the public plugin and marketplace list output. Full decision tree: docs/codex-setup.md.
"'node' not found on the hook PATH — plugin hooks are skipped." The harness executes hook commands via /bin/sh -c with its own PATH — that shell does not source ~/.zshrc/~/.bashrc, so Node installed via Homebrew, nvm, volta, or asdf can be invisible to hooks even though node works in your terminal. All hook commands route through hooks/run-node.sh, which resolves Node via $SO_NODE_BIN → PATH → well-known install dirs → nvm and degrades gracefully: hooks are skipped with one warning per 6 hours instead of a shell error on every tool call. Fixes, in order of preference: launch the harness from a shell where node resolves; export SO_NODE_BIN=/abs/path/to/node; or install Node 24+ to a standard location.
/session refuses to start. It needs .orchestrator/bootstrap.lock — run /bootstrap first, or /bootstrap --retroactive if the repo already has a ## Session Config block.
git clone https://github.com/Kanevry/session-orchestrator.git && cd session-orchestrator
npm install
npm test # vitest
npm run lint # ESLint v10 + Prettier
npm run typecheck # node --check on every .mjs file
.npmrc ships with ignore-scripts=true (supply-chain defence), so Husky git hooks don't auto-wire on install — run npx husky once after cloning. git commit then runs gitleaks → owner-privacy scan → lint-staged → commitlint. CI re-runs everything, plus more.
Two directories share the name rules and play opposite roles: rules/ is the deliverable rule library shipped out to consumer repos via /bootstrap --sync-rules, while .claude/rules/ is this repo's own always-on rule set.
Contributor docs: Plugin Architecture (v3) · CONTRIBUTING.md · sub-agent authoring spec.
Session Orchestrator is provided as-is — a community project with no SLA, no commercial support contract, and no guaranteed response time. Maintenance is best-effort.
What it is not:
We follow Conventional Commits — see CONTRIBUTING.md.
This plugin is a methodology turned into code. The reasoning behind it — why execution runs in waves, why every wave ends at a verification gate, how to make an autonomous loop that actually finishes — is taught hands-on at agenticbuilders.at: Multi-Agent Orchestration and Loop Engineering. The plugin is free and MIT; the courses are for going deeper, not a requirement for using it.
Homepage · Privacy Policy · npm
FAQs
A repeatable Plan, Go, Close workflow for AI coding sessions: /session reads your repo and agrees the scope, /go runs the work in waves with a quality gate between each, /close verifies and commits. Runs on Claude Code, Codex CLI, Cursor and Pi.
The npm package session-orchestrator receives a total of 443 weekly downloads. As such, session-orchestrator popularity was classified as not popular.
We found that session-orchestrator demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Company News
Socket is joining the OpenJS Security Stewardship Program to fund Node.js vulnerability research, maintainer remediation, and security releases.

Security News
Two compromised GitHub Actions were re-enabled with malicious tags intact, exposing thousands of downstream repositories to Mini Shai-Hulud.

Research
/Security News
A malicious Firefox extension fetches its payload after installation to evade detection, steal Google session cookies, and automate account takeover.