@awebai/oats 0.30.0 → 0.30.2
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/bin/oats.mjs +1 -1
- package/docs/capabilities.md +3 -3
- package/docs/design/2026-09-23-workspace-module-contracts.md +2 -1
- package/docs/desktop-cli-api.md +23 -11
- package/docs/first-team.md +1 -1
- package/docs/implementation.md +2 -1
- package/docs/integrations.md +1 -1
- package/docs/knowledge-capability-authoring.md +1 -1
- package/docs/knowledge.md +4 -4
- package/docs/official-catalog.md +4 -4
- package/docs/packages.md +13 -13
- package/docs/plans/0.30-close-out.md +24 -2
- package/docs/release-lane.md +7 -2
- package/docs/release-notes/v0.30.1.md +123 -0
- package/docs/release-notes/v0.30.2.md +85 -0
- package/docs/souls-and-instances.md +6 -5
- package/docs/workspaces.md +7 -2
- package/lib/core.mjs +42 -28
- package/lib/instance-inspect.mjs +1 -1
- package/lib/instance-resolution.mjs +15 -8
- package/lib/materialize.mjs +33 -19
- package/lib/packages.mjs +1 -1
- package/lib/resolve.mjs +1 -1
- package/package-catalog.json +3 -3
- package/package.json +1 -3
- package/skills/oats-getting-started/SKILL.md +2 -2
- package/capabilities/oats-authoring/LICENSE +0 -21
- package/capabilities/oats-authoring/oats-package.json +0 -11
- package/capabilities/oats-authoring/oats.json +0 -12
- package/capabilities/oats-authoring/skills/integration-authoring/SKILL.md +0 -84
- package/capabilities/oats-authoring/skills/skill-craft/SKILL.md +0 -109
- package/capabilities/oats-authoring/skills/soul-craft/SKILL.md +0 -116
- package/capabilities/oats-aweb/bin/oats-aweb-binding.mjs +0 -11
- package/capabilities/oats-aweb/bin/oats-aweb.mjs +0 -1672
- package/capabilities/oats-aweb/injects/aweb.md +0 -47
- package/capabilities/oats-aweb/lib/binding-wire.mjs +0 -365
- package/capabilities/oats-aweb/lib/captured-execution.mjs +0 -91
- package/capabilities/oats-aweb/lib/captured-native.mjs +0 -91
- package/capabilities/oats-aweb/lib/grant-custody.mjs +0 -38
- package/capabilities/oats-aweb/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-aweb/lib/portable-binding.mjs +0 -146
- package/capabilities/oats-aweb/lib/session-readiness.mjs +0 -56
- package/capabilities/oats-aweb/lib/wake-receive.mjs +0 -56
- package/capabilities/oats-aweb/oats.json +0 -201
- package/capabilities/oats-aweb/skills/LICENSE +0 -21
- package/capabilities/oats-aweb/skills/VENDORED.md +0 -31
- package/capabilities/oats-aweb/skills/aweb-identity/SKILL.md +0 -201
- package/capabilities/oats-aweb/skills/aweb-messaging/SKILL.md +0 -161
- package/capabilities/oats-aweb/skills/aweb-messaging/references/messaging-scenarios.md +0 -61
- package/capabilities/oats-aweb/skills/aweb-team-membership/SKILL.md +0 -116
- package/capabilities/oats-aweb/skills/aweb-team-membership/references/team-membership-reference.md +0 -74
- package/capabilities/oats-aweb/skills/oats-aweb/SKILL.md +0 -286
- package/capabilities/oats-code-review/injects/reviewer.md +0 -26
- package/capabilities/oats-code-review/oats.json +0 -16
- package/capabilities/oats-code-review/skills/adversarial-review/SKILL.md +0 -66
- package/capabilities/oats-code-review/skills/review-dev-docs/SKILL.md +0 -30
- package/capabilities/oats-code-review/skills/security-review/SKILL.md +0 -56
- package/capabilities/oats-code-review/skills/simplification-review/SKILL.md +0 -34
- package/capabilities/oats-developer/injects/developer.md +0 -38
- package/capabilities/oats-developer/oats.json +0 -17
- package/capabilities/oats-developer/skills/execution-strategy/SKILL.md +0 -43
- package/capabilities/oats-developer/skills/maintain-dev-docs/SKILL.md +0 -47
- package/capabilities/oats-developer/skills/run-the-review-loop/SKILL.md +0 -65
- package/capabilities/oats-developer/skills/understand-the-spec/SKILL.md +0 -37
- package/capabilities/oats-developer/skills/worktrees/SKILL.md +0 -36
- package/capabilities/oats-engineering-expert/injects/expert.md +0 -37
- package/capabilities/oats-engineering-expert/oats.json +0 -17
- package/capabilities/oats-engineering-expert/skills/coordinate-developers/SKILL.md +0 -37
- package/capabilities/oats-engineering-expert/skills/coordinate-experts/SKILL.md +0 -52
- package/capabilities/oats-engineering-expert/skills/land-your-prs/SKILL.md +0 -50
- package/capabilities/oats-engineering-expert/skills/plan-and-spec/SKILL.md +0 -53
- package/capabilities/oats-engineering-expert/skills/verify-developer-work/SKILL.md +0 -49
- package/capabilities/oats-jira/bin/oats-jira.mjs +0 -40
- package/capabilities/oats-jira/injects/jira.md +0 -10
- package/capabilities/oats-jira/oats.json +0 -22
- package/capabilities/oats-jira/skills/jira-tasks/SKILL.md +0 -179
- package/capabilities/oats-linear/bin/oats-linear-hook.mjs +0 -34
- package/capabilities/oats-linear/bin/oats-linear.mjs +0 -344
- package/capabilities/oats-linear/injects/linear.md +0 -8
- package/capabilities/oats-linear/oats.json +0 -24
- package/capabilities/oats-linear/skills/linear-tasks/SKILL.md +0 -223
- package/capabilities/oats-okf/bin/oats-okf-binding.mjs +0 -14
- package/capabilities/oats-okf/bin/oats-okf.mjs +0 -213
- package/capabilities/oats-okf/injects/okf.md +0 -42
- package/capabilities/oats-okf/lib/binding-wire.mjs +0 -380
- package/capabilities/oats-okf/lib/captured-worker.mjs +0 -109
- package/capabilities/oats-okf/lib/config.mjs +0 -124
- package/capabilities/oats-okf/lib/consult.mjs +0 -518
- package/capabilities/oats-okf/lib/harvest-status.mjs +0 -88
- package/capabilities/oats-okf/lib/harvest-switch.mjs +0 -94
- package/capabilities/oats-okf/lib/inspection.mjs +0 -138
- package/capabilities/oats-okf/lib/invocation-context.mjs +0 -111
- package/capabilities/oats-okf/lib/invocation-shape.mjs +0 -135
- package/capabilities/oats-okf/lib/io.mjs +0 -118
- package/capabilities/oats-okf/lib/migration.mjs +0 -137
- package/capabilities/oats-okf/lib/okf-validate.mjs +0 -123
- package/capabilities/oats-okf/lib/portable-binding.mjs +0 -199
- package/capabilities/oats-okf/lib/source-contract.mjs +0 -46
- package/capabilities/oats-okf/lib/sources.mjs +0 -438
- package/capabilities/oats-okf/lib/stores.mjs +0 -473
- package/capabilities/oats-okf/lib/worker.mjs +0 -486
- package/capabilities/oats-okf/oats.json +0 -151
- package/capabilities/oats-okf/schemas/okf-base.schema.json +0 -46
- package/capabilities/oats-okf/schemas/okf-bindings.schema.json +0 -112
- package/capabilities/oats-okf/schemas/okf-portable-declaration.schema.json +0 -87
- package/capabilities/oats-okf/schemas/okf-portable-payload.schema.json +0 -113
- package/capabilities/oats-okf/schemas/okf-soul.schema.json +0 -37
- package/capabilities/oats-okf/skills/okf-consultation/SKILL.md +0 -144
- package/capabilities/oats-okf/skills/okf-consultation/references/consult.md +0 -86
- package/capabilities/oats-okf/skills/okf-instance-knowledge/SKILL.md +0 -104
- package/capabilities/oats-okf-harvest/bin/okf-harvest.mjs +0 -140
- package/capabilities/oats-okf-harvest/injects/harvester.md +0 -12
- package/capabilities/oats-okf-harvest/oats.json +0 -26
- package/capabilities/oats-okf-harvest/skills/knowledge-harvest/SKILL.md +0 -168
- package/capabilities/oats-okf-harvest/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-harvest/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-harvest/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/bin/okf-maintenance.mjs +0 -170
- package/capabilities/oats-okf-maintenance/injects/maintainer.md +0 -12
- package/capabilities/oats-okf-maintenance/lib/provenance.mjs +0 -50
- package/capabilities/oats-okf-maintenance/oats.json +0 -21
- package/capabilities/oats-okf-maintenance/skills/knowledge-review/SKILL.md +0 -159
- package/capabilities/oats-okf-maintenance/skills/knowledge-theory/SKILL.md +0 -192
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/SKILL.md +0 -151
- package/capabilities/oats-okf-maintenance/skills/okf-authoring/scripts/okf-validate.mjs +0 -123
- package/capabilities/oats-okf-maintenance/skills/okf-trigger-setup/SKILL.md +0 -134
- package/capabilities/oats-workspace-experts/injects/oats-experts.md +0 -26
- package/capabilities/oats-workspace-experts/oats.json +0 -9
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: plan-and-spec
|
|
3
|
-
description: Turn a goal into a plan and one executable spec per surface (code area, package or service) for developers to implement. Use when starting a feature, fix or project in your domain, when a developer needs a spec, or when work must be split across developers.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Plan and spec
|
|
7
|
-
|
|
8
|
-
A developer should be able to implement a spec without coming back to ask what you
|
|
9
|
-
meant. If they would have to guess, the spec is not done.
|
|
10
|
-
|
|
11
|
-
## 1. Frame the goal
|
|
12
|
-
- **The problem**, in one or two sentences, and who has it.
|
|
13
|
-
- **Done means:** observable outcomes, not activities ("`oats teams add` refuses a
|
|
14
|
-
duplicate label with E_TEAM_EXISTS", not "improve team handling").
|
|
15
|
-
- **Constraints:** compatibility promises, contracts other parts rely on, security
|
|
16
|
-
boundaries, performance limits, deadlines.
|
|
17
|
-
- **Out of scope:** what this work deliberately does not do.
|
|
18
|
-
|
|
19
|
-
## 2. Design at your level
|
|
20
|
-
- Choose the design. Record the alternatives you rejected and why, in one line each.
|
|
21
|
-
- Name every contract the change touches (APIs, file formats, CLI output, env vars,
|
|
22
|
-
events) and whether it changes. A contract change needs its consumers named and an
|
|
23
|
-
order ("the consumer accepts the new shape first").
|
|
24
|
-
- Prefer the smallest change that meets "done". If a simpler design meets 90% of the
|
|
25
|
-
goal, raise it with the requester before choosing the bigger one.
|
|
26
|
-
|
|
27
|
-
## 3. Split by surface
|
|
28
|
-
- A **surface** is a part of the system one developer can own: a package, a service, a
|
|
29
|
-
module group. Split so that each developer's work can be built and tested on its own.
|
|
30
|
-
- Where surfaces meet, write the **interface first** (the shape, the error cases). Both
|
|
31
|
-
specs cite it.
|
|
32
|
-
- Sequence the pieces: what can run in parallel, what must land first.
|
|
33
|
-
|
|
34
|
-
## 4. Write each spec
|
|
35
|
-
Use this shape, and keep it as short as the work allows:
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
# Spec: <title>
|
|
39
|
-
Goal: <one paragraph: the problem and the outcome>
|
|
40
|
-
Done when: <checkable outcomes>
|
|
41
|
-
Design: <the approach; the key decisions and why>
|
|
42
|
-
Contracts: <what must not break; what changes, and for whom>
|
|
43
|
-
Edge cases: <inputs, failures and states the code must handle>
|
|
44
|
-
Tests: <what proves it: unit, integration, a real run>
|
|
45
|
-
Out of scope: <what not to do>
|
|
46
|
-
Surface / files: <where the work lives; what to leave alone>
|
|
47
|
-
Delivery: <branch, PR target, who reviews>
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## 5. Check the plan before launching
|
|
51
|
-
- Every "done when" is covered by some spec's tests.
|
|
52
|
-
- No two developers edit the same files without an agreed order.
|
|
53
|
-
- The riskiest assumption is tested first (a spike, a real run), not last.
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: verify-developer-work
|
|
3
|
-
description: The expert's verification of work a developer hands back, after it has passed adversarial code review. Checks architecture, coherence, fit with the whole system, simplicity, and glaring bugs; does not redo the line-by-line review. Use when a developer reports work done, before accepting, merging or passing work on.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Verify developer work
|
|
7
|
-
|
|
8
|
-
The work has been through an adversarial code review: line-level bugs, security and
|
|
9
|
-
simplification were that reviewer's job. Yours is the view the reviewer doesn't have:
|
|
10
|
-
does this belong in the system, the way it was built?
|
|
11
|
-
|
|
12
|
-
## 0. Check the handover is complete
|
|
13
|
-
It needs:
|
|
14
|
-
- what was done, against the spec's "done when";
|
|
15
|
-
- how it was verified (tests run, real runs, with results);
|
|
16
|
-
- **the adversarial review's final verdict**, and the rounds it took;
|
|
17
|
-
- anything deliberately left out.
|
|
18
|
-
|
|
19
|
-
If the review didn't happen, or ended without the reviewer being satisfied, send it back:
|
|
20
|
-
you don't do the reviewer's job for it.
|
|
21
|
-
|
|
22
|
-
## 1. Architecture
|
|
23
|
-
- Is it the design the spec asked for? If it deviates, is the deviation better, and
|
|
24
|
-
recorded?
|
|
25
|
-
- Are the responsibilities in the right places, or did logic leak across a boundary to
|
|
26
|
-
make something easy?
|
|
27
|
-
- Are contracts kept? A changed contract must have its consumers handled, in the right
|
|
28
|
-
order.
|
|
29
|
-
|
|
30
|
-
## 2. Coherence and fit
|
|
31
|
-
- Does it follow the system's existing patterns and names, or invent a parallel way?
|
|
32
|
-
- Does it duplicate something that exists?
|
|
33
|
-
- Will the next change in this area be easier or harder because of it?
|
|
34
|
-
|
|
35
|
-
## 3. Simplicity
|
|
36
|
-
- Is it the simplest solution that meets "done"? Look for layers, options, flags or
|
|
37
|
-
generality nobody asked for.
|
|
38
|
-
- Could a piece be deleted with no loss?
|
|
39
|
-
|
|
40
|
-
## 4. Glaring bugs
|
|
41
|
-
- Read the main path and the failure paths once, as a user would hit them. You are
|
|
42
|
-
looking for what's obviously wrong, not auditing every line.
|
|
43
|
-
- Check that the tests prove the "done when" items, not just that the code runs.
|
|
44
|
-
|
|
45
|
-
## Verdict
|
|
46
|
-
- **Accept**, or **return** with numbered reasons, each saying what's wrong and why it
|
|
47
|
-
matters. Keep matters of taste out of a return.
|
|
48
|
-
- A return goes to the same developer. Architecture-level returns may need a spec change
|
|
49
|
-
first: make it, then return.
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* oats-jira — OATS tasks-provider hook for Jira.
|
|
4
|
-
*
|
|
5
|
-
* Invoked by the OATS kernel at instance lifecycle events (hook contract):
|
|
6
|
-
* oats-jira spawn surface the instance's Jira identity (label) and the
|
|
7
|
-
* deployment's site/project in TASK.md — advisory only,
|
|
8
|
-
* no Jira calls, nothing to mint or clean up.
|
|
9
|
-
*
|
|
10
|
-
* Env contract (set by the kernel):
|
|
11
|
-
* OATS_EVENT spawn
|
|
12
|
-
* OATS_INSTANCE instance name (its Jira label is agent-<instance>)
|
|
13
|
-
* OATS_SETTINGS JSON of the provider's `settings:` block ({ site?, project? })
|
|
14
|
-
*
|
|
15
|
-
* Output (stdout JSON): { "meta": {...}, "brief": "...", "warning": "..." }
|
|
16
|
-
* Exit code is advisory: the kernel treats hook failure as a warning, never a block.
|
|
17
|
-
*/
|
|
18
|
-
const out = (o) => { process.stdout.write(JSON.stringify(o) + "\n"); process.exit(0); };
|
|
19
|
-
const warn = (m) => out({ warning: `oats-jira: ${String(m).slice(0, 300)}` });
|
|
20
|
-
|
|
21
|
-
const event = process.env.OATS_EVENT || process.argv[2];
|
|
22
|
-
const instance = process.env.OATS_INSTANCE;
|
|
23
|
-
const settings = JSON.parse(process.env.OATS_SETTINGS || "{}");
|
|
24
|
-
|
|
25
|
-
if (event === "spawn") {
|
|
26
|
-
const label = `agent-${instance}`;
|
|
27
|
-
const site = settings.site;
|
|
28
|
-
const project = settings.project;
|
|
29
|
-
const where = site && project ? `project ${project} on ${site}`
|
|
30
|
-
: site ? `site ${site} (project unset — ask your human)`
|
|
31
|
-
: project ? `project ${project} (site unset — ask your human)`
|
|
32
|
-
: `your deployment's Jira (site/project not configured — ask your human to set tasks: { site, project } in the soul's soul.yaml, or settings.oats.jira.{site,project} in the deployment's oats-local.yaml)`;
|
|
33
|
-
out({
|
|
34
|
-
meta: { label, ...(site ? { site } : {}), ...(project ? { project } : {}) },
|
|
35
|
-
brief: `Tasks: Jira — ${where}. Your Jira identity is the label "${label}" (never the assignee field). Load the jira-tasks skill before touching tickets.`,
|
|
36
|
-
...(site && project ? {} : { warning: `oats-jira: settings incomplete (site: ${site || "unset"}, project: ${project || "unset"}) — set tasks: { site, project } in the soul's soul.yaml, or settings.oats.jira.{site,project} in the deployment's oats-local.yaml` }),
|
|
37
|
-
});
|
|
38
|
-
} else {
|
|
39
|
-
warn(`unknown event "${event}" (expected spawn)`);
|
|
40
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
## Tasks: Jira
|
|
2
|
-
|
|
3
|
-
Your tasks layer is **Jira** (via the `acli` CLI). Work traces up to epics;
|
|
4
|
-
you are identified by the label `agent-<your-instance-alias>` and an `Agent:`
|
|
5
|
-
line in descriptions — never by the assignee field. Load the **jira-tasks**
|
|
6
|
-
skill before reading your work queue, joining an epic's roster, posting
|
|
7
|
-
progress, transitioning status, or creating stories/tasks. Your Jira site and
|
|
8
|
-
project come from your deployment's settings (see your TASK.md briefing or
|
|
9
|
-
the skill). Tasks only: status and outcomes live in Jira; conversation lives
|
|
10
|
-
in your deployment's messaging layer.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"capability": "oats.jira",
|
|
3
|
-
"command": "jira",
|
|
4
|
-
"version": "1.0.1",
|
|
5
|
-
"compatibility": { "oats": ">=0.26.0" },
|
|
6
|
-
"layer": "tasks",
|
|
7
|
-
"description": "Tasks layer via Jira: acli-based epic/story/task protocol, agent roster in epic descriptions, label-based agent identity.",
|
|
8
|
-
"requires": [
|
|
9
|
-
{
|
|
10
|
-
"command": "acli",
|
|
11
|
-
"why": "all Jira operations (search, view, create, transition, comment)",
|
|
12
|
-
"install": "https://developer.atlassian.com/cloud/acli/guides/install-acli/"
|
|
13
|
-
}
|
|
14
|
-
],
|
|
15
|
-
"skills": [
|
|
16
|
-
"skills"
|
|
17
|
-
],
|
|
18
|
-
"inject": "injects/jira.md",
|
|
19
|
-
"hooks": {
|
|
20
|
-
"spawn": "bin/oats-jira.mjs spawn"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: jira-tasks
|
|
3
|
-
description: >-
|
|
4
|
-
Jira task tracking and agent roster protocol for OATS agents. Use when you
|
|
5
|
-
are an agent instance working an epic, story, or task in Jira: reading your
|
|
6
|
-
assignment, finding your work queue, joining or leaving an epic's Agent
|
|
7
|
-
Roster, posting progress or handoff comments, transitioning ticket status,
|
|
8
|
-
or creating stories/tasks under an epic. Also use when asked about "the
|
|
9
|
-
board", "the roster", "your ticket", "epic status", or task tracking
|
|
10
|
-
between agents. Uses the acli CLI (Atlassian CLI) from bash.
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Agent task tracking (Jira)
|
|
14
|
-
|
|
15
|
-
Jira is your deployment's **tasks layer** — the shared record for task
|
|
16
|
-
tracking and the agent roster. Agents do not know about projects — you know
|
|
17
|
-
**repos and epics**. The hierarchy:
|
|
18
|
-
|
|
19
|
-
- **Epic** — the unit of work that kicks off, runs, and completes. May touch
|
|
20
|
-
one repo or several. Its description carries the **Agent Roster** — the
|
|
21
|
-
source of truth for who is on the epic and their role. Bugs/support run as
|
|
22
|
-
a standing epic.
|
|
23
|
-
- **Story** — a **group of related tasks** covering one part of the epic's
|
|
24
|
-
work (often one repo's slice, one feature area). Not every task needs a
|
|
25
|
-
story.
|
|
26
|
-
- **Task** — a small bounded item, the thing an agent actually works. Lives
|
|
27
|
-
**either directly under the epic** (standalone item) **or under a story**
|
|
28
|
-
(part of a grouped slice). Everything traces up to an epic.
|
|
29
|
-
|
|
30
|
-
## Site and project (from your deployment, never hardcoded)
|
|
31
|
-
|
|
32
|
-
Your Jira **site** and **project key** come from the tasks payload OATS merged
|
|
33
|
-
for this instance: the soul's `soul.yaml` `tasks: { site, project }`, the
|
|
34
|
-
deployment's `oats-local.yaml` `settings.oats.jira.{site,project}`, or a
|
|
35
|
-
spawn's `--provider oats.jira key=value`. Find them, in order:
|
|
36
|
-
|
|
37
|
-
1. Your `TASK.md` briefing — the spawn hook writes a
|
|
38
|
-
`Tasks: Jira — project <KEY> on <site>` line.
|
|
39
|
-
2. `./instance.json` in your instance home — `providers["oats.jira"]` is the
|
|
40
|
-
merged payload this instance received.
|
|
41
|
-
3. Ask your human.
|
|
42
|
-
|
|
43
|
-
Below, `<PROJECT>` means that project key. If site or project are unset,
|
|
44
|
-
STOP and ask your human to set them — do not guess.
|
|
45
|
-
|
|
46
|
-
**First use**: run `acli jira auth status` — if unauthorized, STOP and tell
|
|
47
|
-
the human to run `acli jira auth login --web`. Never attempt login yourself.
|
|
48
|
-
|
|
49
|
-
## Identity rules (non-negotiable)
|
|
50
|
-
|
|
51
|
-
- **The human assignee is always the owning engineer** (never change
|
|
52
|
-
assignee to yourself; agents are not Jira users). Do not touch assignee
|
|
53
|
-
unless told.
|
|
54
|
-
- **You are identified by label and description**, not the assignee field:
|
|
55
|
-
- Label `agent-<your-instance-alias>` on any story/task you work.
|
|
56
|
-
- An `Agent:` line in the description (see templates).
|
|
57
|
-
- **Never set or modify sprints.** Never delete tickets. Comment, don't
|
|
58
|
-
rewrite, other agents' descriptions (exception: coordinators maintain the
|
|
59
|
-
roster table).
|
|
60
|
-
|
|
61
|
-
## Your work queue
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
acli jira workitem search --jql "project = <PROJECT> AND labels = agent-<alias> AND statusCategory != Done ORDER BY rank" --json
|
|
65
|
-
acli jira workitem view <PROJECT>-1234 --json # read one ticket (description, labels, status)
|
|
66
|
-
acli jira workitem search --jql "project = <PROJECT> AND parent = <PROJECT>-<epic> AND statusCategory != Done" --json # epic's direct children (stories + standalone tasks)
|
|
67
|
-
acli jira workitem search --jql "project = <PROJECT> AND parent = <PROJECT>-<story> AND statusCategory != Done" --json # a story's tasks
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
An epic's full open work = its direct children **plus** the tasks under each
|
|
71
|
-
of its stories — walk one level down from stories when you need the complete
|
|
72
|
-
picture.
|
|
73
|
-
|
|
74
|
-
Record your epic and ticket keys in your instance memory (e.g. `STATE.md`
|
|
75
|
-
`# Context`).
|
|
76
|
-
|
|
77
|
-
## The Agent Roster (epics)
|
|
78
|
-
|
|
79
|
-
The epic description contains a `## Agent Roster` markdown table — current
|
|
80
|
-
truth for who is on the epic:
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
## Agent Roster
|
|
84
|
-
|
|
85
|
-
| Agent (instance) | Soul / class | Repo | Role on epic | Status | Since |
|
|
86
|
-
|---|---|---|---|---|---|
|
|
87
|
-
| coordinator-digest | coordinator (newsletter) | newsletter-service | runs the epic | active | 2026-07-07 |
|
|
88
|
-
| developer-digest-api | developer (newsletter) | newsletter-service | implements API | active | 2026-07-07 |
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Protocol:
|
|
92
|
-
- **Joining**: the coordinator (or the spawning agent) adds your row to the
|
|
93
|
-
table (`acli jira workitem edit <epic> --description ...` with the full
|
|
94
|
-
updated description — read it first, edit only the roster table) AND posts
|
|
95
|
-
a comment: `[roster] <alias> joined — role: <role>, repo: <repo>`.
|
|
96
|
-
- **Leaving/retiring**: set the row's Status to `retired` (keep the row — it
|
|
97
|
-
is history) and comment `[roster] <alias> retired — <one-line outcome>`.
|
|
98
|
-
- Only edit the roster table; never rewrite the rest of the epic description.
|
|
99
|
-
- Comments are the event log; the table is current state. On conflict, fix
|
|
100
|
-
the table and note it in a comment.
|
|
101
|
-
|
|
102
|
-
## Working a ticket
|
|
103
|
-
|
|
104
|
-
1. Read your ticket and its epic (description + roster) before starting.
|
|
105
|
-
2. **Milestones** → comment on your ticket, prefixed `[<alias>]`. Mirror the
|
|
106
|
-
entry you record in your instance memory — same events, two audiences.
|
|
107
|
-
3. **Status transitions** — move your ticket as you work:
|
|
108
|
-
`acli jira workitem transition <PROJECT>-1234 --status "In Progress"`.
|
|
109
|
-
Discover valid statuses with `--help` or by trying; if a transition is
|
|
110
|
-
rejected, comment instead and let the coordinator move it.
|
|
111
|
-
4. **Done** = your latest commit is review-clean and the branch is handed
|
|
112
|
-
off. Comment the outcome (branch, PR link, verification), then transition.
|
|
113
|
-
5. **Handoff/blocked** → comment
|
|
114
|
-
`[<alias>] handoff → <next-alias>: <what+where>` or
|
|
115
|
-
`[<alias>] blocked: <what is needed, from whom>`.
|
|
116
|
-
|
|
117
|
-
Tasks ≠ messaging: status and outcomes live here in Jira; conversation lives
|
|
118
|
-
in your deployment's messaging layer. Mail nudges; Jira records.
|
|
119
|
-
|
|
120
|
-
## Creating tickets (coordinators; developers file follow-ups as Tasks)
|
|
121
|
-
|
|
122
|
-
House rules: summary ≤ 12 words, describe the requirement not the solution,
|
|
123
|
-
bugs always include reproduction steps, keep descriptions to a few bullets.
|
|
124
|
-
|
|
125
|
-
**Choosing the level:**
|
|
126
|
-
- Small bounded item, no siblings needed → **Task directly under the epic**.
|
|
127
|
-
- A part of the epic's work that breaks into several related tasks → **Story
|
|
128
|
-
under the epic, tasks under the story**. The story is the group, not the
|
|
129
|
-
work item — agents are assigned to its tasks (a story worked wholly by one
|
|
130
|
-
agent may carry that agent's label too).
|
|
131
|
-
- Never create a story for a single task, and never nest stories.
|
|
132
|
-
|
|
133
|
-
```bash
|
|
134
|
-
acli jira workitem create --project <PROJECT> --type Task --summary "<summary>" \
|
|
135
|
-
--parent <PROJECT>-<epic-or-story> --label "agent-<alias>" --description "<see template>"
|
|
136
|
-
acli jira workitem create --project <PROJECT> --type Story --summary "<summary>" \
|
|
137
|
-
--parent <PROJECT>-<epic> --description "<see template>"
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Story/Task description template
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
<What & why — 2-4 bullets. Acceptance criteria as a checklist.>
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
Agent: <instance-alias> (who works this — matches the agent-<alias> label; stories list it only when one agent works the whole story)
|
|
147
|
-
Soul: <soul-name> · Repo: <repo>
|
|
148
|
-
Parent: <PROJECT>-<epic-or-story-key> · Epic: <PROJECT>-<epic-key>
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Epic description template
|
|
152
|
-
|
|
153
|
-
```
|
|
154
|
-
<Intent — what this epic delivers and why. Walls — what is explicitly out.>
|
|
155
|
-
|
|
156
|
-
Repos touched: <repo>, <repo>
|
|
157
|
-
Human gates: <security/authz/migration/contract items needing sign-off, or "none">
|
|
158
|
-
|
|
159
|
-
## Agent Roster
|
|
160
|
-
|
|
161
|
-
| Agent (instance) | Soul / class | Repo | Role on epic | Status | Since |
|
|
162
|
-
|---|---|---|---|---|---|
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### Comment conventions (machine-greppable prefixes)
|
|
166
|
-
|
|
167
|
-
- `[roster] <alias> joined|retired — …`
|
|
168
|
-
- `[<alias>] milestone: …` · `[<alias>] handoff → <alias>: …` ·
|
|
169
|
-
`[<alias>] blocked: …` · `[<alias>] done: branch <name>, <verification>`
|
|
170
|
-
|
|
171
|
-
## Verify-before-trusting
|
|
172
|
-
|
|
173
|
-
Jira workflows differ per site. On first real use in a deployment: check the
|
|
174
|
-
project's issue types (`Epic/Story/Task/Bug`), whether `--parent` links
|
|
175
|
-
stories/tasks to epics, whether a **Task can take a Story as parent** (some
|
|
176
|
-
Jira configs only allow that via the Sub-task type — if so, use Sub-tasks
|
|
177
|
-
under stories and treat them as tasks), and the exact status names. If
|
|
178
|
-
reality differs, note it in a comment on your ticket and tell your
|
|
179
|
-
coordinator so your deployment's conventions get recorded.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** OATS spawn briefing for the Linear tasks integration. Makes no API calls. */
|
|
3
|
-
const output = (value) => {
|
|
4
|
-
process.stdout.write(JSON.stringify(value) + "\n");
|
|
5
|
-
process.exit(0);
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
const event = process.env.OATS_EVENT || process.argv[2];
|
|
9
|
-
if (event !== "spawn") output({ warning: `oats-linear: unknown event "${event}" (expected spawn)` });
|
|
10
|
-
|
|
11
|
-
let settings = {};
|
|
12
|
-
try { settings = JSON.parse(process.env.OATS_SETTINGS || "{}"); }
|
|
13
|
-
catch { output({ warning: "oats-linear: the tasks settings payload (OATS_SETTINGS) is not valid JSON" }); }
|
|
14
|
-
|
|
15
|
-
const instance = process.env.OATS_INSTANCE || "unknown-instance";
|
|
16
|
-
const team = settings.team;
|
|
17
|
-
const project = settings.project;
|
|
18
|
-
const label = `agent-${instance}`;
|
|
19
|
-
// Where team lives under the workspace model (0.26): the soul's tasks payload or this machine's settings.
|
|
20
|
-
const TEAM_HOMES = "tasks: { team } in the soul's soul.yaml, or settings.oats.linear.team in the deployment's oats-local.yaml";
|
|
21
|
-
const target = team
|
|
22
|
-
? `team ${team}${project ? `, default project ${project}` : ""}`
|
|
23
|
-
: `team unset — ask your human to set ${TEAM_HOMES}`;
|
|
24
|
-
const warnings = [];
|
|
25
|
-
if (!team) warnings.push(`settings.team is unset (set ${TEAM_HOMES})`);
|
|
26
|
-
if (!process.env.LINEAR_API_KEY) warnings.push("LINEAR_API_KEY is not in the spawn environment");
|
|
27
|
-
|
|
28
|
-
output({
|
|
29
|
-
meta: { label, ...(team ? { team } : {}), ...(project ? { project } : {}) },
|
|
30
|
-
brief: `Tasks: Linear — ${target}. Your agent identity is label "${label}"; keep the human assignee unchanged. Load the linear-tasks skill before touching issues.`,
|
|
31
|
-
...(warnings.length ? {
|
|
32
|
-
warning: `oats-linear: ${warnings.join("; ")} — see the linear-tasks skill`,
|
|
33
|
-
} : {}),
|
|
34
|
-
});
|