-
Notifications
You must be signed in to change notification settings - Fork 0
chore: desktop release alignment + CI fixes #1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
ce7594b
4da6a3d
83ce54f
f4c0735
1737509
40aafff
fbb41bb
1dee6bb
99e5f4c
400745a
12468ba
1af6855
86d3f70
309faa1
37d896a
f5d23ed
ac18056
0e6058e
f1faf50
69c3953
29080d3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,16 +1,17 @@ | ||||||||||||||
| # Atomic Bot Desktop | ||||||||||||||
| # OpenSpace Desktop | ||||||||||||||
|
|
||||||||||||||
| Cross-platform Electron desktop app for [Atomic Bot](https://atomicbot.ai) — an AI assistant that makes things for you. | ||||||||||||||
| Cross-platform Electron desktop app for OpenSpace. | ||||||||||||||
|
|
||||||||||||||
| **Platforms:** macOS (arm64 / x64) · Windows (x64) | ||||||||||||||
|
|
||||||||||||||
| ## Quick Start | ||||||||||||||
|
|
||||||||||||||
| ```bash | ||||||||||||||
| # Install dependencies (from repo root) | ||||||||||||||
| pnpm install | ||||||||||||||
| # From repo root, install monorepo + desktop deps | ||||||||||||||
| cd openclaw && pnpm install | ||||||||||||||
| cd ../desktop && npm install | ||||||||||||||
|
|
||||||||||||||
| # Prepare bundled runtimes | ||||||||||||||
| # Prepare bundled runtimes used by the packaged app | ||||||||||||||
| npm run prepare:all | ||||||||||||||
|
|
||||||||||||||
| # Build & launch in dev mode | ||||||||||||||
|
|
@@ -22,7 +23,7 @@ npm run dev | |||||||||||||
| The app follows a standard Electron multi-process model with a clear separation of concerns: | ||||||||||||||
|
|
||||||||||||||
| ``` | ||||||||||||||
| apps/electron-desktop/ | ||||||||||||||
| desktop/ | ||||||||||||||
| ├── src/ # Main process + preload | ||||||||||||||
| │ ├── main.ts # Electron entry point | ||||||||||||||
| │ ├── preload.ts # Context bridge (window.openclawDesktop) | ||||||||||||||
|
|
@@ -128,13 +129,52 @@ Channel names live in `ipc-channels.ts`; the full API surface is declared in `de | |||||||||||||
| | `npm run format` | Check formatting (Prettier) | | ||||||||||||||
| | `npm run format:fix` | Fix formatting (Prettier) | | ||||||||||||||
|
|
||||||||||||||
| ## Release & Auto-update | ||||||||||||||
|
|
||||||||||||||
| The packaged app uses `electron-updater` with the GitHub provider configured in `package.json`. Release builds are published to the GitHub Releases page of `guilhermexp/openspace`. | ||||||||||||||
|
|
||||||||||||||
| Manual download assets: | ||||||||||||||
|
|
||||||||||||||
| - macOS: `.dmg` | ||||||||||||||
| - Windows: `.exe` | ||||||||||||||
|
|
||||||||||||||
| Auto-update assets: | ||||||||||||||
|
|
||||||||||||||
| - macOS: `.zip`, `.blockmap`, `latest-mac.yml` | ||||||||||||||
| - Windows: `.exe`, `.blockmap`, `latest.yml` | ||||||||||||||
|
|
||||||||||||||
| If you mirror installers on an external site, keep GitHub Releases as the canonical update feed unless you also migrate the app to a generic update provider. | ||||||||||||||
|
|
||||||||||||||
| Guia de secrets e variables: | ||||||||||||||
|
|
||||||||||||||
| - [release-secrets-checklist.md](/Users/guilhermevarela/Documents/Projetos/openspace/desktop/docs/release-secrets-checklist.md) | ||||||||||||||
|
Comment on lines
+148
to
+150
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix the absolute path and translate to English. Line 148 contains Portuguese text, and line 150 uses an absolute local filesystem path that won't work for other users. 🔧 Proposed fix-Guia de secrets e variables:
+Secrets and variables guide:
-- [release-secrets-checklist.md](/Users/guilhermevarela/Documents/Projetos/openspace/desktop/docs/release-secrets-checklist.md)
+- [release-secrets-checklist.md](docs/release-secrets-checklist.md)📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||
|
|
||||||||||||||
| Tag-driven release flow: | ||||||||||||||
|
|
||||||||||||||
| 1. Run `npm run release patch|minor|major` inside `desktop/` | ||||||||||||||
| 2. Push the branch and tag | ||||||||||||||
| 3. GitHub Actions builds macOS + Windows artifacts and publishes them to the draft release | ||||||||||||||
| 4. Publish the draft release after both platform jobs complete | ||||||||||||||
|
|
||||||||||||||
| Optional signing/notarization secrets for release CI: | ||||||||||||||
|
|
||||||||||||||
| - `CSC_LINK` | ||||||||||||||
| - `CSC_KEY_PASSWORD` | ||||||||||||||
| - `CSC_NAME` | ||||||||||||||
| - `APPLE_ID` | ||||||||||||||
| - `APPLE_APP_SPECIFIC_PASSWORD` | ||||||||||||||
| - `APPLE_TEAM_ID` | ||||||||||||||
| - `NOTARYTOOL_PROFILE` or `NOTARYTOOL_KEY` + `NOTARYTOOL_KEY_ID` + `NOTARYTOOL_ISSUER` | ||||||||||||||
| - repo variable `OPENSPACE_NOTARIZE=1` to enable notarization steps | ||||||||||||||
|
|
||||||||||||||
| ## Environment Variables | ||||||||||||||
|
|
||||||||||||||
| | Variable | Context | Description | | ||||||||||||||
| | ----------------------------- | -------- | ------------------------------------------------------- | | ||||||||||||||
| | `VITE_BACKEND_URL` | Renderer | Override API backend URL (set in `renderer/.env.local`) | | ||||||||||||||
| | `OPENCLAW_DESKTOP_NODE_BIN` | Main | Custom Node binary path for development | | ||||||||||||||
| | `CSC_IDENTITY_AUTO_DISCOVERY` | Build | Set to `false` to skip code signing | | ||||||||||||||
| | Variable | Context | Description | | ||||||||||||||
| | ---------------------------------------------------------------- | -------- | ------------------------------------------------------- | | ||||||||||||||
| | `VITE_BACKEND_URL` | Renderer | Override API backend URL (set in `renderer/.env.local`) | | ||||||||||||||
| | `OPENCLAW_DESKTOP_NODE_BIN` | Main | Custom Node binary path for development | | ||||||||||||||
| | `CSC_IDENTITY_AUTO_DISCOVERY` | Build | Set to `false` to skip code signing | | ||||||||||||||
| | `OPENCLAW_GOG_OAUTH_CLIENT_SECRET_PATH` / `..._B64` / `..._JSON` | Build | Stage the gog OAuth client secret for packaged builds | | ||||||||||||||
|
|
||||||||||||||
| ## Adding New Features | ||||||||||||||
|
|
||||||||||||||
|
|
||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -139,7 +139,7 @@ CSS em: `ui/src/styles/chat/grouped.css` (classes `.msg-meta__*`) | |
|
|
||
| ### 4.1 Parser de historico | ||
|
|
||
| Arquivo: `apps/electron-desktop/renderer/src/store/slices/chat/chat-utils.ts` | ||
| Arquivo: `desktop/renderer/src/store/slices/chat/chat-utils.ts` | ||
|
|
||
| O `parseHistoryMessages()` extrai `usage` e `model` de cada mensagem raw: | ||
|
|
||
|
|
@@ -163,7 +163,7 @@ const messageModel = | |
|
|
||
| ### 4.2 Tipos | ||
|
|
||
| Arquivo: `apps/electron-desktop/renderer/src/store/slices/chat/chat-types.ts` | ||
| Arquivo: `desktop/renderer/src/store/slices/chat/chat-types.ts` | ||
|
|
||
| ```typescript | ||
| type UiMessageUsage = { | ||
|
|
@@ -182,12 +182,12 @@ type UiMessage = { | |
|
|
||
| ### 4.3 Componente de renderizacao | ||
|
|
||
| Arquivo: `apps/electron-desktop/renderer/src/ui/chat/components/MessageMeta.tsx` | ||
| Arquivo: `desktop/renderer/src/ui/chat/components/MessageMeta.tsx` | ||
|
|
||
| Renderiza inline abaixo de cada mensagem do assistente: | ||
|
|
||
| ``` | ||
| Atomic Bot 13:40 ↑4k ↓371 R26k W212 claude-opus-4-6 | ||
| OpenSpace 13:40 ↑4k ↓371 R26k W212 claude-opus-4-6 | ||
| ``` | ||
|
Comment on lines
189
to
191
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add language specifier to fenced code block. The code block at line 189 is missing a language specifier. Since it shows rendered UI output text, consider using 📝 Suggested fix-```
+```text
OpenSpace 13:40 ↑4k ↓371 R26k W212 claude-opus-4-6🧰 Tools🪛 markdownlint-cli2 (0.22.0)[warning] 189-189: Fenced code blocks should have a language specified (MD040, fenced-code-language) 🤖 Prompt for AI Agents |
||
|
|
||
| Props recebidas diretamente da mensagem: | ||
|
|
@@ -200,7 +200,7 @@ Fallback: se `model` nao vier na mensagem, le do config (`agents.defaults.model. | |
|
|
||
| ### 4.4 Integracao no ChatMessageList | ||
|
|
||
| Arquivo: `apps/electron-desktop/renderer/src/ui/chat/components/ChatMessageList.tsx` | ||
| Arquivo: `desktop/renderer/src/ui/chat/components/ChatMessageList.tsx` | ||
|
|
||
| ```tsx | ||
| { | ||
|
|
@@ -226,19 +226,19 @@ Arquivo: `apps/electron-desktop/renderer/src/ui/chat/components/ChatMessageList. | |
| ↓ | ||
| [Redux Store] → UiMessage com usage/model | ||
| ↓ | ||
| [MessageMeta] → renderiza inline: "Atomic Bot 13:40 ↑4k ↓371 R26k claude-opus-4-6" | ||
| [MessageMeta] → renderiza inline: "OpenSpace 13:40 ↑4k ↓371 R26k claude-opus-4-6" | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ## 6. Referencia de arquivos | ||
|
|
||
| | Arquivo | Responsabilidade | | ||
| | ------------------------------------------------------------------------------ | ---------------------------------------- | | ||
| | `ui/src/ui/chat/grouped-render.ts` | Control UI — extrai e renderiza metadata | | ||
| | `ui/src/styles/chat/grouped.css` | Control UI — estilos `.msg-meta__*` | | ||
| | `apps/electron-desktop/renderer/src/store/slices/chat/chat-types.ts` | Tipos `UiMessageUsage`, `UiMessage` | | ||
| | `apps/electron-desktop/renderer/src/store/slices/chat/chat-utils.ts` | Parser `parseHistoryMessages()` | | ||
| | `apps/electron-desktop/renderer/src/ui/chat/components/MessageMeta.tsx` | Componente de metadata inline | | ||
| | `apps/electron-desktop/renderer/src/ui/chat/components/MessageMeta.module.css` | Estilos do MessageMeta | | ||
| | `apps/electron-desktop/renderer/src/ui/chat/components/ChatMessageList.tsx` | Integracao do MessageMeta nas mensagens | | ||
| | Arquivo | Responsabilidade | | ||
| | ---------------------------------------------------------------- | ---------------------------------------- | | ||
| | `ui/src/ui/chat/grouped-render.ts` | Control UI — extrai e renderiza metadata | | ||
| | `ui/src/styles/chat/grouped.css` | Control UI — estilos `.msg-meta__*` | | ||
| | `desktop/renderer/src/store/slices/chat/chat-types.ts` | Tipos `UiMessageUsage`, `UiMessage` | | ||
| | `desktop/renderer/src/store/slices/chat/chat-utils.ts` | Parser `parseHistoryMessages()` | | ||
| | `desktop/renderer/src/ui/chat/components/MessageMeta.tsx` | Componente de metadata inline | | ||
| | `desktop/renderer/src/ui/chat/components/MessageMeta.module.css` | Estilos do MessageMeta | | ||
| | `desktop/renderer/src/ui/chat/components/ChatMessageList.tsx` | Integracao do MessageMeta nas mensagens | | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The new Windows installer path is only tested on release tags.
Line 14 still hardcodes
verifytomacos-latest, and Line 54 only runs--mac zip, while Line 77 introduces the Windows NSIS target only in the tag-gatedreleasematrix. That makes av*tag the first time the Windows packaging path runs, so NSIS/path/signing regressions can land onmainunnoticed and fail only during release.💡 Suggested smoke-build matrix for
verifyverify: if: github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/v') - runs-on: macos-latest + strategy: + fail-fast: false + matrix: + include: + - os: macos-latest + smoke_args: --mac zip + artifact_name: openspace-smoke-mac + - os: windows-latest + smoke_args: --win nsis + artifact_name: openspace-smoke-win + runs-on: ${{ matrix.os }} @@ - name: Package smoke build env: CSC_IDENTITY_AUTO_DISCOVERY: false - run: cd desktop && npx electron-builder --publish never --mac zip + run: cd desktop && npx electron-builder --publish never ${{ matrix.smoke_args }} @@ - name: Upload smoke artifacts uses: actions/upload-artifact@v4 with: - name: openspace-smoke-mac-${{ github.sha }} + name: ${{ matrix.artifact_name }}-${{ github.sha }}Also applies to: 51-55, 69-79
🤖 Prompt for AI Agents