@easonwumac/computer-linker 0.1.2 → 0.1.4

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.
package/CHANGELOG.md CHANGED
@@ -3,11 +3,34 @@
3
3
  All notable changes to Computer Linker will be documented in this file.
4
4
 
5
5
  This project follows a small pre-1.0 changelog: breaking contract changes are
6
- called out even when the package version is still `0.x`.
7
-
6
+ called out even when the package version is still `0.x`.
7
+
8
+ ## 0.1.4 - 2026-06-27
9
+
10
+ ### Added
11
+
12
+ - Added `computer-linker check` as the productized install check command. It
13
+ runs the existing isolated self-test flow while keeping `self-test` as a
14
+ compatibility/advanced command.
15
+
16
+ ## 0.1.3 - 2026-06-27
17
+
18
+ ### Added
19
+
20
+ - Added `release:verify` to confirm a published npm version's exact metadata,
21
+ dist-tag, and published CLI from a clean temporary directory.
22
+
23
+ ### Changed
24
+
25
+ - `release:publish` now runs the post-publish npm registry verification
26
+ automatically after npm accepts the package.
27
+ - `release:publish -- --push` now pushes `HEAD` and the exact release tag
28
+ explicitly, so lightweight release tags are not skipped by `git push
29
+ --follow-tags`.
30
+
8
31
  ## 0.1.2 - 2026-06-27
9
-
10
- ### Added
32
+
33
+ ### Added
11
34
 
12
35
  - Local npm release wrapper commands: `release:check`, `release:dry-run`, and
13
36
  `release:publish`.
package/README.md CHANGED
@@ -16,10 +16,11 @@ computer; Cloudflare, Tailscale, or OpenAI tunnel exposure is optional.
16
16
 
17
17
  Install the CLI, expose one folder, and keep the server running:
18
18
 
19
- ```powershell
20
- npm install -g @easonwumac/computer-linker
21
- computer-linker start C:\Projects\my-app
22
- ```
19
+ ```powershell
20
+ npm install -g @easonwumac/computer-linker
21
+ computer-linker check
22
+ computer-linker start C:\Projects\my-app
23
+ ```
23
24
 
24
25
  Leave that terminal running. In another terminal, copy the MCP client settings
25
26
  and verify the connection:
@@ -65,10 +66,10 @@ File content reads and text searches block common sensitive files by default,
65
66
  including `.env*`, private keys, credential JSON files, and cloud CLI credential
66
67
  directories. Keep real secrets outside exposed folders.
67
68
 
68
- `self-test` is safe to run before exposing real folders. It creates a temporary
69
- config and workspace, starts a loopback HTTP MCP server, verifies `/healthz`,
70
- the local JSON API, MCP initialize, tools/list, `get_computer_info`, and one
71
- read-only `computer_operation`, then removes the temporary files.
69
+ `check` is safe to run before exposing real folders. It creates a temporary
70
+ config and workspace, starts a loopback HTTP MCP server, verifies `/healthz`,
71
+ the local JSON API, MCP initialize, tools/list, `get_computer_info`, and one
72
+ read-only `computer_operation`, then removes the temporary files.
72
73
 
73
74
  There is no web dashboard in the product path. Human setup and management are
74
75
  CLI-first; MCP and the JSON API are only protocol surfaces for clients,
@@ -471,19 +472,21 @@ For npm publishing, use the local release wrapper instead of hand-running every
471
472
  step:
472
473
 
473
474
  ```bash
474
- npm run release:check
475
- npm run release:dry-run
476
- npm run release:publish -- --create-tag --otp <code>
477
- git push origin main --follow-tags
478
- ```
475
+ npm run release:check
476
+ npm run release:dry-run
477
+ npm run release:publish -- --create-tag --push --otp <code>
478
+ ```
479
479
 
480
480
  `release:check` runs the local product/public package gates without publishing.
481
481
  `release:dry-run` runs `npm publish --dry-run` and creates a temporary local
482
482
  `v<package.version>` tag only for that dry-run when the tag is missing.
483
- `release:publish` requires a clean main/master worktree, a dated changelog
484
- heading, npm login, and a release tag. Pass `--create-tag` to create the tag
485
- on `HEAD`; pass `--push` only when you want the script to push `HEAD` and tags
486
- after a successful npm publish.
483
+ `release:publish` requires a clean main/master worktree, a dated changelog
484
+ heading, npm login, and a release tag. Pass `--create-tag` to create the tag
485
+ on `HEAD`; pass `--push` only when you want the script to push `HEAD` and the
486
+ release tag after a successful npm publish. After npm accepts the publish, the
487
+ wrapper waits for registry metadata, verifies the npm dist-tag, and runs the
488
+ published CLI from a clean temporary directory. Use `npm run release:verify` to
489
+ repeat that post-publish check for the current `package.json` version.
487
490
 
488
491
  For a public alpha from this private dogfooding checkout, use the fresh public
489
492
  snapshot path:
package/dist/cli.js CHANGED
@@ -84,6 +84,9 @@ async function main(argv) {
84
84
  case "status":
85
85
  status(args);
86
86
  return;
87
+ case "check":
88
+ await selfTest(args, "check");
89
+ return;
87
90
  case "self-test":
88
91
  await selfTest(args);
89
92
  return;
@@ -143,7 +146,7 @@ function normalizeCommand(command) {
143
146
  throw new Error("connect-profile was removed; use `computer-linker client chatgpt profile` only when ChatGPT asks for connector-specific fields.");
144
147
  if (command === "chatgpt")
145
148
  throw new Error("chatgpt was removed; use `computer-linker client chatgpt <subcommand>` only when ChatGPT asks for connector-specific fields.");
146
- if (command === "init" || command === "start" || command === "quickstart" || command === "status" || command === "self-test" || command === "expose" || command === "tunnel" || command === "service" || command === "workspace" || command === "process" || command === "screen" || command === "doctor" || command === "diagnose" || command === "history" || command === "profile" || command === "client" || command === "config" || command === "setup")
149
+ if (command === "init" || command === "start" || command === "quickstart" || command === "status" || command === "check" || command === "self-test" || command === "expose" || command === "tunnel" || command === "service" || command === "workspace" || command === "process" || command === "screen" || command === "doctor" || command === "diagnose" || command === "history" || command === "profile" || command === "client" || command === "config" || command === "setup")
147
150
  return command;
148
151
  if (command === "version" || command === "--version" || command === "-v")
149
152
  return "version";
@@ -166,9 +169,12 @@ function status(args) {
166
169
  }
167
170
  process.stdout.write(args.includes("--details") ? formatDetailedCliStatus(report) : formatCliStatus(report));
168
171
  }
169
- async function selfTest(args) {
172
+ async function selfTest(args, commandLabel = "self-test") {
170
173
  if (hasHelpFlag(args)) {
171
- printSelfTestHelp();
174
+ if (commandLabel === "check")
175
+ printCheckHelp();
176
+ else
177
+ printSelfTestHelp();
172
178
  return;
173
179
  }
174
180
  const unknown = args.filter((arg, index) => (arg !== "--json" &&
@@ -176,8 +182,8 @@ async function selfTest(args) {
176
182
  arg !== "--timeout-ms" &&
177
183
  args[index - 1] !== "--timeout-ms"));
178
184
  if (unknown.length > 0)
179
- throw new Error(`Unknown self-test option: ${unknown[0]}`);
180
- const timeoutMs = readOptionalIntegerOption(args, "--timeout-ms", "self-test --timeout-ms") ?? 15000;
185
+ throw new Error(`Unknown ${commandLabel} option: ${unknown[0]}`);
186
+ const timeoutMs = readOptionalIntegerOption(args, "--timeout-ms", `${commandLabel} --timeout-ms`) ?? 15000;
181
187
  const keepTemp = args.includes("--keep-temp");
182
188
  const tempRoot = mkdtempSync(join(tmpdir(), "computer-linker-self-test-"));
183
189
  const configDir = join(tempRoot, "config");
@@ -3484,7 +3490,7 @@ function buildQuickstartReport(options) {
3484
3490
  "Use the startup check printed by start as the first readiness signal.",
3485
3491
  "Run client setup --show-token only on a trusted local screen when configuring client auth.",
3486
3492
  "Use client setup --details when the MCP client or agent needs full setup instructions.",
3487
- "Use self-test only when you want an isolated install check.",
3493
+ "Use check only when you want an isolated install check.",
3488
3494
  ];
3489
3495
  if (options.tunnelProvider) {
3490
3496
  nextActions.push("Use tunnel status and connection history to confirm traffic reaches /mcp only.");
@@ -3507,7 +3513,7 @@ function buildQuickstartReport(options) {
3507
3513
  openaiTunnelId: options.tunnelProvider === "openai" ? options.openaiTunnelId ?? "tunnel_..." : null,
3508
3514
  },
3509
3515
  commands: {
3510
- selfTest: formatCliCommand([...commandParts, "self-test"]),
3516
+ selfTest: formatCliCommand([...commandParts, "check"]),
3511
3517
  start: formatCliCommand(startParts),
3512
3518
  status: formatCliCommand([...commandParts, "status"]),
3513
3519
  token: formatCliCommand([...commandParts, "client", "setup", "--show-token"]),
@@ -3667,6 +3673,10 @@ function printHelp(args = []) {
3667
3673
  printStatusHelp();
3668
3674
  return;
3669
3675
  }
3676
+ if (topic === "check" && rest.length === 0) {
3677
+ printCheckHelp();
3678
+ return;
3679
+ }
3670
3680
  if ((topic === "self-test" || topic === "selftest") && rest.length === 0) {
3671
3681
  printSelfTestHelp();
3672
3682
  return;
@@ -3753,14 +3763,16 @@ function printCoreHelp() {
3753
3763
  "Usage:",
3754
3764
  " computer-linker start <workspace-path>",
3755
3765
  " computer-linker start <workspace-path> --tunnel openai|tailscale|cloudflare",
3766
+ " computer-linker check",
3756
3767
  " computer-linker client setup",
3757
3768
  " computer-linker status",
3758
3769
  " computer-linker help advanced",
3759
3770
  "",
3760
3771
  "First run:",
3761
- " 1. Start local: computer-linker start C:\\Projects\\my-app",
3762
- " 2. Connect client: computer-linker client setup",
3763
- " 3. Check state: computer-linker status",
3772
+ " 1. Optional install check: computer-linker check",
3773
+ " 2. Start local: computer-linker start C:\\Projects\\my-app",
3774
+ " 3. Connect client: computer-linker client setup",
3775
+ " 4. Check state: computer-linker status",
3764
3776
  "",
3765
3777
  "Cloud client:",
3766
3778
  " computer-linker start C:\\Projects\\my-app --tunnel openai --tunnel-id tunnel_...",
@@ -3777,7 +3789,7 @@ function printCoreHelp() {
3777
3789
  " By default, start allows file edits and approved project commands for normal development work.",
3778
3790
  " Use --read-only to inspect only; use --full-trust only when Codex and screen capture are intended.",
3779
3791
  " Tokens stay hidden by default; use client setup --show-token only on a trusted local setup screen.",
3780
- " Details: computer-linker help start | computer-linker help client setup | computer-linker help advanced",
3792
+ " Details: computer-linker help check | computer-linker help start | computer-linker help client setup | computer-linker help advanced",
3781
3793
  ]);
3782
3794
  }
3783
3795
  function printStartHelp() {
@@ -4063,6 +4075,22 @@ function printSelfTestHelp() {
4063
4075
  " computer-linker self-test",
4064
4076
  ].join("\n"));
4065
4077
  }
4078
+ function printCheckHelp() {
4079
+ console.log([
4080
+ "Computer Linker check",
4081
+ "",
4082
+ "Usage:",
4083
+ " computer-linker check [--json] [--keep-temp] [--timeout-ms ms]",
4084
+ "",
4085
+ "What it does:",
4086
+ " Runs an isolated install check without touching your real config or folders.",
4087
+ " Creates a temporary config and workspace, starts a loopback MCP server,",
4088
+ " verifies health, MCP initialize, tools/list, get_computer_info, and one read-only computer_operation.",
4089
+ "",
4090
+ "Example:",
4091
+ " computer-linker check",
4092
+ ].join("\n"));
4093
+ }
4066
4094
  function printDoctorHelp() {
4067
4095
  console.log([
4068
4096
  "Computer Linker doctor",
@@ -4462,6 +4490,7 @@ function printAdvancedHelp() {
4462
4490
  " computer-linker start --tunnel tailscale",
4463
4491
  " computer-linker start --tunnel openai --tunnel-id tunnel_...",
4464
4492
  " computer-linker status [--details] [--json]",
4493
+ " computer-linker check [--json] [--keep-temp] [--timeout-ms ms]",
4465
4494
  " computer-linker self-test [--json] [--keep-temp] [--timeout-ms ms]",
4466
4495
  " computer-linker process list <workspace-id> [--json]",
4467
4496
  " computer-linker process read <workspace-id> <process-id> [--json]",
@@ -33,11 +33,10 @@ npm run public:check
33
33
  Use the local wrapper when you are ready to publish from the current repository:
34
34
 
35
35
  ```bash
36
- npm run release:check
37
- npm run release:dry-run
38
- npm run release:publish -- --create-tag --otp <code>
39
- git push origin main --follow-tags
40
- ```
36
+ npm run release:check
37
+ npm run release:dry-run
38
+ npm run release:publish -- --create-tag --push --otp <code>
39
+ ```
41
40
 
42
41
  `release:check` runs the local product and public package gates without
43
42
  publishing. It does not require a clean worktree, so it is useful before the
@@ -48,12 +47,15 @@ It runs `npm publish --dry-run`; if `v<package.version>` is missing, it creates
48
47
  a temporary local tag for the dry-run and removes it afterward. If that tag
49
48
  already exists on another commit, bump the package version before releasing.
50
49
 
51
- `release:publish` performs the real npm publish. It requires a clean
52
- main/master worktree, a dated `CHANGELOG.md` heading for the package version,
53
- npm login, and a release tag on `HEAD`. Pass `--create-tag` to create the
54
- release tag automatically before publishing, `--otp <code>` for npm 2FA, and
55
- `--push` only when the script should push `HEAD` and tags to `origin` after a
56
- successful publish.
50
+ `release:publish` performs the real npm publish. It requires a clean
51
+ main/master worktree, a dated `CHANGELOG.md` heading for the package version,
52
+ npm login, and a release tag on `HEAD`. Pass `--create-tag` to create the
53
+ release tag automatically before publishing, `--otp <code>` for npm 2FA, and
54
+ `--push` only when the script should push `HEAD` and the release tag to
55
+ `origin` after a successful publish. After npm accepts the publish, it also waits for exact
56
+ version metadata, verifies the configured npm dist-tag, and runs the published
57
+ CLI from a clean temporary directory. `release:verify` repeats only that
58
+ post-publish registry check for the current `package.json` version.
57
59
 
58
60
  For the one-command local alpha readiness gate, run:
59
61
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easonwumac/computer-linker",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "One computer, one permissioned MCP linker for local workspaces.",
5
5
  "type": "module",
6
6
  "main": "dist/client.js",
@@ -64,6 +64,7 @@
64
64
  "release:check": "node scripts/release-npm.mjs --check",
65
65
  "release:dry-run": "node scripts/release-npm.mjs --dry-run",
66
66
  "release:publish": "node scripts/release-npm.mjs --publish",
67
+ "release:verify": "node scripts/verify-npm-release.mjs",
67
68
  "release:validate": "node scripts/release-validate.mjs",
68
69
  "start": "node dist/cli.js start",
69
70
  "test": "node scripts/run-tests.mjs",