Skip to content

fix(ci): build workspaces before typecheck and test jobs - #4

Merged
johnnyhuy merged 6 commits into
mainfrom
fix/ci-build-before-test-and-typecheck
Jul 20, 2026
Merged

fix(ci): build workspaces before typecheck and test jobs#4
johnnyhuy merged 6 commits into
mainfrom
fix/ci-build-before-test-and-typecheck

Conversation

@johnnyhuy

Copy link
Copy Markdown
Contributor

Summary

Consequences

  • Adds ~5-10s to typecheck and test jobs.
  • Build job already produced dist/ but cross-runner cache contracts would have been brittle; producing it in-line is more honest.

Testing

Local with dist/ removed:
✓ build (protocol + client + server + cli)
✓ typecheck — all 5 sub-checks pass
✓ test — 6 files, 23 tests passed
✓ lint — 0 errors

CI will confirm on this PR.

opencodeand others added 6 commits July 18, 2026 00:11
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>
The typecheck and vitest jobs were failing in CI because
cli/handshake/supaplane-client tests import @echohello/server and
@echohello/protocol from those packages' dist/ entrypoints. The first
CI run after the workflow landed had no dist/ on disk because
bun install --frozen-lockfile doesn't run package build scripts, so
the typecheck and test steps resolved the package's main to a path that
didn't exist yet.
Run `bun run build` before both jobs so each workspace has its dist/
produced in the same step that runs typecheck / vitest. The dedicated
build job already produces dist/, so this only adds a few seconds.
Also avoids relying on the build job's cached dist, which would have
been brittle across GitHub Actions runners that don't share cache.
Co-authored-by: opencode-agent <hello@sst.dev>
@johnnyhuy
johnnyhuy merged commit 6e1bc69 into mainJul 20, 2026
4 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
johnnyhuy added a commit that referenced this pull request Aug 9, 2026
* 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>
* fix(ci): build workspaces before typecheck and test jobs
The typecheck and vitest jobs were failing in CI because
cli/handshake/supaplane-client tests import @echohello/server and
@echohello/protocol from those packages' dist/ entrypoints. The first
CI run after the workflow landed had no dist/ on disk because
bun install --frozen-lockfile doesn't run package build scripts, so
the typecheck and test steps resolved the package's main to a path that
didn't exist yet.
Run `bun run build` before both jobs so each workspace has its dist/
produced in the same step that runs typecheck / vitest. The dedicated
build job already produces dist/, so this only adds a few seconds.
Also avoids relying on the build job's cached dist, which would have
been brittle across GitHub Actions runners that don't share cache.
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
* 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>
* fix(ci): build workspaces before typecheck and test jobs
The typecheck and vitest jobs were failing in CI because
cli/handshake/supaplane-client tests import @echohello/server and
@echohello/protocol from those packages' dist/ entrypoints. The first
CI run after the workflow landed had no dist/ on disk because
bun install --frozen-lockfile doesn't run package build scripts, so
the typecheck and test steps resolved the package's main to a path that
didn't exist yet.
Run `bun run build` before both jobs so each workspace has its dist/
produced in the same step that runs typecheck / vitest. The dedicated
build job already produces dist/, so this only adds a few seconds.
Also avoids relying on the build job's cached dist, which would have
been brittle across GitHub Actions runners that don't share cache.
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
* 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>
* fix(ci): build workspaces before typecheck and test jobs
The typecheck and vitest jobs were failing in CI because
cli/handshake/supaplane-client tests import @echohello/server and
@echohello/protocol from those packages' dist/ entrypoints. The first
CI run after the workflow landed had no dist/ on disk because
bun install --frozen-lockfile doesn't run package build scripts, so
the typecheck and test steps resolved the package's main to a path that
didn't exist yet.
Run `bun run build` before both jobs so each workspace has its dist/
produced in the same step that runs typecheck / vitest. The dedicated
build job already produces dist/, so this only adds a few seconds.
Also avoids relying on the build job's cached dist, which would have
been brittle across GitHub Actions runners that don't share cache.
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
* 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>
* fix(ci): build workspaces before typecheck and test jobs
The typecheck and vitest jobs were failing in CI because
cli/handshake/supaplane-client tests import @echohello/server and
@echohello/protocol from those packages' dist/ entrypoints. The first
CI run after the workflow landed had no dist/ on disk because
bun install --frozen-lockfile doesn't run package build scripts, so
the typecheck and test steps resolved the package's main to a path that
didn't exist yet.
Run `bun run build` before both jobs so each workspace has its dist/
produced in the same step that runs typecheck / vitest. The dedicated
build job already produces dist/, so this only adds a few seconds.
Also avoids relying on the build job's cached dist, which would have
been brittle across GitHub Actions runners that don't share cache.
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
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@johnnyhuy