orkestrate 0.1.15 → 0.2.0

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.
Files changed (73) hide show
  1. package/AGENTS.md +56 -0
  2. package/CONTRIBUTING.md +35 -0
  3. package/README.md +38 -58
  4. package/SECURITY.md +24 -0
  5. package/bin/orkestrate.ts +2 -0
  6. package/docs/concepts.md +119 -0
  7. package/docs/demo-extension-builder.md +82 -0
  8. package/docs/extensions/adapters.md +57 -0
  9. package/docs/extensions/architecture.md +49 -0
  10. package/docs/extensions/introduction.md +26 -0
  11. package/docs/getting-started.md +85 -0
  12. package/docs/hosted-registry.md +90 -0
  13. package/docs/pack-authoring.md +75 -0
  14. package/docs/roadmap.md +59 -0
  15. package/docs/troubleshooting.md +28 -0
  16. package/extensions/opencode-adapter/index.ts +106 -0
  17. package/extensions/opencode-adapter/orkestrate.extension.json +17 -0
  18. package/package.json +57 -50
  19. package/packs/coding/harnesses/opencode/agents/coding.md +8 -0
  20. package/packs/coding/harnesses/opencode/opencode.json +24 -0
  21. package/packs/coding/harnesses/opencode/skills/orkestrate/SKILL.md +57 -0
  22. package/packs/coding/pack.yaml +5 -0
  23. package/packs/extension-builder/harnesses/opencode/agents/extension-builder.md +8 -0
  24. package/packs/extension-builder/harnesses/opencode/opencode.json +31 -0
  25. package/packs/extension-builder/harnesses/opencode/skills/orkestrate/SKILL.md +54 -0
  26. package/packs/extension-builder/harnesses/opencode/skills/orkestrate-pack-author/SKILL.md +59 -0
  27. package/packs/extension-builder/pack.yaml +5 -0
  28. package/src/cli/cmd/extension-submit.ts +267 -0
  29. package/src/cli/cmd/pack-create.ts +43 -0
  30. package/src/cli/cmd/pack.ts +53 -0
  31. package/src/cli/cmd/profile-create.ts +199 -0
  32. package/src/cli/cmd/profile-submit.ts +236 -0
  33. package/src/cli/cmd/profile-validate.ts +5 -0
  34. package/src/cli/cmd/registry.ts +66 -0
  35. package/src/cli/cmd/run.ts +37 -0
  36. package/src/cli/index.ts +163 -0
  37. package/src/cli/tui.ts +355 -0
  38. package/src/cli/ui/welcome.ts +73 -0
  39. package/src/cli.ts +1 -0
  40. package/src/sdk/cross-platform.ts +25 -0
  41. package/src/sdk/extensions/loader.ts +89 -0
  42. package/src/sdk/extensions/manifest.ts +193 -0
  43. package/src/sdk/extensions/types.ts +12 -0
  44. package/src/sdk/harness/sync-slice.ts +57 -0
  45. package/src/sdk/launch/broker.ts +87 -0
  46. package/src/sdk/launch/runner.ts +57 -0
  47. package/src/sdk/launch/terminal.ts +75 -0
  48. package/src/sdk/launch/types.ts +7 -0
  49. package/src/sdk/launch/windows.ts +109 -0
  50. package/src/sdk/packs/catalog.ts +172 -0
  51. package/src/sdk/packs/create.ts +99 -0
  52. package/src/sdk/packs/fs.ts +52 -0
  53. package/src/sdk/packs/github.ts +249 -0
  54. package/src/sdk/packs/paths.ts +19 -0
  55. package/src/sdk/packs/registry.ts +40 -0
  56. package/src/sdk/packs/schema.ts +51 -0
  57. package/src/sdk/packs/store.ts +172 -0
  58. package/src/sdk/profiles/catalog.ts +199 -0
  59. package/src/sdk/profiles/github.ts +177 -0
  60. package/src/sdk/profiles/install.ts +161 -0
  61. package/src/sdk/profiles/load.ts +209 -0
  62. package/src/sdk/profiles/materialize.ts +85 -0
  63. package/src/sdk/profiles/pack.ts +128 -0
  64. package/src/sdk/profiles/schema.ts +201 -0
  65. package/src/sdk/registry.ts +19 -0
  66. package/src/sdk/runs/registry.ts +142 -0
  67. package/src/sdk/runs/types.ts +15 -0
  68. package/src/sdk/types.ts +39 -0
  69. package/src/version.ts +3 -0
  70. package/dist/cli.js +0 -2076
  71. package/dist/cli.js.map +0 -1
  72. package/dist/mcp-entry.js +0 -302
  73. package/dist/mcp-entry.js.map +0 -1
@@ -0,0 +1,90 @@
1
+ # Hosted Registry
2
+
3
+ `orkestrate.space` is the hosted discovery and publishing surface for the
4
+ Orkestrate ecosystem.
5
+
6
+ The CLI should stay useful without the website. The website adds publisher
7
+ identity, public discovery, submissions, and review.
8
+
9
+ ## Public User Flow
10
+
11
+ Anyone can:
12
+
13
+ - browse approved profiles and extensions;
14
+ - read developer docs;
15
+ - copy install/validation commands;
16
+ - inspect manifest metadata and source URLs.
17
+
18
+ No auth is required for browsing.
19
+
20
+ ## Publisher Flow
21
+
22
+ Publishing requires auth.
23
+
24
+ Day 0 auth should be GitHub through Supabase Auth. GitHub is the right default
25
+ because extension/profile authors are likely publishing from repositories.
26
+
27
+ Flow:
28
+
29
+ 1. Publisher signs in with GitHub.
30
+ 2. Publisher creates a publisher profile.
31
+ 3. Publisher submits a repo URL plus manifest URL or pasted manifest JSON.
32
+ 4. Submission is stored as `pending`.
33
+ 5. Orkestrate team reviews manually.
34
+ 6. Approved submissions become public registry items and versions.
35
+
36
+ ## Database Shape
37
+
38
+ The website migration creates:
39
+
40
+ - `publisher_profiles` - public publisher identity tied to `auth.users`.
41
+ - `registry_items` - public approved profile packs, adapters, skill packs, MCP
42
+ packs, and command packs.
43
+ - `registry_versions` - versioned manifests for approved registry items.
44
+ - `registry_submissions` - authenticated pending publisher submissions.
45
+
46
+ Browsing reads only approved registry rows.
47
+
48
+ Submissions are private to the submitting authenticated user until reviewed.
49
+
50
+ ## RLS Model
51
+
52
+ Public:
53
+
54
+ - `publisher_profiles`: selectable by everyone.
55
+ - `registry_items`: selectable by everyone only when `status = 'approved'`.
56
+ - `registry_versions`: selectable by everyone only when the version and item are
57
+ approved.
58
+
59
+ Authenticated:
60
+
61
+ - users can create and update their own publisher profile;
62
+ - users can create submissions;
63
+ - users can view and edit their own pending submissions.
64
+
65
+ Admin/review actions should use server-side service role code only. Never expose
66
+ the service role key to browser code.
67
+
68
+ ## Website Pages To Build
69
+
70
+ Minimum:
71
+
72
+ - `/registry` - approved public profiles/extensions.
73
+ - `/registry/[slug]` - detail page with manifest, source URL, versions, and
74
+ install/validate commands.
75
+ - `/submit` - GitHub-authenticated submission form.
76
+ - `/docs/profiles` - profile authoring.
77
+ - `/docs/extensions` - extension manifest authoring.
78
+ - `/docs/adapters` - harness adapter authoring.
79
+
80
+ ## CLI Integration Later
81
+
82
+ The CLI can later add:
83
+
84
+ ```sh
85
+ orkestrate registry search math
86
+ orkestrate extension install orkestrate.profile-pack.math-research
87
+ orkestrate profile install math-researcher
88
+ ```
89
+
90
+ For launch, local catalog plus hosted docs/submission path is enough.
@@ -0,0 +1,75 @@
1
+ # Pack authoring
2
+
3
+ A **pack** is a reusable agent product: manifest + native OpenCode harness files.
4
+ Orkestrate launches it in a **new terminal** with an isolated home that does not
5
+ touch your normal OpenCode install.
6
+
7
+ ## Layout
8
+
9
+ ```text
10
+ my-pack/
11
+ pack.yaml # id, description, harness
12
+ info.md # optional readme for humans/agents
13
+ harnesses/opencode/
14
+ opencode.json # native OpenCode config
15
+ agents/<name>.md # primary agent prompt
16
+ skills/ # optional OpenCode skills
17
+ ```
18
+
19
+ ## Scaffold a pack
20
+
21
+ ```sh
22
+ cd orkestrate
23
+ bun run src/cli/index.ts pack create my-pack --from coding
24
+ bun run src/cli/index.ts pack validate my-pack
25
+ bun run src/cli/index.ts run launch my-pack
26
+ ```
27
+
28
+ Workspace copies live at `<repo>/.orkestrate/packs/<id>/`.
29
+ Global copies live at `~/.orkestrate/packs/<id>/` (use `--global`).
30
+
31
+ ## Sessions
32
+
33
+ OpenCode session data for a pack is stored under:
34
+
35
+ ```text
36
+ <workspace>/.orkestrate/pack-homes/<pack-id>/home/
37
+ ```
38
+
39
+ Every launch of the same pack in the same repo shares that home, so session
40
+ history persists. Your personal OpenCode outside Orkestrate is unchanged.
41
+
42
+ ## Runs
43
+
44
+ Each launch also creates a small run record under `.orkestrate/runs/<run-id>/`
45
+ (launch metadata only). The TUI shows **idle** / **running** on each pack row.
46
+
47
+ ## Harness sync on launch
48
+
49
+ The OpenCode driver copies `harnesses/opencode/` into the pack home on launch:
50
+
51
+ - **First launch:** full slice is copied.
52
+ - **Later launches:** only missing `agents/`, `skills/`, and `plugins/` files are
53
+ added. Your `opencode.json` in the pack home is never overwritten.
54
+
55
+ Edit agents/skills in `.orkestrate/pack-homes/<pack-id>/home/.config/opencode/` to
56
+ customize a pack for this workspace without changing the installed pack source.
57
+
58
+ ## Registry install
59
+
60
+ ```sh
61
+ bun run src/cli/index.ts registry list
62
+ bun run src/cli/index.ts registry search coding
63
+ bun run src/cli/index.ts registry install <slug>
64
+ ```
65
+
66
+ Remote packs are cloned from GitHub (`source_url` + `orkestrate.ref` / `orkestrate.packPath`
67
+ in the registry manifest). The repo must contain `pack.yaml` at the pack path.
68
+
69
+ ## Bundled templates
70
+
71
+ - `coding` — day-to-day software work
72
+ - `extension-builder` — includes `orkestrate` and `orkestrate-pack-author` skills
73
+
74
+ See [demo-extension-builder.md](./demo-extension-builder.md) for the full
75
+ builder → new pack → launch walkthrough.
@@ -0,0 +1,59 @@
1
+ # Roadmap
2
+
3
+ ## Layer 1: Skeleton
4
+
5
+ - Bun TypeScript package
6
+ - `orkestrate` command
7
+ - MIT license
8
+ - README
9
+
10
+ Status: done.
11
+
12
+ ## Layer 2: Harness Detection
13
+
14
+ - OpenCode adapter
15
+ - `orkestrate doctor`
16
+
17
+ Status: done.
18
+
19
+ ## Layer 3: Packs (replaces profiles in v0.2)
20
+
21
+ - `pack.yaml` + `harnesses/opencode/` layout
22
+ - workspace + global pack stores
23
+ - `pack create|install|validate`
24
+ - bundled `coding`, `extension-builder`
25
+
26
+ Status: done.
27
+
28
+ ## Layer 4: Minimal TUI
29
+
30
+ - OpenTUI pack list + browse
31
+ - per-pack idle/running status
32
+ - detached terminal launch (TUI stays open)
33
+
34
+ Status: done for v0.2.
35
+
36
+ ## Layer 5: OpenCode Launch
37
+
38
+ - driver compiles pack → launch plan
39
+ - new terminal per launch
40
+ - per-pack persistent home (shared sessions)
41
+
42
+ Status: done for v0.2.
43
+
44
+ ## Layer 6: Extensions
45
+
46
+ - extension loader + OpenCode adapter
47
+ - manifest validate/submit
48
+ - extension authoring docs
49
+
50
+ Status: partial. Marketplace install UX, permission sandbox, and setup/apply
51
+ workflows are deferred.
52
+
53
+ ## Layer 7: Profile orchestration (target demo)
54
+
55
+ - meta profile that authors child profiles
56
+ - spawn multiple profile instances
57
+ - track run completion without manual handoff per instance
58
+
59
+ Status: not started. Requires execution model beyond single launch handoff.
@@ -0,0 +1,28 @@
1
+ # Troubleshooting
2
+
3
+ ## Bun EPERM Noise On Windows/OneDrive
4
+
5
+ In this workspace, Bun sometimes prints messages like:
6
+
7
+ ```text
8
+ error: Cannot read file "C:\Users\..."
9
+ ```
10
+
11
+ after an otherwise successful command.
12
+
13
+ This has been observed even with a minimal command such as:
14
+
15
+ ```sh
16
+ bun -e "console.log('hi')"
17
+ ```
18
+
19
+ So far it appears to be Bun or shell/path probing noise related to the Windows
20
+ OneDrive path, not Orkestrate command failure. Treat the command exit code and
21
+ the Orkestrate output as the source of truth.
22
+
23
+ If this appears outside OneDrive or with a non-zero exit code, capture:
24
+
25
+ - the command
26
+ - the full output
27
+ - `bun --version`
28
+ - the working directory path
@@ -0,0 +1,106 @@
1
+ import type { HarnessDriver, HarnessStatus, CompileContext } from "../../src/sdk/types";
2
+ import type { Pack } from "../../src/sdk/packs/schema";
3
+ import type { LaunchPlan } from "../../src/sdk/launch/types";
4
+ import type { OrkExtension } from "../../src/sdk/extensions/types";
5
+ import { mkdir } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { spawnSync } from "bun";
8
+ import { harnessSliceDir } from "../../src/sdk/packs/paths";
9
+ import { seedHarnessSlice } from "../../src/sdk/harness/sync-slice";
10
+
11
+ async function pathExists(path: string): Promise<boolean> {
12
+ try {
13
+ await Bun.file(path).exists();
14
+ return true;
15
+ } catch {
16
+ return false;
17
+ }
18
+ }
19
+
20
+ async function applyHarnessSlice(pack: Pack, opencodeConfigDir: string): Promise<string> {
21
+ const slice = harnessSliceDir(pack.packRoot, "opencode");
22
+ if (!(await pathExists(slice))) {
23
+ throw new Error(`Pack is missing harnesses/opencode/ slice`);
24
+ }
25
+ await mkdir(opencodeConfigDir, { recursive: true });
26
+ await seedHarnessSlice(slice, opencodeConfigDir);
27
+ return opencodeConfigDir;
28
+ }
29
+
30
+ export const opencodeDriver: HarnessDriver = {
31
+ id: "opencode",
32
+ name: "OpenCode",
33
+
34
+ async detect(): Promise<HarnessStatus> {
35
+ try {
36
+ const proc = spawnSync(["opencode", "--version"], { stdout: "pipe", stderr: "pipe" });
37
+ if (!proc.success) {
38
+ return { installed: false, error: proc.stderr.toString().trim() || "opencode --version failed" };
39
+ }
40
+ return { installed: true, version: proc.stdout.toString().trim() || undefined };
41
+ } catch (error) {
42
+ return { installed: false, error: error instanceof Error ? error.message : String(error) };
43
+ }
44
+ },
45
+
46
+ async compile(pack: Pack, context: CompileContext): Promise<LaunchPlan> {
47
+ if (pack.harness !== "opencode") {
48
+ throw new Error(`Pack "${pack.id}" is not an OpenCode pack`);
49
+ }
50
+
51
+ // One home per pack in this workspace — OpenCode sessions persist across launches.
52
+ // Env is only set on the Orkestrate-spawned process; the user's normal OpenCode is untouched.
53
+ const profileHome = context.packHome;
54
+ const profileConfigHome = join(profileHome, ".config");
55
+ const profileDataHome = join(profileHome, ".local", "share");
56
+ const profileStateHome = join(profileHome, ".local", "state");
57
+ const profileCacheHome = join(profileHome, ".cache");
58
+ const opencodeConfigDir = join(profileConfigHome, "opencode");
59
+
60
+ await applyHarnessSlice(pack, opencodeConfigDir);
61
+
62
+ let defaultAgent = pack.id;
63
+ const configPath = join(opencodeConfigDir, "opencode.json");
64
+ if (await pathExists(configPath)) {
65
+ try {
66
+ const config = await Bun.file(configPath).json();
67
+ if (typeof config.default_agent === "string") {
68
+ defaultAgent = config.default_agent;
69
+ }
70
+ } catch {
71
+ // use pack id
72
+ }
73
+ }
74
+
75
+ const env: Record<string, string> = {
76
+ ...Object.fromEntries(
77
+ Object.entries(process.env).filter(([, v]) => v !== undefined) as [string, string][]
78
+ ),
79
+ ...context.crossPlatform.hijackHome(profileHome),
80
+ XDG_CONFIG_HOME: profileConfigHome,
81
+ XDG_DATA_HOME: profileDataHome,
82
+ XDG_STATE_HOME: profileStateHome,
83
+ XDG_CACHE_HOME: profileCacheHome,
84
+ OPENCODE_CONFIG_DIR: opencodeConfigDir,
85
+ };
86
+
87
+ return {
88
+ command: "opencode",
89
+ args: ["--agent", defaultAgent],
90
+ cwd: context.cwd,
91
+ env,
92
+ title: `orkestrate: ${pack.id}`,
93
+ };
94
+ },
95
+ };
96
+
97
+ export const extension: OrkExtension = {
98
+ id: "orkestrate.driver.opencode",
99
+ name: "OpenCode Driver",
100
+ version: "0.2.0",
101
+ activate(ctx) {
102
+ ctx.registerAdapter("opencode", opencodeDriver);
103
+ },
104
+ };
105
+
106
+ export default extension;
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "orkestrate.adapter.opencode",
3
+ "name": "OpenCode Adapter",
4
+ "version": "0.1.0",
5
+ "description": "Built-in adapter contribution that launches Orkestrate profiles through OpenCode.",
6
+ "contributes": {
7
+ "adapters": [
8
+ {
9
+ "id": "opencode",
10
+ "entry": "index.ts"
11
+ }
12
+ ],
13
+ "profiles": [],
14
+ "skills": [],
15
+ "mcpServers": []
16
+ }
17
+ }
package/package.json CHANGED
@@ -1,50 +1,57 @@
1
- {
2
- "name": "orkestrate",
3
- "version": "0.1.15",
4
- "description": "CLI for Orkestrate the coordination layer for autonomous AI coding agents",
5
- "type": "module",
6
- "bin": {
7
- "orkestrate": "./dist/cli.js"
8
- },
9
- "files": [
10
- "dist",
11
- "README.md",
12
- "LICENSE"
13
- ],
14
- "scripts": {
15
- "build": "tsup",
16
- "dev": "tsup --watch",
17
- "prepublishOnly": "tsup"
18
- },
19
- "keywords": [
20
- "orkestrate",
21
- "mcp",
22
- "ai-agents",
23
- "multi-agent",
24
- "coordination",
25
- "claude",
26
- "opencode",
27
- "cursor",
28
- "codex",
29
- "cli"
30
- ],
31
- "author": "system1970",
32
- "license": "MIT",
33
- "repository": {
34
- "type": "git",
35
- "url": "https://github.com/system1970/Orkestrate.git",
36
- "directory": "packages/cli"
37
- },
38
- "homepage": "https://orkestrate.space",
39
- "dependencies": {
40
- "commander": "^13.1.0",
41
- "conf": "^13.1.0",
42
- "open": "^10.1.2",
43
- "picocolors": "^1.1.1"
44
- },
45
- "devDependencies": {
46
- "@types/node": "^22.15.0",
47
- "tsup": "^8.4.0",
48
- "typescript": "^5.8.0"
49
- }
50
- }
1
+ {
2
+ "name": "orkestrate",
3
+ "version": "0.2.0",
4
+ "description": "Browse, use, and share specialized harnesses for agent packs.",
5
+ "homepage": "https://orkestrate.space",
6
+ "bugs": {
7
+ "url": "https://github.com/anomalyco/orkestrate/issues"
8
+ },
9
+ "license": "MIT",
10
+ "private": false,
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/anomalyco/orkestrate.git"
14
+ },
15
+ "type": "module",
16
+ "bin": {
17
+ "orkestrate": "./bin/orkestrate.ts"
18
+ },
19
+ "files": [
20
+ "bin",
21
+ "src",
22
+ "packs",
23
+ "extensions",
24
+ "docs",
25
+ "README.md",
26
+ "LICENSE",
27
+ "CONTRIBUTING.md",
28
+ "SECURITY.md",
29
+ "AGENTS.md"
30
+ ],
31
+ "engines": {
32
+ "bun": ">=1.3.0"
33
+ },
34
+ "keywords": [
35
+ "agents",
36
+ "ai-agents",
37
+ "agent-packs",
38
+ "harness",
39
+ "opencode",
40
+ "tui",
41
+ "registry"
42
+ ],
43
+ "scripts": {
44
+ "dev": "bun run src/cli/index.ts",
45
+ "prepublishOnly": "bun run check",
46
+ "typecheck": "tsc --noEmit",
47
+ "check": "bun run typecheck",
48
+ "demo:pack-builder": "bun run scripts/demo-pack-builder.ts"
49
+ },
50
+ "devDependencies": {
51
+ "@types/bun": "^1.3.1",
52
+ "typescript": "^5.9.3"
53
+ },
54
+ "dependencies": {
55
+ "@opentui/core": "^0.3.0"
56
+ }
57
+ }
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: General-purpose coding agent for day-to-day software work.
3
+ mode: primary
4
+ ---
5
+
6
+ Use the Orkestrate coding pack. Prioritize small, reviewable changes, clear verification, and repository instructions.
7
+
8
+ Follow AGENTS.md and project conventions when present.
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "default_agent": "coding",
4
+ "share": "manual",
5
+ "autoupdate": false,
6
+ "instructions": ["AGENTS.md", "README.md"],
7
+ "agent": {
8
+ "coding": {
9
+ "description": "General-purpose coding agent for day-to-day software work.",
10
+ "mode": "primary",
11
+ "permission": {
12
+ "read": "allow",
13
+ "grep": "allow",
14
+ "glob": "allow",
15
+ "bash": "allow",
16
+ "edit": "allow",
17
+ "write": "allow",
18
+ "skill": {
19
+ "orkestrate": "allow"
20
+ }
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: orkestrate
3
+ description: >
4
+ Orkestrate control room — list/install packs, launch runs in new terminals,
5
+ check and stop runs. Use when orchestrating multiple packs, spawning another
6
+ agent in a separate terminal, or managing concurrent harness runs. Do not use
7
+ for in-session subtasks (use OpenCode task). For authoring packs load
8
+ orkestrate-pack-author.
9
+ compatibility: opencode
10
+ metadata:
11
+ platform: orkestrate
12
+ ---
13
+
14
+ # Orkestrate (runtime)
15
+
16
+ ## When to use
17
+
18
+ - Launch another installed pack in a **new terminal**
19
+ - Run multiple packs or multiple instances of the same pack
20
+ - List or stop Orkestrate runs
21
+
22
+ ## When not to use
23
+
24
+ - Same-session subtasks → OpenCode **`task`** tool
25
+ - Authoring pack files → load skill **`orkestrate-pack-author`**
26
+
27
+ ## Commands (run via bash in workspace cwd)
28
+
29
+ ```bash
30
+ orkestrate pack list
31
+ orkestrate pack create <id> --from coding
32
+ orkestrate pack install <slug>
33
+ orkestrate pack validate <pack-id>
34
+ orkestrate registry list
35
+ orkestrate registry install <slug>
36
+
37
+ orkestrate run launch <pack-id>
38
+ orkestrate run list
39
+ orkestrate run status <run-id>
40
+ orkestrate run stop <run-id>
41
+ ```
42
+
43
+ `run launch` and `run spawn` are the same: **new visible terminal**, prints `runId`.
44
+
45
+ ## Spawn workflow
46
+
47
+ 1. Ensure pack is installed: `orkestrate pack list`
48
+ 2. `orkestrate run launch <pack-id>`
49
+ 3. Note the `runId` from output
50
+ 4. `orkestrate run status <run-id>` to check state
51
+ 5. `orkestrate run stop <run-id>` if needed
52
+
53
+ Each launch creates a new run with isolated config under `.orkestrate/runs/<runId>/`.
54
+
55
+ ## Multi-instance
56
+
57
+ You may launch the same `pack-id` multiple times; each gets a unique `runId`.
@@ -0,0 +1,5 @@
1
+ id: coding
2
+ name: coding
3
+ description: General-purpose coding agent for day-to-day software work.
4
+ version: "0.1.0"
5
+ harness: opencode
@@ -0,0 +1,8 @@
1
+ ---
2
+ description: Build Orkestrate packs, drivers, and platform extensions.
3
+ mode: primary
4
+ ---
5
+
6
+ You are the Orkestrate extension builder. Help design, write, test, and package packs, harness drivers, and Orkestrate extensions. Keep changes scoped to the orkestrate CLI unless asked otherwise.
7
+
8
+ Load `orkestrate-pack-author` for pack layout and `orkestrate` to launch other packs in new terminals.
@@ -0,0 +1,31 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "default_agent": "extension-builder",
4
+ "share": "manual",
5
+ "autoupdate": false,
6
+ "instructions": [
7
+ "AGENTS.md",
8
+ "README.md",
9
+ "src/sdk/extensions/types.ts",
10
+ "src/sdk/types.ts",
11
+ "src/sdk/packs/schema.ts"
12
+ ],
13
+ "agent": {
14
+ "extension-builder": {
15
+ "description": "Build Orkestrate packs, drivers, and extensions.",
16
+ "mode": "primary",
17
+ "permission": {
18
+ "read": "allow",
19
+ "grep": "allow",
20
+ "glob": "allow",
21
+ "bash": "allow",
22
+ "edit": "ask",
23
+ "write": "ask",
24
+ "skill": {
25
+ "orkestrate": "allow",
26
+ "orkestrate-pack-author": "allow"
27
+ }
28
+ }
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: orkestrate
3
+ description: >
4
+ Orkestrate control room — list/install packs, launch runs in new terminals,
5
+ check and stop runs. Use when orchestrating multiple packs, spawning another
6
+ agent in a separate terminal, or managing concurrent harness runs. Do not use
7
+ for in-session subtasks (use OpenCode task). For authoring packs load
8
+ orkestrate-pack-author.
9
+ compatibility: opencode
10
+ metadata:
11
+ platform: orkestrate
12
+ ---
13
+
14
+ # Orkestrate (runtime)
15
+
16
+ ## When to use
17
+
18
+ - Launch another installed pack in a **new terminal**
19
+ - Run multiple packs or multiple instances of the same pack
20
+ - List or stop Orkestrate runs
21
+
22
+ ## When not to use
23
+
24
+ - Same-session subtasks → OpenCode **`task`** tool
25
+ - Authoring pack files → load skill **`orkestrate-pack-author`**
26
+
27
+ ## Commands (run via bash in workspace cwd)
28
+
29
+ ```bash
30
+ orkestrate pack list
31
+ orkestrate pack install <slug>
32
+ orkestrate pack validate <pack-id>
33
+
34
+ orkestrate run launch <pack-id>
35
+ orkestrate run list
36
+ orkestrate run status <run-id>
37
+ orkestrate run stop <run-id>
38
+ ```
39
+
40
+ `run launch` and `run spawn` are the same: **new visible terminal**, prints `runId`.
41
+
42
+ ## Spawn workflow
43
+
44
+ 1. Ensure pack is installed: `orkestrate pack list`
45
+ 2. `orkestrate run launch <pack-id>`
46
+ 3. Note the `runId` from output
47
+ 4. `orkestrate run status <run-id>` to check state
48
+ 5. `orkestrate run stop <run-id>` if needed
49
+
50
+ Each launch creates a new run with isolated config under `.orkestrate/runs/<runId>/`.
51
+
52
+ ## Multi-instance
53
+
54
+ You may launch the same `pack-id` multiple times; each gets a unique `runId`.