@wirecat/cli-template 0.15.0 → 0.17.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 (170) hide show
  1. package/.github/workflows/ci.yml +35 -0
  2. package/.github/workflows/release-pr.yml +37 -0
  3. package/AGENTS.md +56 -2
  4. package/CHANGELOG.md +50 -0
  5. package/README.md +12 -4
  6. package/bin/release +10 -3
  7. package/biome.json +8 -2
  8. package/contracts/mcp-tools.json +2 -2
  9. package/contracts/plan.json +2 -1
  10. package/dist/bin/clidev.js +2 -2
  11. package/dist/bundle/{chunk-LU4A2T7Y.js → all-profiles-CCT2XPJL.js} +10 -7
  12. package/dist/bundle/{anthropic-ICTW7CNQ.js → anthropic-QLLP7EE4.js} +4 -4
  13. package/dist/bundle/{app-server-OW5LT5XV.js → app-server-ELI5TGL7.js} +36 -37
  14. package/dist/bundle/{bun-ILPS6AYA.js → bun-C7JS2V7G.js} +2 -2
  15. package/dist/bundle/{bun-sqlite-JE6FJFQT.js → bun-sqlite-OM72TCYT.js} +3 -3
  16. package/dist/bundle/{chunk-7F5VMLVK.js → chunk-2Y5NBD7U.js} +4 -4
  17. package/dist/bundle/chunk-33JGD2CR.js +141 -0
  18. package/dist/bundle/{chunk-F34HGYWF.js → chunk-3VVIEZRY.js} +2 -2
  19. package/dist/bundle/{chunk-CGFQT3LQ.js → chunk-6PHTRAZA.js} +1 -1
  20. package/dist/bundle/{chunk-VS5LGSTM.js → chunk-6VCFDEHT.js} +1 -1
  21. package/dist/bundle/{chunk-NENYWEXF.js → chunk-7OQF5ZMN.js} +1 -1
  22. package/dist/bundle/{chunk-62JRF2JA.js → chunk-AKUMR7PE.js} +2 -2
  23. package/dist/bundle/{chunk-7UPBPE3Z.js → chunk-ASO23RNM.js} +152 -79
  24. package/dist/bundle/{chunk-VOTEB3AN.js → chunk-AUVPTFUS.js} +1 -1
  25. package/dist/bundle/{chunk-KLFYY7KC.js → chunk-BOCIYBBO.js} +53 -44
  26. package/dist/bundle/{chunk-TJJ2XSJP.js → chunk-BXZRTMXA.js} +5 -5
  27. package/dist/bundle/{chunk-66VMJGV6.js → chunk-DVLM23HB.js} +2 -2
  28. package/dist/bundle/{chunk-YIVY2WI3.js → chunk-E4KQOKQ5.js} +1 -1
  29. package/dist/bundle/{chunk-GHF72SHT.js → chunk-EQDVQN4E.js} +306 -258
  30. package/dist/bundle/{chunk-NH6LZ3H3.js → chunk-FF3AGTHY.js} +6 -6
  31. package/dist/bundle/{chunk-NG7MOJBT.js → chunk-GG5PXNMH.js} +61 -21
  32. package/dist/bundle/{chunk-LFLSV353.js → chunk-GUCMIUNB.js} +2 -2
  33. package/dist/bundle/{chunk-R5RYPD23.js → chunk-HVAEHUSZ.js} +2 -2
  34. package/dist/bundle/{chunk-PIJUGF5F.js → chunk-ITPFCKCL.js} +13 -13
  35. package/dist/bundle/{chunk-DQIBGCF3.js → chunk-J2RUBXCI.js} +6 -6
  36. package/dist/bundle/{chunk-7Z4HR6GO.js → chunk-KRXN3FV3.js} +1 -1
  37. package/dist/bundle/{chunk-45244QQ6.js → chunk-LFLN6PVS.js} +4 -4
  38. package/dist/bundle/{chunk-MWUHBEDN.js → chunk-LN53L2V5.js} +11 -11
  39. package/dist/bundle/{chunk-IOJ2DTCY.js → chunk-MLSN3UP4.js} +28 -26
  40. package/dist/bundle/{chunk-3MDNAYQA.js → chunk-O6PBO4BU.js} +1 -1
  41. package/dist/bundle/{chunk-YOJLIVGO.js → chunk-QJS4WWYK.js} +63 -63
  42. package/dist/bundle/{chunk-NVNUUHT5.js → chunk-QLBS6OC2.js} +2362 -1225
  43. package/dist/bundle/{chunk-2DAXUNTS.js → chunk-QVPTZDRA.js} +2 -2
  44. package/dist/bundle/{chunk-4MU2UM4C.js → chunk-R5CPFSPI.js} +7 -7
  45. package/dist/bundle/{chunk-AS2PJNQ2.js → chunk-R5IY4O25.js} +4 -4
  46. package/dist/bundle/{chunk-DZLHY4IA.js → chunk-RGKXMVOZ.js} +3 -3
  47. package/dist/bundle/{chunk-G45R7M42.js → chunk-RT46AWIH.js} +1 -1
  48. package/dist/bundle/{chunk-NRZV7K4M.js → chunk-RUHNHEAF.js} +3 -3
  49. package/dist/bundle/{chunk-VXOR76ZL.js → chunk-S465TCR3.js} +8 -8
  50. package/dist/bundle/{chunk-NVGOHYTE.js → chunk-SQKP6V4S.js} +27 -13
  51. package/dist/bundle/{chunk-FC53WQHG.js → chunk-SQOXYNKF.js} +1 -1
  52. package/dist/bundle/{chunk-R2JKPHH5.js → chunk-URPKIONS.js} +8 -8
  53. package/dist/bundle/{chunk-VVGPAHUN.js → chunk-UW4PJZVJ.js} +298 -170
  54. package/dist/bundle/{chunk-EX2FV7YJ.js → chunk-WKUJCPSP.js} +89 -45
  55. package/dist/bundle/{chunk-LATYBJ4T.js → chunk-WQBBSVZM.js} +2 -2
  56. package/dist/bundle/{chunk-G7W53MQP.js → chunk-WRLOK7XC.js} +3 -3
  57. package/dist/bundle/{chunk-SOYOOU2D.js → chunk-X44ZT64I.js} +3 -3
  58. package/dist/bundle/{chunk-U6QD3J3F.js → chunk-XKL5FRH3.js} +3 -3
  59. package/dist/bundle/{chunk-6AW4DDK4.js → chunk-XS56LIQ7.js} +4 -4
  60. package/dist/bundle/{chunk-3WDYHOAF.js → chunk-YIH3PYWJ.js} +1 -1
  61. package/dist/bundle/{chunk-5GTMQTQH.js → chunk-ZRNBKTPP.js} +27 -29
  62. package/dist/bundle/clidev.js +3 -3
  63. package/dist/bundle/{command-contract-3MPKXBVL.js → command-contract-RV5ZOEAT.js} +11 -11
  64. package/dist/bundle/{decode-NXB5UKMO.js → decode-V7HNHZBC.js} +3 -3
  65. package/dist/bundle/{echarts-DRDGGHJT.js → echarts-Y42YP2OL.js} +2 -2
  66. package/dist/bundle/{embed-IKZ24BMC.js → embed-JSQZL7JF.js} +4 -4
  67. package/dist/bundle/{embedder-GMQ24DOQ.js → embedder-7BHRCXWL.js} +7 -7
  68. package/dist/bundle/{first-run-PURIGDLD.js → first-run-BJ36KGST.js} +8 -8
  69. package/dist/bundle/first-screen-5YHQVNY4.js +26 -0
  70. package/dist/bundle/{instructions-EOQOXY6V.js → instructions-UWERND54.js} +1 -1
  71. package/dist/bundle/{mcp-7HBLFGCW.js → mcp-P4FSBSRS.js} +2 -2
  72. package/dist/bundle/{node-52WF2326.js → node-PZDNPKN7.js} +2 -2
  73. package/dist/bundle/{node-sqlite-73Z4SFOA.js → node-sqlite-4F5NLRNT.js} +4 -4
  74. package/dist/bundle/{oauth-EVTPAMZP.js → oauth-VDXNA3DK.js} +5 -5
  75. package/dist/bundle/{open-46WZAPJ3.js → open-EUJRQQNS.js} +3 -3
  76. package/dist/bundle/{openai-GWRDAHDU.js → openai-EIBV2K72.js} +14 -35
  77. package/dist/bundle/{process-YIQPKLZI.js → process-XD5ZIFIL.js} +1 -1
  78. package/dist/bundle/{program-37NVH5YJ.js → program-TJTVMIOX.js} +3067 -736
  79. package/dist/bundle/{prompt-IVEYRLS5.js → prompt-LYUZNHDK.js} +3 -3
  80. package/dist/bundle/{recognize-WVEKHODM.js → recognize-LQMHLOD5.js} +2 -2
  81. package/dist/bundle/{remote-4K5VPMC7.js → remote-34HUWSZI.js} +5 -5
  82. package/dist/bundle/{rerank-V24UJZYJ.js → rerank-ONBASQ5Z.js} +5 -5
  83. package/dist/bundle/{chunk-EMHCXXNJ.js → serve-UJ7FDYAM.js} +8 -6
  84. package/dist/bundle/{chunk-KJ3UADR3.js → server-GNT76BXM.js} +29 -9
  85. package/dist/bundle/server-J4YIXKMI.js +52 -0
  86. package/dist/bundle/{state-ZPYGECVP.js → state-IW5OO6IZ.js} +4 -4
  87. package/dist/bundle/{store-6JQCLPQF.js → store-55UB27H2.js} +12 -10
  88. package/dist/bundle/store-maintenance-command-BLDKUZ3L.js +42 -0
  89. package/dist/commands/comments.d.ts +3 -0
  90. package/dist/commands/comments.d.ts.map +1 -0
  91. package/dist/commands/comments.js +114 -0
  92. package/dist/commands/comments.js.map +1 -0
  93. package/dist/commands/session.d.ts +3 -0
  94. package/dist/commands/session.d.ts.map +1 -0
  95. package/dist/commands/session.js +96 -0
  96. package/dist/commands/session.js.map +1 -0
  97. package/dist/context.d.ts +83 -0
  98. package/dist/context.d.ts.map +1 -0
  99. package/dist/context.js +58 -0
  100. package/dist/context.js.map +1 -0
  101. package/dist/program.d.ts.map +1 -1
  102. package/dist/program.js +25 -4
  103. package/dist/program.js.map +1 -1
  104. package/dist/sample/comments.d.ts +61 -0
  105. package/dist/sample/comments.d.ts.map +1 -0
  106. package/dist/sample/comments.js +39 -0
  107. package/dist/sample/comments.js.map +1 -0
  108. package/dist/sample/transport.d.ts +42 -0
  109. package/dist/sample/transport.d.ts.map +1 -0
  110. package/dist/sample/transport.js +152 -0
  111. package/dist/sample/transport.js.map +1 -0
  112. package/dist/token.d.ts +16 -0
  113. package/dist/token.d.ts.map +1 -0
  114. package/dist/token.js +32 -0
  115. package/dist/token.js.map +1 -0
  116. package/dist/version.d.ts +1 -1
  117. package/dist/version.js +1 -1
  118. package/docs/commands.md +234 -12
  119. package/docs/configuration.md +1 -1
  120. package/docs/dev/reference-clis.md +3 -2
  121. package/docs/dev/skills/release/SKILL.md +9 -3
  122. package/docs/dev/skills/release/fresh-audit.md +1 -1
  123. package/docs/dev/test-matrix.md +36 -5
  124. package/docs/index.md +4 -3
  125. package/docs/security.md +4 -2
  126. package/kit/dist/new.js +7 -3
  127. package/lint/overrides.json +9 -1
  128. package/package.json +6 -7
  129. package/scripts/test-matrix-untested.ts +19 -0
  130. package/skills/clidev-cli/SKILL.md +1 -1
  131. package/src/commands/comments.ts +167 -0
  132. package/src/commands/session.ts +144 -0
  133. package/src/comments.test.ts +258 -0
  134. package/src/context.ts +78 -0
  135. package/src/mcp.test.ts +71 -76
  136. package/src/program.test.ts +9 -16
  137. package/src/program.ts +29 -4
  138. package/src/sample/comments.ts +51 -0
  139. package/src/sample/transport.test.ts +117 -0
  140. package/src/sample/transport.ts +184 -0
  141. package/src/testing/fake-comments.ts +167 -0
  142. package/src/testing/harness.ts +51 -0
  143. package/src/token.ts +42 -0
  144. package/src/version.ts +1 -1
  145. package/dist/bundle/all-profiles-NVB2HT2S.js +0 -24
  146. package/dist/bundle/chunk-GUFPQZUA.js +0 -48
  147. package/dist/bundle/chunk-NL2DQPT7.js +0 -2
  148. package/dist/bundle/first-screen-B2CF2CET.js +0 -26
  149. package/dist/bundle/mcp-ASNYBQ5B.js +0 -152
  150. package/dist/bundle/mcp-EY2NUYDQ.js +0 -82
  151. package/dist/bundle/serve-PJWSOV7F.js +0 -19
  152. package/dist/bundle/server-3TPCEZ6P.js +0 -40
  153. package/dist/bundle/server-GQX5MZTT.js +0 -53
  154. package/dist/bundle/store-maintenance-command-ND4ADMGC.js +0 -42
  155. package/dist/commands/doctor.d.ts +0 -77
  156. package/dist/commands/doctor.d.ts.map +0 -1
  157. package/dist/commands/doctor.js +0 -74
  158. package/dist/commands/doctor.js.map +0 -1
  159. package/dist/commands/mcp.d.ts +0 -3
  160. package/dist/commands/mcp.d.ts.map +0 -1
  161. package/dist/commands/mcp.js +0 -97
  162. package/dist/commands/mcp.js.map +0 -1
  163. package/dist/mcp.d.ts +0 -29
  164. package/dist/mcp.d.ts.map +0 -1
  165. package/dist/mcp.js +0 -98
  166. package/dist/mcp.js.map +0 -1
  167. package/src/commands/doctor.ts +0 -86
  168. package/src/commands/mcp.ts +0 -130
  169. package/src/mcp-http.test.ts +0 -172
  170. package/src/mcp.ts +0 -140
@@ -57,6 +57,41 @@ jobs:
57
57
  - run: pnpm test
58
58
  - run: pnpm smoke:node
59
59
 
60
+ # The template's own check: a CLI made from it has no kit/. Needs the network for npm and pnpm installs.
61
+ kit-e2e:
62
+ if: github.repository == 'WireCatLabs/cli-template'
63
+ runs-on: ubuntu-latest
64
+ timeout-minutes: 30
65
+ steps:
66
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
67
+ with:
68
+ persist-credentials: false
69
+ - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
70
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
71
+ with:
72
+ node-version: 24
73
+ cache: pnpm
74
+ - run: pnpm install --frozen-lockfile --ignore-scripts
75
+ - run: pnpm kit:e2e
76
+
77
+ # main's ruleset, the monthly minute and a parity group: the setup steps `new` prints, checked (cli-base new-cli.md).
78
+ repo-setup:
79
+ runs-on: ubuntu-latest
80
+ timeout-minutes: 5
81
+ steps:
82
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
83
+ with:
84
+ persist-credentials: false
85
+ - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
86
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
87
+ with:
88
+ node-version: 24
89
+ cache: pnpm
90
+ - run: pnpm install --frozen-lockfile --ignore-scripts
91
+ - env:
92
+ GH_TOKEN: ${{ github.token }}
93
+ run: pnpm exec cli-dev repo-check --cli clidev
94
+
60
95
  version:
61
96
  if: github.event_name == 'pull_request'
62
97
  runs-on: ubuntu-latest
@@ -0,0 +1,37 @@
1
+ name: Release pull request
2
+
3
+ # A pull request that changes the version says what was checked before it (WC-REL-17). `edited` reruns it when only
4
+ # the description changes.
5
+ on:
6
+ pull_request:
7
+ types: [opened, edited, synchronize, reopened]
8
+
9
+ concurrency:
10
+ group: release-pr-${{ github.event.pull_request.number }}
11
+ cancel-in-progress: true
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ conformance:
18
+ runs-on: ubuntu-latest
19
+ timeout-minutes: 5
20
+ steps:
21
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ with:
23
+ fetch-depth: 0
24
+ persist-credentials: false
25
+ - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
26
+ - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
27
+ with:
28
+ node-version: 24
29
+ cache: pnpm
30
+ - run: pnpm install --frozen-lockfile --ignore-scripts
31
+ - name: Conformance section of a release
32
+ env:
33
+ BODY: ${{ github.event.pull_request.body }}
34
+ BASE_SHA: ${{ github.event.pull_request.base.sha }}
35
+ run: |
36
+ printf '%s\n' "$BODY" > pr-body.md
37
+ pnpm exec cli-dev release-pr --base "$BASE_SHA" --body pr-body.md
package/AGENTS.md CHANGED
@@ -10,13 +10,67 @@ touches (`WC-<AREA>-<n>`) in the commit message and the pull request. The rules
10
10
 
11
11
  [docs/dev/DESIGN.md](docs/dev/DESIGN.md) holds the owner's answers to the
12
12
  [design interview](docs/dev/skills/design-interview/SKILL.md) and the decisions made since. Read it before changing
13
- what a command does, and write a new decision there. Learn the patterns for the provider, the store and the commands
14
- from the reference CLI below; the template has no sample code on purpose.
13
+ what a command does, and write a new decision there. Learn how a command reaches a service from the sample below,
14
+ and the domain, the store and its commands from the reference CLI.
15
15
 
16
16
  <!-- cli-template:reference-cli:start -->
17
17
  The reference CLI is not chosen yet; see [Reference CLIs](docs/dev/reference-clis.md).
18
18
  <!-- cli-template:reference-cli:end -->
19
19
 
20
+ ## The sample: what to keep, what to replace
21
+
22
+ <!-- cspell:words gcal SECR -->
23
+
24
+ The template ships one working command group, `comments`, against a made-up service, Example Comments, whose address
25
+ never resolves. It shows every pattern a command that reaches a service needs, each tested against a strict fake of
26
+ the service. Build your first command on it: keep the patterns, replace the service. Delete the rest of the sample
27
+ once your own commands cover every pattern below; until then `pnpm test` keeps it working. A CLI made before the
28
+ sample has no `src/sample/`; read it in [cli-template](https://github.com/WireCatLabs/cli-template/tree/main/src).
29
+ Comments marked `SAMPLE:` in the code say what to replace.
30
+
31
+ Keep, the same for every service:
32
+
33
+ - **Token storage**, `src/token.ts`: cli-base `Credentials`, the environment variable, then the keyring, then a
34
+ private file; a run with moved folders never replaces the owner's entry (WC-SECR-4, WC-SECR-24).
35
+ - **Sign-in**, `src/commands/session.ts`: `session start | status | end | list`. The token is read hidden or from
36
+ stdin, never as an argument, and checked against the service before it is kept (WC-ACCT-12, WC-SECR-5). Replace
37
+ the `me` check with your service's. A service with OAuth signs in through cli-core's oauth module instead, as
38
+ [gcal-cli](https://github.com/WireCatLabs/gcal-cli) does (WC-SECR-22).
39
+ - **The command context**, `src/context.ts`: settings, the keyring and the run come from cli-core's `baseContext`
40
+ only, and every request runs inside its `run()`, with the `events` it gives passed to the transport. That is what
41
+ bounds a command by `--timeout` and records a run named after it (WC-LIFE-5, WC-LIFE-15).
42
+ - **Permissions**, `src/program.ts` and `src/config.ts`: the program hands cli-core the whole `configuration`, and
43
+ each command path is its own key (WC-PERM-22). A command that reaches the service another way, such as an
44
+ `api call`, also checks the key of the command it does the same as, with `alsoChecks`.
45
+ - **Writes**, `write` in `src/commands/comments.ts`: the guard asks or refuses by the command's key, the send journal
46
+ records the attempt, the answer carries `operation_id`, and a write is never retried: one that got no answer is
47
+ `outcome_unknown` (WC-PERM-13, WC-PERM-17, WC-OUT-10, WC-LIFE-9). `--dry-run` and `<PREFIX>_READ_ONLY` are
48
+ cli-core's; declare no `--dry-run` of your own.
49
+ - **MCP and doctor**, `src/program.ts`: cli-core's `appMcpCommand` and `appDoctorCommand`, never a copy of them.
50
+ Rewrite `name` and `untrusted` for your service (WC-MCP-11).
51
+ - **The test harness**, `src/testing/harness.ts`: the CLI through its own `run()`, with a memory keyring and the fake
52
+ in place of the network (WC-TEST-2, WC-TEST-3, WC-TEST-6).
53
+
54
+ Replace, your service's own:
55
+
56
+ - **The transport**, `src/sample/transport.ts`: the token in a header only, no redirects, a timeout, cli-core's
57
+ `Pacer`, cli-base's error codes and no retry (WC-SECR-6, WC-SECR-7, WC-OUT-20). Keep its shape; take the address,
58
+ the header and the error mapping from your service's documentation.
59
+ - **Wire shapes and the mapper**, `src/sample/comments.ts`: each field name from the documentation or a captured
60
+ answer, never from memory; no wire type leaves this file (WC-ARCH-3).
61
+ - **The commands**, `src/commands/comments.ts`: a list with `withPaging`, `withQuery` and `answerEntity`, so
62
+ `--json=a,b` and the MCP schema come from one schema (WC-CMD-19, WC-CMD-20); `show`; `create` and `update`.
63
+ - **The strict fake**, `src/testing/fake-comments.ts`: it refuses an unknown path, parameter or field, so a name typed
64
+ from memory fails a test instead of reaching the owner's account. Build yours from the documentation.
65
+ - **The tests**, `src/comments.test.ts` and `src/sample/transport.test.ts`. Keep each case for your commands: a deny
66
+ stops a read before any request, `--dry-run` sends nothing, a lost write is `outcome_unknown`, a recorded run is
67
+ named after its command, and the token reaches no output, run record or file.
68
+
69
+ Remove the sample only once your own commands and their tests cover each pattern above: the skeleton alone is below
70
+ the coverage floor, and the floor is never lowered (WC-TEST-11). To remove it, unmount `commentsCommand` in `src/program.ts` and delete `src/sample/`,
71
+ `src/commands/comments.ts`, `src/testing/fake-comments.ts` and their tests. Then run `pnpm generate`,
72
+ `pnpm exec cli-contract contracts/plan.json --update` and `pnpm test:matrix`.
73
+
20
74
  ## Template-owned files
21
75
 
22
76
  This CLI was made from [cli-template](https://github.com/WireCatLabs/cli-template). `template.json` names the files
package/CHANGELOG.md CHANGED
@@ -5,6 +5,56 @@ Notable changes to `@wirecat/cli-template`. One section per version, newest firs
5
5
 
6
6
  <!-- cspell:words clawhub gcal katex openclaw smol whatsapp -->
7
7
 
8
+ ## 0.17.0 — 07.11.2026
9
+
10
+ ### Added
11
+
12
+ - **CI fails a CLI made from the template on mistakes no check caught before.** `contracts/plan.json`
13
+ has a `deny` block (cli-testing 0.6.0): in an empty home, each command that reaches the service gets `deny` in the
14
+ profile and must exit 5 before any request, on the command line and over `mcp serve`. Biome refuses a
15
+ `resolveSettings` call outside `baseContext` (cli-base's `no-own-settings` plugin). `release-pr.yml` fails a pull
16
+ request that changes the version without a `## Conformance` section, and `bin/release` refuses a version with no
17
+ passed live check in `docs/dev/live-checks.txt` (`cli-dev live record`), or whose code changed since. The
18
+ `repo-setup` job in `ci.yml` checks main's ruleset, a monthly cron minute no other repository holds, and the CLI in
19
+ a parity group: the three setup steps `new` prints. The skeleton moves to cli-core 0.595.0 and cli-base 0.80.3
20
+ (from 0.584.0 and 0.77.1) for them.
21
+
22
+ ## 0.16.0 — 06.11.2026
23
+
24
+ ### Added
25
+
26
+ - **`pnpm kit:e2e` runs in CI and checks more.** It makes a CLI with a short name and one with a long name, since a
27
+ rename changes line lengths, and runs `pnpm lint` in each besides `ci:quick` and `test:coverage`. A rename that
28
+ broke Biome's formatting passed it before. The `kit-e2e` job in `.github/workflows/ci.yml` runs it on every pull
29
+ request and merge, in this repository only: a CLI made from the template has no `kit/` and skips the job.
30
+
31
+ - **A working sample shows every pattern a command that reaches a service needs.** `comments list | show | create |
32
+ update` and `session start | status | end | list` reach Example Comments, a made-up service whose address never
33
+ resolves. The token is kept with cli-base's `Credentials`; every request runs inside cli-core's `baseContext` run
34
+ with its `events`; the transport keeps the token in a header, times out and never retries; writes pass the guard
35
+ and the send journal and answer with `operation_id`, and a lost write is `outcome_unknown`. The tests run against a
36
+ strict fake that refuses unknown paths, parameters and fields. `AGENTS.md` lists what to keep and what to replace,
37
+ pattern by pattern, with the rules each follows, and the code marks each replaceable part with `SAMPLE:`. Before,
38
+ the template had no sample, and agents copied the patterns from other CLIs, their bugs included.
39
+
40
+ ### Changed — may break callers
41
+
42
+ - **MCP and doctor are cli-core's.** `src/program.ts` mounts `appMcpCommand` and `appDoctorCommand`, as gcal-cli
43
+ does, in place of the template's own `src/mcp.ts`, `src/commands/mcp.ts` and `src/commands/doctor.ts`. `mcp` gains
44
+ `config`, `add`, `check`, `--profiles` and `--permission`; `doctor` gains `--online`, and its answer `store` and
45
+ `profile_lock`. A CLI made from an older skeleton swaps them the same way and removes `@modelcontextprotocol/server`
46
+ and `@modelcontextprotocol/client` from its dependencies.
47
+
48
+ ### Fixed
49
+
50
+ - **A new CLI passes `pnpm lint` from its first commit.** Renaming `clidev` changes line lengths, so Biome wraps some
51
+ lines differently, and the first commit's hook or CI failed on formatting. `new`'s next steps now run
52
+ `pnpm lint:fix` after `pnpm install`, and `kit:e2e` does the same before it runs `pnpm lint`.
53
+ - **The MCP server applies the permission table too (WC-PERM-23).** `src/mcp.ts` built its tools without it, so a
54
+ command a profile denies was offered to an agent as available and ran. It now passes `permissions` to
55
+ `toolsFromCommands` and to each tool call: the command is listed as unavailable and refused before it runs. A CLI
56
+ made from an older skeleton adds `permissions` in both places by hand.
57
+
8
58
  ## 0.15.0 — 06.11.2026
9
59
 
10
60
  ### Fixed
package/README.md CHANGED
@@ -5,8 +5,9 @@
5
5
 
6
6
  `clidev` is a command-line tool started from [cli-template](https://github.com/WireCatLabs/cli-template), the kit for
7
7
  new WireCat CLIs. It is a working skeleton: the shared root commands, the settings, the agent skill and the MCP
8
- server run, and every check of the WireCat standards passes. It does not connect to a service yet. Replace this page
9
- with the tool's own introduction once it does.
8
+ server run, and every check of the WireCat standards passes. Its one service is a sample, Example Comments, made up
9
+ to show how a command reaches a service; its address never resolves. Replace this page with the tool's own
10
+ introduction once the CLI reaches its real service.
10
11
 
11
12
  To start a new CLI from the template:
12
13
 
@@ -30,6 +31,8 @@ such as `personal` in `clidev personal config show`; none is ever assumed. `CLID
30
31
  | Command | What it does |
31
32
  | --- | --- |
32
33
  | `clidev doctor` | Checks this installation: version, paths, settings and profiles, without the network |
34
+ | `clidev personal session start` | Signs the profile in with the service's token, kept in the OS keyring |
35
+ | `clidev personal comments list` | The sample: lists, shows, creates and updates comments in Example Comments |
33
36
  | `clidev commands --json` | Prints every command as JSON, for agents and scripts |
34
37
  | `clidev personal config show` | Shows each setting and where it came from |
35
38
  | `clidev skill install` | Installs the agent skill for Claude Code, Codex, Gemini CLI and OpenClaw; `--for hermes` for Hermes Agent |
@@ -57,6 +60,9 @@ keeps the shared files in step later, so a CLI made today does not drift from on
57
60
  - **`upgrade`** merges each template change into your CLI file by file, and asks before it touches a file you changed.
58
61
  - **The skeleton runs.** The shared root commands, settings with permissions, the agent skill and the MCP server
59
62
  work before a line of your own code.
63
+ - **A sample shows every pattern.** `comments` reaches a made-up service the way a real command must: the token in
64
+ the keyring, every request inside cli-core's run, writes behind the guard, and a strict fake in the tests.
65
+ `AGENTS.md` lists what to keep and what to replace.
60
66
  - **Every check is wired in:** lint, types, tests with a coverage floor, command contracts, the docs checks and the
61
67
  release script.
62
68
 
@@ -66,7 +72,8 @@ The copy tool is described in [kit/README.md](kit/README.md).
66
72
 
67
73
  A profile is a name you choose for one account, such as `personal` or `work`. It is the first word of every command
68
74
  that uses an account. No profile is ever assumed: a command without one stops and lists the profiles on this
69
- computer. The skeleton has no sign-in yet; the CLI built from it adds one.
75
+ computer. `session start` signs a profile in; its token goes to the OS keyring, or to a private file where no
76
+ keyring works.
70
77
 
71
78
  ## Settings and permissions
72
79
 
@@ -80,7 +87,8 @@ The skeleton connects to no service, keeps no messages and has no commands of it
80
87
 
81
88
  ## Security
82
89
 
83
- `clidev` keeps its settings and state on this computer and sends nothing to any service yet. See
90
+ `clidev` keeps its settings and state on this computer, and its token in the OS keyring. Its only service is the
91
+ sample's, whose address never resolves. See
84
92
  [Security](docs/security.md), and report a vulnerability privately as [SECURITY.md](SECURITY.md) says.
85
93
 
86
94
  ## When it does not work
package/bin/release CHANGED
@@ -52,6 +52,9 @@ git fetch -q origin
52
52
  pnpm install --frozen-lockfile
53
53
  package=$(node -p 'require("./package.json").name')
54
54
  version=$(node -p 'require("./package.json").version')
55
+ # The code released is the code a person checked against the real service (WC-REL-17). template.json is the
56
+ # template's own file, never copied: the template has no service.
57
+ [ -f template.json ] || pnpm exec cli-dev live check --version "$version"
55
58
  # A 404 for a package npm has never seen is "not published", like any other failure of `npm view`.
56
59
  published() {
57
60
  npm view "$package@$version" version --prefer-online >/dev/null 2>&1
@@ -76,10 +79,10 @@ land() {
76
79
  pr=$(gh pr create --base main --head "$branch" --title "$title" --body "$body")
77
80
  # Checks register a few seconds after the pull request; --watch with none exits at once.
78
81
  for _ in $(seq 30); do
79
- [ "$(gh pr checks "$pr" --json name --jq length 2>/dev/null || echo 0)" -gt 0 ] && break
82
+ [ "$(gh pr checks "$pr" --required --json name --jq length 2>/dev/null || echo 0)" -gt 0 ] && break
80
83
  sleep 2
81
84
  done
82
- gh pr checks "$pr" --watch --fail-fast >/dev/null ||
85
+ gh pr checks "$pr" --watch --required --fail-fast >/dev/null ||
83
86
  { echo "checks failed on $pr — nothing is published" >&2; exit 1; }
84
87
  git fetch -q origin
85
88
  [ "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)" ] ||
@@ -125,7 +128,11 @@ if [ "$next" != "$version" ]; then
125
128
  const today = new Date().toLocaleDateString("en-GB").replaceAll("/", ".")
126
129
  if (taken) swap("CHANGELOG.md", "\n## Unreleased\n", `\n## ${n} — ${today}\n`)
127
130
  else swap("CHANGELOG.md", `\n## ${o} — `, `\n## ${n} — `)' "$version" "$next" "$taken"
128
- body="bin/release: $why. Only the number changes: package.json, src/version.ts, the CHANGELOG heading."
131
+ body="bin/release: $why. Only the number changes: package.json, src/version.ts, the CHANGELOG heading.
132
+
133
+ ## Conformance
134
+
135
+ The release pull request of $version recorded the checks; this one changes only its number."
129
136
  land "release/$next" "chore(release): $next" "$body"
130
137
  rerun_if_changed "$@"
131
138
  version=$next
package/biome.json CHANGED
@@ -3,9 +3,15 @@
3
3
  "includes": ["**", "!**/node_modules", "!**/dist", "!.worktrees", "!pnpm-lock.yaml", "!config/wirecat"]
4
4
  },
5
5
  "extends": ["./config/wirecat/biome.base.json"],
6
+ "plugins": [
7
+ {
8
+ "path": "./node_modules/@wirecat/cli-base/config/lint/no-own-settings.grit",
9
+ "includes": ["src/**", "!**/*.test.ts", "!src/testing/**"]
10
+ }
11
+ ],
6
12
  "overrides": [
7
13
  {
8
- "includes": ["src/**", "!src/mcp.ts", "!**/*.test.ts"],
14
+ "includes": ["src/**", "!**/*.test.ts"],
9
15
  "linter": {
10
16
  "rules": {
11
17
  "style": {
@@ -15,7 +21,7 @@
15
21
  "patterns": [
16
22
  {
17
23
  "group": ["@modelcontextprotocol/**"],
18
- "message": "only src/mcp.ts serves MCP; commands and services do not know the protocol"
24
+ "message": "cli-core's appMcpCommand serves MCP; commands and services do not know the protocol"
19
25
  }
20
26
  ]
21
27
  }
@@ -18,7 +18,7 @@
18
18
  "type": "object"
19
19
  },
20
20
  "command": {
21
- "description": "a command clidev_tools_search returned: \"runs list\"",
21
+ "description": "a command clidev_tools_search returned: \"session list\"",
22
22
  "minLength": 1,
23
23
  "type": "string"
24
24
  }
@@ -542,7 +542,7 @@
542
542
  "type": "object"
543
543
  },
544
544
  "command": {
545
- "description": "a command clidev_tools_search returned: \"runs list\"",
545
+ "description": "a command clidev_tools_search returned: \"session list\"",
546
546
  "minLength": 1,
547
547
  "type": "string"
548
548
  }
@@ -46,5 +46,6 @@
46
46
  "mcp": {
47
47
  "args": ["personal", "mcp", "serve"],
48
48
  "snapshot": "mcp-tools.json"
49
- }
49
+ },
50
+ "deny": { "profile": "personal" }
50
51
  }
@@ -9,7 +9,7 @@ if (
9
9
  (words[0] === "--version" || words[0] === "-V") &&
10
10
  !Object.keys(process.env).some((key) => key.endsWith("_TEST_ARGV_LOG"))
11
11
  ) {
12
- process.stdout.write("0.15.0\n")
12
+ process.stdout.write("0.17.0\n")
13
13
  } else {
14
14
  // Before the bundle compiles: the bundle's own call comes after its chunks.
15
15
  module.enableCompileCache()
@@ -28,7 +28,7 @@ if (
28
28
  : next(specifier, context),
29
29
  })
30
30
  }
31
- const chunks = ["../bundle/all-profiles-NVB2HT2S.js","../bundle/anthropic-ICTW7CNQ.js","../bundle/app-server-OW5LT5XV.js","../bundle/bun-ILPS6AYA.js","../bundle/bun-sqlite-JE6FJFQT.js","../bundle/decode-NXB5UKMO.js","../bundle/dist-ESHIQU4M.js","../bundle/echarts-DRDGGHJT.js","../bundle/embed-IKZ24BMC.js","../bundle/embedder-GMQ24DOQ.js","../bundle/first-screen-B2CF2CET.js","../bundle/instructions-EOQOXY6V.js","../bundle/mcp-7HBLFGCW.js","../bundle/mcp-ASNYBQ5B.js","../bundle/mcp-EY2NUYDQ.js","../bundle/node-52WF2326.js","../bundle/node-P4E63KXA.js","../bundle/node-TLZSIHIJ.js","../bundle/node-sqlite-73Z4SFOA.js","../bundle/oauth-EVTPAMZP.js","../bundle/open-46WZAPJ3.js","../bundle/openai-GWRDAHDU.js","../bundle/process-YIQPKLZI.js","../bundle/program-37NVH5YJ.js","../bundle/prompt-IVEYRLS5.js","../bundle/recognize-WVEKHODM.js","../bundle/remote-4K5VPMC7.js","../bundle/rerank-V24UJZYJ.js","../bundle/serve-PJWSOV7F.js","../bundle/server-3TPCEZ6P.js","../bundle/server-GQX5MZTT.js","../bundle/state-ZPYGECVP.js","../bundle/store-6JQCLPQF.js","../bundle/store-maintenance-command-ND4ADMGC.js"]
31
+ const chunks = ["../bundle/all-profiles-CCT2XPJL.js","../bundle/anthropic-QLLP7EE4.js","../bundle/app-server-ELI5TGL7.js","../bundle/bun-C7JS2V7G.js","../bundle/bun-sqlite-OM72TCYT.js","../bundle/decode-V7HNHZBC.js","../bundle/dist-ESHIQU4M.js","../bundle/echarts-Y42YP2OL.js","../bundle/embed-JSQZL7JF.js","../bundle/embedder-7BHRCXWL.js","../bundle/first-screen-5YHQVNY4.js","../bundle/instructions-UWERND54.js","../bundle/mcp-P4FSBSRS.js","../bundle/node-P4E63KXA.js","../bundle/node-PZDNPKN7.js","../bundle/node-TLZSIHIJ.js","../bundle/node-sqlite-4F5NLRNT.js","../bundle/oauth-VDXNA3DK.js","../bundle/open-EUJRQQNS.js","../bundle/openai-EIBV2K72.js","../bundle/process-XD5ZIFIL.js","../bundle/program-TJTVMIOX.js","../bundle/prompt-LYUZNHDK.js","../bundle/recognize-LQMHLOD5.js","../bundle/remote-34HUWSZI.js","../bundle/rerank-ONBASQ5Z.js","../bundle/serve-UJ7FDYAM.js","../bundle/server-GNT76BXM.js","../bundle/server-J4YIXKMI.js","../bundle/state-IW5OO6IZ.js","../bundle/store-55UB27H2.js","../bundle/store-maintenance-command-BLDKUZ3L.js"]
32
32
  if (((words) => words
33
33
  .filter((word) => !word.startsWith("-"))
34
34
  .slice(0, 2)
@@ -2,22 +2,26 @@ import { createRequire as __bundleRequire } from "node:module";
2
2
  const require = __bundleRequire(import.meta.url);
3
3
  import {
4
4
  answeredWire
5
- } from "./chunk-VS5LGSTM.js";
5
+ } from "./chunk-6VCFDEHT.js";
6
6
  import {
7
7
  CALLER_META_KEY,
8
8
  PROXY_CLIENT_NAME,
9
9
  StdioServerTransport,
10
10
  callerOf,
11
11
  serveStdio
12
- } from "./chunk-F34HGYWF.js";
12
+ } from "./chunk-3VVIEZRY.js";
13
13
  import {
14
14
  McpServer
15
15
  } from "./chunk-5D4AEUVA.js";
16
+ import "./chunk-S465TCR3.js";
17
+ import "./chunk-YIH3PYWJ.js";
18
+ import "./chunk-MLSN3UP4.js";
19
+ import "./chunk-Y5E2WNWB.js";
16
20
  import {
17
21
  __name
18
22
  } from "./chunk-ZVVMGPBJ.js";
19
23
 
20
- // node_modules/.pnpm/@wirecat+cli-core@0.584.0_@wirecat+cli-base@0.77.1_commander@15.0.0_esbuild@0.28.2_type_ab8c0b68b8b4768d5b87d6e249ef10da/node_modules/@wirecat/cli-core/dist/mcp/all-profiles.js
24
+ // node_modules/.pnpm/@wirecat+cli-core@0.595.0_@wirecat+cli-base@0.80.3_commander@15.0.0_esbuild@0.28.2_type_2c96d170c489856a39cafd5889a9e4ba/node_modules/@wirecat/cli-core/dist/mcp/all-profiles.js
21
25
  import { spawn } from "node:child_process";
22
26
  import { randomUUID } from "node:crypto";
23
27
  var PROTOCOL = "2025-06-18";
@@ -251,7 +255,7 @@ var serveAllProfilesOverStdio = /* @__PURE__ */ __name(async (options, io = {})
251
255
  }, "serveAllProfilesOverStdio");
252
256
  var serveAllProfilesOverHttp = /* @__PURE__ */ __name(async (options, http) => {
253
257
  const { build, close } = allProfilesServer(options);
254
- const { serveOverHttp } = await import("./serve-PJWSOV7F.js");
258
+ const { serveOverHttp } = await import("./serve-UJ7FDYAM.js");
255
259
  const listening = await serveOverHttp(build, {
256
260
  ...http,
257
261
  appName: options.command,
@@ -271,11 +275,10 @@ var serveAllProfilesOverHttp = /* @__PURE__ */ __name(async (options, http) => {
271
275
  }, "close")
272
276
  };
273
277
  }, "serveAllProfilesOverHttp");
274
-
275
278
  export {
276
279
  CHILD_IDLE_MS,
277
- withProfile,
278
280
  allProfilesServer,
281
+ serveAllProfilesOverHttp,
279
282
  serveAllProfilesOverStdio,
280
- serveAllProfilesOverHttp
283
+ withProfile
281
284
  };
@@ -2,11 +2,11 @@ import { createRequire as __bundleRequire } from "node:module";
2
2
  const require = __bundleRequire(import.meta.url);
3
3
  import {
4
4
  checkedOptions
5
- } from "./chunk-R5RYPD23.js";
5
+ } from "./chunk-HVAEHUSZ.js";
6
6
  import {
7
7
  messagesFor,
8
8
  systemFor
9
- } from "./chunk-LATYBJ4T.js";
9
+ } from "./chunk-WQBBSVZM.js";
10
10
  import {
11
11
  Anthropic
12
12
  } from "./chunk-ADLS6FVG.js";
@@ -15,13 +15,13 @@ import {
15
15
  optional,
16
16
  strictObject,
17
17
  string
18
- } from "./chunk-IOJ2DTCY.js";
18
+ } from "./chunk-MLSN3UP4.js";
19
19
  import "./chunk-Y5E2WNWB.js";
20
20
  import {
21
21
  __name
22
22
  } from "./chunk-ZVVMGPBJ.js";
23
23
 
24
- // node_modules/.pnpm/@wirecat+cli-core@0.584.0_@wirecat+cli-base@0.77.1_commander@15.0.0_esbuild@0.28.2_type_ab8c0b68b8b4768d5b87d6e249ef10da/node_modules/@wirecat/cli-core/dist/models/anthropic.js
24
+ // node_modules/.pnpm/@wirecat+cli-core@0.595.0_@wirecat+cli-base@0.80.3_commander@15.0.0_esbuild@0.28.2_type_2c96d170c489856a39cafd5889a9e4ba/node_modules/@wirecat/cli-core/dist/models/anthropic.js
25
25
  var options = strictObject({
26
26
  stop_sequences: optional(array(string()))
27
27
  });
@@ -3,48 +3,47 @@ const require = __bundleRequire(import.meta.url);
3
3
  import {
4
4
  PER_RUN,
5
5
  envelope
6
- } from "./chunk-5GTMQTQH.js";
7
- import "./chunk-NG7MOJBT.js";
6
+ } from "./chunk-ZRNBKTPP.js";
8
7
  import {
9
8
  mcpUrlOf
10
- } from "./chunk-GUFPQZUA.js";
9
+ } from "./chunk-GG5PXNMH.js";
11
10
  import {
12
11
  answeredWire
13
- } from "./chunk-VS5LGSTM.js";
12
+ } from "./chunk-6VCFDEHT.js";
14
13
  import {
15
14
  answered,
16
15
  failed,
17
16
  registerCommands,
18
17
  runCommandForAgent,
19
18
  toolsFromCommands
20
- } from "./chunk-7UPBPE3Z.js";
19
+ } from "./chunk-ASO23RNM.js";
21
20
  import {
22
21
  agentJson,
23
22
  skillResource
24
- } from "./chunk-NVGOHYTE.js";
23
+ } from "./chunk-SQKP6V4S.js";
25
24
  import {
26
25
  StdioServerTransport,
27
26
  serveStdio
28
- } from "./chunk-F34HGYWF.js";
29
- import "./chunk-KLFYY7KC.js";
30
- import "./chunk-GHF72SHT.js";
31
- import "./chunk-PIJUGF5F.js";
32
- import "./chunk-2DAXUNTS.js";
33
- import "./chunk-AS2PJNQ2.js";
34
- import "./chunk-7Z4HR6GO.js";
27
+ } from "./chunk-3VVIEZRY.js";
28
+ import "./chunk-BOCIYBBO.js";
29
+ import "./chunk-EQDVQN4E.js";
30
+ import "./chunk-ITPFCKCL.js";
31
+ import "./chunk-QVPTZDRA.js";
32
+ import "./chunk-R5IY4O25.js";
33
+ import "./chunk-KRXN3FV3.js";
35
34
  import {
36
35
  appInstructions
37
- } from "./chunk-G45R7M42.js";
36
+ } from "./chunk-RT46AWIH.js";
38
37
  import {
39
38
  McpServer
40
39
  } from "./chunk-5D4AEUVA.js";
41
40
  import {
42
41
  mcpHttpMarker
43
- } from "./chunk-6AW4DDK4.js";
44
- import "./chunk-DZLHY4IA.js";
45
- import "./chunk-SOYOOU2D.js";
46
- import "./chunk-LATYBJ4T.js";
47
- import "./chunk-NRZV7K4M.js";
42
+ } from "./chunk-XS56LIQ7.js";
43
+ import "./chunk-RGKXMVOZ.js";
44
+ import "./chunk-X44ZT64I.js";
45
+ import "./chunk-WQBBSVZM.js";
46
+ import "./chunk-RUHNHEAF.js";
48
47
  import {
49
48
  DEFAULT_OUTPUT_BYTES,
50
49
  changesAuthorityAt,
@@ -54,31 +53,31 @@ import {
54
53
  readOnlyLockOf,
55
54
  readsOverMcpAt,
56
55
  rootOf2 as rootOf
57
- } from "./chunk-VVGPAHUN.js";
58
- import "./chunk-VXOR76ZL.js";
59
- import "./chunk-U6QD3J3F.js";
60
- import "./chunk-VOTEB3AN.js";
61
- import "./chunk-NVNUUHT5.js";
62
- import "./chunk-R2JKPHH5.js";
63
- import "./chunk-YOJLIVGO.js";
64
- import "./chunk-3WDYHOAF.js";
65
- import "./chunk-TJJ2XSJP.js";
66
- import "./chunk-NH6LZ3H3.js";
67
- import "./chunk-3MDNAYQA.js";
68
- import "./chunk-CGFQT3LQ.js";
69
- import "./chunk-DQIBGCF3.js";
70
- import "./chunk-45244QQ6.js";
71
- import "./chunk-62JRF2JA.js";
56
+ } from "./chunk-UW4PJZVJ.js";
57
+ import "./chunk-S465TCR3.js";
58
+ import "./chunk-XKL5FRH3.js";
59
+ import "./chunk-AUVPTFUS.js";
60
+ import "./chunk-QLBS6OC2.js";
61
+ import "./chunk-URPKIONS.js";
62
+ import "./chunk-QJS4WWYK.js";
63
+ import "./chunk-YIH3PYWJ.js";
64
+ import "./chunk-BXZRTMXA.js";
65
+ import "./chunk-FF3AGTHY.js";
66
+ import "./chunk-O6PBO4BU.js";
67
+ import "./chunk-6PHTRAZA.js";
68
+ import "./chunk-J2RUBXCI.js";
69
+ import "./chunk-LFLN6PVS.js";
70
+ import "./chunk-AKUMR7PE.js";
72
71
  import {
73
72
  CliError,
74
73
  mcpErrorResult
75
- } from "./chunk-IOJ2DTCY.js";
74
+ } from "./chunk-MLSN3UP4.js";
76
75
  import "./chunk-Y5E2WNWB.js";
77
76
  import {
78
77
  __name
79
78
  } from "./chunk-ZVVMGPBJ.js";
80
79
 
81
- // node_modules/.pnpm/@wirecat+cli-core@0.584.0_@wirecat+cli-base@0.77.1_commander@15.0.0_esbuild@0.28.2_type_ab8c0b68b8b4768d5b87d6e249ef10da/node_modules/@wirecat/cli-core/dist/mcp/app-server.js
80
+ // node_modules/.pnpm/@wirecat+cli-core@0.595.0_@wirecat+cli-base@0.80.3_commander@15.0.0_esbuild@0.28.2_type_2c96d170c489856a39cafd5889a9e4ba/node_modules/@wirecat/cli-core/dist/mcp/app-server.js
82
81
  var EXCLUDED = [["mcp"]];
83
82
  var createAppServer = /* @__PURE__ */ __name((command, context, options) => {
84
83
  const { app } = options;
@@ -193,7 +192,7 @@ var serveAppOverStdio = /* @__PURE__ */ __name(async (command, context, options)
193
192
  var serveAppOverHttp = /* @__PURE__ */ __name(async (command, context, options, http) => {
194
193
  const { app } = options;
195
194
  const { build } = createAppServer(command, context, options);
196
- const { serveOverHttp } = await import("./serve-PJWSOV7F.js");
195
+ const { serveOverHttp } = await import("./serve-UJ7FDYAM.js");
197
196
  const listening = await serveOverHttp(build, {
198
197
  ...http,
199
198
  appName: app.command,
@@ -18,12 +18,12 @@ import {
18
18
  jitCompatCheck,
19
19
  refineSqliteCodecs,
20
20
  sql
21
- } from "./chunk-CGFQT3LQ.js";
21
+ } from "./chunk-6PHTRAZA.js";
22
22
  import {
23
23
  __name
24
24
  } from "./chunk-ZVVMGPBJ.js";
25
25
 
26
- // node_modules/.pnpm/@wirecat+cli-core@0.584.0_@wirecat+cli-base@0.77.1_commander@15.0.0_esbuild@0.28.2_type_ab8c0b68b8b4768d5b87d6e249ef10da/node_modules/@wirecat/cli-core/dist/store/sqlite/drizzle/bun.js
26
+ // node_modules/.pnpm/@wirecat+cli-core@0.595.0_@wirecat+cli-base@0.80.3_commander@15.0.0_esbuild@0.28.2_type_2c96d170c489856a39cafd5889a9e4ba/node_modules/@wirecat/cli-core/dist/store/sqlite/drizzle/bun.js
27
27
  import { Database } from "bun:sqlite";
28
28
  var bunSQLiteCodecs = refineSqliteCodecs({
29
29
  "integer:boolean": { normalize: booleanFromInteger },
@@ -3,8 +3,8 @@ const require = __bundleRequire(import.meta.url);
3
3
  import {
4
4
  loadVectorExtension,
5
5
  vectorExtension
6
- } from "./chunk-LFLSV353.js";
7
- import "./chunk-IOJ2DTCY.js";
6
+ } from "./chunk-GUCMIUNB.js";
7
+ import "./chunk-MLSN3UP4.js";
8
8
  import {
9
9
  importFrom
10
10
  } from "./chunk-Y5E2WNWB.js";
@@ -12,7 +12,7 @@ import {
12
12
  __name
13
13
  } from "./chunk-ZVVMGPBJ.js";
14
14
 
15
- // node_modules/.pnpm/@wirecat+cli-core@0.584.0_@wirecat+cli-base@0.77.1_commander@15.0.0_esbuild@0.28.2_type_ab8c0b68b8b4768d5b87d6e249ef10da/node_modules/@wirecat/cli-core/dist/store/drivers/bun-sqlite.js
15
+ // node_modules/.pnpm/@wirecat+cli-core@0.595.0_@wirecat+cli-base@0.80.3_commander@15.0.0_esbuild@0.28.2_type_2c96d170c489856a39cafd5889a9e4ba/node_modules/@wirecat/cli-core/dist/store/drivers/bun-sqlite.js
16
16
  var customised = false;
17
17
  var ownLibrary = /* @__PURE__ */ __name(async () => {
18
18
  try {