Uh oh!
There was an error while loading. Please reload this page.
chore(ci): add GitHub Actions workflows for ci, release-please, and calver - #3
Merged
Merged
Conversation
Adds the three-screen MVP on top of @echohello/client: - connect: manual ws:// endpoint + label, saved to AsyncStorage, connects via SupaplaneClient - sessions: workspace list grouped by freshness, tap to drill in - session: transcript + composer (send/abort/start) bound to ClientCommand wire types Shared infrastructure: - zustand connection-store: single SupaplaneClient instance, status, workspaces, sessions, per-session event buffer - AsyncStorage wrapper (v3 API: setMany/removeMany) for the saved endpoint and TOFU-pinned server fingerprint - dark theme tokens, Button, TextField, ConnectionBanner Bundler plumbing: metro.config.cjs with explicit watchFolders and nodeModulesPaths so Bun's hoisting doesn't trip the resolver on a monorepo root. Co-authored-by: opencode <opencode@echohello.dev>
Desktop build wiring:
- packages/desktop/tsconfig.build.json emits ESM to dist/
- packages/desktop/package.json: dev now runs tsc -> electron
- main.js (dist) replaces main.ts as the package entry, and
preload.js resolves to the dist sibling
- @echohello/server and @echohello/protocol exports point at
dist/ so Electron's Node can resolve them. Run
'bun run build:server' (or 'bun run build') before
'desktop dev'.
Dev port scheme (avoiding Paseo + Vite + Metro defaults):
- Daemon listenPort: 6767 -> 17687 (IANA-sparse range,
visually echoes 6767)
- Vite port: 5173 -> 5179 (adjacent to Vite default so it
reads as 'the Supaplane Vite port')
- vite.config.ts reads SUPAPLANE_DAEMON_PORT and VITE_PORT
envs; defaults updated
- AGENTS.md + docs/development.md updated to reflect the
new ports
Server hygiene:
- daemon-keypair.ts: replace require('node:crypto') with
a top-level import so it builds cleanly to ESM
Co-authored-by: opencode <opencode@echohello.dev>…alver Modeled on the echohello-dev/pidex workflow structure: - ci.yml: lint + typecheck + vitest + build, with an 'all' gate job that fails when any step fails. Pinned action SHAs match pidex so versions stay aligned across repos. - release-please.yml: drives conventional-commit releases off the existing release-please-config.json (calver-only wouldn't suit the workspace layout). - calver-release.yml: sidecar calver tag-on-main pipeline, kept because Supaplane still wants a date-stamped release artefact visible at the repo root independent of release-please's release PRs. Co-authored-by: opencode-agent <hello@sst.dev>
Connection-offer.test.ts was asserting the encoder maps to app.supaplane.run, but the encoder (and every other reference in the repo, including the comment on encodeOfferToFragmentUrl itself) uses app.supaplane.com. Fix the assertion to match. Also hoist vitest to the root devDependencies so `bun run test` can resolve `vitest/config` without needing bunx to fetch a copy that won't find the local config. The CI workflow depends on the root test command running green. Co-authored-by: opencode-agent <hello@sst.dev>
Uh oh!
There was an error while loading. Please reload this page.
johnnyhuy added a commit
that referenced
this pull request
Aug 9, 2026
…alver (#3) * feat(app): scaffold mobile UI for connect/sessions/transcript Adds the three-screen MVP on top of @echohello/client: - connect: manual ws:// endpoint + label, saved to AsyncStorage, connects via SupaplaneClient - sessions: workspace list grouped by freshness, tap to drill in - session: transcript + composer (send/abort/start) bound to ClientCommand wire types Shared infrastructure: - zustand connection-store: single SupaplaneClient instance, status, workspaces, sessions, per-session event buffer - AsyncStorage wrapper (v3 API: setMany/removeMany) for the saved endpoint and TOFU-pinned server fingerprint - dark theme tokens, Button, TextField, ConnectionBanner Bundler plumbing: metro.config.cjs with explicit watchFolders and nodeModulesPaths so Bun's hoisting doesn't trip the resolver on a monorepo root. Co-authored-by: opencode <opencode@echohello.dev> * chore(dev): wire desktop build + shift dev ports off 6767/5173 Desktop build wiring: - packages/desktop/tsconfig.build.json emits ESM to dist/ - packages/desktop/package.json: dev now runs tsc -> electron - main.js (dist) replaces main.ts as the package entry, and preload.js resolves to the dist sibling - @echohello/server and @echohello/protocol exports point at dist/ so Electron's Node can resolve them. Run 'bun run build:server' (or 'bun run build') before 'desktop dev'. Dev port scheme (avoiding Paseo + Vite + Metro defaults): - Daemon listenPort: 6767 -> 17687 (IANA-sparse range, visually echoes 6767) - Vite port: 5173 -> 5179 (adjacent to Vite default so it reads as 'the Supaplane Vite port') - vite.config.ts reads SUPAPLANE_DAEMON_PORT and VITE_PORT envs; defaults updated - AGENTS.md + docs/development.md updated to reflect the new ports Server hygiene: - daemon-keypair.ts: replace require('node:crypto') with a top-level import so it builds cleanly to ESM Co-authored-by: opencode <opencode@echohello.dev> * chore(ci): add GitHub Actions workflows for ci, release-please, and calver Modeled on the echohello-dev/pidex workflow structure: - ci.yml: lint + typecheck + vitest + build, with an 'all' gate job that fails when any step fails. Pinned action SHAs match pidex so versions stay aligned across repos. - release-please.yml: drives conventional-commit releases off the existing release-please-config.json (calver-only wouldn't suit the workspace layout). - calver-release.yml: sidecar calver tag-on-main pipeline, kept because Supaplane still wants a date-stamped release artefact visible at the repo root independent of release-please's release PRs. Co-authored-by: opencode-agent <hello@sst.dev> * fix(protocol): correct supaplane.com URL in connection-offer test Connection-offer.test.ts was asserting the encoder maps to app.supaplane.run, but the encoder (and every other reference in the repo, including the comment on encodeOfferToFragmentUrl itself) uses app.supaplane.com. Fix the assertion to match. Also hoist vitest to the root devDependencies so `bun run test` can resolve `vitest/config` without needing bunx to fetch a copy that won't find the local config. The CI workflow depends on the root test command running green. Co-authored-by: opencode-agent <hello@sst.dev> --------- Co-authored-by: opencode <opencode@echohello.dev> Co-authored-by: opencode-agent <hello@sst.dev>
johnnyhuy added a commit
that referenced
this pull request
Aug 9, 2026
…alver (#3) * feat(app): scaffold mobile UI for connect/sessions/transcript Adds the three-screen MVP on top of @echohello/client: - connect: manual ws:// endpoint + label, saved to AsyncStorage, connects via SupaplaneClient - sessions: workspace list grouped by freshness, tap to drill in - session: transcript + composer (send/abort/start) bound to ClientCommand wire types Shared infrastructure: - zustand connection-store: single SupaplaneClient instance, status, workspaces, sessions, per-session event buffer - AsyncStorage wrapper (v3 API: setMany/removeMany) for the saved endpoint and TOFU-pinned server fingerprint - dark theme tokens, Button, TextField, ConnectionBanner Bundler plumbing: metro.config.cjs with explicit watchFolders and nodeModulesPaths so Bun's hoisting doesn't trip the resolver on a monorepo root. Co-authored-by: opencode <opencode@echohello.dev> * chore(dev): wire desktop build + shift dev ports off 6767/5173 Desktop build wiring: - packages/desktop/tsconfig.build.json emits ESM to dist/ - packages/desktop/package.json: dev now runs tsc -> electron - main.js (dist) replaces main.ts as the package entry, and preload.js resolves to the dist sibling - @echohello/server and @echohello/protocol exports point at dist/ so Electron's Node can resolve them. Run 'bun run build:server' (or 'bun run build') before 'desktop dev'. Dev port scheme (avoiding Paseo + Vite + Metro defaults): - Daemon listenPort: 6767 -> 17687 (IANA-sparse range, visually echoes 6767) - Vite port: 5173 -> 5179 (adjacent to Vite default so it reads as 'the Supaplane Vite port') - vite.config.ts reads SUPAPLANE_DAEMON_PORT and VITE_PORT envs; defaults updated - AGENTS.md + docs/development.md updated to reflect the new ports Server hygiene: - daemon-keypair.ts: replace require('node:crypto') with a top-level import so it builds cleanly to ESM Co-authored-by: opencode <opencode@echohello.dev> * chore(ci): add GitHub Actions workflows for ci, release-please, and calver Modeled on the echohello-dev/pidex workflow structure: - ci.yml: lint + typecheck + vitest + build, with an 'all' gate job that fails when any step fails. Pinned action SHAs match pidex so versions stay aligned across repos. - release-please.yml: drives conventional-commit releases off the existing release-please-config.json (calver-only wouldn't suit the workspace layout). - calver-release.yml: sidecar calver tag-on-main pipeline, kept because Supaplane still wants a date-stamped release artefact visible at the repo root independent of release-please's release PRs. Co-authored-by: opencode-agent <hello@sst.dev> * fix(protocol): correct supaplane.com URL in connection-offer test Connection-offer.test.ts was asserting the encoder maps to app.supaplane.run, but the encoder (and every other reference in the repo, including the comment on encodeOfferToFragmentUrl itself) uses app.supaplane.com. Fix the assertion to match. Also hoist vitest to the root devDependencies so `bun run test` can resolve `vitest/config` without needing bunx to fetch a copy that won't find the local config. The CI workflow depends on the root test command running green. Co-authored-by: opencode-agent <hello@sst.dev> --------- Co-authored-by: opencode <opencode@echohello.dev> Co-authored-by: opencode-agent <hello@sst.dev>
johnnyhuy added a commit
that referenced
this pull request
Aug 9, 2026
…alver (#3) * feat(app): scaffold mobile UI for connect/sessions/transcript Adds the three-screen MVP on top of @echohello/client: - connect: manual ws:// endpoint + label, saved to AsyncStorage, connects via SupaplaneClient - sessions: workspace list grouped by freshness, tap to drill in - session: transcript + composer (send/abort/start) bound to ClientCommand wire types Shared infrastructure: - zustand connection-store: single SupaplaneClient instance, status, workspaces, sessions, per-session event buffer - AsyncStorage wrapper (v3 API: setMany/removeMany) for the saved endpoint and TOFU-pinned server fingerprint - dark theme tokens, Button, TextField, ConnectionBanner Bundler plumbing: metro.config.cjs with explicit watchFolders and nodeModulesPaths so Bun's hoisting doesn't trip the resolver on a monorepo root. Co-authored-by: opencode <opencode@echohello.dev> * chore(dev): wire desktop build + shift dev ports off 6767/5173 Desktop build wiring: - packages/desktop/tsconfig.build.json emits ESM to dist/ - packages/desktop/package.json: dev now runs tsc -> electron - main.js (dist) replaces main.ts as the package entry, and preload.js resolves to the dist sibling - @echohello/server and @echohello/protocol exports point at dist/ so Electron's Node can resolve them. Run 'bun run build:server' (or 'bun run build') before 'desktop dev'. Dev port scheme (avoiding Paseo + Vite + Metro defaults): - Daemon listenPort: 6767 -> 17687 (IANA-sparse range, visually echoes 6767) - Vite port: 5173 -> 5179 (adjacent to Vite default so it reads as 'the Supaplane Vite port') - vite.config.ts reads SUPAPLANE_DAEMON_PORT and VITE_PORT envs; defaults updated - AGENTS.md + docs/development.md updated to reflect the new ports Server hygiene: - daemon-keypair.ts: replace require('node:crypto') with a top-level import so it builds cleanly to ESM Co-authored-by: opencode <opencode@echohello.dev> * chore(ci): add GitHub Actions workflows for ci, release-please, and calver Modeled on the echohello-dev/pidex workflow structure: - ci.yml: lint + typecheck + vitest + build, with an 'all' gate job that fails when any step fails. Pinned action SHAs match pidex so versions stay aligned across repos. - release-please.yml: drives conventional-commit releases off the existing release-please-config.json (calver-only wouldn't suit the workspace layout). - calver-release.yml: sidecar calver tag-on-main pipeline, kept because Supaplane still wants a date-stamped release artefact visible at the repo root independent of release-please's release PRs. Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * fix(protocol): correct supaplane.com URL in connection-offer test Connection-offer.test.ts was asserting the encoder maps to app.supaplane.run, but the encoder (and every other reference in the repo, including the comment on encodeOfferToFragmentUrl itself) uses app.supaplane.com. Fix the assertion to match. Also hoist vitest to the root devDependencies so `bun run test` can resolve `vitest/config` without needing bunx to fetch a copy that won't find the local config. The CI workflow depends on the root test command running green. Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> --------- Co-authored-by: opencode <opencode@echohello.dev> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
johnnyhuy added a commit
that referenced
this pull request
Aug 9, 2026
…alver (#3) * feat(app): scaffold mobile UI for connect/sessions/transcript Adds the three-screen MVP on top of @echohello/client: - connect: manual ws:// endpoint + label, saved to AsyncStorage, connects via SupaplaneClient - sessions: workspace list grouped by freshness, tap to drill in - session: transcript + composer (send/abort/start) bound to ClientCommand wire types Shared infrastructure: - zustand connection-store: single SupaplaneClient instance, status, workspaces, sessions, per-session event buffer - AsyncStorage wrapper (v3 API: setMany/removeMany) for the saved endpoint and TOFU-pinned server fingerprint - dark theme tokens, Button, TextField, ConnectionBanner Bundler plumbing: metro.config.cjs with explicit watchFolders and nodeModulesPaths so Bun's hoisting doesn't trip the resolver on a monorepo root. Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * chore(dev): wire desktop build + shift dev ports off 6767/5173 Desktop build wiring: - packages/desktop/tsconfig.build.json emits ESM to dist/ - packages/desktop/package.json: dev now runs tsc -> electron - main.js (dist) replaces main.ts as the package entry, and preload.js resolves to the dist sibling - @echohello/server and @echohello/protocol exports point at dist/ so Electron's Node can resolve them. Run 'bun run build:server' (or 'bun run build') before 'desktop dev'. Dev port scheme (avoiding Paseo + Vite + Metro defaults): - Daemon listenPort: 6767 -> 17687 (IANA-sparse range, visually echoes 6767) - Vite port: 5173 -> 5179 (adjacent to Vite default so it reads as 'the Supaplane Vite port') - vite.config.ts reads SUPAPLANE_DAEMON_PORT and VITE_PORT envs; defaults updated - AGENTS.md + docs/development.md updated to reflect the new ports Server hygiene: - daemon-keypair.ts: replace require('node:crypto') with a top-level import so it builds cleanly to ESM Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * chore(ci): add GitHub Actions workflows for ci, release-please, and calver Modeled on the echohello-dev/pidex workflow structure: - ci.yml: lint + typecheck + vitest + build, with an 'all' gate job that fails when any step fails. Pinned action SHAs match pidex so versions stay aligned across repos. - release-please.yml: drives conventional-commit releases off the existing release-please-config.json (calver-only wouldn't suit the workspace layout). - calver-release.yml: sidecar calver tag-on-main pipeline, kept because Supaplane still wants a date-stamped release artefact visible at the repo root independent of release-please's release PRs. Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * fix(protocol): correct supaplane.com URL in connection-offer test Connection-offer.test.ts was asserting the encoder maps to app.supaplane.run, but the encoder (and every other reference in the repo, including the comment on encodeOfferToFragmentUrl itself) uses app.supaplane.com. Fix the assertion to match. Also hoist vitest to the root devDependencies so `bun run test` can resolve `vitest/config` without needing bunx to fetch a copy that won't find the local config. The CI workflow depends on the root test command running green. Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> --------- Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com>
This was referenced Aug 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
allgate that fails when any step fails (modeled on echohello-dev/pidex's ci.yml structure).release-please-config.json. Calver-only wouldn't suit the workspace layout, so this stays primary.connection-offer.test.tstypo (supaplane.run→supaplane.com) and vitest hoisted to root devDeps sobun run testresolvesvitest/configfrom the root CI step.Consequences
YYYY.MM.DD[-N]release on every push to main. Both run off push-to-main and havecontents: write.Testing
Local (bun + mise):
✓ lint — 13 warnings, 0 errors
✓ typecheck — all packages
✓ test — 6 files, 23 tests passed
✓ build — protocol + client + server + cli
CI on PR will run the same checks on Ubuntu.
Co-authored-by: opencode-agent hello@sst.dev