feat(install): native installers (.pkg + .exe) replacing curl-pipe scripts#78
Merged
Conversation
## 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
This was referenced 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
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 free
to 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
Brings in proper native installers for macOS and Windows — replacing the curl-pipe scripts I added in #75.
macOS (`installer/macos/`):
Windows (`installer/windows/`):
Tooling: `scripts/build-installer-icons.mjs` programmatically generates platform icons from source — no manual icon babysitting.
Why this over the curl-pipe scripts
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