Cloud setup: loading the dev-team plugin into a web session¶
This is the focused recipe for making the dev-team@bfinster plugin work in a
Claude Code on the web session (claude.ai/code) — in the same session,
not the next one. For the broader walkthrough (including the file-based
fallback), see
using-plugin-skills-in-the-web-environment.md.
Why declaring the plugin isn't enough¶
Claude loads every skill, agent, and slash command once, when it starts. A plugin is only visible if its files are on disk before that happens. So "install the plugin" really means "get the plugin on disk before Claude starts."
That timing is the whole story:
| Mechanism | Runs… | Plugin loads… |
|---|---|---|
| Setup script (cloud UI) | before Claude boots; filesystem snapshotted & reused | this session ✅ |
SessionStart hook (.claude/install-dev-team.sh) |
after Claude boots | next session only ⚠️ |
The Setup script is the supported way to install software before the session
starts (you cannot replace the underlying machine image). The SessionStart
hook runs too late — the plugin it installs only takes effect in the next
session — so use the Setup script as your primary path and the hook as a fallback.
The claude CLI is available in cloud environments, so the install commands
below run fine from the Setup script.
The snippet to paste into the Setup script field¶
claude.ai/code → Environment → Setup script. The script below checks whether the plugin is already installed and always exits without error (a non-zero exit fails session startup). It uses a repo-committed bootstrap when one exists, and otherwise installs the plugin directly:
#!/bin/bash
set -uo pipefail
MARKETPLACE_REPO="bdfinst/agentic-dev-team"
PLUGIN="dev-team@bfinster"
ROOT="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
BOOTSTRAP="$ROOT/.claude/scripts/dev-team-bootstrap.sh"
if [ -f "$BOOTSTRAP" ]; then
bash "$BOOTSTRAP" || echo "[setup] bootstrap reported issues — continuing."
exit 0
fi
echo "[setup] no $BOOTSTRAP — installing dev-team inline for this session."
if command -v claude >/dev/null 2>&1; then
claude plugin marketplace add "$MARKETPLACE_REPO" >/dev/null 2>&1 || true
claude plugin install "$PLUGIN" >/dev/null 2>&1 || true
fi
exit 0
If you also want this repo's test/gate toolchain (jq, shellcheck, bats,
the Python dev deps, gh) in the same step, paste the body of
.claude/cloud-setup.sh instead — it installs the
toolchain and the plugin, and follows the same exit-0 discipline. It also
installs Node 24+ and runs npm ci, which sets up the git hooks
(pre-commit, pre-push, commit-msg) so commits and pushes in the cloud
session run the same checks you'd run locally. (Skip this only if you don't
intend to commit from the session — it adds a minute to setup.)
Verify it worked¶
Run the headless probe in the session. It boots a fresh Claude, lists every
available skill, and counts the dev-team:* ones:
claude -p "List the names of every skill available to you, one per line." \
--max-turns 1 | grep -c '^dev-team:'
| Setup | dev-team:* skills |
dev-team:ship present? |
|---|---|---|
| Plugin installed via Setup script (pre-boot) | ~86 | yes ✅ |
Plugin installed via SessionStart hook only (post-boot) |
0 (this session) | no ⚠️ |
| No install | 0 | no |
A non-zero count means the plugin loaded this session. (Re-verified in a live
cloud session on 2026-06-21: CLI present at v2.1.185, Setup-script install
yielded 86 dev-team:* skills including dev-team:ship, loaded same-session.)
Caveats¶
- Always
exit 0. A non-zero Setup script fails session startup. Guard every optional step with|| trueand end with an explicitexit 0. - Time budget. The Setup script has a few-minute budget. Keep installs best-effort and time-boxed; don't block on anything that can hang.
- Snapshot rebuild triggers. The Setup-script filesystem is snapshotted and reused by later sessions. Editing the Setup script (or other environment config) triggers a rebuild on the next session — that's how an updated script takes effect.
- Network policy. A restrictive outbound policy can block
marketplace add/install(orpip/apt). When that happens, run skills from their files instead — see Option B in the companion doc. - Ephemeral VM. Anything not committed and pushed is lost when the container is reclaimed.
SessionStarthook is fallback only..claude/install-dev-team.sh(gated byDEV_TEAM_CLOUD_INSTALL=1) installs the plugin too late for the current session; it lands next session. Use the Setup script for same-session loading.