speexor 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API-REFERENCE.md +96 -1
- package/ARCHITECTURE.md +83 -32
- package/BENCHMARKS.md +73 -0
- package/CHANGELOG.md +59 -4
- package/CODE-OF-CONDUCT.md +83 -83
- package/CONTRIBUTING.md +92 -97
- package/FAQ.md +132 -105
- package/GLOSSARY.md +34 -0
- package/LICENSE.md +21 -21
- package/PUBLISH.md +82 -77
- package/README.md +220 -6
- package/REFACTOR-LOG.md +40 -40
- package/ROADMAP.md +31 -42
- package/SECURITY-DEFAULTS.md +118 -0
- package/SECURITY.md +80 -79
- package/SUMMARY.md +31 -8
- package/TESTING.md +140 -140
- package/dist/{agent-5D3BVWNK.js → agent-C64T66XT.js} +4 -4
- package/dist/agent-C64T66XT.js.map +1 -0
- package/dist/{chunk-B7WLHC4W.js → chunk-5OD5UWB5.js} +322 -121
- package/dist/chunk-5OD5UWB5.js.map +1 -0
- package/dist/chunk-GOGI3JQD.js +1637 -0
- package/dist/chunk-GOGI3JQD.js.map +1 -0
- package/dist/{chunk-2F66BZYJ.js → chunk-VEZQT5SX.js} +80 -8
- package/dist/chunk-VEZQT5SX.js.map +1 -0
- package/dist/cli/index.js +2058 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/core/index.d.ts +682 -3
- package/dist/core/index.js +1 -1
- package/dist/index.d.ts +102 -14
- package/dist/index.js +55 -29
- package/dist/index.js.map +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/index.js +1 -1
- package/dist/types-BOMap-tI.d.ts +389 -0
- package/docs/PRD03.md +119 -0
- package/docs/PRD06.md +125 -0
- package/docs/SETUP.md +94 -94
- package/docs/TROUBLESHOOTING.md +113 -113
- package/docs/adr/0001-record-architecture-decisions.md +44 -0
- package/docs/adr/0002-plugin-architecture.md +53 -0
- package/docs/adr/0003-recursive-task-decomposition.md +57 -0
- package/docs/adr/0004-local-first-security.md +58 -0
- package/docs/adr/0005-data-directory-layout.md +69 -0
- package/examples/basic.yaml +61 -61
- package/package.json +103 -102
- package/schema/config.schema.json +119 -119
- package/speexor.config.yaml.example +30 -30
- package/dist/agent-5D3BVWNK.js.map +0 -1
- package/dist/chunk-2F66BZYJ.js.map +0 -1
- package/dist/chunk-B7WLHC4W.js.map +0 -1
- package/dist/chunk-SXALZEOJ.js +0 -345
- package/dist/chunk-SXALZEOJ.js.map +0 -1
- package/dist/types-0q_okI2g.d.ts +0 -205
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# ADR-0002: 7-Slot Plugin Architecture with EventBus
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Accepted
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Speexor must support diverse capabilities — agent adapters, runtime backends, workspace management, issue tracking, SCM operations, notifications, and terminal I/O — without coupling these concerns in the core lifecycle. The architecture must allow:
|
|
10
|
+
|
|
11
|
+
1. New plugins to be added without modifying core code.
|
|
12
|
+
2. Multiple implementations per slot (e.g., tmux and Process for runtime).
|
|
13
|
+
3. Loose communication between plugins and the dashboard.
|
|
14
|
+
4. Graceful degradation when a plugin dependency (e.g., `tmux`, `gh` CLI) is unavailable.
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
### Seven Plugin Slots
|
|
19
|
+
|
|
20
|
+
We define exactly seven plugin slots, each with a dedicated TypeScript interface:
|
|
21
|
+
|
|
22
|
+
| Slot | Interface | Purpose |
|
|
23
|
+
|------------|---------------------|---------------------------------------|
|
|
24
|
+
| agent | `AgentPlugin` | Spawn, communicate with, kill agents |
|
|
25
|
+
| runtime | `RuntimePlugin` | Create/destroy terminal sessions |
|
|
26
|
+
| workspace | `WorkspacePlugin` | Manage isolated git worktrees |
|
|
27
|
+
| tracker | `TrackerPlugin` | Fetch issues, subscribe to events |
|
|
28
|
+
| scm | `SCMPlugin` | Branch, commit, PR, CI operations |
|
|
29
|
+
| notifier | `NotifierPlugin` | Desktop notifications |
|
|
30
|
+
| terminal | `TerminalPlugin` | Interactive terminal attach/detach |
|
|
31
|
+
|
|
32
|
+
### EventBus over Direct Calls
|
|
33
|
+
|
|
34
|
+
All inter-module communication flows through an EventBus (EventEmitter3 wrapper) rather than direct method calls. This means:
|
|
35
|
+
|
|
36
|
+
- The dashboard subscribes to lifecycle events without lifecycle knowing about the dashboard.
|
|
37
|
+
- Plugins emit events (e.g., `session:created`, `worktree:created`) without importing other modules.
|
|
38
|
+
- New observers (e.g., logging, metrics) can be added without modifying existing code.
|
|
39
|
+
|
|
40
|
+
### getFirstPlugin() Resolution
|
|
41
|
+
|
|
42
|
+
When the lifecycle needs a plugin for a slot, it calls `getFirstPlugin<T>(slot)` which returns the first registered implementation. This allows:
|
|
43
|
+
|
|
44
|
+
- Multiple implementations per slot (e.g., both TmuxRuntime and ProcessRuntime).
|
|
45
|
+
- Implicit priority ordering by registration order.
|
|
46
|
+
- Graceful fallback: if the primary plugin fails initialization, the next in the list serves.
|
|
47
|
+
|
|
48
|
+
## Consequences
|
|
49
|
+
|
|
50
|
+
- **Positive:** Loose coupling; plugins are independently testable; new capabilities slot in without core changes.
|
|
51
|
+
- **Positive:** The `getFirstPlugin()` pattern enables natural fallback (ProcessRuntime when tmux is absent).
|
|
52
|
+
- **Negative:** Event-based flow is harder to trace than direct calls during debugging.
|
|
53
|
+
- **Negative:** Seven slots are a fixed set — adding a new slot requires a core type change and a new interface definition.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# ADR-0003: DAG-Based Recursive Task Decomposition with LLM Planner
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Accepted
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Speexor must decompose complex tasks (e.g., "implement feature X across the full stack") into smaller, parallel-executable units that can be distributed across multiple agents. Two core design questions arise:
|
|
10
|
+
|
|
11
|
+
1. **Representation:** Should the task structure be a flat list, a tree, or a directed acyclic graph (DAG)?
|
|
12
|
+
2. **Planner:** Should the decomposition algorithm be rule-based (deterministic) or LLM-driven (probabilistic)?
|
|
13
|
+
|
|
14
|
+
The representation must handle dependency ordering (task B depends on task A, task C depends on both) and allow parallel execution of independent sub-tasks. The planner must adapt to arbitrary repo structures and technologies without hardcoded rules.
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
### DAG-Based Task Graph
|
|
19
|
+
|
|
20
|
+
We represent decomposed tasks as a **directed acyclic graph (DAG)** where:
|
|
21
|
+
|
|
22
|
+
- Each **Task Node** represents one atomic unit of work.
|
|
23
|
+
- Edges represent **depends-on** relationships (a node cannot execute until all predecessors complete).
|
|
24
|
+
- Nodes with no edges between them are eligible for parallel execution.
|
|
25
|
+
- The graph supports dynamic refinement: a node in progress can be further decomposed into sub-DAGs at runtime.
|
|
26
|
+
|
|
27
|
+
This choice over a flat list (which cannot express dependencies) or a tree (which cannot express cross-branch dependencies like "both frontend and backend depend on the shared schema change").
|
|
28
|
+
|
|
29
|
+
### LLM-Based Planner over Algorithmic Decomposition
|
|
30
|
+
|
|
31
|
+
We use an LLM-based planner (configurable per project, defaulting to `deepseek-reasoner`) to decompose tasks rather than a rule-based algorithm. Rationale:
|
|
32
|
+
|
|
33
|
+
- **Arbitrary tech stacks:** The planner reads the repo structure and task description, then generates a decomposition customized to the actual codebase — no hardcoded "microservice decomposition" rules needed.
|
|
34
|
+
- **Context-aware granularity:** The LLM decides how fine-grained each sub-task should be based on complexity, rather than a fixed heuristic.
|
|
35
|
+
- **Adaptive refinement:** If the initial decomposition is too coarse, the planner can further decompose a node mid-execution using the same LLM.
|
|
36
|
+
- **Human-readable plans:** The LLM generates natural language descriptions for each node, which feed into the approval UI and decision log.
|
|
37
|
+
|
|
38
|
+
### Configuration
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
decomposition:
|
|
42
|
+
maxTaskGraphDepth: 3 # Max depth of the Task Graph (node depth)
|
|
43
|
+
maxAgentSpawnDepth: 3 # Max levels of subagent spawning
|
|
44
|
+
maxNodesPerGraph: 50 # Safety limit on graph size
|
|
45
|
+
plannerProvider: opencode # Which agent backend to use for planning
|
|
46
|
+
plannerModel: deepseek-reasoner # Model for the planner LLM call
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The two depth limits (`maxTaskGraphDepth` and `maxAgentSpawnDepth`) are tracked separately — a deep task graph does not force deep agent spawning if the planner assigns shallow agents to deep nodes.
|
|
50
|
+
|
|
51
|
+
## Consequences
|
|
52
|
+
|
|
53
|
+
- **Positive:** DAG enables maximum parallelism — independent sub-tasks execute concurrently.
|
|
54
|
+
- **Positive:** LLM planner adapts to any codebase without rule maintenance.
|
|
55
|
+
- **Negative:** LLM planner calls add latency and cost to the decomposition phase.
|
|
56
|
+
- **Negative:** DAG complexity requires a scheduler with dependency resolution (no simple FIFO queue).
|
|
57
|
+
- **Neutral:** The `maxTaskGraphDepth`/`maxAgentSpawnDepth` split prevents confusion between graph depth and agent hierarchy depth (per FR-89).
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# ADR-0004: Local-First Security with Two-Layer Defense
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Accepted
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Speexor manages AI agents that write code, execute commands, and interact with git providers. This introduces two distinct security surfaces:
|
|
10
|
+
|
|
11
|
+
1. **Third-party extensions** (installed via the future Marketplace) that can access the file system, shell, and network.
|
|
12
|
+
2. **Runtime agent actions** — file edits, git operations, PR creation, CI interactions — some of which are irreversible (e.g., force-push to main).
|
|
13
|
+
|
|
14
|
+
The architecture must ensure that a malicious or buggy extension cannot compromise the host system, and that high-risk agent actions require explicit human approval.
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
### Local-First Architecture
|
|
19
|
+
|
|
20
|
+
All data, credentials, and execution remain on the user's machine. There is no cloud relay, no telemetry by default, and no remote control plane. This means:
|
|
21
|
+
|
|
22
|
+
- Secrets are stored in the OS keychain (via `conf` with `encryptionKey`), never in plaintext config files.
|
|
23
|
+
- The dashboard runs on localhost only (`127.0.0.1`) by default.
|
|
24
|
+
- The decision log and session state never leave the `~/.speexor/` directory.
|
|
25
|
+
|
|
26
|
+
### Two-Layer Defense: Extension Permissions + Action Risk Tiers
|
|
27
|
+
|
|
28
|
+
These are two independent, complementary layers documented in `SECURITY-DEFAULTS.md`:
|
|
29
|
+
|
|
30
|
+
**Layer 1 — Extension Permissions (install-time capability gating):**
|
|
31
|
+
|
|
32
|
+
Defined by `extensions.permissionsMode` in config (`strict` | `permissive`). Each extension declares capabilities (`shell`, `network`, `fileSystem`, `clipboard`) at install time. In `strict` mode, the user must explicitly approve each capability; in `permissive` mode, all declared capabilities are auto-granted. This layer gates what an extension *can ever do* — set once, at install.
|
|
33
|
+
|
|
34
|
+
Extensions with `shell: none` and `network: none` run in `isolated-vm` (true V8 isolate, no access to Node built-ins). Extensions requiring `fileSystem`/`shell`/`network` run as separate OS processes with minimum privileges and a permission-enforcing proxy layer intercepting `fs`/`net`/`child_process` calls.
|
|
35
|
+
|
|
36
|
+
`worker_threads` is explicitly **not** used as a security boundary — it is a performance-only primitive for orchestrator-internal CPU-bound work (per FR-85).
|
|
37
|
+
|
|
38
|
+
**Layer 2 — Action Risk Tiers (runtime action gating):**
|
|
39
|
+
|
|
40
|
+
Defined by `riskPolicy` in config. Every action an agent or extension takes is classified into a risk tier. Actions in `requireApproval` tiers (e.g., `irreversible-high-stakes`) block until the user approves. Actions in `autoApprove` tiers (e.g., `reversible-low`) execute autonomously. Unknown actions default to `high-stakes` (safe default).
|
|
41
|
+
|
|
42
|
+
This layer gates what *any* action (from any already-permitted extension or core agent) *does right now* — evaluated every time, separate from the install-time capability grant.
|
|
43
|
+
|
|
44
|
+
### Sandboxing: isolated-vm over worker_threads
|
|
45
|
+
|
|
46
|
+
| Mechanism | Security Boundary | Use Case |
|
|
47
|
+
|-----------------|-------------------|----------------------------------|
|
|
48
|
+
| `isolated-vm` | True V8 isolate | Extensions with no shell/network |
|
|
49
|
+
| OS process | OS-level | Extensions with shell/network |
|
|
50
|
+
| `worker_threads`| None (same proc) | Orchestrator-internal CPU work |
|
|
51
|
+
|
|
52
|
+
## Consequences
|
|
53
|
+
|
|
54
|
+
- **Positive:** Two layers provide defense-in-depth — an extension with "write files" capability still cannot force-push to main without risk-tier approval.
|
|
55
|
+
- **Positive:** Local-first ensures no external dependency for security; no cloud outage can leak secrets.
|
|
56
|
+
- **Negative:** `isolated-vm` is a native dependency that complicates cross-platform builds and installs.
|
|
57
|
+
- **Negative:** Two-layer model requires clear documentation (covered by `SECURITY-DEFAULTS.md`).
|
|
58
|
+
- **Neutral:** `worker_threads` reclassification from v4's proposal removes a false sense of security.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# ADR-0005: User-Home Data Directory Layout (~/.speexor/)
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Accepted
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Speexor persists several kinds of local state: session data, task graphs, checkpoints, the decision log, extension caches, and secret references. Earlier drafts left the storage location implicit. A formal decision is needed on:
|
|
10
|
+
|
|
11
|
+
1. **Location:** Should data live in the project directory (`.speexor/`) or the user home directory (`~/.speexor/`)?
|
|
12
|
+
2. **Structure:** How should different data types (SQLite, JSON, binary checkpoints, vault references) be organized?
|
|
13
|
+
3. **Isolation:** How do we prevent state leakage between different projects managed by Speexor?
|
|
14
|
+
|
|
15
|
+
## Decision
|
|
16
|
+
|
|
17
|
+
### Location: ~/.speexor/ (User Home)
|
|
18
|
+
|
|
19
|
+
All persistent state lives under `~/.speexor/` in the user's home directory, not project-local. Each managed project gets a subdirectory keyed by a content-hash of the repository URL combined with a short project ID:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
~/.speexor/
|
|
23
|
+
├── 1a2b3c4d-my-project/ # Per-project directory (hash-projectId)
|
|
24
|
+
│ ├── task-graph.sqlite # Task graph DAG store (SQLite)
|
|
25
|
+
│ ├── decision-log.sqlite # Decision Log (SQLite, read-only history)
|
|
26
|
+
│ ├── checkpoints/ # Session checkpoint snapshots (JSON)
|
|
27
|
+
│ │ ├── checkpoint-abc.json
|
|
28
|
+
│ │ └── checkpoint-def.json
|
|
29
|
+
│ ├── extensions/ # Downloaded/cached extension manifests
|
|
30
|
+
│ └── vault-refs.json # References into OS keychain (never secrets)
|
|
31
|
+
├── registry-cache/ # Marketplace registry index cache
|
|
32
|
+
├── logs/ # Global orchestrator logs
|
|
33
|
+
└── lock # Process lock file (prevents concurrent instances)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Rationale for `~/.speexor/` over project-local:
|
|
37
|
+
|
|
38
|
+
- Data survives project directory deletion (user can delete a clone without losing the decision log).
|
|
39
|
+
- Multiple clones of the same repo share a single project directory (hash-based dedup).
|
|
40
|
+
- Cleaner user experience — no hidden directories scattered across the file system.
|
|
41
|
+
- Consistent with established patterns (`.aws/`, `.config/`, `.npm/`, etc.).
|
|
42
|
+
|
|
43
|
+
### Storage Formats
|
|
44
|
+
|
|
45
|
+
| Data Type | Format | Rationale |
|
|
46
|
+
|------------------|---------|------------------------------------------------|
|
|
47
|
+
| Task graph | SQLite | Relational queries on DAG nodes/edges |
|
|
48
|
+
| Decision log | SQLite | Searchable, filterable history |
|
|
49
|
+
| Checkpoints | JSON | Human-readable, debuggable snapshots |
|
|
50
|
+
| Extension cache | JSON | Simple manifest storage, no query pattern |
|
|
51
|
+
| Vault refs | JSON | Lightweight reference store (values in keychain)|
|
|
52
|
+
| Session state | JSON | Synchronous read/write for simplicity |
|
|
53
|
+
|
|
54
|
+
### Secrets Management
|
|
55
|
+
|
|
56
|
+
The `vault-refs.json` file contains only **references** (key names/paths) into the OS keychain. Actual secret values (API tokens, encryption keys) are stored via the OS keychain (macOS Keychain, Windows Credential Manager, Linux libsecret) and never written to disk in plaintext. The `secretsBackend` config option controls which backend is used.
|
|
57
|
+
|
|
58
|
+
### Process Lock
|
|
59
|
+
|
|
60
|
+
A `lock` file at `~/.speexor/lock` prevents multiple Speexor processes from operating on the same data directory simultaneously. The lock is advisory — it contains the PID and is cleaned up on graceful shutdown. Stale locks from crashes are automatically detected and cleared on startup.
|
|
61
|
+
|
|
62
|
+
## Consequences
|
|
63
|
+
|
|
64
|
+
- **Positive:** Data persists across project directory deletions; clean separation between projects.
|
|
65
|
+
- **Positive:** Hash-based project IDs prevent collisions and enable deduplication.
|
|
66
|
+
- **Positive:** SQLite for graph and decision log enables efficient queries vs. JSON scanning.
|
|
67
|
+
- **Negative:** User-home directory may not be writable in some locked-down enterprise environments (mitigation: `SPEEXOR_DATA_DIR` env var override).
|
|
68
|
+
- **Negative:** OS keychain dependency adds a setup step for headless/server environments.
|
|
69
|
+
- **Neutral:** Consistent with `speexor migrate-from-konduktor` migration path (FR-84).
|
package/examples/basic.yaml
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
# Speexor Configuration — Basic Example
|
|
2
|
-
# Agent Orchestrator for multi-AI coding agent orchestration
|
|
3
|
-
#
|
|
4
|
-
# Usage:
|
|
5
|
-
# 1. Save this file as speexor.config.yaml in your project root
|
|
6
|
-
# 2. Run `speexor start` to initialize and open the dashboard
|
|
7
|
-
# 3. Run `speexor agent spawn --task <issue-id>` to spawn an agent
|
|
8
|
-
|
|
9
|
-
version: "1"
|
|
10
|
-
|
|
11
|
-
projects:
|
|
12
|
-
# --- Single project, single agent ---
|
|
13
|
-
- name: brainclash
|
|
14
|
-
repository: https://github.com/superdevids/brainclash
|
|
15
|
-
provider:
|
|
16
|
-
primary: opencode
|
|
17
|
-
fallback:
|
|
18
|
-
- claude-code
|
|
19
|
-
- aider
|
|
20
|
-
concurrentLimit: 3
|
|
21
|
-
|
|
22
|
-
# Automated reactions to CI and PR events
|
|
23
|
-
reactions:
|
|
24
|
-
ci-failed:
|
|
25
|
-
auto: true
|
|
26
|
-
action: fix
|
|
27
|
-
retries: 3
|
|
28
|
-
escalateAfter: 30
|
|
29
|
-
changes-requested:
|
|
30
|
-
auto: true
|
|
31
|
-
action: fix
|
|
32
|
-
retries: 2
|
|
33
|
-
escalateAfter: 60
|
|
34
|
-
approved-and-green:
|
|
35
|
-
auto: false
|
|
36
|
-
action: notify
|
|
37
|
-
retries: 0
|
|
38
|
-
escalateAfter: 0
|
|
39
|
-
|
|
40
|
-
# --- Second project with different provider ---
|
|
41
|
-
- name: kata-netizen
|
|
42
|
-
repository: https://github.com/superdevids/kata-netizen
|
|
43
|
-
provider:
|
|
44
|
-
primary: claude-code
|
|
45
|
-
concurrentLimit: 2
|
|
46
|
-
reactions:
|
|
47
|
-
ci-failed:
|
|
48
|
-
auto: true
|
|
49
|
-
action: fix
|
|
50
|
-
retries: 3
|
|
51
|
-
escalateAfter: 30
|
|
52
|
-
changes-requested:
|
|
53
|
-
auto: true
|
|
54
|
-
action: fix
|
|
55
|
-
retries: 2
|
|
56
|
-
escalateAfter: 45
|
|
57
|
-
approved-and-green:
|
|
58
|
-
auto: false
|
|
59
|
-
action: notify
|
|
60
|
-
retries: 0
|
|
61
|
-
escalateAfter: 0
|
|
1
|
+
# Speexor Configuration — Basic Example
|
|
2
|
+
# Agent Orchestrator for multi-AI coding agent orchestration
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# 1. Save this file as speexor.config.yaml in your project root
|
|
6
|
+
# 2. Run `speexor start` to initialize and open the dashboard
|
|
7
|
+
# 3. Run `speexor agent spawn --task <issue-id>` to spawn an agent
|
|
8
|
+
|
|
9
|
+
version: "1"
|
|
10
|
+
|
|
11
|
+
projects:
|
|
12
|
+
# --- Single project, single agent ---
|
|
13
|
+
- name: brainclash
|
|
14
|
+
repository: https://github.com/superdevids/brainclash
|
|
15
|
+
provider:
|
|
16
|
+
primary: opencode
|
|
17
|
+
fallback:
|
|
18
|
+
- claude-code
|
|
19
|
+
- aider
|
|
20
|
+
concurrentLimit: 3
|
|
21
|
+
|
|
22
|
+
# Automated reactions to CI and PR events
|
|
23
|
+
reactions:
|
|
24
|
+
ci-failed:
|
|
25
|
+
auto: true
|
|
26
|
+
action: fix
|
|
27
|
+
retries: 3
|
|
28
|
+
escalateAfter: 30
|
|
29
|
+
changes-requested:
|
|
30
|
+
auto: true
|
|
31
|
+
action: fix
|
|
32
|
+
retries: 2
|
|
33
|
+
escalateAfter: 60
|
|
34
|
+
approved-and-green:
|
|
35
|
+
auto: false
|
|
36
|
+
action: notify
|
|
37
|
+
retries: 0
|
|
38
|
+
escalateAfter: 0
|
|
39
|
+
|
|
40
|
+
# --- Second project with different provider ---
|
|
41
|
+
- name: kata-netizen
|
|
42
|
+
repository: https://github.com/superdevids/kata-netizen
|
|
43
|
+
provider:
|
|
44
|
+
primary: claude-code
|
|
45
|
+
concurrentLimit: 2
|
|
46
|
+
reactions:
|
|
47
|
+
ci-failed:
|
|
48
|
+
auto: true
|
|
49
|
+
action: fix
|
|
50
|
+
retries: 3
|
|
51
|
+
escalateAfter: 30
|
|
52
|
+
changes-requested:
|
|
53
|
+
auto: true
|
|
54
|
+
action: fix
|
|
55
|
+
retries: 2
|
|
56
|
+
escalateAfter: 45
|
|
57
|
+
approved-and-green:
|
|
58
|
+
auto: false
|
|
59
|
+
action: notify
|
|
60
|
+
retries: 0
|
|
61
|
+
escalateAfter: 0
|
package/package.json
CHANGED
|
@@ -1,102 +1,103 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "speexor",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Speexor — Agent Orchestrator for multi-AI coding agent orchestration across repositories",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"module": "./dist/index.js",
|
|
8
|
-
"types": "./dist/index.d.ts",
|
|
9
|
-
"bin": {
|
|
10
|
-
"speexor": "dist/cli/index.js"
|
|
11
|
-
},
|
|
12
|
-
"exports": {
|
|
13
|
-
".": {
|
|
14
|
-
"import": "./dist/index.js",
|
|
15
|
-
"types": "./dist/index.d.ts"
|
|
16
|
-
},
|
|
17
|
-
"./core": {
|
|
18
|
-
"import": "./dist/core/index.js",
|
|
19
|
-
"types": "./dist/core/index.d.ts"
|
|
20
|
-
},
|
|
21
|
-
"./cli": {
|
|
22
|
-
"import": "./dist/cli/index.js",
|
|
23
|
-
"types": "./dist/cli/index.d.ts"
|
|
24
|
-
},
|
|
25
|
-
"./plugins": {
|
|
26
|
-
"import": "./dist/plugins/index.js",
|
|
27
|
-
"types": "./dist/plugins/index.d.ts"
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
"files": [
|
|
31
|
-
"dist",
|
|
32
|
-
"schema",
|
|
33
|
-
"docs",
|
|
34
|
-
"*.md",
|
|
35
|
-
"examples",
|
|
36
|
-
"speexor.config.yaml.example"
|
|
37
|
-
],
|
|
38
|
-
"scripts": {
|
|
39
|
-
"build": "tsup",
|
|
40
|
-
"dev": "tsup --watch",
|
|
41
|
-
"test": "vitest run",
|
|
42
|
-
"test:watch": "vitest",
|
|
43
|
-
"test:coverage": "vitest run --coverage",
|
|
44
|
-
"typecheck": "tsc --noEmit",
|
|
45
|
-
"lint": "biome check src/",
|
|
46
|
-
"lint:fix": "biome check --write src/",
|
|
47
|
-
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
|
|
48
|
-
},
|
|
49
|
-
"dependencies": {
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"conf": "^12.0.0",
|
|
53
|
-
"dayjs": "^1.11.0",
|
|
54
|
-
"debug": "^4.3.0",
|
|
55
|
-
"eventemitter3": "^5.0.0",
|
|
56
|
-
"execa": "^9.0.0",
|
|
57
|
-
"globby": "^14.0.0",
|
|
58
|
-
"node-emoji": "^2.1.0",
|
|
59
|
-
"ora": "^8.0.0",
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"@
|
|
66
|
-
"@types/
|
|
67
|
-
"@
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
"
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "speexor",
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Speexor — Agent Orchestrator for multi-AI coding agent orchestration across repositories",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"speexor": "dist/cli/index.js"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./core": {
|
|
18
|
+
"import": "./dist/core/index.js",
|
|
19
|
+
"types": "./dist/core/index.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./cli": {
|
|
22
|
+
"import": "./dist/cli/index.js",
|
|
23
|
+
"types": "./dist/cli/index.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./plugins": {
|
|
26
|
+
"import": "./dist/plugins/index.js",
|
|
27
|
+
"types": "./dist/plugins/index.d.ts"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"schema",
|
|
33
|
+
"docs",
|
|
34
|
+
"*.md",
|
|
35
|
+
"examples",
|
|
36
|
+
"speexor.config.yaml.example"
|
|
37
|
+
],
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsup",
|
|
40
|
+
"dev": "tsup --watch",
|
|
41
|
+
"test": "vitest run",
|
|
42
|
+
"test:watch": "vitest",
|
|
43
|
+
"test:coverage": "vitest run --coverage",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"lint": "biome check src/",
|
|
46
|
+
"lint:fix": "biome check --write src/",
|
|
47
|
+
"clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"chalk": "^5.3.0",
|
|
51
|
+
"commander": "^12.0.0",
|
|
52
|
+
"conf": "^12.0.0",
|
|
53
|
+
"dayjs": "^1.11.0",
|
|
54
|
+
"debug": "^4.3.0",
|
|
55
|
+
"eventemitter3": "^5.0.0",
|
|
56
|
+
"execa": "^9.0.0",
|
|
57
|
+
"globby": "^14.0.0",
|
|
58
|
+
"node-emoji": "^2.1.0",
|
|
59
|
+
"ora": "^8.0.0",
|
|
60
|
+
"sql.js": "^1.14.1",
|
|
61
|
+
"yaml": "^2.5.0",
|
|
62
|
+
"zod": "^3.23.0"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@biomejs/biome": "^2.5.1",
|
|
66
|
+
"@types/debug": "^4.1.0",
|
|
67
|
+
"@types/node": "^26.0.1",
|
|
68
|
+
"@types/sql.js": "^1.4.11",
|
|
69
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
70
|
+
"tsup": "^8.3.0",
|
|
71
|
+
"typescript": "^5.7.0",
|
|
72
|
+
"vite": "^8.1.0",
|
|
73
|
+
"vitest": "^2.1.0"
|
|
74
|
+
},
|
|
75
|
+
"keywords": [
|
|
76
|
+
"orchestrator",
|
|
77
|
+
"ai-agent",
|
|
78
|
+
"agent-orchestration",
|
|
79
|
+
"coding-agent",
|
|
80
|
+
"claude-code",
|
|
81
|
+
"opencode",
|
|
82
|
+
"aider",
|
|
83
|
+
"codex",
|
|
84
|
+
"multi-agent",
|
|
85
|
+
"speexor"
|
|
86
|
+
],
|
|
87
|
+
"publishConfig": {
|
|
88
|
+
"access": "public"
|
|
89
|
+
},
|
|
90
|
+
"preferGlobal": true,
|
|
91
|
+
"repository": {
|
|
92
|
+
"type": "git",
|
|
93
|
+
"url": "git+https://github.com/superdevids/speexor.git"
|
|
94
|
+
},
|
|
95
|
+
"bugs": {
|
|
96
|
+
"url": "https://github.com/superdevids/speexor/issues"
|
|
97
|
+
},
|
|
98
|
+
"homepage": "https://github.com/superdevids/speexor#readme",
|
|
99
|
+
"license": "MIT",
|
|
100
|
+
"engines": {
|
|
101
|
+
"node": ">=18.0.0"
|
|
102
|
+
}
|
|
103
|
+
}
|