Skip to content

Add Claude Code, split connectors into triggers, workflows, and actions, and rework the UI - #2

Merged
imsobear merged 30 commits into
mainfrom
add-claude-code-agent
Oct 5, 2026
Merged

imsobear merged 30 commits into
mainfrom
add-claude-code-agent

Conversation

@imsobear

@imsobear imsobear commented Oct 5, 2026 •

Copy link
Copy Markdown
Owner

Adds Claude Code as an agent, splits what a connector offers into triggers, workflows, and actions, and reworks the app UI around shorter forms and denser lists. Also updates the docs and site to the new story.

Agents and runners

  • Claude Code is a third agent next to Codex and Cursor Agent.
  • A loop's folder is now relative to the runner's home (code/web), and each runner resolves it. Folder loops no longer have to run on Loopable's host. Older absolute paths still run there, and a migration turns paths under a home folder into relative ones.
  • The Runners page shows the install line with the join command.

Triggers, workflows, actions

  • Each connector registers what can start a loop (Starts when), ready-made jobs on those triggers (Workflows), and where an answer can go (Send to). Trigger ids are the old workflow ids, so saved loops and polls are unchanged.
  • Custom loop: pick any trigger and write your own prompt.
  • GitHub: "Review pull requests" and "Reply to issues". Plan and Implement are gone (the code-writing path is still in place, unused, and covered by tests).
  • Gmail: "An email arrives" is a trigger, and "Email this account" sends the answer to the connected inbox, in the same thread when the run started from an email. Gmail now asks for gmail.send, so existing connections need reconnecting to send.
  • "Keep in Inbox" shows as Inbox only rather than under Schedule.
  • Slack connections are named @bot · workspace.

UI

  • Shared page header, form sections, and list rows; cards no longer pad their tops twice.
  • Loop page: Settings and Tasks tabs as links (?tab=tasks), on/off and Check/Run in the header, items that were not run folded into one line with a Run on each.
  • Loop form: When / Agent / Answer, the folder with the agent, no team notes (a migration moves existing notes onto the prompt), and fixed trigger details folded away.
  • New loop: Custom loop and Schedule first; connector pages list their loops; Inbox asks an agent from a dialog; product logos for connectors and agents.
  • Inbox prompts finish as done instead of prepared (with a migration for earlier ones). Hydration warnings from folds and relative times are gone.

Docs and site

  • README, narrative, concepts, connectors, and deploy describe the shared-agent story, triggers/workflows/actions, custom loops, Gmail, and relative folders.
  • The site is rebuilt around the problem, a shared agent, and running on your own machine, with Claude Code, custom loops, and Gmail in the loop list. Not redeployed from this PR.

Releasing

  • CI (.github/workflows/ci.yml) runs typecheck, tests, and both builds on every PR and on main. Publishing also runs the tests now, and pnpm is pinned.
  • pnpm release patch|minor|major publishes only from a clean main that matches GitHub: it runs every check, bumps, commits, tags vX.Y.Z, publishes, and pushes. --dry-run checks without changing anything.
  • Runners report their version and a protocol number. Folder jobs only go to runners that understand relative folders, a loop with only old runners says to upgrade, and the Runners page flags old runners. Older runners report nothing and count as protocol 1.

Testing

  • pnpm typecheck and pnpm test (364 tests) pass.
  • Checked each page in a running pnpm dev, at desktop and phone width.

Migrations

0025_prompt_tasks_done, 0026_guidance_into_prompt, 0027_relative_folders, 0028_runner_version run when the dispatcher starts. Upgrade runners on other machines too (npm install -g loopable-cli): an old runner keeps working, but no longer takes folder jobs.

🤖 Generated with Claude Code

imsobear and others added 27 commits October 5, 2026 11:04
Driven through claude -p with stream-json, so runs can be watched and the
answer comes from the result event. Read only allows just Read, Grep and
Glob under dontAsk; workspace write uses acceptEdits plus Bash, since
bypassPermissions is refused as root.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The runner reports the agents it has loaded, so one started before an
agent was added kept saying that agent was on no runner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Server functions use validator() instead of the deprecated
inputValidator(), buttons rendered as links say they are not native
buttons, and the agents page no longer exports its component, so the
route can be code-split.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only the app's own pages call server functions, so cross-site requests
now get a 403. The /api routes runners use are not affected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Connection was always meant to be a shared bot, but the copy read as
a personal login: workflows said "assigned to me" and nothing said which
account to sign in as. The connector page now says so before connecting,
the workflows name the bot, and the docs explain the setup and why it is
not a GitHub App.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Plan and Implement for assigned issues give way to one Reply workflow, which
keeps the old id so existing loops still run. Gmail's mail summary goes, since
it was one person's inbox. Chat workflows name their bot, the schedule leads
the list, and GitHub is the account the team sends work to, whether made for
this or someone's own.

The code-writing path stays in place with no workflow on it; its tests drive
it through a test-only workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ettings as links.

The form drops its explanations, folds what the workflow fixes away, and
picks where the answer goes from one grouped list. The loop page puts on/off
and Run or Check in the header, says what it does in one line, and keeps the
tab in the URL. Cards no longer pad their tops twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Runs and loops sit as rows in one box instead of a card each. Loop order and
delete move into a menu, the prompt box shrinks to a composer, and a run's
log and details fold away until wanted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Connections show a quiet status dot, the join command gets a copy button,
connector capabilities sit side by side, and page headers wrap on a phone.
Long field help is cut to a line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Slack connection read as its workspace, so a bot in "Personal" was called
Personal. It is now @bot · workspace. Waiting items each get their own Run,
in place of running all of them at once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ox only.

New loop opens with Custom and Schedule, then the connector workflows, and
says how many loops of each you already have. A custom loop picks a trigger
and starts with an empty prompt. Send to is a service and an action again,
with the clock's "keep it" shown as Inbox, first. GitHub workflows drop the
shared-account wording from their names.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Service marks are from Simple Icons; Codex, Claude Code and Cursor from
LobeHub Icons. Slack is coloured by quarter from its one-path mark.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gmail now asks to send as well as read, and offers Send an email with To and
Subject on the loop. A connection made before this cannot send until it is
reconnected, and says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
They were open before the loop or held back by a rule, and neither runs by
itself, so they no longer lead the Tasks tab. The line says why, and opens
to the same list with a Run on each.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A browser may restore a fold as open before React takes over, and "5m ago"
can land either side of a minute between server and browser. Both are
marked as allowed to differ.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… answer itself.

A connector now registers what can start a loop (triggers), ready-made jobs
on them (workflows), and where an answer can go (actions). A custom loop is a
trigger alone. Trigger ids are the old workflow ids, so saved loops and polls
are unchanged. Gmail gets "An email arrives" back as a trigger, and its send
action now emails the connected account, in the thread when the run began
from one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ames.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It has nothing to write, so it ended as Prepared, the state for a dry run
holding a write back. It now ends as done, shown as Written, and a migration
moves earlier ones across.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…agent, and drop team notes.

A folder is stored like code/web and each runner looks for it under its own
home, so a folder loop no longer has to run on Loopable's host. The runner
checks the folder and names context files in its own workspace. Absolute
folders from before still run on the host, and a migration turns ones under
a home folder into relative paths. The folder moves to the Agent section of
the form, and team notes go, with existing notes moved onto the prompt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h runner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@imsobear imsobear changed the title Add Claude Code as an agent Add Claude Code, split connectors into triggers, workflows, and actions, and rework the UI Oct 5, 2026
imsobear and others added 2 commits October 5, 2026 15:52
Publishing now runs the tests too, and package.json pins the pnpm version CI
and the Dockerfile use.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sion.

pnpm release patch|minor|major checks git and npm, runs typecheck, tests,
and build, then bumps, commits, tags, publishes, and pushes. --dry-run runs
every check and lists what would be published without changing anything.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…old for them.

A runner reports its loopable-cli version and a protocol number on joining
and on every heartbeat; runners before this report neither and count as the
first. Folder jobs need protocol 2, since a relative folder and the workspace
placeholder mean nothing to an older runner. Such a job goes only to a runner
that has it, a loop that has none says to upgrade, and the Runners page shows
each runner's version and flags the old ones.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@imsobear
imsobear merged commit 1a2cbd4 into main Oct 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant