@awebai/oats 0.25.9 → 0.27.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/README.md +8 -6
- package/bin/oats.mjs +648 -1755
- package/capabilities/oats-authoring/oats-package.json +2 -2
- package/capabilities/oats-authoring/oats.json +2 -2
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +46 -25
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +13 -6
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +279 -93
- package/capabilities/oats-aweb/injects/aweb.md +7 -2
- package/capabilities/oats-aweb/lib/binding-wire.mjs +89 -13
- package/capabilities/oats-aweb/lib/captured-native.mjs +1 -1
- package/capabilities/oats-aweb/lib/grant-custody.mjs +38 -0
- package/capabilities/oats-aweb/oats.json +8 -4
- package/capabilities/oats-jira/bin/oats-jira.mjs +4 -4
- package/capabilities/oats-jira/oats.json +2 -2
- package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +6 -3
- package/capabilities/oats-linear/bin/oats-linear-hook.mjs +6 -4
- package/capabilities/oats-linear/oats.json +2 -2
- package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +6 -0
- package/capabilities/oats-review/oats.json +3 -2
- package/docs/capabilities.md +229 -58
- package/docs/capability-manifest.schema.json +29 -9
- package/docs/configuration.md +17 -5
- package/docs/conventions.md +18 -28
- package/docs/design/2026-09-08-expert-assisted-deployment-proposal.md +1 -1
- package/docs/design/2026-09-13-knowledge-and-memory-direction.md +3 -3
- package/docs/design/2026-09-14-portable-souls-and-git-workspaces.md +2 -2
- package/docs/design/2026-09-15-portable-souls-handoff.md +2 -2
- package/docs/design/2026-09-15-portable-souls-implementation.md +1 -1
- package/docs/design/2026-09-20-redesign-program-board.md +2 -2
- package/docs/design/2026-09-23-workspace-module-contracts.md +1 -1
- package/docs/design/2026-09-23-workspace-v2-implementation-plan.md +1 -1
- package/docs/design/2026-09-24-desktop-phase-f-boundary.md +34 -1
- package/docs/design/2026-09-24-phase-d-plan.md +57 -0
- package/docs/design/2026-09-25-teams-contract.md +226 -0
- package/docs/design/README.md +3 -3
- package/docs/design/launch-configurations.md +20 -16
- package/docs/design/operations-contract.md +27 -10
- package/docs/desktop-cli-api.md +604 -271
- package/docs/desktop-instance-start.md +3 -3
- package/docs/desktop.md +7 -13
- package/docs/execution-targets.md +16 -18
- package/docs/first-team.md +15 -18
- package/docs/implementation.md +31 -62
- package/docs/integrations.md +64 -33
- package/docs/knowledge-capability-authoring.md +1 -1
- package/docs/knowledge-reference/package-craft.md +10 -8
- package/docs/knowledge-theory.md +1 -1
- package/docs/knowledge.md +10 -11
- package/docs/layers.md +16 -17
- package/docs/oats-local.schema.json +30 -1
- package/docs/oats-membership.schema.json +5 -3
- package/docs/oats-package.schema.json +2 -2
- package/docs/oats-workspace.schema.json +1 -1
- package/docs/{official-marketplace.md → official-catalog.md} +15 -16
- package/docs/packages.md +76 -53
- package/docs/release-notes/v0.22.0.md +1 -1
- package/docs/release-notes/v0.23.1.md +1 -1
- package/docs/release-notes/v0.26.0.md +670 -0
- package/docs/release-notes/v0.27.0.md +100 -0
- package/docs/schedules.md +54 -132
- package/docs/servers.md +4 -4
- package/docs/soul.schema.json +11 -4
- package/docs/souls-and-instances.md +60 -47
- package/docs/workspaces.md +80 -58
- package/injects/instance-boundary.md +2 -2
- package/injects/work-attached.md +1 -1
- package/injects/work-workspace.md +2 -2
- package/lib/{portable-files.mjs → bounded-read.mjs} +6 -6
- package/lib/{portable-values.mjs → canonical-json.mjs} +3 -12
- package/lib/capability-contract.mjs +110 -0
- package/lib/config-data.mjs +2 -2
- package/lib/core.mjs +947 -5023
- package/lib/deprecation.mjs +24 -0
- package/lib/digest.mjs +12 -0
- package/lib/instance-inspect.mjs +397 -0
- package/lib/instance-lifecycle.mjs +3 -4
- package/lib/instance-resolution.mjs +212 -26
- package/lib/instruction-composition.mjs +0 -20
- package/lib/materialize.mjs +6 -4
- package/lib/operator-dispatch.mjs +33 -13
- package/lib/packages.mjs +25 -190
- package/lib/process-group.mjs +1 -1
- package/lib/provider-binding.mjs +4 -2
- package/lib/provider-reasons.mjs +3 -68
- package/lib/remote.mjs +1 -1
- package/lib/resolve.mjs +204 -68
- package/lib/schedule.mjs +136 -292
- package/lib/servers.mjs +70 -38
- package/lib/{portable-shape.mjs → shape.mjs} +4 -3
- package/lib/tree-copy.mjs +44 -0
- package/lib/workspace.mjs +132 -20
- package/package-catalog.json +6 -6
- package/package.json +1 -1
- package/packages/record/lib/session-roots.mjs +8 -6
- package/skills/integration-authoring/SKILL.md +48 -40
- package/skills/oats-getting-started/SKILL.md +105 -110
- package/skills/oats-support/SKILL.md +2 -2
- package/skills/soul-craft/SKILL.md +13 -6
- package/bin/oats-pi-sdk-host.mjs +0 -17
- package/docs/2026-09-03-architecture-proposal.md +0 -642
- package/docs/artifact-approvals.schema.json +0 -7
- package/docs/captured-invocation-context.schema.json +0 -7
- package/docs/captured-resolution.schema.json +0 -7
- package/docs/design/package-engine-contract.md +0 -813
- package/docs/design/package-runtime-api.md +0 -588
- package/docs/desktop-succession.md +0 -57
- package/docs/execution-capsule.schema.json +0 -108
- package/docs/first-team-demo.md +0 -92
- package/docs/knowledge-migration.md +0 -147
- package/docs/migration-from-oas.md +0 -103
- package/docs/oats-config.schema.json +0 -172
- package/docs/oats-lock-v3.schema.json +0 -7
- package/docs/oats-lock.schema.json +0 -175
- package/docs/operating-team-migration.md +0 -470
- package/docs/portable.schema.json +0 -2512
- package/docs/provider-check-input.schema.json +0 -7
- package/docs/rebuild-to-v2.md +0 -511
- package/docs/workspace-adoption.md +0 -74
- package/injects/framework-workspace.md +0 -7
- package/injects/local-soul.md +0 -19
- package/injects/oats-portable.md +0 -20
- package/injects/oats.md +0 -11
- package/injects/portable-instance-boundary.md +0 -39
- package/injects/portable-work-directory.md +0 -29
- package/lib/artifact-approvals.mjs +0 -120
- package/lib/artifact-tree.mjs +0 -141
- package/lib/capability-artifacts.mjs +0 -179
- package/lib/capability-execution.mjs +0 -15
- package/lib/capability-inputs.mjs +0 -39
- package/lib/capability-provenance.mjs +0 -231
- package/lib/captured-action-shape.mjs +0 -21
- package/lib/captured-admission-shape.mjs +0 -20
- package/lib/captured-binding-file.mjs +0 -36
- package/lib/captured-dispatch.mjs +0 -66
- package/lib/captured-instance-index.mjs +0 -277
- package/lib/captured-invocation-context.mjs +0 -130
- package/lib/captured-launch-request.mjs +0 -66
- package/lib/captured-operation-process.mjs +0 -15
- package/lib/captured-pi-custody.mjs +0 -29
- package/lib/captured-pi-host.mjs +0 -167
- package/lib/captured-pi-outcome.mjs +0 -172
- package/lib/captured-resolutions.mjs +0 -275
- package/lib/captured-scaffold.mjs +0 -87
- package/lib/captured-selector.mjs +0 -28
- package/lib/captured-session-backend.mjs +0 -52
- package/lib/captured-source-receipt-file.mjs +0 -72
- package/lib/helper-injection-policy.mjs +0 -104
- package/lib/legacy-lock-codec.mjs +0 -106
- package/lib/manifest-settings.mjs +0 -84
- package/lib/package-closure.mjs +0 -48
- package/lib/package-materialization.mjs +0 -83
- package/lib/pi-sdk-host.mjs +0 -229
- package/lib/portable-artifacts.mjs +0 -115
- package/lib/portable-choices.mjs +0 -82
- package/lib/portable-composition.mjs +0 -136
- package/lib/portable-digest.mjs +0 -105
- package/lib/portable-identity.mjs +0 -40
- package/lib/portable-lock.mjs +0 -117
- package/lib/portable-onboarding-request.mjs +0 -49
- package/lib/portable-onboarding.mjs +0 -256
- package/lib/portable-package-preparation.mjs +0 -188
- package/lib/portable-policy.mjs +0 -44
- package/lib/portable-soul.mjs +0 -42
- package/lib/portable-state.mjs +0 -80
- package/lib/prepare-composition.mjs +0 -170
- package/lib/prepared-bindings.mjs +0 -92
- package/lib/prepared-resources.mjs +0 -127
- package/lib/provider-binding-broker.mjs +0 -65
- package/lib/provider-binding-wire.mjs +0 -116
- package/lib/readiness.mjs +0 -225
- package/lib/repository-observation.mjs +0 -226
- package/lib/resolution-shape.mjs +0 -393
- package/lib/schedule-capsule.mjs +0 -206
- package/lib/soul-constraints.mjs +0 -40
- package/lib/source-projection.mjs +0 -84
- package/lib/source-spec.mjs +0 -189
- package/lib/workspace-definition.mjs +0 -126
- package/lib/workspace-discovery.mjs +0 -146
- package/skills/oats/SKILL.md +0 -162
- package/skills/oats-config/SKILL.md +0 -164
- package/skills/oats-packages/SKILL.md +0 -184
- package/skills/oats-portable/SKILL.md +0 -115
- package/skills/oats-portable-artifacts/SKILL.md +0 -63
package/package-catalog.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"policy": "docs/official-
|
|
2
|
+
"policy": "docs/official-catalog.md",
|
|
3
3
|
"packages": {
|
|
4
4
|
"oats.okf": {
|
|
5
5
|
"url": "https://github.com/awebai/oats-okf.git",
|
|
@@ -8,27 +8,27 @@
|
|
|
8
8
|
},
|
|
9
9
|
"oats.aweb": {
|
|
10
10
|
"url": "https://github.com/awebai/oats-aweb.git",
|
|
11
|
-
"ref": "v1.
|
|
11
|
+
"ref": "v1.13.1",
|
|
12
12
|
"path": "oats-package"
|
|
13
13
|
},
|
|
14
14
|
"oats.jira": {
|
|
15
15
|
"url": "https://github.com/awebai/oats-jira.git",
|
|
16
|
-
"ref": "v1.0.
|
|
16
|
+
"ref": "v1.0.1",
|
|
17
17
|
"path": "oats-package"
|
|
18
18
|
},
|
|
19
19
|
"oats.linear": {
|
|
20
20
|
"url": "https://github.com/awebai/oats-linear.git",
|
|
21
|
-
"ref": "v1.0.
|
|
21
|
+
"ref": "v1.0.1",
|
|
22
22
|
"path": "oats-package"
|
|
23
23
|
},
|
|
24
24
|
"oats.authoring": {
|
|
25
25
|
"url": "https://github.com/awebai/oats-authoring.git",
|
|
26
|
-
"ref": "v1.0.
|
|
26
|
+
"ref": "v1.0.3",
|
|
27
27
|
"path": "oats-package"
|
|
28
28
|
},
|
|
29
29
|
"oats.dev": {
|
|
30
30
|
"url": "https://github.com/awebai/oats-dev.git",
|
|
31
|
-
"ref": "v1.0.
|
|
31
|
+
"ref": "v1.0.1",
|
|
32
32
|
"path": "oats-package"
|
|
33
33
|
},
|
|
34
34
|
"oats.framework": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awebai/oats",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.0",
|
|
4
4
|
"description": "OATS (Open Agent Team Specification) — durable souls, disposable instances, targetable capability packages, and the runtime-neutral oats CLI/kernel.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agents",
|
|
@@ -16,7 +16,9 @@ export function sourceSessionEnvironment(home, base = process.env) {
|
|
|
16
16
|
}
|
|
17
17
|
const recipe = meta?.launch;
|
|
18
18
|
if (recipe !== undefined) {
|
|
19
|
-
|
|
19
|
+
// Version 1 (a 0.26.0 home) names the harness `runtime`; version 2 `harness`.
|
|
20
|
+
const harness = recipe?.version === 2 ? recipe.harness : recipe?.version === 1 ? recipe.runtime : undefined;
|
|
21
|
+
if (!recipe || !["claude", "pi", "codex"].includes(harness)) {
|
|
20
22
|
throw new Error("cannot resolve source transcript roots: unsupported recorded launch recipe");
|
|
21
23
|
}
|
|
22
24
|
for (const layer of [recipe.hooks?.env, recipe.env]) {
|
|
@@ -32,7 +34,7 @@ export function sourceSessionEnvironment(home, base = process.env) {
|
|
|
32
34
|
}
|
|
33
35
|
// Pi also supports a direct session-directory override. Do not certify
|
|
34
36
|
// default roots when native options direct evidence somewhere else.
|
|
35
|
-
if (
|
|
37
|
+
if (harness === "pi") {
|
|
36
38
|
const args = recipe.args ?? [];
|
|
37
39
|
if (!Array.isArray(args) || args.some((a) => typeof a !== "string")) throw new Error("cannot resolve source transcript roots: invalid launch arguments");
|
|
38
40
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -69,13 +71,13 @@ export function nativeDirectory(value, { home = homedir(), cwd = process.cwd(),
|
|
|
69
71
|
/** Native execution-side locations, without existence filtering. Unlike a
|
|
70
72
|
* background observer scan, Claude's native default is exactly ~/.claude,
|
|
71
73
|
* not every .claude* profile found under an observer's HOME. */
|
|
72
|
-
export function nativeLaunchLocations(
|
|
74
|
+
export function nativeLaunchLocations(harness, { cwd, env = process.env, args = [] } = {}) {
|
|
73
75
|
const home = env.HOME || homedir();
|
|
74
76
|
if (!isAbsolute(home)) throw new Error("native launch HOME must be absolute");
|
|
75
77
|
if (!Array.isArray(args) || args.some(a => typeof a !== "string")) throw new Error("invalid native launch arguments");
|
|
76
|
-
if (
|
|
77
|
-
if (
|
|
78
|
-
if (
|
|
78
|
+
if (harness === "claude") return [join(nativeDirectory(env.CLAUDE_CONFIG_DIR || join(home, ".claude"), { home, cwd }), "projects")];
|
|
79
|
+
if (harness === "codex") return [join(nativeDirectory(env.CODEX_HOME || join(home, ".codex"), { home, cwd }), "sessions")];
|
|
80
|
+
if (harness !== "pi") throw new Error("unsupported native record harness");
|
|
79
81
|
let sessionDir = env.PI_CODING_AGENT_SESSION_DIR;
|
|
80
82
|
for (let i = 0; i < args.length; i++) {
|
|
81
83
|
const arg = args[i];
|
|
@@ -3,7 +3,7 @@ name: integration-authoring
|
|
|
3
3
|
description: >-
|
|
4
4
|
Route custom OATS capability-package and integration work to the framework's
|
|
5
5
|
integrations expert. Use when building, adapting, or debugging a reusable
|
|
6
|
-
capability, new
|
|
6
|
+
capability, new tasks/messaging/knowledge core capability, oats.json manifest,
|
|
7
7
|
lifecycle hook, or operational command—not merely activating an existing
|
|
8
8
|
package. Triggers: "custom integration", "capability package", "integrate
|
|
9
9
|
our tracker", "new messaging integration", "write an oats.json".
|
|
@@ -12,65 +12,73 @@ description: >-
|
|
|
12
12
|
# Capability and integration authoring — delegate
|
|
13
13
|
|
|
14
14
|
A capability package may ship skills, instance instructions, requirements,
|
|
15
|
-
namespaced commands, and
|
|
16
|
-
|
|
15
|
+
namespaced commands, and declared hooks. A core capability is the constrained
|
|
16
|
+
kind that fills one of the knowledge, messaging or tasks positions (its
|
|
17
|
+
manifest's `layer` field names which). Building either requires
|
|
17
18
|
manifest, security, targeting-boundary, collision, and probe discipline; use
|
|
18
19
|
the framework's **integrations-expert** soul rather than improvising.
|
|
19
20
|
|
|
20
|
-
If the user only wants an existing package,
|
|
21
|
+
If the user only wants an existing package, declare it and give it to souls;
|
|
22
|
+
no build is needed:
|
|
21
23
|
|
|
22
|
-
```
|
|
23
|
-
oats
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
```yaml
|
|
25
|
+
# oats-workspace.yaml (host repository): declaring the package is the trust decision
|
|
26
|
+
packages:
|
|
27
|
+
vendor.review: git:github.com/vendor/review@v1.0.0
|
|
28
|
+
# a soul's soul.yaml, or the workspace defaults: a capability the package exports
|
|
29
|
+
# (a package may export several; the soul names each one it wants)
|
|
30
|
+
capabilities:
|
|
31
|
+
vendor.review: { from: package }
|
|
26
32
|
```
|
|
27
33
|
|
|
28
|
-
|
|
34
|
+
Then run `oats sync` (fetch, verify integrity, lock). The oats.setup
|
|
35
|
+
capability's **oats-package-pins** skill has the procedure.
|
|
36
|
+
|
|
37
|
+
## 1. Verify the expert is available
|
|
38
|
+
|
|
39
|
+
Run `oats souls` in the deployment and confirm it resolves the
|
|
40
|
+
`integrations-expert` soul (a member repository or package provides it). If it
|
|
41
|
+
is absent, ask the human which OATS deployment owns reusable package work;
|
|
42
|
+
never locate or import private kernel files.
|
|
29
43
|
|
|
30
|
-
|
|
31
|
-
`~/oats`; verify with `git -C <dir> remote get-url origin`. Avoid
|
|
32
|
-
pi-managed git clones because updates reset them. If absent, ask where to
|
|
33
|
-
clone `https://github.com/awebai/oats`.
|
|
44
|
+
## 2. Spawn the expert against the package's repository
|
|
34
45
|
|
|
35
|
-
|
|
46
|
+
The package lives in its own repository. Make that repository a member of the
|
|
47
|
+
workspace (or use the member that already holds it), then spawn the expert on
|
|
48
|
+
it:
|
|
36
49
|
|
|
37
50
|
```bash
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
repo: '<users-workspace-or-repo>',
|
|
45
|
-
work: 'checkout',
|
|
46
|
-
task: '<capability intent; layer if any; skills/instructions/commands/hooks; external tools; desired global/group/soul targets; distribution path>',
|
|
47
|
-
});
|
|
48
|
-
console.log('window:', r.tmux.window, '| attach:', r.attach);
|
|
49
|
-
})"
|
|
51
|
+
oats spawn integrations-expert --preview \
|
|
52
|
+
--purpose <package-slug> \
|
|
53
|
+
--repo <member clone of the package repository> \
|
|
54
|
+
--work worktree \
|
|
55
|
+
--task '<capability intent; layer if any; skills/instructions/commands/hooks; external tools; which souls should get it; distribution path>'
|
|
56
|
+
# review the preview, then run the same command without --preview
|
|
50
57
|
```
|
|
51
58
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
Use `--relation child --relative-to <your-instance>` only when the documented
|
|
60
|
+
workflow makes the expert your child; otherwise leave the spawn unrelated. A
|
|
61
|
+
package is distributed from its own repository as `oats-package/` with a
|
|
62
|
+
version tag; a framework contribution belongs in the framework's repository.
|
|
56
63
|
|
|
57
64
|
## 3. Brief the design boundary
|
|
58
65
|
|
|
59
66
|
Tell the expert:
|
|
60
67
|
|
|
61
68
|
- whether it is additive or implements exactly one of knowledge/messaging/tasks;
|
|
62
|
-
- external requirements and executable surfaces;
|
|
69
|
+
- external requirements and executable surfaces (commands, hooks);
|
|
63
70
|
- intended distribution and version/compatibility;
|
|
64
|
-
-
|
|
65
|
-
- expected skill/instruction
|
|
71
|
+
- which souls or workspace defaults should receive it, and its settings; and
|
|
72
|
+
- expected skill/instruction collisions (a duplicate skill name fails the spawn).
|
|
66
73
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
Which souls get a capability is declared by the workspace (`defaults`) and the
|
|
75
|
+
souls (`soul.yaml` `capabilities`), never in the manifest. The expert must
|
|
76
|
+
test exact pi/Claude/Codex instance materialization, generated instructions,
|
|
77
|
+
command gating, deterministic hooks, and the lock's integrity check as
|
|
78
|
+
applicable.
|
|
70
79
|
|
|
71
80
|
## 4. Hand off
|
|
72
81
|
|
|
73
|
-
Report the
|
|
74
|
-
package/integration craft, runs a
|
|
75
|
-
and
|
|
76
|
-
its soul.
|
|
82
|
+
Report the new instance (`oats status`). The expert follows its
|
|
83
|
+
package/integration craft, runs a preview-only probe, and leaves the
|
|
84
|
+
`packages:` pin and the `oats sync` for the user.
|
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oats-getting-started
|
|
3
3
|
description: >-
|
|
4
|
-
How to
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
How to start with OATS (Open Agent Team Specification) from nothing — install
|
|
5
|
+
the CLI and pi adapter, decide which repository hosts the organisation's
|
|
6
|
+
workspace, write the three shared declarations (oats-workspace.yaml,
|
|
7
|
+
oats-membership.yaml, souls/<name>/soul.yaml), realize the workspace on this
|
|
8
|
+
machine with `oats onboard` and spawn the first soul. Use
|
|
9
|
+
for "get started with OATS", "set up/install/adopt OATS", "create my first
|
|
10
|
+
agent", or "how do I start using OATS".
|
|
9
11
|
---
|
|
10
12
|
|
|
11
13
|
# Getting started with OATS
|
|
12
14
|
|
|
13
|
-
OATS gives
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
OATS gives an organisation durable **souls** (role definitions kept in Git),
|
|
16
|
+
disposable **instances** (a soul at work, in its own home) and **capabilities**
|
|
17
|
+
(skills, instructions and hooks copied whole into each instance at spawn). One
|
|
18
|
+
**workspace** per organisation lists the repositories that belong to it. Do not
|
|
19
|
+
run setup blindly: explain each decision and ask before writing a file,
|
|
20
|
+
declaring a package or spawning.
|
|
21
|
+
|
|
22
|
+
This skill is the one pre-workspace bootstrap. Once the first instance exists,
|
|
23
|
+
the `oats.setup` capability's skills (and the `oats-operator-expert` soul, where
|
|
24
|
+
the workspace offers it) carry the rest; spawned instances get their own skills.
|
|
16
25
|
|
|
17
26
|
## 1. Install
|
|
18
27
|
|
|
@@ -21,139 +30,125 @@ npm install -g @awebai/oats
|
|
|
21
30
|
pi install npm:@awebai/oats-pi
|
|
22
31
|
```
|
|
23
32
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
isolation needs the kernel's launch flags and the changed adapter's
|
|
27
|
-
instance-only discovery. Reload pi after installing or upgrading the adapter.
|
|
28
|
-
|
|
29
|
-
This skill is the one pre-workspace ambient bootstrap. Spawned instances
|
|
30
|
-
receive exact local skills.
|
|
31
|
-
|
|
32
|
-
## 2. Choose scope
|
|
33
|
-
|
|
34
|
-
`oats-config.yaml` can live at:
|
|
33
|
+
Install matching versions and upgrade both together (`oats update`). Reload pi
|
|
34
|
+
after installing or upgrading the adapter. Check with `oats version`.
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
- workspace: shared multi-repo policy; or
|
|
38
|
-
- repository: repo-specific policy.
|
|
36
|
+
## 2. Decide where the workspace is hosted — first
|
|
39
37
|
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
The workspace file names every member repository, so whoever can read it sees
|
|
39
|
+
the member list. Ask:
|
|
42
40
|
|
|
43
|
-
|
|
41
|
+
- **Does the organisation already have an OATS workspace?** Then skip to step 4
|
|
42
|
+
with its repository reference.
|
|
43
|
+
- **Is any repository that will join private?** Then the workspace file lives
|
|
44
|
+
in a private repository that is not itself a public member (a dedicated
|
|
45
|
+
`<org>/workspace` repository is the honest shape). Otherwise any member,
|
|
46
|
+
often a dedicated `agents` repository, can host it.
|
|
44
47
|
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
Every member runs its capabilities' hooks on every operator's machine, gated
|
|
49
|
+
only by membership. In a mixed public/private organisation keep executable
|
|
50
|
+
capabilities in packages or private members, and only souls in public members.
|
|
47
51
|
|
|
48
|
-
|
|
49
|
-
|---|---|---|---|
|
|
50
|
-
| knowledge | `oats.okf` | soul OKF bundle, instance memory, harvest | nothing |
|
|
51
|
-
| messaging | `oats.aweb` | instance identity and team messaging | `aw` CLI |
|
|
52
|
-
| tasks | none | choose Jira, Linear, or another integration | provider-specific |
|
|
52
|
+
## 3. Write the shared declarations (in Git, reviewed like code)
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
choices: disable messaging for a solo repo; choose `oats.linear`/`oats.jira` for
|
|
56
|
-
tasks; use `--raw` for all layers off. Official integrations are acquired like
|
|
57
|
-
any other package; `oats init` acquires the selected ones into this scope's
|
|
58
|
-
installed/ store (locked). Executable surfaces (like OKF's harvest) need
|
|
59
|
-
`oats trust` before use — acquisition never grants executable trust. In an
|
|
60
|
-
interactive terminal with no layer flags, bare `oats init` prompts per layer;
|
|
61
|
-
through an agent, always pass explicit flags.
|
|
54
|
+
In the host repository, `oats-workspace.yaml`:
|
|
62
55
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
oats
|
|
76
|
-
oats
|
|
77
|
-
oats init --raw --knowledge oats.okf --no-tmux-mouse
|
|
78
|
-
oats init --tasks oats.linear --tmux-mouse
|
|
56
|
+
```yaml
|
|
57
|
+
schemaVersion: 2
|
|
58
|
+
name: acme
|
|
59
|
+
members:
|
|
60
|
+
- git:github.com/acme/agents # the host is a member too
|
|
61
|
+
- git:github.com/acme/platform
|
|
62
|
+
packages:
|
|
63
|
+
oats.framework: v1.1.3 # bare versions resolve through the official catalog
|
|
64
|
+
oats.okf: v2.1.5
|
|
65
|
+
teams:
|
|
66
|
+
global: { description: Org-wide souls }
|
|
67
|
+
defaults:
|
|
68
|
+
capabilities: { oats.core: { from: package } }
|
|
69
|
+
knowledge: { oats.okf: { from: package } }
|
|
79
70
|
```
|
|
80
71
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
72
|
+
Take the current package versions from the official catalog
|
|
73
|
+
(`package-catalog.json` in the OATS repository); ask which slots the user wants
|
|
74
|
+
filled (knowledge, messaging, tasks) instead of copying the example. No absolute
|
|
75
|
+
paths, accounts or team ids go in this file.
|
|
85
76
|
|
|
86
|
-
|
|
87
|
-
|
|
77
|
+
Declaring a package in `packages:` is the decision to trust it: its commands
|
|
78
|
+
and hooks run on every machine that spawns a soul using it. Show the user what
|
|
79
|
+
each package runs (its capability manifests' `commands` and `hooks`) before
|
|
80
|
+
adding its pin.
|
|
88
81
|
|
|
89
|
-
|
|
82
|
+
In **every** member repository, including the host, `oats-membership.yaml`:
|
|
90
83
|
|
|
91
|
-
|
|
84
|
+
```yaml
|
|
85
|
+
schemaVersion: 2
|
|
86
|
+
workspace: git:github.com/acme/agents
|
|
87
|
+
team: global
|
|
88
|
+
```
|
|
92
89
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
- one soul.
|
|
90
|
+
Membership is reciprocal: the workspace lists the repository and the
|
|
91
|
+
repository names the workspace back. Neither alone is membership.
|
|
96
92
|
|
|
97
|
-
|
|
93
|
+
A soul lives at `souls/<name>/` in a member repository: `soul.yaml`,
|
|
94
|
+
`AGENTS.md` (its canonical instructions) and `CLAUDE.md -> AGENTS.md`.
|
|
98
95
|
|
|
99
96
|
```yaml
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
additive:
|
|
105
|
-
vendor.code-review:
|
|
106
|
-
from: installed
|
|
107
|
-
agent-types:
|
|
108
|
-
developers: true
|
|
97
|
+
schemaVersion: 2
|
|
98
|
+
name: backend-expert
|
|
99
|
+
description: Owns backend architecture and implementation.
|
|
100
|
+
work: worktree # worktree | checkout | directory | workspace
|
|
109
101
|
```
|
|
110
102
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
103
|
+
A soul says where each extra capability comes from (`{ from: package }`,
|
|
104
|
+
`{ from: here }` or `{ from: <member repo key> }`), never a version. A soul
|
|
105
|
+
whose knowledge slot is filled by `oats.okf` also needs `okf.json` beside
|
|
106
|
+
`soul.yaml`; `docs/knowledge.md` in the OATS repository shows its shape.
|
|
107
|
+
Commit and push; OATS reads members over their remotes, not from local clones.
|
|
108
|
+
|
|
109
|
+
## 4. Realize the workspace on this machine
|
|
110
|
+
|
|
111
|
+
Ask the user **which directory** holds this machine's deployment — usually the
|
|
112
|
+
folder that already holds their clones. There is no required name.
|
|
115
113
|
|
|
116
114
|
```bash
|
|
117
|
-
oats
|
|
118
|
-
oats trust vendor.code-review --dir /path/to/workspace # approve executable surfaces
|
|
119
|
-
oats use vendor.code-review --type developers --dir /path/to/workspace
|
|
115
|
+
oats onboard <dir> --workspace git:github.com/acme/agents
|
|
120
116
|
```
|
|
121
117
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
requirements, package diagnosis) belongs to the `oats-packages` skill — part
|
|
126
|
-
of the kernel baseline inside spawned instances; in this pre-workspace
|
|
127
|
-
context use docs/packages.md and the top-level `oats help` output.
|
|
118
|
+
It writes `<dir>/oats-local.yaml` (the one per-machine file, never committed)
|
|
119
|
+
and `agents/`, confirms each member, resolves and locks the packages, and prints
|
|
120
|
+
the next steps. Fix any member that is not confirmed (`oats workspace status` says why) before going on.
|
|
128
121
|
|
|
129
|
-
|
|
122
|
+
Host-owned settings a package asks for (absolute paths, state directories) go
|
|
123
|
+
under `settings:` in `oats-local.yaml`, never in the workspace file. For
|
|
124
|
+
`oats.okf` that is `bindings-file` and `state-dir`; its own skill explains the
|
|
125
|
+
bindings file.
|
|
126
|
+
|
|
127
|
+
## 5. Sync after any change
|
|
130
128
|
|
|
131
129
|
```bash
|
|
132
|
-
oats
|
|
130
|
+
oats sync --dir <dir> # resolve every pin to a commit, fetch, verify integrity, write oats-lock.json
|
|
133
131
|
```
|
|
134
132
|
|
|
135
|
-
|
|
136
|
-
|
|
133
|
+
Run it after any change to the workspace file. It asks nothing; the lock pins
|
|
134
|
+
each package to an exact commit and integrity, and content that no longer
|
|
135
|
+
matches is refused (`E_PACKAGE_INTEGRITY`). Member capabilities come from
|
|
136
|
+
membership.
|
|
137
|
+
|
|
138
|
+
## 6. Spawn the first soul
|
|
137
139
|
|
|
138
|
-
|
|
140
|
+
A soul with `work: worktree | checkout` needs a clone of its repository at
|
|
141
|
+
`<dir>/<repo name>` (or named in `oats-local.yaml` `clones:`).
|
|
139
142
|
|
|
140
143
|
```bash
|
|
141
|
-
|
|
142
|
-
oats
|
|
143
|
-
# Optional: --type <agent-type> joins a declared family so typed config targets apply.
|
|
144
|
-
# Edit agents/backend-expert/soul/AGENTS.md: durable role, boundaries, workflow.
|
|
145
|
-
oats doctor . --soul backend-expert
|
|
144
|
+
oats souls --dir <dir> # what the workspace offers, with origin and team
|
|
145
|
+
oats spawn backend-expert --preview # modules, commits, merged provider settings — nothing created
|
|
146
146
|
oats spawn backend-expert --task "First concrete task"
|
|
147
147
|
oats status
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
For operations load the `oats` skill; for local deployment policy and
|
|
156
|
-
config-template adoption use `oats-config`; package acquisition/locks/trust beyond the
|
|
157
|
-
bootstrap above belong to `oats-packages` (kernel baseline inside spawned
|
|
158
|
-
instances); for custom layer/package work use `integration-authoring`; for
|
|
159
|
-
deep architecture or bugs use `oats-support`.
|
|
150
|
+
Create and spawn only when asked. After the first spawn, load the `oats.setup`
|
|
151
|
+
skills for the rest of the deployment (messaging, more souls, rebuilds). For
|
|
152
|
+
custom capabilities and integrations, use `integration-authoring`; for deep
|
|
153
|
+
architecture questions or bugs, use `oats-support`. The model in full is
|
|
154
|
+
`docs/workspaces.md` in the OATS repository.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: oats-support
|
|
3
3
|
description: >-
|
|
4
4
|
Route deep OATS framework questions to the framework's own expert agent.
|
|
5
|
-
Use when a user asks how OATS works beyond the basics in the oats skill, why
|
|
5
|
+
Use when a user asks how OATS works beyond the basics in the oats-operate skill, why
|
|
6
6
|
the framework behaves a certain way, wants framework changes or roadmap
|
|
7
7
|
context, or hits framework bugs — the answer is to instantiate the
|
|
8
8
|
oats-expert soul from the OATS framework repo and delegate. Triggers: "ask
|
|
@@ -74,6 +74,6 @@ harvests the instance's notes back into the expert's soul.
|
|
|
74
74
|
## Scope note
|
|
75
75
|
|
|
76
76
|
Quick questions (home layout, roster, lifecycle, doctor) are already
|
|
77
|
-
answered by the **oats** skill — use that first. Delegate to the expert for
|
|
77
|
+
answered by the **oats-operate** skill (the `oats.core` capability) — use that first. Delegate to the expert for
|
|
78
78
|
architecture, design rationale, roadmap, and anything you would otherwise
|
|
79
79
|
guess about.
|
|
@@ -28,7 +28,7 @@ real CLAUDE.md file diverging from AGENTS.md, that's a defect: merge and relink)
|
|
|
28
28
|
|---|---|---|
|
|
29
29
|
| **AGENTS.md** | always | Role, boundaries, the default workflow, memory pointers — only what applies to *every* session |
|
|
30
30
|
| **skills/** | on demand (description match) | Domain workflows, repeatable procedures ("how") — see `skill-craft` |
|
|
31
|
-
| **knowledge/** | on demand (index-first) | Facts, decisions, lessons ("what/why") — format per the knowledge
|
|
31
|
+
| **knowledge/** | on demand (index-first) | Facts, decisions, lessons ("what/why") — format per the knowledge capability (default okf) |
|
|
32
32
|
|
|
33
33
|
The test for every AGENTS.md line: **"would removing this cause mistakes in
|
|
34
34
|
most sessions?"** No → move it to a skill or a knowledge concept, or cut it.
|
|
@@ -53,7 +53,7 @@ Structure that works (keep the whole thing short — a screen or two):
|
|
|
53
53
|
"run the tests").
|
|
54
54
|
4. **Memory pointers.** Where its knowledge and state live (knowledge base
|
|
55
55
|
index, STATE.md discipline). Point, don't duplicate — the protocol lives
|
|
56
|
-
with your knowledge
|
|
56
|
+
with your knowledge capability (default okf: the memory-harvest skill).
|
|
57
57
|
5. **Escalation.** When to stop and ask the human or coordinator: the
|
|
58
58
|
human-gate triggers (security, authz, migrations, contract breaks),
|
|
59
59
|
plus "report to your spawner, don't self-fix" for infrastructure faults.
|
|
@@ -73,10 +73,17 @@ Style rules (from the agents.md standard + field experience):
|
|
|
73
73
|
|
|
74
74
|
## soul.yaml
|
|
75
75
|
|
|
76
|
-
Keep honest: `
|
|
77
|
-
checkout for reviewers/coordinators
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
Keep honest: `description` (one line; shows in rosters and pickers), `work`
|
|
77
|
+
(`worktree` for builders, `checkout` for reviewers/coordinators, `directory`
|
|
78
|
+
or `workspace` where the role needs them), and the capabilities the role
|
|
79
|
+
actually uses (`capabilities: { <cap>: { from: package | here | <repo key> } }`,
|
|
80
|
+
plus `knowledge` / `messaging` / `tasks` slots; `none` empties one). The
|
|
81
|
+
soul lives in its member repository, which is also what it works on.
|
|
82
|
+
|
|
83
|
+
Runtime, model and permission bypass are not soul fields: they are chosen at
|
|
84
|
+
spawn (`--harness`, `--model`, `--yolo`) or by a host's named launch
|
|
85
|
+
configuration, so the same soul runs on any harness a host provides. Check a
|
|
86
|
+
soul with `oats spawn <soul> --preview` before committing it.
|
|
80
87
|
|
|
81
88
|
## Maintaining a soul
|
|
82
89
|
|
package/bin/oats-pi-sdk-host.mjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** Explicit kernel-owned print adapter; not an alternate interpretation of Pi CLI. */
|
|
3
|
-
import { recordCapturedPiExit, runCapturedPiSdkHost } from "../lib/captured-pi-host.mjs";
|
|
4
|
-
|
|
5
|
-
try {
|
|
6
|
-
const argv = process.argv.slice(2);
|
|
7
|
-
process.exitCode = argv[0] === "--oats-pi-record-exit" ? recordCapturedPiExit(argv) : await runCapturedPiSdkHost(argv);
|
|
8
|
-
} catch (error) {
|
|
9
|
-
// Never echo arbitrary SDK/helper/provider error objects: those can contain
|
|
10
|
-
// native auth material. Native print mode owns its ordinary safe diagnostics.
|
|
11
|
-
const known = new Set(["E_PI_HOST_ARGS", "E_PI_HOST_SELECTION", "E_PI_HOST_MODEL", "E_PI_HOST_TASK", "E_PI_HOST_SDK", "E_PI_HOST_CURRICULUM", "E_PI_HOST_HISTORY", "E_PI_HOST_CUSTODY", "E_PI_HOST_RECORD_UNAVAILABLE", "E_PI_HOST_OUTCOME"]);
|
|
12
|
-
const code = known.has(error?.code) ? error.code : "E_PI_HOST_FAILED";
|
|
13
|
-
console.error(process.argv[2] === "--oats-pi-record-exit"
|
|
14
|
-
? `${code}: captured Pi process observation refused or failed; completion evidence remains held`
|
|
15
|
-
: `${code}: captured Pi host refused or failed; use the selected harness's native setup for model/auth prerequisites`);
|
|
16
|
-
process.exitCode = 1;
|
|
17
|
-
}
|