All notable changes to this project will be documented in this file.
- Updated @anthropic-ai/claude-code from v1.0.88 to v1.0.89 for latest Claude Code improvements. See Claude Code v1.0.89 changelog
- Updated @anthropic-ai/claude-code dependency to use exact version (1.0.83) instead of caret range for improved consistency
- Updated CLAUDE.md documentation with clearer MCP Linear integration testing instructions
- cyrus-claude-runner@0.0.22
- cyrus-edge-worker@0.0.27
- cyrus-ai@0.1.44
- Model configuration support for Claude Pro users
- Configure Claude model selection (priority order: env vars → repository config → global config → defaults)
- Environment variables:
CYRUS_DEFAULT_MODELandCYRUS_DEFAULT_FALLBACK_MODEL - Global config:
defaultModelanddefaultFallbackModelin~/.cyrus/config.json - Repository-specific:
modelandfallbackModelfields per repository - Defaults:
"opus"(primary) and"sonnet"(fallback) - Resolves errors for Claude Pro users who lack Opus model access
- Updated @anthropic-ai/claude-code from v1.0.81 to v1.0.83 for latest Claude Code improvements. See Claude Code v1.0.83 changelog
- Fixed git worktree creation failures for sub-issues when parent branch doesn't exist remotely
- Added proper remote branch existence checking before attempting worktree creation
- Gracefully falls back to local parent branch or default base branch when remote parent branch is unavailable
- cyrus-claude-runner@0.0.21
- cyrus-edge-worker@0.0.26
- cyrus-ai@0.1.43
- Updated @anthropic-ai/claude-code from v1.0.77 to v1.0.80 for latest Claude Code improvements. See Claude Code v1.0.80 changelog
- Updated @anthropic-ai/sdk from v0.59.0 to v0.60.0 for latest Anthropic SDK improvements
- Fixed issue where duplicate messages appeared in Linear when Claude provided final responses
- Added consistent LAST_MESSAGE_MARKER to all prompt types to ensure Claude includes the special marker in final responses
- Marker is automatically removed before posting to Linear, preventing duplicate content
- cyrus-core@0.0.10
- cyrus-claude-runner@0.0.20
- cyrus-edge-worker@0.0.25
- cyrus-ndjson-client@0.0.16
- cyrus-ai@0.1.42
- Dynamic tool configuration based on system prompt labels
- Restrict Claude's tools per task type: give debugger mode only read access, builder mode safe tools, etc.
- Use case: scoper can only read files, debugger can't use Bash, builder gets full access
- Use presets (
"readOnly","safe","all") or custom tool lists in yourlabelPromptsconfig - Improves security and keeps Claude focused on the right tools for each job
- See Configuration docs for setup details
- Updated @anthropic-ai/claude-code from v1.0.72 to v1.0.73 for latest Claude Code improvements
- Fixed Windows compatibility issues that caused agent failures on Windows systems
- Replaced Unix-specific
mkdir -pcommands with cross-platform Node.jsmkdirSync - Implemented intelligent shell script detection supporting Windows (.ps1, .bat, .cmd) and Unix (.sh) scripts
- Added graceful fallback for Windows users with Git Bash/WSL to still use bash scripts
- Resolves "A subdirectory or file -p already exists" and "bash command not found" errors
- Replaced Unix-specific
- Resolved issue where Cyrus would fail to respond when it was initially delegated when the receiver was down
- Now properly creates new sessions when prompted if none existed
- Sessions are correctly initialized even when no prior session history exists
- Improved code organization and type safety in session handling logic
- cyrus-core@0.0.10
- cyrus-claude-runner@0.0.19
- cyrus-edge-worker@0.0.24
- cyrus-ndjson-client@0.0.16
- cyrus-ai@0.1.41
- Customer subscription validation for Cyrus Pro users
- Automatically checks subscription status when using the default proxy with a customer ID
- Blocks access if subscription is expired, cancelled, or invalid
- Shows appropriate messages for returning customers vs new customers
- Validates subscription when setting customer ID via
cyrus set-customer-idcommand
- Label-based repository routing - Route Linear issues to different git repositories based on their labels
- New
routingLabelsconfiguration option allows specifying which labels should route to a specific repository - Useful when multiple repositories handle issues from the same Linear team (e.g., backend vs frontend repos)
- Label routing takes precedence over team-based routing for more granular control
- New
- Updated Linear SDK from v54 to v55.1.0 to support Agent Activity Signals
- Stop button in Linear UI now sends a deterministic
stopsignal that Cyrus responds to immediately - When you click the stop button while Cyrus is working, it will cleanly halt all operations and confirm the stop action
- The stop signal implementation ensures no work continues after the stop is requested
- Stop button in Linear UI now sends a deterministic
- Updated Anthropic AI SDK from v0.57.0 to v0.59.0 and Claude Code from v1.0.61 to v1.0.72 for improved Claude integration
- cyrus-core@0.0.9
- cyrus-claude-runner@0.0.18
- cyrus-edge-worker@0.0.23
- cyrus-ndjson-client@0.0.15
- cyrus-ai@0.1.40
- Simplified initial setup by removing configuration prompts for MCP, labels, Linear teams, allowed tools, and workspace directory
- MCP configuration is now optional with no default prompt
- Allowed tools default to all standard tools plus Bash(git:) and Bash(gh:) for immediate productivity
- Label-based system prompts now have defaults: "Bug" for debugger mode, "Feature,Improvement" for builder mode, and "PRD" for scoper mode
- Team-based routing defaults to all workspace issues (no team filtering)
- Workspace directory automatically uses
~/.cyrus/workspaces/<repo-name> - Streamlined first-time user experience with sensible defaults
- Configuration documentation in README explaining all customizable settings
- Link to configuration docs in CLI output after setup completion
- Fixed duplicate OAuth authorization messages during Linear login flow while ensuring browser still opens automatically
- cyrus-core@0.0.8
- cyrus-claude-runner@0.0.17
- cyrus-edge-worker@0.0.22
- cyrus-ndjson-client@0.0.15
- cyrus-ai@0.1.39
- Native Linear attachments (like Sentry error links) are now included in the issue context sent to Claude
- Cyrus now fetches attachments using Linear's native attachment API
- Attachments appear in a dedicated "Linear Issue Links" section in the prompt
- Particularly useful for Sentry error tracking links and other external integrations
- New command
cyrus add-repository- Add a new repository configuration, thanks new contributor @Maxim-Filimonov ! - Attachment support for comments - Cyrus now downloads and provides access to attachments added in Linear comments
- Attachments are automatically downloaded when users post comments with URLs or files
- Downloaded to
~/.cyrus/<workspace>/attachmentsdirectory - Attachment manifest is generated and included in Claude's prompt
- Attachments directory is always available to Claude during sessions
- Differentiation between issue delegation and @ mentions for more focused responses
- @ mentions now trigger focused responses without system prompts
- Delegations continue to use full system prompts for comprehensive task handling
- Aligns with Linear's expected agent activity behavior
- Subscription management built right into the CLI (because who wants another dashboard?)
cyrus billing- Opens your Stripe portal to manage subscription, payment methods, and download invoicescyrus set-customer-id- Saves your customer ID after signup (copy-paste friendly)- Interactive prompt on startup if you're using our proxy without a subscription
- Self-hosting option for the DIY crowd who prefer their own Linear app and infrastructure
- existed in v0.1.34 but was missing since then
- Fixed attachments not being accessible to Claude during active streaming sessions
- Pre-create attachments directory for every session to ensure future attachments are accessible
- Always include attachments directory in allowedDirectories configuration
- Fixed issue where messages from @ Cyrus mention comments weren't being added to context
- Fixed issue where sub-issue base branches weren't being added to the user-prompt template, causing Cyrus to create PRs against the default branch instead
- cyrus-core@0.0.8
- cyrus-claude-runner@0.0.16
- cyrus-edge-worker@0.0.21
- cyrus-ndjson-client@0.0.15
- cyrus-ai@0.1.38
- Fixed "RateLimit exceeded" and
Cannot query field "agentContext" on type "AgentActivity".errors when interacting with Linear API by updating SDK from v52 to v54- Linear API had breaking changes that caused compatibility issues with SDK v52
- The outdated SDK was triggering excessive API calls leading to rate limit errors
- Upgrading to v54 resolves these compatibility issues and restores normal operation
- cyrus-core@0.0.8
- cyrus-claude-runner@0.0.15
- cyrus-edge-worker@0.0.20
- cyrus-ndjson-client@0.0.15
- cyrus-ai@0.1.37
- Instant response is now sent when receiving follow-up messages in an existing conversation, providing immediate feedback that Cyrus is working on the request
- Shows "I've queued up your message as guidance" when Cyrus is still processing a previous request
- Shows "Getting started on that..." when Cyrus is ready to process the new request immediately
- Parent branch inheritance for sub-issues - sub-issue branches now automatically use their parent issue's branch as the base instead of the default repository branch
- Maintains proper Git hierarchy matching Linear's issue structure
- Gracefully falls back to default base branch if parent branch doesn't exist
- Clear logging shows branch inheritance decisions
- Model notification at thread initialization - Cyrus now announces which Claude model is being used (e.g., "Using model: claude-3-opus-20240229") when starting work on an issue
- Task tool execution markers in Linear comments - Cyrus now clearly indicates when automated Task tools are running
- Tools invoked within a Task display "↪ ToolName" to indicate they're part of the Task
- Shows "✅ Task Completed" when the Task finishes and displays the output from the Task
- cyrus-core@0.0.7
- cyrus-claude-runner@0.0.14
- cyrus-edge-worker@0.0.19
- cyrus-ndjson-client@0.0.14
- cyrus-ai@0.1.36
- Instant acknowledgment responses when Cyrus receives a request, providing immediate feedback to users
- Role mode notifications when issue labels trigger specific workflows (e.g., "Entering 'debugger' mode because of the 'Bug' label")
- You can now append custom instructions to Claude's system prompt via
appendInstructionin repository config (~/.cyrus/config.json) - because sometimes Claude needs a gentle reminder that your variable names are art, not accidents
- TodoWrite tool messages are now displayed as "thoughts" instead of "actions" in Linear for better visual organization
- cyrus-core@0.0.6-alpha.0
- cyrus-claude-runner@0.0.13-alpha.0
- cyrus-edge-worker@0.0.18-alpha.0
- cyrus-ndjson-client@0.0.13-alpha.0
- cyrus-ai@0.1.35-alpha.0
- cyrus-ai@0.1.33
- Made conversation history of threads be resumable after Cyrus restarts
- Fixed the issue with continuity of conversation in a thread, after the first comment
- cyrus-core@0.0.6
- cyrus-claude-runner@0.0.13
- cyrus-edge-worker@0.0.18
- cyrus-ndjson-client@0.0.13
- cyrus-ai@0.1.32
- Missing prompt template file in published package (the one thing you need to actually run the thing)
- cyrus-edge-worker@0.0.17
- Fixed missing prompt-template-v2.md in package files
- cyrus-ai@0.1.31
- Work on multiple tasks within a single Linear issue - each comment thread maintains its own Claude session, letting you tackle different parts of a problem in parallel without context mixing. New root comments start focused sessions that see the full conversation history in a threaded view (just like Linear's UI) while concentrating on your specific request
- Automatic ngrok tunnel setup for external access
- No more manual port forwarding or reverse proxy setup required
- Cyrus will ask for your ngrok auth token on first run and handle the rest
- Free ngrok account required (sorry, we can't make the internet work by magic alone)
- Skip ngrok setup if you prefer to handle networking yourself
- Webhook debugging via
CYRUS_WEBHOOK_DEBUG=trueenvironment variable - see exactly what Linear is (or isn't) sending you
- Fresh startup no longer crashes with "EdgeWorker not initialized" error when trying to connect to Linear
- OAuth flow now works properly on first run (turns out asking for credentials before having a way to receive them was... problematic)
- Git worktrees now work with local-only repositories (no more "fatal: 'origin' does not appear to be a git repository" when you're just trying to test things locally)
- Webhooks now register with the correct URL (ngrok/public URL instead of localhost)
- cyrus-edge-worker@0.0.16
- Added ngrok tunnel support for automatic public URL generation
- Fixed webhook URL registration to use public URLs
- Added getPublicUrl() method to SharedApplicationServer
- cyrus-ndjson-client@0.0.12
- Fixed webhook URL registration to use external server's public URL when available
- cyrus-ai@0.1.30
- Fixed critical crash issue where subprocess failures would bring down the entire application
- Added global error handlers to prevent uncaught exceptions from terminating the process
- Improved error isolation for individual Claude sessions - failures no longer affect other running sessions
- Enhanced error logging with detailed stack traces for better debugging
- cyrus-edge-worker@0.0.15
- cyrus-ai@0.1.28
- Fixed critical streaming hang where sessions would never complete
- Auto-completes streaming prompt when Claude sends result message
- Prevents infinite wait in for-await loop
- cyrus-ai@0.1.27
- Updated to use edge-worker 0.0.12 with fixed claude-runner dependency
- cyrus-ai@0.1.26
- Fixed critical streaming hang issue where Claude Code would block waiting for messages
- Corrected
abortControllerplacement in query options (was at wrong nesting level) - Fixed system prompt parameter name (now uses
customSystemPromptas expected by Claude Code)
- Corrected
- Added
appendSystemPromptoption to ClaudeRunner config for extending default system prompt
- cyrus-ai@0.1.25
- Fixed streaming session detection to prevent "I've queued up your message..." when sessions have completed
- Improved isStreaming() method to check both streaming state and session running status
- cyrus-ai@0.1.23
- Fixed streaming input sessions not properly cleaning up after completion
- Resolves issue where "I've queued up your message..." appeared even after sessions had resolved
- Properly closes input streams when Claude sessions complete naturally
- Added
cyrus check-tokenscommand to validate all Linear OAuth tokens across repositories - Added
cyrus refresh-tokencommand with OAuth flow integration to renew expired tokens - Improved error handling for expired Linear tokens with graceful degradation
- Shows clear error messages with suggested resolution steps
- Continues running with valid repositories when some tokens are expired
- Configuration file location moved from
.edge-config.jsonin current directory to~/.cyrus/config.json- Automatically migrates existing
.edge-config.jsonfiles to the new location - Uses standard user configuration directory for better cross-platform compatibility
- Reports migration status when detected
- Automatically migrates existing
- Default workspace directory changed from
{repository}/workspacesto~/.cyrus/workspaces/{repo-name}- Centralizes all cyrus-related files in the user's home directory
- Uses sanitized repository names as namespace folders
- Existing configurations remain unchanged
- cyrus-ai@0.1.22
- Automatic Linear MCP (Model Context Protocol) server integration
- Claude can now use Linear API tools directly within sessions
- Automatically configures
@tacticlaunch/mcp-linearserver with repository's Linear token - Adds 30+ Linear MCP tools for issue management, comments, projects, and more
- No additional configuration needed - works out of the box with existing Linear tokens
- ClaudeRunner now supports array of MCP config paths for composable configurations
- ClaudeRunner supports inline MCP server configurations alongside file-based configs
- MCP configurations from files and inline sources are merged together
- Fixed webhook signature verification failures after restarting cyrus by extending edge worker registration TTL from 1 hour to 90 days
- Resolves "Webhook signature verification failed for all registered handlers" error that occurred when cyrus was stopped and restarted
- Edge worker registrations in the proxy now persist for 90 days instead of expiring after 1 hour
- New comments on Linear issues queue up when Cyrus is already busy working, so that you can send multiple in a row (#77) (now feed into existing Claude sessions instead of killing and restarting the session
- cyrus-claude-runner@0.0.8
- cyrus-edge-worker@0.0.10
- cyrus-ai@0.1.21
- Added
CYRUS_HOST_EXTERNALenvironment variable to enable external server access (#78)- Set to
trueto listen on0.0.0.0(all interfaces) instead oflocalhost - Enables Docker container deployment and external webhook access scenarios
- Maintains backward compatibility with
localhostas default
- Set to
- BREAKING: Renamed
CYRUS_WEBHOOK_BASE_URLtoCYRUS_BASE_URLfor clearer naming- Action Required: Update environment configuration to use
CYRUS_BASE_URLinstead ofCYRUS_WEBHOOK_BASE_URL - Legacy Support:
CYRUS_WEBHOOK_BASE_URLis still supported for backward compatibility but deprecated - The variable serves both webhook and OAuth callback purposes since they run on the same server
- Action Required: Update environment configuration to use
- cyrus-edge-worker@0.0.9
- cyrus-ai@0.1.19
- Added
CYRUS_OAUTH_CALLBACK_BASE_URLenvironment variable to configure OAuth callback URL (defaults tohttp://localhost:3457) (#69) - Added
CYRUS_OAUTH_CALLBACK_PORTenvironment variable to configure OAuth callback port (defaults to3457) - OAuth callback URL is now fully configurable for different deployment environments (Docker, remote development, custom domains)
- Supports
--env-file=pathoption to load environment variables from custom file - Added
CYRUS_BASE_URLenvironment variable to configure base URL for edge workers (#74) - Added
CYRUS_WEBHOOK_PORTenvironment variable to configure webhook port (defaults to random port 3000-3999) - Implemented shared webhook server architecture to eliminate port conflicts between multiple Linear tokens
- BREAKING: Migrated from Server-Sent Events (SSE) to webhook-only architecture (#74)
- Action Required: Edge workers now receive webhooks instead of SSE streams
- Action Required: Set
CYRUS_BASE_URLenvironment variable if using custom deployment URLs (e.g., ngrok tunnel, server domain) - Action Required: Set
CYRUS_WEBHOOK_PORT=3456environment variable to ensure consistent webhook port - Action Required: Ensure edge workers can receive inbound HTTP requests on webhook ports
- Renamed repository setup script from
secretagentsetup.shtocyrus-setup.sh
- Resolved SSE connection reliability issues by migrating to webhook architecture
- Improved disconnection message formatting
- Removed duplicate disconnection logging
- Upgraded @anthropic-ai/claude-code dependency to version 1.0.31
- cyrus-claude-runner@0.0.3
- cyrus-core@0.0.3
- cyrus-edge-worker@0.0.3
- cyrus-ndjson-client@0.0.3
Initial changelog entry
- cyrus-ai@0.1.9
Initial changelog entry