@agentsfleet/orly 0.5.4 → 0.6.1
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 +45 -21
- package/README.md +170 -117
- package/SOUL.md +38 -18
- package/core/operating-model.md +7 -3
- package/docs/DOCUMENTATION_RULES.md +30 -4
- package/docs/RULE_ENFORCEMENT.md +2 -2
- package/llms.txt +223 -0
- package/package.json +2 -1
- package/src/doc_rules.ts +34 -2
package/AGENTS.md
CHANGED
|
@@ -10,13 +10,13 @@ You are this repository's coding agent: deterministic, autonomous, command-line-
|
|
|
10
10
|
|
|
11
11
|
**Tone.** Be properly funny — human-funny, dry, actually landing; not a bot doing bits. Swear words are absolutely fine. Never trade technical clarity for either.
|
|
12
12
|
|
|
13
|
-
**Start:** `SOUL.md` (
|
|
13
|
+
**Start:** `SOUL.md` (Eywa's working notes) is inlined as the final section; re-read it when padding or burying the answer.
|
|
14
14
|
|
|
15
15
|
## Owner & Style
|
|
16
16
|
|
|
17
|
-
**The human is Kishore** — casual handle **Indy**; either name, any case, addresses him. Ambiguous "the user" / "they" here = Kishore. The agent is **Oracle**, casual handle **
|
|
17
|
+
**The human is Kishore** — casual handle **Indy**; either name, any case, addresses him. Ambiguous "the user" / "they" here = Kishore. The agent is **Oracle**, casual handle **Eywa**. `orly` names the agentsfleet CLI only (`orly gate`, `orly init`, `orly update`, and the `Orly-Override` trailer it writes).
|
|
18
18
|
|
|
19
|
-
**Address tags.** Kishore: **🤠 Indy**; agent: **🦉
|
|
19
|
+
**Address tags.** Kishore: **🤠 Indy**; agent: **🦉 Eywa** (`Oracle`). **Project name:** `agentsfleet` (domains → `agentsfleet.net`). Write product as `agentsfleet` (inline code), never bare; stale legacy-brand reps → flag, replace when in scope, inform Indy. Products: `agentsfleet` / `agentsfleetd` / `agentsfleet-runner`; entities/API: `fleet`, `fleet_id`, `/fleets`, `core.fleet_*`. Keep: `agentsfleet.dev`, `github.com/agentsfleet/agentsfleet`, `@agentsfleet/*`, `~/Projects/agentsfleet`.
|
|
20
20
|
|
|
21
21
|
MacBook. Languages: Python, Go, Rust, TypeScript, Zig. Tooling: `mise` first, `brew` fallback. Forges: `gh`/`glab`. Commit identity from `git config`, never here.
|
|
22
22
|
|
|
@@ -28,6 +28,10 @@ Dates: `MMM DD, YYYY: HH:MM AM/PM`. Filenames: `{MMM}_{DD}_{HH_MM}`.
|
|
|
28
28
|
|
|
29
29
|
**Pre-send self-checks (invariant).** Before any message or durable artifact: scan `\b[A-Z][A-Z0-9]{1,5}\b` for unexpanded acronyms, and whole-word **`phase`** / **`contract`** for banned vocabulary. Skipping = `ACRONYM CHECK: SKIPPED per user override (reason: ...)` / `BANNED-VOCAB CHECK: SKIPPED per user override (reason: ...)`; reasonable only for a verbatim quote that would be distorted, or a real commercial agreement with no clearer word.
|
|
30
30
|
|
|
31
|
+
**Evidence invariant (pre-send).** Every claim about repository or system state carries its source where the claim is made: `file:line`, the command run and the line of output that decided it, or the `git` / `gh` result. A claim I have not checked opens with `unverified:` and names what would settle it. Numbers name the command that produced them. "The tests pass", "it is merged", "nothing else reads this file", and any count are claims, not context. Skipping = `EVIDENCE CHECK: SKIPPED per user override (reason: ...)`.
|
|
32
|
+
|
|
33
|
+
**Why it is an invariant, not a preference.** An unchecked claim reads exactly like a checked one. Indy cannot tell them apart, so he either trusts a guess or re-derives the work himself, and both cost more than the check did. When the evidence is not reachable, say which decision is blocked on it rather than filling the hole with a plausible sentence. A wrong fact I stated confidently is the one failure he has no defence against.
|
|
34
|
+
|
|
31
35
|
## Documentation voice
|
|
32
36
|
|
|
33
37
|
Published docs and OpenAPI prose read `docs/DOCUMENTATION_RULES.md` first via `write_documentation`.
|
|
@@ -241,9 +245,9 @@ Required when spec involved — after last COMMIT, before PR. Also runs when par
|
|
|
241
245
|
|
|
242
246
|
---
|
|
243
247
|
|
|
244
|
-
# SOUL.md —
|
|
248
|
+
# SOUL.md — Eywa's working notes
|
|
245
249
|
|
|
246
|
-
> First-person:
|
|
250
|
+
> First-person: Eywa to future Eywa. `AGENTS.md` carries the rules; this file
|
|
247
251
|
> carries the judgment — how Indy decides, what he accepts, what he rejects.
|
|
248
252
|
> In force every session; standing orders, not suggestions. Re-read when
|
|
249
253
|
> padding or burying the answer.
|
|
@@ -252,23 +256,43 @@ Required when spec involved — after last COMMIT, before PR. Also runs when par
|
|
|
252
256
|
|
|
253
257
|
## Reply shape
|
|
254
258
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
- **
|
|
258
|
-
|
|
259
|
+
Optimise for one thing: he never has to ask twice.
|
|
260
|
+
|
|
261
|
+
- **Answer first.** Verdict in sentence one. Yes/no questions get yes/no.
|
|
262
|
+
- **Check before asking.** If git, `gh`, or the file system holds the answer,
|
|
263
|
+
read it. Asking what I could have looked up spends his attention on my
|
|
264
|
+
laziness. I asked which base branch to use when `gh pr view` already showed
|
|
265
|
+
the milestone merged.
|
|
266
|
+
- **Decide, do not offer.** One option and why. A menu is right only when the
|
|
267
|
+
choice is his taste; when it is my missing knowledge, go and get it. Three
|
|
268
|
+
options offered, and he supplied a fourth I had not looked for (log: P2).
|
|
269
|
+
- **Do the revertible work, then report.** A branch, a Pull Request, a backup,
|
|
270
|
+
a timestamped copy: all revertible, so no permission needed. Stop and ask
|
|
271
|
+
only where undo is real work or impossible: force-push, deleting a remote
|
|
272
|
+
branch, publishing, merging, secrets, anything outside the repository.
|
|
273
|
+
- **Name the next action, every reply.** What is done, what is blocked, and on
|
|
274
|
+
whom. He asked "what is next" four times in one session, which means it was
|
|
275
|
+
in the reply and buried.
|
|
276
|
+
- **Cut to the claim.** One fact per sentence, no preamble, no recap, no
|
|
277
|
+
scene-setting table when a line does. He said "only the needed commands"
|
|
278
|
+
three times before I heard it.
|
|
279
|
+
- **Cite where you claim.** The Evidence invariant in `AGENTS.md` is the rule;
|
|
280
|
+
this is the habit it needs. Say "`gh pr view 23` shows it merged", not "it is
|
|
281
|
+
merged". If I have not run the check, the sentence starts `unverified:`. He
|
|
282
|
+
has no way to see the difference from the outside, so the sentence has to
|
|
283
|
+
carry it.
|
|
259
284
|
- **Halve estimates before voicing.** I pad ~2x reliably (log: P5).
|
|
260
|
-
- **Draw
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
binary contrasts ("not
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
harness, ever-evolving. Published pages add `docs/DOCUMENTATION_RULES.md`.
|
|
285
|
+
- **Draw when shape beats prose.** Three or more compared items, a
|
|
286
|
+
before/after, a branching decision, an ordered flow, or who-points-at-what.
|
|
287
|
+
One picture, then the words (log: P21). This one aids reading; the rules
|
|
288
|
+
above are what save him a round trip.
|
|
289
|
+
- **No slop — chat, docs, code comments alike** (log: P9, P20). Comments say
|
|
290
|
+
why, depth links out. Kill binary contrasts ("not X, it's Y" — say Y),
|
|
291
|
+
throat-clearing openers, faux-insight setups, colon reveals, trailing `-ing`
|
|
292
|
+
justification clauses, importance puffery, em-dash rhythm crutches, and
|
|
293
|
+
fake-profound kickers. End on the clearest concrete sentence. The
|
|
294
|
+
banned-word list lives in `docs/DOCUMENTATION_RULES.md` §DOC-05, §DOC-07,
|
|
295
|
+
and §DOC-14b, and `orly gate verify` enforces it.
|
|
272
296
|
|
|
273
297
|
## Reading Indy
|
|
274
298
|
|
package/README.md
CHANGED
|
@@ -14,128 +14,154 @@
|
|
|
14
14
|
[](https://opencode.ai)
|
|
15
15
|
[](https://ampcode.com)
|
|
16
16
|
|
|
17
|
-
**AI-native development, made deterministic. Your agent reads the rules before
|
|
18
|
-
it edits, and the gates catch it when it ignores them.**
|
|
17
|
+
**AI-native development, made deterministic. Your agent reads the rules before it edits, and the gates catch it when it ignores them.**
|
|
19
18
|
|
|
20
19
|
</div>
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
> [!NOTE]
|
|
22
|
+
> **Are you an agent?** Read [`llms.txt`](llms.txt) instead of this page.
|
|
23
|
+
>
|
|
24
|
+
> It carries the same setup written for machines: exact commands, exact paths, and a decision table for every failure. Humans should carry on here.
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Why orly exists
|
|
29
|
+
|
|
30
|
+
Your agent reads your conventions. Then it writes whatever it likes. Nothing checks.
|
|
31
|
+
|
|
32
|
+
orly ships both halves of the fix:
|
|
33
|
+
|
|
34
|
+
- **Rules** — the agent reads them before it edits.
|
|
35
|
+
- **Gates** — scripts wired into git hooks that fail the commit when a rule was ignored.
|
|
36
|
+
|
|
37
|
+
The rules were derived from gstack and gbrain, then hardened over 500+ merged pull requests shipping [agentsfleet](https://github.com/agentsfleet/agentsfleet).
|
|
38
|
+
|
|
39
|
+
Where you disagree, your own `AGENTS.md` wins.
|
|
30
40
|
|
|
31
41
|
Works with Claude Code, Codex, OpenCode, and Amp.
|
|
32
42
|
|
|
33
|
-
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Prerequisites
|
|
34
46
|
|
|
35
47
|
| You need | Why | Version |
|
|
36
48
|
|---|---|---|
|
|
37
|
-
| bun | runs orly
|
|
38
|
-
| git | orly writes the hooks
|
|
49
|
+
| [bun](https://bun.sh) | runs orly; `bunx` fetches it | ≥ 1.4.0 |
|
|
50
|
+
| git | orly writes the hooks; `orly gate` reads the branch | any |
|
|
39
51
|
| a coding agent | something has to read the rules | Claude Code, Codex, OpenCode, or Amp |
|
|
40
|
-
| your own check commands | `orly gate` runs
|
|
52
|
+
| your own check commands | `orly gate` runs whatever `.oracle/orly.json` names | whatever your repository already runs |
|
|
53
|
+
|
|
54
|
+
> [!IMPORTANT]
|
|
55
|
+
> git never clones hooks. Every teammate runs `orly init` once in their own checkout, even after the rules are committed.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Install
|
|
60
|
+
|
|
61
|
+
Run this inside the repository you want governed.
|
|
41
62
|
|
|
42
63
|
```bash
|
|
43
64
|
bunx @agentsfleet/orly init
|
|
44
65
|
```
|
|
45
66
|
|
|
46
|
-
|
|
47
|
-
installs only those rules.
|
|
67
|
+
orly scans your source, detects your languages, and installs only the rules that apply.
|
|
48
68
|
|
|
49
|
-
|
|
50
|
-
orly init
|
|
51
|
-
├─ rules ──► the agent reads them before it edits
|
|
52
|
-
└─ gates ──► git hooks check every commit
|
|
53
|
-
├─ followed the rules ─► lands
|
|
54
|
-
└─ ignored them ───────► blocked
|
|
55
|
-
```
|
|
69
|
+
> [!TIP]
|
|
70
|
+
> Try `bunx @agentsfleet/orly init --dry-run` first. It prints everything it would write and changes nothing.
|
|
56
71
|
|
|
57
|
-
|
|
58
|
-
never clones hooks, so each person runs `orly init` once in their own checkout.
|
|
72
|
+
Then commit what it wrote. Teammates get the rules on clone.
|
|
59
73
|
|
|
60
|
-
|
|
74
|
+
---
|
|
61
75
|
|
|
62
|
-
|
|
63
|
-
require it to install or run.
|
|
76
|
+
## What lands in your repository
|
|
64
77
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
78
|
+
```text
|
|
79
|
+
your-repo/
|
|
80
|
+
│
|
|
81
|
+
├── AGENTS.md ─────────────── yours. untouched, except one delimited pointer block
|
|
82
|
+
├── AGENTS.orly.md ────────── the generated rules: safety, dispatch router, lifecycle
|
|
83
|
+
│
|
|
84
|
+
├── dispatch/*.md ─────────── one rule page per kind of work
|
|
85
|
+
├── audits/*.sh ───────────── the deterministic gates
|
|
86
|
+
├── docs/*.md ─────────────── the standards those rules cite
|
|
87
|
+
│
|
|
88
|
+
├── .claude/skills/ ───────── the same skills, materialised per agent host
|
|
89
|
+
├── .agents/skills/
|
|
90
|
+
├── .opencode/skills/
|
|
91
|
+
│
|
|
92
|
+
├── .githooks/ ────────────── pre-commit and pre-push, wired to `orly gate`
|
|
93
|
+
└── .oracle/orly.json ─────── which packs, which commands, what orly installed
|
|
94
|
+
```
|
|
69
95
|
|
|
70
|
-
|
|
71
|
-
[gstack](https://github.com/garrytan/gstack) gives you the automated `/review`
|
|
72
|
-
step.
|
|
96
|
+
`orly init` also seeds `.oracle/orly.json` with any gate commands it finds in your `Makefile` or `package.json`. Fill in the rest, commit it, and every clone gates identically.
|
|
73
97
|
|
|
74
|
-
|
|
75
|
-
installs nor manages gstack.
|
|
98
|
+
---
|
|
76
99
|
|
|
77
|
-
|
|
78
|
-
`orly-write-unit-test`, `orly-write-integration-test`) come from orly's
|
|
79
|
-
`workflow.skills` pack, per repository. The general-purpose skills come from
|
|
80
|
-
gstack, per agent host.
|
|
100
|
+
## What happens on every commit
|
|
81
101
|
|
|
82
|
-
```
|
|
83
|
-
|
|
102
|
+
```mermaid
|
|
103
|
+
flowchart TD
|
|
104
|
+
edit["agent edits a file"] --> rule["the rule page for that file kind fires"]
|
|
105
|
+
rule --> commit["git commit"]
|
|
106
|
+
commit --> pre["pre-commit hook runs orly gate"]
|
|
107
|
+
pre -->|red| back["blocked: back to EXECUTE"]
|
|
108
|
+
back --> edit
|
|
109
|
+
pre -->|green| push["git push runs pre-push hook"]
|
|
110
|
+
push --> prgate["orly gate pr"]
|
|
111
|
+
prgate -->|red| back
|
|
112
|
+
prgate -->|green| open["Pull Request opens"]
|
|
84
113
|
```
|
|
85
114
|
|
|
86
|
-
|
|
87
|
-
alone: `claude`, `codex`, `kiro`, `factory`, `opencode`, `openclaw`, `hermes`,
|
|
88
|
-
`gbrain`, or `auto`.
|
|
115
|
+
Three checkpoints, all running your own declared commands:
|
|
89
116
|
|
|
90
|
-
|
|
117
|
+
| Checkpoint | When | Effect |
|
|
118
|
+
|---|---|---|
|
|
119
|
+
| `pre-commit` | every commit | stops at the first failing check |
|
|
120
|
+
| `pre-push` | every push | same gates, before anything leaves the machine |
|
|
121
|
+
| `orly gate pr` | opening the Pull Request | refuses until each criterion is green, or carries a recorded override |
|
|
91
122
|
|
|
92
|
-
|
|
93
|
-
to Pull Request.
|
|
123
|
+
---
|
|
94
124
|
|
|
95
|
-
The
|
|
96
|
-
rules name move it, and `orly gate pr` reads where it ended up.
|
|
125
|
+
## The loop you live in
|
|
97
126
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
▣ docs/v1/active/ PLAN · EXECUTE · CONFORM · VERIFY · REVIEW · DOCUMENT · COMMIT
|
|
110
|
-
│ each edit trips the rule page for its file kind
|
|
111
|
-
│ a red gate sends it back to EXECUTE
|
|
112
|
-
│
|
|
113
|
-
│ CHORE(close) session notes, orphan sweep
|
|
114
|
-
▼
|
|
115
|
-
▣ docs/v1/done/ orly gate pr green ──► PR opens
|
|
127
|
+
`orly init` is the setup. This is one task, from prompt to Pull Request.
|
|
128
|
+
|
|
129
|
+
The spec is a file on disk, and **its directory is the status**. Only the stages named in the rules move it.
|
|
130
|
+
|
|
131
|
+
```mermaid
|
|
132
|
+
flowchart LR
|
|
133
|
+
you["🤠 you: add webhook retries"] --> agent["🦉 agent writes the spec"]
|
|
134
|
+
agent --> pending["docs/v1/pending/"]
|
|
135
|
+
pending -->|"CHORE(open)"| active["docs/v1/active/"]
|
|
136
|
+
active -->|"CHORE(close)"| done["docs/v1/done/"]
|
|
137
|
+
done --> pr["Pull Request"]
|
|
116
138
|
```
|
|
117
139
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
140
|
+
| Directory | Meaning |
|
|
141
|
+
|---|---|
|
|
142
|
+
| `docs/v1/pending/` | the spec is written and committed on `main` |
|
|
143
|
+
| `docs/v1/active/` | branch cut, baseline recorded, no code until it commits |
|
|
144
|
+
| `docs/v1/done/` | gates green, Pull Request opens |
|
|
145
|
+
|
|
146
|
+
Inside `active/`, work runs through: **PLAN → EXECUTE → CONFORM → VERIFY → REVIEW → DOCUMENT → COMMIT**.
|
|
121
147
|
|
|
122
|
-
|
|
123
|
-
takes it from there.
|
|
148
|
+
Each edit trips the rule page for its file kind. A red gate sends the agent back to EXECUTE. No stage can be skipped quietly.
|
|
124
149
|
|
|
125
|
-
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Your files stay yours
|
|
126
153
|
|
|
127
154
|
| File | Owner | On `orly update` |
|
|
128
155
|
|---|---|---|
|
|
129
|
-
| `AGENTS.md` | **
|
|
156
|
+
| `AGENTS.md` | **you** | untouched, except one delimited pointer block |
|
|
130
157
|
| `AGENTS.orly.md` | orly | rewritten |
|
|
131
158
|
|
|
132
|
-
Every agent runtime auto-loads `AGENTS.md`, so it stays yours. orly writes its
|
|
133
|
-
|
|
159
|
+
Every agent runtime auto-loads `AGENTS.md`, so it stays yours. orly writes its rules beside it and adds a pointer so they get read.
|
|
160
|
+
|
|
161
|
+
> [!WARNING]
|
|
162
|
+
> orly refuses to replace a hook or rule page it did not write. `--force` and `--no-hooks` are the ways through. A refused run changes nothing.
|
|
134
163
|
|
|
135
|
-
|
|
136
|
-
- **Your files are never overwritten.** A hook or rule page orly did not write
|
|
137
|
-
is refused; `--force` and `--no-hooks` are the ways through.
|
|
138
|
-
- **A refused run changes nothing.**
|
|
164
|
+
---
|
|
139
165
|
|
|
140
166
|
## Commands
|
|
141
167
|
|
|
@@ -149,15 +175,13 @@ rules beside it and adds a pointer so they get read.
|
|
|
149
175
|
| `orly override <criterion> --reason <why>` | record a gate exception as an empty commit that rides into the Pull Request |
|
|
150
176
|
| `orly doctor` | compare what is installed against what orly would write today |
|
|
151
177
|
|
|
152
|
-
|
|
153
|
-
your `Makefile` or `package.json`. Fill in the rest, commit it, and every clone
|
|
154
|
-
gates identically.
|
|
178
|
+
---
|
|
155
179
|
|
|
156
180
|
## Which packs you get
|
|
157
181
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
dependency trees, so one stray file cannot select a language you do not write.
|
|
182
|
+
### Chosen by your source
|
|
183
|
+
|
|
184
|
+
orly scans four directories deep. It skips `node_modules`, `target`, `.venv`, and the other dependency trees, so one stray file cannot select a language you do not write.
|
|
161
185
|
|
|
162
186
|
| Pack | Selected when your source has |
|
|
163
187
|
|---|---|
|
|
@@ -171,7 +195,7 @@ dependency trees, so one stray file cannot select a language you do not write.
|
|
|
171
195
|
| <img src="https://raw.githubusercontent.com/agentsfleet/orly/main/branding/lang-mdx.svg" width="14" alt=""> `language.mdx` | `.mdx` |
|
|
172
196
|
| <img src="https://raw.githubusercontent.com/agentsfleet/orly/main/branding/lang-sql.svg" width="14" alt=""> `domain.sql` | `.sql` |
|
|
173
197
|
|
|
174
|
-
|
|
198
|
+
### Installed everywhere
|
|
175
199
|
|
|
176
200
|
| Pack | What it carries |
|
|
177
201
|
|---|---|
|
|
@@ -183,30 +207,51 @@ Seven more install in every repository.
|
|
|
183
207
|
| `workflow.specifications` | the spec template and the gate that checks its shape |
|
|
184
208
|
| `workflow.skills` | four skills, written once for all four agents |
|
|
185
209
|
|
|
186
|
-
|
|
210
|
+
### Opt-in, only when `.oracle/orly.json` names them
|
|
187
211
|
|
|
188
212
|
| Pack | What it adds | Why it is opt-in |
|
|
189
213
|
|---|---|---|
|
|
190
214
|
| 🦉 `workflow.governance` | the rules for editing rules, their questionnaire, and orly's architecture | only useful if you edit orly itself |
|
|
191
|
-
| `product.agentsfleet` | three audit scripts, the verify dispatch page,
|
|
215
|
+
| `product.agentsfleet` | three audit scripts, the verify dispatch page, four `agentsfleet` docs | a product surface that means nothing in another checkout |
|
|
192
216
|
| 🤠 `persona.indy` | no files; it rewrites the address handles and tone in the generated rules | one maintainer's name and voice |
|
|
193
217
|
|
|
194
|
-
|
|
218
|
+
---
|
|
195
219
|
|
|
196
|
-
|
|
220
|
+
## gstack is optional
|
|
221
|
+
|
|
222
|
+
orly does not require [gstack](https://github.com/garrytan/gstack) to install or run.
|
|
223
|
+
|
|
224
|
+
| gstack installed? | What happens at the review stage |
|
|
197
225
|
|---|---|
|
|
198
|
-
|
|
|
199
|
-
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
226
|
+
| yes | `/review` is detected and runs automatically |
|
|
227
|
+
| no | orly records the skipped review in the Pull Request notes, to be rerun before merge |
|
|
228
|
+
|
|
229
|
+
If you do want it:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
cd ~/.local/share/gstack && ./setup --host auto
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
`--host auto` covers every agent host gstack finds. Name one to target it alone: `claude`, `codex`, `kiro`, `factory`, `opencode`, `openclaw`, `hermes`, `gbrain`, or `auto`.
|
|
236
|
+
|
|
237
|
+
> [!NOTE]
|
|
238
|
+
> The four governance skills (`orly-spec-new`, `orly-babysit-prs`, `orly-write-unit-test`, `orly-write-integration-test`) come from orly's `workflow.skills` pack, per repository. The general-purpose skills come from gstack, per agent host. orly neither installs nor manages gstack.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## Local development
|
|
243
|
+
|
|
244
|
+
For working on orly itself. Pull requests are welcome.
|
|
245
|
+
|
|
246
|
+
### Prerequisites
|
|
205
247
|
|
|
206
|
-
|
|
248
|
+
| You need | Version |
|
|
249
|
+
|---|---|
|
|
250
|
+
| bun | ≥ 1.4.0 |
|
|
251
|
+
| git | any |
|
|
252
|
+
| make | any |
|
|
207
253
|
|
|
208
|
-
|
|
209
|
-
reviewable.
|
|
254
|
+
### Set up
|
|
210
255
|
|
|
211
256
|
```bash
|
|
212
257
|
git clone git@github.com:agentsfleet/orly.git && cd orly
|
|
@@ -215,22 +260,25 @@ bun install --frozen-lockfile
|
|
|
215
260
|
make audit
|
|
216
261
|
```
|
|
217
262
|
|
|
218
|
-
|
|
263
|
+
### The bar
|
|
219
264
|
|
|
220
|
-
|
|
221
|
-
- **render determinism**: the same sources always produce the same rules
|
|
222
|
-
- **gate fixtures**: every gate proved against one passing and one failing case
|
|
265
|
+
`make audit` is the bar. If it passes, the change is reviewable. Its steps run in parallel, around half a minute:
|
|
223
266
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
267
|
+
- **typecheck and unit tests**
|
|
268
|
+
- **render determinism** — the same sources always produce the same rules
|
|
269
|
+
- **gate fixtures** — every gate proved against one passing and one failing case
|
|
227
270
|
|
|
228
271
|
Coverage is gated at a 90% line floor. The workflow fails below it.
|
|
229
272
|
|
|
230
|
-
###
|
|
273
|
+
### Install evals
|
|
231
274
|
|
|
232
|
-
|
|
233
|
-
|
|
275
|
+
Real installs into throwaway repositories. They cost about twice the local chain's wall-clock, so they run on demand:
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
make install-evals
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
CI runs them on every pull request and release.
|
|
234
282
|
|
|
235
283
|
### Rendering orly's own rules
|
|
236
284
|
|
|
@@ -240,8 +288,13 @@ orly governs itself with the same verb everyone else uses:
|
|
|
240
288
|
bin/orly update --no-hooks
|
|
241
289
|
```
|
|
242
290
|
|
|
243
|
-
`--no-hooks` because this checkout hand-wrote its `.githooks/`, and orly refuses
|
|
244
|
-
|
|
291
|
+
`--no-hooks` because this checkout hand-wrote its `.githooks/`, and orly refuses to replace hooks it did not write.
|
|
292
|
+
|
|
293
|
+
### Releasing
|
|
294
|
+
|
|
295
|
+
Merge to `main` with a new `package.json` version. That publishes it, tags it, and cuts a GitHub release. There is no second command to remember.
|
|
296
|
+
|
|
297
|
+
---
|
|
245
298
|
|
|
246
299
|
## Try it
|
|
247
300
|
|
|
@@ -251,9 +304,7 @@ Run this in a repository you own. It writes nothing until you drop the flag.
|
|
|
251
304
|
bunx @agentsfleet/orly init --dry-run
|
|
252
305
|
```
|
|
253
306
|
|
|
254
|
-
It prints the rules it would install, already rendered for the languages it
|
|
255
|
-
found in your source. Read them. If you disagree with one, that is the point:
|
|
256
|
-
your own `AGENTS.md` overrides it.
|
|
307
|
+
It prints the rules it would install, already rendered for the languages it found in your source. Read them. If you disagree with one, that is the point: your own `AGENTS.md` overrides it.
|
|
257
308
|
|
|
258
309
|
Then hand your agent the prompt orly was built for:
|
|
259
310
|
|
|
@@ -262,6 +313,8 @@ Read AGENTS.orly.md. Tell me which of my last ten commits would have tripped a
|
|
|
262
313
|
gate, and name the rule that caught each one.
|
|
263
314
|
```
|
|
264
315
|
|
|
316
|
+
---
|
|
317
|
+
|
|
265
318
|
## License
|
|
266
319
|
|
|
267
320
|
[MIT](LICENSE)
|
package/SOUL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- oracle-packs:start persona.indy -->
|
|
2
|
-
# SOUL.md —
|
|
2
|
+
# SOUL.md — Eywa's working notes
|
|
3
3
|
|
|
4
|
-
> First-person:
|
|
4
|
+
> First-person: Eywa to future Eywa. `AGENTS.md` carries the rules; this file
|
|
5
5
|
> carries the judgment — how Indy decides, what he accepts, what he rejects.
|
|
6
6
|
> In force every session; standing orders, not suggestions. Re-read when
|
|
7
7
|
> padding or burying the answer.
|
|
@@ -10,23 +10,43 @@
|
|
|
10
10
|
|
|
11
11
|
## Reply shape
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
- **
|
|
16
|
-
|
|
13
|
+
Optimise for one thing: he never has to ask twice.
|
|
14
|
+
|
|
15
|
+
- **Answer first.** Verdict in sentence one. Yes/no questions get yes/no.
|
|
16
|
+
- **Check before asking.** If git, `gh`, or the file system holds the answer,
|
|
17
|
+
read it. Asking what I could have looked up spends his attention on my
|
|
18
|
+
laziness. I asked which base branch to use when `gh pr view` already showed
|
|
19
|
+
the milestone merged.
|
|
20
|
+
- **Decide, do not offer.** One option and why. A menu is right only when the
|
|
21
|
+
choice is his taste; when it is my missing knowledge, go and get it. Three
|
|
22
|
+
options offered, and he supplied a fourth I had not looked for (log: P2).
|
|
23
|
+
- **Do the revertible work, then report.** A branch, a Pull Request, a backup,
|
|
24
|
+
a timestamped copy: all revertible, so no permission needed. Stop and ask
|
|
25
|
+
only where undo is real work or impossible: force-push, deleting a remote
|
|
26
|
+
branch, publishing, merging, secrets, anything outside the repository.
|
|
27
|
+
- **Name the next action, every reply.** What is done, what is blocked, and on
|
|
28
|
+
whom. He asked "what is next" four times in one session, which means it was
|
|
29
|
+
in the reply and buried.
|
|
30
|
+
- **Cut to the claim.** One fact per sentence, no preamble, no recap, no
|
|
31
|
+
scene-setting table when a line does. He said "only the needed commands"
|
|
32
|
+
three times before I heard it.
|
|
33
|
+
- **Cite where you claim.** The Evidence invariant in `AGENTS.md` is the rule;
|
|
34
|
+
this is the habit it needs. Say "`gh pr view 23` shows it merged", not "it is
|
|
35
|
+
merged". If I have not run the check, the sentence starts `unverified:`. He
|
|
36
|
+
has no way to see the difference from the outside, so the sentence has to
|
|
37
|
+
carry it.
|
|
17
38
|
- **Halve estimates before voicing.** I pad ~2x reliably (log: P5).
|
|
18
|
-
- **Draw
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
binary contrasts ("not
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
harness, ever-evolving. Published pages add `docs/DOCUMENTATION_RULES.md`.
|
|
39
|
+
- **Draw when shape beats prose.** Three or more compared items, a
|
|
40
|
+
before/after, a branching decision, an ordered flow, or who-points-at-what.
|
|
41
|
+
One picture, then the words (log: P21). This one aids reading; the rules
|
|
42
|
+
above are what save him a round trip.
|
|
43
|
+
- **No slop — chat, docs, code comments alike** (log: P9, P20). Comments say
|
|
44
|
+
why, depth links out. Kill binary contrasts ("not X, it's Y" — say Y),
|
|
45
|
+
throat-clearing openers, faux-insight setups, colon reveals, trailing `-ing`
|
|
46
|
+
justification clauses, importance puffery, em-dash rhythm crutches, and
|
|
47
|
+
fake-profound kickers. End on the clearest concrete sentence. The
|
|
48
|
+
banned-word list lives in `docs/DOCUMENTATION_RULES.md` §DOC-05, §DOC-07,
|
|
49
|
+
and §DOC-14b, and `orly gate verify` enforces it.
|
|
30
50
|
|
|
31
51
|
## Reading Indy
|
|
32
52
|
|
package/core/operating-model.md
CHANGED
|
@@ -5,13 +5,13 @@ You are this repository's coding agent: deterministic, autonomous, command-line-
|
|
|
5
5
|
<!-- oracle-packs:start persona.indy -->
|
|
6
6
|
**Tone.** Be properly funny — human-funny, dry, actually landing; not a bot doing bits. Swear words are absolutely fine. Never trade technical clarity for either.
|
|
7
7
|
|
|
8
|
-
**Start:** `SOUL.md` (
|
|
8
|
+
**Start:** `SOUL.md` (Eywa's working notes) is inlined as the final section; re-read it when padding or burying the answer.
|
|
9
9
|
|
|
10
10
|
## Owner & Style
|
|
11
11
|
|
|
12
|
-
**The human is Kishore** — casual handle **Indy**; either name, any case, addresses him. Ambiguous "the user" / "they" here = Kishore. The agent is **Oracle**, casual handle **
|
|
12
|
+
**The human is Kishore** — casual handle **Indy**; either name, any case, addresses him. Ambiguous "the user" / "they" here = Kishore. The agent is **Oracle**, casual handle **Eywa**. `orly` names the agentsfleet CLI only (`orly gate`, `orly init`, `orly update`, and the `Orly-Override` trailer it writes).
|
|
13
13
|
|
|
14
|
-
**Address tags.** Kishore: **🤠 Indy**; agent: **🦉
|
|
14
|
+
**Address tags.** Kishore: **🤠 Indy**; agent: **🦉 Eywa** (`Oracle`). **Project name:** `agentsfleet` (domains → `agentsfleet.net`). Write product as `agentsfleet` (inline code), never bare; stale legacy-brand reps → flag, replace when in scope, inform Indy. Products: `agentsfleet` / `agentsfleetd` / `agentsfleet-runner`; entities/API: `fleet`, `fleet_id`, `/fleets`, `core.fleet_*`. Keep: `agentsfleet.dev`, `github.com/agentsfleet/agentsfleet`, `@agentsfleet/*`, `~/Projects/agentsfleet`.
|
|
15
15
|
|
|
16
16
|
MacBook. Languages: Python, Go, Rust, TypeScript, Zig. Tooling: `mise` first, `brew` fallback. Forges: `gh`/`glab`. Commit identity from `git config`, never here.
|
|
17
17
|
|
|
@@ -22,6 +22,10 @@ Dates: `MMM DD, YYYY: HH:MM AM/PM`. Filenames: `{MMM}_{DD}_{HH_MM}`.
|
|
|
22
22
|
**Acronym expansion (durable artifacts AND human-facing communication):** spell out non-obvious acronyms / project codenames / vendor names on first mention in the same message — `Continuous Integration (CI)`, `Cross-Site Scripting (XSS)`, `Identifier (ID)`. Skip staples: `API`, `URL`, `HTTP`, `JSON`, `SQL`, `DNS`, `CSS`, `HTML`, `TCP`, `UDP`, `IP`, `OS`. Reuse bare after. Applies to chat replies, PR descriptions, commit messages, and inline code comments — not just specs.
|
|
23
23
|
|
|
24
24
|
**Pre-send self-checks (invariant).** Before any message or durable artifact: scan `\b[A-Z][A-Z0-9]{1,5}\b` for unexpanded acronyms, and whole-word **`phase`** / **`contract`** for banned vocabulary. Skipping = `ACRONYM CHECK: SKIPPED per user override (reason: ...)` / `BANNED-VOCAB CHECK: SKIPPED per user override (reason: ...)`; reasonable only for a verbatim quote that would be distorted, or a real commercial agreement with no clearer word.
|
|
25
|
+
|
|
26
|
+
**Evidence invariant (pre-send).** Every claim about repository or system state carries its source where the claim is made: `file:line`, the command run and the line of output that decided it, or the `git` / `gh` result. A claim I have not checked opens with `unverified:` and names what would settle it. Numbers name the command that produced them. "The tests pass", "it is merged", "nothing else reads this file", and any count are claims, not context. Skipping = `EVIDENCE CHECK: SKIPPED per user override (reason: ...)`.
|
|
27
|
+
|
|
28
|
+
**Why it is an invariant, not a preference.** An unchecked claim reads exactly like a checked one. Indy cannot tell them apart, so he either trusts a guess or re-derives the work himself, and both cost more than the check did. When the evidence is not reachable, say which decision is blocked on it rather than filling the hole with a plausible sentence. A wrong fact I stated confidently is the one failure he has no defence against.
|
|
25
29
|
<!-- oracle-packs:end -->
|
|
26
30
|
|
|
27
31
|
## Documentation voice
|
|
@@ -115,10 +115,36 @@ Cut these on sight. They read as machine prose and they hide the point.
|
|
|
115
115
|
| Fake-profound kicker | a closing metaphor or mic-drop | End on the last concrete sentence. |
|
|
116
116
|
| Summary recap | "In conclusion", "Overall" | Stop. The reader was just there. |
|
|
117
117
|
|
|
118
|
-
Also banned, on top of DOC-05 and DOC-07: delve, foster, elevate,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
Also banned, on top of DOC-05 and DOC-07: delve, foster, elevate, supercharge,
|
|
119
|
+
embark, ever-evolving, tapestry, realm, paradigm shift, game changer, deep
|
|
120
|
+
dive, blazing fast, streamline, empower, journey, landscape, testament,
|
|
121
|
+
pivotal, notably, moreover, furthermore, myriad, plethora, aforementioned,
|
|
122
|
+
meticulous, boasts, cornerstone, best-in-class, industry-leading,
|
|
123
|
+
state-of-the-art, unparalleled, effortless, turnkey, battle-tested,
|
|
124
|
+
rock-solid, and innovative.
|
|
125
|
+
|
|
126
|
+
DOC-05 covers "utilize" as well as "utilise". The checker always enforced
|
|
127
|
+
both; this page named only one. A rule readers cannot read is a rule that
|
|
128
|
+
drifts.
|
|
129
|
+
|
|
130
|
+
"contract" and "phase" are banned too. That ban is not new here: the operating
|
|
131
|
+
model states it and names the replacements, so read it there rather than
|
|
132
|
+
twice. Use Prototype, Milestone, Workstream, Section, Dimension, and Batch for
|
|
133
|
+
the hierarchy, "stages" for lifecycle steps, and "rules" for what `AGENTS.md`
|
|
134
|
+
enforces. A real commercial agreement keeps "contract" only where no clearer
|
|
135
|
+
term exists.
|
|
136
|
+
|
|
137
|
+
"harness" is not banned. It is this product's own word for what orly installs,
|
|
138
|
+
and it reaches every consumer through the rendered `AGENTS.md`. A word the
|
|
139
|
+
product uses for itself is vocabulary, not slop.
|
|
140
|
+
|
|
141
|
+
Em dashes are not a rhythm crutch: none in short copy, at most two per long
|
|
142
|
+
page, and only where they beat a comma or a period. The rule corpus is exempt
|
|
143
|
+
from that budget — `dispatch/`, `core/`, `audits/`, `skills/`, `AGENTS.md`,
|
|
144
|
+
`AGENTS.orly.md`, `SOUL.md`, and any `RULES.md`. Those pages are dense
|
|
145
|
+
reference text where the dash separates a claim from its consequence. Measured
|
|
146
|
+
across the corpus the budget flagged 36 of 39 pages, which is a rule mis-fit,
|
|
147
|
+
not 36 defects. They keep every other rule.
|
|
122
148
|
|
|
123
149
|
## Content
|
|
124
150
|
|
package/docs/RULE_ENFORCEMENT.md
CHANGED
|
@@ -9,12 +9,12 @@ regenerates this file and fails on any difference. To update it, run
|
|
|
9
9
|
| `docs/LOGGING_STANDARD.md` | `LOG` → `logging.sh` | 10 | 13 | 26/26 | mechanical |
|
|
10
10
|
| `docs/REST_API_DESIGN_GUIDELINES.md` | — | 0 | 0 | 0/74 | mechanical |
|
|
11
11
|
| `docs/SCHEMA_CONVENTIONS.md` | — | 0 | 0 | 0/16 | mechanical |
|
|
12
|
-
| `docs/DOCUMENTATION_RULES.md` | — | 0 | 0 | 0/
|
|
12
|
+
| `docs/DOCUMENTATION_RULES.md` | — | 0 | 0 | 0/22 | latent |
|
|
13
13
|
| `docs/LIFECYCLE_PATTERNS.md` | — | 0 | 0 | 0/22 | mechanical |
|
|
14
14
|
| `docs/CHANGELOG_VOICE.md` | — | 0 | 0 | 0/3 | latent |
|
|
15
15
|
| `docs/VERIFY_TIERS.md` | — | 0 | 0 | 0/4 | uncited |
|
|
16
16
|
| `docs/greptile-learnings/RULES.md` | — | 0 | 0 | 0/113 | mechanical |
|
|
17
|
-
| **corpus** | | | | **26/
|
|
17
|
+
| **corpus** | | | | **26/280** | |
|
|
18
18
|
|
|
19
19
|
## How to read this
|
|
20
20
|
|
package/llms.txt
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# orly — agent instructions
|
|
2
|
+
|
|
3
|
+
> You are an autonomous coding agent. This file is the authoritative setup and
|
|
4
|
+
> operating guide for orly. Read it in full before running any command.
|
|
5
|
+
> Do not infer behaviour from README.md; that page is written for humans.
|
|
6
|
+
|
|
7
|
+
orly installs two things into a repository: rules you must read before editing,
|
|
8
|
+
and gate scripts wired into git hooks that fail the commit when a rule was
|
|
9
|
+
ignored. Hosts supported: Claude Code, Codex, OpenCode, Amp.
|
|
10
|
+
|
|
11
|
+
Package: `@agentsfleet/orly` (npm)
|
|
12
|
+
Source: https://github.com/agentsfleet/orly
|
|
13
|
+
License: MIT
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Preconditions
|
|
18
|
+
|
|
19
|
+
Verify all of these before acting. If a check fails, stop and report it to the
|
|
20
|
+
user rather than working around it.
|
|
21
|
+
|
|
22
|
+
| Check | Command | Required |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| bun present | `bun --version` | ≥ 1.4.0 |
|
|
25
|
+
| git present | `git --version` | any |
|
|
26
|
+
| inside a repository | `git rev-parse --show-toplevel` | must succeed |
|
|
27
|
+
| working tree clean | `git status --porcelain` | should be empty |
|
|
28
|
+
|
|
29
|
+
Do not install bun, git, or any package manager yourself unless the user asks.
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 2. Install sequence
|
|
34
|
+
|
|
35
|
+
Run from the repository root. Execute these in order and stop at the first
|
|
36
|
+
non-zero exit.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 1. preview — writes nothing
|
|
40
|
+
bunx @agentsfleet/orly init --dry-run
|
|
41
|
+
|
|
42
|
+
# 2. install
|
|
43
|
+
bunx @agentsfleet/orly init
|
|
44
|
+
|
|
45
|
+
# 3. confirm installed state matches what orly would write today
|
|
46
|
+
bunx @agentsfleet/orly doctor
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Then commit the result. Teammates receive the rules on clone.
|
|
50
|
+
|
|
51
|
+
IMPORTANT: git does not clone hooks. Each checkout must run `orly init` once.
|
|
52
|
+
If a human reports that gates are not firing, this is the first thing to check.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. What the install writes
|
|
57
|
+
|
|
58
|
+
| Path | Contents | Owner |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `AGENTS.md` | your host auto-loads this | the user — never rewrite it |
|
|
61
|
+
| `AGENTS.orly.md` | generated rules: safety, dispatch router, lifecycle | orly — rewritten on update |
|
|
62
|
+
| `dispatch/*.md` | one rule page per kind of work | orly |
|
|
63
|
+
| `audits/*.sh` | the deterministic gates | orly |
|
|
64
|
+
| `docs/*.md` | the standards those rules cite | orly |
|
|
65
|
+
| `.claude/skills/`, `.agents/skills/`, `.opencode/skills/` | skills materialised per host | orly |
|
|
66
|
+
| `.githooks/` | pre-commit and pre-push, wired to `orly gate` | orly |
|
|
67
|
+
| `.oracle/orly.json` | packs, gate commands, install record | shared — edit the commands |
|
|
68
|
+
|
|
69
|
+
`orly init` seeds `.oracle/orly.json` with gate commands found in `Makefile` or
|
|
70
|
+
`package.json`. If commands are missing, ask the user which ones to add. Do not
|
|
71
|
+
invent check commands.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 4. Read order before you edit anything
|
|
76
|
+
|
|
77
|
+
1. `AGENTS.md` — the user's own rules. **These win on any conflict.**
|
|
78
|
+
2. `AGENTS.orly.md` — the generated rules and the dispatch router.
|
|
79
|
+
3. The `dispatch/*.md` page that matches the kind of file you are about to edit.
|
|
80
|
+
4. Any `docs/*.md` standard those pages cite.
|
|
81
|
+
|
|
82
|
+
Re-read step 3 for each new file kind you touch in the same task.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 5. The task lifecycle
|
|
87
|
+
|
|
88
|
+
The spec is a file on disk. Its directory is the status. Only the named stages
|
|
89
|
+
move it. `orly gate pr` reads where it ended up.
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
docs/v1/pending/ spec written, committed on main
|
|
93
|
+
│
|
|
94
|
+
│ CHORE(open) branch cut, baseline recorded, NO CODE until it commits
|
|
95
|
+
▼
|
|
96
|
+
docs/v1/active/ PLAN → EXECUTE → CONFORM → VERIFY → REVIEW → DOCUMENT → COMMIT
|
|
97
|
+
│
|
|
98
|
+
│ CHORE(close) session notes, orphan sweep
|
|
99
|
+
▼
|
|
100
|
+
docs/v1/done/ orly gate pr green → Pull Request opens
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Rules for you:
|
|
104
|
+
|
|
105
|
+
- Write the spec yourself before any code exists.
|
|
106
|
+
- Do not write code before `CHORE(open)` has committed.
|
|
107
|
+
- Do not skip a stage. The hooks run gates on every commit and push.
|
|
108
|
+
- A red gate returns you to EXECUTE. Fix the cause; do not retry unchanged.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 6. Failure decision table
|
|
113
|
+
|
|
114
|
+
| Situation | Do this |
|
|
115
|
+
|---|---|
|
|
116
|
+
| `orly gate` fails a check | return to EXECUTE, fix the cause, re-run `orly gate` |
|
|
117
|
+
| same gate fails twice on the same cause | stop, report the gate name and output to the user |
|
|
118
|
+
| `orly init` refuses a file | orly did not write that file. Report it. Do **not** pass `--force` on your own initiative |
|
|
119
|
+
| hooks not firing | run `git config core.hooksPath` and confirm `orly init` was run in this checkout |
|
|
120
|
+
| gate command missing from `.oracle/orly.json` | ask the user for the command; do not invent one |
|
|
121
|
+
| `orly gate pr` red and the failure is genuinely inapplicable | ask the user; only they authorise `orly override` |
|
|
122
|
+
| gstack `/review` unavailable | continue; orly records the skipped review in the PR notes |
|
|
123
|
+
|
|
124
|
+
Overrides are recorded as an empty commit that rides into the Pull Request:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
bunx @agentsfleet/orly override <criterion> --reason "<why>"
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Never record an override without an explicit instruction from the user, and
|
|
131
|
+
never with a placeholder reason.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 7. Hard rules
|
|
136
|
+
|
|
137
|
+
- Never rewrite `AGENTS.md`. orly adds one delimited pointer block; leave the
|
|
138
|
+
rest alone.
|
|
139
|
+
- Never edit or delete files under `.githooks/` or `audits/` to make a gate pass.
|
|
140
|
+
- Never pass `--force` or `--no-hooks` unless the user asks for it by name.
|
|
141
|
+
- Never disable a check in `.oracle/orly.json` to get green.
|
|
142
|
+
- When the user's `AGENTS.md` and orly's rules disagree, the user's file wins.
|
|
143
|
+
- A refused run changes nothing. Report the refusal; do not retry with flags.
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 8. Command reference
|
|
148
|
+
|
|
149
|
+
| Command | Effect |
|
|
150
|
+
|---|---|
|
|
151
|
+
| `orly init` | write rules, gates, skills, and hooks |
|
|
152
|
+
| `orly init --dry-run` | print what would be written; change nothing |
|
|
153
|
+
| `orly update` | re-materialise at a newer engine version |
|
|
154
|
+
| `orly update --with <pack>` | add an opt-in pack, recorded for every clone |
|
|
155
|
+
| `orly gate` | run declared checks in order, stopping at the first failure |
|
|
156
|
+
| `orly gate pr` | the Pull Request criteria check |
|
|
157
|
+
| `orly override <criterion> --reason <why>` | record a gate exception (user-authorised only) |
|
|
158
|
+
| `orly doctor` | diff installed state against what orly would write today |
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 9. Packs
|
|
163
|
+
|
|
164
|
+
Nine language packs are selected from file extensions in the user's source.
|
|
165
|
+
orly scans four directories deep and skips `node_modules`, `target`, `.venv`,
|
|
166
|
+
and other dependency trees.
|
|
167
|
+
|
|
168
|
+
`.zig` → `language.zig` · `.ts`/`.tsx` → `language.typescript` ·
|
|
169
|
+
`.js`/`.jsx` → `language.javascript` · `.rs` → `language.rust` ·
|
|
170
|
+
`.go` → `language.go` · `.py` → `language.python` · `.sh` → `language.shell` ·
|
|
171
|
+
`.mdx` → `language.mdx` · `.sql` → `domain.sql`
|
|
172
|
+
|
|
173
|
+
Seven install in every repository: `universal.authoring`, `domain.http`,
|
|
174
|
+
`domain.auth`, `domain.documentation`, `domain.changelog`,
|
|
175
|
+
`workflow.specifications`, `workflow.skills`.
|
|
176
|
+
|
|
177
|
+
Three install only when `.oracle/orly.json` names them: `workflow.governance`
|
|
178
|
+
(editing orly's own rules), `product.agentsfleet` (agentsfleet-specific audits
|
|
179
|
+
and docs), `persona.indy` (tone and address handles only, no files).
|
|
180
|
+
|
|
181
|
+
Skills provided by `workflow.skills`, per repository: `orly-spec-new`,
|
|
182
|
+
`orly-babysit-prs`, `orly-write-unit-test`, `orly-write-integration-test`.
|
|
183
|
+
General-purpose skills come from gstack, per agent host — orly neither installs
|
|
184
|
+
nor manages gstack.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 10. Working on orly itself
|
|
189
|
+
|
|
190
|
+
Only relevant if the task is a change to this repository.
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
git clone git@github.com:agentsfleet/orly.git && cd orly
|
|
194
|
+
git config core.hooksPath .githooks
|
|
195
|
+
bun install --frozen-lockfile
|
|
196
|
+
make audit
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- `make audit` is the bar: typecheck and unit tests, render determinism, and
|
|
200
|
+
gate fixtures (each gate proved against one passing and one failing case).
|
|
201
|
+
Runs in parallel, under half a minute.
|
|
202
|
+
- Coverage floor is 90% lines. Below it, the workflow fails.
|
|
203
|
+
- `make install-evals` runs real installs into throwaway repositories. Run on
|
|
204
|
+
demand; CI runs them on every pull request and release.
|
|
205
|
+
- Render orly's own rules with `bin/orly update --no-hooks`. The `--no-hooks`
|
|
206
|
+
flag is required here because this checkout hand-wrote its `.githooks/`.
|
|
207
|
+
- Release: merge to `main` with a new `package.json` version. That publishes,
|
|
208
|
+
tags, and cuts the GitHub release. No second command.
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 11. Self-check prompt
|
|
213
|
+
|
|
214
|
+
After install, verify your own understanding by answering this from the
|
|
215
|
+
repository, without guessing:
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
Read AGENTS.orly.md. Name which of the last ten commits would have tripped a
|
|
219
|
+
gate, and the rule that caught each one.
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
If you cannot answer it from the installed files, re-read section 4 before
|
|
223
|
+
continuing.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentsfleet/orly",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "Repository-scoped engineering harness: renders agent rules, materialises the gates that enforce them, and proves the PR boundary — for any coding agent.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"src/",
|
|
52
52
|
"registry.json",
|
|
53
53
|
"AGENTS.md",
|
|
54
|
+
"llms.txt",
|
|
54
55
|
"SOUL.md"
|
|
55
56
|
],
|
|
56
57
|
"publishConfig": {
|
package/src/doc_rules.ts
CHANGED
|
@@ -37,6 +37,21 @@ const MAX_PARAGRAPH_SENTENCES = 3;
|
|
|
37
37
|
const SHORT_COPY_WORDS = 300;
|
|
38
38
|
const LONG_PAGE_DASHES = 2;
|
|
39
39
|
const EM_DASH = "—";
|
|
40
|
+
// The em-dash budget is calibrated for prose a first-day reader skims. The
|
|
41
|
+
// rule corpus is not that: dispatch pages, the operating model, and skill
|
|
42
|
+
// bodies are dense reference text where the dash separates a claim from its
|
|
43
|
+
// consequence, and a comma or a period there reads worse. Measured across the
|
|
44
|
+
// corpus the budget flagged 36 of 39 pages, which is a rule mis-fit rather
|
|
45
|
+
// than 36 defects. These pages keep every other rule.
|
|
46
|
+
const RULE_PAGE_DIRECTORIES = ["dispatch/", "core/", "audits/", "skills/"];
|
|
47
|
+
const RULE_PAGE_FILES = ["AGENTS.md", "AGENTS.orly.md", "SOUL.md", "RULES.md"];
|
|
48
|
+
|
|
49
|
+
function isRulePage(file: string): boolean {
|
|
50
|
+
const normalised = file.replaceAll("\\", "/");
|
|
51
|
+
if (RULE_PAGE_DIRECTORIES.some((directory) => normalised.includes(directory))) return true;
|
|
52
|
+
const name = normalised.slice(normalised.lastIndexOf("/") + 1);
|
|
53
|
+
return RULE_PAGE_FILES.includes(name);
|
|
54
|
+
}
|
|
40
55
|
const README = "README.md";
|
|
41
56
|
const CONFIG_RELATIVE_PATH = ".oracle/orly.json";
|
|
42
57
|
const REGISTRY_FILE = "registry.json";
|
|
@@ -71,13 +86,29 @@ const BANNED_WORDS = new Set([
|
|
|
71
86
|
"delve", "delves", "delved", "delving",
|
|
72
87
|
"foster", "fosters", "fostered", "fostering",
|
|
73
88
|
"elevate", "elevates", "elevated", "elevating",
|
|
74
|
-
"harness", "harnesses", "harnessed", "harnessing",
|
|
75
89
|
"supercharge", "supercharges", "supercharged", "supercharging",
|
|
76
90
|
"embark", "embarks", "embarked", "embarking",
|
|
77
91
|
"ever-evolving", "tapestry", "realm", "realms",
|
|
92
|
+
// SOUL.md's reply-shape list restated these and drifted from this one. The
|
|
93
|
+
// prose in DOCUMENTATION_RULES.md named only the British "utilise" while
|
|
94
|
+
// the American forms above were already enforced here.
|
|
95
|
+
"streamline", "streamlines", "streamlined", "streamlining",
|
|
96
|
+
"empower", "empowers", "empowered", "empowering",
|
|
97
|
+
"journey", "journeys", "landscape", "landscapes", "testament",
|
|
98
|
+
"pivotal", "notably", "moreover", "furthermore", "myriad", "plethora",
|
|
99
|
+
"aforementioned", "meticulous", "meticulously", "boasts", "cornerstone",
|
|
100
|
+
"best-in-class", "industry-leading", "state-of-the-art", "unparalleled",
|
|
101
|
+
"effortless", "effortlessly", "turnkey", "battle-tested", "rock-solid",
|
|
102
|
+
"innovative",
|
|
103
|
+
// core/operating-model.md already bans these two and names the
|
|
104
|
+
// replacements: Prototype/Milestone/Workstream/Section/Dimension/Batch for
|
|
105
|
+
// the hierarchy, "stages" for lifecycle steps, "rules" for what AGENTS.md
|
|
106
|
+
// enforces. The rule shipped to every consumer with nothing enforcing it.
|
|
107
|
+
"contract", "contracts", "contracted", "contracting",
|
|
108
|
+
"phase", "phases", "phased", "phasing",
|
|
78
109
|
]);
|
|
79
110
|
|
|
80
|
-
const BANNED_PHRASES = ["paradigm shift", "game changer", "game-changer"];
|
|
111
|
+
const BANNED_PHRASES = ["paradigm shift", "game changer", "game-changer", "deep dive", "blazing fast", "blazingly fast"];
|
|
81
112
|
|
|
82
113
|
// Forms that end in a period without ending a sentence.
|
|
83
114
|
const ABBREVIATIONS = new Set(["e.g.", "i.e.", "etc.", "vs.", "cf.", "no.", "fig.", "approx."]);
|
|
@@ -273,6 +304,7 @@ class Reader {
|
|
|
273
304
|
}
|
|
274
305
|
|
|
275
306
|
private reportDashes(): void {
|
|
307
|
+
if (isRulePage(this.file)) return;
|
|
276
308
|
const short = this.proseWords < SHORT_COPY_WORDS;
|
|
277
309
|
const budget = short ? 0 : LONG_PAGE_DASHES;
|
|
278
310
|
if (this.dashes <= budget) return;
|