leos-agent 7.0.0 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +544 -28
  2. package/commands/handoff.md +11 -0
  3. package/commands/handon.md +10 -0
  4. package/commands/review-pr.md +9 -0
  5. package/commands-claude/watch-review.md +9 -0
  6. package/index.js +12 -0
  7. package/package.json +29 -14
  8. package/payload/codex-agents/leo-executor.toml +36 -0
  9. package/payload/codex-agents/leo-runner.toml +28 -0
  10. package/rules/preferences.md +97 -0
  11. package/scripts/check.py +244 -0
  12. package/scripts/ghreview.py +17 -3
  13. package/scripts/handoff.py +183 -0
  14. package/scripts/leo-install.py +509 -0
  15. package/scripts/measure_context.py +113 -0
  16. package/scripts/publish-npm.py +138 -0
  17. package/scripts/watch_review.py +169 -0
  18. package/skills/doctor/SKILL.md +73 -115
  19. package/skills/doctor/agents/openai.yaml +5 -0
  20. package/skills/handoff/SKILL.md +99 -0
  21. package/skills/handoff/agents/openai.yaml +5 -0
  22. package/skills/handon/SKILL.md +61 -0
  23. package/skills/install/SKILL.md +79 -0
  24. package/skills/install/agents/openai.yaml +5 -0
  25. package/skills/review-pr/SKILL.md +59 -318
  26. package/skills/review-pr/reference/lenses.md +67 -0
  27. package/skills/review-pr/reference/procedure.md +348 -0
  28. package/skills-claude/attach-pr/SKILL.md +178 -0
  29. package/skills-claude/watch-review/SKILL.md +91 -0
  30. package/adapters/cursor/agents/executor.md +0 -17
  31. package/adapters/cursor/agents/expert.md +0 -70
  32. package/adapters/cursor/agents/explore.md +0 -16
  33. package/adapters/cursor/agents/implementer.md +0 -18
  34. package/adapters/cursor/agents/investigator.md +0 -18
  35. package/adapters/cursor/agents/planner.md +0 -28
  36. package/adapters/cursor/agents/review-lens.md +0 -22
  37. package/adapters/cursor/agents/reviewer.md +0 -34
  38. package/adapters/opencode/agents.json +0 -105
  39. package/adapters/opencode/plugin.js +0 -576
  40. package/config/MCP_PINS.md +0 -17
  41. package/config/models.json +0 -676
  42. package/hooks/bash-guard.py +0 -583
  43. package/hooks/cursor-guard.py +0 -84
  44. package/hooks/hooks-cursor.json +0 -11
  45. package/hooks/hooks.json +0 -20
  46. package/hooks/session-start.py +0 -148
  47. package/roles/executor.md +0 -15
  48. package/roles/expert.md +0 -67
  49. package/roles/explore.md +0 -13
  50. package/roles/implementer.md +0 -16
  51. package/roles/investigator.md +0 -15
  52. package/roles/planner.md +0 -25
  53. package/roles/review-lens.md +0 -20
  54. package/roles/reviewer.md +0 -31
  55. package/scripts/doctor.py +0 -520
  56. package/scripts/jsonc_bridge.cjs +0 -23
  57. package/scripts/memory.py +0 -744
  58. package/scripts/render_adapters.py +0 -508
  59. package/scripts/setup.py +0 -1753
  60. package/settings.json +0 -7
  61. package/skills/.gitkeep +0 -0
  62. package/skills/brainstorming/SKILL.md +0 -111
  63. package/skills/debugging/SKILL.md +0 -100
  64. package/skills/delegation/SKILL.md +0 -143
  65. package/skills/executing-plans/SKILL.md +0 -117
  66. package/skills/finishing-a-branch/SKILL.md +0 -125
  67. package/skills/freshness/SKILL.md +0 -131
  68. package/skills/memory/SKILL.md +0 -154
  69. package/skills/resolve-ticket/SKILL.md +0 -275
  70. package/skills/setup/SKILL.md +0 -199
  71. package/skills/setup/agents/openai.yaml +0 -5
  72. package/skills/test-first/SKILL.md +0 -92
  73. package/skills/using-leo/SKILL.md +0 -101
  74. package/skills/using-leo/references/claude-mapping.md +0 -33
  75. package/skills/using-leo/references/codex-mapping.md +0 -33
  76. package/skills/using-leo/references/cursor-mapping.md +0 -35
  77. package/skills/using-leo/references/hermes-mapping.md +0 -37
  78. package/skills/using-leo/references/opencode-mapping.md +0 -39
  79. package/skills/verification/SKILL.md +0 -110
  80. package/skills/visual-verification/SKILL.md +0 -115
  81. package/skills/watch-review/SKILL.md +0 -128
  82. package/skills/watch-review/agents/openai.yaml +0 -5
  83. package/skills/worktrees/SKILL.md +0 -131
  84. package/skills/writing-plans/SKILL.md +0 -97
  85. package/skills/writing-skills/SKILL.md +0 -141
  86. package/vendor/jsonc-parser-3.3.1/LICENSE.md +0 -21
  87. package/vendor/jsonc-parser-3.3.1/README.md +0 -26
  88. package/vendor/jsonc-parser-3.3.1/lib/umd/impl/edit.js +0 -201
  89. package/vendor/jsonc-parser-3.3.1/lib/umd/impl/format.js +0 -275
  90. package/vendor/jsonc-parser-3.3.1/lib/umd/impl/parser.js +0 -682
  91. package/vendor/jsonc-parser-3.3.1/lib/umd/impl/scanner.js +0 -456
  92. package/vendor/jsonc-parser-3.3.1/lib/umd/impl/string-intern.js +0 -42
  93. package/vendor/jsonc-parser-3.3.1/lib/umd/main.d.ts +0 -351
  94. package/vendor/jsonc-parser-3.3.1/lib/umd/main.js +0 -194
  95. package/vendor/jsonc-parser-3.3.1/package.json +0 -37
  96. package/workflows/cost-tiered-fix.js +0 -287
@@ -1,676 +0,0 @@
1
- {
2
- "schemaVersion": 4,
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": "native edit denial — the tool allowlist omits Write and Edit; Bash remains shell-capable, so the read-only prompt and permission constraints are not a hard sandbox"
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": "native edit denial — generated `permission.edit: deny`, refused by OpenCode itself; Bash remains shell-capable, so the read-only prompt and permissions are not a hard sandbox"
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": "tool",
204
- "note": "`followup_task` to the same live agent; it retains the context it already built"
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
- "hyphenated",
226
- "bare"
227
- ],
228
- "values": {
229
- "claude": {
230
- "mode": "prefixed",
231
- "note": "`leo:<name>`"
232
- },
233
- "codex": {
234
- "mode": "prefixed",
235
- "note": "`leo:<name>`"
236
- },
237
- "cursor": {
238
- "mode": "prefixed",
239
- "note": "`leo:<name>`"
240
- },
241
- "hermes": {
242
- "mode": "prefixed",
243
- "note": "`leo:<name>`"
244
- },
245
- "opencode": {
246
- "mode": "hyphenated",
247
- "note": "`leo-<name>` — OpenCode has no skill namespace, so the adapter registers a renamed copy; read every `leo:<x>` above as `leo-<x>`"
248
- }
249
- }
250
- },
251
- {
252
- "key": "askQuestion",
253
- "label": "Structured question to the user",
254
- "modes": [
255
- "tool",
256
- "none",
257
- "unknown"
258
- ],
259
- "values": {
260
- "claude": {
261
- "mode": "tool",
262
- "note": "`AskUserQuestion` — multi-choice, optional multi-select"
263
- },
264
- "codex": {
265
- "mode": "tool",
266
- "note": "Plan mode `request_user_input` — structured multiple-choice questions; outside Plan mode ask in plain text and default to changing nothing"
267
- },
268
- "cursor": {
269
- "mode": "unknown",
270
- "note": "none established — ask in plain text and default to changing nothing"
271
- },
272
- "hermes": {
273
- "mode": "unknown",
274
- "note": "none established — ask in plain text and default to changing nothing"
275
- },
276
- "opencode": {
277
- "mode": "tool",
278
- "note": "native `question` tool — multi-choice, single or multi-select"
279
- }
280
- }
281
- }
282
- ],
283
- "skills": {
284
- "operational": [
285
- "resolve-ticket",
286
- "review-pr",
287
- "watch-review",
288
- "setup"
289
- ],
290
- "claudeOnly": [
291
- "attach-pr"
292
- ],
293
- "exclude": {
294
- "claude": [],
295
- "cursor": [],
296
- "codex": [],
297
- "hermes": [],
298
- "opencode": []
299
- },
300
- "reasons": {
301
- "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"
302
- }
303
- },
304
- "mcp": {
305
- "_comment": "Servers leo:setup installs, and the vendor connectors it can offer. Every connector endpoint was confirmed against a vendor-owned documentation page; an endpoint nobody could confirm does not belong here.",
306
- "servers": {
307
- "context7": {
308
- "label": "Context7 — library documentation",
309
- "transport": "stdio",
310
- "command": [
311
- "npx",
312
- "-y",
313
- "@upstash/context7-mcp@3.2.5"
314
- ],
315
- "exactVersion": "@upstash/context7-mcp@3.2.5",
316
- "registration": "automatic",
317
- "prerequisites": ["Node.js", "npx available on PATH"],
318
- "auth": "none",
319
- "authNote": "keyless; set CONTEXT7_API_KEY for higher rate limits"
320
- },
321
- "playwright": {
322
- "label": "Playwright — browser automation",
323
- "transport": "stdio",
324
- "command": [
325
- "npx",
326
- "-y",
327
- "@playwright/mcp@0.0.78"
328
- ],
329
- "exactVersion": "@playwright/mcp@0.0.78",
330
- "registration": "automatic",
331
- "prerequisites": ["Node.js", "npx available on PATH"],
332
- "auth": "none",
333
- "authNote": "browsers may need `npx playwright install chromium` on first use"
334
- },
335
- "chrome-devtools": {
336
- "label": "Chrome DevTools — live page inspection",
337
- "transport": "stdio",
338
- "command": [
339
- "npx",
340
- "-y",
341
- "chrome-devtools-mcp@1.6.0"
342
- ],
343
- "exactVersion": "chrome-devtools-mcp@1.6.0",
344
- "registration": "automatic",
345
- "prerequisites": ["Node.js", "npx available on PATH"],
346
- "auth": "none",
347
- "authNote": ""
348
- },
349
- "duckduckgo": {
350
- "label": "DuckDuckGo — web search",
351
- "transport": "stdio",
352
- "command": [
353
- "uvx",
354
- "duckduckgo-mcp-server==0.5.0"
355
- ],
356
- "exactVersion": "duckduckgo-mcp-server==0.5.0",
357
- "registration": "automatic",
358
- "prerequisites": ["uv or uvx available on PATH"],
359
- "auth": "none",
360
- "authNote": "needs uvx on PATH"
361
- }
362
- },
363
- "core": {
364
- "_comment": "Browser and search servers only where the harness has no native equivalent. Claude Code has Claude_Browser + WebSearch/WebFetch; Codex has browser_use/in_app_browser/computer_use and a native web_search; Cursor has Browser Preview.",
365
- "claude": [
366
- "context7"
367
- ],
368
- "codex": [
369
- "context7"
370
- ],
371
- "cursor": [
372
- "context7"
373
- ],
374
- "hermes": [
375
- "context7",
376
- "playwright",
377
- "chrome-devtools",
378
- "duckduckgo"
379
- ],
380
- "opencode": [
381
- "context7",
382
- "playwright",
383
- "chrome-devtools",
384
- "duckduckgo"
385
- ]
386
- },
387
- "gating": {
388
- "_comment": "OpenCode alone can gate MCP tools per agent. Heavy servers off globally, on only for the roles whose prompts actually reach for them.",
389
- "opencode": {
390
- "off": [
391
- "context7",
392
- "playwright",
393
- "chrome-devtools"
394
- ],
395
- "agents": {
396
- "build": [
397
- "context7",
398
- "playwright",
399
- "chrome-devtools"
400
- ],
401
- "leo-investigator": [
402
- "context7",
403
- "chrome-devtools"
404
- ],
405
- "leo-planner": [
406
- "context7"
407
- ],
408
- "leo-implementer": [
409
- "context7",
410
- "playwright",
411
- "chrome-devtools"
412
- ]
413
- }
414
- }
415
- },
416
- "connectors": [
417
- {
418
- "key": "slack",
419
- "label": "Slack",
420
- "url": "https://mcp.slack.com/mcp",
421
- "transport": "http",
422
- "auth": "manual-oauth",
423
- "registration": "manual",
424
- "prerequisites": ["Slack workspace admin approval for the MCP client", "a Slack account authorized for the workspace"],
425
- "authNote": "a workspace admin must approve the MCP client for the workspace first"
426
- },
427
- {
428
- "key": "sentry",
429
- "label": "Sentry",
430
- "url": "https://mcp.sentry.dev/mcp",
431
- "transport": "http",
432
- "auth": "oauth",
433
- "registration": "automatic",
434
- "prerequisites": ["Sentry organization access"],
435
- "authNote": "browser consent against your Sentry org, or a user auth token"
436
- },
437
- {
438
- "key": "honeycomb",
439
- "label": "Honeycomb",
440
- "url": "https://mcp.honeycomb.io/mcp",
441
- "transport": "http",
442
- "auth": "oauth",
443
- "registration": "automatic",
444
- "prerequisites": ["Honeycomb Intelligence enrollment"],
445
- "authNote": "the team must be enrolled in Honeycomb Intelligence"
446
- },
447
- {
448
- "key": "snowflake",
449
- "label": "Snowflake",
450
- "url": "",
451
- "urlTemplate": "https://<org>-<account>.snowflakecomputing.com/api/v2/databases/<database>/schemas/<schema>/mcp-servers/<name>",
452
- "transport": "http",
453
- "auth": "manual-oauth",
454
- "registration": "manual",
455
- "prerequisites": ["account-specific server URL", "Snowflake OAuth or programmatic access token"],
456
- "authNote": "account-specific URL — must be supplied, never guessed; OAuth or a programmatic access token"
457
- },
458
- {
459
- "key": "launchdarkly",
460
- "label": "LaunchDarkly",
461
- "url": "https://mcp.launchdarkly.com/mcp/launchdarkly",
462
- "transport": "http",
463
- "auth": "oauth",
464
- "registration": "automatic",
465
- "prerequisites": ["LaunchDarkly project access"],
466
- "authNote": "browser consent on first connect"
467
- },
468
- {
469
- "key": "linear",
470
- "label": "Linear",
471
- "url": "https://mcp.linear.app/mcp",
472
- "transport": "http",
473
- "auth": "oauth",
474
- "registration": "automatic",
475
- "prerequisites": ["Linear workspace access"],
476
- "authNote": "OAuth 2.1 with dynamic client registration"
477
- },
478
- {
479
- "key": "atlassian",
480
- "label": "Jira + Confluence (Atlassian Rovo)",
481
- "url": "https://mcp.atlassian.com/v1/mcp/authv2",
482
- "transport": "http",
483
- "auth": "manual-oauth",
484
- "registration": "manual",
485
- "prerequisites": ["Atlassian organization access"],
486
- "authNote": "one server covers Jira, Confluence, JSM, Bitbucket and Compass"
487
- },
488
- {
489
- "key": "gmail",
490
- "label": "Gmail",
491
- "url": "https://gmailmcp.googleapis.com/mcp/v1",
492
- "transport": "http",
493
- "auth": "manual-oauth",
494
- "registration": "manual",
495
- "prerequisites": ["Google Cloud project with Gmail MCP enabled", "Google OAuth consent and Gmail account authorization"],
496
- "authNote": "Google OAuth consent"
497
- },
498
- {
499
- "key": "gdrive",
500
- "label": "Google Drive",
501
- "url": "https://drivemcp.googleapis.com/mcp/v1",
502
- "transport": "http",
503
- "auth": "manual-oauth",
504
- "registration": "manual",
505
- "prerequisites": ["Google Cloud project with Drive MCP enabled", "Google OAuth consent and Drive account authorization"],
506
- "authNote": "Google OAuth consent"
507
- },
508
- {
509
- "key": "granola",
510
- "label": "Granola",
511
- "url": "https://mcp.granola.ai/mcp",
512
- "transport": "http",
513
- "auth": "oauth",
514
- "registration": "automatic",
515
- "prerequisites": ["Granola account access"],
516
- "authNote": "browser consent on first connect"
517
- },
518
- {
519
- "key": "vercel",
520
- "label": "Vercel",
521
- "url": "https://mcp.vercel.com",
522
- "transport": "http",
523
- "auth": "oauth",
524
- "registration": "automatic",
525
- "prerequisites": ["Vercel account access"],
526
- "authNote": "browser consent on first connect"
527
- }
528
- ]
529
- },
530
- "visual": {
531
- "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",
532
- "codex": "the bundled browser plugin, else computer-use, else Playwright driven from the shell",
533
- "cursor": "Browser Preview against a running dev server, else a Playwright server if one is registered",
534
- "hermes": "no built-in renderer; Playwright driven from the shell is the only rung, and only when the project already depends on it",
535
- "opencode": "no built-in renderer; a registered Playwright server or the Playwright CLI"
536
- },
537
- "memoryTarget": {
538
- "claude": "the per-user `CLAUDE.md` in the Claude config directory",
539
- "codex": "the per-user `AGENTS.md` in the Codex home directory",
540
- "cursor": "a generated rules file in the per-user Cursor rules directory",
541
- "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",
542
- "opencode": "the per-user `AGENTS.md` in the OpenCode config directory"
543
- },
544
- "roles": {
545
- "expert": {
546
- "tier": "fable",
547
- "access": "read-only"
548
- },
549
- "planner": {
550
- "tier": "opus",
551
- "access": "read-only"
552
- },
553
- "investigator": {
554
- "tier": "opus",
555
- "access": "read-only"
556
- },
557
- "reviewer": {
558
- "tier": "opus",
559
- "access": "read-only"
560
- },
561
- "review-lens": {
562
- "tier": "sonnet",
563
- "access": "read-only"
564
- },
565
- "implementer": {
566
- "tier": "sonnet",
567
- "access": "write"
568
- },
569
- "executor": {
570
- "tier": "haiku",
571
- "access": "write"
572
- },
573
- "explore": {
574
- "tier": "haiku",
575
- "access": "read-only"
576
- }
577
- },
578
- "harnesses": {
579
- "claude": {
580
- "title": "Claude Code",
581
- "fable": {
582
- "model": "fable",
583
- "effort": "max"
584
- },
585
- "opus": {
586
- "model": "opus"
587
- },
588
- "sonnet": {
589
- "model": "sonnet"
590
- },
591
- "haiku": {
592
- "model": "haiku"
593
- }
594
- },
595
- "cursor": {
596
- "title": "Cursor",
597
- "fable": {
598
- "model": "GPT-5.6 Sol"
599
- },
600
- "opus": {
601
- "model": "Grok 4.5"
602
- },
603
- "sonnet": {
604
- "model": "Grok 4.5"
605
- },
606
- "haiku": {
607
- "model": "Composer 2.5"
608
- }
609
- },
610
- "codex": {
611
- "title": "Codex",
612
- "fable": {
613
- "model": "gpt-5.6-sol",
614
- "effort": "max"
615
- },
616
- "opus": {
617
- "model": "gpt-5.6-sol",
618
- "effort": "high"
619
- },
620
- "sonnet": {
621
- "model": "gpt-5.6-terra",
622
- "effort": "medium"
623
- },
624
- "haiku": {
625
- "model": "gpt-5.6-terra",
626
- "effort": "low"
627
- }
628
- },
629
- "hermes": {
630
- "title": "Hermes",
631
- "provider": "openrouter",
632
- "fable": {
633
- "model": "moonshotai/kimi-k3"
634
- },
635
- "opus": {
636
- "model": "moonshotai/kimi-k3"
637
- },
638
- "sonnet": {
639
- "model": "z-ai/glm-5.2"
640
- },
641
- "haiku": {
642
- "model": "z-ai/glm-5.2"
643
- }
644
- },
645
- "opencode": {
646
- "title": "OpenCode",
647
- "provider": "openrouter",
648
- "absentTiers": [
649
- "fable"
650
- ],
651
- "adapter": {
652
- "readOnlyPermission": {
653
- "edit": "deny"
654
- },
655
- "writeBashDeny": [
656
- "rm -rf ~",
657
- "rm -rf ~/*",
658
- "rm -rf /",
659
- "rm -rf /*"
660
- ]
661
- },
662
- "fable": {
663
- "model": "moonshotai/kimi-k3"
664
- },
665
- "opus": {
666
- "model": "moonshotai/kimi-k3"
667
- },
668
- "sonnet": {
669
- "model": "z-ai/glm-5.2"
670
- },
671
- "haiku": {
672
- "model": "z-ai/glm-5.2"
673
- }
674
- }
675
- }
676
- }