@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 +18 -0
- package/README.md +17 -12
- package/dist/cli.js +43 -12
- package/docs/architecture.md +8 -7
- package/docs/manual-test-plan.md +14 -14
- package/docs/product-spec.md +1 -1
- package/docs/release-checklist.md +9 -8
- package/package.json +1 -1
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
|
|
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
|
-
`
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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
|
|
180
|
-
const timeoutMs = readOptionalIntegerOption(args, "--timeout-ms",
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
3762
|
-
" 2.
|
|
3763
|
-
" 3.
|
|
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]",
|
package/docs/architecture.md
CHANGED
|
@@ -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 `
|
|
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
|
|
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.
|
package/docs/manual-test-plan.md
CHANGED
|
@@ -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 --
|
|
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
|
|
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
|
-
- `
|
|
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 --
|
|
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
|
package/docs/product-spec.md
CHANGED
|
@@ -779,7 +779,7 @@ Auth rules:
|
|
|
779
779
|
|
|
780
780
|
Smoke tests:
|
|
781
781
|
|
|
782
|
-
- installed CLI
|
|
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
|
-
`
|
|
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
|
|
243
|
-
computer-linker
|
|
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
|