@hasna/machines 0.0.21 → 0.0.22
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/README.md +11 -3
- package/dist/cli/index.js +231 -15
- package/dist/consumer.d.ts +1 -1
- package/dist/consumer.d.ts.map +1 -1
- package/dist/consumer.js +201 -10
- package/dist/index.js +205 -14
- package/dist/mcp/index.js +205 -14
- package/dist/topology.d.ts +21 -0
- package/dist/topology.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -111,11 +111,19 @@ workspace inference second; consumers can still pass manual overrides.
|
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
113
|
machines workspace resolve --machine spark01 --project open-knowledge --repo open-knowledge --json
|
|
114
|
+
machines workspace doctor --machine spark01 --project open-knowledge --repo open-knowledge --json
|
|
114
115
|
```
|
|
115
116
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
`workspace resolve` and `workspace doctor` include JSON-friendly
|
|
118
|
+
`diagnostics` and `repair_hints`. Diagnostics classify missing manifests,
|
|
119
|
+
unresolved roots, inferred roots, local stale paths, untrusted machines, and
|
|
120
|
+
unknown auth. Repair hints include the dry-run command plus the matching
|
|
121
|
+
`--apply` command so downstream apps can surface the next step without
|
|
122
|
+
depending on open-machines internals.
|
|
123
|
+
|
|
124
|
+
If a resolver result reports inferred or unresolved project/open-files roots,
|
|
125
|
+
repair the manifest metadata explicitly. The command previews changes by
|
|
126
|
+
default and only writes when `--apply` is passed:
|
|
119
127
|
|
|
120
128
|
```bash
|
|
121
129
|
machines workspace repair --machine spark01 --project open-knowledge --repo open-knowledge --json
|
package/dist/cli/index.js
CHANGED
|
@@ -7633,7 +7633,8 @@ var MACHINES_CONSUMER_CAPABILITIES = {
|
|
|
7633
7633
|
compatibility: true,
|
|
7634
7634
|
route_resolution: true,
|
|
7635
7635
|
cli_json_fallback: true,
|
|
7636
|
-
workspace_path_mapping: true
|
|
7636
|
+
workspace_path_mapping: true,
|
|
7637
|
+
workspace_diagnostics: true
|
|
7637
7638
|
};
|
|
7638
7639
|
function getMachinesConsumerCapabilities() {
|
|
7639
7640
|
return { ...MACHINES_CONSUMER_CAPABILITIES };
|
|
@@ -8024,6 +8025,170 @@ function inferRepoRoot(workspaceRoot, repoName) {
|
|
|
8024
8025
|
}
|
|
8025
8026
|
return joinPath(root, repoName);
|
|
8026
8027
|
}
|
|
8028
|
+
function shellQuote(value) {
|
|
8029
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
8030
|
+
}
|
|
8031
|
+
function shellCommand(command) {
|
|
8032
|
+
return command.map(shellQuote).join(" ");
|
|
8033
|
+
}
|
|
8034
|
+
function canCheckPathForMachine(machine, localMachineId) {
|
|
8035
|
+
if (!machine)
|
|
8036
|
+
return false;
|
|
8037
|
+
if (machine.machine_id === localMachineId)
|
|
8038
|
+
return true;
|
|
8039
|
+
return machine.route_hints.some((hint) => hint.kind === "local");
|
|
8040
|
+
}
|
|
8041
|
+
function checkedPathExists(path, check) {
|
|
8042
|
+
if (!path || !check)
|
|
8043
|
+
return null;
|
|
8044
|
+
return existsSync5(path);
|
|
8045
|
+
}
|
|
8046
|
+
function repairHint(input) {
|
|
8047
|
+
const command = [
|
|
8048
|
+
"machines",
|
|
8049
|
+
"workspace",
|
|
8050
|
+
"repair",
|
|
8051
|
+
"--machine",
|
|
8052
|
+
input.machineId,
|
|
8053
|
+
"--project",
|
|
8054
|
+
input.projectId
|
|
8055
|
+
];
|
|
8056
|
+
if (input.repoName)
|
|
8057
|
+
command.push("--repo", input.repoName);
|
|
8058
|
+
if (input.openFilesRepoName)
|
|
8059
|
+
command.push("--open-files-repo", input.openFilesRepoName);
|
|
8060
|
+
command.push("--json");
|
|
8061
|
+
const applyCommand = [...command.slice(0, -1), "--apply", "--json"];
|
|
8062
|
+
return {
|
|
8063
|
+
id: `repair:${input.machineId}:${input.projectId}`,
|
|
8064
|
+
reason: input.reason,
|
|
8065
|
+
command,
|
|
8066
|
+
shell_command: shellCommand(command),
|
|
8067
|
+
apply_command: applyCommand,
|
|
8068
|
+
apply_shell_command: shellCommand(applyCommand)
|
|
8069
|
+
};
|
|
8070
|
+
}
|
|
8071
|
+
function pathDiagnostic(input) {
|
|
8072
|
+
if (!input.path.path) {
|
|
8073
|
+
return {
|
|
8074
|
+
id: input.id,
|
|
8075
|
+
status: "missing",
|
|
8076
|
+
severity: input.required ? "fail" : "warn",
|
|
8077
|
+
message: `${input.label} is unresolved.`,
|
|
8078
|
+
path: null,
|
|
8079
|
+
source: input.path.source,
|
|
8080
|
+
path_exists: null
|
|
8081
|
+
};
|
|
8082
|
+
}
|
|
8083
|
+
if (input.pathExists === false) {
|
|
8084
|
+
return {
|
|
8085
|
+
id: input.id,
|
|
8086
|
+
status: "stale",
|
|
8087
|
+
severity: "fail",
|
|
8088
|
+
message: `${input.label} points to a path that does not exist on this machine.`,
|
|
8089
|
+
path: input.path.path,
|
|
8090
|
+
source: input.path.source,
|
|
8091
|
+
path_exists: false
|
|
8092
|
+
};
|
|
8093
|
+
}
|
|
8094
|
+
if (input.path.source === "inferred") {
|
|
8095
|
+
return {
|
|
8096
|
+
id: input.id,
|
|
8097
|
+
status: "inferred",
|
|
8098
|
+
severity: "warn",
|
|
8099
|
+
message: `${input.label} was inferred from the workspace root; write an explicit manifest mapping for repeatable downstream sync.`,
|
|
8100
|
+
path: input.path.path,
|
|
8101
|
+
source: input.path.source,
|
|
8102
|
+
path_exists: input.pathExists
|
|
8103
|
+
};
|
|
8104
|
+
}
|
|
8105
|
+
return {
|
|
8106
|
+
id: input.id,
|
|
8107
|
+
status: "ok",
|
|
8108
|
+
severity: "ok",
|
|
8109
|
+
message: `${input.label} is explicit enough for downstream sync.`,
|
|
8110
|
+
path: input.path.path,
|
|
8111
|
+
source: input.path.source,
|
|
8112
|
+
path_exists: input.pathExists
|
|
8113
|
+
};
|
|
8114
|
+
}
|
|
8115
|
+
function workspaceDiagnostics(input) {
|
|
8116
|
+
const checkPaths = canCheckPathForMachine(input.machine, input.localMachineId);
|
|
8117
|
+
const diagnostics = [];
|
|
8118
|
+
if (!input.machine) {
|
|
8119
|
+
diagnostics.push({
|
|
8120
|
+
id: "manifest",
|
|
8121
|
+
status: "missing_manifest",
|
|
8122
|
+
severity: "fail",
|
|
8123
|
+
message: "Machine is not present in topology or manifest.",
|
|
8124
|
+
path: null,
|
|
8125
|
+
source: "manifest",
|
|
8126
|
+
path_exists: null
|
|
8127
|
+
});
|
|
8128
|
+
} else if (!input.resolution.evidence.manifest_declared) {
|
|
8129
|
+
diagnostics.push({
|
|
8130
|
+
id: "manifest",
|
|
8131
|
+
status: "missing_manifest",
|
|
8132
|
+
severity: "warn",
|
|
8133
|
+
message: "Machine came from live topology but is not declared in the manifest.",
|
|
8134
|
+
path: null,
|
|
8135
|
+
source: "manifest",
|
|
8136
|
+
path_exists: null
|
|
8137
|
+
});
|
|
8138
|
+
}
|
|
8139
|
+
diagnostics.push(pathDiagnostic({
|
|
8140
|
+
id: "workspace_root",
|
|
8141
|
+
label: "Workspace root",
|
|
8142
|
+
path: input.resolution.paths.workspace_root,
|
|
8143
|
+
pathExists: checkedPathExists(input.resolution.paths.workspace_root.path, checkPaths),
|
|
8144
|
+
required: false
|
|
8145
|
+
}));
|
|
8146
|
+
diagnostics.push(pathDiagnostic({
|
|
8147
|
+
id: "project_root",
|
|
8148
|
+
label: "Project root",
|
|
8149
|
+
path: input.resolution.paths.project_root,
|
|
8150
|
+
pathExists: checkedPathExists(input.resolution.paths.project_root.path, checkPaths),
|
|
8151
|
+
required: true
|
|
8152
|
+
}));
|
|
8153
|
+
diagnostics.push(pathDiagnostic({
|
|
8154
|
+
id: "open_files_root",
|
|
8155
|
+
label: "Open-files root",
|
|
8156
|
+
path: input.resolution.paths.open_files_root,
|
|
8157
|
+
pathExists: checkedPathExists(input.resolution.paths.open_files_root.path, checkPaths),
|
|
8158
|
+
required: false
|
|
8159
|
+
}));
|
|
8160
|
+
if (input.resolution.machine.trust_status !== "trusted") {
|
|
8161
|
+
diagnostics.push({
|
|
8162
|
+
id: "trust",
|
|
8163
|
+
status: "untrusted",
|
|
8164
|
+
severity: "warn",
|
|
8165
|
+
message: `Machine trust status is ${input.resolution.machine.trust_status}; manifest repair apply requires trust or --allow-untrusted.`,
|
|
8166
|
+
path: null,
|
|
8167
|
+
source: "trust",
|
|
8168
|
+
path_exists: null
|
|
8169
|
+
});
|
|
8170
|
+
}
|
|
8171
|
+
if (input.resolution.machine.auth_status !== "authenticated") {
|
|
8172
|
+
diagnostics.push({
|
|
8173
|
+
id: "auth",
|
|
8174
|
+
status: "unknown_auth",
|
|
8175
|
+
severity: "warn",
|
|
8176
|
+
message: `Machine auth status is ${input.resolution.machine.auth_status}; remote sync may still fail if SSH is unavailable.`,
|
|
8177
|
+
path: null,
|
|
8178
|
+
source: "auth",
|
|
8179
|
+
path_exists: null
|
|
8180
|
+
});
|
|
8181
|
+
}
|
|
8182
|
+
const needsRepair = diagnostics.some((entry) => (entry.id === "project_root" || entry.id === "open_files_root") && (entry.status === "missing" || entry.status === "inferred" || entry.status === "stale"));
|
|
8183
|
+
const repairHints = needsRepair ? [repairHint({
|
|
8184
|
+
machineId: input.resolution.machine_id ?? input.resolution.requested_machine_id,
|
|
8185
|
+
projectId: input.resolution.project.project_id,
|
|
8186
|
+
repoName: input.resolution.project.repo_name,
|
|
8187
|
+
openFilesRepoName: input.openFilesRepoName,
|
|
8188
|
+
reason: "Write explicit workspace_paths and open_files_roots manifest metadata."
|
|
8189
|
+
})] : [];
|
|
8190
|
+
return { diagnostics, repairHints };
|
|
8191
|
+
}
|
|
8027
8192
|
function projectPathFromMetadata(metadata, projectId, repoName) {
|
|
8028
8193
|
const keys = [projectId, repoName].filter((value) => Boolean(value));
|
|
8029
8194
|
return readMappedPath({
|
|
@@ -8099,7 +8264,7 @@ function resolveMachineWorkspace(options) {
|
|
|
8099
8264
|
const openFilesRepoName = options.openFilesRepoName ?? "open-files";
|
|
8100
8265
|
if (!machine) {
|
|
8101
8266
|
warnings.push(`machine_not_found:${options.machineId}`);
|
|
8102
|
-
|
|
8267
|
+
const resolution2 = {
|
|
8103
8268
|
schema_version: MACHINES_CONSUMER_CONTRACT_VERSION,
|
|
8104
8269
|
package: topology.package,
|
|
8105
8270
|
ok: false,
|
|
@@ -8113,6 +8278,8 @@ function resolveMachineWorkspace(options) {
|
|
|
8113
8278
|
project_root: { path: null, source: "unresolved" },
|
|
8114
8279
|
open_files_root: { path: null, source: "unresolved" }
|
|
8115
8280
|
},
|
|
8281
|
+
diagnostics: [],
|
|
8282
|
+
repair_hints: [],
|
|
8116
8283
|
evidence: {
|
|
8117
8284
|
topology: true,
|
|
8118
8285
|
matched_by: matchedBy,
|
|
@@ -8121,6 +8288,17 @@ function resolveMachineWorkspace(options) {
|
|
|
8121
8288
|
},
|
|
8122
8289
|
warnings
|
|
8123
8290
|
};
|
|
8291
|
+
const diagnostics2 = workspaceDiagnostics({
|
|
8292
|
+
machine,
|
|
8293
|
+
localMachineId: topology.local_machine_id,
|
|
8294
|
+
resolution: resolution2,
|
|
8295
|
+
openFilesRepoName
|
|
8296
|
+
});
|
|
8297
|
+
return {
|
|
8298
|
+
...resolution2,
|
|
8299
|
+
diagnostics: diagnostics2.diagnostics,
|
|
8300
|
+
repair_hints: diagnostics2.repairHints
|
|
8301
|
+
};
|
|
8124
8302
|
}
|
|
8125
8303
|
const metadata = machine.metadata;
|
|
8126
8304
|
const workspaceRootPath = options.workspaceRoot ?? machine.workspace_path;
|
|
@@ -8139,7 +8317,7 @@ function resolveMachineWorkspace(options) {
|
|
|
8139
8317
|
warnings.push(`open_files_root_inferred:${options.projectId}`);
|
|
8140
8318
|
if (!projectRootPath)
|
|
8141
8319
|
warnings.push(`project_root_unresolved:${options.projectId}`);
|
|
8142
|
-
|
|
8320
|
+
const resolution = {
|
|
8143
8321
|
schema_version: MACHINES_CONSUMER_CONTRACT_VERSION,
|
|
8144
8322
|
package: topology.package,
|
|
8145
8323
|
ok: Boolean(projectRootPath),
|
|
@@ -8162,6 +8340,8 @@ function resolveMachineWorkspace(options) {
|
|
|
8162
8340
|
project_root: { path: projectRootPath, source: projectRootSource },
|
|
8163
8341
|
open_files_root: { path: openFilesRootPath, source: openFilesRootSource }
|
|
8164
8342
|
},
|
|
8343
|
+
diagnostics: [],
|
|
8344
|
+
repair_hints: [],
|
|
8165
8345
|
evidence: {
|
|
8166
8346
|
topology: true,
|
|
8167
8347
|
matched_by: matchedBy,
|
|
@@ -8170,10 +8350,21 @@ function resolveMachineWorkspace(options) {
|
|
|
8170
8350
|
},
|
|
8171
8351
|
warnings
|
|
8172
8352
|
};
|
|
8353
|
+
const diagnostics = workspaceDiagnostics({
|
|
8354
|
+
machine,
|
|
8355
|
+
localMachineId: topology.local_machine_id,
|
|
8356
|
+
resolution,
|
|
8357
|
+
openFilesRepoName
|
|
8358
|
+
});
|
|
8359
|
+
return {
|
|
8360
|
+
...resolution,
|
|
8361
|
+
diagnostics: diagnostics.diagnostics,
|
|
8362
|
+
repair_hints: diagnostics.repairHints
|
|
8363
|
+
};
|
|
8173
8364
|
}
|
|
8174
8365
|
|
|
8175
8366
|
// src/commands/ssh.ts
|
|
8176
|
-
function
|
|
8367
|
+
function shellQuote2(value) {
|
|
8177
8368
|
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
8178
8369
|
}
|
|
8179
8370
|
function resolveSshTarget(machineId, options = {}) {
|
|
@@ -8194,11 +8385,11 @@ function resolveSshTarget(machineId, options = {}) {
|
|
|
8194
8385
|
}
|
|
8195
8386
|
function buildSshCommand(machineId, remoteCommand, options = {}) {
|
|
8196
8387
|
const resolved = resolveSshTarget(machineId, options);
|
|
8197
|
-
return remoteCommand ? `ssh ${resolved.target} ${
|
|
8388
|
+
return remoteCommand ? `ssh ${resolved.target} ${shellQuote2(remoteCommand)}` : `ssh ${resolved.target}`;
|
|
8198
8389
|
}
|
|
8199
8390
|
|
|
8200
8391
|
// src/remote.ts
|
|
8201
|
-
function
|
|
8392
|
+
function shellQuote3(value) {
|
|
8202
8393
|
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
8203
8394
|
}
|
|
8204
8395
|
function machineIsLocal(machineId, localMachineId) {
|
|
@@ -8216,7 +8407,7 @@ function resolveMachineCommand(machineId, command, localMachineId = getLocalMach
|
|
|
8216
8407
|
} catch (error) {
|
|
8217
8408
|
const message = String(error.message ?? error);
|
|
8218
8409
|
if (message.includes("Machine route not found") || message.includes("Machine not found in manifest")) {
|
|
8219
|
-
return { source: "ssh", shellCommand: `ssh ${
|
|
8410
|
+
return { source: "ssh", shellCommand: `ssh ${shellQuote3(machineId)} ${shellQuote3(command)}` };
|
|
8220
8411
|
}
|
|
8221
8412
|
throw error;
|
|
8222
8413
|
}
|
|
@@ -8249,7 +8440,7 @@ function getAppManager(machine, app) {
|
|
|
8249
8440
|
return "winget";
|
|
8250
8441
|
return "apt";
|
|
8251
8442
|
}
|
|
8252
|
-
function
|
|
8443
|
+
function shellQuote4(value) {
|
|
8253
8444
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
8254
8445
|
}
|
|
8255
8446
|
function buildAppCommand(machine, app) {
|
|
@@ -8270,7 +8461,7 @@ function buildAppCommand(machine, app) {
|
|
|
8270
8461
|
return `sudo apt-get install -y ${packageName}`;
|
|
8271
8462
|
}
|
|
8272
8463
|
function buildAppProbeCommand(machine, app) {
|
|
8273
|
-
const packageName =
|
|
8464
|
+
const packageName = shellQuote4(getPackageName(app));
|
|
8274
8465
|
const manager = getAppManager(machine, app);
|
|
8275
8466
|
if (manager === "custom") {
|
|
8276
8467
|
return `if command -v ${packageName} >/dev/null 2>&1; then printf 'installed=1\\nversion=custom\\n'; else printf 'installed=0\\n'; fi`;
|
|
@@ -8565,7 +8756,7 @@ var notificationConfigSchema = exports_external.object({
|
|
|
8565
8756
|
function sortChannels(channels) {
|
|
8566
8757
|
return [...channels].sort((left, right) => left.id.localeCompare(right.id));
|
|
8567
8758
|
}
|
|
8568
|
-
function
|
|
8759
|
+
function shellQuote5(value) {
|
|
8569
8760
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
8570
8761
|
}
|
|
8571
8762
|
function hasCommand2(binary) {
|
|
@@ -8612,7 +8803,7 @@ ${message}
|
|
|
8612
8803
|
};
|
|
8613
8804
|
}
|
|
8614
8805
|
if (hasCommand2("mail")) {
|
|
8615
|
-
const command = `printf %s ${
|
|
8806
|
+
const command = `printf %s ${shellQuote5(message)} | mail -s ${shellQuote5(subject)} ${shellQuote5(channel.target)}`;
|
|
8616
8807
|
const result = Bun.spawnSync(["bash", "-lc", command], {
|
|
8617
8808
|
stdout: "pipe",
|
|
8618
8809
|
stderr: "pipe",
|
|
@@ -9197,7 +9388,7 @@ var DEFAULT_COMMANDS = [
|
|
|
9197
9388
|
function defaultPackages() {
|
|
9198
9389
|
return [{ name: "@hasna/machines", command: "machines", expectedVersion: getPackageVersion(), required: true }];
|
|
9199
9390
|
}
|
|
9200
|
-
function
|
|
9391
|
+
function shellQuote6(value) {
|
|
9201
9392
|
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
9202
9393
|
}
|
|
9203
9394
|
function commandId(value) {
|
|
@@ -9248,7 +9439,7 @@ function defaultRunner2(machineId, command) {
|
|
|
9248
9439
|
return runMachineCommand(machineId, command);
|
|
9249
9440
|
}
|
|
9250
9441
|
function inspectCommand(machineId, spec, runner) {
|
|
9251
|
-
const command =
|
|
9442
|
+
const command = shellQuote6(spec.command);
|
|
9252
9443
|
const versionArgs = spec.versionArgs ?? "--version";
|
|
9253
9444
|
const script = [
|
|
9254
9445
|
`cmd=${command}`,
|
|
@@ -9277,7 +9468,7 @@ function fieldCommand(field) {
|
|
|
9277
9468
|
}
|
|
9278
9469
|
function inspectWorkspace(machineId, spec, runner) {
|
|
9279
9470
|
const script = [
|
|
9280
|
-
`path=${
|
|
9471
|
+
`path=${shellQuote6(spec.path)}`,
|
|
9281
9472
|
'printf "exists=%s\\n" "$(test -d "$path" && printf yes || printf no)"',
|
|
9282
9473
|
'pkg="$path/package.json"',
|
|
9283
9474
|
'printf "package_json=%s\\n" "$(test -f "$pkg" && printf yes || printf no)"',
|
|
@@ -10919,6 +11110,12 @@ function renderCompatibilityResult(result) {
|
|
|
10919
11110
|
`);
|
|
10920
11111
|
}
|
|
10921
11112
|
function renderWorkspaceResolution(result) {
|
|
11113
|
+
const diagnosticSummary = result.diagnostics.reduce((summary, entry) => {
|
|
11114
|
+
summary[entry.severity] += 1;
|
|
11115
|
+
return summary;
|
|
11116
|
+
}, { ok: 0, warn: 0, fail: 0 });
|
|
11117
|
+
const diagnosticLines = result.diagnostics.filter((entry) => entry.severity !== "ok").map((entry) => `${entry.id}: ${entry.status} ${entry.message}`);
|
|
11118
|
+
const repairLines = result.repair_hints.map((hint) => `${hint.reason}: ${hint.shell_command}`);
|
|
10922
11119
|
return renderKeyValueTable([
|
|
10923
11120
|
["machine", result.machine_id ?? result.requested_machine_id],
|
|
10924
11121
|
["ok", String(result.ok)],
|
|
@@ -10931,8 +11128,11 @@ function renderWorkspaceResolution(result) {
|
|
|
10931
11128
|
["workspace root", `${result.paths.workspace_root.path ?? "unresolved"} (${result.paths.workspace_root.source})`],
|
|
10932
11129
|
["project root", `${result.paths.project_root.path ?? "unresolved"} (${result.paths.project_root.source})`],
|
|
10933
11130
|
["open-files root", `${result.paths.open_files_root.path ?? "unresolved"} (${result.paths.open_files_root.source})`],
|
|
11131
|
+
["diagnostics", `${diagnosticSummary.ok} ok, ${diagnosticSummary.warn} warn, ${diagnosticSummary.fail} fail`],
|
|
10934
11132
|
["warnings", result.warnings.join(", ") || "none"]
|
|
10935
|
-
])
|
|
11133
|
+
]) + `
|
|
11134
|
+
` + renderList("issues", diagnosticLines) + `
|
|
11135
|
+
` + renderList("repair hints", repairLines);
|
|
10936
11136
|
}
|
|
10937
11137
|
function renderWorkspaceRepairResult(result) {
|
|
10938
11138
|
const patchLines = result.patches.map((patch) => {
|
|
@@ -11120,6 +11320,22 @@ workspaceCommand.command("resolve").description("Resolve repo and open-files roo
|
|
|
11120
11320
|
if (!result.ok && !options.json)
|
|
11121
11321
|
process.exitCode = 1;
|
|
11122
11322
|
});
|
|
11323
|
+
workspaceCommand.command("doctor").description("Diagnose repo and open-files workspace mappings and print repair hints").requiredOption("--machine <id>", "Machine identifier").requiredOption("--project <id>", "Canonical project id").option("--repo <name>", "Repository name; defaults to project id").option("--open-files-repo <name>", "Open-files repository name", "open-files").option("--primary-machine <id>", "Primary machine id for the project").option("--workspace-root <path>", "Override the machine workspace root").option("--project-root <path>", "Override the resolved project root").option("--open-files-root <path>", "Override the resolved open-files root").option("--no-tailscale", "Skip tailscale status probing").option("-j, --json", "Print JSON output", false).action((options) => {
|
|
11324
|
+
const result = resolveMachineWorkspace({
|
|
11325
|
+
machineId: options.machine,
|
|
11326
|
+
projectId: options.project,
|
|
11327
|
+
repoName: options.repo,
|
|
11328
|
+
openFilesRepoName: options.openFilesRepo,
|
|
11329
|
+
primaryMachineId: options.primaryMachine,
|
|
11330
|
+
workspaceRoot: options.workspaceRoot,
|
|
11331
|
+
projectRoot: options.projectRoot,
|
|
11332
|
+
openFilesRoot: options.openFilesRoot,
|
|
11333
|
+
includeTailscale: options.tailscale !== false
|
|
11334
|
+
});
|
|
11335
|
+
printJsonOrText(result, renderWorkspaceResolution(result), options.json);
|
|
11336
|
+
if (result.diagnostics.some((entry) => entry.severity === "fail") && !options.json)
|
|
11337
|
+
process.exitCode = 1;
|
|
11338
|
+
});
|
|
11123
11339
|
workspaceCommand.command("repair").description("Preview or write explicit manifest path mappings for inferred workspace roots").requiredOption("--machine <id>", "Machine identifier").requiredOption("--project <id>", "Canonical project id").option("--repo <name>", "Repository name; defaults to project id").option("--open-files-repo <name>", "Open-files repository name", "open-files").option("--workspace-root <path>", "Override the machine workspace root for resolution").option("--project-root <path>", "Explicit project root to write").option("--open-files-root <path>", "Explicit open-files root to write").option("--apply", "Write the mappings into the manifest", false).option("--allow-untrusted", "Allow writing mappings for machines not marked trusted", false).option("--no-tailscale", "Skip tailscale status probing").option("-j, --json", "Print JSON output", false).action((options) => {
|
|
11124
11340
|
const result = repairWorkspaceManifestMappings({
|
|
11125
11341
|
machineId: options.machine,
|
package/dist/consumer.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { MACHINES_CONSUMER_CAPABILITIES, MACHINES_CONSUMER_CONTRACT, MACHINES_CONSUMER_ENTRYPOINT, MACHINES_CONSUMER_CONTRACT_VERSION, MACHINES_PACKAGE_NAME, discoverMachineTopology, getMachinesConsumerCapabilities, getLocalMachineTopology, resolveMachineRoute, resolveMachineWorkspace, } from "./topology.js";
|
|
2
|
-
export type { MachineRouteConfidence, MachineRouteHint, MachineRouteKind, MachineRouteOptions, MachineRouteResolution, MachineTopology, MachineTopologyEntry, MachineTopologyOptions, MachineWorkspaceAuthStatus, MachineWorkspaceOptions, MachineWorkspacePath, MachineWorkspacePathSource, MachineWorkspaceProject, MachineWorkspaceResolution, MachineWorkspaceTrustStatus, MachinesConsumerContract, MachinesConsumerEnvelope, MachinesConsumerCapabilities, MachinesContractPackage, TopologyCommandResult, TopologyCommandRunner, } from "./topology.js";
|
|
2
|
+
export type { MachineRouteConfidence, MachineRouteHint, MachineRouteKind, MachineRouteOptions, MachineRouteResolution, MachineTopology, MachineTopologyEntry, MachineTopologyOptions, MachineWorkspaceAuthStatus, MachineWorkspaceDiagnostic, MachineWorkspaceDiagnosticStatus, MachineWorkspaceOptions, MachineWorkspacePath, MachineWorkspacePathSource, MachineWorkspaceProject, MachineWorkspaceRepairHint, MachineWorkspaceResolution, MachineWorkspaceTrustStatus, MachinesConsumerContract, MachinesConsumerEnvelope, MachinesConsumerCapabilities, MachinesContractPackage, TopologyCommandResult, TopologyCommandRunner, } from "./topology.js";
|
|
3
3
|
export { checkMachineCompatibility, } from "./compatibility.js";
|
|
4
4
|
export type { CompatibilityCheck, CompatibilityCommandRunner, CompatibilityCommandSpec, CompatibilityPackageSpec, CompatibilitySource, CompatibilityStatus, CompatibilityWorkspaceSpec, MachineCompatibilityOptions, MachineCompatibilityReport, } from "./compatibility.js";
|
|
5
5
|
export { resolveMachineCommand, runMachineCommand, } from "./remote.js";
|
package/dist/consumer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../src/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC1B,4BAA4B,EAC5B,kCAAkC,EAClC,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../src/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC1B,4BAA4B,EAC5B,kCAAkC,EAClC,qBAAqB,EACrB,uBAAuB,EACvB,+BAA+B,EAC/B,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,gCAAgC,EAChC,uBAAuB,EACvB,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|