leos-agent 6.1.1 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/adapters/cursor/agents/executor.md +1 -1
- package/adapters/cursor/agents/implementer.md +1 -1
- package/adapters/cursor/agents/reviewer.md +1 -0
- package/adapters/opencode/agents.json +3 -3
- package/adapters/opencode/plugin.js +128 -28
- package/config/models.json +379 -33
- package/hooks/session-start.py +27 -0
- package/package.json +18 -4
- package/roles/executor.md +1 -1
- package/roles/implementer.md +1 -1
- package/roles/reviewer.md +1 -0
- package/scripts/doctor.py +284 -0
- package/scripts/ghreview.py +554 -0
- package/scripts/memory.py +705 -0
- package/scripts/render_adapters.py +205 -108
- package/scripts/resolve_attach_target.py +357 -0
- package/scripts/setup.py +161 -0
- package/skills/delegation/SKILL.md +1 -1
- package/skills/doctor/SKILL.md +105 -0
- package/skills/freshness/SKILL.md +118 -0
- package/skills/memory/SKILL.md +144 -0
- package/skills/resolve-ticket/SKILL.md +269 -0
- package/skills/review-pr/SKILL.md +317 -0
- package/skills/setup/SKILL.md +85 -0
- package/skills/using-leo/SKILL.md +8 -1
- package/skills/using-leo/references/claude-mapping.md +22 -1
- package/skills/using-leo/references/codex-mapping.md +17 -7
- package/skills/using-leo/references/cursor-mapping.md +18 -6
- package/skills/using-leo/references/hermes-mapping.md +17 -7
- package/skills/using-leo/references/opencode-mapping.md +15 -9
- package/skills/verification/SKILL.md +7 -0
- package/skills/visual-verification/SKILL.md +114 -0
- package/skills/watch-review/SKILL.md +125 -0
- package/skills/writing-skills/SKILL.md +134 -0
package/config/models.json
CHANGED
|
@@ -1,7 +1,257 @@
|
|
|
1
1
|
{
|
|
2
|
-
"schemaVersion":
|
|
2
|
+
"schemaVersion": 3,
|
|
3
|
+
"capabilities": [
|
|
4
|
+
{
|
|
5
|
+
"key": "policyInjection",
|
|
6
|
+
"label": "Policy injection",
|
|
7
|
+
"modes": [
|
|
8
|
+
"hook",
|
|
9
|
+
"config-file",
|
|
10
|
+
"tool-result",
|
|
11
|
+
"none"
|
|
12
|
+
],
|
|
13
|
+
"values": {
|
|
14
|
+
"claude": {
|
|
15
|
+
"mode": "hook",
|
|
16
|
+
"note": "`SessionStart` hook, on every startup / resume / clear / compact"
|
|
17
|
+
},
|
|
18
|
+
"codex": {
|
|
19
|
+
"mode": "hook",
|
|
20
|
+
"note": "`SessionStart` hook, on every startup / resume / clear / compact"
|
|
21
|
+
},
|
|
22
|
+
"cursor": {
|
|
23
|
+
"mode": "hook",
|
|
24
|
+
"note": "`sessionStart` hook, every session"
|
|
25
|
+
},
|
|
26
|
+
"hermes": {
|
|
27
|
+
"mode": "tool-result",
|
|
28
|
+
"note": "rides the session's first tool result — so a session that runs no tool gets none; read `leo:using-leo` if the policy is not already in your context"
|
|
29
|
+
},
|
|
30
|
+
"opencode": {
|
|
31
|
+
"mode": "config-file",
|
|
32
|
+
"note": "`config.instructions`, with a system-prompt transform as backstop"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"key": "subagentSpawn",
|
|
38
|
+
"label": "Subagent spawn",
|
|
39
|
+
"modes": [
|
|
40
|
+
"native-agent",
|
|
41
|
+
"generic-prompt",
|
|
42
|
+
"delegate-task"
|
|
43
|
+
],
|
|
44
|
+
"values": {
|
|
45
|
+
"claude": {
|
|
46
|
+
"mode": "native-agent",
|
|
47
|
+
"note": "spawn the named native agent; its generated frontmatter pins the model"
|
|
48
|
+
},
|
|
49
|
+
"codex": {
|
|
50
|
+
"mode": "generic-prompt",
|
|
51
|
+
"note": "generic subagent with `roles/<role>.md` pasted in"
|
|
52
|
+
},
|
|
53
|
+
"cursor": {
|
|
54
|
+
"mode": "native-agent",
|
|
55
|
+
"note": "plugin agent from the generated Cursor agents directory"
|
|
56
|
+
},
|
|
57
|
+
"hermes": {
|
|
58
|
+
"mode": "delegate-task",
|
|
59
|
+
"note": "native `delegate_task`, canonical role prompt pasted in"
|
|
60
|
+
},
|
|
61
|
+
"opencode": {
|
|
62
|
+
"mode": "native-agent",
|
|
63
|
+
"note": "registered agent from `agents.json`, spawned via the task tool"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"key": "perSpawnModel",
|
|
69
|
+
"label": "Per-spawn model",
|
|
70
|
+
"modes": [
|
|
71
|
+
"yes",
|
|
72
|
+
"no"
|
|
73
|
+
],
|
|
74
|
+
"values": {
|
|
75
|
+
"claude": {
|
|
76
|
+
"mode": "yes",
|
|
77
|
+
"note": "yes — the agent's own frontmatter"
|
|
78
|
+
},
|
|
79
|
+
"codex": {
|
|
80
|
+
"mode": "yes",
|
|
81
|
+
"note": "yes — pass `model` and `reasoning_effort` explicitly; a user or `AGENTS.md` override still wins"
|
|
82
|
+
},
|
|
83
|
+
"cursor": {
|
|
84
|
+
"mode": "no",
|
|
85
|
+
"note": "no — agents are `model: inherit`; select the tier's model in the UI before a homogeneous batch"
|
|
86
|
+
},
|
|
87
|
+
"hermes": {
|
|
88
|
+
"mode": "no",
|
|
89
|
+
"note": "no — one `delegation.model` for every child, so batch homogeneous Kimi or GLM work and switch it between batches"
|
|
90
|
+
},
|
|
91
|
+
"opencode": {
|
|
92
|
+
"mode": "no",
|
|
93
|
+
"note": "no — each agent always runs its registered model, so `reviewer` never downscales on a trivial diff"
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"key": "readOnlyRoles",
|
|
99
|
+
"label": "Read-only roles",
|
|
100
|
+
"modes": [
|
|
101
|
+
"tools",
|
|
102
|
+
"frontmatter",
|
|
103
|
+
"permission",
|
|
104
|
+
"prompt"
|
|
105
|
+
],
|
|
106
|
+
"values": {
|
|
107
|
+
"claude": {
|
|
108
|
+
"mode": "tools",
|
|
109
|
+
"note": "harness-enforced — the tool allowlist omits Write and Edit"
|
|
110
|
+
},
|
|
111
|
+
"codex": {
|
|
112
|
+
"mode": "prompt",
|
|
113
|
+
"note": "prompt only — a convention, never a guarantee; never route work here that depends on it"
|
|
114
|
+
},
|
|
115
|
+
"cursor": {
|
|
116
|
+
"mode": "frontmatter",
|
|
117
|
+
"note": "harness-enforced — generated `readonly: true`"
|
|
118
|
+
},
|
|
119
|
+
"hermes": {
|
|
120
|
+
"mode": "prompt",
|
|
121
|
+
"note": "prompt only — a convention, never a guarantee; never route work here that depends on it"
|
|
122
|
+
},
|
|
123
|
+
"opencode": {
|
|
124
|
+
"mode": "permission",
|
|
125
|
+
"note": "harness-enforced — generated `permission.edit: deny`, refused by OpenCode itself"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"key": "worktrees",
|
|
131
|
+
"label": "Worktrees",
|
|
132
|
+
"modes": [
|
|
133
|
+
"native-tool",
|
|
134
|
+
"raw-git"
|
|
135
|
+
],
|
|
136
|
+
"values": {
|
|
137
|
+
"claude": {
|
|
138
|
+
"mode": "native-tool",
|
|
139
|
+
"note": "`EnterWorktree` / `ExitWorktree`, session-tracked and auto-cleaned; pair every Enter with an Exit"
|
|
140
|
+
},
|
|
141
|
+
"codex": {
|
|
142
|
+
"mode": "raw-git",
|
|
143
|
+
"note": "no native tool — raw `git worktree` at `.claude/worktrees/<name>`"
|
|
144
|
+
},
|
|
145
|
+
"cursor": {
|
|
146
|
+
"mode": "raw-git",
|
|
147
|
+
"note": "no native tool — raw `git worktree` at `.claude/worktrees/<name>`"
|
|
148
|
+
},
|
|
149
|
+
"hermes": {
|
|
150
|
+
"mode": "raw-git",
|
|
151
|
+
"note": "no native tool — raw `git worktree` at `.claude/worktrees/<name>`"
|
|
152
|
+
},
|
|
153
|
+
"opencode": {
|
|
154
|
+
"mode": "raw-git",
|
|
155
|
+
"note": "no native tool — raw `git worktree` at `.claude/worktrees/<name>`"
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"key": "workflowRunner",
|
|
161
|
+
"label": "Workflow runner",
|
|
162
|
+
"modes": [
|
|
163
|
+
"workflow-tool",
|
|
164
|
+
"none"
|
|
165
|
+
],
|
|
166
|
+
"values": {
|
|
167
|
+
"claude": {
|
|
168
|
+
"mode": "workflow-tool",
|
|
169
|
+
"note": "the Workflow tool runs `workflows/cost-tiered-fix.js` by `scriptPath`"
|
|
170
|
+
},
|
|
171
|
+
"codex": {
|
|
172
|
+
"mode": "none",
|
|
173
|
+
"note": "none — fan out by hand and keep the ledger in `<plugin-root>/scripts/state.py`"
|
|
174
|
+
},
|
|
175
|
+
"cursor": {
|
|
176
|
+
"mode": "none",
|
|
177
|
+
"note": "none — fan out by hand and keep the ledger in `<plugin-root>/scripts/state.py`"
|
|
178
|
+
},
|
|
179
|
+
"hermes": {
|
|
180
|
+
"mode": "none",
|
|
181
|
+
"note": "none — fan out by hand and keep the ledger in `<plugin-root>/scripts/state.py`"
|
|
182
|
+
},
|
|
183
|
+
"opencode": {
|
|
184
|
+
"mode": "none",
|
|
185
|
+
"note": "no runner — `cost-tiered-fix.js` ships in the package but nothing here executes it; fan out by hand and keep the ledger in `<plugin-root>/scripts/state.py`"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"key": "followUp",
|
|
191
|
+
"label": "Follow-up to a live agent",
|
|
192
|
+
"modes": [
|
|
193
|
+
"tool",
|
|
194
|
+
"none",
|
|
195
|
+
"unknown"
|
|
196
|
+
],
|
|
197
|
+
"values": {
|
|
198
|
+
"claude": {
|
|
199
|
+
"mode": "tool",
|
|
200
|
+
"note": "`SendMessage` to the same agent, which keeps the context it already built"
|
|
201
|
+
},
|
|
202
|
+
"codex": {
|
|
203
|
+
"mode": "unknown",
|
|
204
|
+
"note": "none established — re-dispatch cold with the context restated"
|
|
205
|
+
},
|
|
206
|
+
"cursor": {
|
|
207
|
+
"mode": "unknown",
|
|
208
|
+
"note": "none established — re-dispatch cold with the context restated"
|
|
209
|
+
},
|
|
210
|
+
"hermes": {
|
|
211
|
+
"mode": "unknown",
|
|
212
|
+
"note": "none established — re-dispatch cold with the context restated"
|
|
213
|
+
},
|
|
214
|
+
"opencode": {
|
|
215
|
+
"mode": "unknown",
|
|
216
|
+
"note": "none established — re-dispatch cold with the context restated"
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"key": "skillNames",
|
|
222
|
+
"label": "Skill names",
|
|
223
|
+
"modes": [
|
|
224
|
+
"prefixed",
|
|
225
|
+
"bare"
|
|
226
|
+
],
|
|
227
|
+
"values": {
|
|
228
|
+
"claude": {
|
|
229
|
+
"mode": "prefixed",
|
|
230
|
+
"note": "`leo:<name>`"
|
|
231
|
+
},
|
|
232
|
+
"codex": {
|
|
233
|
+
"mode": "prefixed",
|
|
234
|
+
"note": "`leo:<name>`"
|
|
235
|
+
},
|
|
236
|
+
"cursor": {
|
|
237
|
+
"mode": "prefixed",
|
|
238
|
+
"note": "`leo:<name>`"
|
|
239
|
+
},
|
|
240
|
+
"hermes": {
|
|
241
|
+
"mode": "prefixed",
|
|
242
|
+
"note": "`leo:<name>`"
|
|
243
|
+
},
|
|
244
|
+
"opencode": {
|
|
245
|
+
"mode": "bare",
|
|
246
|
+
"note": "bare `<name>` — read every `leo:<x>` above as `<x>`"
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
],
|
|
3
251
|
"skills": {
|
|
4
|
-
"claudeOnly": [
|
|
252
|
+
"claudeOnly": [
|
|
253
|
+
"attach-pr"
|
|
254
|
+
],
|
|
5
255
|
"exclude": {
|
|
6
256
|
"claude": [],
|
|
7
257
|
"cursor": [],
|
|
@@ -10,53 +260,149 @@
|
|
|
10
260
|
"opencode": []
|
|
11
261
|
},
|
|
12
262
|
"reasons": {
|
|
13
|
-
"attach-pr": "its entire
|
|
14
|
-
"resolve-ticket": "needs plugin-path placeholders, a pinned Claude model, and Claude-only subagent, worktree, and question tools",
|
|
15
|
-
"review-pr": "its whole mechanism is a script reached through a Claude-only skill-directory placeholder, plus a pinned Claude model",
|
|
16
|
-
"watch-review": "pinned Claude model, and it drives review-pr through Claude Code's own skill-invocation tool"
|
|
263
|
+
"attach-pr": "its entire product is a side effect in Claude Code Desktop's PR-card detector, which no other harness has — the same commands would run here, succeed, and produce nothing observable"
|
|
17
264
|
}
|
|
18
265
|
},
|
|
266
|
+
"visual": {
|
|
267
|
+
"claude": "the Browser pane (start or attach a preview, then take a screenshot), an attached Chrome, or the iOS Simulator control tool; some arrive only after a tool search, so an empty tool list is not proof of absence",
|
|
268
|
+
"codex": "the bundled browser plugin, else computer-use, else Playwright driven from the shell",
|
|
269
|
+
"cursor": "Browser Preview against a running dev server, else a Playwright server if one is registered",
|
|
270
|
+
"hermes": "no built-in renderer; Playwright driven from the shell is the only rung, and only when the project already depends on it",
|
|
271
|
+
"opencode": "no built-in renderer; a registered Playwright server or the Playwright CLI"
|
|
272
|
+
},
|
|
273
|
+
"memoryTarget": {
|
|
274
|
+
"claude": "the per-user `CLAUDE.md` in the Claude config directory",
|
|
275
|
+
"codex": "the per-user `AGENTS.md` in the Codex home directory",
|
|
276
|
+
"cursor": "a generated rules file in the per-user Cursor rules directory",
|
|
277
|
+
"hermes": "`SOUL.md` in the Hermes home, and only once `leo:setup enable hermes-memory` turns it on — that file is the agent's own identity prompt, so it is never written to unasked and never created",
|
|
278
|
+
"opencode": "the per-user `AGENTS.md` in the OpenCode config directory"
|
|
279
|
+
},
|
|
19
280
|
"roles": {
|
|
20
|
-
"expert":
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"
|
|
25
|
-
|
|
26
|
-
|
|
281
|
+
"expert": {
|
|
282
|
+
"tier": "fable",
|
|
283
|
+
"access": "read-only"
|
|
284
|
+
},
|
|
285
|
+
"planner": {
|
|
286
|
+
"tier": "opus",
|
|
287
|
+
"access": "read-only"
|
|
288
|
+
},
|
|
289
|
+
"investigator": {
|
|
290
|
+
"tier": "opus",
|
|
291
|
+
"access": "read-only"
|
|
292
|
+
},
|
|
293
|
+
"reviewer": {
|
|
294
|
+
"tier": "opus",
|
|
295
|
+
"access": "read-only"
|
|
296
|
+
},
|
|
297
|
+
"implementer": {
|
|
298
|
+
"tier": "sonnet",
|
|
299
|
+
"access": "write"
|
|
300
|
+
},
|
|
301
|
+
"executor": {
|
|
302
|
+
"tier": "haiku",
|
|
303
|
+
"access": "write"
|
|
304
|
+
},
|
|
305
|
+
"explore": {
|
|
306
|
+
"tier": "haiku",
|
|
307
|
+
"access": "read-only"
|
|
308
|
+
}
|
|
27
309
|
},
|
|
28
310
|
"harnesses": {
|
|
29
311
|
"claude": {
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
312
|
+
"title": "Claude Code",
|
|
313
|
+
"fable": {
|
|
314
|
+
"model": "fable",
|
|
315
|
+
"effort": "max"
|
|
316
|
+
},
|
|
317
|
+
"opus": {
|
|
318
|
+
"model": "opus"
|
|
319
|
+
},
|
|
320
|
+
"sonnet": {
|
|
321
|
+
"model": "sonnet"
|
|
322
|
+
},
|
|
323
|
+
"haiku": {
|
|
324
|
+
"model": "haiku"
|
|
325
|
+
}
|
|
34
326
|
},
|
|
35
327
|
"cursor": {
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
328
|
+
"title": "Cursor",
|
|
329
|
+
"fable": {
|
|
330
|
+
"model": "GPT-5.6 Sol"
|
|
331
|
+
},
|
|
332
|
+
"opus": {
|
|
333
|
+
"model": "Grok 4.5"
|
|
334
|
+
},
|
|
335
|
+
"sonnet": {
|
|
336
|
+
"model": "Grok 4.5"
|
|
337
|
+
},
|
|
338
|
+
"haiku": {
|
|
339
|
+
"model": "Composer 2.5"
|
|
340
|
+
}
|
|
40
341
|
},
|
|
41
342
|
"codex": {
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
343
|
+
"title": "Codex",
|
|
344
|
+
"fable": {
|
|
345
|
+
"model": "gpt-5.6-sol",
|
|
346
|
+
"effort": "max"
|
|
347
|
+
},
|
|
348
|
+
"opus": {
|
|
349
|
+
"model": "gpt-5.6-sol",
|
|
350
|
+
"effort": "high"
|
|
351
|
+
},
|
|
352
|
+
"sonnet": {
|
|
353
|
+
"model": "gpt-5.6-terra",
|
|
354
|
+
"effort": "medium"
|
|
355
|
+
},
|
|
356
|
+
"haiku": {
|
|
357
|
+
"model": "gpt-5.6-luna",
|
|
358
|
+
"effort": "low"
|
|
359
|
+
}
|
|
46
360
|
},
|
|
47
361
|
"hermes": {
|
|
362
|
+
"title": "Hermes",
|
|
48
363
|
"provider": "openrouter",
|
|
49
|
-
"fable": {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
364
|
+
"fable": {
|
|
365
|
+
"model": "moonshotai/kimi-k3"
|
|
366
|
+
},
|
|
367
|
+
"opus": {
|
|
368
|
+
"model": "moonshotai/kimi-k3"
|
|
369
|
+
},
|
|
370
|
+
"sonnet": {
|
|
371
|
+
"model": "z-ai/glm-5.2"
|
|
372
|
+
},
|
|
373
|
+
"haiku": {
|
|
374
|
+
"model": "z-ai/glm-5.2"
|
|
375
|
+
}
|
|
53
376
|
},
|
|
54
377
|
"opencode": {
|
|
378
|
+
"title": "OpenCode",
|
|
55
379
|
"provider": "openrouter",
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"
|
|
380
|
+
"absentTiers": [
|
|
381
|
+
"fable"
|
|
382
|
+
],
|
|
383
|
+
"adapter": {
|
|
384
|
+
"readOnlyPermission": {
|
|
385
|
+
"edit": "deny"
|
|
386
|
+
},
|
|
387
|
+
"writeBashDeny": [
|
|
388
|
+
"rm -rf ~",
|
|
389
|
+
"rm -rf ~/*",
|
|
390
|
+
"rm -rf /",
|
|
391
|
+
"rm -rf /*"
|
|
392
|
+
]
|
|
393
|
+
},
|
|
394
|
+
"fable": {
|
|
395
|
+
"model": "moonshotai/kimi-k3"
|
|
396
|
+
},
|
|
397
|
+
"opus": {
|
|
398
|
+
"model": "moonshotai/kimi-k3"
|
|
399
|
+
},
|
|
400
|
+
"sonnet": {
|
|
401
|
+
"model": "z-ai/glm-5.2"
|
|
402
|
+
},
|
|
403
|
+
"haiku": {
|
|
404
|
+
"model": "z-ai/glm-5.2"
|
|
405
|
+
}
|
|
60
406
|
}
|
|
61
407
|
}
|
|
62
408
|
}
|
package/hooks/session-start.py
CHANGED
|
@@ -72,6 +72,20 @@ def _breadcrumb(exc):
|
|
|
72
72
|
pass
|
|
73
73
|
|
|
74
74
|
|
|
75
|
+
def _memory_block(root):
|
|
76
|
+
"""Refresh the store, project it, and return the index for this project.
|
|
77
|
+
|
|
78
|
+
Imported rather than spawned: this hook has a 10-second budget and a
|
|
79
|
+
subprocess would spend a chunk of it on interpreter startup alone.
|
|
80
|
+
"""
|
|
81
|
+
scripts = os.path.join(root, "scripts")
|
|
82
|
+
if scripts not in sys.path:
|
|
83
|
+
sys.path.insert(0, scripts)
|
|
84
|
+
import memory
|
|
85
|
+
|
|
86
|
+
return memory.session(os.getcwd())
|
|
87
|
+
|
|
88
|
+
|
|
75
89
|
def main():
|
|
76
90
|
try:
|
|
77
91
|
root = _root()
|
|
@@ -98,6 +112,19 @@ def main():
|
|
|
98
112
|
|
|
99
113
|
wrapped = "<leo-policy>\n" + body + "\n</leo-policy>"
|
|
100
114
|
|
|
115
|
+
# Memory rides in its own envelope, appended after substitution: it is
|
|
116
|
+
# data, not policy, and keeping the two separable lets each be measured
|
|
117
|
+
# against the budget on its own. The nested handler is load-bearing —
|
|
118
|
+
# the outer one drops the entire policy, and a broken memory store must
|
|
119
|
+
# never cost the session its operating instructions.
|
|
120
|
+
try:
|
|
121
|
+
memory_block = _memory_block(root)
|
|
122
|
+
except Exception as exc:
|
|
123
|
+
_breadcrumb(exc)
|
|
124
|
+
memory_block = ""
|
|
125
|
+
if memory_block:
|
|
126
|
+
wrapped += "\n\n<leo-memory>\n" + memory_block.rstrip("\n") + "\n</leo-memory>"
|
|
127
|
+
|
|
101
128
|
if harness == "cursor":
|
|
102
129
|
output = {"additional_context": wrapped}
|
|
103
130
|
else:
|
package/package.json
CHANGED
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leos-agent",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.3.0",
|
|
4
4
|
"description": "Leo's agent operating policy: cost-tiered routing, subagent roles, review gates, guardrails.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "adapters/opencode/plugin.js",
|
|
7
|
-
"exports": {
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./adapters/opencode/plugin.js"
|
|
9
|
+
},
|
|
8
10
|
"license": "MIT",
|
|
9
|
-
"repository": {
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/foxhatleo/leos-agent.git"
|
|
14
|
+
},
|
|
10
15
|
"homepage": "https://github.com/foxhatleo/leos-agent",
|
|
11
|
-
"files": [
|
|
16
|
+
"files": [
|
|
17
|
+
"adapters/",
|
|
18
|
+
"config/",
|
|
19
|
+
"hooks/",
|
|
20
|
+
"roles/",
|
|
21
|
+
"scripts/",
|
|
22
|
+
"skills/",
|
|
23
|
+
"workflows/",
|
|
24
|
+
"settings.json"
|
|
25
|
+
],
|
|
12
26
|
"scripts": {
|
|
13
27
|
"//prepack": "A `files` whitelist overrides .npmignore for directory entries, so local test runs leak __pycache__/*.pyc into the tarball. Clear them before packing.",
|
|
14
28
|
"prepack": "find . -name __pycache__ -type d -prune -exec rm -rf {} +"
|
package/roles/executor.md
CHANGED
|
@@ -12,4 +12,4 @@ You are a fast, precise executor for mechanical tasks. You are given exact, well
|
|
|
12
12
|
- Return a terse report: what changed (file paths), what you verified and its result, and `confidence: high | medium | low`.
|
|
13
13
|
- Prefix that report with `status: done | concerns | needs-context | blocked` on its own first line — leo:delegation's four-state contract. The STOP case above is `needs-context` when the missing piece is one the orchestrator holds (an exact path, the intended name, a yes/no) and `blocked` when it is not (the instruction contradicts the code, or a check fails for reasons outside this task). Never guess your way to `done`. `confidence` still reports how sure you are of the edit itself.
|
|
14
14
|
|
|
15
|
-
Checks follow leo:verification: run fresh, read the actual output, report the evidence — not "should pass." If a supposedly mechanical change turns out to alter runtime behavior, leo:test-first applies; otherwise name the exemption rather than skipping silently.
|
|
15
|
+
Checks follow leo:verification: run fresh, read the actual output, report the evidence — not "should pass." If a supposedly mechanical change turns out to alter runtime behavior, leo:test-first applies; otherwise name the exemption rather than skipping silently. A call into a third-party API follows leo:freshness, and a change that alters what someone sees on screen follows leo:visual-verification.
|
package/roles/implementer.md
CHANGED
|
@@ -13,4 +13,4 @@ You are the implementer: you turn an approved plan into working code.
|
|
|
13
13
|
- Report: files changed (paths), checks run and results, deviations from the plan and why, `confidence: high | medium | low`. Your work will be reviewed at the Opus tier against the plan — flag anything uncertain rather than burying it.
|
|
14
14
|
- Prefix that report with `status: done | concerns | needs-context | blocked` on its own first line — leo:delegation's four-state contract. The stop-and-report cases above map onto it: architectural disagreement with the plan, or the same failure twice, is `blocked`; a missing path, decision, or credential the orchestrator can hand over is `needs-context`; `concerns` is plan executed but something wants a second look. `status` routes the orchestrator, `confidence` says how sure you are of the code — report both, always.
|
|
15
15
|
|
|
16
|
-
Execution follows leo:executing-plans — checkpoint per batch, one fix-then-re-review cycle, stop-and-report on architectural disagreement rather than pushing through. A behavior change defaults to leo:test-first with that skill's named exemptions; a change with no runtime behavior names the exemption instead of skipping silently. Every "checks pass" claim follows leo:verification — a fresh run, output actually read, not assumed.
|
|
16
|
+
Execution follows leo:executing-plans — checkpoint per batch, one fix-then-re-review cycle, stop-and-report on architectural disagreement rather than pushing through. A behavior change defaults to leo:test-first with that skill's named exemptions; a change with no runtime behavior names the exemption instead of skipping silently. Every "checks pass" claim follows leo:verification — a fresh run, output actually read, not assumed. A third-party surface follows leo:freshness — confirm the shape against the installed package or current docs before the call is written, or name the exemption. A change someone can see follows leo:visual-verification — a render produced after the edit, or the unverified warning instead of a done report.
|
package/roles/reviewer.md
CHANGED
|
@@ -19,6 +19,7 @@ What to judge, in order
|
|
|
19
19
|
5. Checks — were the claimed checks sufficient? Re-run one cheap decisive check if in doubt.
|
|
20
20
|
6. Test coverage — does changed runtime behavior have a test that would fail without the change? Missing coverage is a finding, blocking when the behavior is load-bearing.
|
|
21
21
|
7. Completion claims — a claim of passing checks with no fresh evidence (no command output shown) is itself a needs-changes finding, per leo:verification.
|
|
22
|
+
8. Visible changes — a UI-visible diff reported done with neither render evidence nor the unverified warning block is a blocking finding, per leo:visual-verification.
|
|
22
23
|
8. Secrets — a credential, token, private key, or `.env` value added to a tracked file is always a blocking finding, whether or not the task mentioned it. Check any new config, fixture, test data, or CI file the diff touches.
|
|
23
24
|
Style, naming, and hypothetical refactors are NOT findings.
|
|
24
25
|
|