loadouts 0.2.5 → 0.4.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 (209) hide show
  1. package/bundled/embedded/pi/loadouts-runtime.ts +19677 -0
  2. package/bundled/extensions/loadouts-runtime/index.ts +19677 -0
  3. package/bundled/extensions/loadouts-runtime/package.json +6 -0
  4. package/bundled/loadouts/opencode-runtime.yaml +5 -0
  5. package/bundled/loadouts/pi-runtime.yaml +5 -0
  6. package/bundled/opencode/plugins/loadouts/index.js +39198 -0
  7. package/bundled/opencode/plugins/loadouts/package.json +9 -0
  8. package/bundled/opencode/plugins/loadouts/tui.js +16913 -0
  9. package/dist/builtins/agent-transforms.d.ts.map +1 -1
  10. package/dist/builtins/agent-transforms.js +31 -9
  11. package/dist/builtins/agent-transforms.js.map +1 -1
  12. package/dist/builtins/index.d.ts.map +1 -1
  13. package/dist/builtins/index.js +18 -3
  14. package/dist/builtins/index.js.map +1 -1
  15. package/dist/builtins/kinds/extension-dir.d.ts +3 -0
  16. package/dist/builtins/kinds/extension-dir.d.ts.map +1 -0
  17. package/dist/builtins/kinds/extension-dir.js +8 -0
  18. package/dist/builtins/kinds/extension-dir.js.map +1 -0
  19. package/dist/builtins/kinds/opencode-cli-config.d.ts +3 -0
  20. package/dist/builtins/kinds/opencode-cli-config.d.ts.map +1 -0
  21. package/dist/builtins/kinds/opencode-cli-config.js +10 -0
  22. package/dist/builtins/kinds/opencode-cli-config.js.map +1 -0
  23. package/dist/builtins/kinds/opencode-command.d.ts +3 -0
  24. package/dist/builtins/kinds/opencode-command.d.ts.map +1 -0
  25. package/dist/builtins/kinds/opencode-command.js +8 -0
  26. package/dist/builtins/kinds/opencode-command.js.map +1 -0
  27. package/dist/builtins/kinds/opencode-plugin-dir.d.ts +3 -0
  28. package/dist/builtins/kinds/opencode-plugin-dir.d.ts.map +1 -0
  29. package/dist/builtins/kinds/opencode-plugin-dir.js +11 -0
  30. package/dist/builtins/kinds/opencode-plugin-dir.js.map +1 -0
  31. package/dist/builtins/kinds/opencode-plugin.js +1 -1
  32. package/dist/builtins/kinds/opencode-plugin.js.map +1 -1
  33. package/dist/builtins/tools/opencode.d.ts.map +1 -1
  34. package/dist/builtins/tools/opencode.js +13 -1
  35. package/dist/builtins/tools/opencode.js.map +1 -1
  36. package/dist/builtins/tools/pi.d.ts.map +1 -1
  37. package/dist/builtins/tools/pi.js +2 -1
  38. package/dist/builtins/tools/pi.js.map +1 -1
  39. package/dist/cli/commands/diff.d.ts +10 -0
  40. package/dist/cli/commands/diff.d.ts.map +1 -1
  41. package/dist/cli/commands/diff.js +71 -30
  42. package/dist/cli/commands/diff.js.map +1 -1
  43. package/dist/cli/commands/info.d.ts +10 -0
  44. package/dist/cli/commands/info.d.ts.map +1 -1
  45. package/dist/cli/commands/info.js +45 -1
  46. package/dist/cli/commands/info.js.map +1 -1
  47. package/dist/cli/commands/list.d.ts +18 -0
  48. package/dist/cli/commands/list.d.ts.map +1 -1
  49. package/dist/cli/commands/list.js +27 -0
  50. package/dist/cli/commands/list.js.map +1 -1
  51. package/dist/cli/commands/session.d.ts +3 -0
  52. package/dist/cli/commands/session.d.ts.map +1 -0
  53. package/dist/cli/commands/session.js +68 -0
  54. package/dist/cli/commands/session.js.map +1 -0
  55. package/dist/cli/commands/status.d.ts +10 -0
  56. package/dist/cli/commands/status.d.ts.map +1 -1
  57. package/dist/cli/commands/status.js +100 -2
  58. package/dist/cli/commands/status.js.map +1 -1
  59. package/dist/cli/commands/sync.d.ts.map +1 -1
  60. package/dist/cli/commands/sync.js +6 -0
  61. package/dist/cli/commands/sync.js.map +1 -1
  62. package/dist/cli/commands/tui.d.ts +3 -0
  63. package/dist/cli/commands/tui.d.ts.map +1 -0
  64. package/dist/cli/commands/tui.js +20 -0
  65. package/dist/cli/commands/tui.js.map +1 -0
  66. package/dist/cli/index.d.ts.map +1 -1
  67. package/dist/cli/index.js +4 -0
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/core/discovery.js +1 -1
  70. package/dist/core/discovery.js.map +1 -1
  71. package/dist/core/import-discovery.d.ts.map +1 -1
  72. package/dist/core/import-discovery.js +2 -0
  73. package/dist/core/import-discovery.js.map +1 -1
  74. package/dist/core/registry.d.ts +5 -0
  75. package/dist/core/registry.d.ts.map +1 -1
  76. package/dist/core/registry.js.map +1 -1
  77. package/dist/core/render.d.ts.map +1 -1
  78. package/dist/core/render.js +77 -8
  79. package/dist/core/render.js.map +1 -1
  80. package/dist/core/resolve.d.ts +1 -1
  81. package/dist/core/resolve.d.ts.map +1 -1
  82. package/dist/core/resolve.js +3 -2
  83. package/dist/core/resolve.js.map +1 -1
  84. package/dist/core/runtime.d.ts +4 -0
  85. package/dist/core/runtime.d.ts.map +1 -1
  86. package/dist/core/runtime.js +10 -3
  87. package/dist/core/runtime.js.map +1 -1
  88. package/dist/core/schema.d.ts +59 -0
  89. package/dist/core/schema.d.ts.map +1 -1
  90. package/dist/core/schema.js +5 -0
  91. package/dist/core/schema.js.map +1 -1
  92. package/dist/core/types.d.ts +13 -0
  93. package/dist/core/types.d.ts.map +1 -1
  94. package/dist/integrations/opencode/advertisement.d.ts +7 -0
  95. package/dist/integrations/opencode/advertisement.d.ts.map +1 -0
  96. package/dist/integrations/opencode/advertisement.js +17 -0
  97. package/dist/integrations/opencode/advertisement.js.map +1 -0
  98. package/dist/integrations/opencode/client.d.ts +12 -0
  99. package/dist/integrations/opencode/client.d.ts.map +1 -0
  100. package/dist/integrations/opencode/client.js +48 -0
  101. package/dist/integrations/opencode/client.js.map +1 -0
  102. package/dist/integrations/opencode/command.d.ts +11 -0
  103. package/dist/integrations/opencode/command.d.ts.map +1 -0
  104. package/dist/integrations/opencode/command.js +19 -0
  105. package/dist/integrations/opencode/command.js.map +1 -0
  106. package/dist/integrations/opencode/delta.d.ts +15 -0
  107. package/dist/integrations/opencode/delta.d.ts.map +1 -0
  108. package/dist/integrations/opencode/delta.js +75 -0
  109. package/dist/integrations/opencode/delta.js.map +1 -0
  110. package/dist/integrations/opencode/session.d.ts +207 -0
  111. package/dist/integrations/opencode/session.d.ts.map +1 -0
  112. package/dist/integrations/opencode/session.js +201 -0
  113. package/dist/integrations/opencode/session.js.map +1 -0
  114. package/dist/lib/gitignore.d.ts +7 -3
  115. package/dist/lib/gitignore.d.ts.map +1 -1
  116. package/dist/lib/gitignore.js +16 -6
  117. package/dist/lib/gitignore.js.map +1 -1
  118. package/dist/tui/core/actions.d.ts +8 -0
  119. package/dist/tui/core/actions.d.ts.map +1 -0
  120. package/dist/tui/core/actions.js +76 -0
  121. package/dist/tui/core/actions.js.map +1 -0
  122. package/dist/tui/core/controller.d.ts +28 -0
  123. package/dist/tui/core/controller.d.ts.map +1 -0
  124. package/dist/tui/core/controller.js +78 -0
  125. package/dist/tui/core/controller.js.map +1 -0
  126. package/dist/tui/core/data.d.ts +43 -0
  127. package/dist/tui/core/data.d.ts.map +1 -0
  128. package/dist/tui/core/data.js +161 -0
  129. package/dist/tui/core/data.js.map +1 -0
  130. package/dist/tui/core/host.d.ts +15 -0
  131. package/dist/tui/core/host.d.ts.map +1 -0
  132. package/dist/tui/core/host.js +2 -0
  133. package/dist/tui/core/host.js.map +1 -0
  134. package/dist/tui/core/intent.d.ts +95 -0
  135. package/dist/tui/core/intent.d.ts.map +1 -0
  136. package/dist/tui/core/intent.js +2 -0
  137. package/dist/tui/core/intent.js.map +1 -0
  138. package/dist/tui/core/keymap.d.ts +16 -0
  139. package/dist/tui/core/keymap.d.ts.map +1 -0
  140. package/dist/tui/core/keymap.js +68 -0
  141. package/dist/tui/core/keymap.js.map +1 -0
  142. package/dist/tui/core/model.d.ts +65 -0
  143. package/dist/tui/core/model.d.ts.map +1 -0
  144. package/dist/tui/core/model.js +34 -0
  145. package/dist/tui/core/model.js.map +1 -0
  146. package/dist/tui/core/selection.d.ts +12 -0
  147. package/dist/tui/core/selection.d.ts.map +1 -0
  148. package/dist/tui/core/selection.js +42 -0
  149. package/dist/tui/core/selection.js.map +1 -0
  150. package/dist/tui/core/theme.d.ts +15 -0
  151. package/dist/tui/core/theme.d.ts.map +1 -0
  152. package/dist/tui/core/theme.js +11 -0
  153. package/dist/tui/core/theme.js.map +1 -0
  154. package/dist/tui/core/update.d.ts +8 -0
  155. package/dist/tui/core/update.d.ts.map +1 -0
  156. package/dist/tui/core/update.js +206 -0
  157. package/dist/tui/core/update.js.map +1 -0
  158. package/dist/tui/core/view.d.ts +4 -0
  159. package/dist/tui/core/view.d.ts.map +1 -0
  160. package/dist/tui/core/view.js +162 -0
  161. package/dist/tui/core/view.js.map +1 -0
  162. package/dist/tui/core/viewport.d.ts +5 -0
  163. package/dist/tui/core/viewport.d.ts.map +1 -0
  164. package/dist/tui/core/viewport.js +33 -0
  165. package/dist/tui/core/viewport.js.map +1 -0
  166. package/dist/tui/core/viewspec.d.ts +49 -0
  167. package/dist/tui/core/viewspec.d.ts.map +1 -0
  168. package/dist/tui/core/viewspec.js +2 -0
  169. package/dist/tui/core/viewspec.js.map +1 -0
  170. package/dist/tui/hosts/pi/embed-entry.d.ts +3 -0
  171. package/dist/tui/hosts/pi/embed-entry.d.ts.map +1 -0
  172. package/dist/tui/hosts/pi/embed-entry.js +96 -0
  173. package/dist/tui/hosts/pi/embed-entry.js.map +1 -0
  174. package/dist/tui/hosts/pi/inject.d.ts +49 -0
  175. package/dist/tui/hosts/pi/inject.d.ts.map +1 -0
  176. package/dist/tui/hosts/pi/inject.js +31 -0
  177. package/dist/tui/hosts/pi/inject.js.map +1 -0
  178. package/dist/tui/hosts/standalone.d.ts +2 -0
  179. package/dist/tui/hosts/standalone.d.ts.map +1 -0
  180. package/dist/tui/hosts/standalone.js +109 -0
  181. package/dist/tui/hosts/standalone.js.map +1 -0
  182. package/dist/tui/skins/pi-tui/input.d.ts +5 -0
  183. package/dist/tui/skins/pi-tui/input.d.ts.map +1 -0
  184. package/dist/tui/skins/pi-tui/input.js +42 -0
  185. package/dist/tui/skins/pi-tui/input.js.map +1 -0
  186. package/dist/tui/skins/pi-tui/pi-theme-adapter.d.ts +4 -0
  187. package/dist/tui/skins/pi-tui/pi-theme-adapter.d.ts.map +1 -0
  188. package/dist/tui/skins/pi-tui/pi-theme-adapter.js +27 -0
  189. package/dist/tui/skins/pi-tui/pi-theme-adapter.js.map +1 -0
  190. package/dist/tui/skins/pi-tui/render.d.ts +38 -0
  191. package/dist/tui/skins/pi-tui/render.d.ts.map +1 -0
  192. package/dist/tui/skins/pi-tui/render.js +162 -0
  193. package/dist/tui/skins/pi-tui/render.js.map +1 -0
  194. package/dist/tui/skins/pi-tui/theme.d.ts +10 -0
  195. package/dist/tui/skins/pi-tui/theme.d.ts.map +1 -0
  196. package/dist/tui/skins/pi-tui/theme.js +58 -0
  197. package/dist/tui/skins/pi-tui/theme.js.map +1 -0
  198. package/docs/archive/opencode-v2-runtime-beta-18707.md +813 -0
  199. package/docs/authoring.md +69 -14
  200. package/docs/commands.md +24 -0
  201. package/docs/compatibility.md +8 -8
  202. package/docs/concepts.md +4 -2
  203. package/docs/opencode-v2-probes.md +253 -0
  204. package/docs/opencode-v2-runtime.md +129 -0
  205. package/docs/registry.md +1366 -0
  206. package/docs/runtime.md +115 -50
  207. package/docs/troubleshooting.md +20 -1
  208. package/docs/tui-architecture.md +503 -0
  209. package/package.json +17 -3
package/docs/runtime.md CHANGED
@@ -1,72 +1,137 @@
1
1
  # Runtime Activation (OpenCode First)
2
2
 
3
- `loadouts runtime` compiles loadouts into a session-time bundle without touching activated outputs on disk. Runtime v1 is designed as an OpenCode-first integration path and a reference surface for other tools.
4
-
5
- ## Why Runtime Exists
6
-
7
- - Keep activation side-effect free for agent sessions.
8
- - Reuse the existing resolver and include semantics from standard loadout compilation.
9
- - Make instruction/rule injection explicit and auditable in one JSON payload.
10
- - Expose skill directories as references (path discovery only), without claiming native skill hot-swap.
3
+ Equip loadouts globally, for a project, or for **one OpenCode session**.
4
+ Session switching uses OpenCode V2's durable instruction entries and permission
5
+ rules, so another session at the same directory is unaffected.
6
+
7
+ ## CLI
8
+
9
+ ```sh
10
+ loadouts session list
11
+ loadouts session status --session ses_...
12
+ loadouts session equip backend review --session ses_... -p
13
+ loadouts session equip caveman --session ses_... -g
14
+ loadouts session unequip --session ses_...
15
+ ```
11
16
 
12
- ## Architecture
17
+ `-g` and `-p` choose the **loadout source scope**; the destination is always the
18
+ named session. Omit `--session` to use the most recently updated root session at
19
+ the current directory. `--json` is available on every subcommand.
20
+ The CLI discovers an already-running authenticated service; start OpenCode first.
13
21
 
14
- Runtime activation follows a resolver-backed bundle compiler:
22
+ Session equips inject only instruction/rule content not already rendered by
23
+ intact Global/Project OpenCode outputs. Skill gates restrict native catalog skill
24
+ access to the selected loadout set while retaining pre-existing restrictions.
25
+ Unsupported session artifacts (commands, MCP, references, plugins) are reported
26
+ as diagnostics; equip those at Global/Project scope.
15
27
 
16
- 1. Resolve loadouts exactly like normal activation (`include`, source imports, bundled/global fallback, tool filtering).
17
- 2. Compile supported artifacts into a `RuntimeBundle`.
18
- 3. Return bundle JSON (`--json`) or a model-ready block (`--system-block`).
28
+ ## OpenCode dashboard
19
29
 
20
- Key properties:
30
+ Install the bundled integration at either filesystem scope:
21
31
 
22
- - Session-local state: caller owns lifecycle in memory/process state.
23
- - No persistent activation changes: runtime commands do not mutate `.loadouts/.state.json`.
24
- - No output rendering: runtime does not write `.opencode/`, `AGENTS.md`, or other tool target files.
25
- - Deterministic fingerprinting: `fingerprint` is stable across `generatedAt` changes for equivalent content.
32
+ ```sh
33
+ loadouts activate opencode-runtime -g
34
+ # or: loadouts activate opencode-runtime -l
35
+ ```
26
36
 
27
- ## OpenCode-First Flow
37
+ This renders the package directory `plugins/loadouts/`, containing the server and
38
+ TUI entries. Build from source with `npm run build` before activating a checkout.
28
39
 
29
- Use OpenCode as the primary runtime consumer in v1:
40
+ Inside OpenCode:
30
41
 
31
- ```bash
32
- # JSON bridge for plugin/session adapters
33
- loadouts runtime base backend --tool opencode --json
42
+ ```text
43
+ /loadouts dashboard (also ctrl+l)
44
+ /loadouts quick multi-select session equip
45
+ /loadouts equip caveman -g replace this session's set
46
+ /loadouts equip backend -p
47
+ /loadouts unequip
48
+ /loadouts status
49
+ /loadouts list
50
+ ```
34
51
 
35
- # Pre-rendered system block text
36
- loadouts runtime base backend --tool opencode --system-block
52
+ The dashboard shows **G / P / S** equipment and **All / Global / Project**
53
+ scope tabs. It opens on **All**. Tabs filter the catalog; in filesystem mode,
54
+ each row automatically equips into its own scope. The action target appears in
55
+ the detail pane. `m` switches **filesystem ↔ session** when a session is selected;
56
+ embedded dashboards open in session mode.
57
+
58
+ | Keys | Action |
59
+ |---|---|
60
+ | `j` / `k`, `↓` / `↑` | Move within a section |
61
+ | `h` / `l`, `←` / `→`, `Tab` / `Shift+Tab` | Previous / next section |
62
+ | `1` / `2` / `3` | Jump to Active / Available / Issues |
63
+ | `[` / `]` | Previous / next scope tab |
64
+ | `gg` / `G`, `Home` / `End` | First / last row |
65
+ | `Space`, `a` / `d` | Toggle, activate / deactivate the selected row |
66
+ | `m` | Switch filesystem / session mode |
67
+ | `s` / `x` / `D` | Sync / clear / diff the current target |
68
+ | `/`, `t` | Search, cycle tool filter |
69
+ | `Enter`, `e` | Expand artifacts, edit definition |
70
+ | `PgUp` / `PgDn` | Scroll artifact details (or the open overlay) |
71
+ | `u`, `r` | Undo last mutation, refresh |
72
+ | `?` | Help (`j` / `k` scroll) |
73
+ | `Esc` | Close overlay → clear filters → collapse detail → All tab → exit |
74
+ | `q` | Exit (or close the current overlay) |
75
+
76
+ Filesystem bulk operations use the selected tab. In **All**, a scope chooser
77
+ asks Global or Project (`h/l` or `j/k`, then `Enter`; `Esc` cancels). Search and
78
+ tool filters do not narrow bulk operations. In session mode, bulk actions target
79
+ the session's equipped set; a tab for the other source scope has no session
80
+ equipment to change. Equipping a session loadout from a different scope replaces
81
+ its previous source-scope set, and undo restores that set and scope.
82
+
83
+ Long sections keep the selected row visible, with row ranges in their headings.
84
+ The footer shows contextual shortcuts and updates from persisted session state
85
+ and native events.
86
+
87
+ The server plugin also filters skill advertisements (session permission denies
88
+ alone do not hide them on 2.0.3), provides off-disk skills through a catalog
89
+ transform, and supports headless equips.
90
+
91
+ Optional loadout selections:
92
+
93
+ ```yaml
94
+ name: review
95
+ include:
96
+ - instructions/AGENTS.review.md
97
+ opencode:
98
+ agent: reviewer
99
+ model:
100
+ providerID: anthropic
101
+ id: claude-sonnet-4-5
37
102
  ```
38
103
 
39
- Recommended integration pattern:
104
+ For automatic project session equips, add to `.loadouts/loadouts.yaml`:
40
105
 
41
- - Compile once when a session starts or active runtime loadouts change.
42
- - Cache by `fingerprint`.
43
- - Inject `instructions` and `rules` into model/system context.
44
- - Register `skills[*].path` for discovery only.
106
+ ```yaml
107
+ opencode:
108
+ defaultSession: [backend]
109
+ ```
45
110
 
46
- ## Tool Capability Matrix (Runtime v1)
111
+ ## Standalone and Pi
47
112
 
48
- The bundle always includes resolved instructions, rules, and skill references. Capability flags tell consumers what should be treated as native runtime behavior for each tool.
113
+ `loadouts tui` uses pi-tui and works without OpenCode. If a running service is
114
+ available, press `S` to select a conversation at the current directory, then use
115
+ session mode. Global/Project activation works independently of the service.
116
+ The standalone dashboard requires Node 22.19+.
49
117
 
50
- | Tool | Runtime mode | Instruction/rule model injection | Skill path discovery | Native skill hot-swap |
51
- |------|--------------|----------------------------------|----------------------|-----------------------|
52
- | OpenCode | `experimental-runtime` | Yes | Yes | No |
53
- | Pi | `native-runtime` | Yes | Yes | No |
54
- | Codex | `experimental-runtime` | Yes | Yes | No |
55
- | Claude Code | `filesystem-activation` | No | No | No |
56
- | Cursor | `filesystem-activation` | No (not native) | No | No |
118
+ Pi's bundled `loadouts-runtime` extension uses the same dashboard and layers.
119
+ Session equipment is persisted in Pi custom entries, keyed by the actual session
120
+ ID, and injected through `before_agent_start`. Resuming/switching a Pi session
121
+ reconstructs its own equipment. Pi skills remain path-discovery references.
57
122
 
58
- For filesystem-first tools, use standard `activate/sync` as the primary path and treat runtime output as inspection/debugging data.
123
+ ## Inspect compiled bundles
59
124
 
60
- ## Runtime v1 Limits
125
+ The existing compiler command remains useful independently of activation:
61
126
 
62
- - Supported kinds: `instruction`, `rule`, `skill`.
63
- - Agents are filesystem-rendered native definitions for supported harnesses; they are not injected through runtime v1.
64
- - Unsupported kinds are reported as diagnostics, not hard failures.
65
- - Skills require a `SKILL.md` entrypoint for runtime discovery metadata.
66
- - Runtime v1 does not implement native skill hot-swap.
127
+ ```sh
128
+ loadouts runtime base --tool opencode --json
129
+ loadouts runtime base --tool pi --system-block
130
+ ```
67
131
 
68
- ## Reference Scaffold
132
+ OpenCode supports native per-session instruction entries and skill gating, plus
133
+ location-wide skill hot reload. Pi supports session system-prompt injection.
134
+ Other tools retain their existing compiler/filesystem capability flags.
69
135
 
70
- - Example OpenCode plugin scaffold: `docs/examples/opencode-runtime-plugin.ts`
71
- - Core compiler implementation: `src/core/runtime.ts`
72
- - CLI command surface: `src/cli/commands/runtime.ts`
136
+ See [OpenCode V2 implementation details](opencode-v2-runtime.md) for ownership,
137
+ rollback, concurrency limits, cache behavior, probes and verification scripts.
@@ -51,7 +51,26 @@ loadouts sync # Re-render if needed
51
51
 
52
52
  **Cursor:** Rules need `.mdc` extension — loadouts handles this automatically. Restart Cursor if rules don't appear immediately.
53
53
 
54
- **OpenCode:** Rules render to `.opencode/rules/`. Local plugins render to `.opencode/plugins/`, and NPM plugins are configured with the `plugin` array in `opencode.json(c)`.
54
+ **OpenCode V2:** Rules render to `.opencode/rules/`, commands to `.opencode/commands/`, local plugins to `.opencode/plugins/`, and NPM plugins are configured with the `plugins` array in `opencode.json(c)`. Global instructions render to `~/.config/opencode/AGENTS.md`. OpenCode hot-reloads these sources.
55
+
56
+ ### `/loadouts` not working in OpenCode runtime
57
+
58
+ 1. Verify `plugins/loadouts/{package.json,index.js,tui.js}` exists under the
59
+ project's `.opencode/` or global `~/.config/opencode/` directory.
60
+ 2. Check `loadouts info -l` or `loadouts info -g` for `opencode-runtime` and
61
+ `loadouts status` for shadowed/missing output. A source checkout needs
62
+ `npm run build` before activation.
63
+ 3. Open OpenCode's Plugins dialog and inspect the server/TUI entries. Local
64
+ plugin directories do not install server dependencies; use the built,
65
+ self-contained artifact rather than copying `src/tui/hosts/opencode/`.
66
+ 4. Test the independent HTTP path with
67
+ `loadouts session status --session ses_...`.
68
+ 5. `/loadouts` and `ctrl+l` are client-side commands. The server entry is needed
69
+ for clean per-session skill advertisements; native permission denies alone
70
+ still leave skills listed on OpenCode 2.0.3.
71
+
72
+ If permissions were edited after equip, unequip preserves those edits and reports
73
+ it. See [runtime ownership and recovery](opencode-v2-runtime.md#persistence-and-ownership).
55
74
 
56
75
  **Claude Code:** Verify rules exist in `.claude/rules/`. May require restarting the session.
57
76