@wirecat/cli-template 0.11.0 → 0.12.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.
@@ -252,3 +252,65 @@ jobs:
252
252
  exit 0
253
253
  fi
254
254
  exit "$status"
255
+
256
+ mcp-registry-dry-run:
257
+ needs: build
258
+ if: inputs.dry_run && github.repository != 'WireCatLabs/cli-template'
259
+ runs-on: ubuntu-latest
260
+ permissions:
261
+ contents: read
262
+ env:
263
+ VERSION: ${{ needs.build.outputs.version }}
264
+ MCP_PUBLISHER_VERSION: 1.8.5
265
+ MCP_PUBLISHER_SHA256: 2d151ac57275c9a6684d9d22b1cba81058bab195ea0a162e8fce3c6a5ec32812
266
+ steps:
267
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
268
+ with:
269
+ persist-credentials: false
270
+ - name: mcp-publisher
271
+ if: hashFiles('server.json') != ''
272
+ run: |
273
+ curl -sSfLo mcp-publisher.tar.gz "https://github.com/modelcontextprotocol/registry/releases/download/v${MCP_PUBLISHER_VERSION}/mcp-publisher_linux_amd64.tar.gz"
274
+ echo "${MCP_PUBLISHER_SHA256} mcp-publisher.tar.gz" | sha256sum -c -
275
+ tar -xzf mcp-publisher.tar.gz mcp-publisher
276
+ - name: validate server.json
277
+ if: hashFiles('server.json') != ''
278
+ run: |
279
+ jq --arg v "$VERSION" '.version = $v | .packages[0].version = $v' server.json > server.tmp && mv server.tmp server.json
280
+ ./mcp-publisher validate
281
+
282
+ # After the tag, so a registry failure never holds back the npm release. A CLI without server.json, or without the
283
+ # key, publishes nothing and says so: the key proves wirecat.dev's DNS record (bin/setup-mcp-registry-key in
284
+ # wirecat-desktop), and the registry checks package.json's mcpName in the version npm already has.
285
+ mcp-registry:
286
+ needs: [build, tag]
287
+ if: ${{ !inputs.dry_run && github.repository != 'WireCatLabs/cli-template' }}
288
+ runs-on: ubuntu-latest
289
+ permissions:
290
+ contents: read
291
+ env:
292
+ VERSION: ${{ needs.build.outputs.version }}
293
+ MCP_PUBLISHER_VERSION: 1.8.5
294
+ MCP_PUBLISHER_SHA256: 2d151ac57275c9a6684d9d22b1cba81058bab195ea0a162e8fce3c6a5ec32812
295
+ steps:
296
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
297
+ with:
298
+ persist-credentials: false
299
+ - name: publish to the MCP Registry
300
+ env:
301
+ MCP_REGISTRY_PRIVATE_KEY: ${{ secrets.MCP_REGISTRY_PRIVATE_KEY }}
302
+ run: |
303
+ if [ ! -f server.json ]; then
304
+ echo "::notice::no server.json — $VERSION is not published to the MCP Registry"
305
+ exit 0
306
+ fi
307
+ if [ -z "$MCP_REGISTRY_PRIVATE_KEY" ]; then
308
+ echo "::notice::MCP_REGISTRY_PRIVATE_KEY is not set — $VERSION is not published to the MCP Registry"
309
+ exit 0
310
+ fi
311
+ curl -sSfLo mcp-publisher.tar.gz "https://github.com/modelcontextprotocol/registry/releases/download/v${MCP_PUBLISHER_VERSION}/mcp-publisher_linux_amd64.tar.gz"
312
+ echo "${MCP_PUBLISHER_SHA256} mcp-publisher.tar.gz" | sha256sum -c -
313
+ tar -xzf mcp-publisher.tar.gz mcp-publisher
314
+ jq --arg v "$VERSION" '.version = $v | .packages[0].version = $v' server.json > server.tmp && mv server.tmp server.json
315
+ ./mcp-publisher login dns --domain wirecat.dev --private-key "$MCP_REGISTRY_PRIVATE_KEY"
316
+ ./mcp-publisher publish
package/CHANGELOG.md CHANGED
@@ -5,6 +5,22 @@ 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.12.0 — 01.11.2026
9
+
10
+ ### Added
11
+
12
+ - **A new CLI is published to the official MCP Registry as `dev.wirecat/<name>`.** `server.json` is a new seed (run
13
+ with `npx`, `mcp serve --profiles all`), `new` sets `mcpName` in `package.json` for a WireCatLabs CLI, and
14
+ `release.yml` gets `mcp-registry-dry-run` and `mcp-registry`, copied from tg-cli. A CLI without `server.json`, or a
15
+ repository without `MCP_REGISTRY_PRIVATE_KEY`, publishes nothing and says so. An existing CLI gets the jobs from
16
+ `upgrade`; it adds `server.json` and `mcpName` itself, since both are its own files.
17
+
18
+ ### Fixed
19
+
20
+ - **0.11.0's note on run records gave the wrong reason.** A built skeleton keeps only a failed run because its own
21
+ commands only read local files and open no run. A command you add that does its work in `context.run` is kept on
22
+ success by default; [Configuration](docs/configuration.md#run-records) says so now.
23
+
8
24
  ## 0.11.0 — 31.10.2026
9
25
 
10
26
  ### Added
@@ -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.11.0\n")
12
+ process.stdout.write("0.12.0\n")
13
13
  } else {
14
14
  // Before the bundle compiles: the bundle's own call comes after its chunks.
15
15
  module.enableCompileCache()
@@ -29,7 +29,7 @@ if (
29
29
  })
30
30
  }
31
31
  const running = import("../bundle/clidev.js")
32
- const chunks = ["../bundle/all-profiles-MJ6XSFOO.js","../bundle/anthropic-W5UKBZUB.js","../bundle/app-server-EZ46JAHB.js","../bundle/bun-HB6O2TTT.js","../bundle/bun-sqlite-KBXOW2ES.js","../bundle/decode-AMXUVKNY.js","../bundle/dist-ESHIQU4M.js","../bundle/echarts-GJDMQ2AQ.js","../bundle/embed-L4CRZ2XQ.js","../bundle/embedder-IBGV4M2K.js","../bundle/first-screen-X5IJKBSU.js","../bundle/instructions-YJECS4KN.js","../bundle/mcp-G6XP2IRO.js","../bundle/mcp-OQBZXELQ.js","../bundle/mcp-RDZGYPSY.js","../bundle/node-NQG4EVZR.js","../bundle/node-P4E63KXA.js","../bundle/node-TLZSIHIJ.js","../bundle/node-sqlite-BR7F3BLB.js","../bundle/oauth-J7UAWNIK.js","../bundle/open-BR47R5UE.js","../bundle/process-66I7RDPJ.js","../bundle/program-K6347XBZ.js","../bundle/prompt-NE5JJ7UP.js","../bundle/recognize-GC3YFVIA.js","../bundle/remote-QELOMKQM.js","../bundle/rerank-BH6TZ2SP.js","../bundle/serve-WWLRNDT2.js","../bundle/server-DE6NLNUF.js","../bundle/server-ZPSQKOAH.js","../bundle/state-2BEGXAMO.js","../bundle/store-AH6WZMCF.js","../bundle/store-maintenance-command-PBXX3IEV.js"]
32
+ const chunks = ["../bundle/all-profiles-MJ6XSFOO.js","../bundle/anthropic-W5UKBZUB.js","../bundle/app-server-EZ46JAHB.js","../bundle/bun-HB6O2TTT.js","../bundle/bun-sqlite-KBXOW2ES.js","../bundle/decode-AMXUVKNY.js","../bundle/dist-ESHIQU4M.js","../bundle/echarts-GJDMQ2AQ.js","../bundle/embed-L4CRZ2XQ.js","../bundle/embedder-IBGV4M2K.js","../bundle/first-screen-X5IJKBSU.js","../bundle/instructions-YJECS4KN.js","../bundle/mcp-OQBZXELQ.js","../bundle/mcp-RDZGYPSY.js","../bundle/mcp-TEMCENVV.js","../bundle/node-NQG4EVZR.js","../bundle/node-P4E63KXA.js","../bundle/node-TLZSIHIJ.js","../bundle/node-sqlite-BR7F3BLB.js","../bundle/oauth-J7UAWNIK.js","../bundle/open-BR47R5UE.js","../bundle/process-66I7RDPJ.js","../bundle/program-RNGI562F.js","../bundle/prompt-NE5JJ7UP.js","../bundle/recognize-GC3YFVIA.js","../bundle/remote-QELOMKQM.js","../bundle/rerank-BH6TZ2SP.js","../bundle/serve-WWLRNDT2.js","../bundle/server-DE6NLNUF.js","../bundle/server-ZPSQKOAH.js","../bundle/state-2BEGXAMO.js","../bundle/store-AH6WZMCF.js","../bundle/store-maintenance-command-PBXX3IEV.js"]
33
33
  // After the server answers its first request, so it starts no later.
34
34
  if (serves) setTimeout(() => void Promise.allSettled(chunks.map((chunk) => import(chunk))), 2000).unref()
35
35
  await running
@@ -2,7 +2,7 @@ import { createRequire as __bundleRequire } from "node:module";
2
2
  const require = __bundleRequire(import.meta.url);
3
3
 
4
4
  // dist/version.js
5
- var VERSION = "0.11.0";
5
+ var VERSION = "0.12.0";
6
6
 
7
7
  // dist/identity.js
8
8
  var PACKAGE = "@wirecat/clidev-cli";
@@ -3,7 +3,7 @@ import { createRequire as __bundleRequire } from "node:module";
3
3
  const require = __bundleRequire(import.meta.url);
4
4
  import {
5
5
  IDENTITY
6
- } from "./chunk-KAREKBUZ.js";
6
+ } from "./chunk-QQUFZLFP.js";
7
7
  import {
8
8
  catchCrashes
9
9
  } from "./chunk-EFHLQXG6.js";
@@ -14,7 +14,7 @@ import "./chunk-ZVVMGPBJ.js";
14
14
  import { enableCompileCache } from "node:module";
15
15
  enableCompileCache();
16
16
  var stopCatching = catchCrashes({ cli: IDENTITY.command, interactive: process.stdout.isTTY === true });
17
- var { run } = await import("./program-K6347XBZ.js");
17
+ var { run } = await import("./program-RNGI562F.js");
18
18
  try {
19
19
  process.exitCode = await run(process.argv.slice(2));
20
20
  } finally {
@@ -46,7 +46,7 @@ import "./chunk-O5EHUB2V.js";
46
46
  import "./chunk-FDBINRWA.js";
47
47
  import {
48
48
  IDENTITY
49
- } from "./chunk-KAREKBUZ.js";
49
+ } from "./chunk-QQUFZLFP.js";
50
50
  import "./chunk-QKWRL4OD.js";
51
51
  import "./chunk-EGRB55FF.js";
52
52
  import "./chunk-IDWW4TU2.js";
@@ -593,7 +593,7 @@ import {
593
593
  IDENTITY,
594
594
  PACKAGE,
595
595
  SKILL
596
- } from "./chunk-KAREKBUZ.js";
596
+ } from "./chunk-QQUFZLFP.js";
597
597
  import {
598
598
  isTextModelInstalled,
599
599
  textModelsDirectory
@@ -17198,7 +17198,7 @@ var serveCommand3 = /* @__PURE__ */ __name(() => annotate(new Command("serve"),
17198
17198
  run: run3,
17199
17199
  ...environment.signal ? { signal: environment.signal } : {}
17200
17200
  };
17201
- const { serveMcp, serveMcpOverHttp } = await import("./mcp-G6XP2IRO.js");
17201
+ const { serveMcp, serveMcpOverHttp } = await import("./mcp-TEMCENVV.js");
17202
17202
  if (!flags.http)
17203
17203
  return serveMcp(options);
17204
17204
  const { portOf: portOf2, publicUrlOf: publicUrlOf2 } = await import("./mcp-RDZGYPSY.js");
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.11.0";
1
+ export declare const VERSION = "0.12.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.11.0";
1
+ export const VERSION = "0.12.0";
2
2
  //# sourceMappingURL=version.js.map
@@ -19,6 +19,8 @@ the permissions say.
19
19
 
20
20
  ## Run records
21
21
 
22
- A command that fails is kept as a run, for `clidev runs list` and `runs show`. `record_input` decides whether a run
22
+ A command that fails is kept as a run, for `clidev runs list` and `runs show`. A command you add that does its work
23
+ in `context.run` is kept when it succeeds too, unless `record` is `false` (then only failures) or it ran with
24
+ `--no-record`. The skeleton's own commands only read local files and open no run. `record_input` decides whether a run
23
25
  keeps the words you typed; it is `true` unless you set it to `false`. Secrets are masked either way; see
24
26
  [Security](security.md).
@@ -33,8 +33,8 @@ The rules are the handbook's [Releases page](../../../../node_modules/@wirecat/c
33
33
  section as `## <version> — DD.MM.YYYY`, run `pnpm release:check` again, and open the pull request
34
34
  `chore(release): <version>`.
35
35
  8. **The publish.** Merge it when its checks pass, then run `bin/release` on a clean `main`: it starts
36
- `release.yml` and follows it (`WC-REL-11`). A messenger CLI also needs the owner's signed release report
37
- (`WC-REL-10`). Never `bin/release --local`: that is the owner's, for the first release before npm trusts
36
+ `release.yml` and follows it (`WC-REL-11`). A messenger CLI also needs the owner's yes for that version in the
37
+ conversation (`WC-REL-10`): ask before you run `bin/release`. Never `bin/release --local`: that is the owner's, for the first release before npm trusts
38
38
  `release.yml`, with `NPM_TOKEN`, the npm token in the keyring, or the owner's own npm login.
39
39
  The keyring is read only when `NPM_KEYRING_ACCOUNT` names the account the token is stored under (service `npm`);
40
40
  there is no default account. When that lookup fails, `bin/release` stops; it does not fall back to the npm login.
package/kit/dist/new.js CHANGED
@@ -178,6 +178,9 @@ export const cliPackageJson = (text, names) => {
178
178
  next.homepage = `https://github.com/${names.owner}/${names.name}#readme`;
179
179
  if (pkg.bugs)
180
180
  next.bugs = { url: `https://github.com/${names.owner}/${names.name}/issues` };
181
+ // The MCP Registry takes dev.wirecat/ names only from wirecat.dev's DNS key, which only WireCatLabs holds.
182
+ if (names.owner === "WireCatLabs")
183
+ next.mcpName = `dev.wirecat/${names.name}`;
181
184
  return `${JSON.stringify(next, null, 2)}\n`;
182
185
  };
183
186
  const VERSION_FILE = "src/version.ts";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wirecat/cli-template",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "Start a new WireCat CLI: a working skeleton on cli-base and cli-core, copied by new and kept current by upgrade",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Viacheslav Ptsarev",
@@ -26,6 +26,7 @@
26
26
  "docs",
27
27
  "lint",
28
28
  "scripts",
29
+ "server.json",
29
30
  "skills",
30
31
  "src",
31
32
  "AGENTS.md",
package/server.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "dev.wirecat/clidev-cli",
4
+ "title": "WireCat clidev",
5
+ "description": "clidev for agents over MCP. Set up a profile with the clidev CLI first.",
6
+ "websiteUrl": "https://wirecat.dev/en/docs/clidev",
7
+ "repository": {
8
+ "url": "https://github.com/WireCatLabs/clidev-cli",
9
+ "source": "github"
10
+ },
11
+ "version": "0.0.0",
12
+ "packages": [
13
+ {
14
+ "registryType": "npm",
15
+ "identifier": "@wirecat/clidev-cli",
16
+ "version": "0.0.0",
17
+ "runtimeHint": "npx",
18
+ "transport": {
19
+ "type": "stdio"
20
+ },
21
+ "packageArguments": [
22
+ {
23
+ "type": "positional",
24
+ "value": "mcp"
25
+ },
26
+ {
27
+ "type": "positional",
28
+ "value": "serve"
29
+ },
30
+ {
31
+ "type": "named",
32
+ "name": "--profiles",
33
+ "value": "all"
34
+ }
35
+ ]
36
+ }
37
+ ]
38
+ }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const VERSION = "0.11.0"
1
+ export const VERSION = "0.12.0"
package/template.json CHANGED
@@ -33,6 +33,7 @@
33
33
  "package.json",
34
34
  "pnpm-workspace.yaml",
35
35
  "scripts/",
36
+ "server.json",
36
37
  "skills/",
37
38
  "src/",
38
39
  "vitest.config.ts"