@easonwumac/computer-linker 0.1.3 → 0.1.5

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
@@ -5,6 +5,24 @@ All notable changes to Computer Linker will be documented in this file.
5
5
  This project follows a small pre-1.0 changelog: breaking contract changes are
6
6
  called out even when the package version is still `0.x`.
7
7
 
8
+ ## 0.1.5 - 2026-06-27
9
+
10
+ ### Changed
11
+
12
+ - `quickstart --json` now exposes `commands.check` as the productized install
13
+ check command while preserving `commands.selfTest` as a compatibility alias
14
+ for older agents.
15
+ - README and release/manual test docs now use `computer-linker check` as the
16
+ primary isolated install check command.
17
+
18
+ ## 0.1.4 - 2026-06-27
19
+
20
+ ### Added
21
+
22
+ - Added `computer-linker check` as the productized install check command. It
23
+ runs the existing isolated self-test flow while keeping `self-test` as a
24
+ compatibility/advanced command.
25
+
8
26
  ## 0.1.3 - 2026-06-27
9
27
 
10
28
  ### Added
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,14 +66,18 @@ 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.
72
-
73
- There is no web dashboard in the product path. Human setup and management are
74
- CLI-first; MCP and the JSON API are only protocol surfaces for clients,
75
- automation, and smoke checks. The default help output is intentionally short;
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.
73
+
74
+ `quickstart --json` exposes `commands.check` for the optional isolated install
75
+ check. `commands.selfTest` remains as a compatibility alias for older agents
76
+ that already consumed the previous JSON field.
77
+
78
+ There is no web dashboard in the product path. Human setup and management are
79
+ CLI-first; MCP and the JSON API are only protocol surfaces for clients,
80
+ automation, and smoke checks. The default help output is intentionally short;
76
81
  use `computer-linker help advanced` for service, config, API, and compatibility
77
82
  commands. ChatGPT-specific setup exports are compatibility helpers under
78
83
  `computer-linker help chatgpt`; prefer the generic MCP client commands first.
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,11 +3490,12 @@ 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.");
3491
3497
  }
3498
+ const checkCommand = formatCliCommand([...commandParts, "check"]);
3492
3499
  return {
3493
3500
  kind: "computer-linker-quickstart",
3494
3501
  schemaVersion: 1,
@@ -3507,7 +3514,8 @@ function buildQuickstartReport(options) {
3507
3514
  openaiTunnelId: options.tunnelProvider === "openai" ? options.openaiTunnelId ?? "tunnel_..." : null,
3508
3515
  },
3509
3516
  commands: {
3510
- selfTest: formatCliCommand([...commandParts, "self-test"]),
3517
+ check: checkCommand,
3518
+ selfTest: checkCommand,
3511
3519
  start: formatCliCommand(startParts),
3512
3520
  status: formatCliCommand([...commandParts, "status"]),
3513
3521
  token: formatCliCommand([...commandParts, "client", "setup", "--show-token"]),
@@ -3568,7 +3576,7 @@ function printQuickstartReport(report) {
3568
3576
  console.log(` ${report.commands.tunnelStatus}`);
3569
3577
  if (report.commands.historyConnections)
3570
3578
  console.log(` ${report.commands.historyConnections}`);
3571
- console.log(` optional isolated install check: ${report.commands.selfTest}`);
3579
+ console.log(` optional isolated install check: ${report.commands.check}`);
3572
3580
  }
3573
3581
  function quickstartCommandParts() {
3574
3582
  return invocationCommandParts();
@@ -3667,6 +3675,10 @@ function printHelp(args = []) {
3667
3675
  printStatusHelp();
3668
3676
  return;
3669
3677
  }
3678
+ if (topic === "check" && rest.length === 0) {
3679
+ printCheckHelp();
3680
+ return;
3681
+ }
3670
3682
  if ((topic === "self-test" || topic === "selftest") && rest.length === 0) {
3671
3683
  printSelfTestHelp();
3672
3684
  return;
@@ -3753,14 +3765,16 @@ function printCoreHelp() {
3753
3765
  "Usage:",
3754
3766
  " computer-linker start <workspace-path>",
3755
3767
  " computer-linker start <workspace-path> --tunnel openai|tailscale|cloudflare",
3768
+ " computer-linker check",
3756
3769
  " computer-linker client setup",
3757
3770
  " computer-linker status",
3758
3771
  " computer-linker help advanced",
3759
3772
  "",
3760
3773
  "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",
3774
+ " 1. Optional install check: computer-linker check",
3775
+ " 2. Start local: computer-linker start C:\\Projects\\my-app",
3776
+ " 3. Connect client: computer-linker client setup",
3777
+ " 4. Check state: computer-linker status",
3764
3778
  "",
3765
3779
  "Cloud client:",
3766
3780
  " computer-linker start C:\\Projects\\my-app --tunnel openai --tunnel-id tunnel_...",
@@ -3777,7 +3791,7 @@ function printCoreHelp() {
3777
3791
  " By default, start allows file edits and approved project commands for normal development work.",
3778
3792
  " Use --read-only to inspect only; use --full-trust only when Codex and screen capture are intended.",
3779
3793
  " 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",
3794
+ " Details: computer-linker help check | computer-linker help start | computer-linker help client setup | computer-linker help advanced",
3781
3795
  ]);
3782
3796
  }
3783
3797
  function printStartHelp() {
@@ -4063,6 +4077,22 @@ function printSelfTestHelp() {
4063
4077
  " computer-linker self-test",
4064
4078
  ].join("\n"));
4065
4079
  }
4080
+ function printCheckHelp() {
4081
+ console.log([
4082
+ "Computer Linker check",
4083
+ "",
4084
+ "Usage:",
4085
+ " computer-linker check [--json] [--keep-temp] [--timeout-ms ms]",
4086
+ "",
4087
+ "What it does:",
4088
+ " Runs an isolated install check without touching your real config or folders.",
4089
+ " Creates a temporary config and workspace, starts a loopback MCP server,",
4090
+ " verifies health, MCP initialize, tools/list, get_computer_info, and one read-only computer_operation.",
4091
+ "",
4092
+ "Example:",
4093
+ " computer-linker check",
4094
+ ].join("\n"));
4095
+ }
4066
4096
  function printDoctorHelp() {
4067
4097
  console.log([
4068
4098
  "Computer Linker doctor",
@@ -4462,6 +4492,7 @@ function printAdvancedHelp() {
4462
4492
  " computer-linker start --tunnel tailscale",
4463
4493
  " computer-linker start --tunnel openai --tunnel-id tunnel_...",
4464
4494
  " computer-linker status [--details] [--json]",
4495
+ " computer-linker check [--json] [--keep-temp] [--timeout-ms ms]",
4465
4496
  " computer-linker self-test [--json] [--keep-temp] [--timeout-ms ms]",
4466
4497
  " computer-linker process list <workspace-id> [--json]",
4467
4498
  " computer-linker process read <workspace-id> <process-id> [--json]",
@@ -20,10 +20,10 @@ manually before a wider release. The local and CI release gate is
20
20
  the progress-reporting test runner, build, and package smoke.
21
21
  The package smoke uses `npm pack --dry-run` to verify packed files, CLI bins,
22
22
  SDK exports, release docs, security policy, and the published
23
- `computer_operation` schema, then creates a real `.tgz`, installs it into a
24
- temporary consumer project, runs the installed `computer-linker` bin, verifies
25
- installed `self-test`, `setup`, and `status` against isolated config
26
- directories, and imports the installed SDK entrypoint. The package build uses
23
+ `computer_operation` schema, then creates a real `.tgz`, installs it into a
24
+ temporary consumer project, runs the installed `computer-linker` bin, verifies
25
+ installed `check`, `setup`, and `status` against isolated config
26
+ directories, and imports the installed SDK entrypoint. The package build uses
27
27
  `tsconfig.build.json` so tests are typechecked but are not emitted into the
28
28
  runtime package.
29
29
 
@@ -414,9 +414,10 @@ surface for the same config file used by the MCP server:
414
414
  mode, local MCP URL, auth summary, workspace/tunnel summary, user-facing
415
415
  readiness, and the next few actions. `status --details` prints the full
416
416
  workspace rows, warnings, running tunnel rows, and all next actions.
417
- - `computer-linker self-test` creates an isolated temporary config/workspace,
418
- starts the loopback HTTP MCP server, runs the generic MCP SDK smoke flow, and
419
- exits non-zero when the installed CLI/server/tool flow is not working.
417
+ - `computer-linker check` creates an isolated temporary config/workspace,
418
+ starts the loopback HTTP MCP server, runs the generic MCP SDK smoke flow, and
419
+ exits non-zero when the installed CLI/server/tool flow is not working.
420
+ `computer-linker self-test` remains available as a compatibility command.
420
421
  - `computer-linker doctor` shows full runtime diagnostics, startup readiness,
421
422
  local MCP/API URLs, security findings, tool availability, release readiness,
422
423
  and next actions.
@@ -11,26 +11,26 @@ installed package instead, replace `npm run dev --` with `computer-linker`.
11
11
 
12
12
  ```bash
13
13
  npm ci
14
- npm run product:check
15
- npm run alpha:check
16
- npm run public:mirror -- --dry-run --remote <github-owner>/<public-repo>
17
- npm run dev -- self-test
14
+ npm run product:check
15
+ npm run alpha:check
16
+ npm run public:mirror -- --dry-run --remote <github-owner>/<public-repo>
17
+ npm run dev -- check
18
18
  ```
19
19
 
20
20
  Expected:
21
21
 
22
- - typecheck, tests, build, release validation, and package smoke pass
23
- - package smoke reports `computer-linker-<version>.tgz` and verifies a
24
- temporary consumer install, installed CLI execution, installed self-test,
25
- isolated setup/status, and SDK import
22
+ - typecheck, tests, build, release validation, and package smoke pass
23
+ - package smoke reports `computer-linker-<version>.tgz` and verifies a
24
+ temporary consumer install, installed CLI execution, installed check,
25
+ isolated setup/status, and SDK import
26
26
  - alpha readiness reports `status: ready`, or `status: needs_attention` only
27
27
  because preserved Git history must be published through `public:mirror`
28
28
  - `public:mirror -- --dry-run --remote ...` reports the mirror dry-run is
29
29
  publishable when the fresh public mirror path is accepted and the other gates
30
30
  pass; before a real mirror release, resolve any `release tag check: blocked
31
31
  for real run` changelog warning
32
- - `self-test` reports `ready: yes` and verifies the local MCP SDK tool flow
33
- without touching real user workspaces
32
+ - `check` reports `ready: yes` and verifies the local MCP SDK tool flow
33
+ without touching real user workspaces
34
34
  - external MCP client/tunnel evidence is still pending until the later tunnel
35
35
  smoke step writes `.computer-linker-alpha-evidence.json`
36
36
 
@@ -129,10 +129,10 @@ npm run dev -- start . --id app
129
129
  Terminal B:
130
130
 
131
131
  ```bash
132
- npm run dev -- doctor
133
- npm run dev -- status
134
- npm run dev -- self-test
135
- npm run dev -- profile
132
+ npm run dev -- doctor
133
+ npm run dev -- status
134
+ npm run dev -- check
135
+ npm run dev -- profile
136
136
  npm run dev -- client setup
137
137
  npm run dev -- client setup --details
138
138
  npm run dev -- client setup --show-token
@@ -779,7 +779,7 @@ Auth rules:
779
779
 
780
780
  Smoke tests:
781
781
 
782
- - installed CLI self-test using a temporary config and workspace.
782
+ - installed CLI check using a temporary config and workspace.
783
783
  - local MCP initialize, tools/list, `get_computer_info`, and read-only
784
784
  `computer_operation` through the MCP SDK.
785
785
  - HTTP `/healthz`.
@@ -17,10 +17,10 @@ This performs:
17
17
  - Release metadata validation.
18
18
  - TypeScript typecheck.
19
19
  - Full test suite.
20
- - Runtime build.
21
- - Package smoke check with `npm pack --dry-run`, real `.tgz` creation,
22
- temporary consumer install, installed CLI execution, isolated installed
23
- `self-test`, `setup` / `status` config smoke, and installed SDK import.
20
+ - Runtime build.
21
+ - Package smoke check with `npm pack --dry-run`, real `.tgz` creation,
22
+ temporary consumer install, installed CLI execution, isolated installed
23
+ `check`, `setup` / `status` config smoke, and installed SDK import.
24
24
 
25
25
  Before publishing a public npm/package artifact, run:
26
26
 
@@ -237,10 +237,11 @@ For each shell or Codex-enabled scope, verify:
237
237
 
238
238
  ## Smoke Commands
239
239
 
240
- ```bash
241
- computer-linker init
242
- computer-linker self-test
243
- computer-linker status
240
+ ```bash
241
+ computer-linker init
242
+ computer-linker check
243
+ computer-linker self-test
244
+ computer-linker status
244
245
  computer-linker status --details
245
246
  computer-linker status --json
246
247
  computer-linker doctor
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easonwumac/computer-linker",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "One computer, one permissioned MCP linker for local workspaces.",
5
5
  "type": "module",
6
6
  "main": "dist/client.js",