@explyt/ai-agent 0.3.0 → 0.3.1-dogfood.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +3 -3
  2. package/THIRD-PARTY-NOTICES.md +187 -18
  3. package/agent-docs/README.md +5 -0
  4. package/agent-docs/mcp.md +14 -1
  5. package/agent-docs/plugins.md +30 -8
  6. package/agent-docs/rules.md +38 -9
  7. package/agent-docs/settings.md +10 -8
  8. package/agent-docs/skills.md +17 -3
  9. package/dist/cli/engine.js +20 -4
  10. package/dist/cli/index.js +28 -3
  11. package/dist/cli/install-health.js +33 -6
  12. package/dist/cli/install-output.js +14 -0
  13. package/dist/cli/install-resolve.js +11 -1
  14. package/dist/cli/install-run.js +7 -4
  15. package/dist/cli/install-switch.js +6 -1
  16. package/dist/cli/plugin.js +1 -0
  17. package/dist/cli/update-env.js +7 -0
  18. package/dist/cli/update.js +2 -1
  19. package/dist/extensions/ask-user-question.js +1 -1
  20. package/dist/extensions/bash.js +1 -1
  21. package/dist/extensions/custom-provider.js +1 -1
  22. package/dist/extensions/hello.js +1 -1
  23. package/dist/extensions/identity.js +1 -1
  24. package/dist/extensions/mcp.js +1 -1
  25. package/dist/extensions/misc-hacks.js +1 -1
  26. package/dist/extensions/plugins.js +1 -0
  27. package/dist/extensions/policy.js +1 -1
  28. package/dist/extensions/rules.js +1 -1
  29. package/dist/extensions/session-title.js +1 -1
  30. package/dist/extensions/skills.js +1 -1
  31. package/dist/extensions/subagents.js +1 -1
  32. package/dist/extensions/tool-rows.js +1 -0
  33. package/dist/extensions/tui.js +1 -1
  34. package/dist/extensions/update-notice.js +1 -1
  35. package/dist/extensions/web-access.js +1 -1
  36. package/dist/extensions/write.js +1 -1
  37. package/dist/install/installer.js +272 -1002
  38. package/dist/mcp-adapter.js +232 -152
  39. package/dist/rpiv-ask-user-question/{chunk-JNDW3P3A.js → chunk-BG227QOM.js} +13 -13
  40. package/dist/rpiv-ask-user-question/index.js +2 -2
  41. package/dist/vendor/minimatch.js +1889 -0
  42. package/dist/vendor/pi-coding-agent.js +2 -9
  43. package/dist/vendor/pi-mcp-adapter-types.js +347 -0
  44. package/dist/vendor/pi-tui.js +13587 -0
  45. package/dist/vendor/pi-web-access.js +1 -1
  46. package/dist/vendor/semver.js +2082 -0
  47. package/dist/vendor/yaml.js +7404 -0
  48. package/dist/vendor/yauzl.js +1407 -0
  49. package/dist/vendor/zod.js +19940 -0
  50. package/package.json +3 -8
package/README.md CHANGED
@@ -17,8 +17,8 @@ explyt update # install the newer latest, then restart open sessi
17
17
  For a one-off pinned run:
18
18
 
19
19
  ```bash
20
- npx -y "@explyt/ai-agent@0.3.0" # start the terminal UI
21
- npx -y "@explyt/ai-agent@0.3.0" login # store a provider credential, once
20
+ npx -y "@explyt/ai-agent@0.3.1" # start the terminal UI
21
+ npx -y "@explyt/ai-agent@0.3.1" login # store a provider credential, once
22
22
  ```
23
23
 
24
24
  The agent runs with exactly the extensions this build ships with and ignores any
@@ -28,4 +28,4 @@ you get.
28
28
  IDE (ACP) integration is not part of this package: it is provided by the Explyt
29
29
  managed backend, which the Neo plugin downloads and manages.
30
30
 
31
- Run `npx -y @explyt/ai-agent@0.3.0 --help` for the available options.
31
+ Run `npx -y @explyt/ai-agent@0.3.1 --help` for the available options.
@@ -88,7 +88,17 @@ License or other written license agreements with the Company.
88
88
  - The public npm package contains `dist/mcp-adapter.js`, an unobfuscated compilation of
89
89
  the unmodified `pi-mcp-adapter` entrypoint (`index.ts`) together with the package's
90
90
  small runtime helper files, so that Node can load it outside the engine's TypeScript
91
- loader.
91
+ loader. The compilation also inlines the package's own runtime dependencies except
92
+ `recheck`, `@napi-rs/keyring`, `open` and `@modelcontextprotocol/ext-apps`, which npm
93
+ installs beside it; each inlined package is listed with its copyright notice in the
94
+ generated "Packages compiled into this package's own files" section at the end of this file.
95
+ - The public npm package contains `dist/vendor/pi-tui.js` and `dist/vendor/pi-mcp-adapter-types.js`:
96
+ unobfuscated compilations of the unmodified `@earendil-works/pi-tui` (with its dependencies)
97
+ and of `pi-mcp-adapter`'s `types` entry, each carrying the package's name, version, licence
98
+ and copyright in a banner. `@earendil-works/pi-tui` ships no licence file; its notice is
99
+ the one in the pi repository's `LICENSE` at the tag of the compiled version
100
+ (`https://github.com/earendil-works/pi/blob/v<version>/LICENSE`, Copyright (c) 2025 Mario
101
+ Zechner, MIT).
92
102
  - The public npm package contains `dist/vendor/pi-web-access.js`, an unobfuscated
93
103
  compilation of the unmodified `pi-web-access` entrypoint (`dist/index.js`) carrying the
94
104
  package's name, version and licence in a banner, so that its imports of the engine and
@@ -142,7 +152,7 @@ License or other written license agreements with the Company.
142
152
  - local Explyt extension with current `@earendil-works` imports
143
153
  - shell API-key execution removed; credential files use locked atomic writes and private permissions
144
154
 
145
- ### 5. model-probe, @opencode-ai/models, yaml, minimatch, semver and typebox
155
+ ### 5. model-probe, @opencode-ai/models, yaml, minimatch, semver, typebox and yauzl
146
156
 
147
157
  - `model-probe` 0.6.0, MIT, https://www.npmjs.com/package/model-probe
148
158
  - Copyright (c) 2025 ratatulieoi
@@ -158,14 +168,21 @@ License or other written license agreements with the Company.
158
168
  - `typebox` (the version pinned in the development manifest, which the build compiles; the
159
169
  build-time metadata below and each compiled file's banner name it), MIT, https://www.npmjs.com/package/typebox
160
170
  - Copyright (c) 2017-2026 Haydn Paterson
161
-
162
- `model-probe` and `typebox` are also redistributed compiled, unobfuscated and unmodified:
163
- the public npm package contains `dist/vendor/model-probe/` (the installed `model-probe`
164
- compiled from its TypeScript, with its `rules.json`) and `dist/vendor/typebox/` (the pinned
165
- `typebox` in one ESM build), each file carrying the package's name, version and
166
- licence in a banner that names the exact version compiled.
167
-
168
- The MIT text below applies to the derivative, `model-probe`, `@opencode-ai/models` and
171
+ - `yauzl` 3.4.0, MIT, https://www.npmjs.com/package/yauzl
172
+ - Copyright (c) 2014 Josh Wolfe
173
+ - `pend` 1.2.0 (dependency of `yauzl`), MIT, https://www.npmjs.com/package/pend
174
+ - Copyright (c) 2014 Andrew Kelley
175
+
176
+ `model-probe`, `typebox`, `yaml`, `minimatch`, `semver` and `yauzl` are also redistributed
177
+ compiled, unobfuscated and unmodified: the public npm package contains `dist/vendor/model-probe/`
178
+ (the installed `model-probe` compiled from its TypeScript, with its `rules.json`),
179
+ `dist/vendor/typebox/` (the pinned `typebox` in one ESM build) and `dist/vendor/yaml.js`,
180
+ `minimatch.js`, `semver.js` and `yauzl.js` (each installed package with its own dependencies in
181
+ one file), each file carrying the package's name, version and licence in a banner that names
182
+ the exact version compiled. `zod` is compiled the same way into `dist/vendor/zod.js`. The
183
+ packages inlined with them are listed in the generated section at the end of this file.
184
+
185
+ The MIT text below applies to the derivative, `model-probe`, `@opencode-ai/models`, `yauzl`, `pend`, and
169
186
  `typebox` with the copyright notices above. The ISC text immediately below applies to `yaml` and
170
187
  `semver`, each with its own copyright holder listed above (the ISC terms are identical);
171
188
  `minimatch` is covered by the separate Blue Oak Model License text further down, and its
@@ -209,6 +226,35 @@ THIS SOFTWARE.
209
226
 
210
227
  The MIT License text below applies to this package with the copyright notice above.
211
228
 
229
+ ### 7. Dangerous-action confirmation: unbash, Codex, cc-safety-net and Dippy (spec 020)
230
+
231
+ - `unbash` 5.0.0, ISC, https://www.npmjs.com/package/unbash — a runtime dependency, installed beside
232
+ the package by npm, not bundled.
233
+ - Copyright (c) Lars Kappert
234
+ - OpenAI Codex, Apache License 2.0, https://github.com/openai/codex — ported logic, not code:
235
+ the wrapper unwrapping, nested `-c` and `trap` re-parsing, the nesting limit and the
236
+ split-then-classify pipeline (`codex-rs/shell-command/src/command_safety/is_dangerous_command.rs`
237
+ and `codex-rs/core/src/exec_policy.rs` at `a5cce88`), and the flag conditions for `find`, `rg`,
238
+ `base64` and `sed` with `git` as never read-only (`is_safe_command.rs` at `9ca99b5`).
239
+ - NOTICE: "OpenAI Codex / Copyright 2025 OpenAI"
240
+ - cc-safety-net, MIT, https://github.com/kenryu42/cc-safety-net — the destructive-command rules
241
+ and their descriptions and the secret-path catalogue (`src/core/rules/destructive.ts`,
242
+ `src/core/rules/secret.ts` at `f9bfeca`), ported as data into
243
+ `packages/shared/src/command-analysis/`.
244
+ - Copyright (c) 2026 J Liew
245
+ - Dippy, MIT, https://github.com/ldayton/Dippy — the `SIMPLE_SAFE` read-only command names
246
+ (`src/dippy/core/allowlists.py` at `2edad4a`), ported as data.
247
+ - Copyright (c) 2025 Lily Dayton
248
+
249
+ **Modifications Made:**
250
+ - the logic is reimplemented in TypeScript on `unbash` rather than copied, and the data is
251
+ reduced: Dippy's names less the commands that run a program, reach the network, escape to a
252
+ shell or print secrets; cc-safety-net's rules extended with the rows of spec 020
253
+
254
+ The MIT License text below applies to cc-safety-net and Dippy with the copyright notices above;
255
+ the Apache License 2.0 text applies to the Codex logic with the NOTICE above; the ISC terms of
256
+ `unbash` are those of the ISC text in section 5, with its own copyright holder listed above.
257
+
212
258
  ## Full License Texts
213
259
 
214
260
  ### MIT License
@@ -448,6 +494,56 @@ verbatim below.
448
494
  limitations under the License.
449
495
  ```
450
496
 
497
+ ### ISC License
498
+
499
+ Applies to: `yaml`, `semver`, and the compiled packages listed as ISC in the generated
500
+ "Packages compiled into this package's own files" section, each with its own copyright line.
501
+
502
+ ```
503
+ Permission to use, copy, modify, and/or distribute this software for any purpose
504
+ with or without fee is hereby granted, provided that the above copyright notice
505
+ and this permission notice appear in all copies.
506
+
507
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
508
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
509
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
510
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
511
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
512
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
513
+ THIS SOFTWARE.
514
+ ```
515
+
516
+ ### BSD 3-Clause License
517
+
518
+ Applies to: the compiled packages listed as BSD-3-Clause in the generated "Packages compiled
519
+ into this package's own files" section (`smol-toml`, `fast-uri`), each with the copyright
520
+ lines listed for it there, which take the place of "the above copyright notice".
521
+
522
+ ```
523
+ Redistribution and use in source and binary forms, with or without
524
+ modification, are permitted provided that the following conditions are met:
525
+
526
+ 1. Redistributions of source code must retain the above copyright notice, this
527
+ list of conditions and the following disclaimer.
528
+ 2. Redistributions in binary form must reproduce the above copyright notice,
529
+ this list of conditions and the following disclaimer in the
530
+ documentation and/or other materials provided with the distribution.
531
+ 3. Neither the name of the copyright holder nor the names of its contributors
532
+ may be used to endorse or promote products derived from this software without
533
+ specific prior written permission.
534
+
535
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
536
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
537
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
538
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
539
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
540
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
541
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
542
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
543
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
544
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
545
+ ```
546
+
451
547
  ### Blue Oak Model License 1.0.0
452
548
 
453
549
  Applies to: `minimatch`.
@@ -455,7 +551,9 @@ Applies to: `minimatch`.
455
551
  `minimatch` is an unmodified runtime dependency: the public npm package declares it and
456
552
  npm installs it beside the package, and the managed backend archive carries it in its
457
553
  installed tree. Either way its own `LICENSE.md` is present inside its package directory on
458
- the user's machine. The Blue Oak
554
+ the user's machine. It is also compiled, unmodified, into `dist/vendor/minimatch.js`, whose
555
+ banner names it and this text; its licence text names no copyright holder, so the holder is
556
+ the one listed for it in section 5. The Blue Oak
459
557
  "Notices" clause requires everyone who receives a copy to also get the license text or a
460
558
  link to <https://blueoakcouncil.org/license/1.0.0>; the text is reproduced verbatim below
461
559
  so this notice satisfies that clause on its own.
@@ -526,14 +624,9 @@ Generated at build time. It records the license metadata declared by the npm pac
526
624
  this package depends on at runtime; none is bundled into the tarball, npm installs them beside it.
527
625
  Consult each package for its complete license text.
528
626
 
529
- - @modelcontextprotocol/client@2.0.0: license metadata = MIT (installed by npm beside this package)
530
- - @modelcontextprotocol/core@2.0.0: license metadata = MIT (installed by npm beside this package)
531
627
  - @modelcontextprotocol/ext-apps@1.7.5: license metadata = MIT (installed by npm beside this package)
532
628
  - @mozilla/readability@0.6.0: license metadata = Apache-2.0 (installed by npm beside this package)
533
629
  - @napi-rs/keyring@1.3.0: license metadata = MIT (installed by npm beside this package)
534
- - ajv@8.20.0: license metadata = MIT (installed by npm beside this package)
535
- - ajv-formats@3.0.1: license metadata = MIT (installed by npm beside this package)
536
- - cross-spawn@7.0.6: license metadata = MIT (installed by npm beside this package)
537
630
  - defuddle@0.19.3: license metadata = MIT (installed by npm beside this package)
538
631
  - linkedom@0.16.11: license metadata = ISC (installed by npm beside this package)
539
632
  - minimatch@10.2.6: license metadata = BlueOak-1.0.0 (installed by npm beside this package)
@@ -545,12 +638,88 @@ Consult each package for its complete license text.
545
638
  - promise.try@2.0.2: license metadata = MIT (installed by npm beside this package)
546
639
  - recheck@4.5.0: license metadata = MIT (installed by npm beside this package)
547
640
  - semver@7.8.5: license metadata = ISC (installed by npm beside this package)
548
- - smol-toml@1.9.0: license metadata = BSD-3-Clause (installed by npm beside this package)
549
- - strip-json-comments@5.0.3: license metadata = MIT (installed by npm beside this package)
550
641
  - turndown@7.2.4: license metadata = MIT (installed by npm beside this package)
642
+ - unbash@5.0.0: license metadata = ISC (installed by npm beside this package)
551
643
  - undici@8.11.2: license metadata = MIT (installed by npm beside this package)
552
644
  - unpdf@1.8.1: license metadata = MIT (installed by npm beside this package)
553
645
  - yaml@2.9.0: license metadata = ISC (installed by npm beside this package)
646
+ - yauzl@3.4.0: license metadata = MIT (installed by npm beside this package)
554
647
  - typebox@1.3.24: license metadata = MIT (compiled into dist/vendor/typebox)
555
648
  - model-probe@0.6.0: license metadata = MIT (compiled into dist/vendor/model-probe)
556
649
  - pi-web-access@0.31.0: license metadata = MIT (compiled into dist/vendor/pi-web-access.js)
650
+
651
+ ## Packages compiled into this package's own files
652
+
653
+ Generated at build time from the packages each compiled, unobfuscated file inlines. Their
654
+ directories do not ship, so their copyright notices are reproduced here; the full text of
655
+ each licence named is under "Full License Texts" above.
656
+
657
+ - @earendil-works/pi-tui@0.84.4, MIT, compiled into dist/vendor/pi-tui.js
658
+ - Copyright (c) 2025 Mario Zechner
659
+ - notice recorded from https://github.com/earendil-works/pi/blob/v0.84.4/LICENSE (the package ships none)
660
+ - @modelcontextprotocol/client@2.0.0, MIT, compiled into dist/mcp-adapter.js
661
+ - Copyright (c) 2024-2025 Model Context Protocol a Series of LF Projects, LLC.
662
+ - @modelcontextprotocol/core@2.0.0, MIT, compiled into dist/mcp-adapter.js
663
+ - Copyright (c) 2024-2025 Model Context Protocol a Series of LF Projects, LLC.
664
+ - ajv-formats@3.0.1, MIT, compiled into dist/mcp-adapter.js
665
+ - Copyright (c) 2020 Evgeny Poberezkin
666
+ - ajv@8.20.0, MIT, compiled into dist/mcp-adapter.js
667
+ - Copyright (c) 2015-2021 Evgeny Poberezkin
668
+ - balanced-match@4.0.4, MIT, compiled into dist/vendor/minimatch.js
669
+ - Original code Copyright Julian Gruber <julian@juliangruber.com>
670
+ - Port to TypeScript Copyright Isaac Z. Schlueter <i@izs.me>
671
+ - brace-expansion@5.0.12, MIT, compiled into dist/vendor/minimatch.js
672
+ - Copyright Julian Gruber <julian@juliangruber.com>
673
+ - TypeScript port Copyright Isaac Z. Schlueter <i@izs.me>
674
+ - cross-spawn@7.0.6, MIT, compiled into dist/mcp-adapter.js
675
+ - Copyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>
676
+ - eventsource-parser@3.1.1, MIT, compiled into dist/mcp-adapter.js
677
+ - Copyright (c) 2026 Espen Hovlandsdal <espen@hovlandsdal.com>
678
+ - eventsource@3.0.7, MIT, compiled into dist/mcp-adapter.js
679
+ - Copyright (c) EventSource GitHub organisation
680
+ - fast-deep-equal@3.1.3, MIT, compiled into dist/mcp-adapter.js
681
+ - Copyright (c) 2017 Evgeny Poberezkin
682
+ - fast-uri@3.1.8, BSD-3-Clause, compiled into dist/mcp-adapter.js
683
+ - Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae
684
+ - Copyright (c) 2021-present The Fastify team <https://github.com/fastify/fastify#team>
685
+ - get-east-asian-width@1.6.0, MIT, compiled into dist/vendor/pi-tui.js
686
+ - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
687
+ - isexe@2.0.0, ISC, compiled into dist/mcp-adapter.js
688
+ - Copyright (c) Isaac Z. Schlueter and Contributors
689
+ - jose@6.2.12, MIT, compiled into dist/mcp-adapter.js
690
+ - Copyright (c) 2018 Filip Skokan
691
+ - json-schema-traverse@1.0.0, MIT, compiled into dist/mcp-adapter.js
692
+ - Copyright (c) 2017 Evgeny Poberezkin
693
+ - marked@18.0.5, MIT, compiled into dist/vendor/pi-tui.js
694
+ - Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/)
695
+ - Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
696
+ - Copyright © 2004, John Gruber
697
+ - minimatch@10.2.6, BlueOak-1.0.0, compiled into dist/vendor/minimatch.js
698
+ - Copyright Isaac Z. Schlueter <i@izs.me> and minimatch contributors
699
+ - notice recorded from https://www.npmjs.com/package/minimatch/v/10.2.6 (author field) (the package ships none)
700
+ - path-key@3.1.1, MIT, compiled into dist/mcp-adapter.js
701
+ - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
702
+ - pend@1.2.0, MIT, compiled into dist/vendor/yauzl.js
703
+ - Copyright (c) 2014 Andrew Kelley
704
+ - pi-mcp-adapter@2.31.0, MIT, compiled into dist/mcp-adapter.js, dist/vendor/pi-mcp-adapter-types.js
705
+ - Copyright (c) 2026 Nico Bailon
706
+ - pkce-challenge@5.0.1, MIT, compiled into dist/mcp-adapter.js
707
+ - Copyright (c) 2019
708
+ - semver@7.8.5, ISC, compiled into dist/vendor/semver.js
709
+ - Copyright (c) Isaac Z. Schlueter and Contributors
710
+ - shebang-command@2.0.0, MIT, compiled into dist/mcp-adapter.js
711
+ - Copyright (c) Kevin Mårtensson <kevinmartensson@gmail.com> (github.com/kevva)
712
+ - shebang-regex@3.0.0, MIT, compiled into dist/mcp-adapter.js
713
+ - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
714
+ - smol-toml@1.9.0, BSD-3-Clause, compiled into dist/mcp-adapter.js
715
+ - Copyright (c) Squirrel Chat et al., All rights reserved.
716
+ - strip-json-comments@5.0.3, MIT, compiled into dist/mcp-adapter.js
717
+ - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
718
+ - which@2.0.2, ISC, compiled into dist/mcp-adapter.js
719
+ - Copyright (c) Isaac Z. Schlueter and Contributors
720
+ - yaml@2.9.0, ISC, compiled into dist/vendor/yaml.js
721
+ - Copyright Eemeli Aro <eemeli@gmail.com>
722
+ - yauzl@3.4.0, MIT, compiled into dist/vendor/yauzl.js
723
+ - Copyright (c) 2014 Josh Wolfe
724
+ - zod@4.6.5, MIT, compiled into dist/vendor/zod.js
725
+ - Copyright (c) 2025 Colin McDonnell
@@ -15,6 +15,7 @@ it. Read the whole file before editing anything it describes.
15
15
  | `agents.md` | helper agents and model profiles: where the files live, every field, which model a helper runs on, disabling one |
16
16
  | `mcp.md` | MCP servers: the two `mcp.json` files, the entry shape, disabling a server or a tool |
17
17
  | `web-search.md` | web search and page fetch: `web-search.json`, where requests go, keys, switching search off, failures |
18
+ | `plugins.md` | Marketplace plugins: the project manifest, the `explyt plugin` command, plugin values |
18
19
 
19
20
  ## User configuration lives under `.explyt/`
20
21
 
@@ -35,8 +36,12 @@ all projects, and in the project directory for one project:
35
36
  <project>/.explyt/mcp.json MCP servers for this project
36
37
  <project>/.explyt/agents/*.md helper agents for this project
37
38
  <project>/.explyt/models/*.md model profiles for this project
39
+ <project>/.explyt/plugins.json Marketplace plugins enabled for this project
38
40
  ```
39
41
 
42
+ Installed plugin payloads and plugin values are not user configuration files: they live in the
43
+ product data directory and change only through `explyt plugin` (see `plugins.md`).
44
+
40
45
  Create these files and directories when they do not exist; nothing has to be registered anywhere
41
46
  for them to take effect.
42
47
 
package/agent-docs/mcp.md CHANGED
@@ -9,12 +9,16 @@ An MCP server gives the agent extra tools, resources and prompts. Servers are de
9
9
  | global | `~/.explyt/mcp.json` | the user |
10
10
  | project | `<project>/.explyt/mcp.json` | the user |
11
11
  | session | the `mcpServers` field of the IDE's session request | the IDE |
12
+ | plugin | the Marketplace plugins `<project>/.explyt/plugins.json` enables | the plugin author |
12
13
 
13
- These three and nothing else. Other tools' MCP files are **not** read — not `~/.config/mcp/mcp.json`,
14
+ These four and nothing else. Other tools' MCP files are **not** read — not `~/.config/mcp/mcp.json`,
14
15
  not `~/.agents/mcp.json`, not `<project>/.mcp.json`, and not the legacy
15
16
  `~/.explyt/mcp_servers.json`. A server the user declared for another product will not appear here;
16
17
  it has to be copied into one of the two files above.
17
18
 
19
+ A plugin server is defined by the plugin, not in `mcp.json`: its run mode and values are chosen
20
+ with `explyt plugin` (see `plugins.md`).
21
+
18
22
  Either file may be absent. With none of the sources present the session simply starts with no MCP
19
23
  server.
20
24
 
@@ -72,6 +76,11 @@ A name that collides between the merged files and the servers the IDE supplied i
72
76
  matter — that makes the configuration invalid, and it is reported rather than resolved by
73
77
  preferring a source or renaming a server. Rename one of them.
74
78
 
79
+ A plugin server never replaces another server. When its name is already taken by a global,
80
+ project or session server, or by a server of another enabled plugin, it is left out of the session
81
+ and reported in the plugins warning; the other server stays. Names are compared with case:
82
+ `GitHub` and `github` do not collide.
83
+
75
84
  ## Turning a server off
76
85
 
77
86
  Set `disabled` on its entry:
@@ -109,3 +118,7 @@ which is not an error.
109
118
  In the terminal UI, `/mcp` lists the servers, their status and their tools, and can toggle a server
110
119
  or an individual tool — writing the same `disabled` and `excludeTools` fields described above. That
111
120
  command does not exist in an IDE session; there, edit the files.
121
+
122
+ A plugin server is listed with the source `plugin` and cannot be toggled there: it is switched by
123
+ enabling or disabling its plugin. A plugin server that could not be resolved is not listed at all;
124
+ it is named in the plugins warning instead.
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Project activation
4
4
 
5
- Plugins are enabled per project in `.explyt/plugins.json`. Commit the exact plugin version and each MCP server's zero-based `runModes` index; do not put credentials or filesystem paths in this file.
5
+ Plugins are enabled per project in `.explyt/plugins.json`. Commit the exact plugin version and each MCP server's zero-based `runModes` index; do not put credentials or filesystem paths in this file. An entry without a `version` is reported and ignored, and `enable`, `disable` and `config set-run-mode` drop it when they rewrite the file.
6
6
 
7
7
  Example:
8
8
 
@@ -20,21 +20,43 @@ Example:
20
20
 
21
21
  ## Plugin commands
22
22
 
23
- Use `/plugin install`, `/plugin uninstall`, `/plugin update`, `/plugin enable`, `/plugin disable`, `/plugin list`, `/plugin details`, `/plugin verify`, `/plugin config set`, and `/plugin config set-run-mode` in the terminal. Plugin activation requires an installed exact version. When enabling a plugin is not a no-op, provide an explicit run-mode choice for every declared MCP server; an existing selection for the same exact version in the current project may be reused.
23
+ Plugins are managed from a shell in the project directory with `explyt plugin <operation>`. Without a global install, run `npx -y @explyt/ai-agent@<version> plugin <operation>` with the same version as the running agent (`explyt --version`, or the version it was started with). The current directory is the project. The command prints results on stdout and errors on stderr, and exits `0` on success, `1` when an operation fails, and `2` on an argument or usage error: an unknown operation or flag, a missing or extra argument, or an invalid plugin ID, version or run-mode index. Each error names its typed kind, such as `PluginVersionNotInstalled`.
24
+
25
+ The operations are `install`, `uninstall`, `update`, `enable`, `disable`, `list`, `details`, `verify`, `config set`, and `config set-run-mode`; `explyt plugin help` lists their arguments, shows both values-file shapes and an `enable` example. Plugin activation requires an installed exact version. When enabling a plugin is not a no-op, provide an explicit run-mode choice for every declared MCP server, one `--run-mode <server-name> <index>` each, for example `explyt plugin enable security-pack@1.3.1 --run-mode "Github MCP" 1 --run-mode Local 0`; an existing selection for the same exact version in the current project may be reused. `verify` takes no argument and reports every issue of the plugins the current project enables: a missing or damaged version, an incompatible `minPluginVersion`, and a required value that is not set. The issues are its result: it prints them on stdout and exits `0`, and fails only when the project manifest cannot be read or is invalid.
26
+
27
+ Before writing a values file or choosing run modes, run `explyt plugin details <plugin-id>@<version> --project` for the installed version. It lists each declared variable with its type, whether it is required, its default and choices, and whether a global or project value is stored (never the value itself), and each MCP server with its run-mode variants by index and the index this project selects. Without a version, or for a version that is not installed, `details` lists no declarations.
28
+
29
+ No command changes a running session. Changes take effect in a new session, or in a running terminal session after `/reload`. A command run through a tool cannot reload the session it was run from.
24
30
 
25
31
  ## Values and credentials
26
32
 
27
- Credentials and other plugin values stay in the local plugin store, not in the project manifest. Configure them with:
33
+ Credentials and other plugin values stay in the local plugin store, not in the project manifest. Values are first supplied at install time with a JSON object mapping each declared variable ID to a string; a required value that is neither supplied, already stored, nor defaulted fails the install:
34
+
35
+ ```text
36
+ explyt plugin install <plugin-id>[@<version>] --values-file <values-file>
37
+ ```
38
+
39
+ ```json
40
+ { "github_pat": "ghp_...", "mode": "http" }
41
+ ```
42
+
43
+ Later changes go through `config set`:
28
44
 
29
45
  ```text
30
- /plugin config set <plugin-id>@<version> <values-file>
31
- /plugin config set <plugin-id>@<version> --project <values-file>
46
+ explyt plugin config set <plugin-id>@<version> <values-file>
47
+ explyt plugin config set <plugin-id>@<version> --project <values-file>
48
+ ```
49
+
50
+ The first command patches global values; the second patches values for the current project. A project value overrides the global value for that project. The values file for `config set` contains a `values` object and may contain an `unset` array; omitted keys are preserved, and an ID may not be in both:
51
+
52
+ ```json
53
+ { "values": { "mode": "mcp" }, "unset": ["api_key"] }
32
54
  ```
33
55
 
34
- The first command patches global values; the second patches values for the current project. A project value overrides the global value for that project. The values file for `config set` contains a `values` object and may contain an `unset` array; omitted keys are preserved.
56
+ A `secret`, `path` or free-form `string` value may be an `${env:NAME}` or `${env:NAME:-fallback}` reference instead of the value itself, which keeps a secret out of the store; it is read from the agent's environment when a session starts.
35
57
 
36
- To remove an installed version, use `/plugin uninstall <plugin-id>[@<version>]`. Removing the last installed version also removes that plugin's stored values and per-version `${PLUGIN_DATA}` directories. To change one MCP server's selection for an enabled version, use:
58
+ To remove an installed version, use `explyt plugin uninstall <plugin-id>[@<version>]`. Removing the last installed version also removes that plugin's stored values and per-version `${PLUGIN_DATA}` directories. To change one MCP server's selection for an enabled version, use:
37
59
 
38
60
  ```text
39
- /plugin config set-run-mode <plugin-id>@<version> <server-name> <index>
61
+ explyt plugin config set-run-mode <plugin-id>@<version> <server-name> <index>
40
62
  ```
@@ -15,8 +15,14 @@ does not repeat them in every conversation.
15
15
  | `<project>/.claude/CLAUDE.md` | `project:.claude/CLAUDE.md` | plain Markdown |
16
16
  | `<project>/CLAUDE.local.md` | `project:CLAUDE.local.md` | plain Markdown |
17
17
 
18
- Only these locations. A `CLAUDE.md` or `AGENTS.md` in a subdirectory is not picked up, and there is
19
- no search up the directory tree — the project is the session's working directory.
18
+ Only these locations, plus the rules of the Marketplace plugins the project enables. A `CLAUDE.md`
19
+ or `AGENTS.md` in a subdirectory is not picked up, and there is no search up the directory tree —
20
+ the project is the session's working directory.
21
+
22
+ A plugin rule is a top-level `rules/*.md` file of the enabled plugin version, with the ID
23
+ `plugin:<plugin-id>/rules/<filename>`, for example `plugin:security-pack/rules/guard.md`. It uses
24
+ the Explyt rule format below and applies after the Explyt project rules. It is part of the plugin:
25
+ do not edit or copy it; `plugins.md` describes how a plugin is enabled.
20
26
 
21
27
  A new rule belongs in `.explyt/rules/`: project-wide in `<project>/.explyt/rules/`, or for every
22
28
  project in `~/.explyt/rules/`. The file may sit in subdirectories; every `.md` below the directory
@@ -27,12 +33,14 @@ session.
27
33
 
28
34
  ## Frontmatter of an Explyt rule
29
35
 
30
- YAML frontmatter, then the Markdown body. Both fields are optional.
36
+ An optional YAML frontmatter block, then the Markdown body. A file with no frontmatter is a
37
+ `system` rule whose whole text is the body; an empty frontmatter block (`---` followed by `---`)
38
+ means the same. Both fields are optional.
31
39
 
32
40
  | Field | Values | Meaning |
33
41
  |---|---|---|
34
42
  | `strictness` | `system`, `user-message`, `tool-call` | when the body reaches the model; defaults to `system` |
35
- | `filePattern` | a glob such as `**/*.kt` | the body reaches the model after a matching file is read |
43
+ | `filePattern` | a glob such as `**/*.kt`, or a non-empty list of globs | the body reaches the model after a file matching any of the globs is read |
36
44
 
37
45
  - `system` — part of the system prompt for the whole session.
38
46
  - `user-message` — delivered once with every message the user sends.
@@ -61,10 +69,26 @@ filePattern: "**/*.kt"
61
69
  This project targets Kotlin 2.0. Prefer data classes over records.
62
70
  ```
63
71
 
64
- A rule is **invalid** — and silently does not apply — when its frontmatter is missing, when its
65
- YAML does not parse or is not a mapping of fields, when `strictness` has an unknown value or the
66
- wrong type **and no `filePattern` is present**, or when `filePattern` is not a string. Only the body is sent to the model; the
67
- frontmatter is not. An empty body is valid and sends nothing.
72
+ A file-pattern rule with several globs, applied when a read matches any of them:
73
+
74
+ ```markdown
75
+ ---
76
+ filePattern: ["**/*.kt", "**/*.gradle.kts"]
77
+ ---
78
+ Use the version catalog for dependency versions.
79
+ ```
80
+
81
+ A rule with no frontmatter, applied to the whole session:
82
+
83
+ ```markdown
84
+ Prefer small, focused commits.
85
+ ```
86
+
87
+ A rule is **invalid** — and silently does not apply — when its YAML does not parse or is not a
88
+ mapping of fields, when `strictness` has an unknown value or the wrong type **and no `filePattern`
89
+ is present**, or when `filePattern` is neither a non-empty string nor a non-empty list of non-empty
90
+ strings. Only the body is sent to the model; the frontmatter is not. An empty body is valid and
91
+ sends nothing.
68
92
 
69
93
  Changes take effect on the next message the user sends; the current turn keeps the rules it
70
94
  started with.
@@ -88,5 +112,10 @@ case-insensitive matching. An entry matching no rule is kept and ignored.
88
112
  A rule owned by the project — any ID starting with `project:` — can be disabled only through the
89
113
  **project** layer. Such an entry written into the global layer is kept but has no effect.
90
114
 
115
+ A plugin rule — any ID starting with `plugin:` — cannot be disabled through `rules.disabledRules`
116
+ on either layer: such an entry is kept and ignored. It applies while its plugin is enabled in the
117
+ project; disabling the plugin removes all of its rules.
118
+
91
119
  In the terminal UI the user can see the current list of rules and their state with the `/rules`
92
- command. That command does not exist in an IDE session — there, answer from the files above.
120
+ command; a plugin rule is listed there read-only. That command does not exist in an IDE session —
121
+ there, answer from the files above.
@@ -28,8 +28,7 @@ One object per section, with the setting's keys inside it:
28
28
  "disabledSkills": ["pdf-tools"]
29
29
  },
30
30
  "subagents": {
31
- "maxConcurrency": 20,
32
- "permission": "inherit"
31
+ "maxConcurrency": 20
33
32
  }
34
33
  }
35
34
  ```
@@ -45,7 +44,6 @@ rest of the file as it is.
45
44
  | `skills.disabledSkills` | array of strings | `[]` | Skill names that are unavailable; see `skills.md` |
46
45
  | `sessionTitle.enabled` | boolean | `true` | whether a new chat gets a short title generated by the model after its first turn succeeds |
47
46
  | `subagents.maxConcurrency` | positive integer | `20` | Maximum simultaneously running or waiting children |
48
- | `subagents.permission` | `inherit` \| `yolo` \| `ask-permissions` | `inherit` | Permission mode resolved for child tools |
49
47
  | `subagents.disabledAgents` | array of strings | `[]` | helper agent names that are unavailable; see `agents.md` |
50
48
  | `subagents.disabledProfiles` | array of strings | `[]` | model profile names that are unavailable; see `agents.md` |
51
49
  | `tui.mascot` | string | `"cat"` | the animated mascot in the terminal's working row: `cat`, `snake`, `pacman`, `tetris`, `fishing`, `robot`, `pong`, `crab`, or `custom` for the user's own |
@@ -58,11 +56,15 @@ globs or prefixes: `"pdf-*"` matches nothing. An entry matching nothing is kept,
58
56
  A `disabledAgents` or `disabledProfiles` value that is not an array of strings, such as
59
57
  `"disabledProfiles": "strong"`, is ignored for that layer with a warning.
60
58
 
61
- For `subagents.maxConcurrency` and `subagents.permission`, a valid project value overrides the
62
- global value. Invalid values are ignored for that layer with a warning, so the other layer or the default still applies. `permission: "inherit"`
63
- resolves once when the child launches from the parent session's effective permission mode. The
64
- parent always asks before a dangerous command (or blocks it when nobody can answer), so today
65
- `inherit` behaves as `ask-permissions`; only an explicit `yolo` lets a child skip the question.
59
+ For `subagents.maxConcurrency`, a valid project value overrides the global value. An invalid
60
+ value is ignored for that layer with a warning, so the other layer or the default still applies.
61
+
62
+ No setting chooses a subagent's permission mode. A subagent starts in the permission mode its
63
+ parent session has when the subagent starts (`default`, `paranoid` or `bypassPermissions`), with a
64
+ copy of the parent's "Allow for this session" approvals. A `permission` key left in the
65
+ `subagents` section is ignored. The mode itself is not a setting either: the user switches it in
66
+ the chat (the IDE's mode control, or `Shift+Tab`, `/mode` and `--permission-mode` in the terminal),
67
+ and each chat keeps its own.
66
68
 
67
69
  The list settings are read per layer rather than merged, so a value written in the project layer does not
68
70
  replace the global one — each layer's list is applied on its own. Which layer to write is a
@@ -27,6 +27,10 @@ project. No root outranks another, and the tool a Skill was written for is never
27
27
 
28
28
  The project root is the session's working directory; there is no search up the directory tree.
29
29
 
30
+ The Marketplace plugins the project enables add their own Skills: each `skills/<name>/SKILL.md` of
31
+ the enabled plugin version. A plugin Skill is part of the plugin — do not edit or copy it;
32
+ `plugins.md` describes how a plugin is enabled.
33
+
30
34
  ## `SKILL.md`
31
35
 
32
36
  YAML frontmatter, then the Markdown body that carries the instructions.
@@ -55,7 +59,12 @@ when_to_use: Use when the user asks for a changelog or release notes
55
59
 
56
60
  The `name` in the frontmatter is the Skill's identity; it does not have to match the directory
57
61
  name, but making them equal keeps things findable. Two `SKILL.md` files claiming one name make
58
- **both** unavailable — neither wins.
62
+ **both** unavailable — neither wins. This includes plugin Skills: an ordinary Skill named like a
63
+ Skill of an enabled plugin makes both unavailable.
64
+
65
+ A plugin Skill's frontmatter follows the plugin format: `name` and `description` follow the rules
66
+ above, and instead of the two boolean fields it has `invocation` — `any` (the default: the user
67
+ and the model), `user` (only the user) or `model` (only the model).
59
68
 
60
69
  A Skill is **invalid** — and unavailable — when the frontmatter is missing, unparseable or not a
61
70
  YAML mapping, when `name` or `description` breaks a rule above, when an optional field has the
@@ -86,5 +95,10 @@ kept and ignored.
86
95
  Disabling never edits a `SKILL.md`: to hide a Skill from the model but keep it available to the
87
96
  user, set `disable-model-invocation: true` in its frontmatter instead.
88
97
 
89
- In the terminal UI the user can see every Skill and its state with the `/skills` command. That
90
- command does not exist in an IDE session — there, answer from the files above.
98
+ A plugin Skill cannot be disabled through `skills.disabledSkills` on either layer: an entry naming
99
+ it is kept and ignored. It is available while its plugin is enabled in the project; disabling the
100
+ plugin removes all of its Skills.
101
+
102
+ In the terminal UI the user can see every Skill and its state with the `/skills` command; a plugin
103
+ Skill is listed there read-only, with the source `plugin`. That command does not exist in an IDE
104
+ session — there, answer from the files above.
@@ -924,9 +924,10 @@ export function withIsolation(rest, packageRoot) {
924
924
  * interactive UI, started directly against our directory; `logout` removes what it
925
925
  * stored. `acp` is parsed everywhere but only FUNCTIONS in the managed-backend and
926
926
  * debug artifacts, where the adapter ships next to the wrapper; the public terminal
927
- * package answers it with a migration error.
927
+ * package answers it with a migration error. `plugin` manages Marketplace plugins from a shell
928
+ * and takes every argument after it as its own (spec 012 RQ-1).
928
929
  */
929
- export const COMMANDS = new Set(["acp", "config", "install", "login", "logout", "tui", "update"]);
930
+ export const COMMANDS = new Set(["acp", "config", "install", "login", "logout", "plugin", "tui", "update"]);
930
931
 
931
932
  /**
932
933
  * Engine flags that confine a terminal run to a single package: ours.
@@ -1069,6 +1070,13 @@ export function withoutLaunchPath(rest, { argv1, launchFile, cwd = process.cwd()
1069
1070
  return rest.filter((arg) => arg.startsWith("-") || !(same(arg, argv1) || same(arg, launchFile)));
1070
1071
  }
1071
1072
 
1073
+ /**
1074
+ * The terminal product's start mode (spec 020, RQ-22). The policy extension registers it with the
1075
+ * engine and validates the value (RQ-26); here it only has to travel with its value, so that
1076
+ * `--permission-mode login` is never read as the `login` subcommand.
1077
+ */
1078
+ export const PERMISSION_MODE_FLAG = "--permission-mode";
1079
+
1072
1080
  /**
1073
1081
  * Flags belonging to other programs that consume the NEXT argument as their value.
1074
1082
  *
@@ -1077,7 +1085,7 @@ export function withoutLaunchPath(rest, { argv1, launchFile, cwd = process.cwd()
1077
1085
  * which it rejects. Only pass-through flags need listing; our own flags are handled
1078
1086
  * explicitly below.
1079
1087
  */
1080
- export const VALUE_FLAGS = new Set([ISOLATION_FLAG, "--extension", "--model", "--cwd"]);
1088
+ export const VALUE_FLAGS = new Set([ISOLATION_FLAG, "--extension", "--model", "--cwd", PERMISSION_MODE_FLAG]);
1081
1089
 
1082
1090
  /**
1083
1091
  * Argument shape of the user-facing CLI.
@@ -1128,6 +1136,12 @@ export function parseArgs(argv) {
1128
1136
  // Bare word. Only the first one can name a subcommand.
1129
1137
  if (!seenPositional) {
1130
1138
  seenPositional = true;
1139
+ // `plugin` owns everything after it, flags and `--` included.
1140
+ if (arg === "plugin") {
1141
+ command = arg;
1142
+ rest.push(...argv.slice(i + 1));
1143
+ break;
1144
+ }
1131
1145
  if (COMMANDS.has(arg)) { command = arg; continue; }
1132
1146
  if (arg === "help") { help = true; continue; }
1133
1147
  }
@@ -1149,9 +1163,11 @@ export function helpText() {
1149
1163
  " npx -y @explyt/ai-agent@<version> login store a provider credential",
1150
1164
  " npx -y @explyt/ai-agent@<version> logout remove stored credentials",
1151
1165
  "",
1152
- "Commands: explyt tui | login | logout | install | update | config",
1166
+ "Commands: explyt tui | login | logout | plugin | install | update | config",
1153
1167
  " explyt update update the managed installation now (same as install)",
1154
1168
  " explyt config set updateChannel stable|dogfood | autoUpdate true|false",
1169
+ " explyt plugin manage Marketplace plugins (explyt plugin help)",
1170
+ " --permission-mode default|paranoid|bypassPermissions start the terminal UI in that mode",
1155
1171
  " -h, --help show this message",
1156
1172
  " -v, --version print the version",
1157
1173
  "",