feat: add npm publishing support with @composio scope

Set up Changesets for version management, add publish metadata to all 20
packages under the @composio scope, create an unscoped wrapper package
(@composio/agent-orchestrator) for global install, and add a GitHub
Actions release workflow.

- Rename all packages from @agent-orchestrator/* to @composio/ao-*
- Add @composio/agent-orchestrator wrapper (bin shim → @composio/ao-cli)
- Add license, repository, homepage, bugs, files, engines to all packages
- Add .npmrc (access=public), MIT LICENSE file
- Add .changeset/ config with linked versioning for all packages
- Add .github/workflows/release.yml (changesets publish CI)
- Add changeset, version-packages, release scripts to root

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Prateek 2026-02-14 20:10:36 +05:30
parent 1bd597c443
commit 7257650862
117 changed files with 1479 additions and 623 deletions

8
.changeset/README.md Normal file
View File

@ -0,0 +1,8 @@
# Changesets
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)

37
.changeset/config.json Normal file
View File

@ -0,0 +1,37 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.1.2/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [
[
"@composio/ao-core",
"@composio/ao-cli",
"@composio/agent-orchestrator",
"@composio/ao-plugin-runtime-tmux",
"@composio/ao-plugin-runtime-process",
"@composio/ao-plugin-agent-claude-code",
"@composio/ao-plugin-agent-codex",
"@composio/ao-plugin-agent-aider",
"@composio/ao-plugin-agent-opencode",
"@composio/ao-plugin-workspace-worktree",
"@composio/ao-plugin-workspace-clone",
"@composio/ao-plugin-tracker-github",
"@composio/ao-plugin-tracker-linear",
"@composio/ao-plugin-scm-github",
"@composio/ao-plugin-notifier-desktop",
"@composio/ao-plugin-notifier-slack",
"@composio/ao-plugin-notifier-webhook",
"@composio/ao-plugin-notifier-composio",
"@composio/ao-plugin-terminal-iterm2",
"@composio/ao-plugin-terminal-web"
]
],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": [
"@composio/ao-web",
"@composio/ao-integration-tests"
]
}

View File

@ -17,7 +17,7 @@ Agent Orchestrator is a TypeScript monorepo for managing parallel AI coding agen
- **Security**: Watch for command injection (especially in shell/tmux/git commands), AppleScript injection, GraphQL injection, unsanitized user input in API routes
- **Shell execution**: Prefer `execFile` over `exec` to avoid shell injection. Flag any use of `exec` or string concatenation in shell commands
- **Plugin pattern**: Plugins must export `{ manifest, create } satisfies PluginModule<T>` with types from `@agent-orchestrator/core`
- **Plugin pattern**: Plugins must export `{ manifest, create } satisfies PluginModule<T>` with types from `@composio/ao-core`
- **Type safety**: Flag `as unknown as T` casts, unguarded `JSON.parse`, and type re-declarations that should import from core
- **Resource leaks**: Check for uncleared intervals/timeouts, uncleaned event listeners, missing `cancel()` on streams
- **ESM compliance**: Imports must use `.js` extension for local files, `node:` prefix for builtins

View File

@ -36,11 +36,11 @@ jobs:
cache: pnpm
- run: pnpm install --frozen-lockfile
# Build all non-web packages
- run: pnpm -r --filter '!@agent-orchestrator/web' build
- run: pnpm -r --filter '!@composio/ao-web' build
# Typecheck all non-web packages
- run: pnpm -r --filter '!@agent-orchestrator/web' typecheck
- run: pnpm -r --filter '!@composio/ao-web' typecheck
# Build web (Next.js build includes its own typecheck)
- run: pnpm --filter @agent-orchestrator/web build
- run: pnpm --filter @composio/ao-web build
test:
name: Test
@ -53,5 +53,5 @@ jobs:
node-version: 20
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm -r --filter '!@agent-orchestrator/web' build
- run: pnpm -r --filter '!@composio/ao-web' build
- run: pnpm test

View File

@ -48,7 +48,7 @@ jobs:
# --- Build project ---
- run: pnpm install --frozen-lockfile
- run: pnpm -r --filter '!@agent-orchestrator/web' build
- run: pnpm -r --filter '!@composio/ao-web' build
# --- Run integration tests ---
- name: Run integration tests

38
.github/workflows/release.yml vendored Normal file
View File

@ -0,0 +1,38 @@
name: Release
on:
push:
branches: [main]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: false
jobs:
release:
name: Release
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
id-token: write
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: pnpm
registry-url: "https://registry.npmjs.org"
- run: pnpm install --frozen-lockfile
- run: pnpm -r --filter '!@composio/ao-web' build
- uses: changesets/action@v1
with:
publish: pnpm release
version: pnpm version-packages
title: "chore: version packages"
commit: "chore: version packages"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

1
.npmrc Normal file
View File

@ -0,0 +1 @@
access=public

461
CLAUDE.md
View File

@ -1,11 +1,5 @@
# CLAUDE.md — Agent Orchestrator
## Quick Start
- **Adding a plugin?** → [Plugin Development](#plugin-development)
- **Modifying core types?** → Read `packages/core/src/types.ts` first, then [Architecture](#architecture-deep-dive)
- **First contribution?** → Read [What This Is](#what-this-is), [Key Files](#key-files), [Monorepo Tools](#monorepo-tools)
## What This Is
Open-source system for orchestrating parallel AI coding agents. Agent-agnostic (Claude Code, Codex, Aider), runtime-agnostic (tmux, docker, k8s), tracker-agnostic (GitHub, Linear, Jira). Manages session lifecycle, tracks PR/CI/review state, auto-handles routine issues (CI failures, review comments), pushes notifications to humans only when needed.
@ -20,273 +14,44 @@ TypeScript (ESM), Node 20+, pnpm workspaces. Next.js 15 (App Router) + Tailwind.
8 plugin slots — every abstraction is swappable:
| Slot | Interface | Default Plugin | Purpose |
| --------- | ----------- | -------------- | --------------------------------- |
| Runtime | `Runtime` | tmux | Where sessions execute |
| Agent | `Agent` | claude-code | AI coding tool adapter |
| Workspace | `Workspace` | worktree | Code isolation (worktree, clone) |
| Tracker | `Tracker` | github | Issue tracking (GitHub, Linear) |
| SCM | `SCM` | github | PR/CI/reviews |
| Notifier | `Notifier` | desktop | Push notifications |
| Terminal | `Terminal` | iterm2 | Human interaction UI |
| Lifecycle | (core) | — | State machine + reactions (core) |
| Slot | Interface | Default Plugin |
| --------- | ----------- | -------------- |
| Runtime | `Runtime` | tmux |
| Agent | `Agent` | claude-code |
| Workspace | `Workspace` | worktree |
| Tracker | `Tracker` | github |
| SCM | `SCM` | github |
| Notifier | `Notifier` | desktop |
| Terminal | `Terminal` | iterm2 |
| Lifecycle | (core) | — |
**All interfaces defined in `packages/core/src/types.ts` — read this file first.**
## Key Files
1. **`packages/core/src/types.ts`** — source of truth for all interfaces
2. **`packages/core/src/services/session-manager.ts`** — session CRUD + spawn logic
3. **`packages/core/src/services/lifecycle-manager.ts`** — state machine + reactions
4. **`packages/core/src/services/plugin-registry.ts`** — plugin discovery + loading
5. **`agent-orchestrator.yaml.example`** — config format
## Looking for X?
| You want to... | Look here |
| ---------------------------------- | ------------------------------------------------------------ |
| Add a new plugin | `packages/plugins/`, follow `notifier-desktop` pattern |
| Add a field to Session | `packages/core/src/types.ts``Session` interface |
| Add an event type | `packages/core/src/types.ts``EventType` union |
| Modify spawn logic | `packages/core/src/services/session-manager.ts``spawn()` |
| Modify state machine | `packages/core/src/services/lifecycle-manager.ts` |
| Add a CLI command | `packages/cli/src/commands/` |
| Modify web dashboard | `packages/web/src/` |
| Add a reaction | `packages/core/src/services/lifecycle-manager.ts` → handlers |
| Test a plugin | `packages/plugins/<plugin>/src/__tests__/` |
| Modify config schema | `packages/core/src/config.ts` → Zod schemas |
## Monorepo Tools
```bash
# Install all dependencies
pnpm install
# Build all packages
pnpm build
# Build one package (builds dependencies automatically)
pnpm --filter @agent-orchestrator/core build
# Run all tests
pnpm test
# Run tests in one package
pnpm --filter @agent-orchestrator/core test
# Run tests in watch mode
pnpm --filter @agent-orchestrator/core test -- --watch
# Add a dependency to a package
pnpm --filter @agent-orchestrator/core add <package-name>
# Lint all
pnpm lint
# Typecheck all
pnpm typecheck
# Before committing (MUST pass)
pnpm lint && pnpm typecheck
```
## Common Tasks
### Adding a New Plugin
1. **Create plugin directory**: `packages/plugins/<slot>-<name>/`
```bash
mkdir -p packages/plugins/runtime-docker/src
cd packages/plugins/runtime-docker
```
2. **Create package.json**:
```json
{
"name": "@agent-orchestrator/plugin-runtime-docker",
"version": "0.1.0",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
},
"devDependencies": {
"typescript": "^5.7.3"
}
}
```
3. **Create tsconfig.json** (copy from another plugin)
4. **Implement plugin** in `src/index.ts`:
```typescript
import type { PluginModule, Runtime } from "@agent-orchestrator/core";
export const manifest = {
name: "docker",
slot: "runtime" as const,
description: "Runtime plugin: Docker containers",
version: "0.1.0",
};
export function create(): Runtime {
return {
name: "docker",
async create(config) { /* ... */ },
async destroy(handle) { /* ... */ },
async sendMessage(handle, message) { /* ... */ },
async getOutput(handle, lines) { /* ... */ },
async isAlive(handle) { /* ... */ },
};
}
export default { manifest, create } satisfies PluginModule<Runtime>;
```
5. **Build and test**:
```bash
pnpm --filter @agent-orchestrator/plugin-runtime-docker build
pnpm --filter @agent-orchestrator/plugin-runtime-docker test
```
6. **Register in core** (if built-in): `packages/core/src/services/plugin-registry.ts``loadBuiltins()`
### Adding a Field to Session
1. **Update Session interface**: `packages/core/src/types.ts`
```typescript
export interface Session {
// ... existing fields
newField: string | null; // Add your field
}
```
2. **Update SessionManager**: `packages/core/src/services/session-manager.ts`
- Initialize the field in `spawn()`
- Update metadata read/write if needed
3. **Update web dashboard** (if displayed): `packages/web/src/components/`
4. **Rebuild core**:
```bash
pnpm --filter @agent-orchestrator/core build
```
### Adding an Event Type
1. **Add to EventType union**: `packages/core/src/types.ts`
```typescript
export type EventType =
| "session.spawned"
// ... existing events
| "your.new_event"; // Add here
```
2. **Emit the event**: In the relevant service, use `eventEmitter.emit()`
3. **Add reaction handler** (optional): `packages/core/src/services/lifecycle-manager.ts`
## Plugin Development
### The Plugin Pattern
Every plugin exports:
- **`manifest`** — metadata (name, slot, description, version)
- **`create()`** — factory function that returns the interface implementation
- **`default export`** — `{ manifest, create } satisfies PluginModule<T>`
**Why `satisfies`?** Compile-time type checking. Using `const plugin = { ... }; export default plugin;` loses type safety.
### Simplest Example: notifier-desktop
See `packages/plugins/notifier-desktop/src/index.ts` — ~150 lines, implements `Notifier` interface, uses `osascript` (macOS) or `notify-send` (Linux).
### Most Complete Example: agent-claude-code
See `packages/plugins/agent-claude-code/src/index.ts` — implements `Agent` interface, includes:
- Process detection (ps, TTY lookup)
- JSONL parsing (session info extraction)
- Activity classification (terminal output patterns)
- Post-launch setup (hook injection)
### Testing Plugins
1. **Create test file**: `packages/plugins/<plugin>/src/__tests__/index.test.ts`
2. **Mock dependencies**: Use vitest `vi.mock()` for `child_process`, `fs`, etc.
3. **Test edge cases**: timeouts, corrupted data, missing files, concurrent access
Example structure:
```typescript
import { describe, it, expect, vi } from "vitest";
import { create } from "../index.js";
describe("my-plugin", () => {
it("should handle timeout", async () => {
const plugin = create();
// ... test timeout scenario
});
});
```
## Architecture Deep Dive
### Data Flow: Spawn → Execute
## Directory Structure
```
CLI: ao spawn my-app issue-42
SessionManager.spawn()
↓ reads config
↓ generates prompt via Tracker.generatePrompt()
Workspace.create() → creates worktree/clone
Agent.getLaunchCommand() → builds command
Agent.getEnvironment() → sets env vars
Runtime.create() → starts session (tmux/docker/k8s)
↓ sends launch command
Agent starts executing in workspace
LifecycleManager polls → detects state changes
Reactions trigger (CI failures, review comments)
Notifier.notify() → pushes to human
packages/
core/ — @composio/ao-core (types, config, services)
cli/ — @composio/ao-cli (the `ao` command)
web/ — @composio/ao-web (Next.js dashboard)
plugins/
runtime-{tmux,process}/
agent-{claude-code,codex,aider,opencode}/
workspace-{worktree,clone}/
tracker-{github,linear}/
scm-github/
notifier-{desktop,slack,composio,webhook}/
terminal-{iterm2,web}/
```
### State Machine: Session Lifecycle
## Key Files (Read These First)
```
spawning
↓ agent starts
working
↓ PR created
pr_open
↓ CI fails → ci_failed (reaction: send fix prompt)
↓ CI passes + review pending → review_pending
↓ changes requested → changes_requested (reaction: send review comments)
↓ approved + CI passing → approved (reaction: notify human)
↓ ready to merge → mergeable (reaction: notify or auto-merge)
↓ merged
merged
↓ cleanup
(session killed)
```
### Key Abstractions
- **Session** — a running agent instance (state, metadata, runtime handle)
- **RuntimeHandle** — opaque handle to communicate with a session (tmux session name, container ID, pod name)
- **PluginModule** — what every plugin exports (`manifest` + `create()`)
- **OrchestratorEvent** — events emitted by lifecycle manager (session.spawned, pr.created, ci.failing, etc.)
- **ReactionConfig** — rules for auto-responding to events (send-to-agent, notify, auto-merge)
1. `packages/core/src/types.ts` — all interfaces (Runtime, Agent, Workspace, Tracker, SCM, Notifier, Terminal)
2. `agent-orchestrator.yaml.example` — config format
3. Plugin examples:
- `packages/plugins/runtime-tmux/src/index.ts` — Runtime implementation
- `packages/plugins/agent-claude-code/src/index.ts` — Agent implementation
4. This file (CLAUDE.md) — code conventions
## TypeScript Conventions (MUST follow)
@ -300,107 +65,50 @@ merged
- **Prefer `const`**`let` only when reassignment needed, never `var`
- **Semicolons, double quotes, 2-space indent** — enforced by Prettier
## Shell Command Execution (MUST follow — security critical)
## Plugin Pattern (MUST follow)
**Always use `execFile` or `spawn`, NEVER `exec`**
### Why? exec is vulnerable to shell injection
**Exploit example:**
```typescript
// VULNERABLE
import { exec } from "node:child_process";
const branchName = "feat/add-feature; rm -rf /"; // malicious input
exec(`git checkout ${branchName}`); // executes: git checkout feat/add-feature; rm -rf /
```
**Safe:**
```typescript
// SAFE
import { execFile } from "node:child_process";
import { promisify } from "node:util";
const execFileAsync = promisify(execFile);
const branchName = "feat/add-feature; rm -rf /"; // malicious input
await execFileAsync("git", ["checkout", branchName], { timeout: 30_000 });
// git receives the string literally, no shell interpretation
```
**Rules:**
- **Always use `execFile`** (or `spawn`) — args as array, bypasses shell
- **Always add timeouts**`{ timeout: 30_000 }` for external commands
- **Never interpolate user input** — pass as array args, not string template
- **Do NOT use `JSON.stringify` for shell escaping** — it doesn't escape `$`, backticks, `$()`
## Common Mistakes with Examples
### 1. Missing `.js` extension in imports
Every plugin exports a `PluginModule` with inline `satisfies` for compile-time type checking:
```typescript
// BAD — runtime error with ESM
import { foo } from "./bar";
import type { PluginModule, Runtime } from "@composio/ao-core";
// GOOD
import { foo } from "./bar.js";
```
export const manifest = {
name: "tmux",
slot: "runtime" as const,
description: "Runtime plugin: tmux sessions",
version: "0.1.0",
};
**Why:** ESM requires explicit file extensions. Node won't auto-resolve.
### 2. Unsafe type casting
```typescript
// BAD — crashes on unexpected data
const data = JSON.parse(input) as MyType;
data.requiredField.toUpperCase(); // TypeError if field is missing
// GOOD — validate before using
const parsed: unknown = JSON.parse(input);
if (
typeof parsed === "object" &&
parsed !== null &&
"requiredField" in parsed &&
typeof parsed.requiredField === "string"
) {
const data = parsed as MyType;
data.requiredField.toUpperCase(); // safe
export function create(): Runtime {
return {
name: "tmux",
async create(config) { /* ... */ },
async destroy(handle) { /* ... */ },
// ... implement interface methods
};
}
```
### 3. `export default plugin` without `satisfies`
```typescript
// BAD — loses type checking
const plugin = { manifest, create };
export default plugin; // no compile-time verification
// GOOD — compile-time type checking
export default { manifest, create } satisfies PluginModule<Runtime>;
```
### 4. Using `on("exit")` instead of `once("exit")`
**Do NOT** use `const plugin = { ... }; export default plugin;` — always inline `satisfies`.
## Shell Command Execution (MUST follow — security critical)
- **Always use `execFile`** (or `spawn`) — NEVER `exec` (shell injection risk)
- **Always add timeouts**`{ timeout: 30_000 }` for external commands
- **Never interpolate user input** — pass as array args, not string template
- **Do NOT use `JSON.stringify` for shell escaping** — not a shell escaping function
```typescript
// BAD — handler called multiple times if event emits multiple times
process.on("exit", cleanup);
// GOOD
import { execFile } from "node:child_process";
import { promisify } from "node:util";
const execFileAsync = promisify(execFile);
const { stdout } = await execFileAsync("git", ["branch", "--show-current"], { timeout: 30_000 });
// GOOD — handler called once
process.once("exit", cleanup);
```
### 5. Forgetting cleanup on disconnect
```typescript
// BAD — interval keeps running after session dies
const interval = setInterval(poll, 1000);
// GOOD — cleanup on destroy
const interval = setInterval(poll, 1000);
return {
// ... interface methods
async destroy() {
clearInterval(interval);
},
};
// BAD — shell injection risk
exec(`git checkout ${branchName}`); // branchName could contain ; rm -rf /
```
## Error Handling
@ -417,28 +125,45 @@ return {
- Types/Interfaces: `PascalCase`
- Functions/variables: `camelCase`
- Constants: `UPPER_SNAKE_CASE` (only true constants: env vars, regex patterns)
- Test files: `*.test.ts` (co-located in `__tests__/`)
- Test files: `*.test.ts` (co-located or in `__tests__/`)
## Commands
```bash
pnpm install # install deps
pnpm build # build all packages
pnpm typecheck # typecheck
pnpm lint # ESLint check
pnpm lint:fix # ESLint auto-fix
pnpm format # Prettier format
pnpm format:check # Prettier check (CI)
pnpm test # run tests
# Before committing
pnpm lint && pnpm typecheck
```
## Common Mistakes to Avoid
- Using `exec` instead of `execFile` — security vulnerability
- Using `JSON.stringify` for shell escaping — does not escape `$`, backticks, `$()`
- Missing `.js` extension in local imports — runtime error with ESM
- Using bare `"fs"` instead of `"node:fs"` — inconsistent
- Casting with `as unknown as T` — bypasses type safety, crashes on bad data
- `export default plugin` without `satisfies PluginModule<T>` — loses type checking
- Interpolating user input into shell commands, AppleScript, or GraphQL queries
- Forgetting to clean up setInterval/setTimeout on disconnect/destroy
- Using `on("exit")` instead of `once("exit")` for one-time handlers
## Config
Config loaded from `agent-orchestrator.yaml` (see `agent-orchestrator.yaml.example`). Paths support `~` expansion. Validated with Zod at load time. Per-project overrides for plugins and reactions.
## Design Decisions (The "Why")
## Design Decisions
1. **Stateless orchestrator** — no database, flat metadata files + event log
- **Why:** Debuggability (cat metadata file), no database dependency, survives crashes
2. **Plugins implement interfaces** — pure implementation of interface from `types.ts`
- **Why:** Swappability (tmux → docker), testability (mock plugins), extensibility
3. **Push notifications** — Notifier is primary human interface, not dashboard
- **Why:** Human doesn't poll. Spawn agents, walk away, get notified when needed.
4. **Two-tier event handling** — auto-handle routine issues (CI, reviews), notify human when judgment needed
- **Why:** Reduce noise, scale to many agents, only interrupt human for decisions
5. **Flat key=value metadata files**`branch=feat/foo` not JSON
- **Why:** Backwards-compatible with bash scripts, easy to parse/debug
4. **Two-tier event handling** — auto-handle routine issues, notify human when judgment needed
5. **Backwards-compatible metadata** — flat key=value files
6. **Security first**`execFile` not `exec`, validate all external input
- **Why:** Orchestrator runs user-provided code. Shell injection is real threat.

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Composio, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -669,7 +669,7 @@ agent-orchestrator/
├── agent-orchestrator.yaml.example
├── packages/
│ ├── core/ # @agent-orchestrator/core
│ ├── core/ # @composio/ao-core
│ │ └── src/
│ │ ├── types.ts # All interfaces + types
│ │ ├── config.ts # YAML config loader + Zod validation
@ -680,7 +680,7 @@ agent-orchestrator/
│ │ ├── metadata.ts # Flat-file read/write
│ │ └── index.ts
│ │
│ ├── cli/ # @agent-orchestrator/cli → `ao` binary
│ ├── cli/ # @composio/ao-cli → `ao` binary
│ │ └── src/
│ │ ├── index.ts # Commander.js setup
│ │ └── commands/
@ -694,7 +694,7 @@ agent-orchestrator/
│ │ ├── dashboard.ts # ao dashboard (starts web)
│ │ └── open.ts # ao open [session|all]
│ │
│ ├── web/ # @agent-orchestrator/web
│ ├── web/ # @composio/ao-web
│ │ ├── next.config.ts
│ │ └── src/
│ │ ├── app/

View File

@ -11,17 +11,21 @@
"type": "module",
"scripts": {
"build": "pnpm -r build",
"dev": "pnpm --filter @agent-orchestrator/web dev",
"dev": "pnpm --filter @composio/ao-web dev",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"format": "prettier --write .",
"format:check": "prettier --check .",
"typecheck": "pnpm -r typecheck",
"test": "pnpm -r --filter '!@agent-orchestrator/web' test",
"test:integration": "pnpm --filter @agent-orchestrator/integration-tests test:integration",
"clean": "pnpm -r clean"
"test": "pnpm -r --filter '!@composio/ao-web' test",
"test:integration": "pnpm --filter @composio/ao-integration-tests test:integration",
"clean": "pnpm -r clean",
"changeset": "changeset",
"version-packages": "changeset version",
"release": "pnpm build && changeset publish"
},
"devDependencies": {
"@changesets/cli": "^2.29.8",
"@eslint/js": "^10.0.1",
"@types/node": "^25.2.3",
"eslint": "^10.0.0",

View File

@ -0,0 +1,2 @@
#!/usr/bin/env node
import "@composio/ao-cli";

View File

@ -0,0 +1,28 @@
{
"name": "@composio/agent-orchestrator",
"version": "0.1.0",
"description": "Orchestrate parallel AI coding agents — global CLI wrapper",
"license": "MIT",
"type": "module",
"bin": {
"ao": "bin/ao.js"
},
"files": [
"bin"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/agent-orchestrator"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"dependencies": {
"@composio/ao-cli": "workspace:*"
}
}

View File

@ -20,7 +20,7 @@ vi.mock("../../src/lib/shell.js", () => ({
getTmuxActivity: vi.fn().mockResolvedValue(null),
}));
vi.mock("@agent-orchestrator/core", () => ({
vi.mock("@composio/ao-core", () => ({
loadConfig: () => mockConfigRef.current,
}));

View File

@ -34,7 +34,7 @@ vi.mock("ora", () => ({
}),
}));
vi.mock("@agent-orchestrator/core", () => ({
vi.mock("@composio/ao-core", () => ({
loadConfig: () => mockConfigRef.current,
}));

View File

@ -31,7 +31,7 @@ vi.mock("../../src/lib/session-utils.js", () => ({
findProjectForSession: () => null,
}));
vi.mock("@agent-orchestrator/core", () => ({
vi.mock("@composio/ao-core", () => ({
loadConfig: () => {
throw new Error("no config");
},

View File

@ -30,7 +30,7 @@ vi.mock("../../src/lib/shell.js", () => ({
},
}));
vi.mock("@agent-orchestrator/core", () => ({
vi.mock("@composio/ao-core", () => ({
loadConfig: () => mockConfigRef.current,
}));

View File

@ -40,7 +40,7 @@ vi.mock("ora", () => ({
}),
}));
vi.mock("@agent-orchestrator/core", async (importOriginal) => {
vi.mock("@composio/ao-core", async (importOriginal) => {
const actual: Record<string, unknown> = await importOriginal();
return {
loadConfig: () => mockConfigRef.current,
@ -238,7 +238,7 @@ describe("spawn command", () => {
await program.parseAsync(["node", "test", "spawn", "my-app", "INT-100"]);
// Prompt is sent via core tmuxSendKeys (handles multi-line via load-buffer)
const { tmuxSendKeys } = await import("@agent-orchestrator/core");
const { tmuxSendKeys } = await import("@composio/ao-core");
expect(tmuxSendKeys).toHaveBeenCalledWith(
"app-1",
expect.stringContaining("INT-100"),

View File

@ -33,7 +33,7 @@ vi.mock("../../src/lib/shell.js", () => ({
},
}));
vi.mock("@agent-orchestrator/core", () => ({
vi.mock("@composio/ao-core", () => ({
loadConfig: () => mockConfigRef.current,
}));

View File

@ -1,6 +1,6 @@
import { describe, it, expect } from "vitest";
import { getAgent, getAgentByName } from "../../src/lib/plugins.js";
import type { OrchestratorConfig } from "@agent-orchestrator/core";
import type { OrchestratorConfig } from "@composio/ao-core";
function makeConfig(
defaultAgent: string,

View File

@ -1,6 +1,6 @@
import { describe, it, expect } from "vitest";
import { escapeRegex, matchesPrefix, findProjectForSession } from "../../src/lib/session-utils.js";
import type { OrchestratorConfig } from "@agent-orchestrator/core";
import type { OrchestratorConfig } from "@composio/ao-core";
describe("escapeRegex", () => {
it("escapes dots, asterisks, plus, question marks", () => {

View File

@ -1,12 +1,28 @@
{
"name": "@agent-orchestrator/cli",
"name": "@composio/ao-cli",
"version": "0.1.0",
"description": "CLI for agent-orchestrator — the `ao` command",
"license": "MIT",
"type": "module",
"bin": {
"ao": "dist/index.js"
},
"main": "dist/index.js",
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/cli"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"dev": "tsx src/index.ts",
@ -16,11 +32,11 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*",
"@agent-orchestrator/plugin-agent-claude-code": "workspace:*",
"@agent-orchestrator/plugin-agent-codex": "workspace:*",
"@agent-orchestrator/plugin-agent-aider": "workspace:*",
"@agent-orchestrator/plugin-scm-github": "workspace:*",
"@composio/ao-core": "workspace:*",
"@composio/ao-plugin-agent-claude-code": "workspace:*",
"@composio/ao-plugin-agent-codex": "workspace:*",
"@composio/ao-plugin-agent-aider": "workspace:*",
"@composio/ao-plugin-scm-github": "workspace:*",
"chalk": "^5.4.0",
"commander": "^13.0.0",
"ora": "^8.1.0",

View File

@ -5,21 +5,21 @@ import { resolve, dirname } from "node:path";
import { existsSync } from "node:fs";
import chalk from "chalk";
import type { Command } from "commander";
import { loadConfig } from "@agent-orchestrator/core";
import { loadConfig } from "@composio/ao-core";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const require = createRequire(import.meta.url);
/**
* Locate the @agent-orchestrator/web package directory.
* Locate the @composio/ao-web package directory.
* Uses createRequire for ESM-compatible require.resolve, with fallback
* to sibling package paths that work from both src/ and dist/.
*/
function findWebDir(): string {
// Try to resolve from node_modules first (installed as workspace dep)
try {
const pkgJson = require.resolve("@agent-orchestrator/web/package.json");
const pkgJson = require.resolve("@composio/ao-web/package.json");
return resolve(pkgJson, "..");
} catch {
// Fallback: sibling package in monorepo (works both from src/ and dist/)
@ -60,7 +60,7 @@ export function registerDashboard(program: Command): void {
if (!existsSync(resolve(webDir, "package.json"))) {
console.error(
chalk.red(
"Could not find @agent-orchestrator/web package.\n" +
"Could not find @composio/ao-web package.\n" +
"Ensure it is installed: pnpm install",
),
);

View File

@ -1,6 +1,6 @@
import chalk from "chalk";
import type { Command } from "commander";
import { loadConfig } from "@agent-orchestrator/core";
import { loadConfig } from "@composio/ao-core";
import { exec, getTmuxSessions } from "../lib/shell.js";
import { matchesPrefix } from "../lib/session-utils.js";

View File

@ -1,7 +1,7 @@
import chalk from "chalk";
import ora from "ora";
import type { Command } from "commander";
import { loadConfig } from "@agent-orchestrator/core";
import { loadConfig } from "@composio/ao-core";
import { exec, gh, getTmuxSessions } from "../lib/shell.js";
import { getSessionDir, readMetadata } from "../lib/metadata.js";
import { matchesPrefix } from "../lib/session-utils.js";

View File

@ -3,7 +3,7 @@ import { tmpdir } from "node:os";
import { join } from "node:path";
import chalk from "chalk";
import type { Command } from "commander";
import { type Agent, loadConfig } from "@agent-orchestrator/core";
import { type Agent, loadConfig } from "@composio/ao-core";
import { exec, tmux } from "../lib/shell.js";
import { getAgent, getAgentByName } from "../lib/plugins.js";
import { findProjectForSession } from "../lib/session-utils.js";

View File

@ -1,6 +1,6 @@
import chalk from "chalk";
import type { Command } from "commander";
import { loadConfig, type OrchestratorConfig } from "@agent-orchestrator/core";
import { loadConfig, type OrchestratorConfig } from "@composio/ao-core";
import { tmux, git, gh, getTmuxSessions, getTmuxActivity } from "../lib/shell.js";
import { getSessionDir, readMetadata, archiveMetadata } from "../lib/metadata.js";
import { formatAge } from "../lib/format.js";

View File

@ -3,7 +3,7 @@ import { join } from "node:path";
import chalk from "chalk";
import ora from "ora";
import type { Command } from "commander";
import { loadConfig, buildPrompt, tmuxSendKeys, type OrchestratorConfig, type ProjectConfig } from "@agent-orchestrator/core";
import { loadConfig, buildPrompt, tmuxSendKeys, type OrchestratorConfig, type ProjectConfig } from "@composio/ao-core";
import { exec, git, getTmuxSessions } from "../lib/shell.js";
import { getSessionDir, writeMetadata, findSessionForIssue } from "../lib/metadata.js";
import { banner } from "../lib/format.js";

View File

@ -12,7 +12,7 @@ import {
type ReviewDecision,
type ActivityState,
loadConfig,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
import { git, getTmuxSessions, getTmuxActivity } from "../lib/shell.js";
import { getSessionDir, readMetadata } from "../lib/metadata.js";
import {

View File

@ -1,5 +1,5 @@
import chalk from "chalk";
import type { CIStatus, ReviewDecision, ActivityState } from "@agent-orchestrator/core";
import type { CIStatus, ReviewDecision, ActivityState } from "@composio/ao-core";
export function header(title: string): string {
const line = "─".repeat(76);

View File

@ -1,7 +1,7 @@
import { readFileSync, writeFileSync, existsSync, mkdirSync, renameSync } from "node:fs";
import { readdir } from "node:fs/promises";
import { join, basename } from "node:path";
import type { SessionMetadata } from "@agent-orchestrator/core";
import type { SessionMetadata } from "@composio/ao-core";
export function getSessionDir(dataDir: string, projectId: string): string {
return join(dataDir, `${projectId}-sessions`);

View File

@ -1,8 +1,8 @@
import type { Agent, OrchestratorConfig, SCM } from "@agent-orchestrator/core";
import claudeCodePlugin from "@agent-orchestrator/plugin-agent-claude-code";
import codexPlugin from "@agent-orchestrator/plugin-agent-codex";
import aiderPlugin from "@agent-orchestrator/plugin-agent-aider";
import githubSCMPlugin from "@agent-orchestrator/plugin-scm-github";
import type { Agent, OrchestratorConfig, SCM } from "@composio/ao-core";
import claudeCodePlugin from "@composio/ao-plugin-agent-claude-code";
import codexPlugin from "@composio/ao-plugin-agent-codex";
import aiderPlugin from "@composio/ao-plugin-agent-aider";
import githubSCMPlugin from "@composio/ao-plugin-scm-github";
const agentPlugins: Record<string, { create(): Agent }> = {
"claude-code": claudeCodePlugin,

View File

@ -1,4 +1,4 @@
import type { OrchestratorConfig } from "@agent-orchestrator/core";
import type { OrchestratorConfig } from "@composio/ao-core";
export function escapeRegex(str: string): string {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/core",
"name": "@composio/ao-core",
"version": "0.1.0",
"description": "Core library — types, config, session manager, lifecycle manager, event bus",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -15,6 +16,21 @@
"import": "./dist/types.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/core"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc -p tsconfig.build.json",
"typecheck": "tsc --noEmit",

View File

@ -36,8 +36,8 @@ import { createPluginRegistry } from "../plugin-registry.js";
import { createSessionManager } from "../session-manager.js";
import { createLifecycleManager } from "../lifecycle-manager.js";
import { writeMetadata } from "../metadata.js";
import trackerGithub from "@agent-orchestrator/plugin-tracker-github";
import scmGithub from "@agent-orchestrator/plugin-scm-github";
import trackerGithub from "@composio/ao-plugin-tracker-github";
import scmGithub from "@composio/ao-plugin-scm-github";
import type {
OrchestratorConfig,
PluginRegistry,

View File

@ -1,5 +1,5 @@
/**
* @agent-orchestrator/core
* @composio/ao-core
*
* Core library for the Agent Orchestrator.
* Exports all types, config loader, and service implementations.

View File

@ -3,7 +3,7 @@
*
* Plugins can be:
* 1. Built-in (packages/plugins/*)
* 2. npm packages (@agent-orchestrator/plugin-*)
* 2. npm packages (@composio/ao-plugin-*)
* 3. Local file paths specified in config
*/
@ -25,28 +25,28 @@ function makeKey(slot: PluginSlot, name: string): string {
/** Built-in plugin package names, mapped to their npm package */
const BUILTIN_PLUGINS: Array<{ slot: PluginSlot; name: string; pkg: string }> = [
// Runtimes
{ slot: "runtime", name: "tmux", pkg: "@agent-orchestrator/plugin-runtime-tmux" },
{ slot: "runtime", name: "process", pkg: "@agent-orchestrator/plugin-runtime-process" },
{ slot: "runtime", name: "tmux", pkg: "@composio/ao-plugin-runtime-tmux" },
{ slot: "runtime", name: "process", pkg: "@composio/ao-plugin-runtime-process" },
// Agents
{ slot: "agent", name: "claude-code", pkg: "@agent-orchestrator/plugin-agent-claude-code" },
{ slot: "agent", name: "codex", pkg: "@agent-orchestrator/plugin-agent-codex" },
{ slot: "agent", name: "aider", pkg: "@agent-orchestrator/plugin-agent-aider" },
{ slot: "agent", name: "claude-code", pkg: "@composio/ao-plugin-agent-claude-code" },
{ slot: "agent", name: "codex", pkg: "@composio/ao-plugin-agent-codex" },
{ slot: "agent", name: "aider", pkg: "@composio/ao-plugin-agent-aider" },
// Workspaces
{ slot: "workspace", name: "worktree", pkg: "@agent-orchestrator/plugin-workspace-worktree" },
{ slot: "workspace", name: "clone", pkg: "@agent-orchestrator/plugin-workspace-clone" },
{ slot: "workspace", name: "worktree", pkg: "@composio/ao-plugin-workspace-worktree" },
{ slot: "workspace", name: "clone", pkg: "@composio/ao-plugin-workspace-clone" },
// Trackers
{ slot: "tracker", name: "github", pkg: "@agent-orchestrator/plugin-tracker-github" },
{ slot: "tracker", name: "linear", pkg: "@agent-orchestrator/plugin-tracker-linear" },
{ slot: "tracker", name: "github", pkg: "@composio/ao-plugin-tracker-github" },
{ slot: "tracker", name: "linear", pkg: "@composio/ao-plugin-tracker-linear" },
// SCM
{ slot: "scm", name: "github", pkg: "@agent-orchestrator/plugin-scm-github" },
{ slot: "scm", name: "github", pkg: "@composio/ao-plugin-scm-github" },
// Notifiers
{ slot: "notifier", name: "composio", pkg: "@agent-orchestrator/plugin-notifier-composio" },
{ slot: "notifier", name: "desktop", pkg: "@agent-orchestrator/plugin-notifier-desktop" },
{ slot: "notifier", name: "slack", pkg: "@agent-orchestrator/plugin-notifier-slack" },
{ slot: "notifier", name: "webhook", pkg: "@agent-orchestrator/plugin-notifier-webhook" },
{ slot: "notifier", name: "composio", pkg: "@composio/ao-plugin-notifier-composio" },
{ slot: "notifier", name: "desktop", pkg: "@composio/ao-plugin-notifier-desktop" },
{ slot: "notifier", name: "slack", pkg: "@composio/ao-plugin-notifier-slack" },
{ slot: "notifier", name: "webhook", pkg: "@composio/ao-plugin-notifier-webhook" },
// Terminals
{ slot: "terminal", name: "iterm2", pkg: "@agent-orchestrator/plugin-terminal-iterm2" },
{ slot: "terminal", name: "web", pkg: "@agent-orchestrator/plugin-terminal-web" },
{ slot: "terminal", name: "iterm2", pkg: "@composio/ao-plugin-terminal-iterm2" },
{ slot: "terminal", name: "web", pkg: "@composio/ao-plugin-terminal-web" },
];
/** Extract plugin-specific config from orchestrator config */

View File

@ -10,11 +10,11 @@ export default defineConfig({
// Integration tests import real plugins. These aliases resolve
// package names to source files so we don't need circular devDeps
// (plugins depend on core, core can't depend on plugins).
"@agent-orchestrator/plugin-tracker-github": resolve(
"@composio/ao-plugin-tracker-github": resolve(
__dirname,
"../plugins/tracker-github/src/index.ts",
),
"@agent-orchestrator/plugin-scm-github": resolve(
"@composio/ao-plugin-scm-github": resolve(
__dirname,
"../plugins/scm-github/src/index.ts",
),

View File

@ -1,5 +1,5 @@
{
"name": "@agent-orchestrator/integration-tests",
"name": "@composio/ao-integration-tests",
"version": "0.1.0",
"private": true,
"description": "Integration tests — requires real binaries and tmux",
@ -10,24 +10,24 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*",
"@agent-orchestrator/plugin-agent-claude-code": "workspace:*",
"@agent-orchestrator/plugin-agent-codex": "workspace:*",
"@agent-orchestrator/plugin-agent-aider": "workspace:*",
"@agent-orchestrator/plugin-agent-opencode": "workspace:*",
"@agent-orchestrator/plugin-runtime-tmux": "workspace:*",
"@agent-orchestrator/plugin-runtime-process": "workspace:*",
"@agent-orchestrator/plugin-workspace-worktree": "workspace:*",
"@agent-orchestrator/plugin-workspace-clone": "workspace:*",
"@agent-orchestrator/plugin-tracker-linear": "workspace:*"
"@composio/ao-core": "workspace:*",
"@composio/ao-plugin-agent-claude-code": "workspace:*",
"@composio/ao-plugin-agent-codex": "workspace:*",
"@composio/ao-plugin-agent-aider": "workspace:*",
"@composio/ao-plugin-agent-opencode": "workspace:*",
"@composio/ao-plugin-runtime-tmux": "workspace:*",
"@composio/ao-plugin-runtime-process": "workspace:*",
"@composio/ao-plugin-workspace-worktree": "workspace:*",
"@composio/ao-plugin-workspace-clone": "workspace:*",
"@composio/ao-plugin-tracker-linear": "workspace:*"
},
"devDependencies": {
"@agent-orchestrator/plugin-notifier-desktop": "workspace:*",
"@agent-orchestrator/plugin-notifier-slack": "workspace:*",
"@agent-orchestrator/plugin-notifier-webhook": "workspace:*",
"@agent-orchestrator/plugin-notifier-composio": "workspace:*",
"@agent-orchestrator/plugin-terminal-iterm2": "workspace:*",
"@agent-orchestrator/plugin-terminal-web": "workspace:*",
"@composio/ao-plugin-notifier-desktop": "workspace:*",
"@composio/ao-plugin-notifier-slack": "workspace:*",
"@composio/ao-plugin-notifier-webhook": "workspace:*",
"@composio/ao-plugin-notifier-composio": "workspace:*",
"@composio/ao-plugin-terminal-iterm2": "workspace:*",
"@composio/ao-plugin-terminal-web": "workspace:*",
"@types/node": "^25.2.3",
"typescript": "^5.7.0",
"vitest": "^3.0.0"

View File

@ -14,9 +14,9 @@ import { mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { promisify } from "node:util";
import type { ActivityState, AgentSessionInfo } from "@agent-orchestrator/core";
import type { ActivityState, AgentSessionInfo } from "@composio/ao-core";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import aiderPlugin from "@agent-orchestrator/plugin-agent-aider";
import aiderPlugin from "@composio/ao-plugin-agent-aider";
import { isTmuxAvailable, killSessionsByPrefix, createSession, killSession, capturePane } from "./helpers/tmux.js";
import { pollUntilEqual, sleep } from "./helpers/polling.js";
import { makeTmuxHandle, makeSession } from "./helpers/session-factory.js";

View File

@ -14,9 +14,9 @@ import { mkdtemp, realpath, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { promisify } from "node:util";
import type { ActivityState, AgentSessionInfo } from "@agent-orchestrator/core";
import type { ActivityState, AgentSessionInfo } from "@composio/ao-core";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import claudeCodePlugin from "@agent-orchestrator/plugin-agent-claude-code";
import claudeCodePlugin from "@composio/ao-plugin-agent-claude-code";
import { isTmuxAvailable, killSessionsByPrefix, createSession, killSession, capturePane } from "./helpers/tmux.js";
import { pollUntilEqual, sleep } from "./helpers/polling.js";
import { makeTmuxHandle, makeSession } from "./helpers/session-factory.js";

View File

@ -14,9 +14,9 @@ import { mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { promisify } from "node:util";
import type { ActivityState, AgentSessionInfo } from "@agent-orchestrator/core";
import type { ActivityState, AgentSessionInfo } from "@composio/ao-core";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import codexPlugin from "@agent-orchestrator/plugin-agent-codex";
import codexPlugin from "@composio/ao-plugin-agent-codex";
import { isTmuxAvailable, killSessionsByPrefix, createSession, killSession, capturePane } from "./helpers/tmux.js";
import { pollUntilEqual, sleep } from "./helpers/polling.js";
import { makeTmuxHandle, makeSession } from "./helpers/session-factory.js";

View File

@ -14,9 +14,9 @@ import { mkdtemp, rm } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { promisify } from "node:util";
import type { ActivityState, AgentSessionInfo } from "@agent-orchestrator/core";
import type { ActivityState, AgentSessionInfo } from "@composio/ao-core";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import opencodePlugin from "@agent-orchestrator/plugin-agent-opencode";
import opencodePlugin from "@composio/ao-plugin-agent-opencode";
import { isTmuxAvailable, killSessionsByPrefix, createSession, killSession, capturePane } from "./helpers/tmux.js";
import { pollUntilEqual, sleep } from "./helpers/polling.js";
import { makeTmuxHandle, makeSession } from "./helpers/session-factory.js";

View File

@ -5,7 +5,7 @@ import type {
EventType,
SessionStatus,
ActivityState,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
/**
* Create a test OrchestratorEvent with sensible defaults.

View File

@ -2,7 +2,7 @@
* Factory helpers to build Session and RuntimeHandle objects for tests.
*/
import type { RuntimeHandle, Session } from "@agent-orchestrator/core";
import type { RuntimeHandle, Session } from "@composio/ao-core";
/** Build a tmux RuntimeHandle for a given session name. */
export function makeTmuxHandle(sessionName: string): RuntimeHandle {

View File

@ -5,8 +5,8 @@
* Everything else runs for real: config parsing, tool slug routing, message formatting.
*/
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import type { NotifyAction } from "@agent-orchestrator/core";
import composioPlugin from "@agent-orchestrator/plugin-notifier-composio";
import type { NotifyAction } from "@composio/ao-core";
import composioPlugin from "@composio/ao-plugin-notifier-composio";
import { makeEvent } from "./helpers/event-factory.js";
const mockExecuteAction = vi.fn().mockResolvedValue({ successful: true });

View File

@ -5,7 +5,7 @@
* Everything else runs for real: config parsing, escaping chains, formatting.
*/
import { describe, it, expect, vi, beforeEach, type Mock } from "vitest";
import type { NotifyAction } from "@agent-orchestrator/core";
import type { NotifyAction } from "@composio/ao-core";
import { makeEvent } from "./helpers/event-factory.js";
vi.mock("node:child_process", () => ({
@ -23,7 +23,7 @@ const mockExecFile = execFile as unknown as Mock;
const mockPlatform = platform as unknown as Mock;
// Import the full plugin module — config parsing, escaping, formatting all run for real
import desktopPlugin from "@agent-orchestrator/plugin-notifier-desktop";
import desktopPlugin from "@composio/ao-plugin-notifier-desktop";
describe("notifier-desktop integration", () => {
beforeEach(() => {

View File

@ -5,8 +5,8 @@
* Everything else runs for real: config parsing, Block Kit construction, channel routing.
*/
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import type { NotifyAction, EventPriority } from "@agent-orchestrator/core";
import slackPlugin from "@agent-orchestrator/plugin-notifier-slack";
import type { NotifyAction, EventPriority } from "@composio/ao-core";
import slackPlugin from "@composio/ao-plugin-notifier-slack";
import { makeEvent } from "./helpers/event-factory.js";
function mockFetchOk() {

View File

@ -5,8 +5,8 @@
* Everything else runs for real: config parsing, retry logic, payload serialization.
*/
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import type { NotifyAction } from "@agent-orchestrator/core";
import webhookPlugin from "@agent-orchestrator/plugin-notifier-webhook";
import type { NotifyAction } from "@composio/ao-core";
import webhookPlugin from "@composio/ao-plugin-notifier-webhook";
import { makeEvent } from "./helpers/event-factory.js";
describe("notifier-webhook integration", () => {

View File

@ -1,6 +1,6 @@
import { afterAll, describe, expect, it } from "vitest";
import processPlugin from "@agent-orchestrator/plugin-runtime-process";
import type { RuntimeHandle } from "@agent-orchestrator/core";
import processPlugin from "@composio/ao-plugin-runtime-process";
import type { RuntimeHandle } from "@composio/ao-core";
import { sleep } from "./helpers/polling.js";
describe("runtime-process (integration)", () => {

View File

@ -1,6 +1,6 @@
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import tmuxPlugin from "@agent-orchestrator/plugin-runtime-tmux";
import type { RuntimeHandle } from "@agent-orchestrator/core";
import tmuxPlugin from "@composio/ao-plugin-runtime-tmux";
import type { RuntimeHandle } from "@composio/ao-core";
import { isTmuxAvailable, killSessionsByPrefix } from "./helpers/tmux.js";
import { sleep } from "./helpers/polling.js";

View File

@ -19,7 +19,7 @@ import { platform } from "node:os";
const mockExecFile = execFile as unknown as Mock;
const mockPlatform = platform as unknown as Mock;
import iterm2Plugin from "@agent-orchestrator/plugin-terminal-iterm2";
import iterm2Plugin from "@composio/ao-plugin-terminal-iterm2";
import { makeSession } from "./helpers/event-factory.js";
function simulateOsascript(stdout: string) {

View File

@ -5,7 +5,7 @@
* Tests verify state tracking, URL construction, and log output.
*/
import { describe, it, expect, vi, beforeEach } from "vitest";
import webPlugin from "@agent-orchestrator/plugin-terminal-web";
import webPlugin from "@composio/ao-plugin-terminal-web";
import { makeSession } from "./helpers/event-factory.js";
describe("terminal-web integration", () => {

View File

@ -19,9 +19,9 @@
*/
import { request } from "node:https";
import type { ProjectConfig } from "@agent-orchestrator/core";
import type { ProjectConfig } from "@composio/ao-core";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import trackerLinear from "@agent-orchestrator/plugin-tracker-linear";
import trackerLinear from "@composio/ao-plugin-tracker-linear";
// ---------------------------------------------------------------------------
// Prerequisites

View File

@ -5,8 +5,8 @@ import { tmpdir } from "node:os";
import { join } from "node:path";
import { promisify } from "node:util";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import clonePlugin from "@agent-orchestrator/plugin-workspace-clone";
import type { ProjectConfig, WorkspaceInfo } from "@agent-orchestrator/core";
import clonePlugin from "@composio/ao-plugin-workspace-clone";
import type { ProjectConfig, WorkspaceInfo } from "@composio/ao-core";
const execFileAsync = promisify(execFile);

View File

@ -5,8 +5,8 @@ import { tmpdir } from "node:os";
import { join } from "node:path";
import { promisify } from "node:util";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import worktreePlugin from "@agent-orchestrator/plugin-workspace-worktree";
import type { ProjectConfig, WorkspaceInfo } from "@agent-orchestrator/core";
import worktreePlugin from "@composio/ao-plugin-workspace-worktree";
import type { ProjectConfig, WorkspaceInfo } from "@composio/ao-core";
const execFileAsync = promisify(execFile);

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-agent-aider",
"name": "@composio/ao-plugin-agent-aider",
"version": "0.1.0",
"description": "Agent plugin: Aider",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/agent-aider"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import type { Session, RuntimeHandle, AgentLaunchConfig } from "@agent-orchestrator/core";
import type { Session, RuntimeHandle, AgentLaunchConfig } from "@composio/ao-core";
// ---------------------------------------------------------------------------
// Hoisted mocks

View File

@ -7,7 +7,7 @@ import {
type PluginModule,
type RuntimeHandle,
type Session,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
import { execFile } from "node:child_process";
import { promisify } from "node:util";

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-agent-claude-code",
"name": "@composio/ao-plugin-agent-claude-code",
"version": "0.1.0",
"description": "Agent plugin: Claude Code",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/agent-claude-code"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import type { Session, RuntimeHandle, AgentLaunchConfig } from "@agent-orchestrator/core";
import type { Session, RuntimeHandle, AgentLaunchConfig } from "@composio/ao-core";
// ---------------------------------------------------------------------------
// Hoisted mocks — available inside vi.mock factories

View File

@ -8,7 +8,7 @@ import {
type PluginModule,
type RuntimeHandle,
type Session,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
import { execFile } from "node:child_process";
import { open, readdir, readFile, stat, writeFile, mkdir, chmod } from "node:fs/promises";
import { existsSync } from "node:fs";

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-agent-codex",
"name": "@composio/ao-plugin-agent-codex",
"version": "0.1.0",
"description": "Agent plugin: OpenAI Codex CLI",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/agent-codex"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import type { Session, RuntimeHandle, AgentLaunchConfig } from "@agent-orchestrator/core";
import type { Session, RuntimeHandle, AgentLaunchConfig } from "@composio/ao-core";
// ---------------------------------------------------------------------------
// Hoisted mocks

View File

@ -7,7 +7,7 @@ import {
type PluginModule,
type RuntimeHandle,
type Session,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
import { execFile } from "node:child_process";
import { promisify } from "node:util";

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-agent-opencode",
"name": "@composio/ao-plugin-agent-opencode",
"version": "0.1.0",
"description": "Agent plugin: OpenCode",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/agent-opencode"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import type { Session, RuntimeHandle, AgentLaunchConfig } from "@agent-orchestrator/core";
import type { Session, RuntimeHandle, AgentLaunchConfig } from "@composio/ao-core";
// ---------------------------------------------------------------------------
// Hoisted mocks

View File

@ -7,7 +7,7 @@ import {
type PluginModule,
type RuntimeHandle,
type Session,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
import { execFile } from "node:child_process";
import { promisify } from "node:util";

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-notifier-composio",
"name": "@composio/ao-plugin-notifier-composio",
"version": "0.1.0",
"description": "Notifier plugin: Composio unified notifications (Slack, Discord, email)",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/notifier-composio"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"peerDependencies": {
"composio-core": ">=0.5.0"

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import type { OrchestratorEvent, NotifyAction } from "@agent-orchestrator/core";
import type { OrchestratorEvent, NotifyAction } from "@composio/ao-core";
import { manifest, create } from "./index.js";
function makeEvent(overrides: Partial<OrchestratorEvent> = {}): OrchestratorEvent {

View File

@ -5,7 +5,7 @@ import type {
NotifyAction,
NotifyContext,
EventPriority,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
export const manifest = {
name: "composio",

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-notifier-desktop",
"name": "@composio/ao-plugin-notifier-desktop",
"version": "0.1.0",
"description": "Notifier plugin: OS desktop notifications",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/notifier-desktop"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach, type Mock } from "vitest";
import type { OrchestratorEvent, NotifyAction } from "@agent-orchestrator/core";
import type { OrchestratorEvent, NotifyAction } from "@composio/ao-core";
// Mock node:child_process
vi.mock("node:child_process", () => ({

View File

@ -7,7 +7,7 @@ import {
type OrchestratorEvent,
type NotifyAction,
type EventPriority,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
export const manifest = {
name: "desktop",
@ -17,7 +17,7 @@ export const manifest = {
};
// Re-export for backwards compatibility
export { escapeAppleScript } from "@agent-orchestrator/core";
export { escapeAppleScript } from "@composio/ao-core";
/**
* Map event priority to notification urgency:

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-notifier-slack",
"name": "@composio/ao-plugin-notifier-slack",
"version": "0.1.0",
"description": "Notifier plugin: Slack",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/notifier-slack"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import type { OrchestratorEvent, NotifyAction, EventPriority } from "@agent-orchestrator/core";
import type { OrchestratorEvent, NotifyAction, EventPriority } from "@composio/ao-core";
import { manifest, create } from "./index.js";
function makeEvent(overrides: Partial<OrchestratorEvent> = {}): OrchestratorEvent {

View File

@ -6,7 +6,7 @@ import {
type NotifyAction,
type NotifyContext,
type EventPriority,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
export const manifest = {
name: "slack",

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-notifier-webhook",
"name": "@composio/ao-plugin-notifier-webhook",
"version": "0.1.0",
"description": "Notifier plugin: generic webhook",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/notifier-webhook"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import type { OrchestratorEvent, NotifyAction } from "@agent-orchestrator/core";
import type { OrchestratorEvent, NotifyAction } from "@composio/ao-core";
import { manifest, create } from "./index.js";
function makeEvent(overrides: Partial<OrchestratorEvent> = {}): OrchestratorEvent {

View File

@ -5,7 +5,7 @@ import {
type OrchestratorEvent,
type NotifyAction,
type NotifyContext,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
export const manifest = {
name: "webhook",

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-runtime-process",
"name": "@composio/ao-plugin-runtime-process",
"version": "0.1.0",
"description": "Runtime plugin: child processes",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/runtime-process"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -19,7 +35,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,6 +1,6 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import { EventEmitter } from "node:events";
import type { RuntimeHandle } from "@agent-orchestrator/core";
import type { RuntimeHandle } from "@composio/ao-core";
// ---------------------------------------------------------------------------
// Hoisted mock — must be set up before import

View File

@ -6,7 +6,7 @@ import type {
RuntimeHandle,
RuntimeMetrics,
AttachInfo,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
export const manifest = {
name: "process",

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-runtime-tmux",
"name": "@composio/ao-plugin-runtime-tmux",
"version": "0.1.0",
"description": "Runtime plugin: tmux sessions",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/runtime-tmux"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -19,7 +35,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,7 +1,7 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import * as childProcess from "node:child_process";
import * as fs from "node:fs";
import type { RuntimeHandle } from "@agent-orchestrator/core";
import type { RuntimeHandle } from "@composio/ao-core";
// Mock node:child_process with custom promisify support
vi.mock("node:child_process", () => {

View File

@ -12,7 +12,7 @@ import type {
RuntimeHandle,
RuntimeMetrics,
AttachInfo,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
const execFileAsync = promisify(execFile);

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-scm-github",
"name": "@composio/ao-plugin-scm-github",
"version": "0.1.0",
"description": "SCM plugin: GitHub (PRs, CI, reviews)",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/scm-github"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -21,7 +21,7 @@ import type {
ReviewComment,
AutomatedComment,
MergeReadiness,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
const execFileAsync = promisify(execFile);

View File

@ -15,7 +15,7 @@ vi.mock("node:child_process", () => {
});
import { create, manifest } from "../src/index.js";
import type { PRInfo, Session, ProjectConfig } from "@agent-orchestrator/core";
import type { PRInfo, Session, ProjectConfig } from "@composio/ao-core";
// ---------------------------------------------------------------------------
// Fixtures

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-terminal-iterm2",
"name": "@composio/ao-plugin-terminal-iterm2",
"version": "0.1.0",
"description": "Terminal plugin: macOS iTerm2",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/terminal-iterm2"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach, type Mock } from "vitest";
import type { Session } from "@agent-orchestrator/core";
import type { Session } from "@composio/ao-core";
vi.mock("node:child_process", () => ({
execFile: vi.fn(),

View File

@ -5,7 +5,7 @@ import {
type PluginModule,
type Terminal,
type Session,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
export const manifest = {
name: "iterm2",
@ -15,7 +15,7 @@ export const manifest = {
};
// Re-export for backwards compatibility
export { escapeAppleScript } from "@agent-orchestrator/core";
export { escapeAppleScript } from "@composio/ao-core";
/**
* Run an AppleScript snippet and return stdout.

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-terminal-web",
"name": "@composio/ao-plugin-terminal-web",
"version": "0.1.0",
"description": "Terminal plugin: xterm.js web terminal",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/terminal-web"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -1,5 +1,5 @@
import { describe, it, expect, vi, beforeEach } from "vitest";
import type { Session } from "@agent-orchestrator/core";
import type { Session } from "@composio/ao-core";
import { manifest, create } from "./index.js";
function makeSession(overrides: Partial<Session> = {}): Session {

View File

@ -1,4 +1,4 @@
import type { PluginModule, Terminal, Session } from "@agent-orchestrator/core";
import type { PluginModule, Terminal, Session } from "@composio/ao-core";
export const manifest = {
name: "web",

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-tracker-github",
"name": "@composio/ao-plugin-tracker-github",
"version": "0.1.0",
"description": "Tracker plugin: GitHub Issues",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/tracker-github"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -14,7 +14,7 @@ import type {
IssueUpdate,
CreateIssueInput,
ProjectConfig,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
const execFileAsync = promisify(execFile);

View File

@ -13,7 +13,7 @@ vi.mock("node:child_process", () => {
});
import { create, manifest } from "../src/index.js";
import type { ProjectConfig } from "@agent-orchestrator/core";
import type { ProjectConfig } from "@composio/ao-core";
// ---------------------------------------------------------------------------
// Fixtures

View File

@ -1,7 +1,8 @@
{
"name": "@agent-orchestrator/plugin-tracker-linear",
"name": "@composio/ao-plugin-tracker-linear",
"version": "0.1.0",
"description": "Tracker plugin: Linear",
"license": "MIT",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@ -11,6 +12,21 @@
"import": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
"directory": "packages/plugins/tracker-linear"
},
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
"bugs": {
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
},
"engines": {
"node": ">=20.0.0"
},
"scripts": {
"build": "tsc",
"typecheck": "tsc --noEmit",
@ -18,7 +34,7 @@
"clean": "rm -rf dist"
},
"dependencies": {
"@agent-orchestrator/core": "workspace:*"
"@composio/ao-core": "workspace:*"
},
"devDependencies": {
"@types/node": "^25.2.3",

View File

@ -17,7 +17,7 @@ import type {
IssueUpdate,
CreateIssueInput,
ProjectConfig,
} from "@agent-orchestrator/core";
} from "@composio/ao-core";
import type { Composio } from "@composio/core";
// ---------------------------------------------------------------------------

Some files were not shown because too many files have changed in this diff Show More