| 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: re-land CONTRIBUTORS.md, which never reached main (#444) | 1 天前 |
| blog: stop wide tables from dragging the whole page sideways on phones The engine table carries npm commands like `npm install -g --ignore-scripts @earendil-works/pi-coding-agent`. Those have no break points, so the table's min-content width was wider than a phone, and a bare table widens the document rather than clipping. That is why the sticky masthead was cut off mid-way across: the page itself had become 900px wide and everything centred inside it went with it. Every markdown table now renders inside its own scroll box, so the overflow stays in the table instead of leaking into the document. On phones the table sizes to its content and scrolls; on desktop it fills the column as before. Measured at a real 390px viewport: scrollWidth now equals clientWidth. Applies to every post with a table, not just this one. Also shortened the docs column labels. "github.com/charmbracelet/crush" was mostly host name and it was the widest thing in the row. 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 天前 |
| Merge pull request #440 from chaitanyagiri/feat/remote-model-catalog feat(models): ship a model without shipping a build, and add Fable 5.1 / GPT-6 Astra / Gemini 3.7 Flash Conflicted with #384 in CHANGELOG.md only, at the top of ### Added where both sides append. No source conflict. Resolved by keeping all three entries: #384's 'Tasks show their id' first, then this PR's two. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EmZGHZkLeKXWxrFVPmUPxW | 5 小时前 |
| 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 个月前 |
| docs(contributors): land the 28 the workflow generated but could not push CONTRIBUTORS.md said 38 people and contained none of the v050 wave. A contributor had to write in and ask why he was not on it (#218, AmIrRX0), and he was right to. The generator was never the problem. It ran on the merges and produced the correct file; the push was rejected, because a bot pushing straight at main carries no status checks and main requires three: remote: error: GH006: Protected branch update failed for refs/heads/main. remote: - 3 of 3 required status checks are expected. So this is that same regeneration, run by hand and pushed the way the wave was. 38 people -> 52. Nobody who was already listed was dropped. All 20 authors from the wave now appear, AmIrRX0 and wckleinhenz among them. Two prose changes, both in the generator rather than the .md, because a hand edit to the .md is wiped by the next run: - Added a paragraph under the avatar strip. Those avatars come from GitHub's contributors graph, which keys on commit author email, so five people in this wave are missing from it: two used a work address they can still attach to their account, and two used a .local machine name that can never be attached because GitHub cannot verify a fake domain. The paragraph says so plainly and says this table is the list to go by. - Softened one existing sentence. It claimed the file 'regenerates whenever a pull request merges', which is the exact promise that just failed in public. It now says it is regenerated from merged pull requests, which is true either way and does not depend on the push path being unblocked. Not fixed here, deliberately: the workflow still cannot push to a protected main. That is a branch protection decision and it is the founder's to make. No history was rewritten and no commit's authorship was touched. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EmZGHZkLeKXWxrFVPmUPxW | 5 小时前 |
| 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 个月前 |
| Merge pull request #440 from chaitanyagiri/feat/remote-model-catalog feat(models): ship a model without shipping a build, and add Fable 5.1 / GPT-6 Astra / Gemini 3.7 Flash Conflicted with #384 in CHANGELOG.md only, at the top of ### Added where both sides append. No source conflict. Resolved by keeping all three entries: #384's 'Tasks show their id' first, then this PR's two. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EmZGHZkLeKXWxrFVPmUPxW | 5 小时前 |
| Merge pull request #440 from chaitanyagiri/feat/remote-model-catalog feat(models): ship a model without shipping a build, and add Fable 5.1 / GPT-6 Astra / Gemini 3.7 Flash Conflicted with #384 in CHANGELOG.md only, at the top of ### Added where both sides append. No source conflict. Resolved by keeping all three entries: #384's 'Tasks show their id' first, then this PR's two. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EmZGHZkLeKXWxrFVPmUPxW | 5 小时前 |
| 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 天前 |
| chore: make GitHub read our license, our language and our OS field correctly (#418) | 4 天前 |
| Merge pull request #440 from chaitanyagiri/feat/remote-model-catalog feat(models): ship a model without shipping a build, and add Fable 5.1 / GPT-6 Astra / Gemini 3.7 Flash Conflicted with #384 in CHANGELOG.md only, at the top of ### Added where both sides append. No source conflict. Resolved by keeping all three entries: #384's 'Tasks show their id' first, then this PR's two. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EmZGHZkLeKXWxrFVPmUPxW | 5 小时前 |
| ui fixes and add landing page | 3 个月前 |
| docs: make the README sell the product and move the codebase map into docs/ (#419) The README opened with a table of contents and then explained the architecture, the project structure and the design system. That is contributor documentation sitting in the one document whose job is converting a visitor, and it pushed what a visitor actually wants below the fold. - Download comes first. "Getting started" opened with git clone and npm run dev, which tells a visitor to build from source when we ship signed installers. There is now a download call to action under the hero and a "Download the app" section ahead of "Build from source". - Supported agents are visible. We support twelve CLIs plus custom and that is the whole differentiator, but it was only ever stated in prose. It is now a linked chip row near the top. - A feature wall, built entirely from screenshots and demo clips already in the repo. No new product assets. - Architecture, project structure and design system move to docs/ARCHITECTURE.md with their relative links repointed and checked. The README keeps a summary and a pointer. - A downloads badge, and a contributors grid beside a link to the good first issue queue. CONTRIBUTING gains a "Before you start" section: the cross-platform, path, provider-neutral and no-local-assumption constraints that most PRs trip over, stated up front as help rather than only afterwards as reasons for closure. "What gets a PR closed" keeps its content and becomes "Where the bar is". It also now asks contributors to run their own coding agent over their PR and paste what it found, which is on brand for a project that ships an agent harness. The PR template gains an optional X handle beside the Discord one. The contributor-role workflow greps /Discord:\s*[A-Za-z0-9._]+/ from the body, so that line is kept verbatim and the regex was re-checked against a filled-in template. CODEOWNERS routes review automatically instead of waiting for someone to notice a PR, with tighter rules on release, licensing and security paths. Claude-Session: https://claude.ai/code/session_01YXP55KwQAmAyP9Zr6hsKfx Co-authored-by: Claude Opus 5 <noreply@anthropic.com> | 4 天前 |
| docs(contributors): land the 28 the workflow generated but could not push CONTRIBUTORS.md said 38 people and contained none of the v050 wave. A contributor had to write in and ask why he was not on it (#218, AmIrRX0), and he was right to. The generator was never the problem. It ran on the merges and produced the correct file; the push was rejected, because a bot pushing straight at main carries no status checks and main requires three: remote: error: GH006: Protected branch update failed for refs/heads/main. remote: - 3 of 3 required status checks are expected. So this is that same regeneration, run by hand and pushed the way the wave was. 38 people -> 52. Nobody who was already listed was dropped. All 20 authors from the wave now appear, AmIrRX0 and wckleinhenz among them. Two prose changes, both in the generator rather than the .md, because a hand edit to the .md is wiped by the next run: - Added a paragraph under the avatar strip. Those avatars come from GitHub's contributors graph, which keys on commit author email, so five people in this wave are missing from it: two used a work address they can still attach to their account, and two used a .local machine name that can never be attached because GitHub cannot verify a fake domain. The paragraph says so plainly and says this table is the list to go by. - Softened one existing sentence. It claimed the file 'regenerates whenever a pull request merges', which is the exact promise that just failed in public. It now says it is regenerated from merged pull requests, which is true either way and does not depend on the push path being unblocked. Not fixed here, deliberately: the workflow still cannot push to a protected main. That is a branch protection decision and it is the founder's to make. No history was rewritten and no commit's authorship was touched. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EmZGHZkLeKXWxrFVPmUPxW | 5 小时前 |
| 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 个月前 |
| chore: make GitHub read our license, our language and our OS field correctly (#418) | 4 天前 |
| chore: make GitHub read our license, our language and our OS field correctly (#418) | 4 天前 |
| 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 个月前 |
| docs: re-land CONTRIBUTORS.md, which never reached main (#444) | 1 天前 |
| 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 | 11 天前 |
| 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 | 11 天前 |
| 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(deps): finish the lock repair with CI's own npm (10.8.2), not mine (11) My first repair was generated with npm 11 under node 26 and still left CI red on the identical error. npm 11 does not write a nested entry that npm 10 insists on, so 'npm ci --dry-run' passed here and failed on the runner. Regenerated with npx npm@10.8.2, the version the workflow actually uses. Adds 23 lines, deletes none. The casualty was one entry #433's regenerated lock dropped that has nothing to do with the packaging bump: node_modules/@openai/agents-core/node_modules/ws at 8.21.3 — literally the 'Missing: ws@8.21.3' npm was naming. The lock's ws set now matches pre-wave ad8dc7f2 exactly. npm@10.8.2 ci --dry-run resolves 836 packages. Advisories unchanged from the first repair, so #433's claim still holds: critical 1 -> 0, high 26 -> 7, total 32 -> 9 against pre-wave. Lesson for the next lockfile fix: validate with the npm the workflow pins, not whichever npm is on the machine. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EmZGHZkLeKXWxrFVPmUPxW | 5 小时前 |
| fix(deps): clear the critical tar advisory without a breaking upgrade `main` reports 30 npm advisories, one of them critical: `tar`, reached through electron-builder@25 -> app-builder-lib -> builder-util. npm's own remediation for the full set is `npm audit fix --force`, which bumps electron to 44 and vite to 8 and downgrades localtunnel to 1.8.3. That combination leaves the app unable to start: electron-vite@5 does not accept vite@8, so the main bundle is emitted as ESM `index.mjs` while package.json#main still points at `index.js`. It also breaks the native better-sqlite3 build against Electron 44's V8 and removes the main-process clipboard API the terminal paste path depends on. See #432. This takes the non-breaking half only: electron-builder@26 and @electron/rebuild@4 (which drop the critical) plus `npm audit fix` for the advisories that resolve without a major bump. Electron stays on 32, vite stays on 5, localtunnel stays on the safe ^2.0.2, and no source changes are needed. 30 advisories -> 7. The 7 that remain are build-time only and each needs one of the deferred majors, tracked in #432. Refs #432 | 3 天前 |
| 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 个月前 |