Repository navigation
feat: merge Jobs and Triggers into one Automations area - #709
Conversation
Co-Authored-By: Claude Opus 5.5 <[email protected]>
…d QA Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Codex <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Rename trigger-detail/* to automation-detail/* serving jobs and triggers: sentence head with the On/Off switch, How it works (Starts / Only if / Does with next runs, conditions, prompt, Loop inputs, task, webhook endpoint), one shared run list, one-card rail, lockbar, Inspect for both kinds, delete by typing the name, and states with a way back. One useAutomationDetailPage replaces the job and trigger detail hooks; the job detail page, its sections and run history are deleted. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
# Conflicts: # web/src/systems/os/lib/__tests__/os-palette-domain-search.test.ts
Next runs drop the accent chip for faint indexes and hairline rows, the rule card reads at form size with subtle sub-lines, the prompt clamp keeps its padding, the subhead emphasizes the project and times, and the rail names the event the way the rule card does. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Merge the job and trigger forms into one AutomationForm (Name → Starts → Only if → Does → Options) with a live sentence bar, a schedule builder without cron by default, event cards, link fields, conditions, three targets, one Options fold, the preview swap and edit-mode locks. The Starts choice decides whether the save creates a job or a trigger. - useAutomationForm + useAutomationEditor replace the per-kind hooks - deep links: ?create=1|loop with start/loop, edit=1|options - delete automation-job-form, automation-trigger-form, job-form/*, trigger-form/*, both reliability sections and both previews Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Codex <[email protected]>
# Conflicts: # web/src/systems/automation/components/job-form/preview/next-runs-card.tsx # web/src/systems/automation/index.ts # web/src/systems/os/apps/automation/__tests__/use-automation-trigger-detail-page.test.tsx # web/src/systems/os/apps/automation/automation-create-seed-store.ts # web/src/systems/os/apps/automation/use-automation-job-detail-page.ts # web/src/systems/os/apps/automation/use-automation-page-base.ts # web/src/systems/os/apps/automation/use-automation-page.ts # web/src/systems/os/apps/automation/use-automation-trigger-detail-page.ts # web/src/systems/os/apps/automation/use-automations-page.ts
# Conflicts: # internal/store/globaldb/global_db_test.go # internal/store/globaldb/schema/migrations/atlas.sum
- create=1 seeds wait for a resolved lens, not a project, so the empty state's "On a schedule" opens the editor in Global; Loop seeds still need their project - the editor preview renders the detail's AutomationNextRuns from a small schedule helper; job-preview, job-form/ and automation-target-details go - the editor form names its entity (data-entity) for browser artifacts - tests: page-level UT-106 (Loop seed, strip, no reopen, Global), the same-window link search reaching the WM location, E2E-005 Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The daemon now stores and serves version 5 snapshots and layout documents; the web schemas still required version 4 and would reject every snapshot after the upgrade. Also aligns the layout tool schema and the official skill. Co-Authored-By: Claude Opus 5.5 <[email protected]>
# Conflicts: # web/src/systems/os/apps/automation/use-automations-page.ts
# Conflicts: # web/src/systems/os/apps/automation/__tests__/use-automations-page.test.tsx
Co-Authored-By: Claude Opus 5.5 <[email protected]>
…l links Co-Authored-By: Claude Opus 5.5 <[email protected]>
E2E-005 expected the Start panel's count link to be visible on load. The
Loop rail card folds by default and carries the answer in its gist
("1 automation"), so the test now checks the gist, opens the card, and
follows the link to /automations?loop=<name>.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
main.tsx renders under StrictMode, whose development double mount disposes the editor the first effect opened. The seed store read that reset as an operator close and stripped ?create= before the dialog ever showed. Only an explicit Cancel or dismiss now strips the params; any other reset reopens the editor. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedToo many files! This PR contains 380 files, which is 80 over the limit of 300. To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch. Usage-priced reviews support at most 300 files. ⚙️ Run configuration
⛔ Files ignored due to path filters (88)
📒 Files selected for processing (380)
You can disable this status message by setting the
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
React Doctor found no new issues. 🎉 Reviewed by React Doctor for commit |
Co-Authored-By: Claude Opus 5.5 <[email protected]>
… actions Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
Co-Authored-By: Claude Opus 5.5 <[email protected]>
React Doctor flagged AutomationForm and useAutomationForm for control-flow complexity and the condition row for "Field"/"Value" aria-labels. - AutomationForm keeps the orchestration; the Name section, the error alert and the footer move to automation-form-parts, the body to AutomationFormFields, the Options fold to useAutomationOptionsFold - useAutomationForm reads its edit rules from pure helpers (automation-form-edits: scheduleForMode, canSwitchStart/Does, destination, defaults) and two sub-hooks (schedule clock, Loop target) - condition inputs are named "Condition field" and "Value for <field>" Behavior unchanged; the editor suites pass as before. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Layout files exported before the Automations merge are version 4 and may name Jobs or Triggers windows. The importer now applies the daemon's permanent v4 upgrade (retired apps to automations on the rewritten routes) instead of rejecting them. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The daemon titles the task with the job name when the title is blank, so the saved sentence now reads the same instead of a missing title. Co-Authored-By: Claude Opus 5.5 <[email protected]>
- The footer only claims 'N on' and the next run once every page is loaded; otherwise it reads '60 automations · 50 shown'. - A failed refresh keeps the cached rows under a retry alert. - The listing reuses AutomationDeleteAction, so a failed delete shows the daemon's reason in the dialog. - The editor wiring and the two list queries move into their own hooks. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The daemon's v4 rewrite keeps a detail route's search; the web redirect table cleared it, so imported layouts and old /jobs/<id>?q=… bookmarks lost their filters. Both now keep the listing search, pinned by new shared vectors. Co-Authored-By: Claude Opus 5.5 <[email protected]>
What & why
The Web UI had two apps for one idea: Jobs (time) and Triggers (events and links), each with its own list, detail page, dialog and run list. A user had to know which daemon entity they created before they could find it again, and COPY.md has carried "Jobs / Triggers — pending owner decision" since the normie pass.
This PR implements the whole
automationsspec (.compozy/tasks/automations, tasks 01–07, ADR-001…004) against the approved design setdocs/design/opendesign/automations/(S1 listing · S2 detail · S3 editor · S4 surfaces). The result is one Automations window:Every weekday at 09:00 UTC, ask summarizer.). Each row has a time stat, its last-run truth (Last run failed 7h agoin danger; skipped/missed/handed off/completed in neutral), a non-optimistic On/Off switch, and an overflow with only the supported actions. Start views (All · Scheduled · On events), search, and the Does/Status/Location/Source/Loop facets are all server-side, so totals stay honest. Cards view, first-run empty state with suggestions, and loading / unavailable / partial / failed states.StateGlyph, one rail card, a lockbar for config/package sources, Inspect for the machine truth, and delete-by-typing-the-name. Run now exists only for schedules.?create=1&start=…,?create=loop&loop=…,?edit=options.The daemon keeps both entities (ADR-001). Its changes:
last_runon job/trigger DTOs (ADR-003). One batched latest-per-owner query per page, two new partial composite indexes, andskip_reasonlifted from the run metadata so a skip never reads as a cancel. It reaches HTTP, UDS, CLI (new Last Run column, JSON/toon fields) and thecompozy__automation_*_{list,get}tools.target=agent|loop|tasklist filter. A catalogtargetcolumn is backfilled in the migration; the filter is exposed as--targetand as a tool input.corecmdsserves oneautomationsapp and view.--app jobs|triggers, window commands,window_layoutresources, paletteapp.open.{jobs,triggers}/palette.view.{jobs,triggers}over HTTP/UDS and thecmd-paletteCLI, and web/jobs*//triggers*(redirect stubs).Every job-only or trigger-only page, row, card, run list, form and hook is deleted, not aliased (regime 3).
How you verified it
Local targeted checks (CI owns the full gate):
go teston every touched Go package (api/core, automation, windowmanager, cmdpalette, cli, daemonWindowManager|Snapshot|NativeAutomation, store/globaldb migration + latest-run + target suites,internal/storeTestProductionMigrationStreams).golangci-linton touched packages: 0 issues.make codegen-check: clean.make product-language-check: pass.bunx turbo run typecheck --filter=./weband the full web Vitest run, 684 files / 6,734 tests green.Real-app QA (3 rounds, isolated
eng-qa-bootstraplabs, real daemon + Web UI in Chrome). I seeded the board's seven automations through the real CLI, with real runs.docs/qa/scenarios/TA-*automation*.mainbinary had a v4 desktop with tiled/stacked/floating/closed Jobs and Triggers windows plus pinned palette commands. After booting this branch's binary it came back as v5 Automations windows in the same slots, withwindowmanager.snapshot_migratedlogged once and the pins merged.compozy window open --app jobswarns and opens Automations.-o jsonlast_runequals…/runs?limit=1for 11/11 automations.?create=deep links died on a cold load because the StrictMode development double mount disposed the editor and the seed store read that as an operator close. The regression is pinned withrenderHook(..., { reactStrictMode: true }), which fails on the old code.Reviews. Claude Fable 5.1 (high) reviewed the full diff against the spec, boards and SD-013 before this PR: approve with fixes (1 blocker, 5 major, 27 minor, 15 nits). All accepted findings were fixed and a Fable confirmation pass returned approve. Rejected: B-1, renumbering migrations to 00129/00130.
TestProductionMigrationStreamsrequires gap-free versions, so that would make this PR red; see the rebase checklist below.Screenshots (real daemon, 1440×900):
How it was built. A Claude Opus 5.5 controller orchestrated parallel workers in isolated worktrees through herdr: Codex GPT-6 Astra (medium) on the daemon slices (task 01
last_run/target, task 02 app-id retirement, review fixes), and Claude Opus 5.5 (medium) on the listing, detail, editor, shell surfaces, docs and the QA walks. The controller integrated every slice into this branch, resolved the conflicts, and fixed the cross-slice gaps itself: the web snapshot-v5 schema, migration renumbering + atlas, CLI palette aliases, and the F1 root cause. I reviewed and verified the result.Impact
/automations,/automations/jobs/:id,/automations/triggers/:id)./jobs*and/triggers*redirect until v0.5.0.last_runin JSON/toon,--targetonautomation jobs|triggers.--app jobs|triggersandcmd-palette invoke|inspect app.open.{jobs,triggers}warn on stderr until v0.5.0. Verbs and flags are otherwise unchanged.last_runon job/trigger list and get;targetquery param on both list routes (OpenAPI + generated clients regenerated). Palette routes alias the retired ids with a WARN.last_run; list tools gaintarget; descriptions name the UI noun.00128(latest-run indexes + catalogtarget) and00129(palette personalization merge).jobs/triggerspages moved toschedules/eventswith permanent redirects; official skill, COPY.md + glossary, release note with a migration block,docs/_memory/change-impact.md, merged QA scenarios.Rebase checklist vs
memory-removal(whichever lands second)memory-removalholds00128_retire_memory.sql) and regenerateatlas.sum.internal/daemon/window_manager_repository.go: the v5 app-id rewrite must run beforememory-removal's registered-app reconcile.memory.consolidatedcatalog/docs entries. They are pre-existing onmainand owned bymemory-removal.Known issues found by QA that are pre-existing on
main(out of scope, reproduced on amainbuild)resource_records).resolve scheduler catch-up policy … loop definition not found).Follow-ups (deferred review nits)
ValidateLayoutdeprecation source needs a request-actor field.cronNexthas no zone input).make gatepasses locally; this PR is delivered only after its required CI checks are green. Gates are delegated to CI by standing decision; targeted local checks are listed above.🤖 Generated with Claude Code