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.
- package/AGENTS.md +56 -0
- package/CONTRIBUTING.md +35 -0
- package/README.md +38 -58
- package/SECURITY.md +24 -0
- package/bin/orkestrate.ts +2 -0
- package/docs/concepts.md +119 -0
- package/docs/demo-extension-builder.md +82 -0
- package/docs/extensions/adapters.md +57 -0
- package/docs/extensions/architecture.md +49 -0
- package/docs/extensions/introduction.md +26 -0
- package/docs/getting-started.md +85 -0
- package/docs/hosted-registry.md +90 -0
- package/docs/pack-authoring.md +75 -0
- package/docs/roadmap.md +59 -0
- package/docs/troubleshooting.md +28 -0
- package/extensions/opencode-adapter/index.ts +106 -0
- package/extensions/opencode-adapter/orkestrate.extension.json +17 -0
- package/package.json +57 -50
- package/packs/coding/harnesses/opencode/agents/coding.md +8 -0
- package/packs/coding/harnesses/opencode/opencode.json +24 -0
- package/packs/coding/harnesses/opencode/skills/orkestrate/SKILL.md +57 -0
- package/packs/coding/pack.yaml +5 -0
- package/packs/extension-builder/harnesses/opencode/agents/extension-builder.md +8 -0
- package/packs/extension-builder/harnesses/opencode/opencode.json +31 -0
- package/packs/extension-builder/harnesses/opencode/skills/orkestrate/SKILL.md +54 -0
- package/packs/extension-builder/harnesses/opencode/skills/orkestrate-pack-author/SKILL.md +59 -0
- package/packs/extension-builder/pack.yaml +5 -0
- package/src/cli/cmd/extension-submit.ts +267 -0
- package/src/cli/cmd/pack-create.ts +43 -0
- package/src/cli/cmd/pack.ts +53 -0
- package/src/cli/cmd/profile-create.ts +199 -0
- package/src/cli/cmd/profile-submit.ts +236 -0
- package/src/cli/cmd/profile-validate.ts +5 -0
- package/src/cli/cmd/registry.ts +66 -0
- package/src/cli/cmd/run.ts +37 -0
- package/src/cli/index.ts +163 -0
- package/src/cli/tui.ts +355 -0
- package/src/cli/ui/welcome.ts +73 -0
- package/src/cli.ts +1 -0
- package/src/sdk/cross-platform.ts +25 -0
- package/src/sdk/extensions/loader.ts +89 -0
- package/src/sdk/extensions/manifest.ts +193 -0
- package/src/sdk/extensions/types.ts +12 -0
- package/src/sdk/harness/sync-slice.ts +57 -0
- package/src/sdk/launch/broker.ts +87 -0
- package/src/sdk/launch/runner.ts +57 -0
- package/src/sdk/launch/terminal.ts +75 -0
- package/src/sdk/launch/types.ts +7 -0
- package/src/sdk/launch/windows.ts +109 -0
- package/src/sdk/packs/catalog.ts +172 -0
- package/src/sdk/packs/create.ts +99 -0
- package/src/sdk/packs/fs.ts +52 -0
- package/src/sdk/packs/github.ts +249 -0
- package/src/sdk/packs/paths.ts +19 -0
- package/src/sdk/packs/registry.ts +40 -0
- package/src/sdk/packs/schema.ts +51 -0
- package/src/sdk/packs/store.ts +172 -0
- package/src/sdk/profiles/catalog.ts +199 -0
- package/src/sdk/profiles/github.ts +177 -0
- package/src/sdk/profiles/install.ts +161 -0
- package/src/sdk/profiles/load.ts +209 -0
- package/src/sdk/profiles/materialize.ts +85 -0
- package/src/sdk/profiles/pack.ts +128 -0
- package/src/sdk/profiles/schema.ts +201 -0
- package/src/sdk/registry.ts +19 -0
- package/src/sdk/runs/registry.ts +142 -0
- package/src/sdk/runs/types.ts +15 -0
- package/src/sdk/types.ts +39 -0
- package/src/version.ts +3 -0
- package/dist/cli.js +0 -2076
- package/dist/cli.js.map +0 -1
- package/dist/mcp-entry.js +0 -302
- 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.
|
package/docs/roadmap.md
ADDED
|
@@ -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.
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
},
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
},
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
],
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
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,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`.
|