Skip to content

Releases

v1.5.1

Choose a tag to compare

@erensrtky erensrtky released this 12 Nov 13:30

cogit tells you when a new version is out, and Codex updates no longer time out

Added

  • cogit tells you when a newer version is out: at the start of a new chat, one line for you (not for the agent) with the commands for Claude Code or Codex, at most once a day per version, and in cogit doctor. To know, it asks npm once a day for the newest version of @cogit/cli, in the background so no chat waits for it; nothing else goes with that request. Turn it off in Settings or with cogit config set updateCheck false.

Fixed

  • In a Codex session, the notice that the plugin and the cogit command are on different versions gave Claude Code's update command; it now gives Codex's.
  • Updating cogit in Codex could fail with "git clone marketplace source timed out after 30s": Codex fetched the whole repository (about 33 MB) for the marketplace. The install command now adds it with --sparse .agents, about 1 MB. If you installed 1.5.0 in Codex, cogit doctor gives the two commands that add it again; the installed plugin stays.

v1.5.0

Choose a tag to compare

@erensrtky erensrtky released this 12 Nov 11:42

cogit now records Codex CLI sessions too

Added

  • Codex support. cogit records Codex CLI sessions like Claude Code's: one node per message, linked commits, the same map. Install the plugin with codex plugin marketplace add erensrtky/cogit && codex plugin add cogit@cogit, then start Codex and accept the hooks review it shows. Codex asks for that review again after every cogit update, and until then it skips the hooks without a word. A new guide page, Codex, covers the install, codex exec and what differs from Claude Code.
  • codex exec runs follow the Background work setting like claude -p: with it on, a run a script starts is recorded, and its record is finished before codex exec returns.
  • cogit's own runs for a Codex session (the side runs and the closing pass) run on Codex with your Codex login, read-only and with hooks off. They use Codex's default model, since a ChatGPT account refuses Claude model names. Codex reports no price, so the spend log keeps their tokens and the map's dollar figure says it leaves them out.
  • cogit doctor and cogit init know Codex: whether the plugin is installed and on, whether its hooks are trusted or waiting for a review after an update, and how many Codex sessions in the project are recorded. A machine without Codex sees the same output as before.
  • The map labels the sessions that ran on Codex, and its Resume and Fork buttons copy codex resume <id> and codex fork <id> for them.

Changed

  • The record skill names the type of the fields that take a list (done, work, commits, files) and says branch.open is one string; Codex's model had sent them the other way round on its first write.
  • cogit session show prints the session's id in its output.
  • When the model behind a background pass answers with something other than the JSON record, the error in .cogit/state/detached.log now shows how the answer began.

v1.4.2

Choose a tag to compare

@erensrtky erensrtky released this 11 Nov 18:55

Loops and sandboxes recorded for sure, and one Background work switch

Changed

  • Headless sessions is now Background work, on or off. On is what Auto was in 1.4.1: the claude -p sessions your loops, scripts and chats start are recorded, other plugins' internal calls are not. All is gone: it only added those calls, which nobody needs on the map. 1.4.1's Off reads as off, Auto and All as on. cogit config set recordHeadless true|false.

Fixed

  • A plugin's internal claude -p call inside a session your chat handed a task to was recorded, since that session carried your chat's mark. The mark now names the chat, and only a session it started directly matches it (Linux and macOS).
  • A headless session's record is now finished before claude -p returns: cogit records and closes it when the agent ends its answer, while Claude Code waits, so a loop, sandbox or container that ends right after claude -p no longer takes the recording with it. Before, such a session was never recorded. A run stopped mid-recording (killed, machine shut down) leaves the session marked, and the next session in the project finishes it, however much later. Chats you type into are unchanged. A new guide page, Loops, sandboxes and agent factories, covers what these setups need and the one case cogit cannot cover.
  • When the settings file holds one value this version cannot read, such as a choice a newer version added, cogit keeps every other setting and puts only that one back to its default. Before, it ignored all your settings at once.

v1.4.1

Choose a tag to compare

@erensrtky erensrtky released this 11 Nov 10:43

Record your headless loops, and Pull request view fixes

Added

  • Headless sessions has three choices instead of on and off. Auto, the default for new installs, records the claude -p sessions you or your scripts start (a loop like Ralph, a cron job) and the ones your recorded chats start through a command (a task handed to another claude -p), and leaves out the ones other plugins start in the background, often once per prompt. Off records only the chats you type into; All records every one. An existing install keeps what it had: off reads as Off, on as All. Auto tells them apart by what started the session, read from the process list on Linux and macOS; a tool can also mark its sessions with COGIT_RECORD=1, which Auto always records, and on Windows that mark is how a script's sessions are recorded. cogit doctor counts the unrecorded tail of a headless session that was recorded.

Fixed

  • The map's Pull request view asks for the branch again when you come back to the window, so a git switch in a terminal shows without reloading the page.
  • A Shape Flow whose node id is a word Mermaid reserves (box, end, loop…) drew as plain text in the map and broke its mermaid block in cogit pr; the diagram now uses its own ids.
  • The Pull request view's title, and the base in cogit pr --json, name the branch you track (→ main, → origin/main, or the branch you stacked on) instead of @{upstream}.
  • A thought's Shape in the Pull request view opens fitted in a short box you drag and zoom with its buttons, instead of a preview with scrollbars both ways. The wheel keeps scrolling the page over it.

v1.4.0

Choose a tag to compare

@erensrtky erensrtky released this 10 Nov 17:11

A Pull request view in the map, and cogit on Windows and macOS

Added

  • A Pull request view in the map, beside the Git and Graph views: the branch you are on as cogit pr describes it, with the goal, a card per thought (its reason, rejected options, the messages that led to it and its Shape diagram) and the commits no thought is behind. A thought opens its card with the diff, and Copy as PR description copies the Markdown. On main itself the view says there is nothing to merge. The view asks the local server for the branch checked out each time it opens, so switching branches does not need a rebuild.
  • cogit pr and the pull request Action now include each message's Shape: a Flow, a Mermaid diagram or a sequence as a mermaid block GitHub draws, a Before / After table as a table, and steps or examples as text. When a description would pass GitHub's size cap, the Shapes go after the file lists and summaries.
  • Your turn can be turned off in Settings (cogit config set inbox false): the box goes from the start page and from every map, and cogit stops reading transcripts for it. Rows closed with × stay closed when it is turned back on.
  • Search by meaning (off by default): the map's search also finds messages that say the same thing in other words, ranked closest first and followed by the word matches. It uses an embedding model in your local Ollama (bge-m3 by default, cogit config set embeddingModel <name> to change it), so nothing leaves the machine and no model call is paid. Each map build fingerprints only the new or changed messages into the project's local state. Turn it on in Settings or from the one-time offer under the search box; when Ollama is not running or the model is missing, the box says what to run.
  • The map's search narrows to what is open: while a session or a message is open, All · This session · This branch under the search box keeps the hits to that session or to the branch the message sits in. The box's hint now says it takes words or a message hash.

Changed

  • cogit pr gives the sessions' times in UTC and says so (2026-10-24 09:12 → 2026-10-24 11:40 UTC). They used to be in the local time of the machine that ran it, which on GitHub's runner was UTC without saying it.
  • The Graph view keeps what is on the screen in place when Show files, Show commits or Open in place adds or removes a layer; only the new parts settle around it. Its layout is also several times faster on a big project (a thousand parts in about 0.6 s instead of 4 s), so the page no longer freezes.
  • Secret masking adds secretlint's maintained provider rules (Stripe, SendGrid, Shopify, Linear, Groq, Cloudflare, Vercel, Hugging Face and more) beside cogit's own patterns for passwords typed on a command line.
  • The record keeps only options about the product or the code under "considered and rejected". How the work was run (which tool or agent did it, this chat or a new one, when to post or release) is left out, so the map and cogit pr show the choices a reviewer needs; in a sample of this project's own record, about half of the rejected options were of that kind. Records written before stay as they are.
  • The Graph view is one Tab stop instead of one per part: Tab lands on the focus file (or the last part you were on), the arrow keys move to the nearest part that way and bring it on screen, and Enter opens it. On a big project the keyboard no longer has to step through every part to get past the graph.
  • Tasks is off for new installs (captures now defaults to false). An existing config keeps the value it stored, so nothing changes for people already using cogit; turn it on in Settings or with cogit config set captures true.

Removed

  • The note before each edit ("Earlier, for this file", the tryBeforeNotes setting). It gave every rejected option of a message to every file that message touched, so it told the agent about choices that had nothing to do with the edit: in this project's own sessions, none of 38 notes was about the change being made. cogit does not yet know which file a decision is about; until it does, the agent looks decisions up with cogit why and cogit search. An existing config that still has the setting is read as before.

Fixed

  • On Windows cogit open did not open the map when the project's path had an & in it (C:\R&D\app): the page was handed to cmd /c start, which read the rest as another command. It now goes to the default browser without a shell.
  • Passwords typed on a command line reached a shared record unmasked: mysql -p…, sshpass -p, curl -u user:…, --password … / --token …, PGPASSWORD= and other prefixed names such as DB_PASSWORD= or MYSQL_PWD=, aws_secret_access_key, Authorization: Basic and npm tokens. They are now masked like the other secrets.
  • On Windows the side model never started: every background record and close pass failed with spawn EINVAL, because Node no longer starts a .cmd file without a shell (CVE-2024-27980). cogit now starts plain claude, which finds claude.exe, and falls back to the claude.cmd shim through cmd.exe only when that is all there is, refusing a model name with characters cmd.exe would read as syntax (#2). A run that outlives its time limit on Windows now stops with claude itself, not only the cmd.exe in front of it.
  • On Windows the map showed each edited file with its full path instead of its path in the project, so it did not match the file git names.
  • On Windows cogit did not see an installed graphify (graphify.exe), and never told when the plugin and the npm-installed cogit command had different versions, because npm lays out a global package differently there.
  • cogit log, cogit search and the map build were slow on a long-used project (about 5.5 s for log and 20 s for a build here, over 1.2 GB of Claude Code transcripts): every command read every transcript line by line again. What a transcript says is now kept in ~/.cache/cogit while the file is unchanged, which brings log and search under a second. A recorded commit that is gone from the repository no longer makes the build ask git about each commit one by one.
  • A "Your turn" row closed with × came back when the page was reloaded: the server stored the dismissal but kept serving the page built before it until the next recording. It now rebuilds the project's map and the start page before it answers.

v1.3.1

Choose a tag to compare

@erensrtky erensrtky released this 09 Nov 05:13

The start page shows every project at a glance

Changed

  • The Home view moved from the map to the start page cogit open shows, above "Your turn", and adds up every project: messages and thought commits per day, the decisions and the options turned down, what cogit itself cost, the most discussed files (with their project; a click opens that project's map on the file) and a year of thought commits. Each map build saves its project's numbers in .cogit/state/overview.json for it. The map is back to the git and Graph views.

v1.3.0

Choose a tag to compare

@erensrtky erensrtky released this 09 Nov 04:55

A Home for the project, a Graph view, and what cogit itself costs

Added

  • The map has a Graph view beside the git view: the work recorded on the project's code, peeled like an onion. It opens on all the sessions; a click goes inside a session to its branches and inside a branch to its messages, each in a lane colour, and the trail above it or Esc steps back (Open in place opens them where they are instead). Parts are linked when they touched the same code files, a rare file counting for more than one everything touches. Picking a file in the Files panel narrows it to the work on that file and the files it imports or is imported by; All files goes back. A ringed part landed a commit; Show files draws the files and their imports, Show commits the commits as squares. Clicking a message opens its card, the same one the git view opens. The git view's own buttons stay in place, disabled, so the toolbar does not move. The map remembers per project, in the browser, which view and side panel were open and where you were in the Graph view, so a refresh or a switch between the views comes back to it. The import links come from the code graph graphify writes; cogit only reads it, and cogit init says whether it found one, offers to build one when graphify is installed (--graph / --no-graph), or prints how to add it.

  • A message's card has a folded Related section: up to three other branches, in this or another session, that worked on the same code files, rare files counting for more, with the files they share. A click opens that branch's message that touched most of them.

  • In the git view, picking a file in the Files panel fades the sessions and messages that did not touch it, while the panel is open; All files clears it. The picked file is the same one the Graph view is drawn around, so switching views keeps it.

  • The map has a Home view beside the git and Graph views: the project at a glance. On top, messages and thought commits per day; in the middle the decisions recorded (and how many the agent took on its own, without asking), the options turned down, what cogit itself cost, and the five most discussed files (a click opens the git view on that file); below, a year of thought commits a square a day, like a GitHub profile, where a square opens that day's first one.

  • cogit notes what its own background runs cost (recording, the closing review, Shapes, captured work): the cost and tokens Claude Code reports for each run go to .cogit/state/spend.jsonl, local to the machine and never shared. The map's Home adds them up.

Changed

  • The map's Files list shows code files only, in both views: documents, config, lockfiles and build folders are left out (by the code graph when there is one, by name otherwise), and it has a search box. cogit log --file still answers for any path.

v1.2.1

Choose a tag to compare

@erensrtky erensrtky released this 08 Nov 23:26

Quality recording reviews each session at its end

Added

  • cogit pr shows a Led here list under a thought: the earlier messages of the same thread that decided something, back to the previous commit. A commit made on a plain "commit it" now carries the decision behind it, with the options that were rejected. --json has them as ledHere.

Changed

  • Quality recording no longer stops the agent mid-chat, and a short session no longer misses its review. When a session ends in Quality mode, the model it ran on reopens the whole conversation in the background (claude --resume -p, nothing written back to the transcript, no plugins or hooks) and corrects the record as the agent that did the work, for about one more message while its cache is warm. Before, the agent was asked every 15 turns, so a session that ended earlier was never reviewed. cogit backfill --close --review runs it by hand; a session end that was missed is closed by the next session with the side model only.
  • Recording defaults to Quality (recorder: mixed, shown as "Detailed" before): besides the small background model, the model you worked with reviews the conversation once when the session ends and adds the technical decisions only it knows. The small model reads the chat from the outside and missed what the agent noticed in the code without saying it, such as a pitfall left only in a code comment. Setups that never chose a mode move to Quality; cogit config set recorder side (Economical, under 2 cents per 20 messages) keeps the old behaviour. The settings text now explains the difference, and the read-only settings view names the mode instead of its key.
  • The map's Resume and Fork buttons carry a copy sign (⧉ Resume, ⧉ Fork): they copy the command for a terminal and never start Claude Code, which a bare "Resume" seemed to promise. The "Your turn" inbox no longer shows them; its link opens the map at the message.

Fixed

  • In Quality (mixed) recording most messages got no agent decisions: the side model was told to leave them to the agent, but it records most messages before the agent's turn and the agent only sees the ones still unrecorded. The side model now writes the agent's technical decisions in every mode; the agent can still replace them, and a later side run never takes the agent's back.
  • A commit hash from another repository, pasted into the chat, could be recorded as one of the session's commits. cogit session write now keeps only commits this repository has and warns about the rest.
  • A commit made before cogit first wrote the session's record (as with short sessions recorded only when they close) lost its thought: cogit pr, cogit log, cogit blame and the map read Thought: trailers only from the record's write time on, so cogit pr listed the commit with no thought and the PR Action stayed silent. They now read from the session's first message, and cogit pr dates sessions by their messages.
  • cogit pr --install-action in a clone where cogit was never set up now says to run cogit init first, instead of asking to share records the project does not have yet.

v1.2.0

Choose a tag to compare

@erensrtky erensrtky released this 07 Nov 14:55

Decisions on every pull request

cogit pr --install-action adds a GitHub Action to your repository. Each pull request then gets the decisions behind its branch as one comment: the goal, what was decided and why, and the options that were turned down. The comment updates on every push, and the description stays yours. Pull requests from forks and branches with no recorded thought get no comment.

Added

  • cogit pr --install-action writes .github/workflows/cogit.yml; commit and push it to turn it on, delete it to stop. It needs a project that shares its record.
  • A FAQ with the questions people asked after the launch: docs/guide/faq.md.

Fixed

  • cogit pr came out empty once the branch was pushed, which is exactly when you open the pull request, and after one more commit it described only that commit. It now always describes everything the branch adds to where it will merge, through pushes, merges from main and rebases.
  • With an SSH key that has a passphrase and no ssh-agent, the records that follow a push were lost after ten minutes of failed logins. They now wait in the queue, and cogit doctor says what to do.
  • A prepare-commit-msg hook of your own that sets a trap ... EXIT or ends with exec no longer drops the Thought: line.
  • The cost figures now say what we measured: the default recording costs under 2 cents per 20 messages.

Full list in the changelog.

v1.1.0

Choose a tag to compare

@erensrtky erensrtky released this 06 Nov 16:03

Every message gets a summary

Every message now gets a one-line summary of what came of it, so a message that only discussed or advised no longer keeps just its title. Existing setups get it once; turn it off again with cogit config set messageSummaries false.

This page also covers 1.0.1, which had no page of its own: fixes from testing 1.0 end to end (a live Claude Code session pushed through a real remote, a 10,000-session map, git 2.20 and your own git hooks).

Upgrade: npm i -g @cogit/cli@1.1.0 and claude plugin update cogit. Your git hooks update on your next chat message.

1.1.0

Changed

  • Every message now gets a one-line summary of what came of it (messageSummaries is on by default, and turned on once for existing setups). Without it, a message that only discussed or advised kept nothing but its title, so the map and search lost what the agent said. Turn it off with cogit config set messageSummaries false; it then stays off.

Fixed

  • With a hooks folder shared by every repository (a global core.hooksPath), cogit's hooks no longer act in repositories that are not the project: a commit there no longer takes the project's Thought: trailer, and a push there no longer announces the project's records.
  • With Husky, cogit's hook blocks no longer vanish for good after npm install (Husky rewrites .husky/_): the next chat message puts them back. cogit hooks uninstall is remembered, so blocks you removed on purpose stay out.
  • A session the side model left untitled takes its first thread's title (or its first message's) at session end, instead of showing only its id on the map and in cogit log; cogit log also stops printing such an id twice.

1.0.1

Fixed

  • A git hook of your own that ended with exit 0, or read the push's input, no longer stops cogit: its block now sits at the top of the hook, hands git's input on to your lines, and adds the Thought: trailer after them. Existing hooks move on the next chat message; a Python or Node hook is left alone and cogit doctor says so.
  • git push --dry-run no longer sends the record (Linux and macOS).
  • The first download of a team's records shows git's progress meter without one line per session (300 sessions printed over 600 lines), and when it fails, cogit doctor shows git's reason instead of "the download failed".
  • After upgrading from a version that committed the record, cogit doctor asks you to commit the rewritten .cogit/.gitignore too; without it teammates and new clones saw .cogit/sessions/ in git status.
  • A map with thousands of sessions no longer freezes on "Unfold all" and "Fold all": only the open sessions near the screen are drawn, and the session list no longer does quadratic work (10,000 sessions: 11 s down to 2 s).
  • cogit init --help and cogit config git --help named the removed commit policy; they now say share or ignore.
  • cogit pr and cogit show <sha> no longer tell a reviewer that a teammate's thought is "not recorded yet" when it may never arrive: for someone else's commit they say it is not in this clone's record, because its author has not pushed it or it came from a fork.
  • cogit build in a fresh clone of a shared project downloads the team's sessions first, instead of writing an empty map.
  • The map's outline follows the search: it marks and scrolls to the hit you are on, and scrolls to a message you click on the map.
  • Git older than 2.29 can download the team's records again: cogit no longer passes it --no-write-fetch-head, and a failed download names git's error instead of a line of its usage text.
  • A Shape diagram in the message panel keeps legible text: it shrinks to the panel's width but not below half size, and a tall or wide one scrolls inside its box instead of shrinking until the labels cannot be read.
  • A message is no longer lost from the record when the side model gets one of its fields wrong, or (in mixed mode) writes a field that belongs to the agent: only that field is left out, and the message keeps its title, summary and the rest.
  • A chat that commits into another repository no longer stamps that commit with a Thought: trailer the other repository can never resolve: the trailer is added only when the chat runs in the project being committed (or in that working tree).
  • The agent is told at session start that the Thought: trailer comes from cogit, so it stops warning you about a line it did not write.