Skip to content

feat(install): native installers (.pkg + .exe) replacing curl-pipe scripts#78

Merged
UmarFarooq75 merged 6 commits into
devfrom
installers
May 7, 2026
Merged

feat(install): native installers (.pkg + .exe) replacing curl-pipe scripts#78
UmarFarooq75 merged 6 commits into
devfrom
installers

Conversation

@UmarFarooq75
Copy link
Copy Markdown
Collaborator

Summary

Brings in proper native installers for macOS and Windows — replacing the curl-pipe scripts I added in #75.

macOS (`installer/macos/`):

  • Pre-built `Daemora.app` template with a real 309 KB `.icns` icon
  • Companion `Stop Daemora.app`
  • `build-pkg.sh` produces a signed `.pkg` installer
  • `preinstall` / `postinstall` scripts handle the installation properly
  • Native "open the .pkg, click Continue, done" experience

Windows (`installer/windows/`):

  • Inno Setup script (`daemora.iss`)
  • Pre-built `DaemoraSetup.exe` (2 MB)
  • `launcher.ps1` with the right launcher behavior
  • Real `.ico` icon

Tooling: `scripts/build-installer-icons.mjs` programmatically generates platform icons from source — no manual icon babysitting.

Why this over the curl-pipe scripts

  • Real native UX (no terminal commands, no `curl | bash`)
  • No sudo-in-non-TTY problems, no `Daemora.app` creation failing silently
  • Real signed installer bits → no Gatekeeper friction
  • Icon, code-signing, version metadata all baked in
  • Win10/11 native experience via Inno Setup

Action item after merge

Delete the now-redundant curl-pipe scripts on `dev`:

The installers branch was based on `main` (before #75 merged into dev), so those files won't conflict — they'll just remain after the merge. A follow-up commit deletes them.

Test plan

  • macOS: open the generated `.pkg`, complete the wizard, confirm `Daemora.app` lands in /Applications with the icon, double-click launches the dashboard
  • Windows: run `DaemoraSetup.exe`, complete the wizard, confirm Start Menu + Desktop shortcuts with icon, double-click launches dashboard
  • Stop `Daemora.app` (macOS) cleanly stops the running agent
  • Uninstaller cleanly removes the app on both platforms

UmarFarooq75 and others added 6 commits May 1, 2026 04:40
## Summary

Replaces #70 (closed mistakenly + dev was force-pushed; GitHub blocked
reopen).

- Full TypeScript rewrite of daemora
- Removed \`.github/workflows/ci.yml\` (no auto-CI on push/PR)
- Removed \`.github/dependabot.yml\` (stops the auto-PR flood that
dumped 17 PRs)
- \`publish.yml\`: \`npm ci --legacy-peer-deps\` to resolve
\`ollama-ai-provider-v2\` vs \`zod\` peer-dep mismatch

Merged with \`-s ours\` so dev's TS tree is preserved entirely while
main is recorded as a parent — that's why GitHub now lets the PR open.
Merging via UI is safe.

## Test plan
- [ ] Merge into main
- [ ] Confirm Actions tab shows no CI runs on push
- [ ] Confirm \`Publish to npm\` (manual) is the only workflow available
- [ ] Trigger \`Publish to npm\` workflow → verify \`npm ci
--legacy-peer-deps\` resolves
## Summary

Fixes two runtime errors that surfaced after installing `daemora@alpha`
and bumps the version so the next Publish run repoints npm `latest` at
the alpha.

- **Voice (Groq TTS 404 \`model_not_found\`)** — default model was
\`playai-tts-english\`, which never existed (the legacy id was
\`playai-tts\`) and \`playai-tts\` itself was sunset by Groq on
2025-12-23. Replaced default with \`canopylabs/orpheus-v1-english\` and
default voice \`troy\` (Orpheus accepts only \`[autumn, diana, hannah,
austin, daniel, troy]\`). Cleaned dead PlayAI entries out of
\`GroqTTS.ts\` sample-rate / voice maps. Updated the model picker in
\`providers.ts\` to expose Orpheus English + Arabic.
- **Server (EADDRINUSE on \`daemora start\`)** — if the configured port
(default 8081) is in use, the server now binds to port 0 (OS-assigned
random) instead of crashing. The actual bound port is read back from
\`server.address()\` and threaded through \`tunnel.start\`, the banner
URL, and \`autoOpen\` so the URL the user sees matches reality.
- **Version** — bumped \`package.json\` to \`1.0.0-alpha.2\`.
\`publish.yml\` already promotes whatever it publishes to the npm
\`latest\` dist-tag, so re-running the Publish workflow on \`main\`
after this merge will make plain \`npm install daemora\` resolve to the
alpha (currently \`latest\` still points at the old JS
\`2026.1.2-beta.2\`).

## Test plan

- [x] Merge to \`main\`
- [x] Run **Publish to npm** workflow with \`branch=main\`
- [x] Verify \`npm view daemora dist-tags\` shows \`latest:
1.0.0-alpha.2\`
- [x] \`npm install -g daemora\` (no \`@alpha\`) → \`daemora version\`
prints \`1.0.0-alpha.2\`
- [x] \`daemora start\` while another process holds 8081 → server binds
to a random port and prints a working URL
- [x] Voice worker starts → no \`Groq TTS 404 model_not_found\`; TTS
speaks via Orpheus
…, robustness fixes (#73)

## Summary
- Rewrote all 29 crew prompts to one generic SOUL-style skeleton
(identity, scope, how-you-work, required Skills/Planning/Final-reply,
hard rules). Strong domain content preserved where it existed; tone
unified.
- Removed the redundant \`assistant\` crew (gmail-crew +
google-calendar-crew already cover it). Added \`planning\` skill to
every remaining crew.
- \`use_crew\` is now a full delegation contract: required \`crew\`,
\`task\`, \`context\`, \`constraints\`, \`successCriteria\`; optional
\`references[]\`. Same trim on \`parallel_crew\`. \`maxSteps\` removed
from both — internal step ceiling bumped 15 → 60.
- \`CrewAgentRunner\`: rich-field XML formatting into the user message,
**forced-summary retry** for empty \`text:\"\"\` returns (capped to 2
steps), **per-step pino logging** for tool-call / tool-result /
finish-step.
- Browser viewport: pinned Playwright MCP to 1920×1080 (was rendering
half-screen at 1280×720). Legacy \`mcp.json\` entries are migrated on
next start.
- \`execute_command\`: validate \`cwd\` exists before spawn (stops
misleading \`spawn /bin/zsh ENOENT\` shell-shopping loops).
- \`text_to_speech\`: read \`TTS_VOICE\` setting (caller arg → setting →
provider default), full OpenAI + Groq Orpheus voice catalogs in
description, auto-fallback when invalid for the active provider.
- \`video-editor\`: single-dir convention
\`data/video-editor/<task-slug>/\`. Recipe-style commands stripped —
Remotion how-to lives in the skill. New shared asset library under
\`crew/video-editor/template/public/\` (logo, brand image, music tracks,
SFX, two 3D scenes) — crew checks here FIRST before generating.
- \`SOUL.md\`: new "Delegation default" section (orchestrate, don't
execute) + updated \`useCrew\` docs for the new contract.
- Version bump: \`1.0.0-alpha.2\` → \`1.0.0-alpha.3\`.

## Test plan
- [ ] \`npx tsc --noEmit\` clean
- [ ] \`npm run build\` clean
- [ ] All 29 \`crew/*/plugin.json\` files parse (verified locally)
- [ ] Delegate a non-trivial task to a crew via \`use_crew\` with the
new contract — confirm it returns a non-empty plain-text summary
- [ ] Force a crew to hit the step ceiling — confirm forced-summary
retry kicks in instead of returning \`text:\"\"\`
- [ ] Restart the server with an existing \`mcp.json\` — confirm the
playwright entry gets \`--viewport-size\` injected and the browser opens
full-screen
- [ ] Run \`execute_command\` with a non-existent \`cwd\` — confirm
clear \`cwd does not exist\` error instead of \`spawn /bin/zsh ENOENT\`
- [ ] Run \`text_to_speech\` with no \`voice\` while \`TTS_VOICE=Troy\`
and Groq Orpheus is the provider — confirm Troy is used
- [ ] Delegate a video task — confirm the crew lists
\`crew/video-editor/template/public/\` first and reuses an existing
asset where applicable
- New Gallery feature: user creates named projects, uploads files, agent reads them
  via the always-on `list_gallery_projects` tool. Crews receive context auto-injected
  through `references: [{ kind: "gallery", value: "<slug>" }]` — no extra tool call.
- Image uploads auto-described into per-file `*.md` filers via background scan queue
  (concurrency 2, recovers pending scans on startup).
- Vision provider chain extracted into helpers (Vertex / Google / OpenAI / Anthropic).
  New `IMAGE_SCAN_MODEL` setting + Gallery-page dropdown lets the user pick any
  configured provider:model; empty falls back to `DEFAULT_MODEL` then auto-chain.
- File-only storage at `data/file-projects/<slug>/`, no DB tables. Atomic JSON
  writes, slug-based identity, semantic file rename without changing on-disk path.
- SOUL.md updated so the main agent calls `list_gallery_projects` proactively when
  the user references a brand/project or asks for derivative work.
- UI uses the project's custom `AlertDialog` (no native `confirm()`).
- Tests: 26 vitest cases covering store CRUD, slugify, MIME inference, formatters,
  reference parsing, pendingScans recovery.
- Bundles a few unrelated touch-ups already on the working tree (browser-pilot
  plugin manifest, MCP defaults, Playwright profile) since they're trivial and
  ship together cleanly.

Bumps version to 1.0.0-alpha.4.
## Summary
- New **Gallery** feature: users curate named projects of reference
assets (logos, brand kits, scripts, screenshots). The main agent calls
`list_gallery_projects` (always-on tool) to load every project's
purpose, file paths, and image filers in one shot. Crews receive the
same context auto-injected via `references: [{ kind: "gallery", value:
"<slug>" }]`.
- Uploaded images are auto-described into per-file `*.md` filers by a
background scan queue (concurrency 2, recovers pending scans on
startup).
- New **Scanner Model** dropdown on the Gallery page (matches the Crew
member picker) — pick any configured `provider:model` for image
analysis, default = main agent's model. Backed by a new
`IMAGE_SCAN_MODEL` setting; empty falls through to `DEFAULT_MODEL`, then
to the legacy Vertex/OpenAI/Anthropic auto-chain.
- File-only storage at `data/file-projects/<slug>/` (no DB tables),
atomic JSON writes, semantic rename without changing on-disk paths,
custom `AlertDialog` for delete confirms.
- SOUL.md spells out when the agent should call `list_gallery_projects`
proactively (user mentions a brand / asks for derivative work / names a
slug).

Bundles a few unrelated trivial touch-ups already in the tree
(browser-pilot plugin manifest, MCP defaults, Playwright profile).

Bumps version: `1.0.0-alpha.3` → `1.0.0-alpha.4`.

## Test plan
- [x] `npx tsc --noEmit` clean (backend + ui)
- [x] `npx vitest run tests/files.smoke.test.ts` — 26 / 26 pass
- [x] Manual: create gallery project, upload image, verify auto-scan +
filer
- [x] Manual: change Scanner Model dropdown, upload another image,
confirm filer frontmatter records the chosen `provider:model`
- [x] Manual: ask the main agent "use my <project> brand for X", verify
it calls `list_gallery_projects` and pulls the right files
- [x] Manual: delegate to a crew with `references: [{ kind: "gallery",
value: "<slug>" }]`, confirm crew sees the manifest
@UmarFarooq75 UmarFarooq75 merged commit 54cd586 into dev May 7, 2026
UmarFarooq75 added a commit that referenced this pull request May 7, 2026
## Summary
Promotes the installer + safety changes from \`dev\` to \`main\`.

What lands:

- **PR #78** \`feat(install): native installers (.pkg + .exe)\` — proper
macOS \`.pkg\` builder + Windows Inno Setup \`.exe\` with real icons.
Replaces the curl-pipe scripts as the recommended path for non-technical
users.
- **PR #77** \`feat(mcp): disable Playwright MCP by default\` — browser
tools become opt-in. Main agent and browser-pilot crew don't see
\`browser_*\` tools until the user enables Playwright in MCP settings.
- **PR #75** + follow-up fixes \`1cf856f\` and \`f61032a\` — the
original curl-pipe scripts plus the two patches I pushed during testing
(osascript GUI password prompt for non-TTY sudo; Unicode ellipses
replaced with ASCII so \`set -u\` doesn't choke).

After merge, the README's
\`raw.githubusercontent.com/.../main/scripts/install.sh\` URL resolves
and the legacy curl-pipe path keeps working alongside the new native
installers. Future cleanup (deleting the curl-pipe scripts since the
native installers are the recommended path) can be a follow-up commit.

## Test plan
- [ ] After merge, build the macOS \`.pkg\` from
\`installer/macos/build-pkg.sh\`, run on a clean Mac, confirm app
installs and dashboard opens
- [ ] Run \`installer/windows/Output/DaemoraSetup.exe\` on a clean
Windows box, confirm same
- [ ] Confirm browser tools are absent from main agent's tool list on a
fresh install (PR #77 default)
- [ ] Verify
\`https://raw.githubusercontent.com/CodeAndCanvasLabs/Daemora/main/scripts/install.sh\`
resolves
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