Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ cargo clippy --all-targets -- -D warnings

<!--CARRYOVER:START-->
Carryover is active. Before responding:
1. Read `.carryover/handoff.md` for the prior session summary.
2. Summarize it back to the user in 1-2 sentences.
3. Ask what they want to do next — do not assume continuation.
1. Read `.carryover/handoff.md` for the full session context and progress log.
2. Find the `## What to do next` section and read it aloud to the user in 1-2 sentences.
3. Ask the user if they want to continue from there or do something different — do not assume continuation.
<!--CARRYOVER:END-->
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) once v0.1.0 ships.

## 0.1.4 — 2026-04-30

### Fixed

- **Cursor adapter rewritten for new schema.** Cursor migrated conversation data from `globalStorage/state.vscdb` to per-workspace `state.vscdb` files. The adapter now reads `composer.composerHeaders` from the global DB and `aiService.prompts` from each workspace DB. Old-schema fallback preserved for pre-migration installs.
- **Codex adapter rewritten for new schema.** New format stores user/assistant text in `event_msg.payload.{type, message}` with the session_id only in the leading `session_meta` line. Adapter now captures both, plus reads `~/.codex/history.jsonl` for real-time user prompts before the rollout file is flushed.
- **Project-dir routing.** Cursor and Codex cursors persist `project_dir` so fs-watcher events route the handoff to the correct project directory. Watched paths now include `~/.config/Cursor/User/workspaceStorage` and `~/.codex/history.jsonl`.
- **Progress log accumulates across all sessions.** No longer wipes content on session change — never resets, only appends. Entries deduped by full-line content.
- **Skip-on-error in Claude/Codex adapters.** A single corrupt JSON line no longer blocks the entire transcript ingest.

### Added

- **Task / Next action accumulation.** Both sections now keep a timestamped history (newest first) instead of overwriting on each ingest. Dedupe checks the full list, not just the latest entry.
- **`## Session activity` section.** Captures concrete file changes via `git diff --stat HEAD` (git projects) or recent file mtimes (non-git). Fills the gap for Cursor where AI responses aren't stored locally. Preserved across ingests when the recent-window scan is empty.
- **Strict response rules in handoff preamble.** AI agents are instructed to read silently, not narrate the file structure, not recap files the user already knows, not report empty fields, and reply in two short paragraphs in the user's tone. Preamble auto-refreshes on every daemon start so rule updates propagate immediately.
- **Fallback for empty `Next action`.** When no assistant text is captured (Cursor case), falls back to `"Continue: <latest user prompt>"` so the section is never empty.

## 0.1.3 — 2026-04-28

### Fixed
Expand Down
6 changes: 3 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<!--CARRYOVER:START-->
Carryover is active. Before responding:
1. Read `.carryover/handoff.md` for the prior session summary.
2. Summarize it back to the user in 1-2 sentences.
3. Ask what they want to do next — do not assume continuation.
1. Read `.carryover/handoff.md` for the full session context and progress log.
2. Find the `## What to do next` section and read it aloud to the user in 1-2 sentences.
3. Ask the user if they want to continue from there or do something different — do not assume continuation.
<!--CARRYOVER:END-->
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "carryover"
version = "0.1.3"
version = "0.1.4"
edition = "2021"
license = "Apache-2.0"
description = "Zero-LLM-token context-handoff daemon — resume any AI session across Claude Code, Cursor, and Codex."
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ carryoverd uninstall # remove hooks; ledger preserved by default (--purge to w
```

> **Tip — resuming a session:** Carryover writes a pointer block into your project's `AGENTS.md` and `CLAUDE.md`. The AI reads it automatically at the start of a new conversation. To trigger it, open a new session and say something like **"let's start"**, **"continue"**, or **"what's next"** — that's enough for Claude Code, Cursor, or Codex to read the handoff and ask where you left off. Just saying "hi" won't trigger it.
>
> **Tip — already in a chat:** A long-running Cursor/Claude/Codex window won't re-read the pointer mid-conversation. Carryover keeps writing fresh updates to `.carryover/handoff.md` as you work, but the AI in that window doesn't see them until you tell it to. To pull in the latest state, just say **"read .carryover/handoff.md"** or **"check the carryover handoff for context"** — the AI will load the file and pick up everything that happened since the chat started, including work from your other tools.

## What works in v0.1

Expand Down
2 changes: 1 addition & 1 deletion npm-package/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "carryover",
"version": "0.1.3",
"version": "0.1.4",
"description": "Zero-LLM-token context-handoff daemon — resume any AI session across Claude Code, Cursor, and Codex.",
"homepage": "https://github.com/carryover-dev/carryover",
"repository": {
Expand Down
13 changes: 6 additions & 7 deletions src/adapters/claude.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,17 +179,16 @@ impl Adapter for ClaudeAdapter {
}

/// Parse raw records into LedgerRow. Skips non-conversation types.
/// Fail-fast: first malformed record aborts the batch.
/// Skip-on-error: malformed records (corrupt JSON lines) are silently
/// skipped so a single bad line doesn't block the entire transcript.
fn parse(&self, records: Vec<RawRecord>) -> Result<Vec<LedgerRow>, AdapterError> {
let mut rows = Vec::with_capacity(records.len());

for rec in records {
let v: serde_json::Value =
serde_json::from_slice(&rec.payload).map_err(|e| AdapterError::Parse {
offset: rec.offset,
context: "invalid JSON in transcript line",
source: e,
})?;
let v: serde_json::Value = match serde_json::from_slice(&rec.payload) {
Ok(v) => v,
Err(_) => continue, // skip corrupt JSON line
};

// Filter housekeeping rows.
let row_type = v.get("type").and_then(|t| t.as_str()).unwrap_or("");
Expand Down
Loading
Loading