Browser automation CLI for AI agents. Use this when asked to test something in a real browser.
日本語の概要は準備中です。原文の説明を表示しています。
Release pipeline for CLI, mobile, web, and server. Guides through version bumping, building, testing, publishing, and deploying. Replaces the old interactive release-it flow with a Claude Code-native experience. Use when user types /release or asks to release, publish, deploy, or ship any component.
インストール方法を見るインストールする前に、エージェントに与えられる指示の中身を確認できます。
You are the release operator for the Happy monorepo. When invoked, walk the user through releasing the component they choose.
Ask which component to release:
happyPresent these as options. Wait for the user to pick.
Package: packages/agentrejoin-cli
npm name: happy
Registry: https://registry.npmjs.org
Git tags: cli-{version}
Tag namespace note:
cli-X.Y.Znative-<runtime-version>ota-<ota-version>vX.Y.Z tag for Happy releases because multiple release streams coexist in this repoRun these in parallel:
npm view happy dist-tags — see current latest + betacat packages/agentrejoin-cli/package.json | grep version — local versiongit status --short — check for dirty stategit branch --show-current — confirm branchgit log --oneline -10 — recent commits for release notes contextPresent a summary:
Local version: X.Y.Z
npm latest: X.Y.Z
npm beta: X.Y.Z-N
Branch: main
Working tree: clean / dirty
Ask the user:
latest or betapatch, minor, major. For beta: prerelease (appends -N), or explicit version.Suggest a sensible default based on the current state. For beta, the next prerelease of the current version. For latest, a patch bump.
Present as options. Wait for confirmation.
Edit packages/agentrejoin-cli/package.json directly — do NOT use npm version (it chokes on pnpm workspace protocol).
IMPORTANT: do this before build/test for the CLI. The build imports package.json and bakes the version into the generated bundle. If you build first and bump later, happy --version can still report the old prerelease version even though npm metadata shows the new one.
cd packages/agentrejoin-cli
pnpm --filter happy run build
Report success/failure. Stop on failure.
The happy npm package no longer bundles the self-host server binary or webapp.
Packaged installs resolve those from the separately installed
agentrejoin-server-self-host package. Do not rebuild or ship tools/server or
tools/webapp as part of a CLI release.
If the CLI release depends on self-host server changes, release
agentrejoin-server-self-host separately. It lives in packages/agentrejoin-server-self-host
and is the publishing shell around the private packages/agentrejoin-server:
pnpm --filter agentrejoin-server-self-host build bundles that package's standalone
entrypoint into dist/ and copies prisma/ in (this needs bun), then
pnpm --filter agentrejoin-server-self-host run bundle:webapp builds the bundled
webapp. Publish from packages/agentrejoin-server-self-host — packages/agentrejoin-server
is private and is never published. The server package is a JS/TS npm package;
npm handles platform
specific dependencies such as Prisma and sharp normally. Do not pass
--ignore-scripts when publishing it; its prepublishOnly script rebuilds the
runtime, rebuilds the webapp, and runs tests before npm receives the tarball.
Before handing a server publish to the user, pre-run the full prepublishOnly
chain yourself to catch failures early — the bundle:webapp step runs a multi-minute
expo export, and build needs bun:
pnpm --filter agentrejoin-server-self-host --fail-if-no-match run prepublishOnly
The server typecheck, unit suite, and both Docker images are gated by
.github/workflows/server.yml.
(Observed: 1332 merged a standalone.spec.ts test that only passes on Windows
because the impl used POSIX path.basename; it was red on main and would have
aborted the publish at the prepublishOnly test step.)
cd packages/agentrejoin-cli
pnpm --filter happy exec vitest run --project unit
Integration tests are slow and flaky — skip them for releases. Unit tests are the gate.
Expect the unit suite to take around a minute; src/utils/serverConnectionErrors.test.ts is particularly slow, so don't mistake a long run for a hang.
Report results. If failures, ask the user whether to proceed or abort.
cd packages/agentrejoin-cli
pnpm publish --tag {channel} --no-git-checks
--no-git-checks: allows dirty working tree (we already verified state)⚠️ NEVER pass --ignore-scripts. prepublishOnly runs pnpm test (build +
unit tests), and the build re-stamps the version into the bundle (Step 4).
Skipping it ships whatever stale dist/ happens to be on disk. Two rationalizations
look reasonable and are both WRONG:
dist/ is then stamped with the OLD version, and
--ignore-scripts ships it. This actually happened: 1.1.10-beta.9 was published
with --ignore-scripts and shipped a bundle stamped beta.8 — happy --version
reported beta.8 while npm metadata said beta.9. npm versions are immutable, so
the only fix was bumping to beta.10 and re-releasing. A wasted version number and
a broken publish, to save one ~1-minute rebuild.prepublishOnly rebuild on each
retry is the price of correctness, not overhead to trim. If retries are painful,
change the network (see the TLS note above) — do NOT skip scripts.If you catch yourself reasoning toward --ignore-scripts, stop: there is no case in
this repo where it is correct for a publish.
MUST use pnpm publish — never npm publish. This is a pnpm workspace; npm publish mis-resolves the workspace protocol and the bin entries and ships a
broken tarball (a regression was reported for exactly this and the fix was to
standardize on pnpm publish). pnpm publish is the only supported path. Do not
"fall back" to npm publish if pnpm errors — diagnose the pnpm error instead.
Transient TLS upload failures are expected — retry, don't panic. The tarball
is large (~160 MB, ~1000 files). The upload to registry.npmjs.org frequently
dies mid-stream with:
npm error code ERR_SSL_SSL/TLS_ALERT_BAD_RECORD_MAC
npm error ... ssl3_read_bytes:ssl/tls alert bad record mac ...
This is network-layer corruption of a single TLS record on the long upload, not
a code, auth, or version problem. A single bad record kills the whole stream, so
each fresh attempt has an independent chance to complete. Just re-run the exact
same pnpm publish command — it typically succeeds within 2–3 attempts (it took
3 on the 1.1.10-beta.4 release). Before each retry, confirm it did NOT actually
land (see Step 8); npm rejects re-publishing an already-published version, which
would be a misleading error. A clean success prints + happy@X.Y.Z.
npm view happy@{version} version # did the version actually publish?
npm view happy dist-tags # did the channel tag move?
Check npm view happy@X.Y.Z version first — it returns the version string if the
publish landed (use this between TLS retries to avoid double-publishing, and to
distinguish a real failure from a cosmetic upload error).
⚠️ This metadata check is necessary but NOT sufficient. npm view ... version
only confirms the tarball was accepted — it says nothing about what's inside it.
A bundle stamped with the wrong version (the --ignore-scripts footgun above) passes
this check cleanly. The authoritative check is the bundle itself in Step 11
(happy --version after a real install). Never report a release as done on the
metadata check alone.
Then confirm the new version appears under the correct dist-tag. The tag often lags the publish by 10–40s — poll a few times before concluding it failed; npm tag propagation is not instant.
For latest releases only:
Release version X.Y.Zgit tag cli-X.Y.Zgit push && git push --tagsFor beta releases: ask the user if they want to commit the version bump or leave it uncommitted.
If git push is rejected because origin/main advanced while releasing, fetch and rebase the release commit before retrying:
git fetch origin main
git rebase --autostash origin/main
git tag -f cli-X.Y.Z
git push && git push --tags
Use --autostash when the worktree is dirty from unrelated local changes so those edits are preserved. Recreate the tag after rebase because the release commit hash changes.
For latest releases, create a GitHub release:
gh release create cli-X.Y.Z --generate-notes --title "cli-X.Y.Z"
npm i -g happy@{channel}
happy --version
happy daemon status
Report the installed version and daemon status.
The smoke check must confirm that happy --version matches the published version, not just npm metadata. If it reports the old version, rebuild after the version bump and cut a corrective patch release.
Package: packages/agentrejoin-app
Variants: development, preview, production
Platform: Expo SDK 54 / React Native 0.81.4
Always ask the user explicitly what they want to release. Present these options in order of popularity:
# Preview (most common)
pnpm --filter agentrejoin-app run ota
# Production
pnpm --filter agentrejoin-app run ota:production
OTA scripts require a message — stdin is not readable from Claude Code, so run the
underlying eas update directly with --message:
cd packages/agentrejoin-app && APP_ENV=preview NODE_ENV=preview tsx sources/scripts/parseChangelog.ts && pnpm typecheck && eas update --branch preview --message "<message>"
Dev build — development profile, used when native code changes (points to dev server)
cd packages/agentrejoin-app && eas build --profile development --platform all --non-interactive
TestFlight / Play Store builds — use -store profiles for distribution via TestFlight and Play Store.
Always pass --auto-submit so the build goes straight to TestFlight after completion.
# Preview (TestFlight/internal testing)
cd packages/agentrejoin-app && eas build --profile preview-store --platform ios --non-interactive --auto-submit
# Dev (TestFlight, points to dev server)
cd packages/agentrejoin-app && eas build --profile development-store --platform ios --non-interactive --auto-submit
# Production (App Store / Play Store submission)
cd packages/agentrejoin-app && eas build --profile production --platform ios --non-interactive --auto-submit
IMPORTANT: Always pass --non-interactive to eas build commands. Without it,
EAS prompts for Apple account login interactively which breaks in non-TTY contexts
(Claude Code, CI). Remote credentials are already configured on EAS servers.
IMPORTANT: Always pass --auto-submit to -store builds. Without it, the build
finishes but never reaches TestFlight — you have to manually submit with eas submit.
Profile Distribution Channel Notes
development-store store development Dev build via TestFlight
preview-store store preview TestFlight / Play Store internal testing
production store production App Store / Play Store submission
These install via direct link, NOT TestFlight. Almost never needed — prefer
the -store profiles above.
Profile Distribution Channel
development internal development
preview internal preview
Version source is remote (EAS manages build numbers, auto-incremented). Runtime version "20" — bump when native code changes to invalidate OTA.
Apple ID: steve@bulkovo.com
Team ID: 466DQWDR8C
App Store Connect App IDs:
Production: 6748571505 (com.ex3ndr.happy)
Preview: 6749025570 (com.slopus.happy.preview)
Development: 6748984254 (com.slopus.happy.dev)
Package: packages/agentrejoin-app (same Expo app, web export)
Dockerfile: Dockerfile.webapp
Image: docker.korshakov.com/agentrejoin-app:{version}
K8s: packages/agentrejoin-app/deploy/agentrejoin-app.yaml (3 replicas)
Web releases go through TeamCity (Lab_HappyWeb). The config is in the TeamCity UI, not in the repo.
Flow: expo export --platform web -> nginx:alpine static serve -> Docker build -> push -> K8s deploy.
Build args: POSTHOG_API_KEY, REVENUE_CAT_STRIPE.
Guide the user to trigger the TeamCity build, or help with manual Docker builds if needed.
Package: packages/agentrejoin-server
Dockerfile: Dockerfile.server (production), Dockerfile (standalone w/ PGlite)
Image: docker.korshakov.com/handy-server:{version}
K8s: packages/agentrejoin-server/deploy/handy.yaml (1 replica, port 3005)
Server releases go through TeamCity (Lab_HappyServer). The config is in the TeamCity UI, not in the repo.
Build: node:20 + python3 + ffmpeg, builds agentrejoin-wire + agentrejoin-server. Secrets from Vault: handy-db, handy-master, handy-github, handy-files, handy-e2b, handy-revenuecat, handy-elevenlabs. Redis: happy-redis StatefulSet (redis:7-alpine, 1Gi persistent volume).
Guide the user to trigger the TeamCity build.
Site: happy.engineering (GitHub Pages)
Repo: github.com/slopus/slopus.github.io
Separate repo, not part of this monorepo. Guide the user to push to that repo.
CHANGELOG.md is regenerated into changelog.json and shown inside the mobile app, on a phone, right after an OTA update. Write for that reader.
CHANGELOG.md only, then regenerate via tsx packages/agentrejoin-app/sources/scripts/parseChangelog.ts.happy — self-host runtime and the bundled webapp ship through agentrejoin-server-self-host, not the main CLI package.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Browser automation CLI for AI agents. Use this when asked to test something in a real browser.
日本語の概要は準備中です。原文の説明を表示しています。
Analyze and design control flows and data structures. Produces compact ASCII tree diagrams showing triggers, call chains, payload shapes, state mutations, and re-render effects. Use when user asks to diagram, trace, visualize, or design a flow or data structure.
日本語の概要は準備中です。原文の説明を表示しています。
Local development guide for the AgentRejoin monorepo. How to build, install, test, and run the CLI, server, mobile app, and desktop (Tauri) locally. Use when the user types /dev, asks how to "build", "start dev", "install locally", or "run the ___ package".
日本語の概要は準備中です。原文の説明を表示しています。
Maintain the slopus/happy open source project. Triage issues, manage the GitHub project board, draft closing comments, find duplicates, check if bugs are fixed on main, and engage with community contributors. NEVER posts comments or closes issues without showing exact text and getting approval first.
日本語の概要は準備中です。原文の説明を表示しています。
Query and manage Grafana dashboards and Prometheus metrics for Happy infrastructure. Covers grafanactl CLI usage, direct Prometheus queries through Grafana proxy, and dashboard-as-code workflows. Use when user asks about metrics, dashboards, monitoring, Grafana, Prometheus, or wants to add/modify panels.
日本語の概要は準備中です。原文の説明を表示しています。
MANUAL TRIGGER ONLY: invoke only when user types /office-hours. YC Office Hours — two modes. Startup mode: six forcing questions that expose demand reality, status quo, desperate specificity, narrowest wedge, observation, and future-fit. Builder mode: design thinking brainstorming for side projects, hackathons, learning, and open source. Saves a design doc. Use when asked to "brainstorm this", "I have an idea", "help me think through this", "office hours", or "is this worth building". Proactively suggest when the user describes a new product idea or is exploring whether something is worth building — before any code is written.
日本語の概要は準備中です。原文の説明を表示しています。