You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* 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>
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:
11
11
12
-
## Your Mission
12
+
-`skills/f1-test-drive/SKILL.md`
13
13
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.
Copy file name to clipboardExpand all lines: CHANGELOG.internal.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,10 @@ This changelog documents internal development changes, refactors, tooling update
4
4
5
5
## [Unreleased]
6
6
7
+
8
+
### Added
9
+
- 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))
10
+
7
11
### Fixed
8
12
- 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))
Copy file name to clipboardExpand all lines: CHANGELOG.md
+12Lines changed: 12 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
4
4
5
5
## [Unreleased]
6
6
7
+
### Fixed
8
+
-**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))
9
+
-**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))
10
+
-**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))
11
+
-**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))
12
+
13
+
### Changed
14
+
-**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))
15
+
-**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))
16
+
-**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))
17
+
- **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))
Copy file name to clipboardExpand all lines: CLAUDE.md
+116Lines changed: 116 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -91,6 +91,122 @@ When examining or working with a package SDK:
91
91
92
92
3. Review the SDK's documentation, source code, and type definitions to understand its API and usage patterns.
93
93
94
+
## Shared Skills Across Harnesses
95
+
96
+
For reusable operational workflows (for example F1 test driving), keep a canonical skill in:
97
+
98
+
-`skills/<skill-name>/SKILL.md`
99
+
100
+
Then symlink that skill into harness-specific skill directories:
101
+
102
+
-`.claude/skills/<skill-name>`
103
+
-`.codex/skills/<skill-name>`
104
+
-`.opencode/skills/<skill-name>`
105
+
106
+
Use:
107
+
108
+
```bash
109
+
./scripts/symlink-skills.sh
110
+
```
111
+
112
+
Design rule:
113
+
114
+
1. Keep subagent files thin wrappers.
115
+
2. Put 95%+ workflow logic into canonical shared skills.
116
+
3. Update shared skill first; avoid duplicating protocol text across harnesses.
117
+
118
+
## Checklist For New Agent CLI Harnesses
119
+
120
+
When implementing a new runner/harness (for example Codex, Gemini, OpenCode, or other CLIs), use this checklist before shipping.
121
+
122
+
### 1) Session Lifecycle And Turn Limits
123
+
124
+
- Verify turn-limit behavior (`maxTurns`, `maxSessionTurns`, or equivalent).
125
+
- Confirm what error/result payload is emitted when limits are exceeded.
126
+
- Ensure session stop behavior is explicit and deterministic.
127
+
128
+
### 2) Prompt Model And Instructions
129
+
130
+
- Identify how base system prompt is applied.
131
+
- Identify whether appended instructions are supported and whether they extend or replace defaults.
132
+
- Confirm provider-specific instruction fields (for example `developer_instructions`) and expected precedence.
133
+
134
+
### 3) Streaming Event Schema
135
+
136
+
- Capture real JSON event streams and document item types.
137
+
- Determine whether events are full objects or deltas/partials that require aggregation.
138
+
- Add replay tests from real transcripts.
139
+
140
+
### 4) Final Message Semantics
141
+
142
+
- Verify where the final answer lives:
143
+
- in a `result` payload (Claude-style), or
144
+
- in the last assistant message (Gemini-style), or
145
+
- mixed model/event behavior.
146
+
- Ensure we always post a final `response` activity when work completes successfully.
147
+
148
+
### 5) Tools And Permissions
149
+
150
+
- Validate `tools`, `allowedTools`, and `disallowedTools` semantics for the SDK.
151
+
- Validate approval/sandbox behavior for tool execution.
152
+
- Verify tool calls produce both start and completion signals.
153
+
- For providers that rely on static/project config files (for example Cursor CLI), implement a permission translation layer from Cyrus/Claude tool names to provider-native permission tokens and write that config before session start. This must support subroutine-time updates when allowed/disallowed tools change. For Cursor MCP servers, pre-enable them before session start (`agent mcp list` + `agent mcp enable <server>` per server) so tools are available in headless runs. When using Cursor in Cyrus, only MCP servers configured in `.cursor/mcp.json` should be treated as project MCP config; use Cursor's MCP config-location and file-format docs as the source of truth: https://cursor.com/docs/context/mcp#configuration-locations. For broad file permissions, map wildcard `Read(**)` / `Write(**)` to workspace-scoped patterns (for example `Read(./**)` / `Write(./**)`) to avoid unintentionally permitting absolute system paths. Reference: https://cursor.com/docs/cli/reference/permissions
154
+
155
+
### 6) Prompt Streaming Input
156
+
157
+
- Verify whether the SDK supports streaming/incremental prompt input.
158
+
- Set `supportsStreamingInput` correctly and gate behavior in runner adapters.
159
+
160
+
### 7) MCP Servers And Custom Tools
161
+
162
+
- Verify MCP server config format and merge behavior.
- visible tool/file-edit activities in session timeline
200
+
- final response posting behavior
201
+
202
+
### Codex Integration Lesson Learned
203
+
204
+
Codex emitted tool activity at `item.started`/`item.completed` events, but those were initially not mapped to `tool_use`/`tool_result`. The result was missing action/file-edit visibility in Linear. For any new harness, treat tool lifecycle mapping as a first-class acceptance criterion, not a formatter-only concern.
205
+
206
+
### Cursor Integration Lesson Learned
207
+
208
+
Cursor CLI permissions are enforced from config (`~/.cursor/cli-config.json` or `<project>/.cursor/cli.json`) instead of dynamic per-request tool allowlists. For Cursor-like providers, do not rely on dynamic SDK tool constraints alone—add a translation layer (for example `mcp__server__tool` -> `Mcp(server:tool)`, `Bash(...)` -> `Shell(...)`) and sync project permissions before each run and between subroutines. Also pre-enable MCP servers via `agent mcp list` + `agent mcp enable <server>` using both project-listed and runner-configured server names so headless sessions can invoke MCP tools immediately. In Cyrus Cursor runs, treat `.cursor/mcp.json` as the project MCP source and follow Cursor's configuration-location and file-syntax docs (these differ from Claude's MCP interpretation): https://cursor.com/docs/context/mcp#configuration-locations. Use workspace-scoped wildcard file permissions (`Read(./**)`, `Write(./**)`) rather than unscoped `Read(**)` / `Write(**)` in translation defaults. Reference: https://cursor.com/docs/cli/reference/permissions
209
+
94
210
## Navigating GitHub Repositories
95
211
96
212
When you need to examine source code from GitHub repositories (especially when GitHub's authentication blocks normal navigation):
0 commit comments