- Add `client-` prefix to sandbox-processes.md naming table for
external-surface clients bridging an in-sandbox agent.
- Tighten the `agent-` example off interactive CLIs; document that
claude/codex/opencode are foreground tools, not tmux sessions.
- entrypoint.sh: restore client-slack on container start when
SLACK_APP_TOKEN + SLACK_BOT_TOKEN are present and `pi` is installed.
- Propagate rename through wizard code, READMEs, and docs.
- Fold in half-finished harness-pi rename from #302.
Closes#344
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Standalone CLI at apps/oh/ (Node TS, esbuild ~13kb, no runtime deps).
Walks user through token entry (xapp-/xoxb- prefix validation), allowlist
mode (users/channels/both with U…/C… ID validation), atomic .env merge
(temp+rename for crash safety), and agent-pi tmux restart with
'connected and listening' poll. Pluggable as oh config <integration>
namespace for future github/postgres/cloudflare wizards.
Bundled prerequisites and adjacent polish:
- Migrate .pi/extensions/slack/{index,tools}.ts from deprecated
@mariozechner/pi-coding-agent to @earendil-works/pi-coding-agent
(per upstream npm deprecation notice)
- Sidebar label Agents → Harnesses; per-harness pages get unified
Authentication section (codex login / opencode auth login / etc)
- New T3 Code harness page (browser UI on port 3773)
- Docs theme: prose links now green + underlined for affordance
- Slack docs § 5 leads with `oh config slack`; manual procedure
demoted to <details> Manual fallback
- Drop orphaned .pi/onboard-steps/ (logic moved to apps/oh/)
- Makefile help adds Configuration wizards section pointing at
oh config slack (3-agent council picked CLI over Make-target
due to docker exec -it TTY fragility)
Closes#281
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The in-tree Pi extension at .pi/extensions/slack/ reads SLACK_APP_TOKEN /
SLACK_BOT_TOKEN directly from process.env at session_start, so the
.pi/overlays/docker-compose.slack.yml wiring overlay is redundant.
- Delete .pi/overlays/docker-compose.slack.yml and the empty .pi/overlays/ dir
- Rewrite docs/integrations/slack.md setup with the actual working flow
(set -a; source .devcontainer/.env; set +a + named tmux session)
- Mirror the same flow in .pi/extensions/slack/README.md "How to Run"
- Rewrite the Slack section of .devcontainer/.example.env with the set -a
pattern and rationale, plus commented placeholders for both allowlist vars
- Remove overlay references from README.md, docs/architecture/container-runtime.md,
docs/guide/bring-your-own-harness.md, and .devcontainer/docker-compose.yml
- CHANGELOG entries under [Unreleased] > Removed + Changed; flag the set -a
step as a band-aid pending a wrapper / extension fallback
Closes#276.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds .pi/extensions/slack/ with Socket Mode bridge, allowlist gating,
and 4 LLM-callable tools (slack_post/reply/react/upload). Inbound
messages bridge into pi.sendUserMessage() with ctx.isIdle() guard;
turn_end posts the assistant's reply back to Slack via SlackContext.
session_shutdown tears down the Socket Mode connection.
Customizations preserved from portfolio-advisor reference:
- threadTs field on event types (7 sites in events.ts)
- threadParent routing in createSlackContext (context.ts:45)
- exported parseEventContent + buildSyntheticEvent
Tests: 27 new (3 files); 78 pre-existing tests still green; 114 total.
Plan: .claude/plans/context-study-https-github-com-ryaneggz-binary-hartmanis.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
git mv .claude/rules context/rules. Re-symlink .claude/rules → ../context/rules
so Claude Code's auto-loader keeps working unchanged. Remove .codex/rules and
.pi/rules symlinks — neither CLI has a rules-loading feature, so they were
inert decoration. Add context/README.md and context/rules/README.md per
directory-readme.md. Update canonical layout tree at
docs/architecture/container-runtime.md and high-visibility teaching references
(AGENTS.md, CLAUDE.md, .claude/agents/rule-builder.md). ~50 other scattered
references kept as-is — the .claude/rules symlink resolves them.
Closes#257
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Stand up .pi/ as a real project workspace for the pi-coding-agent CLI:
- settings.json: OpenAI defaults (gpt-4o), model cycling list, declared resource paths
- mifune-banner extension: flush-left MIFUNE wordmark + pi harness · ryaneggz/mifune subtitle
- path-guard extension: tool_call interceptor with case-insensitive risky-bash regex,
hasUI headless guard, /dev/sd*|nvme*|hd*|disk* bare-redirection match, defensive
toolName.toLowerCase() (verified lowercase in pi source), canonical input key `path`
- APPEND_SYSTEM.md: generic, consumer-agnostic
- prompts/review.md: /review template
- skills + rules: directory symlinks to ../.claude/{skills,rules} (single source of
truth, mirrors .codex/ pattern)
- new canonical .claude/skills/harness-context/SKILL.md reachable from pi via symlink
Tests at .pi/extensions/__tests__/{path-guard,mifune-banner}.test.ts (32 + 7 cases,
hand-rolled mock ExtensionAPI, no pi devDep). vitest.config.ts include glob extended
to .pi/**/__tests__/**/*.test.ts. ci-harness.yml paths filter extended and a new
"Root tests" step runs pnpm test:scripts (also lifts cron-runtime.test.ts into CI).
86 tests passing across 6 files.
Closes#255
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>