| blog: Pressroom redesign with hand-drawn heroes on every post The blog gets its own identity, separate from the marketing site (Reddit feedback: the mono/neo-brutalist skin was unreadable for long-form and the content read as AI-written): - Pressroom theme (default): editorial magazine on the app palette — cream paper, ink-900, accent-yellow CTAs, per-topic colors from DESIGN.md accent tokens, Fraunces/Source Serif 4/Space Grotesk, drop caps, no red anywhere. A second theme (Sunroom) remains available via BLOG_THEME=sunroom. - Every post now has a hero illustration, drawn as code: yellow Xiaohei character (from Ian's MIT-licensed ian-xiaohei-illustrations skill, adapted to the brand), SVG + displacement-filter wobble, rendered at 1600x900. Sources in blog/media-src (scene-lib.js: parts + 16 archetypes; spec.js: per-post composition + annotations; render.html?slug=X to regenerate). - One media manifest (src/_data/media.json) drives heroes, inline figures, and YouTube embeds, each with status placeholder|ready; designed topic- tinted placeholders render until an asset is ready. - YouTube shortcode: click-to-load thumbnail → youtube-nocookie iframe; empty id renders a "video on its way" placeholder. - generate-images.mjs kept as an optional image-model pipeline. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> | 18 天前 |
| docs(release): finish the 0.4.6 notes, add the CHANGELOG section, wire the link checker Folds in everything the re-diff of RELEASE.md turned up before the tag: - docs versions: docs/index.html's download-fallback `var REL` and its schema.org softwareVersion, and docs/llms.txt's "Current version", were still 0.4.5 — tools/check-release-links.cjs flagged both (RELEASE.md's own asset links were already fixed). All at 0.4.6 now; `npm run check:links` is green. - PR count: corrected to 15 community pull requests (my earlier 16 counted the Arabic PR #213, which landed by re-implementation, not as a merge — two independent counts agree at 15). The 16th is credited explicitly in the Thanks. - CHANGELOG: added a [0.4.6] section. RELEASE.md points readers at the CHANGELOG twice and its Thanks list referenced it; the file had no 0.4.6 entry at all. The [Unreleased] items move into it, plus the release's features and the community-PR credit list (matching the count). - Wired the guard so this class cannot reach a tag again: check:links runs in CI on release/** branches, and RELEASE-CHECKLIST.md gains a "before the tag" checkbox for it. The tool existed and was referenced by nothing. The blob/main CHANGELOG links are left as they are: v0.4.5/0.4.4/0.4.3 are all ancestors of main, so this release merges back to main after the tag like every prior one, and those links resolve on that delay. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| blog: rewrite the install guide for non-technical readers, with 14 real screenshots The old post assumed you already lived in a terminal. This one starts from "what is a coding agent and how does it reach my computer", then walks a provider decision tree (Antigravity and OpenCode free, Codex if you pay for ChatGPT, Claude Code if you pay for Claude), and says plainly that the engine install is the only time a terminal is involved. Every screenshot is a real capture, not a mockup: a throwaway Electron instance with its own --user-data-dir, driven over CDP, so the onboarding runs from scratch. Six onboarding screens, the floor, add-agent, triggers, schedules, settings and focus mode. The hero is now the first onboarding screen rather than a drawn illustration. The URL is unchanged, so the existing SEO stays where it is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXP55KwQAmAyP9Zr6hsKfx | 10 天前 |
| chore(release): 0.4.6 Turns the 0.4.7-rc rehearsal line into the shippable 0.4.6. Four things merged (feat/telemetry-message-count #343, fix/release-drop-white-screen #344, feat/arabic-ui-rtl-213 #345, and the command-name validation hardening), the version bumped 0.4.7-rc.2 -> 0.4.6 (package.json + lock; __APP_VERSION__ and the model-catalog gating both follow pkg.version, and no model has a numeric version gate so visibility is unchanged), and both note surfaces rewritten for the whole 0.4.5 -> 0.4.6 story: - build/release-notes.md (the update toast, baked into latest*.yml via releaseInfo.releaseNotesFile): 5 bullets, 267/280 chars, none clipped. - RELEASE.md (the GitHub release body): a new "What's new in 0.4.6" section, 0.4.5 demoted to "Still new in 0.4.5", and the stale 0.4.4 drop deck replaced with a clean 0.4.6 drop that uses the framework's own styling and self-hosted fonts — no remote fetch, so the drop-loader/font fix in this release protects it. The (v0.4.7) activation-funnel comments are corrected to (v0.4.6) since the funnel ships in this release. Suite 745/745, both typechecks clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| readme + site: lead with the badges and the floor, and make the blog reachable on phones README: the header was a 340px logo followed by a banner that repeated the logo, the name and the tagline back at you. Now it is a smaller logo, the name, the GitHub Trending and Product Hunt badges, and a screenshot of the actual floor. There is no official GitHub Trending badge, so this one is drawn to the Product Hunt badge's geometry and shipped as a 2x PNG rather than an SVG, which keeps it identical through GitHub's image proxy. "working prototype" is gone from the badge and from CONTRIBUTING's intro. People are running this on real work; pre-release is the honest word. Site: nothing sits under the final Download button any more. The mobile nav hides its text links under 800px, which left the footer as the only way to find the blog, so there is now a small blog strip under the provider grid that never renders on desktop. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXP55KwQAmAyP9Zr6hsKfx | 10 天前 |
| feat(integrations): append first-wave YC templates to canonical registry Inline the 7 first-wave templates (Linear, Jira, Notion, Stripe, Confluence, Sentry, HubSpot) directly into INTEGRATION_TEMPLATES in src/shared/integrations.ts, using Jim's canonical IntegrationTemplate type + authType enum. Remove the standalone src/shared/integrationTemplates.ts and its competing interface — one type, one enum, one registry. authType mapping (canonical enum only, nothing invented): - bearer: Notion, Stripe, Sentry, HubSpot - header (Authorization, verbatim key): Linear - header (Authorization, pre-encoded "Basic base64(email:token)"): Jira, Confluence Gmail / Google Calendar / Salesforce NOT registered: they need OAuth and the enum has no oauth2 (v1 non-goal, spec §8). Researched + documented under "Pending: OAuth broker" in hive/docs/integration-templates.md; flagged to god for the enum decision. Verified: typecheck:node + typecheck:web exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> | 2 个月前 |
| fix(landing): fix landing page preview | 3 个月前 |
| chore(vde): add VDE prototype + reference doc dumps prototypes/vde/ — standalone VDE prototype (4 files, no deps), tied to the in-flight VDE feature. docs/r/{claudeai,claudecode}.json — reference data dumps used for docs/answer grounding. Neither is imported by app source; committed so the working tree is clean and the artifacts are versioned. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KS75kUmWPxUytGCzv1v5BQ | 2 个月前 |
| feat(skills): temporal date-range skills + worker capability catalog (P3) Bundle read-only temporal-awareness skills for spawned workers and a capability catalog the worker reads at boot. Temporal skills (resources/skills/) ride the existing copyBundledSkills → $AGENT_DIR/.claude/skills/ mechanism — no spawn wiring needed: - temporal/when.mjs — single date-math resolver. Resolves named windows to concrete ISO ranges relative to the worker's run time (new Date() at invoke); pure Node stdlib, no writes, no network. Emits inclusive civil dates + half-open [startUtc, endExclusiveUtc) instants, days, tz, asOf. Handles today/yesterday, this|last Week/Month/Quarter/Year, last7|30|90Days, last12Months, generic lastN{days,weeks,months}, and ytd/qtd/mtd/wtd aliases. - 12 named per-window skills (/today, /yesterday, /thisWeek, /lastWeek, /last7Days, /last30Days, /thisMonth, /lastMonth, /thisQuarter, /lastQuarter, /thisYear, /lastYear) — thin wrappers calling the shared resolver. - temporal/SKILL.md — /temporal resolver doc (full window list + arbitrary ranges). capabilities/SKILL.md — the per-worker capability catalog (invokable as /capabilities): env vars/workspace, the temporal skills, and external integrations reached via the loopback broker (referenced generically), with exact call syntax and the read-only/no-remote-push boundaries. index.ts: worker dispatch suffix now points the worker at /capabilities at boot (add-only instruction text). typecheck:node + typecheck:web both EXIT 0. Resolver + end-to-end worker-path invocation verified. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> | 2 个月前 |
| fix(release-drop): kill the render-blocking remote font fetch (a) A release drop paints NOTHING until its stylesheets resolve, and the frame carried two remote font fetches: an app-injected Google Fonts <link> in every drop, and whatever @import an author wrote (the current RELEASE.md has one). On a network where fonts.googleapis.com is blocked — China — that fetch does not fail, it hangs to a TCP timeout, so the first thing a user sees on a new version is a blank paper rectangle for tens of seconds. This is the same render-blocking Google Fonts fetch the app itself removed for launch; the drop still did it. Three independent parts, so no single one is load-bearing: - The CSP can no longer permit a remote stylesheet or font. `style-src` drops `https:` (authored `<style>` still works via 'unsafe-inline'); `font-src` is `data:` only. A remote @import is now DENIED, and a denied import fails FAST and the frame paints immediately in the fallback, instead of hanging. - The design fonts are self-hosted as `data:` URIs (the same Inter + JetBrains Mono woff2 the app ships), so nothing legitimate needs the network and the drop keeps its typography with zero fetches. Inter answers the drop's --font-sans (its declared Geist substitute); JetBrains Mono is exact. - stripActiveContent drops an authored REMOTE @import outright, so the frame never even attempts it and no CSP-violation is logged. The regex consumes the whole statement including url-internal `;` (a font url is `wght@400;500;600`), which a naive `[^;]*` would truncate; a `data:` import is left alone. Proven, not asserted: rendered in a real sandboxed frame with the font host pointed at a non-routable IP (the honest simulation of a firewall DROP), the old build is a blank paper frame at 1.5s while this one is fully painted at the same instant, heading in self-hosted JetBrains Mono and body in self-hosted Inter. RELEASE.md is untouched — this makes ANY authored drop safe, not just the current one. Tests mutation-checked. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| seo: add on-site metadata — JSON-LD, robots.txt, sitemap.xml, meta polish Additive, head-only on-site SEO per god sign-off (conversation munder-blog-seo): - docs/index.html <head>: trimmed meta description to <=155, added twitter:title/twitter:description, blog RSS <link rel=alternate>, and SoftwareApplication + Organization + WebSite JSON-LD (operatingSystem: macOS, Windows, Linux). Page structure/content untouched. - docs/robots.txt: allow all + explicit AI crawlers (GPTBot, PerplexityBot, ClaudeBot, OAI-SearchBot, Google-Extended) for AEO; Sitemap directive. - docs/sitemap.xml: home + blog index + about/topics + 3 live blog posts. - seo/SEO_METADATA.md: platform claim -> macOS, Windows, Linux (sign-off); marked on-site edits applied. Branch work only; nothing pushed/deployed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> | 3 个月前 |
| chore(release): 0.4.6 Turns the 0.4.7-rc rehearsal line into the shippable 0.4.6. Four things merged (feat/telemetry-message-count #343, fix/release-drop-white-screen #344, feat/arabic-ui-rtl-213 #345, and the command-name validation hardening), the version bumped 0.4.7-rc.2 -> 0.4.6 (package.json + lock; __APP_VERSION__ and the model-catalog gating both follow pkg.version, and no model has a numeric version gate so visibility is unchanged), and both note surfaces rewritten for the whole 0.4.5 -> 0.4.6 story: - build/release-notes.md (the update toast, baked into latest*.yml via releaseInfo.releaseNotesFile): 5 bullets, 267/280 chars, none clipped. - RELEASE.md (the GitHub release body): a new "What's new in 0.4.6" section, 0.4.5 demoted to "Still new in 0.4.5", and the stale 0.4.4 drop deck replaced with a clean 0.4.6 drop that uses the framework's own styling and self-hosted fonts — no remote fetch, so the drop-loader/font fix in this release protects it. The (v0.4.7) activation-funnel comments are corrected to (v0.4.6) since the funnel ships in this release. Suite 745/745, both typechecks clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| merge: feat/arabic-ui-rtl-213 (PR #345) into 0.4.6 | 10 天前 |
| fix(brand): draw the Dock icon full bleed so the silhouette stops reading as debris The macOS icon showed two dark tabs hard against the left and right of the tile — reported, fairly, as "the edge of someone else's head." They are Michael's OWN outermost silhouette columns: the far edge of the hair (sprite rows 3-11) and the outer shoulder (rows 19-24), with the face between them. Nothing foreign, and nothing wrong with the sprite. The cause was the framing. make-logo emits two: `mark` at full bleed for the site and README, and `icon` with a 112/1024 margin for the .icns. That margin put a band of brand yellow between the tile edge and the figure, and the gap is what isolated those columns into floating tabs. Same pixels, different frame — which is why docs/logo.svg always looked right and only the Dock icon did not. FRAMES.icon is now 0. Not a single sprite pixel is cropped: cropping the outer columns was tried first and was wrong, because it cut away real hair and shoulder. docs/logo.* are byte-identical after this change, which is the proof that framing was the whole problem. Also fixes ROOT, which was pinned to a different clone — running the generator from this repo would have read that repo's sprite and written its assets. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> | 19 天前 |
| blog: Pressroom redesign with hand-drawn heroes on every post The blog gets its own identity, separate from the marketing site (Reddit feedback: the mono/neo-brutalist skin was unreadable for long-form and the content read as AI-written): - Pressroom theme (default): editorial magazine on the app palette — cream paper, ink-900, accent-yellow CTAs, per-topic colors from DESIGN.md accent tokens, Fraunces/Source Serif 4/Space Grotesk, drop caps, no red anywhere. A second theme (Sunroom) remains available via BLOG_THEME=sunroom. - Every post now has a hero illustration, drawn as code: yellow Xiaohei character (from Ian's MIT-licensed ian-xiaohei-illustrations skill, adapted to the brand), SVG + displacement-filter wobble, rendered at 1600x900. Sources in blog/media-src (scene-lib.js: parts + 16 archetypes; spec.js: per-post composition + annotations; render.html?slug=X to regenerate). - One media manifest (src/_data/media.json) drives heroes, inline figures, and YouTube embeds, each with status placeholder|ready; designed topic- tinted placeholders render until an asset is ready. - YouTube shortcode: click-to-load thumbnail → youtube-nocookie iframe; empty id renders a "video on its way" placeholder. - generate-images.mjs kept as an optional image-model pipeline. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> | 18 天前 |
| docs(release): settle the community-PR count at 16, per the merged-or-re-implemented rule The count is 16 community pull requests from 13 contributors: 15 merged plus #213 (Arabic, @abo123v-glitch), whose work is in the shipping build by re-implementation rather than a merge. Counting the re-implemented one is the honest call — the contributor has code in the release and no merge to show for it — so it is credited like the rest, with the re-implementation stated plainly. Reverts an intermediate change to 15 (a merge-only count that erased #213). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| ui fixes and add landing page | 3 个月前 |
| chore(contributing): before/after evidence is mandatory, and enforced We are taking more pull requests than we can review carefully, and the ones that cost the most are the ones where the description says what the author intended and nothing shows what actually changed. Reviewing those means building the branch to find out. So evidence is now a rule rather than a request. Every PR shows a before and an after, as images or video, under their own headings in the description. The new `PR evidence` workflow reads the two headings separately and fails the PR when either is empty, so two shots dumped under one heading do not pass — a reviewer has to be able to tell which is which. Worth being honest about the limit: nothing on GitHub can stop a PR being OPENED. There is no pre-creation hook. So the check does the strongest thing available instead — it fails within seconds, blocks the merge button once the branch rule requires it, and posts a comment naming exactly what is missing. It re-runs on description edits, so the fix loop is immediate. `pull_request_target` is deliberate: contributions come from forks, where a `pull_request` job gets a read-only token and could never post that comment. That trigger is only safe because this job never checks out or executes the PR's code — it reads the body and the labels from the API and nothing else. The file says so at the top, because the day someone adds a build step there is the day a fork gets write access. `no-visual-change` is the only way out, and only a maintainer can apply it, so the rule stays mandatory for the people it is aimed at and every waiver is on the record. Also here: - Issue forms require a screenshot or recording. The bug form asked for a macOS version as a required field, which has been wrong since Windows and Linux started shipping; it is now an OS dropdown plus a version, and it asks which app version they are on. - CONTRIBUTING gains "What gets a PR closed", stating the bar plainly instead of leaving contributors to discover it in review. - Commit conventions now say what has bitten this project twice: a pushed commit message is public and permanent, and no later rewrite retracts it. | 15 天前 |
| docs: record the terminal and message-queue work The delivery rules that came out of this session live only in code comments and commit bodies, which is where nobody looks when the queue appears to stall. - docs/message-queue.md (new): names the two things both called "the queue" (the harness's own MD queue vs Claude Code's internal buffer), the single gate every automatic writer goes through, the four blocks and their half-hour expiries, why the prompt is READ from xterm's buffer rather than modelled from keystrokes, and the two standing rules — automation never erases the user's text and never closes the user's menu. - DESIGN.md: the status palette was missing waiting/compacting/looping; add those and the new `typing` token, and correct the PixelBadge status union. Note that labels read from the user's side ("your draft", not "typing"). - CHANGELOG.md: an Unreleased section for the fullscreen roster rail, the blank pane (three causes), the wedged queue (three causes), phantom drafts, the picker-ack data loss, and durable-field persistence. - README.md: a feature row for the queue and a pointer to the new doc. Docs only — no code changed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DUpadJJuEQz1zpQ6Vk83j3 | 1 个月前 |
| feat(hive): remove approval queue — native Claude Code HITL + Michael remote-control The floating APPROVALS panel was buggy (approve re-queued the item: resolveApproval re-routed the message and routeMessage re-flagged to:"human" back into approvals/). Per request, human-in-the-loop is now native to each agent's Claude Code session. - Delete ApprovalsPanel.tsx + its use/import in App.tsx - Remove IPC hive:approvals / hive:resolveApproval + preload bindings - hive.ts: drop approvals()/resolveApproval(), the approvals/ dir, and the needs_human escalation. to:"human"/to:"god" now resolve to the god (the human's proxy); hop-cap drops (logged) instead of escalating; targets self-filtered to guard a god→"human" self-loop. Update god system prompt + PROTOCOL_MD + header. - useHive.ts: on a fresh god spawn (not PTY restore), type /remote-control (best-effort) then an orientation prompt so Michael starts running the floor. - Update HIVE.md design doc to match. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> | 3 个月前 |
| docs: the art licence claims are true again — Modern Interiors is bought The founder purchased the LimeZu Complete Version licence for "Modern Interiors - RPG Tileset [16X16]" on 2026-08-20. Eight places across the repo and the website still told readers the art was non-commercial-only, including docs/terms.html, which is a legal-facing page. They now state the licence we actually hold. Two things the sweep turned up that were wrong independently of the purchase: The cast has not been recoloured from LimeZu sprites for some time — cast.ts says so in its own header — yet README, LICENSE, ATTRIBUTION.md, CONTRIBUTING.md and terms.html all still described the Office characters as derived works inheriting a LimeZu restriction. They are drawn procedurally in portraitArt.ts and carry no third-party licence at all. Saying otherwise understated what we own. And six of the ten licensed files were dead: "A2 Office Floors.png", "A4 Office Walls.png" and all four Adam/Alex/Amelia/Bob walk sheets, with zero references anywhere in the tree. Deleted. Four tilesets remain, all of them actually loaded by the maps. The Complete Version licence REQUIRES credit to LimeZu, which the old text never mentioned because the free tier did not demand it. That obligation is now written down in every file that could tempt someone to drop the acknowledgement. CONTRIBUTING.md was not on the list of places to fix; a whole-repo sweep found it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> | 17 天前 |
| docs(memory-graph): Phase 1 spec for hive memory graph viz Design-only deliverable for Command Center feature #8: nodes (agents + optional topic layer), edges (message links + bipartite agent↔topic), force-directed layout, SVG rendering (justified over Pixi), click-to-memory + hover-preview interactions, data from window.cth.hiveLog/hiveMemory. No component code yet — awaiting god sign-off before Phase 2. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> | 3 个月前 |
| readme + site: lead with the badges and the floor, and make the blog reachable on phones README: the header was a 340px logo followed by a banner that repeated the logo, the name and the tagline back at you. Now it is a smaller logo, the name, the GitHub Trending and Product Hunt badges, and a screenshot of the actual floor. There is no official GitHub Trending badge, so this one is drawn to the Product Hunt badge's geometry and shipped as a 2x PNG rather than an SVG, which keeps it identical through GitHub's image proxy. "working prototype" is gone from the badge and from CONTRIBUTING's intro. People are running this on real work; pre-release is the honest word. Site: nothing sits under the final Download button any more. The mobile nav hides its text links under 800px, which left the footer as the only way to find the blog, so there is now a small blog strip under the provider grid that never renders on desktop. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YXP55KwQAmAyP9Zr6hsKfx | 10 天前 |
| docs(release): finish the 0.4.6 notes, add the CHANGELOG section, wire the link checker Folds in everything the re-diff of RELEASE.md turned up before the tag: - docs versions: docs/index.html's download-fallback `var REL` and its schema.org softwareVersion, and docs/llms.txt's "Current version", were still 0.4.5 — tools/check-release-links.cjs flagged both (RELEASE.md's own asset links were already fixed). All at 0.4.6 now; `npm run check:links` is green. - PR count: corrected to 15 community pull requests (my earlier 16 counted the Arabic PR #213, which landed by re-implementation, not as a merge — two independent counts agree at 15). The 16th is credited explicitly in the Thanks. - CHANGELOG: added a [0.4.6] section. RELEASE.md points readers at the CHANGELOG twice and its Thanks list referenced it; the file had no 0.4.6 entry at all. The [Unreleased] items move into it, plus the release's features and the community-PR credit list (matching the count). - Wired the guard so this class cannot reach a tag again: check:links runs in CI on release/** branches, and RELEASE-CHECKLIST.md gains a "before the tag" checkbox for it. The tool existed and was referenced by nothing. The blob/main CHANGELOG links are left as they are: v0.4.5/0.4.4/0.4.3 are all ancestors of main, so this release merges back to main after the tag like every prior one, and those links resolve on that delay. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| docs(release): settle the community-PR count at 16, per the merged-or-re-implemented rule The count is 16 community pull requests from 13 contributors: 15 merged plus #213 (Arabic, @abo123v-glitch), whose work is in the shipping build by re-implementation rather than a merge. Counting the re-implemented one is the honest call — the contributor has code in the release and no merge to show for it — so it is credited like the rest, with the re-implementation stated plainly. Reverts an intermediate change to 15 (a merge-only count that erased #213). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| ui fixes and add landing page | 3 个月前 |
| ui fixes and add landing page | 3 个月前 |
| feat(telemetry): count human-sent messages, closing the activation funnel The funnel currently ends at agent_spawned, so an agent that was started and then never spoken to is indistinguishable from one in daily use. This adds `message_sent`: a COUNT of the messages a person sends to an agent, and nothing else. No content, in any shape. No text, no length, no character count, no first-N-characters, no hash of the body. The event has exactly one property, `surface`, and it is a closed enum. The IPC channel the renderer uses to report a message does not accept a message argument at all, so there is no shape in which the body could cross it by mistake. The separate question of whether content telemetry should ever exist is untouched and remains open. Counted at the SUBMIT, not the keystroke. `pty:write` fires on every character typed; instrumenting it would have produced a keystroke meter orders of magnitude above Ryan's 7.47-events-per-active-install-per-day baseline. The four surfaces are counted where a person actually sends: - terminal — terminalPool's submit boundary, once per input chunk. A bracketed paste is excluded, so a five-line paste is one message (the Enter that sends it) rather than six. - composer — inside MessageQueueComposer.queueIt, NOT inside the shared enqueueMessage store action, which also carries work orders, Slack inbound, nudges and compact commands. - steer — at the control:steer IPC handler, not inside control.steer(): closingTime and the voice action layer call that directly and neither is a person typing. - hive — at hive:send, gated on from === 'human', so agent-to-agent traffic is never counted. IME is inherited, not restated. The two renderer surfaces sit past the existing isComposingKey guard, so an Enter that picks a CJK candidate is not a submit and cannot inflate the count for the users the i18n work was for. The renderer may name only `terminal` and `composer`. `steer` and `hive` are counted in main at handlers that already receive them, so letting the renderer name those two would open a double-count. The event name is fixed main-side: the renderer chooses a surface, never an event. TELEMETRY.md is updated in the same commit, and a new test asserts that the allowlist in analytics.ts and the doc's event table name exactly the same events — so a third contradiction between published policy and behaviour fails the build instead of shipping. Tests cover the fails-open shape, not just the function: the IPC channel literal on both sides of the bridge, the surface literal at each call site, and the doc/code lockstep. Twelve mutations were checked and all twelve go red, each on its own test. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| fix(updater): bake the what's-new list into latest*.yml The update toast showed exactly one item: `{ box-sizing: border-box; }`. electron-updater only reads the release body from GitHub's releases.atom feed when the channel yml carries no releaseNotes (Provider.js parseUpdateInfo yaml-loads the file; GitHubProvider falls back to computeReleaseNotes over the feed when the field is null). That feed's `<content type="html">` is GitHub's RENDERED HTML of RELEASE.md, not its markdown: 53KB with zero `##` headings and 52 `<li>`s. So the digest never finds a what's-new section, falls back to scanning for bullets, and the only line in the whole document matching markdown bullet syntax is `* { box-sizing: border-box; }` from RELEASE.md's own <style> block, because `*` followed by a space IS a bullet. That CSS rule was the entire what's-new list. The fix has to be DATA, not code. The toast is rendered by the app that is already running, so a parser fix only ever reaches people who have already upgraded: the same delivery paradox as the updater itself. Someone on 0.4.4 being offered 0.4.6 needs the notes to already be correct in a field their existing build reads. releaseInfo.releaseNotesFile puts markdown directly into latest*.yml, and a present releaseNotes means the feed is never consulted at all. build/release-notes.md is written for the toast, not for the release page: four bullets, 233 of the 280-character budget, nothing clipped. RELEASE.md stays the release page and is untouched. Both new tests are mutation-checked. Adding a fifth bullet that overruns the budget turns the file test red; typoing the yml path turns the config test red. That second one matters because a bad path fails OPEN, silently handing the feed back its old job. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014dMe8Mm2eas1SwvUiu3XXr | 10 天前 |
| release(v0.4.2): anonymous usage analytics, done in the open The project had zero product visibility — no idea how many people launch the app or which features get used. This adds a minimal PostHog layer governed by a public contract (TELEMETRY.md) and enforced as a hard allowlist in code: - src/main/analytics.ts: anonymous events only ($process_person_profile false), random install UUID, per-event property allowlist, DO_NOT_TRACK respected, session-scoped feature dedup, bounded flush on will-quit. - Events: first_run, app_launched, agent_spawned (engine name only), feature_used (fixed enum), session_ended (coarse duration bucket). - Consent: "Share anonymous usage stats" on the final onboarding step + Settings → General toggle (telemetryEnabled, default on = opt-out), mirrored across main/preload/renderer config. - Build wiring: POSTHOG_KEY is injected only in release CI via electron-vite define — dev builds and forks compile with '' and the module no-ops (the client init is dead-code-eliminated entirely). - Site + blog: key-guarded, anonymous-only posthog-js loader (inert until a public key is set) with download_clicked capture on the landing page; REL fallback bumped to 0.4.2. - TELEMETRY.md linked from README; CHANGELOG + RELEASE.md updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> | 24 天前 |
| fix(focus mode): stop the close button dropping you to the sidebar, and reword the hiring setting Two things the founder found on the packaged build. Closing an agent from inside focus mode still fell back to the sidebar. The store fix was right and was being thrown away immediately after: onKill called archiveAgent, which re-homes focus to the next agent, then called setFullscreen(null) on the next line. The render-time guard did the same thing, and was calling setState during render on top of it, so it is now an effect that re-homes rather than a hard null. I had tracked this as a store bug and it was only half of one. Finding the store gap was correct, but I never checked the call site that overrides it. The hiring setting read as an on/off switch for a question that is really about who. It now says "Who can add agents" with "only me" or "me and Michael", and the supporting line explains what each choice costs. | 15 天前 |
| chore(release): 0.4.6 Turns the 0.4.7-rc rehearsal line into the shippable 0.4.6. Four things merged (feat/telemetry-message-count #343, fix/release-drop-white-screen #344, feat/arabic-ui-rtl-213 #345, and the command-name validation hardening), the version bumped 0.4.7-rc.2 -> 0.4.6 (package.json + lock; __APP_VERSION__ and the model-catalog gating both follow pkg.version, and no model has a numeric version gate so visibility is unchanged), and both note surfaces rewritten for the whole 0.4.5 -> 0.4.6 story: - build/release-notes.md (the update toast, baked into latest*.yml via releaseInfo.releaseNotesFile): 5 bullets, 267/280 chars, none clipped. - RELEASE.md (the GitHub release body): a new "What's new in 0.4.6" section, 0.4.5 demoted to "Still new in 0.4.5", and the stale 0.4.4 drop deck replaced with a clean 0.4.6 drop that uses the framework's own styling and self-hosted fonts — no remote fetch, so the drop-loader/font fix in this release protects it. The (v0.4.7) activation-funnel comments are corrected to (v0.4.6) since the funnel ships in this release. Suite 745/745, both typechecks clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| chore(release): 0.4.6 Turns the 0.4.7-rc rehearsal line into the shippable 0.4.6. Four things merged (feat/telemetry-message-count #343, fix/release-drop-white-screen #344, feat/arabic-ui-rtl-213 #345, and the command-name validation hardening), the version bumped 0.4.7-rc.2 -> 0.4.6 (package.json + lock; __APP_VERSION__ and the model-catalog gating both follow pkg.version, and no model has a numeric version gate so visibility is unchanged), and both note surfaces rewritten for the whole 0.4.5 -> 0.4.6 story: - build/release-notes.md (the update toast, baked into latest*.yml via releaseInfo.releaseNotesFile): 5 bullets, 267/280 chars, none clipped. - RELEASE.md (the GitHub release body): a new "What's new in 0.4.6" section, 0.4.5 demoted to "Still new in 0.4.5", and the stale 0.4.4 drop deck replaced with a clean 0.4.6 drop that uses the framework's own styling and self-hosted fonts — no remote fetch, so the drop-loader/font fix in this release protects it. The (v0.4.7) activation-funnel comments are corrected to (v0.4.6) since the funnel ships in this release. Suite 745/745, both typechecks clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LDbmAwrgtGskFGCRkYZBx4 | 10 天前 |
| inception | 3 个月前 |
| feat(v0.2.0): Command Center overhaul, token budgets, fleet monitoring + UX fixes Command Center (Michael's god view): - Fold Fleet live telemetry into the Floor AGENTS cards; remove the Fleet tab (delete FleetGrid). - Per-agent meter shows TOKENS vs a budget (was $ vs the priciest agent, which pinned the top spender to a meaningless 100%); scales to a per-agent limit, else the floor token budget, else a 1M default. New per-agent token-limit control (top-right of each card). - Settings budget is now a token budget (costCapTokens); the breaker enforces floor + per-agent token caps (costCapTokens / agentTokenCaps). - Activity tab: drop USAGE + CI STATUS (redundant); keep the event log + board. - "floor" tab renamed to "monitor". - Fixes: settings re-seed from disk on reopen (no longer blank); numeric labels use the mono font (Pixelify Sans rendered 5 like 8); token sparkline hides when flat, shows live rate when active. Orchestrator awareness: - Live fleet snapshot <hive>/fleet.json (gitignored) written every 8s from telemetry+registry+breaker — Michael's source of truth for sibling agents (claude agents can't see them). - Decouple the breaker/cost-ledger beat from the optional heartbeat (own 30s timer) so guardrails work by default. - COMMANDS.md + the Commands tab share one web-verified source (src/shared/claudeCommands.ts). - Refresh system prompts (injectedPrompt/identity/PROTOCOL.md/orientation) with breaker, token budgets, tasks.json, and fleet.json monitoring; kept prompt-cache-invariant (volatile-free). Folded in from @Gulum's PRs (kept the light terminal default): - #27 (#24): deliver multi-line messages via bracketed paste — no more line-by-line chopping. - #28 (#25): composer drafts survive agent switches; visible caret on dark-mode OS (color-scheme: light). - #26 (#23): terminal WebGL renderer (fixes VT323 glyph shearing / cursor drift) + copy/paste (Ctrl/Cmd+C/V, right-click) + app:readClipboard. Dropped the dark-default flip, global theme sync, and the contrast regression. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-Authored-By: Gulum <gulum@rismer.de> | 2 个月前 |
| feat(v0.2.0): Command Center overhaul, token budgets, fleet monitoring + UX fixes Command Center (Michael's god view): - Fold Fleet live telemetry into the Floor AGENTS cards; remove the Fleet tab (delete FleetGrid). - Per-agent meter shows TOKENS vs a budget (was $ vs the priciest agent, which pinned the top spender to a meaningless 100%); scales to a per-agent limit, else the floor token budget, else a 1M default. New per-agent token-limit control (top-right of each card). - Settings budget is now a token budget (costCapTokens); the breaker enforces floor + per-agent token caps (costCapTokens / agentTokenCaps). - Activity tab: drop USAGE + CI STATUS (redundant); keep the event log + board. - "floor" tab renamed to "monitor". - Fixes: settings re-seed from disk on reopen (no longer blank); numeric labels use the mono font (Pixelify Sans rendered 5 like 8); token sparkline hides when flat, shows live rate when active. Orchestrator awareness: - Live fleet snapshot <hive>/fleet.json (gitignored) written every 8s from telemetry+registry+breaker — Michael's source of truth for sibling agents (claude agents can't see them). - Decouple the breaker/cost-ledger beat from the optional heartbeat (own 30s timer) so guardrails work by default. - COMMANDS.md + the Commands tab share one web-verified source (src/shared/claudeCommands.ts). - Refresh system prompts (injectedPrompt/identity/PROTOCOL.md/orientation) with breaker, token budgets, tasks.json, and fleet.json monitoring; kept prompt-cache-invariant (volatile-free). Folded in from @Gulum's PRs (kept the light terminal default): - #27 (#24): deliver multi-line messages via bracketed paste — no more line-by-line chopping. - #28 (#25): composer drafts survive agent switches; visible caret on dark-mode OS (color-scheme: light). - #26 (#23): terminal WebGL renderer (fixes VT323 glyph shearing / cursor drift) + copy/paste (Ctrl/Cmd+C/V, right-click) + app:readClipboard. Dropped the dark-default flip, global theme sync, and the contrast regression. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-Authored-By: Gulum <gulum@rismer.de> | 2 个月前 |