@easonwumac/computer-linker 0.1.3 → 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
@@ -5,6 +5,14 @@ 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.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
+
8
16
  ## 0.1.3 - 2026-06-27
9
17
 
10
18
  ### 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,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,
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]",
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.4",
4
4
  "description": "One computer, one permissioned MCP linker for local workspaces.",
5
5
  "type": "module",
6
6
  "main": "dist/client.js",