@awebai/oats 0.22.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 (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +380 -0
  3. package/bin/oats.mjs +3294 -0
  4. package/capabilities/oats-authoring/oats.json +12 -0
  5. package/capabilities/oats-aweb/bin/oats-aweb.mjs +297 -0
  6. package/capabilities/oats-aweb/injects/aweb.md +55 -0
  7. package/capabilities/oats-aweb/oats.json +47 -0
  8. package/capabilities/oats-aweb/package.json +20 -0
  9. package/capabilities/oats-jira/bin/oats-jira.mjs +40 -0
  10. package/capabilities/oats-jira/injects/jira.md +10 -0
  11. package/capabilities/oats-jira/oats.json +22 -0
  12. package/capabilities/oats-jira/package.json +25 -0
  13. package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +176 -0
  14. package/capabilities/oats-linear/README.md +234 -0
  15. package/capabilities/oats-linear/bin/oats-linear-hook.mjs +32 -0
  16. package/capabilities/oats-linear/bin/oats-linear.mjs +344 -0
  17. package/capabilities/oats-linear/injects/linear.md +8 -0
  18. package/capabilities/oats-linear/oats.json +24 -0
  19. package/capabilities/oats-linear/package.json +29 -0
  20. package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +217 -0
  21. package/capabilities/oats-linear/test/oats-linear.test.mjs +168 -0
  22. package/capabilities/oats-okf/agents/memory-harvest.md +25 -0
  23. package/capabilities/oats-okf/bin/oats-okf.mjs +283 -0
  24. package/capabilities/oats-okf/injects/okf.md +62 -0
  25. package/capabilities/oats-okf/oats.json +20 -0
  26. package/capabilities/oats-okf/package.json +22 -0
  27. package/capabilities/oats-okf/skills/memory-harvest/SKILL.md +100 -0
  28. package/capabilities/oats-okf/skills/okf/SKILL.md +107 -0
  29. package/capabilities/oats-okf/skills/okf/scripts/okf-validate.mjs +123 -0
  30. package/capabilities/oats-review/agents/reviewer/AGENTS.md +53 -0
  31. package/capabilities/oats-review/agents/reviewer/soul.yaml +6 -0
  32. package/capabilities/oats-review/injects/review.md +68 -0
  33. package/capabilities/oats-review/oats.json +10 -0
  34. package/capabilities/oats-review/skills/code-review/SKILL.md +44 -0
  35. package/capabilities/oats-review/skills/security-review/SKILL.md +59 -0
  36. package/docs/capabilities.md +505 -0
  37. package/docs/capability-manifest.schema.json +223 -0
  38. package/docs/configuration.md +482 -0
  39. package/docs/conventions.md +73 -0
  40. package/docs/design/desktop-ux-plan.md +362 -0
  41. package/docs/design/package-engine-contract.md +813 -0
  42. package/docs/design/package-runtime-api.md +414 -0
  43. package/docs/desktop-cli-api.md +89 -0
  44. package/docs/desktop-succession.md +51 -0
  45. package/docs/desktop.md +187 -0
  46. package/docs/implementation.md +282 -0
  47. package/docs/integrations.md +123 -0
  48. package/docs/knowledge-theory.md +97 -0
  49. package/docs/knowledge.md +139 -0
  50. package/docs/layers.md +110 -0
  51. package/docs/migration-from-oas.md +122 -0
  52. package/docs/oats-config.schema.json +140 -0
  53. package/docs/oats-lock.schema.json +175 -0
  54. package/docs/oats-package.schema.json +129 -0
  55. package/docs/packages.md +442 -0
  56. package/docs/release-lane.md +132 -0
  57. package/docs/release-notes/v0.18.2.md +79 -0
  58. package/docs/release-notes/v0.18.3.md +63 -0
  59. package/docs/release-notes/v0.18.4.md +65 -0
  60. package/docs/release-notes/v0.18.5.md +66 -0
  61. package/docs/release-notes/v0.18.6.md +87 -0
  62. package/docs/release-notes/v0.19.0.md +186 -0
  63. package/docs/release-notes/v0.19.1.md +24 -0
  64. package/docs/release-notes/v0.19.2.md +32 -0
  65. package/docs/release-notes/v0.19.3.md +16 -0
  66. package/docs/release-notes/v0.19.4.md +12 -0
  67. package/docs/release-notes/v0.20.0.md +89 -0
  68. package/docs/release-notes/v0.22.0.md +180 -0
  69. package/docs/souls-and-instances.md +344 -0
  70. package/injects/framework-workspace.md +7 -0
  71. package/injects/instance-boundary.md +43 -0
  72. package/injects/local-soul.md +19 -0
  73. package/injects/oats.md +11 -0
  74. package/injects/work-attached.md +16 -0
  75. package/injects/work-checkout.md +12 -0
  76. package/injects/work-workspace.md +22 -0
  77. package/injects/work-worktree.md +13 -0
  78. package/lib/core.mjs +6792 -0
  79. package/lib/packages.mjs +1375 -0
  80. package/lib/tmux-config.mjs +35 -0
  81. package/package-catalog.json +44 -0
  82. package/package.json +55 -0
  83. package/packages/record/README.md +151 -0
  84. package/packages/record/bin/capture.mjs +256 -0
  85. package/packages/record/bin/recall.mjs +102 -0
  86. package/packages/record/bin/setup.mjs +281 -0
  87. package/packages/record/bin/turn-record.mjs +47 -0
  88. package/packages/record/docs/turn-record-sot.md +350 -0
  89. package/packages/record/lib/canonical.mjs +151 -0
  90. package/packages/record/lib/capture-aw.mjs +179 -0
  91. package/packages/record/lib/capture-cc.mjs +322 -0
  92. package/packages/record/lib/formats.mjs +296 -0
  93. package/packages/record/lib/ignore.mjs +155 -0
  94. package/packages/record/lib/index-db.mjs +524 -0
  95. package/packages/record/lib/project-aweb.mjs +251 -0
  96. package/packages/record/lib/segments.mjs +186 -0
  97. package/packages/record/lib/store.mjs +447 -0
  98. package/packages/record/lib/tags.mjs +114 -0
  99. package/packages/record/package.json +45 -0
  100. package/packages/record/test/vectors/README.md +34 -0
  101. package/packages/record/test/vectors/aweb-projection-v1.json +231 -0
  102. package/packages/record/test/vectors/journal-merge-v1.json +261 -0
  103. package/packages/record/test/vectors/turn-id-v1.json +152 -0
  104. package/packages/record/test/vectors/validate.mjs +391 -0
  105. package/skills/integration-authoring/SKILL.md +76 -0
  106. package/skills/oats/SKILL.md +151 -0
  107. package/skills/oats-config/SKILL.md +162 -0
  108. package/skills/oats-getting-started/SKILL.md +159 -0
  109. package/skills/oats-packages/SKILL.md +180 -0
  110. package/skills/oats-support/SKILL.md +79 -0
  111. package/skills/skill-craft/SKILL.md +109 -0
  112. package/skills/soul-craft/SKILL.md +109 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OATS Framework
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,380 @@
1
+ # OATS — Open Agent Team Specification
2
+
3
+ **Durable specialist agents that compound expertise across sessions, tools, models, and repositories.**
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@awebai/oats.svg)](https://www.npmjs.com/package/@awebai/oats)
6
+ [![Pull Request CI](https://github.com/awebai/oats/actions/workflows/pull-request.yml/badge.svg)](https://github.com/awebai/oats/actions/workflows/pull-request.yml)
7
+ [![Release](https://img.shields.io/github/v/release/awebai/oats?display_name=tag)](https://github.com/awebai/oats/releases)
8
+ [![Node 22+](https://img.shields.io/badge/node-%3E%3D22-brightgreen.svg)](https://nodejs.org/)
9
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
10
+
11
+ OATS makes agents first-class project artifacts. Instead of giving every task
12
+ the same general assistant, a workspace owns a backend expert, a UI
13
+ specialist, a maintainer, a reviewer, a package owner, or any other role, each
14
+ with a precise curriculum, durable knowledge, and a full provider-native
15
+ session you can enter and steer.
16
+
17
+ OATS works with **Pi** and **Claude Code**. A team may mix providers and models
18
+ while sharing the same souls, package and config contracts, instance
19
+ lifecycle, and coordination topology. Every conversation an agent has is
20
+ captured into an append-only, searchable **turn record** that outlives models,
21
+ harnesses, and this repository's own designs.
22
+
23
+ ## Contents
24
+
25
+ - [Highlights](#highlights)
26
+ - [Quick start](#quick-start)
27
+ - [How it works](#how-it-works)
28
+ - [The turn record](#the-turn-record)
29
+ - [Official packages](#official-packages)
30
+ - [OATS Desktop](#oats-desktop)
31
+ - [Maturity](#maturity)
32
+ - [Upgrading and migration](#upgrading-and-migration)
33
+ - [CLI essentials](#cli-essentials)
34
+ - [Documentation](#documentation)
35
+ - [Contributing](#contributing)
36
+ - [Releases and versioning](#releases-and-versioning)
37
+ - [Origins and acknowledgements](#origins-and-acknowledgements)
38
+ - [License](#license)
39
+
40
+ ## Highlights
41
+
42
+ - **Specialists are project assets.** A soul is reviewed Markdown, YAML,
43
+ skills, and knowledge that travel with the repository. It can be
44
+ instantiated many times without losing its identity or accumulated
45
+ expertise.
46
+ - **Instances are real sessions, not hidden subagent calls.** Each instance is
47
+ a disposable incarnation with a full Pi or Claude Code session hosted in
48
+ tmux, an explicit task, its own home, and a repository or workspace view.
49
+ You can attach to it, steer it, message it, stop it, and inspect exactly
50
+ what it received.
51
+ - **An exact curriculum, fail closed.** At spawn, OATS resolves the scoped
52
+ config for the target soul and materializes only the resources selected for
53
+ that agent. Missing, duplicate, untrusted, incompatible, or escaping
54
+ resources stop the launch before an incomplete agent starts.
55
+ - **Expertise compounds.** With the official `oats.okf` knowledge package, an
56
+ instance keeps resumable working state and captures non-obvious lessons. A
57
+ memory-harvest agent promotes durable knowledge back into the soul, so
58
+ future instances begin where earlier ones finished.
59
+ - **Hash-locked distribution.** Capabilities ship in Git-acquired packages
60
+ with exact locks, integrity, dependency closure, and explicit executable
61
+ trust. Acquisition never implies activation.
62
+ - **Teams stay steerable.** Instances have explicit `child`, `parent`, and
63
+ `sibling` relationships, can carry cross-machine identities through a
64
+ messaging layer such as `oats.aweb`, and are visible together in OATS
65
+ Desktop.
66
+ - **Everything is on the record.** Claude Code, Pi, and Codex sessions, plus
67
+ aweb mail and chat, are captured as signed turns with exact provenance and
68
+ searched locally with `oats recall`.
69
+
70
+ ## Quick start
71
+
72
+ Requires Node.js 22 or newer and tmux.
73
+
74
+ ```bash
75
+ npm install -g @awebai/oats@latest
76
+ pi install npm:@awebai/oats-pi@latest # only if you run agents in Pi
77
+ ```
78
+
79
+ Initialize a workspace and check it:
80
+
81
+ ```bash
82
+ cd my-workspace
83
+ oats init
84
+ oats doctor
85
+ ```
86
+
87
+ Create a specialist and put it to work:
88
+
89
+ ```bash
90
+ oats create backend-expert --type developers --repo . --work worktree
91
+ oats spawn backend-expert --purpose implement --task "Add rate limiting to the public API"
92
+ oats status --team
93
+ oats retire <instance>
94
+ ```
95
+
96
+ Or adopt a complete reference configuration from an official package:
97
+
98
+ ```bash
99
+ oats init --package oats.dev --config default
100
+ oats install
101
+ ```
102
+
103
+ `oats init --package` acquires and exact-locks the full closure, validates the
104
+ chosen template against its providers, writes it as your local
105
+ `oats-config.yaml`, and records the adopted base so `oats config diff` and
106
+ `oats config sync` can compare against it later.
107
+
108
+ Start capturing the turn record on this machine:
109
+
110
+ ```bash
111
+ oats setup
112
+ oats recall "rate limiting"
113
+ ```
114
+
115
+ A Pi agent can also load the `oats-getting-started` skill and guide the setup.
116
+
117
+ ## How it works
118
+
119
+ > **Package distributes. Capability teaches or enables. Config assigns. Soul specializes. Instance works.**
120
+
121
+ | Concept | Meaning |
122
+ | --- | --- |
123
+ | **Package** | Git or local acquisition, exact lock, update, integrity, dependency, and review unit. |
124
+ | **Capability** | Independently targetable behavior inside a package: skills, instructions, commands, agents, requirements, or lifecycle hooks. |
125
+ | **Config template** | A complete reference `oats-config.yaml` a package ships. You adopt one explicitly, and it becomes your ordinary local config. |
126
+ | **Adopted base** | The exact template recorded at adoption, kept commit-safe so guided sync can compare against it. |
127
+ | **Config** | Local authority: selects layers, targets capabilities to agent types and souls, applies settings, exclusions, and overrides. |
128
+ | **Soul** | Durable specialist identity, curriculum, and accumulated knowledge. |
129
+ | **Instance** | One disposable incarnation and provider-native working session. |
130
+
131
+ ### Souls and instances
132
+
133
+ ```text
134
+ agents/backend-expert/soul/
135
+ soul.yaml
136
+ AGENTS.md
137
+ CLAUDE.md -> AGENTS.md
138
+ skills/
139
+ knowledge/
140
+ ```
141
+
142
+ Every instance has two operational surfaces. The **instance home** is the
143
+ brain and operational boundary: instructions, task, soul reference, selected
144
+ skills, provenance, and episodic state. **`work/`** is the repository or
145
+ workspace view where reading, editing, Git, builds, tests, and commits happen.
146
+
147
+ ```text
148
+ <instance-home>/
149
+ AGENTS.md
150
+ CLAUDE.md -> AGENTS.md
151
+ TASK.md
152
+ instance.json
153
+ soul/
154
+ .agents/skills/
155
+ .claude/skills -> ../.agents/skills
156
+ work/
157
+ ```
158
+
159
+ Work modes: `worktree` (isolated branch for implementation), `checkout` (the
160
+ repository's shared checkout), `attached` (another instance's tree, for
161
+ service agents and reviewers), and `workspace` (read-only multi-repository
162
+ context). Placement that cannot be proved fails closed.
163
+
164
+ Provider behavior stays deliberate. Pi runs with ambient skill, context, and
165
+ template discovery curtailed while operator-configured extensions remain
166
+ enabled. Claude Code keeps the operator's settings, skills, plugins, MCP,
167
+ hooks, and memory, and OATS adds its canonical composed resources. The
168
+ guarantee is an exact OATS-managed curriculum, not identical ambient behavior
169
+ across providers.
170
+
171
+ ### Configuration and layers
172
+
173
+ Config is scoped from laptop to workspace to repository. Closer declarations
174
+ win; within a level, soul beats agent type beats global. Explicit exclusions
175
+ and layer `none` are supported.
176
+
177
+ OATS has five conceptual layers:
178
+
179
+ 1. **Soul**: durable specialist identity and curriculum (kernel).
180
+ 2. **Knowledge**: capture and promotion contract (official option `oats.okf`).
181
+ 3. **Instances**: homes, work modes, sessions, lifecycle (kernel).
182
+ 4. **Messaging**: reachable agent identities (official option `oats.aweb`).
183
+ 5. **Tasks**: durable work queue (optional `oats.jira`, `oats.linear`, or another provider).
184
+
185
+ Knowledge, messaging, and tasks are exclusive slots. Additive capabilities
186
+ such as authoring and review compose independently. Inspect the resolved
187
+ result with `oats doctor [context] --soul <name> --json`.
188
+
189
+ ### Distribution packages
190
+
191
+ A Git repository may contain ordinary development content and one or more
192
+ package payloads; the default payload path is `oats-package/`.
193
+
194
+ ```bash
195
+ oats install oats.okf # official short id
196
+ oats install https://github.com/example/project.git@v1.0.0 # Git source
197
+ oats install 'https://github.com/example/project.git@v1.0.0#dist' # contained path
198
+ oats install ../project/oats-package # local path
199
+ oats update <package-id> # explicit advance
200
+ ```
201
+
202
+ Installing materializes each capability into
203
+ `.agents/capabilities/installed/<id>/`. The `lockfileVersion: 2` lock records
204
+ packages (source, exact commit, path, payload integrity, dependencies) and
205
+ capabilities (version, provider, path, artifact integrity, executable trust).
206
+ Bare `oats install` restores the exact lock and never advances source state.
207
+
208
+ ## The turn record
209
+
210
+ `packages/record` is the load-bearing layer. Every conversation an agent has
211
+ is captured as signed turns in an append-only, content-addressed, replicated
212
+ record with exact provenance, and searched locally through a SQLite full-text
213
+ index. It has no runtime dependencies beyond Node.
214
+
215
+ ```bash
216
+ oats setup # install capture hooks and the background watcher
217
+ oats capture --status # what is being captured, by whom
218
+ oats recall "<query>" # search every captured session and message
219
+ ```
220
+
221
+ The normative specification and its conformance vectors live in
222
+ [`packages/record/docs/`](packages/record/docs/).
223
+
224
+ ## Official packages
225
+
226
+ Official packages are independently versioned Git repositories in the
227
+ [`awebai`](https://github.com/awebai) organization, referenced from the
228
+ kernel's bundled catalog:
229
+
230
+ | Package | Provides |
231
+ | --- | --- |
232
+ | [`oats-okf`](https://github.com/awebai/oats-okf) | `oats.okf` knowledge layer and memory harvesting |
233
+ | [`oats-aweb`](https://github.com/awebai/oats-aweb) | `oats.aweb` messaging and identity layer |
234
+ | [`oats-authoring`](https://github.com/awebai/oats-authoring) | capability, skill, soul, and integration authoring craft |
235
+ | [`oats-jira`](https://github.com/awebai/oats-jira) | adopter-selected Jira tasks layer |
236
+ | [`oats-linear`](https://github.com/awebai/oats-linear) | adopter-selected Linear tasks layer |
237
+ | [`oats-dev`](https://github.com/awebai/oats-dev) | OATS development config template plus `oats.review` |
238
+
239
+ External CLIs and runtime plugins are separate informed-consent requirements.
240
+ Spawn verifies them and never installs them implicitly.
241
+
242
+ ## OATS Desktop
243
+
244
+ The CLI is the mutation boundary; OATS Desktop is the situational-awareness
245
+ layer. It shows identities, tasks, relationships, specialist context,
246
+ workspaces, real terminals, and lifecycle state in one view when a team has
247
+ too many concurrent sessions for a flat terminal list to remain readable.
248
+
249
+ Installers for macOS (arm64 and x64) and Linux (x64) are published on the
250
+ [Releases](https://github.com/awebai/oats/releases) page with checksums and
251
+ build provenance. The Desktop can also be run from `packages/desktop/` in a
252
+ framework checkout. See [OATS Desktop](docs/desktop.md).
253
+
254
+ ## Maturity
255
+
256
+ This repository carries three layers of different maturity behind one `oats`
257
+ entry point:
258
+
259
+ | Layer | Where | Status |
260
+ | --- | --- | --- |
261
+ | Turn record | `packages/record` | **Core.** Stable, specified, conformance-tested. |
262
+ | Soul and instance runtime | `bin/`, `lib/`, `capabilities/` | **Shipped.** Maintained and in production use. |
263
+ | Synthesis tools (`oats experimental <dress\|spawn\|segments\|mind>`) | `packages/experimental` | **Experimental.** Unproven by design, interfaces may change, never included in the published package. |
264
+
265
+ ## Upgrading and migration
266
+
267
+ **From OAS.** If a deployment was created by OAS (`@oas-framework/oas`, files
268
+ named `oas-config.yaml` and `oas-lock.json`), this kernel recognizes none of
269
+ those names. Convert each scope with one transactional command; any failure
270
+ restores the original bytes:
271
+
272
+ ```bash
273
+ oats migrate --from-oas --dry-run
274
+ oats migrate --from-oas
275
+ ```
276
+
277
+ Read [Migration from OAS](docs/migration-from-oas.md) first.
278
+
279
+ **From 0.18 official capabilities.** For OATS-named scopes, valid v1 locks and
280
+ installed capabilities keep working after the kernel upgrade. Preview and
281
+ apply the guided migration when ready:
282
+
283
+ ```bash
284
+ oats migrate --official --recursive --dry-run --dir <team-root>
285
+ oats migrate --official --recursive --dir <team-root>
286
+ ```
287
+
288
+ It preserves config files and capability ids, leaves custom, owned, and path
289
+ capabilities untouched, never transfers executable trust silently, and prints
290
+ exact follow-ups. `oats doctor` reports readiness and cutover state.
291
+
292
+ ## CLI essentials
293
+
294
+ ```bash
295
+ oats status --team
296
+ oats create <soul> --type <agent-type> --repo <repo> --work worktree
297
+ oats spawn <soul> --purpose <role> --task "..."
298
+ oats retire <instance>
299
+
300
+ oats install [<package-source>]
301
+ oats update <package-id>
302
+ oats trust <capability>
303
+ oats init --package <package-id> --config <template>
304
+ oats config diff | sync | adopt <package-id> --config <template>
305
+ oats doctor --json
306
+
307
+ oats setup | capture | recall "<query>"
308
+ ```
309
+
310
+ Package, config, and lock operations have deterministic CLI and stable JSON
311
+ forms. Do not hand-edit the lock or installed stores.
312
+
313
+ ## Documentation
314
+
315
+ - [Souls and instances](docs/souls-and-instances.md)
316
+ - [Configuration](docs/configuration.md)
317
+ - [Layers](docs/layers.md)
318
+ - [Distribution packages](docs/packages.md)
319
+ - [Capabilities](docs/capabilities.md)
320
+ - [Knowledge](docs/knowledge.md) and [Knowledge theory](docs/knowledge-theory.md)
321
+ - [Integrations](docs/integrations.md)
322
+ - [Implementation](docs/implementation.md)
323
+ - [OATS Desktop](docs/desktop.md)
324
+ - [Migration from OAS](docs/migration-from-oas.md)
325
+ - [Release notes](docs/release-notes/)
326
+
327
+ ## Contributing
328
+
329
+ Issues and pull requests are welcome at
330
+ [github.com/awebai/oats](https://github.com/awebai/oats).
331
+
332
+ ```bash
333
+ git clone https://github.com/awebai/oats.git
334
+ cd oats
335
+ npm ci
336
+ npm run check
337
+ npm test
338
+ ```
339
+
340
+ `npm test` runs the kernel, record, and experimental suites. The Desktop
341
+ suites need their own dependencies; install them once and the same command
342
+ picks them up:
343
+
344
+ ```bash
345
+ (cd packages/desktop && ELECTRON_SKIP_BINARY_DOWNLOAD=1 npm ci)
346
+ ```
347
+
348
+ Pull requests run the same checks on Node 22 through
349
+ [Pull Request CI](.github/workflows/pull-request.yml): tests, project
350
+ validation, a package dry run, and a clean-room install smoke test. Keep
351
+ changes small and reviewable, add a test with every behavior change, and
352
+ describe the reachable defect in the commit message.
353
+
354
+ ## Releases and versioning
355
+
356
+ OATS follows [semantic versioning](https://semver.org/). Each release is a
357
+ Git tag `vX.Y.Z` with notes in [`docs/release-notes/`](docs/release-notes/).
358
+ A release publishes `@awebai/oats` and `@awebai/oats-pi` to npm and attaches
359
+ the Desktop installers, `SHA256SUMS`, and build provenance to the matching
360
+ [GitHub Release](https://github.com/awebai/oats/releases). The same release
361
+ can be built, staged, and published without GitHub Actions through the
362
+ [runnerless release lane](docs/release-lane.md). Official packages are
363
+ versioned and tagged in their own repositories and pinned by the kernel's
364
+ catalog.
365
+
366
+ ## Origins and acknowledgements
367
+
368
+ OATS began as **OAS (Open Agent Specialization)**, designed and written by
369
+ Josep (Pepe) Garcia-Reyero Sais. The architecture, the kernel, the package
370
+ engine, the Desktop, and the official packages are his work; OATS continues
371
+ it under its current name, and his authorship is preserved throughout this
372
+ repository's history.
373
+
374
+ OATS grew from the a2am team architecture and the LFX engineering vision for
375
+ agent-native engineering. It builds on open formats and conventions including
376
+ AGENTS.md, Agent Skills, and OKF.
377
+
378
+ ## License
379
+
380
+ [MIT](LICENSE) © 2026 OATS Framework