Agentic orchestrator for parallel coding agents — plans tasks, spawns agents, and autonomously handles CI fixes, merge conflicts, and code reviews.
agent-fleetagent-swarmclaude-codecodex-cligit-worktreesmulti-agentorchestrationorchestratorparallel-agentsparallel-codingskillstmux
* feat: implement SCM and tracker plugins (github, linear) Implement three plugin interfaces from packages/core/src/types.ts: - scm-github: Full GitHub PR lifecycle via `gh` CLI — PR detection by branch, state tracking, CI checks, reviews, review decision, pending comments, automated bot comment detection (cursor[bot], codecov, etc.), and merge readiness (CI + reviews + conflicts + draft). - tracker-github: GitHub Issues tracker via `gh` CLI — issue CRUD, completion check, branch naming (feat/issue-N), prompt generation, list/filter/update/create with label and assignee support. - tracker-linear: Linear issue tracker via GraphQL API (LINEAR_API_KEY) — issue fetch, completion check, branch naming (feat/IDENTIFIER), prompt generation, list with team/state/label filters, state transitions via workflow state resolution, issue creation with teamId config. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address PR review — GraphQL injection, N+1 queries, timeouts, tests - tracker-linear: use GraphQL variables in listIssues to prevent injection - tracker-linear: add 30s HTTP timeout to linearQuery - tracker-linear: fix issueUrl to use workspace slug from project config - tracker-linear: add labels/assignee support to createIssue - scm-github: rewrite getPendingComments to use GraphQL reviewThreads with real isResolved status instead of hardcoding false - scm-github: simplify getAutomatedComments to single API call (N+1 fix) - scm-github: add 30s timeout to gh CLI calls - scm-github: fix parseDate to return epoch instead of fabricating dates - scm-github: add repo format validation in detectPR - scm-github: fix getCISummary to not count all-skipped as passing - tracker-github: add 30s timeout to gh CLI calls - tracker-github: fix createIssue to not use unsupported --json flag - Add comprehensive vitest tests for scm-github and tracker-github Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address Codex review — assignee lookup, GraphQL vars, status checks Iteration 1 fixes (8 issues from Codex review): - tracker-linear: remove invalid assigneeDisplayName, resolve assignee by display name to ID via users query after creation - tracker-linear: add HTTP status code check in linearQuery - tracker-linear: throw on missing workflow state in updateIssue - scm-github: use GraphQL variables ($owner, $name, $number) in getPendingComments instead of string interpolation - scm-github: guard against empty comment nodes in review threads - scm-github: use mergeStateStatus in getMergeability (BEHIND, BLOCKED) - tracker-github: default description to "" in createIssue Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address PR review + lint — error context, GraphQL vars, mergeability - scm-github/tracker-github: wrap gh() errors with command context + cause - scm-github: use GraphQL variables ($owner, $name, $number) in getPendingComments to prevent injection - scm-github: guard against empty review thread nodes - scm-github: incorporate mergeStateStatus (BEHIND/BLOCKED) in getMergeability - tracker-linear: add identifier vs UUID comment in updateIssue - Fix ESLint preserve-caught-error violations - Remove unused mockGhRaw in scm-github tests Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: add pagination to getAutomatedComments and increase thread limit - getAutomatedComments: add --paginate flag to REST API call to fetch all review comments beyond the default 30-item first page - getPendingComments: increase GraphQL reviewThreads limit from 100 to 250 (GitHub's max for connections) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use per_page=100 instead of --paginate for JSON-safe pagination Replace --paginate with -F per_page=100 in getAutomatedComments to avoid concatenated JSON arrays that break JSON.parse on multi-page responses. 100 is GitHub's max per_page value. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: filter out resolved threads in getPendingComments The method name implies it should only return unresolved/pending review threads. The isResolved data was already fetched via GraphQL but was not being filtered on, causing resolved threads to be included in results. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * test: add comprehensive tracker-linear test suite (53 tests) Covers all Tracker interface methods: getIssue, isCompleted, issueUrl, branchName, generatePrompt, listIssues, updateIssue, createIssue. Mocks node:https request to simulate Linear GraphQL API responses. Tests state mapping, error handling, assignee/label resolution, and GraphQL variable injection. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address 6 bugbot review comments on PR #4 - GraphQL reviewThreads(first: 250) → first: 100 (GitHub max) - noConflicts false when mergeable is UNKNOWN (not just CONFLICTING) - updateIssue now handles labels and assignee (not just state/comment) - Add res.on("error") handler in linearQuery to prevent crashes - createIssue returns only actually-applied labels, not all requested - Tests added/updated for all fixes (144 total across 3 plugins) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: make Linear updateIssue labels additive to match GitHub behavior Linear's issueUpdate replaces all labels, while GitHub's --add-label is additive. Now fetches existing label IDs first and merges with new ones before sending to issueUpdate, ensuring consistent behavior across both tracker implementations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: default listIssues to open state in tracker-linear When no state filter is specified, tracker-github defaults to "open" but tracker-linear was returning all issues. Now defaults to excluding completed/canceled issues, matching tracker-github behavior. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add Composio SDK support to tracker-linear Allow users with a COMPOSIO_API_KEY to use the Linear tracker without a separate LINEAR_API_KEY. The plugin auto-detects which key is available and routes through either the direct Linear GraphQL API or Composio's LINEAR_RUN_QUERY_OR_MUTATION tool. All existing queries and response parsing are reused via a GraphQLTransport abstraction. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: address 2 bugbot review comments on PR #4 1. getCIChecks now throws on error instead of silently returning [], preventing a fail-open where CI appears healthy when we can't fetch check status. getCISummary catches the error and returns "failing". 2. Handle GitHub's UNSTABLE mergeStateStatus (required checks failing) as a merge blocker in getMergeability. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: prevent unhandled promise rejection in Composio timeout race When the timeout wins Promise.race in the Composio transport, the resultPromise is left without a rejection handler. If the SDK call later rejects, it becomes an unhandled promise rejection that crashes Node.js 20+ with --unhandled-rejections=throw. Attach no-op .catch() to both resultPromise and timeoutPromise before the race so whichever promise loses has its rejection silently handled. Also adds plugin integration tests (core -> real plugins -> mocked gh CLI). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: chain error cause in getCIChecks and fix core build - getCIChecks catch now preserves the original error via { cause: err } instead of discarding it, matching the pattern used by the gh() helper - Add tsconfig.build.json to core that excludes __tests__/ from build compilation, preventing TS5055 errors from circular workspace deps (integration tests import plugin packages that depend back on core) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: remove circular devDeps, address bugbot comments - Remove plugin devDependencies from core/package.json that created a circular dependency (core -> plugins -> core), breaking CI build order - Document in_progress state as intentional no-op in tracker-github updateIssue (GitHub Issues only supports open/closed) - Remove @composio/core optional peerDependency from tracker-linear; the dynamic import() already handles the missing package gracefully, and the peer dep was pulling composio + transitive deps into lockfile Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add real integration test for tracker-linear against Linear API Creates a test that exercises the full tracker-linear plugin lifecycle against the real Linear API — createIssue, getIssue, isCompleted, listIssues, updateIssue (comment, close, reopen), generatePrompt, branchName, issueUrl. Each run creates a throwaway test issue and trashes it in cleanup. Skipped when LINEAR_API_KEY is not set. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * ci: pass LINEAR_API_KEY and LINEAR_TEAM_ID to integration tests Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: support both LINEAR_API_KEY and COMPOSIO_API_KEY in integration test The tracker-linear integration test now runs with either credential: - LINEAR_API_KEY: direct Linear API (full cleanup via trash) - COMPOSIO_API_KEY: via Composio SDK (cleanup falls back to closing) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: don't pass COMPOSIO_API_KEY to CI integration tests When both LINEAR_API_KEY and COMPOSIO_API_KEY are set, the plugin prefers the Composio transport which requires @composio/core SDK. The SDK isn't installed in CI, so use the direct LINEAR_API_KEY transport which has no extra dependencies. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use import.meta.url in vitest config, default createIssue description - Replace __dirname with import.meta.url-derived dirname in ESM config - Default createIssue description to "" for defensive safety Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: map CANCELLED and ACTION_REQUIRED CI conclusions to failed Terminal check conclusions (CANCELLED, ACTION_REQUIRED) were falling through to "pending", causing the lifecycle manager to wait forever. Also changed the default else branch to "failed" (fail-closed). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .cursor | ||
| .github/workflows | ||
| artifacts | ||
| packages | ||
| scripts | ||
| .gitignore | ||
| .prettierignore | ||
| .prettierrc | ||
| CLAUDE.md | ||
| CLAUDE.orchestrator.md | ||
| agent-orchestrator.yaml.example | ||
| eslint.config.js | ||
| package.json | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| tsconfig.base.json | ||