Skip to content

v1.0.276

Choose a tag to compare

@github-actions github-actions released this 18 Sep 14:29
· 62 commits to main since this release

✨ New: Bots — a folder you address as @name

A Bot is a plain directory with a BOT.md at its root. Register it, then start a line with @name: that message runs as its own session, carrying the Bot's files as long-term context.

@reviewer look at the auth changes on this branch

Cockpit does three things and no more — resolve the name, rewrite the message, expose the delegate and status endpoints. It never reads, writes or locks a Bot directory, so a Bot stays an ordinary folder you can edit by hand, keep in git, or hand to someone else.

The command surface is now split by prefix: /verb runs in the main session, /@verb is delegated, @name is a Bot. Create one with /bot. Writes are explicit and locked — a Bot's files change only when you ask it to remember, update, correct or forget, under <bot>/.locks/write, whose owner file records the run so a stuck lock is decided by asking whether that run is still alive rather than by a timer.

The full design, including the failure mode each rule exists to prevent, is in docs/BOTS.md and at Bots.

✨ New: Share a Bot with @name export to <path>

A Bot's working directory is the wrong thing to share. It holds the write lock, review reports, your own memory, and paths that exist on exactly one machine — hand it over and all four go with it, usually into a public repository where the mistake cannot be taken back.

@reviewer export to ~/share/reviewer

Export builds a new directory instead: BOT.md rewritten, identity/ and skills/ carried over, everything else recreated as empty scaffolding. It is a whitelist rather than a blacklist, so a Bot that grows a notes/ next month does not quietly start shipping it. The report ends with the Skill names the copy references, which is the whole installation requirement for whoever receives it. What happens to that directory afterwards is your business — Cockpit neither publishes nor registers it.

A Bot's Skills table now names its tools instead of locating them: a registered skill's name, a Bot-relative path for one the Bot grew itself, an absolute path only when it is neither — flagged as machine-local when it is written. That is what makes a shared table mean anything. The recipient registers the skill under the same name, their own copy in their own location, and the row resolves for them as it did for you. No path could do that, because the only paths two machines share are the ones neither of them chose.

✨ New: Built-in Bots live in ~/.cockpit/bots

A built-in Bot used to run from the install root — root-owned under npm i -g, replaced wholesale on every upgrade, shared by every COCKPIT_HOME on the machine. The panel sent you there anyway, so an edit was either refused outright or silently deleted by the next upgrade.

The shipped directory is now a seed. Each built-in is installed into ~/.cockpit/bots/<name>, and that copy is the Bot: the panel card, the folder button and @name dispatch all follow the same path to a directory you can open and edit. Install tracking is per file, so editing the persona keeps your edit and still takes later BOT.md fixes — where before, one edit froze the whole Bot at the version you touched it. Deleting the folder resets it.

cockpit-helper, which answers questions about Cockpit by reading opencockpit.dev live, now keeps memory as a result — of the person, never of the site. Which install you run, how you want answers, corrections you made, what you asked it to follow up on. Not a remembered route through the docs, which is how it would stop reading the site and start guessing at it.

🐛 Fix: A malformed registry is no longer overwritten with emptiness

bot.json, skills.json and scheduled-tasks.json are files you are invited to edit by hand, so a stray comma is a realistic state rather than a hypothetical one — and it read as "empty", after which the next write persisted that emptiness. A corrupt file now fails the write instead of replacing your data behind a success toast.

The scheduler's boot path is the deliberate exception: it catches, logs that no task will fire, and refuses to save while in that state. Propagating the throw there would have traded silent data loss for a Cockpit that will not start.

🐛 Fix: Cockpit's own PORT no longer leaks into your projects

The launcher exports its listening port as the generic PORT, which Next, Vite and most dev servers read as their port. It is now stripped from every process spawned into a project. COCKPIT_PORT stays, for CLI bridges that want it, and a custom port still survives a restart or update.

Each engine also exports COCKPIT_CWD now — the directory the session was started with. Everything keyed on cwd (delegation, the Bot write-lock owner, status lookups) previously had to work it out, and a session running in a subdirectory worked it out wrong: it saw the repository root's .git, called that "the project", and wrote records nobody could look up. pwd is not the answer either, since it follows any cd the turn has made.

✨ Chat and Git polish

The branch compare header now carries summed +additions / −deletions on its right, next to "N files changed", styled like the per-file counts. The <engine> running <elapsed> line gets an orange shimmer sweeping across it, matching the running spinner — @supports-guarded, and off under prefers-reduced-motion. Notes now sit before Skills in the sidebar, and the Git change-classification badges line up.

🌐 Site: SEO metadata and breadcrumbs

Per-page canonical and OpenGraph metadata for docs and blog, breadcrumb markup, a corrected robots.txt, and a validation pass in the site build. Docs <lastmod> dates were also re-derived from git — 22 of them had drifted, which matters because a sitemap whose dates are learned to be wrong gets trusted less.