Commit Graph

1394 Commits

Author SHA1 Message Date
emdashbot[bot] 3c99225d80 ci: release (#2544)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@emdash-cms/admin@0.35.0 @emdash-cms/auth-atproto@0.2.35 @emdash-cms/auth@0.35.0 @emdash-cms/blocks@0.35.0 @emdash-cms/cloudflare@0.35.0 @emdash-cms/gutenberg-to-portable-text@0.35.0 @emdash-cms/plugin-embeds@0.1.43 @emdash-cms/sandbox-workerd@0.5.1 @emdash-cms/x402@0.35.0 create-emdash@0.35.0 emdash@0.35.0
2026-08-24 15:11:54 +01:00
Matt Kane 353ff4fd2e fix(bot): report oversized review payloads (#2593) 2026-08-21 15:23:33 +00:00
Matt Kane 3baee3eeaa fix(bot): make lifecycle commands state-aware (#2591)
* fix(bot): make lifecycle commands state-aware

* fix(bot): name classified command in feedback
2026-08-21 14:37:02 +00:00
Matt Kane 3a0d2b4ec5 chore(bot): use template for generated PRs (#2585)
* chore(bot): use template for generated PRs

* fix(bot): tolerate PR template wording changes
2026-08-21 09:45:14 +00:00
Matt Kane 2932960c97 chore(bot): redesign public dashboard (#2587) 2026-08-21 10:26:24 +01:00
Matt Kane 2cb792b747 chore(bot): link playground previews (#2580) 2026-08-20 11:11:38 +01:00
Matt Kane 47d25295aa chore(playground): enable preview URLs (#2579) 2026-08-20 09:01:16 +00:00
Matt Kane 9de7c3ee40 fix(bot): harden delivery, resume, and local runs (#2568)
* fix(bot): route PR lifecycle to originating issue

* test(bot): cover top-level PR comment routing

* fix(bot): harden local and resumed runs

* fix(bot): poll long bootstrap commands

* fix(bot): inspect compressed candidate pushes

* fix(bot): truncate long work plan summaries

* fix(bot): allow shallow candidate pushes
2026-08-20 09:52:42 +01:00
Matt Kane ac197967f8 test(e2e): validate image optimization output (#2578) 2026-08-20 09:25:35 +01:00
Matt Kane ade23cdc9b test(core): stabilize migration signal cleanup (#2569) 2026-08-19 19:26:04 +00:00
Matt Kane 275cb3ab77 fix(bot): make workspace setup and candidate publication reliable (#2567)
* fix(bot): use baked Node headers for native builds

* fix(bot): authenticate candidate pushes through proxy

* test(bot): allow slower git publication under load
2026-08-19 17:33:52 +00:00
emdashbot[bot] 2cf999fd37 chore: extract locale catalogs [skip ci] 2026-08-19 16:19:12 +00:00
Noah (Nguyen Pham) ffaadc4170 feat(admin): add direct multi-file media uploads (#2553)
* feat(admin): make media uploads abortable

* feat(admin): add direct multi-file media uploads

* fix(admin): refine media upload dialog

* docs: format media upload specification

* docs: simplify media upload guidance

* test(admin): follow media upload dialog flow

* test(admin): remove review-specific comment

* Update packages/admin/src/components/MediaUploadDialog.tsx

Co-authored-by: emdashbot[bot] <273199577+emdashbot[bot]@users.noreply.github.com>

* style(admin): align media drop icon color

* fix(admin): align local media upload types

* docs: correct media upload file types

* chore: mark media upload as minor

---------

Co-authored-by: emdashbot[bot] <273199577+emdashbot[bot]@users.noreply.github.com>
2026-08-19 17:17:17 +01:00
Matt Kane 98cfca99a2 fix(bot): simplify candidate publication (#2564) 2026-08-19 17:09:22 +01:00
Matt Kane aa6d3c94f3 fix(bot): retry transient workspace bootstrap failures (#2563) 2026-08-19 16:14:43 +01:00
Matt Kane c2e9033bad feat(bot): bootstrap agent workspaces in harness (#2562)
* feat(bot): bootstrap agent workspaces in harness

* fix(bot): align bootstrap timeout ceilings
2026-08-19 13:56:55 +00:00
Matt Kane 2c30503159 fix: persist read-replica bookmark when a request becomes authenticated (#2552)
The request-scoped db commit() persisted the D1/DO Sessions bookmark
cookie only when isAuthenticated was true — but that flag is captured
before the route runs. Login, signup, and invite-acceptance requests
start unauthenticated and create the Astro session mid-request, so
their bookmark was discarded. The follow-up authenticated request then
read a nearest replica with no bookmark constraint and could miss the
just-created user row (auth middleware getUserById), bouncing the
brand-new user back to login.

The middleware now passes an endedAuthenticated() thunk, evaluated at
commit() time, that scans the OUTGOING cookie jar for astro-session:
Astro's session.set() writes the cookie synchronously, so a session
created during the request is visible there. Only outgoing cookies
count — falling back to the request's own Cookie header would let an
anonymous render carrying a stale session cookie overwrite a fresher
bookmark with a lagging replica's (and set a needless cookie).

Both bookmark adapters (D1, DO-SQL) honour the new signal; Hyperdrive
has no bookmark state and is unchanged.
2026-08-19 14:34:57 +01:00
Matt Kane ce562c0fee fix: ignore generated migration manifests in templates (#2557)
* fix: ignore generated migration manifests in templates

* docs: ignore generated migration manifests

* docs: clarify managed migration release note

* docs: expand managed migration release note

* docs: make migration release note actionable

* docs: make migration workflow human-first

* docs: simplify migration commands
2026-08-19 13:31:17 +00:00
Matt Kane 36dbc6ddff feat(bot): expose public run traces (#2560)
* feat(bot): expose public run traces

* fix(bot): bound run trace state
2026-08-19 13:18:37 +01:00
Matt Kane c67f814ee4 docs(changesets): treat entries as changelog documentation (#2559) 2026-08-19 13:07:02 +01:00
Matt Kane 35100fcfe0 feat(bot): project per-run work plans (#2555)
* feat(bot): project per-run work plans

* fix(bot): finalize cancelled run comments
2026-08-19 09:34:20 +00:00
Matt Kane 79db88b200 feat(bot): expose issue and run lifecycles (#2551) 2026-08-19 07:23:35 +00:00
Matt Kane c601bf762d fix(bot): recover from stale verification (#2550) 2026-08-19 06:49:49 +00:00
Matt Kane b05834eab9 docs: correct AGENTS.md secrets guidance to match #2140 (#2549)
The Environment section still taught the import.meta.env fallback chain
as the 'secrets pattern'. Since #2140, secrets are read from process.env
only — import.meta.env is statically inlined at build time, which bakes
build-machine values into the bundle and shadows runtime secrets. The
fallback chain remains correct for public build-time config, so the line
is split rather than removed.
2026-08-19 07:05:23 +01:00
Matt Kane 4d364cca96 fix(bot): preserve publication bytes and retry modes (#2545) 2026-08-18 22:04:02 +01:00
Matt Kane e7978d3da8 Document deployment-managed core migrations (#2440)
* docs: add deployment migration workflow

* docs: correct deployment migration guidance

* docs: address migration review follow-ups
2026-08-18 16:16:34 +01:00
Matt Kane 340743b3e9 Add Cloudflare deployment migration executors (#2439)
* feat(cloudflare): add D1 migration executor

* feat(cloudflare): add Hyperdrive migration executor

* fix(cloudflare): bound D1 error redaction

* test(cloudflare): cover D1 migration apply
2026-08-18 16:16:33 +01:00
Matt Kane 0aa1bc84a3 Add emdash migrate command (#2438)
* feat(core): add deployment migrate command

* fix(core): validate migration executor reports

* docs(core): remove stale CLI inventory
2026-08-18 16:16:33 +01:00
Matt Kane 34336e1570 Add deployment-managed core migration primitives (#2437)
* feat(core): add deployment migration primitives

* feat(core): add runtime migration policy

* feat(core): add direct migration adapters

* feat(core): emit deployment migration manifests

* fix(core): close active migration executors

* fix(core): preserve migration reports after cleanup

* fix: keep migration response core-only

* fix: block empty manual migration databases

* test(core): avoid pinning migration hash output
2026-08-18 16:16:32 +01:00
Matt Kane b927e0fdac feat(bot): add public workbench dashboard (#2543) 2026-08-18 15:07:52 +00:00
Matt Kane 12fe2a7d52 fix(bot): harden candidate publication (#2542) 2026-08-18 14:54:14 +00:00
emdashbot[bot] 4c3edadeec ci: release (#2419)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@emdash-cms/admin@0.34.0 @emdash-cms/auth-atproto@0.2.34 @emdash-cms/auth@0.34.0 @emdash-cms/blocks@0.34.0 @emdash-cms/cloudflare@0.34.0 @emdash-cms/gutenberg-to-portable-text@0.34.0 @emdash-cms/plugin-cli@0.8.1 @emdash-cms/plugin-embeds@0.1.42 @emdash-cms/plugin-forms@0.2.5 @emdash-cms/sandbox-workerd@0.5.0 @emdash-cms/x402@0.34.0 create-emdash@0.34.0 emdash@0.34.0
2026-08-18 13:26:49 +01:00
Matt Kane 470a62cd0c ci: adopt Worker Previews for playground (#2533) 2026-08-18 12:38:31 +01:00
Matt Kane f1ab3f93aa fix(bot): make verification efficient and recoverable (#2537)
* fix(bot): focus implementation verification

* fix(bot): keep verification commands stable

* fix(bot): prevent verification history wedges
2026-08-18 12:22:47 +01:00
Armand Philippot eba44f7c63 i18n(fr): translate in French the 89 missing keys (#2464)
* i18n(fr): translate in French the 89 missing keys

* example.com

Co-authored-by: emdashbot[bot] <273199577+emdashbot[bot]@users.noreply.github.com>

---------

Co-authored-by: emdashbot[bot] <273199577+emdashbot[bot]@users.noreply.github.com>
Co-authored-by: Matt Kane <mkane@cloudflare.com>
2026-08-18 10:00:02 +01:00
helio-cf ef32567fd5 fix(core): generate row types for repeater fields (#2469)
* fix(core): generate row types for repeater fields

`fieldTypeToTypeScript` had no `repeater` case, so every repeater field
fell through to `default: return "unknown"` -- while the zod side derives
a precise row schema from the same `validation.subFields` metadata.

This was an oversight rather than a decision. The emitter's switch,
including its deliberate `case "json": return "unknown"`, dates from
43fcb9a1 and predates the field type: #111 added `repeater` without
touching this file at all, so neither the zod case nor the TS case
arrived with the feature. #2458 then added the zod case and left the TS
side as it was. Type generation is now the only consumer of `subFields`
that discards it -- media-usage extraction and the admin field editor
both read it.

Consumers cannot index or iterate `unknown`, so they declare row shapes
by hand and cast to them. Those casts silence the compiler: when a
sub-field is renamed or retyped, the generated type stays `unknown`, the
cast keeps asserting the old shape, and the drift surfaces as a silently
blank render rather than a type error.

- Build an inline row type from `subFields`, reusing the existing
  per-type mapping so a `select` sub-field enumerates its options and an
  `image` sub-field emits the same media literal as a top-level image.
- Type a sub-field that is not required as `T | null`, since
  `generateRepeaterRowSchema` applies `.nullish()` to it. A bare `T`
  would trade an honest `unknown` for an unsound type.
- Keep emitting `unknown` when `subFields` is absent or empty. A repeater
  with no declared rows is schema-valid, and `{}[]` would be falsely
  permissive.

`fieldTypeToTypeScript` now takes a structural subset of `Field` so a
sub-field can reuse the mapping without a type assertion.

Sub-field slugs match `/^[a-z][a-z0-9_]*$/`, so they are valid bare
identifiers and need no quoting in the emitted literal.

* fix(core): emit valid repeater row types from unvalidated sub-fields

Quote member names, keep the last declaration of a duplicated slug, and
fall back to `unknown` when `subFields` is not an array.

---------

Co-authored-by: Matt Kane <mkane@cloudflare.com>
2026-08-18 08:49:14 +00:00
Matt Kane a07b4a5379 fix(bot): summarize and resume timed-out runs (#2536)
* fix(bot): preserve timed-out runs for resume

* fix(bot): recover rejected resume dispatches

* fix(bot): dedupe resumed deliveries atomically

* fix(bot): confirm resumed agent callbacks
2026-08-18 08:57:28 +01:00
emdashbot[bot] d328bdd6a6 chore: extract locale catalogs [skip ci] 2026-08-18 07:20:38 +00:00
Frank Bartolitsch f8a4fcefd2 fix(taxonomies): respect active locale in admin surfaces (#2342)
* fix(taxonomies): respect active locale in admin surfaces

Group translated definitions by logical identity before rendering admin navigation and editor choices. Scope visible term counts and cache entries to the resolved content locale.

* fix(taxonomies): preserve locale in admin term views

* ci: update query-count snapshots

* fix(admin): preserve locale sidebar active state

* fix(taxonomies): preserve exact locale updates

* test(perf): update locale query snapshots

---------

Co-authored-by: emdashbot[bot] <emdashbot[bot]@users.noreply.github.com>
2026-08-18 07:18:22 +00:00
Matt Kane a8b9483fd2 fix(bot): preserve context for long write runs (#2532) 2026-08-17 17:39:05 +00:00
Matt Kane a927afe2af docs: add EmDash documentation writing skill (#2529)
* docs: add EmDash documentation writing skill

* style: format

* ci: review documentation with writing skill

* docs(agents): load documentation writing skill

---------

Co-authored-by: emdashbot[bot] <emdashbot[bot]@users.noreply.github.com>
2026-08-17 14:47:25 +01:00
Matt Kane 68a8593b5a fix(bot): preserve workspaces through sandbox restarts (#2530) 2026-08-17 13:01:06 +00:00
Matt Kane 87d201ffa5 fix(bot): classify comments with one AI call (#2528) 2026-08-17 12:12:15 +00:00
emdashbot[bot] 75860bf32e chore: extract locale catalogs [skip ci] 2026-08-17 09:46:58 +00:00
Matt Kane 5c216c2f92 fix: preserve taxonomy assignments across locale fallbacks (#2508)
* fix(taxonomies): preserve assignments across locale fallback

* fix(admin): clarify taxonomy locale resolution

* perf(taxonomies): join locale fallbacks once

* fix(admin): gate taxonomy creation by permission

* chore: retry external preview build

* fix(admin): show flat taxonomy creation errors
2026-08-17 09:45:55 +00:00
emdashbot[bot] f15d433a4f chore: extract locale catalogs [skip ci] 2026-08-17 09:19:44 +00:00
Matt Kane 5289385499 fix: generate inline taxonomy slugs server-side (#2506)
* fix: keep inline taxonomy terms Unicode-safe

* fix: retry concurrent taxonomy slug collisions
2026-08-17 10:17:39 +01:00
emdashbot[bot] a5d31d547f chore: extract locale catalogs [skip ci] 2026-08-17 09:14:42 +00:00
Matt Kane 515c08d17c fix(scheduler): warn when scheduled maintenance stops (#2512)
* fix(scheduler): surface missed scheduled work

Persist maintenance heartbeats so authenticated editors are warned when overdue content indicates the scheduler has stopped.

* fix(scheduler): keep heartbeat writes non-fatal

A transient operator-health write must not reject maintenance that already completed successfully.

* test(scheduler): cover heartbeat upsert failures

Keep the non-fatal heartbeat contract exercised for both initial inserts and existing-row updates.
2026-08-17 10:12:12 +01:00
Matt Kane 40953d0859 feat(cli): diagnose broken Cloudflare scheduler wiring (#2511)
* feat(cli): detect broken scheduler wiring

Catch Cloudflare deployments that would silently miss scheduled work before they are deployed.

* fix(cli): keep doctor type-aware lint clean

* fix(cli): preserve additive doctor checks

Keep explicit database diagnosis intact, recognize Wrangler TOML, and avoid flagging Workers that do not opt into EmDash scheduled maintenance.

* fix(cli): make scheduler fixes config-aware

Keep doctor guidance copy-pasteable for Wrangler TOML users as well as JSON and JSONC sites.

* fix(cli): finish TOML doctor guidance

Keep every copy-pasteable scheduler fix and the command help accurate for all supported Wrangler formats.
2026-08-17 10:12:11 +01:00