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:
parent
1bd597c443
commit
7257650862
|
|
@ -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)
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 }}
|
||||
461
CLAUDE.md
461
CLAUDE.md
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
@ -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/
|
||||
|
|
|
|||
12
package.json
12
package.json
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/env node
|
||||
import "@composio/ao-cli";
|
||||
|
|
@ -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:*"
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
}));
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ vi.mock("ora", () => ({
|
|||
}),
|
||||
}));
|
||||
|
||||
vi.mock("@agent-orchestrator/core", () => ({
|
||||
vi.mock("@composio/ao-core", () => ({
|
||||
loadConfig: () => mockConfigRef.current,
|
||||
}));
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
},
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ vi.mock("../../src/lib/shell.js", () => ({
|
|||
},
|
||||
}));
|
||||
|
||||
vi.mock("@agent-orchestrator/core", () => ({
|
||||
vi.mock("@composio/ao-core", () => ({
|
||||
loadConfig: () => mockConfigRef.current,
|
||||
}));
|
||||
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ vi.mock("../../src/lib/shell.js", () => ({
|
|||
},
|
||||
}));
|
||||
|
||||
vi.mock("@agent-orchestrator/core", () => ({
|
||||
vi.mock("@composio/ao-core", () => ({
|
||||
loadConfig: () => mockConfigRef.current,
|
||||
}));
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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", () => {
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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`);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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, "\\$&");
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @agent-orchestrator/core
|
||||
* @composio/ao-core
|
||||
*
|
||||
* Core library for the Agent Orchestrator.
|
||||
* Exports all types, config loader, and service implementations.
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import type {
|
|||
EventType,
|
||||
SessionStatus,
|
||||
ActivityState,
|
||||
} from "@agent-orchestrator/core";
|
||||
} from "@composio/ao-core";
|
||||
|
||||
/**
|
||||
* Create a test OrchestratorEvent with sensible defaults.
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
|
|
|
|||
|
|
@ -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(() => {
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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", () => {
|
||||
|
|
|
|||
|
|
@ -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)", () => {
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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", () => {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import type {
|
|||
NotifyAction,
|
||||
NotifyContext,
|
||||
EventPriority,
|
||||
} from "@agent-orchestrator/core";
|
||||
} from "@composio/ao-core";
|
||||
|
||||
export const manifest = {
|
||||
name: "composio",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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", () => ({
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import {
|
|||
type NotifyAction,
|
||||
type NotifyContext,
|
||||
type EventPriority,
|
||||
} from "@agent-orchestrator/core";
|
||||
} from "@composio/ao-core";
|
||||
|
||||
export const manifest = {
|
||||
name: "slack",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import {
|
|||
type OrchestratorEvent,
|
||||
type NotifyAction,
|
||||
type NotifyContext,
|
||||
} from "@agent-orchestrator/core";
|
||||
} from "@composio/ao-core";
|
||||
|
||||
export const manifest = {
|
||||
name: "webhook",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import type {
|
|||
RuntimeHandle,
|
||||
RuntimeMetrics,
|
||||
AttachInfo,
|
||||
} from "@agent-orchestrator/core";
|
||||
} from "@composio/ao-core";
|
||||
|
||||
export const manifest = {
|
||||
name: "process",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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", () => {
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import type {
|
|||
RuntimeHandle,
|
||||
RuntimeMetrics,
|
||||
AttachInfo,
|
||||
} from "@agent-orchestrator/core";
|
||||
} from "@composio/ao-core";
|
||||
|
||||
const execFileAsync = promisify(execFile);
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ import type {
|
|||
ReviewComment,
|
||||
AutomatedComment,
|
||||
MergeReadiness,
|
||||
} from "@agent-orchestrator/core";
|
||||
} from "@composio/ao-core";
|
||||
|
||||
const execFileAsync = promisify(execFile);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import type {
|
|||
IssueUpdate,
|
||||
CreateIssueInput,
|
||||
ProjectConfig,
|
||||
} from "@agent-orchestrator/core";
|
||||
} from "@composio/ao-core";
|
||||
|
||||
const execFileAsync = promisify(execFile);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in New Issue