Skip to content

feat: CI/CD infrastructure — nightly builds, platform configs, release automation#25

Closed
lngdao wants to merge 69 commits intoOpen-ACP:developfrom
lngdao:develop
Closed

feat: CI/CD infrastructure — nightly builds, platform configs, release automation#25
lngdao wants to merge 69 commits intoOpen-ACP:developfrom
lngdao:develop

Conversation

@lngdao
Copy link
Copy Markdown
Contributor

@lngdao lngdao commented Apr 6, 2026

Summary

Note: This PR includes commits from previous PRs (#22, #23, #24) that were already merged to upstream. The actual new changes are the CI/CD infrastructure items listed below.

New in this PR

  • Fix Windows MSI build — WiX version encoding YY.M.(DD*100+N) keeps all components within limits
  • Platform-specific Tauri configs — macOS (dmg), Windows (nsis + WebView2 bootstrapper), Linux (deb + appimage)
  • Nightly build channel — cron Mon-Fri 2AM GMT+7, commit gate (skip if no new commits), separate app identity via set-channel.sh
  • Release-drafter — auto-generated release notes from PR labels
  • Cargo release profile — fat LTO, size opt, strip symbols (~30-50% smaller binaries)
  • macOS code signing prep — opt-in via APPLE_* secrets, no code changes needed when ready
  • Auto-updater — signing keypair, GitHub releases endpoint, toast notification UI
  • Tauri backend refactor — modular src/core/ architecture (sidecar, keychain, onboarding, filesystem)
  • Makefilemake dev, make build, make release, etc.
  • release.sh — now syncs version to both package.json and Cargo.toml
  • Issue templates — bug report, feature request, PR template
  • README rewrite — badges, download table, make targets, architecture overview

Files changed (new work only)

Area Files
CI/CD release.yml, nightly.yml, release-drafter.yml
Tauri config tauri.conf.json, tauri.{macos,windows,linux}.conf.json
Scripts scripts/release.sh, scripts/set-channel.sh
Build Makefile, Cargo.toml (release profile)
Templates .github/ISSUE_TEMPLATE/, pull_request_template.md, release-drafter.yml
Docs README.md, .claude/CLAUDE.md
Updater tauri.conf.json (pubkey), use-app-updater.ts, update-notification.tsx
Backend src-tauri/src/core/ restructure

Test plan

  • pnpm build passes
  • pnpm tauri dev launches correctly
  • make release-dry shows correct version
  • Windows CI no longer fails with WiX version error

lngdao and others added 30 commits April 5, 2026 18:43
- Cursor-controlled markdown rendering: 1-3 words per tick with
  randomized delay (5-15ms) for natural typing rhythm
- React.memo on all message/block components with custom comparator
  on MessageTurn — only streaming message re-renders
- Batched Immer store updates: single setStore call per flush
- Markdown throttled to periodic parse+morphdom, no per-frame re-parse
- Auto-scroll: increased threshold (120px), always track position,
  double-rAF for reliable session-switch scroll, scrollTrigger on send
- Removed sticky user message wrapper
- Removed usePacedValue from streaming path (was causing double render)
- Settings accessible via gear icon in sidebar rail
- General: language selector, workspace path display
- Agents: full list from CLI (installed + available), search, install
  with live output, uninstall button, ANSI stripping
- Appearance: theme toggle (dark/light/system), font size (S/M/L)
- Server: connection status and address display
- About: version, GitHub/docs links, check for updates
- Persistence via tauri-plugin-store
- Theme and font size applied on mount via CSS custom properties
- AgentSelector: PATCH /sessions/:id on explicit agent change,
  config auto-refreshes after switch, re-fetch on popover open
- Install agent button (+) in popover opens Settings > Agents page
- Rust: run_openacp_agents_list and run_openacp_agent_install accept
  workspace_dir param, pass --dir to CLI for correct instance context
- Composer wires sessionID, onSwitched, onInstallAgent to selector
- Send channel='sse' when creating sessions (required after server
  commit f45dc49 changed headless session behavior)
- Reset streaming=false on SSE disconnect to prevent stuck UI
- Settings panel rendered inside WorkspaceProvider for agent access
- Listen for open-settings custom event to navigate directly to page
- Sidebar rail gear icon wired to settings toggle
- Install 19 shadcn components (button, badge, input, dialog, tabs, command, sidebar, etc.)
- Replace raw HTML primitives with shadcn across 15 app components
- Replace createPortal dropdowns with DropdownMenu in agent/config selectors
- Replace manual modals with Dialog in plugins-modal and add-workspace
- Add sidebar token aliases to theme.css + Tailwind colors
- Fix all lucide-react imports to @phosphor-icons/react
- Add vite aliases for shadcn component resolution
- CLAUDE.md: React 19, shadcn/ui, git workflow, design reference section
- DESIGN.md: full rewrite with current architecture, tokens, components
- Add shadcn migration spec and implementation plan
- Regenerate icon.ico (285KB, 4 sizes RGBA) from IconKitchen source
- Apply circular mask to Android round icons (all 5 densities)
- Regen all platform icons from IconKitchen (macOS icns, iOS, Windows)
- Remove dead deps: lucide-react, next-themes, cmdk, sonner
- Delete unused shadcn components: checkbox, progress, sonner, command, sidebar, use-mobile (~1500 lines)
- Strip "use client" directives (meaningless in Tauri)
- Delete ~30KB dead CSS: colors.css, animations.css, unused utilities
- Gitignore generated Pencil PNGs (~14MB)
Phase 1: Invert aliases in theme.css — shadcn tokens are now source of
truth with direct values, legacy tokens become backward-compat aliases.
Added extension tokens: --border-weak, --foreground-weak, --foreground-weaker.

Phase 2: Migrate 27 app component files from legacy token classes
(bg-background-base, text-text-strong, etc.) to shadcn naming
(bg-background, text-foreground, etc.). Updated var() references in
styles.css and components.css.

Phase 3 (deferred): Remove legacy backward-compat aliases from theme.css.
Phase 3: Remove all backward-compat aliases from theme.css. Migrate
remaining inline var() references in 14 files (tsx + css) to shadcn
tokens. Update syntax tokens and tailwind/colors.css registrations to
reference shadcn tokens directly. Zero legacy token references remain.
- Fix root font-size: move data-font-size from html to body (preserve
  rem=16px for Tailwind, Radix portals inherit font-size)
- Rename text utility classes: text-12-* → text-sm-*, text-14-* → text-md-*,
  text-16-* → text-lg-*, text-20-* → text-xl-*, text-11/10-* → text-2xs-*
- Rewrite utilities.css with @apply + Tailwind theme() references
- Remove duplicate token definitions from theme.css (spacing, breakpoints,
  containers, radius — now only in tailwind/index.css @theme)
- Remove legacy font-size/weight/line-height/letter-spacing CSS vars
- Define font-size scale in rem (text-2xs through text-3xl)
- Fix --color-text-base collision with Tailwind text-base utility
- Add cursor-pointer to Button component
- Fix dark mode --primary-foreground contrast (#171717 vs #ededed)
Standalone showcase page for components and tokens, accessible at
http://localhost:1420/ds-demo.html. Flat sidebar with grouped navigation,
live component previews, code snippets, props tables, and token pages
(colors, typography, spacing, shadows, radius). Dark/light toggle.

- ds-demo.html entry point + src/ds-demo/ (app, sidebar, component-page,
  token-page, registry with 18 entries)
- Vite multi-page config (rollupOptions.input)
- Reuses existing shadcn components and theme tokens
Styles restructure:
- Flatten tailwind/ subfolder into single index.css entry point
- Merge styles.css (.oac-*) into components.css
- Delete base.css (Tailwind Preflight handles CSS reset)
- Delete 2 orphaned CSS files (src/styles.css, src/platform/styles.css)
- Add tailwindcss/preflight.css import
- Consolidate @theme blocks + color registrations into index.css
- Move Tauri drag-region rules to index.css
- Final structure: index.css, theme.css, components.css, utilities.css

Button migrations (8 raw buttons → shadcn Button):
- settings-about: "Check for updates" → Button outline
- settings-agents: Install/Uninstall → Button ghost
- settings-panel: close icon → Button ghost icon
- plugins-modal: close × → Button ghost icon
- add-workspace: close × → Button ghost icon
- permission-request: option button → Button ghost
- user-message: copy button → Button ghost icon-xs

Dialog improvements:
- Border: border-border-weak (softer in dark mode)
- Shadow: Apple-style layered shadow
- Close button: shadcn Button ghost icon
- Title: text-lg-medium utility

Font-size scaling: revert to html root (UI zoom behavior)
Dialog:
- Border: border-border-weak, rounded-xl, shadow-lg
- Close button: XIcon + Button ghost icon-md
- Overlay: bg-black/40 + backdrop-blur-sm
- Header gap-1, title text-lg-medium
- Add/Plugins modals: migrate to DialogHeader/DialogTitle components

Tabs:
- Line variant: h-10 (40px), underline bg-foreground
- Override h-auto removed in favor of explicit h-10

Button:
- Rename icon → icon-md for consistent naming (icon-xs/sm/md/lg)
- icon-lg: SVG size-5 (20px) for proportional scaling
- Sidebar buttons: icon-lg

Shadows:
- Remove custom shadow-xs/md/lg from theme.css, use Tailwind defaults
- Re-register shadow scale in @theme (cleared by --*: initial)
- Keep shadow-border tokens (specialized)

Styles:
- Remove --*: initial color reset (allow Tailwind default colors)
- Inline font-family into @theme, remove from theme.css
- Remove custom shadow definitions, use Tailwind defaults
- Dropdown/Select: border-border-weak + rounded-xl
lngdao and others added 27 commits April 6, 2026 11:37
- Replace custom toast with sonner (close button, stacking, animations)
- Tool card IN/OUT body toggles with AnimatePresence height animation
- Add chevron indicator on tool card title for expand/collapse
- Toast on workspace "Copy path" action
…g split

- Copy button on assistant messages next to usage bar
- Thinking blocks render with Markdown + syntax highlighting (muted style)
- Tool title rebuilds on tool_update when rawInput arrives (fixes Read file name)
- Parse tool name prefix for kind resolution (e.g. "Read package.json" → kind=read)
- Thinking blocks split only when tool/text blocks intervene, not on every tool_call
…er error messages

- Context menu: Start server (stopped), Stop server (connected), Remove stops first
- Clone workspace auto-starts server after creation
- New workspace supports onSetup callback for onboarding flow
- invoke_cli includes stdout in error messages when stderr is empty
- Create new workspace opens SetupModal (agent selection + start)
- Clone workspace auto-starts server after creation
- Setup wizard uses invoke_cli instead of sidecar for server start
- Agent install updates local state immediately (no reload needed)
- dev_reset uses find_openacp_binary for reliable binary removal
- Onboard startup logging for debug
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…cation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: CI/CD infrastructure — nightly builds, platform configs, release automation
# Conflicts:
#	.github/workflows/release.yml
#	src-tauri/src/core/onboarding/setup.rs
#	src-tauri/src/lib.rs
#	src/openacp/app.tsx
@lngdao lngdao changed the title feat: CI/CD infrastructure, UI overhaul, workspace lifecycle, auto-updater feat: CI/CD infrastructure — nightly builds, platform configs, release automation Apr 6, 2026
@lngdao
Copy link
Copy Markdown
Contributor Author

lngdao commented Apr 6, 2026

Closing to squash commits — will reopen with clean history

@lngdao lngdao closed this Apr 6, 2026
Sign up for free to 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.

2 participants