Skip to content

Commit 289a56a

Browse files
cyrusagentclaudePaytonWebberConnoropolouscursoragent
authored
Merge main into cypack-807 branch (CYPACK-821) (#873)
* Respect agent guidance for draft PRs and use --track for worktrees (#834) - Update gh-pr subroutine to conditionally gate `gh pr ready` based on agent guidance (respects --draft flag in workspace guidance) - Update changelog-update subroutine to include --base flag in PR creation targeting the configured base branch from context - Add --track flag to git worktree add commands to properly set upstream tracking branch Fixes issues where PRs were auto-converted from draft to ready and worktrees weren't tracking the correct upstream branch. Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> * Prepare release v0.2.20 (#835) Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> * Refactor TodoWrite formatting to support Task tools (#837) * Update @anthropic-ai/claude-agent-sdk to v0.2.34 and @anthropic-ai/sdk to v0.73.0 - Updated @anthropic-ai/claude-agent-sdk from ^0.2.7 to ^0.2.34 - Updated @anthropic-ai/sdk from ^0.71.2 to ^0.73.0 - Fixed type compatibility with new BetaUsage fields (inference_geo, iterations, stop_reason) - Updated gemini-runner adapters to handle new SDK types Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * Update changelog for SDK updates Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * Enable Claude Code experimental features in claude-runner - Set CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 - Set CLAUDE_CODE_ENABLE_TASKS=true - Set CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 - Updated test expectations to include new env configuration Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * Refactor TodoWrite formatting to support Task tools - Added formatTaskParameter() method to IMessageFormatter interface - Implemented Task tool formatting (TaskCreate, TaskUpdate, TaskList, TaskGet) in ClaudeMessageFormatter and GeminiMessageFormatter - Updated AgentSessionManager to handle Task tools as thought activities - Added comprehensive tests for Task tool formatting (20 new tests) - Marked TodoWrite as deprecated while maintaining backward compatibility - Fixed linting warnings in switch case block scope Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> * Fix spawn node ENOENT by passing process.env to Claude SDK The env option only contained 3 hardcoded vars, causing PATH to be missing from the spawned Claude Code process. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Cherry-pick d5d9e5a: Fix single-turn subroutine silent failures (#843) * Cherry-pick d5d9e5a: Fix single-turn subroutine silent failures Cherry-picks commit d5d9e5a from refactor/improved-logging branch. Resolves merge conflicts adapting logging refactor patterns (sessionId/log.info) to current branch patterns (linearAgentActivitySessionId/console.log). When a single-turn subroutine exits with an error (e.g. error_max_turns), AgentSessionManager now recovers by using the last completed subroutine's result via ProcedureAnalyzer.getLastSubroutineResult(), allowing the procedure to continue to completion instead of failing silently. Also adds tools config pass-through to ClaudeRunner and EdgeWorker so disallowAllTools subroutines properly disable built-in tools. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Update changelogs for CYPACK-792 (#843) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Fix ClaudeRunner test env assertions after process.env spread Tests expected env to contain only 3 explicit keys, but commit 6e8d873 added ...process.env to prevent spawn ENOENT errors. Updated assertions to use expect.objectContaining() so tests verify required keys without failing on additional process.env entries. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com> * Fix TaskCreate/TaskGet formatting, add ToolSearch/TaskOutput formatting, include task subject in TaskUpdate/TaskGet (#846) * Fix TaskCreate/TaskGet formatting for parallel execution, add ToolSearch and TaskOutput formatting TaskCreate now renders as concise checklist items (⏳ **subject**) instead of verbose multi-line format, better suited for parallel async execution. TaskGet shows subject with ID when enriched. ToolSearch renders as a thought with descriptive formatting. TaskOutput shows task status with blocking/non-blocking context. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add changelog entries for CYPACK-795 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Simplify TaskUpdate/TaskGet to use task number, show ToolSearch query directly TaskUpdate and TaskGet now always display the task number (e.g. "Task #123") instead of the subject description for consistency with parallel execution. ToolSearch now shows the query directly as the parameter value, matching the pattern of other tools like Bash (command) and Read (file_path). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Revert Gemini runner formatting changes (not applicable to these tools) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Include task subject in TaskUpdate and TaskGet formatting TaskUpdate and TaskGet now display the task's short description alongside the task number (e.g., "✅ Task #3 — Fix login bug") when a subject is available, falling back to number-only when not. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * Enrich TaskUpdate/TaskGet activities with task subject (CYPACK-797) (#847) * Enrich TaskUpdate/TaskGet activities with task subject from cache and result parsing TaskUpdate and TaskGet tool inputs don't include the task subject, causing Linear activities to show only "Task #3" without context. This change defers their activity posting from tool_use time to tool_result time, where subject can be sourced from: (1) a cache populated by TaskCreate results, or (2) parsing the Subject field from TaskGet result content. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Add changelog entries for CYPACK-797 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Delete packages/edge-worker/test/AgentSessionManager.task-subject-enrichment.test.ts --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Payton Webber <53197664+PaytonWebber@users.noreply.github.com> * Release v0.2.21 (#848) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> * fix(orchestrator): ensure issues are created with 'To Do' status instead of 'Triage' (#815) * fix(orchestrator): ensure issues are created with 'To Do' status instead of 'Triage' Update orchestrator system prompts to explicitly require setting state to "To Do" when creating issues with mcp__linear__create_issue. Previously, issues were being created with default "Triage" status. Changes to both orchestrator.md (v2.5.0) and graphite-orchestrator.md (v1.3.0): - Added state requirement to Required Tools section - Added Status bullet point in Decompose section - Added status checklist item in Sub-Issue Creation Checklist - Fixed outdated tool names in orchestrator.md Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs(changelog): add entry for CYPACK-761 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Connor Turland <1409121+Connoropolous@users.noreply.github.com> * Codex SDK migration + split agent/model selectors (#850) * chore: checkpoint codex sdk integration WIP * Switch codex runner to SDK and add agent/model selectors * chore: checkpoint codex sdk integration WIP * Switch codex runner to SDK and add agent/model selectors * Resolve rebase conflicts, migrate model defaults, and fix codex session init * Fix Codex/Gemini usage typing and add Codex formatter replay tests * Emit Codex tool lifecycle events for Linear activities * Format Codex todos as markdown checklists * Extract F1 test-drive workflow into shared skill * Add user-facing changelog entry for agent/model selectors * Add PR link to changelog entry for codex selector work * update sandbox settings * add .git folder for worktrees to allowed directories list * Cursor harness MCP enable + permission mapping hardening (#858) * fix(orchestrator): ensure issues are created with 'To Do' status instead of 'Triage' (#815) * fix(orchestrator): ensure issues are created with 'To Do' status instead of 'Triage' Update orchestrator system prompts to explicitly require setting state to "To Do" when creating issues with mcp__linear__create_issue. Previously, issues were being created with default "Triage" status. Changes to both orchestrator.md (v2.5.0) and graphite-orchestrator.md (v1.3.0): - Added state requirement to Required Tools section - Added Status bullet point in Decompose section - Added status checklist item in Sub-Issue Creation Checklist - Fixed outdated tool names in orchestrator.md Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs(changelog): add entry for CYPACK-761 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Connor Turland <1409121+Connoropolous@users.noreply.github.com> * feat(runners): add codex/cursor harness support and F1 validation * fix(cursor-runner): support non-mock cursor F1 session output * Fix cursor harness verification regressions * fix(ci): resolve build type errors in config-updater and core session types * fix(edge-worker): wire cursor runner selection and prompt assets * docs(changelog): frame cursor harness as major feature * docs(changelog): use user-facing framing for cursor entry * docs(changelog): clarify cursor selector usage * fix(build): remove baseUrl/paths from tsconfig to fix dist output structure The baseUrl pointing to monorepo root caused TypeScript to expand rootDir, nesting compiled output under dist/edge-worker/src/ instead of dist/. This broke module resolution since package.json declares main as dist/index.js. Also adds missing cyrus-cursor-runner dependency to edge-worker. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(cursor/edge-worker): stop-session handling and cursor tool activity mapping * chore(gitignore): ignore nested node_modules directories * fix(edge-worker): resume cursor sessions for prompted continuation * fix(cursor-runner): sync project permissions for cursor CLI sessions * fix(cursor-runner): map MCP tool permissions to Cursor CLI config * docs(claude): add cursor permission translation gotcha * fix(codex): default runner model to gpt-5.3-codex * fix(cursor-runner): pre-enable MCP servers before cursor sessions * docs(cursor): clarify .cursor/mcp.json source-of-truth guidance * fix(cursor-runner): scope wildcard file permissions to workspace * fix(codex): post actual error message to Linear for usage limit errors When Codex hits usage limits or turn.failed errors, the full error message is now posted to Linear agent activity instead of a generic message. - AgentSessionManager: use errors[] for content when result is empty - CodexRunner: fallback to standalone error event when turn.failed has no message Co-authored-by: Cursor <cursoragent@cursor.com> * feat(cursor): enable sandbox by default, fix cli.json formatting - Default Cursor sandbox to enabled for tool execution isolation - Write .cursor/cli.json with tabs for Biome compatibility - Exclude .cursor from Biome checks (generated config) - Update CHANGELOG with sandbox default Co-authored-by: Cursor <cursoragent@cursor.com> * feat(cursor): validate cursor-agent version before run, post error to Linear on mismatch - Run cursor-agent --version before spawn and compare to tested version - Post error_during_execution to Linear via agent activity when version mismatches - Add cursorAgentVersion config and CYRUS_CURSOR_AGENT_VERSION env override - Add CursorRunner.version-check.test.ts with 3 tests - Update CHANGELOG with version validation behavior Co-authored-by: Cursor <cursoragent@cursor.com> * fix(cursor): render TODO_STATUS_COMPLETED todos as checked in Linear - Map Cursor API TODO_STATUS_COMPLETED to [x] marker in formatter and summarizeTodoList - Map TODO_STATUS_IN_PROGRESS for (in progress) suffix - Add formatter test for TODO_STATUS_* values - Update CHANGELOG Co-authored-by: Cursor <cursoragent@cursor.com> * feat(cursor): log assembled cursor-agent CLI args to console and session logs - Log full spawn command (path + args) before cursor-agent execution - Write to both console and session log file for debugging - Update CHANGELOG Co-authored-by: Cursor <cursoragent@cursor.com> * fix(cursor): remove --force and --api-key from CLI args - Remove --force option from cursor-agent invocations - Pass API key via CURSOR_API_KEY env only (no longer in args) - API key no longer appears in spawn logs or terminal output - Update CHANGELOG Co-authored-by: Cursor <cursoragent@cursor.com> * add --trust * move trust line * Delete .cursor/cli.json * fix(cursor-runner): backup and restore .cursor/cli.json instead of overwriting Temporarily rename existing .cursor/cli.json before writing Cyrus permissions, then restore original when session ends. Preserves user's config. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(cursor): add deny rules to scope Read/Write to workspace only - When broad Read or Write allowed, add deny rules for /etc, /usr, etc. - Add deny rules for workspace sibling directories - Prevents cursor-agent from accessing /etc/hosts and system paths - Add test: only mutates project .cursor/cli.json, leaves home config unchanged - Update wildcard permissions test to expect system-path denies Co-authored-by: Cursor <cursoragent@cursor.com> * docs(changelog): add Cursor .cursor/cli.json backup/restore entry for CYPACK-804 Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Connor Turland <1409121+Connoropolous@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: agentclear <agentops@ceedar.ai> Co-authored-by: Cyrus <208047790+cyrusagent@users.noreply.github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com> * Update README with agent capabilities and notes (#869) * Bump fastify from 5.6.1 to 5.7.3 (#828) Bumps [fastify](https://github.com/fastify/fastify) from 5.6.1 to 5.7.3. - [Release notes](https://github.com/fastify/fastify/releases) - [Commits](fastify/fastify@v5.6.1...v5.7.3) --- updated-dependencies: - dependency-name: fastify dependency-version: 5.7.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs: Update internal changelog for main merge (CYPACK-821) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Payton Webber <53197664+PaytonWebber@users.noreply.github.com> Co-authored-by: Connor Turland <1409121+Connoropolous@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1 parent a107040 commit 289a56a

96 files changed

Lines changed: 6795 additions & 470 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/agents/f1-test-drive.md

Lines changed: 8 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -5,191 +5,16 @@ tools: Bash, Read, Write, Glob, Grep, TodoWrite
55
model: sonnet
66
---
77

8-
# F1 Test Drive Agent
8+
# F1 Test Drive Agent (Wrapper)
99

10-
You are the F1 Test Drive Agent, responsible for orchestrating comprehensive test drives of the Cyrus agent system. Your role is to validate the entire pipeline: Issue-tracker -> EdgeWorker -> Renderer.
10+
Use the shared canonical skill:
1111

12-
## Your Mission
12+
- `skills/f1-test-drive/SKILL.md`
1313

14-
Execute test drives that verify:
15-
1. **Issue-tracker verification**: Issues are created and processed correctly
16-
2. **EdgeWorker verification**: Git worktrees are created, agent sessions start, outputs are available via RPC
17-
3. **Renderer verification**: Outputs are accessible and well-formed
14+
Treat this subagent file as a thin harness-specific wrapper only.
1815

19-
## Test Drive Protocol
16+
Execution requirements:
2017

21-
### Phase 1: Setup
22-
23-
1. **Create test repository** (if needed):
24-
```bash
25-
cd apps/f1
26-
./f1 init-test-repo --path /tmp/f1-test-drive-<timestamp>
27-
```
28-
29-
2. **Start F1 server**:
30-
```bash
31-
CYRUS_PORT=3600 CYRUS_REPO_PATH=/tmp/f1-test-drive-<timestamp> bun run apps/f1/server.ts &
32-
```
33-
34-
3. **Verify server health**:
35-
```bash
36-
CYRUS_PORT=3600 ./f1 ping
37-
CYRUS_PORT=3600 ./f1 status
38-
```
39-
40-
### Phase 2: Issue-Tracker Verification
41-
42-
1. **Create test issue**:
43-
```bash
44-
CYRUS_PORT=3600 ./f1 create-issue \
45-
--title "<issue title>" \
46-
--description "<issue description>"
47-
```
48-
49-
2. **Verify issue created**: Confirm issue ID returned
50-
51-
### Phase 3: EdgeWorker Verification
52-
53-
1. **Start agent session**:
54-
```bash
55-
CYRUS_PORT=3600 ./f1 start-session --issue-id <issue-id>
56-
```
57-
58-
2. **Monitor session activities**:
59-
```bash
60-
CYRUS_PORT=3600 ./f1 view-session --session-id <session-id>
61-
```
62-
63-
3. **Verify**:
64-
- Session started successfully
65-
- Activities are being tracked
66-
- Agent is processing the issue
67-
68-
### Phase 4: Renderer Verification
69-
70-
1. **Check activity output format**:
71-
- Activities have proper types (thought, action)
72-
- Timestamps are present
73-
- Content is well-formed
74-
75-
2. **Test pagination** (if many activities):
76-
```bash
77-
CYRUS_PORT=3600 ./f1 view-session --session-id <session-id> --limit 10 --offset 0
78-
```
79-
80-
### Phase 5: Cleanup
81-
82-
1. **Stop session**:
83-
```bash
84-
CYRUS_PORT=3600 ./f1 stop-session --session-id <session-id>
85-
```
86-
87-
2. **Stop server**: Kill the background server process
88-
89-
## Test Drive Documentation
90-
91-
Create a test drive report in `apps/f1/test-drives/` with this structure:
92-
93-
```markdown
94-
# Test Drive #NNN: [Goal Description]
95-
96-
**Date**: YYYY-MM-DD
97-
**Goal**: [One sentence]
98-
**Test Repo**: [Path to test repository]
99-
100-
---
101-
102-
## Verification Results
103-
104-
### Issue-Tracker Verification
105-
- [ ] Issue created successfully
106-
- [ ] Issue ID returned
107-
- [ ] Issue details accessible
108-
109-
### EdgeWorker Verification
110-
- [ ] Session started successfully
111-
- [ ] Git worktree created (check server logs)
112-
- [ ] Activities being tracked
113-
- [ ] Agent processing issue
114-
115-
### Renderer Verification
116-
- [ ] Activities have proper format
117-
- [ ] Pagination works correctly
118-
- [ ] Search works correctly
119-
120-
---
121-
122-
## Session Log
123-
124-
### [Timestamp] - [Phase]
125-
126-
**Command**: [Exact command]
127-
**Output**: [Key output]
128-
**Status**: [PASS/FAIL]
129-
130-
---
131-
132-
## Final Retrospective
133-
134-
### What Worked Well
135-
[List successes]
136-
137-
### Issues Found
138-
[List problems with severity]
139-
140-
### Recommendations
141-
[Actionable improvements]
142-
143-
### Overall Score
144-
- **Issue-Tracker**: X/10
145-
- **EdgeWorker**: X/10
146-
- **Renderer**: X/10
147-
- **Overall**: X/10
148-
149-
---
150-
151-
**Test Drive Complete**: [Timestamp]
152-
```
153-
154-
## Acceptance Criteria for Test Drives
155-
156-
A test drive PASSES if:
157-
1. Server starts successfully
158-
2. Issue is created and has valid ID
159-
3. Session starts and activities appear
160-
4. Activities are well-formatted with types and timestamps
161-
5. Session can be stopped gracefully
162-
6. No unhandled errors occur
163-
164-
A test drive FAILS if:
165-
- Server won't start
166-
- Issue creation fails
167-
- Session won't start
168-
- No activities appear after 30 seconds
169-
- Malformed activity data
170-
- Unhandled exceptions
171-
172-
## Important Notes
173-
174-
- Always use `CYRUS_PORT=3600` to avoid conflicts
175-
- Create fresh test repos for each test drive
176-
- Document all observations, both positive and negative
177-
- Take screenshots of terminal output when relevant
178-
- Clean up test repos after successful test drives
179-
- If the test drive fails, preserve the state for debugging
180-
181-
## Sample Test Issues
182-
183-
For the rate limiter test repo, use these realistic issues:
184-
185-
1. **Sliding Window Algorithm**:
186-
- Title: "Implement sliding window rate limiter algorithm"
187-
- Description: Implement the SlidingWindowRateLimiter class with configurable window size
188-
189-
2. **Fixed Window Algorithm**:
190-
- Title: "Implement fixed window rate limiter algorithm"
191-
- Description: Add FixedWindowRateLimiter that resets counter at fixed intervals
192-
193-
3. **Unit Tests**:
194-
- Title: "Add comprehensive unit tests for rate limiter"
195-
- Description: Add Vitest tests for TokenBucketRateLimiter covering edge cases
18+
1. Load and follow `skills/f1-test-drive/SKILL.md` as the primary protocol.
19+
2. Keep behavior aligned with the shared skill so other harnesses can reuse the same source.
20+
3. Prefer updating the shared skill over adding logic here.

.claude/skills/f1-test-drive

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../skills/f1-test-drive

.codex/skills/f1-test-drive

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../skills/f1-test-drive

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Dependency directories
2-
node_modules/
2+
node_modules
3+
**/node_modules
34

45
# Build output
56
dist/

.opencode/skills/f1-test-drive

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../skills/f1-test-drive

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CLAUDE.md

CHANGELOG.internal.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ This changelog documents internal development changes, refactors, tooling update
55
## [Unreleased]
66

77
### Changed
8+
- Merged `main` into `cypack-807` branch, resolving 7 merge conflicts and fixing auto-merge issues across AgentSessionManager, EdgeWorker, GitService, ProcedureAnalyzer, gemini-runner, and changelogs. Updated 2 test files from `IIssueTrackerService` to `IActivitySink` interface. ([CYPACK-821](https://linear.app/ceedar/issue/CYPACK-821), [#873](https://github.com/ceedaragents/cyrus/pull/873))
89
- Decoupled Slack webhook handler from `RepositoryConfig`: introduced `NoopActivitySink` for non-repository sessions, dedicated `slackSessionManager` on `EdgeWorker`, and `slackThreadSessions` map for thread-based session reuse. `createSlackWorkspace` now creates plain directories under `~/.cyrus/slack-workspaces/` instead of git worktrees. Runner config is built inline (bypassing `buildAgentRunnerConfig` which requires a repository). Added `SlackReactionService` to `cyrus-slack-event-transport` package. ([CYPACK-815](https://linear.app/ceedar/issue/CYPACK-815), [#868](https://github.com/ceedaragents/cyrus/pull/868))
910
- Refactored logging across all packages to use a dedicated `ILogger` interface and `Logger` implementation in `packages/core/src/logging/`. Replaced direct `console.log`/`console.error` calls in EdgeWorker, AgentSessionManager, ClaudeRunner, GitService, RepositoryRouter, SharedApplicationServer, SharedWebhookServer, WorktreeIncludeService, ProcedureAnalyzer, AskUserQuestionHandler, LinearEventTransport, and LinearIssueTrackerService with structured logger calls. Log level is configurable via the `CYRUS_LOG_LEVEL` environment variable (DEBUG, INFO, WARN, ERROR, SILENT).
1011
- Added source context (session ID, platform, issue identifier, repository) to log messages via `logger.withContext()`, enabling easier debugging and log filtering across concurrent sessions
@@ -20,6 +21,10 @@ This changelog documents internal development changes, refactors, tooling update
2021
- Created `GlobalSessionRegistry` class for centralized session storage across all repositories, enabling cross-repository session lookups in orchestrator workflows ([CYPACK-725](https://linear.app/ceedar/issue/CYPACK-725), [#766](https://github.com/ceedaragents/cyrus/pull/766))
2122
- Extracted `IActivitySink` interface and `LinearActivitySink` implementation to decouple activity posting from `IIssueTrackerService`, enabling multiple activity sinks to receive session activities ([CYPACK-726](https://linear.app/ceedar/issue/CYPACK-726), [#767](https://github.com/ceedaragents/cyrus/pull/767))
2223
- Integrated `GlobalSessionRegistry` with `EdgeWorker`, making it the single source of truth for parent-child session mappings and cross-repository session lookups ([CYPACK-727](https://linear.app/ceedar/issue/CYPACK-727), [#769](https://github.com/ceedaragents/cyrus/pull/769))
24+
- Added Cursor harness `[agent=cursor]`, including offline F1 drives for stop/tool activity, resume continuation, and permission synchronization behavior. Also added project-level Cursor CLI permissions mapping from Cyrus tool permissions (including subroutine-time updates), pre-run MCP server enablement (`agent mcp list` + `agent mcp enable <server>`), switched the default Codex runner model to `gpt-5.3-codex`, and aligned edge-worker Vitest module resolution to use local `cyrus-claude-runner` sources during tests. ([CYPACK-804](https://linear.app/ceedar/issue/CYPACK-804), [#858](https://github.com/ceedaragents/cyrus/pull/858))
25+
26+
### Fixed
27+
- Updated orchestrator system prompts to explicitly require `state: "To Do"` when creating issues via `mcp__linear__create_issue`, preventing issues from being created in "Triage" status. ([CYPACK-761](https://linear.app/ceedar/issue/CYPACK-761), [#815](https://github.com/ceedaragents/cyrus/pull/815))
2328

2429
## [0.2.21] - 2026-02-09
2530

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,18 @@ All notable changes to this project will be documented in this file.
1010

1111
### Changed
1212
- Slack agent sessions now run in transient empty directories instead of git worktrees, and subsequent @mentions in the same thread share the same session context. ([CYPACK-815](https://linear.app/ceedar/issue/CYPACK-815), [#868](https://github.com/ceedaragents/cyrus/pull/868))
13+
- **Agent and model selectors now work across Claude, Gemini, and Codex** - You can now set runner and model directly in issue descriptions using `[agent=claude|gemini|codex]` and `[model=<model-name>]`. This is not Codex-only: selectors apply to all supported runners. `[agent=...]` explicitly selects the runner, `[model=...]` selects the model and can infer runner family, and description tags take precedence over labels. ([#850](https://github.com/ceedaragents/cyrus/pull/850))
14+
- **Codex tool activity is now visible in Linear sessions** - Codex runs now emit tool lifecycle activity (including command execution, file edits, web fetch/search, MCP tool calls, and todo updates) so activity streams show execution details instead of only final output. ([#850](https://github.com/ceedaragents/cyrus/pull/850))
15+
- **Codex todo output now renders as proper checklists** - Todo items are now formatted as markdown task lists (`- [ ]` and `- [x]`) for correct checklist rendering in Linear. ([#850](https://github.com/ceedaragents/cyrus/pull/850))
16+
- **Major new feature: Cursor agent harness support** - Cyrus now supports Cursor as a first-class agent option. To use it, set `[agent=cursor]` in the issue description or apply a `cursor` issue label; either selector runs end-to-end with the Cursor runner and posts the final response back to the issue thread. Cursor runs now map Cyrus tool permissions into project-level Cursor CLI permissions, pre-enable configured MCP servers before run, and refresh permissions between subroutines so permission changes take effect without restarting the issue flow. Cursor sandbox is enabled by default for tool execution isolation; set `CYRUS_SANDBOX=disabled` to disable. Before each run, Cyrus validates that the installed `cursor-agent` version matches the tested version; a mismatch posts an error to Linear. Set `CYRUS_CURSOR_AGENT_VERSION` to your installed version to override. Assembled cursor-agent CLI args are now logged to console and session log files for debugging. Codex default runner model is now `gpt-5.3-codex` (configurable via `codexDefaultModel`). ([CYPACK-804](https://linear.app/ceedar/issue/CYPACK-804), [#858](https://github.com/ceedaragents/cyrus/pull/858))
1317

1418
### Fixed
1519
- Summary subroutines now properly disable all tools including MCP tools like Linear's create_comment ([#808](https://github.com/ceedaragents/cyrus/pull/808))
1620
- Procedures no longer fail when a subroutine exits with an error (e.g., hitting the max turns limit). Cyrus now recovers by using the last successful subroutine's result, allowing the workflow to continue to completion instead of stopping mid-procedure ([#818](https://github.com/ceedaragents/cyrus/pull/818))
21+
- **Codex usage limit errors now display full message in Linear** - When Codex hits usage limits or other turn.failed errors, the actual error message is now posted to Linear agent activity instead of a generic message. ([CYPACK-804](https://linear.app/ceedar/issue/CYPACK-804), [#858](https://github.com/ceedaragents/cyrus/pull/858))
22+
- **Cursor project .cursor/cli.json is now backed up and restored** - CursorRunner no longer overwrites the project's `.cursor/cli.json`. It temporarily renames the existing file before writing Cyrus permissions, then restores the original when the session ends. ([CYPACK-804](https://linear.app/ceedar/issue/CYPACK-804), [#858](https://github.com/ceedaragents/cyrus/pull/858))
23+
- **Cursor API key no longer in CLI args or logs** - The Cursor API key is now passed only via the `CURSOR_API_KEY` environment variable, so it never appears in spawn logs or terminal output. The `--force` option has also been removed from cursor-agent invocations. ([CYPACK-804](https://linear.app/ceedar/issue/CYPACK-804), [#858](https://github.com/ceedaragents/cyrus/pull/858))
24+
- **Cursor completed todos now display as checked in Linear** - Cursor API uses `TODO_STATUS_COMPLETED` for completed todo items; the formatter now recognizes this so completed items render as `- [x]` instead of `- [ ]` in Linear activity. ([CYPACK-804](https://linear.app/ceedar/issue/CYPACK-804), [#858](https://github.com/ceedaragents/cyrus/pull/858))
1725

1826
## [0.2.21] - 2026-02-09
1927

0 commit comments

Comments
 (0)