@harness-nexus/cli 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +38 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/acp/adapters.d.ts +7 -0
- package/dist/daemon/acp/adapters.d.ts.map +1 -0
- package/dist/daemon/acp/adapters.js +34 -0
- package/dist/daemon/acp/adapters.js.map +1 -0
- package/dist/daemon/acp/agent-connection.d.ts +45 -0
- package/dist/daemon/acp/agent-connection.d.ts.map +1 -0
- package/dist/daemon/acp/agent-connection.js +158 -0
- package/dist/daemon/acp/agent-connection.js.map +1 -0
- package/dist/daemon/chat.d.ts +22 -0
- package/dist/daemon/chat.d.ts.map +1 -0
- package/dist/daemon/chat.js +280 -0
- package/dist/daemon/chat.js.map +1 -0
- package/dist/daemon/client.d.ts +23 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +117 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/jobs.d.ts +19 -0
- package/dist/daemon/jobs.d.ts.map +1 -0
- package/dist/daemon/jobs.js +65 -0
- package/dist/daemon/jobs.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +481 -0
- package/dist/index.js.map +1 -0
- package/dist/install/adapter-factory.d.ts +24 -0
- package/dist/install/adapter-factory.d.ts.map +1 -0
- package/dist/install/adapter-factory.js +80 -0
- package/dist/install/adapter-factory.js.map +1 -0
- package/dist/install/adapters/codex.d.ts +16 -0
- package/dist/install/adapters/codex.d.ts.map +1 -0
- package/dist/install/adapters/codex.js +172 -0
- package/dist/install/adapters/codex.js.map +1 -0
- package/dist/install/adapters/deepseek.d.ts +26 -0
- package/dist/install/adapters/deepseek.d.ts.map +1 -0
- package/dist/install/adapters/deepseek.js +246 -0
- package/dist/install/adapters/deepseek.js.map +1 -0
- package/dist/install/adapters/hermes.d.ts +16 -0
- package/dist/install/adapters/hermes.d.ts.map +1 -0
- package/dist/install/adapters/hermes.js +267 -0
- package/dist/install/adapters/hermes.js.map +1 -0
- package/dist/install/adapters/stub.d.ts +2 -0
- package/dist/install/adapters/stub.d.ts.map +1 -0
- package/dist/install/adapters/stub.js +22 -0
- package/dist/install/adapters/stub.js.map +1 -0
- package/dist/install/install-state.d.ts +31 -0
- package/dist/install/install-state.d.ts.map +1 -0
- package/dist/install/install-state.js +29 -0
- package/dist/install/install-state.js.map +1 -0
- package/dist/install/installer.d.ts +16 -0
- package/dist/install/installer.d.ts.map +1 -0
- package/dist/install/installer.js +96 -0
- package/dist/install/installer.js.map +1 -0
- package/dist/install/planner.d.ts +26 -0
- package/dist/install/planner.d.ts.map +1 -0
- package/dist/install/planner.js +25 -0
- package/dist/install/planner.js.map +1 -0
- package/dist/install/registry.d.ts +21 -0
- package/dist/install/registry.d.ts.map +1 -0
- package/dist/install/registry.js +31 -0
- package/dist/install/registry.js.map +1 -0
- package/dist/install/resolver.d.ts +15 -0
- package/dist/install/resolver.d.ts.map +1 -0
- package/dist/install/resolver.js +57 -0
- package/dist/install/resolver.js.map +1 -0
- package/dist/install/types.d.ts +93 -0
- package/dist/install/types.d.ts.map +1 -0
- package/dist/install/types.js +2 -0
- package/dist/install/types.js.map +1 -0
- package/dist/install/uninstaller.d.ts +29 -0
- package/dist/install/uninstaller.d.ts.map +1 -0
- package/dist/install/uninstaller.js +107 -0
- package/dist/install/uninstaller.js.map +1 -0
- package/dist/inventory/common.d.ts +86 -0
- package/dist/inventory/common.d.ts.map +1 -0
- package/dist/inventory/common.js +137 -0
- package/dist/inventory/common.js.map +1 -0
- package/dist/inventory/scan.d.ts +23 -0
- package/dist/inventory/scan.d.ts.map +1 -0
- package/dist/inventory/scan.js +117 -0
- package/dist/inventory/scan.js.map +1 -0
- package/dist/inventory/scanners/claude-code.d.ts +3 -0
- package/dist/inventory/scanners/claude-code.d.ts.map +1 -0
- package/dist/inventory/scanners/claude-code.js +191 -0
- package/dist/inventory/scanners/claude-code.js.map +1 -0
- package/dist/inventory/scanners/codex.d.ts +14 -0
- package/dist/inventory/scanners/codex.d.ts.map +1 -0
- package/dist/inventory/scanners/codex.js +201 -0
- package/dist/inventory/scanners/codex.js.map +1 -0
- package/dist/inventory/scanners/deepseek.d.ts +9 -0
- package/dist/inventory/scanners/deepseek.d.ts.map +1 -0
- package/dist/inventory/scanners/deepseek.js +200 -0
- package/dist/inventory/scanners/deepseek.js.map +1 -0
- package/dist/inventory/scanners/hermes.d.ts +3 -0
- package/dist/inventory/scanners/hermes.d.ts.map +1 -0
- package/dist/inventory/scanners/hermes.js +194 -0
- package/dist/inventory/scanners/hermes.js.map +1 -0
- package/dist/inventory/types.d.ts +33 -0
- package/dist/inventory/types.d.ts.map +1 -0
- package/dist/inventory/types.js +2 -0
- package/dist/inventory/types.js.map +1 -0
- package/dist/mcp/serve.d.ts +8 -0
- package/dist/mcp/serve.d.ts.map +1 -0
- package/dist/mcp/serve.js +118 -0
- package/dist/mcp/serve.js.map +1 -0
- package/package.json +50 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `harness-nexus` / `hnx` — install tool (Phase 3.3).
|
|
4
|
+
*
|
|
5
|
+
* Fetches a profile from a Harness Nexus server via the SDK and installs it
|
|
6
|
+
* into a target Agent tool's native layout through a target adapter. Plan and
|
|
7
|
+
* apply are separate: a plain run is a dry-run that prints the plan; `--apply`
|
|
8
|
+
* writes files + an install-state ledger.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* hnx install --profile <id> --server <url> --token <pat> [--target <t>] [--apply] [--out <dir>]
|
|
12
|
+
* hnx install --profile <id> ... # dry-run: prints the plan, writes nothing
|
|
13
|
+
*
|
|
14
|
+
* A profile is a reference bundle (its entries point at server-side resources),
|
|
15
|
+
* so the server is required — there is no local-manifest path.
|
|
16
|
+
*
|
|
17
|
+
* Design: `docs/design/phase-3-install.md`. Adapter pattern:
|
|
18
|
+
* `docs/research/phase-3-ecc-install-patterns.md`.
|
|
19
|
+
*/
|
|
20
|
+
import { hostname } from 'node:os';
|
|
21
|
+
import { InstallError } from './errors.js';
|
|
22
|
+
import { applyInstall } from './install/installer.js';
|
|
23
|
+
import { planInstall } from './install/planner.js';
|
|
24
|
+
import { resolveProfile } from './install/resolver.js';
|
|
25
|
+
import { supportedTargets } from './install/registry.js';
|
|
26
|
+
import { getHermesPlanWarnings } from './install/adapters/hermes.js';
|
|
27
|
+
import { getCodexPlanWarnings } from './install/adapters/codex.js';
|
|
28
|
+
import { getDeepseekPlanWarnings } from './install/adapters/deepseek.js';
|
|
29
|
+
import { applyUninstall, planUninstall } from './install/uninstaller.js';
|
|
30
|
+
import { daemonConfigPath, loadDaemonConfig, saveDaemonConfig } from './config.js';
|
|
31
|
+
import { runDaemon } from './daemon/client.js';
|
|
32
|
+
import { runMcpServe } from './mcp/serve.js';
|
|
33
|
+
import { HarnessNexusClient } from '@harness-nexus/sdk';
|
|
34
|
+
const HELP = `harness-nexus (hnx) — install profiles into Agent tools
|
|
35
|
+
|
|
36
|
+
Usage:
|
|
37
|
+
hnx install --profile <id> --server <url> --token <pat> [options]
|
|
38
|
+
hnx uninstall --target <t> [--out <dir>] [--apply]
|
|
39
|
+
hnx enroll --server <url> --token <pat> [--name <name>]
|
|
40
|
+
hnx daemon [--server <url>] [--token <machine-pat>] [--machine-id <id>]
|
|
41
|
+
hnx mcp serve --profile <id> [--server <url>] [--token <pat>]
|
|
42
|
+
|
|
43
|
+
Install options:
|
|
44
|
+
--profile <id> Profile to install (required)
|
|
45
|
+
--server <url> Harness Nexus server base URL (required)
|
|
46
|
+
--token <pat> PAT or JWT for authentication (required)
|
|
47
|
+
--target <t> Override target (default: the profile's own target)
|
|
48
|
+
--apply Write files (default: dry-run, prints the plan only)
|
|
49
|
+
--out <dir> Override the install root (default: the target's native home)
|
|
50
|
+
|
|
51
|
+
Uninstall options:
|
|
52
|
+
--target <t> Target whose ledger to reverse (required)
|
|
53
|
+
--out <dir> Same install-root override used at install time
|
|
54
|
+
--apply Actually remove/restore (default: dry-run, prints steps)
|
|
55
|
+
Files you edited after install are kept as *.hnx.bak
|
|
56
|
+
|
|
57
|
+
Enroll options (Phase 8 — machine registration):
|
|
58
|
+
--server <url> Harness Nexus server base URL (required)
|
|
59
|
+
--token <pat> A user PAT for the enrollment call (required)
|
|
60
|
+
--name <name> Machine display name (default: this host's hostname)
|
|
61
|
+
Creates the machine + its dedicated machine token and
|
|
62
|
+
saves them to ~/.hnx/config.json (0600).
|
|
63
|
+
|
|
64
|
+
Daemon options (Phase 8 — bring the machine online):
|
|
65
|
+
(all optional; defaults come from ~/.hnx/config.json written by 'hnx enroll')
|
|
66
|
+
--server <url> Override the server base URL
|
|
67
|
+
--token <pat> Override the machine token
|
|
68
|
+
--machine-id <id> Override the machine id
|
|
69
|
+
|
|
70
|
+
MCP serve options (Phase 8 C2 — the stdio shim; spawned by Agent tools):
|
|
71
|
+
--profile <id> Profile to serve (required)
|
|
72
|
+
--server <url> Server base URL (default: ~/.hnx/config.json)
|
|
73
|
+
--token <pat> Machine PAT or user PAT (default: ~/.hnx/config.json)
|
|
74
|
+
|
|
75
|
+
To upgrade an install, run the same 'hnx install --apply' again — the plan
|
|
76
|
+
rewrites its own entries (idempotent) and the ledger is refreshed.
|
|
77
|
+
|
|
78
|
+
Supported targets: ${supportedTargets().join(', ')}
|
|
79
|
+
(zcode is in the enum but has no install adapter.)
|
|
80
|
+
|
|
81
|
+
A plain run is a DRY-RUN — it prints the planned operations without writing.
|
|
82
|
+
Add --apply to materialize them.`;
|
|
83
|
+
/** Minimal hand-written argv parser (zero runtime deps). `loose` skips the
|
|
84
|
+
* install-only required-arg checks (uninstall needs just --target). */
|
|
85
|
+
function parseArgs(argv, loose = false) {
|
|
86
|
+
const args = { profile: '', server: '', token: '', apply: false };
|
|
87
|
+
for (let i = 0; i < argv.length; i++) {
|
|
88
|
+
const a = argv[i];
|
|
89
|
+
const next = () => {
|
|
90
|
+
const v = argv[++i];
|
|
91
|
+
if (v === undefined)
|
|
92
|
+
throw new InstallError(`Missing value for ${a}`, 'VALIDATION_FAILED');
|
|
93
|
+
return v;
|
|
94
|
+
};
|
|
95
|
+
switch (a) {
|
|
96
|
+
case '--profile':
|
|
97
|
+
args.profile = next();
|
|
98
|
+
break;
|
|
99
|
+
case '--server':
|
|
100
|
+
args.server = next();
|
|
101
|
+
break;
|
|
102
|
+
case '--token':
|
|
103
|
+
args.token = next();
|
|
104
|
+
break;
|
|
105
|
+
case '--target':
|
|
106
|
+
args.target = next();
|
|
107
|
+
break;
|
|
108
|
+
case '--out':
|
|
109
|
+
args.out = next();
|
|
110
|
+
break;
|
|
111
|
+
case '--apply':
|
|
112
|
+
args.apply = true;
|
|
113
|
+
break;
|
|
114
|
+
default:
|
|
115
|
+
throw new InstallError(`Unknown argument: ${a}`, 'VALIDATION_FAILED');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (loose)
|
|
119
|
+
return args;
|
|
120
|
+
for (const [k, v] of [
|
|
121
|
+
['--profile', args.profile],
|
|
122
|
+
['--server', args.server],
|
|
123
|
+
['--token', args.token],
|
|
124
|
+
]) {
|
|
125
|
+
if (!v)
|
|
126
|
+
throw new InstallError(`Missing required argument ${k}`, 'VALIDATION_FAILED');
|
|
127
|
+
}
|
|
128
|
+
return args;
|
|
129
|
+
}
|
|
130
|
+
/** Print target-specific post-install hints the adapters cannot perform themselves. */
|
|
131
|
+
function printHermesHints(_plan) {
|
|
132
|
+
const w = getHermesPlanWarnings();
|
|
133
|
+
const lines = ['\nHermes post-install steps:'];
|
|
134
|
+
if (w.needsPluginEnable) {
|
|
135
|
+
lines.push(` • Enable the plugin: add '${w.pluginSlug}' to the 'plugins.enabled' list in config.yaml`);
|
|
136
|
+
}
|
|
137
|
+
if (w.needsHnx) {
|
|
138
|
+
lines.push(` • MCP runs through the hnx stdio shim — run 'hnx enroll' on this machine if you haven't`);
|
|
139
|
+
}
|
|
140
|
+
if (w.skipped.length > 0) {
|
|
141
|
+
lines.push(` • Skipped (Hermes model incompatibility):`);
|
|
142
|
+
for (const s of w.skipped)
|
|
143
|
+
lines.push(` - ${s}`);
|
|
144
|
+
}
|
|
145
|
+
// eslint-disable-next-line no-console
|
|
146
|
+
console.log(lines.join('\n'));
|
|
147
|
+
}
|
|
148
|
+
/** Print Codex post-install hints. */
|
|
149
|
+
function printCodexHints() {
|
|
150
|
+
const w = getCodexPlanWarnings();
|
|
151
|
+
const lines = ['\nCodex post-install steps:'];
|
|
152
|
+
if (w.needsHnx) {
|
|
153
|
+
lines.push(` • MCP runs through the hnx stdio shim — run 'hnx enroll' on this machine if you haven't`);
|
|
154
|
+
}
|
|
155
|
+
if (w.skipped.length > 0) {
|
|
156
|
+
lines.push(` • Skipped (no verified Codex home-install format):`);
|
|
157
|
+
for (const s of w.skipped)
|
|
158
|
+
lines.push(` - ${s}`);
|
|
159
|
+
}
|
|
160
|
+
// eslint-disable-next-line no-console
|
|
161
|
+
console.log(lines.join('\n'));
|
|
162
|
+
}
|
|
163
|
+
/** Print DeepSeek Harness (dsh) post-install hints. */
|
|
164
|
+
function printDeepseekHints() {
|
|
165
|
+
const w = getDeepseekPlanWarnings();
|
|
166
|
+
const lines = ['\nDeepSeek Harness post-install steps:'];
|
|
167
|
+
if (w.needsHnx) {
|
|
168
|
+
lines.push(` • MCP runs through the hnx stdio shim (cordis.patch.yml row) — run 'hnx enroll' on this machine if you haven't`);
|
|
169
|
+
}
|
|
170
|
+
if (w.skipped.length > 0) {
|
|
171
|
+
lines.push(` • Skipped (no verified dsh home-install format):`);
|
|
172
|
+
for (const s of w.skipped)
|
|
173
|
+
lines.push(` - ${s}`);
|
|
174
|
+
}
|
|
175
|
+
// eslint-disable-next-line no-console
|
|
176
|
+
console.log(lines.join('\n'));
|
|
177
|
+
}
|
|
178
|
+
/** Render a plan for the dry-run preview. */
|
|
179
|
+
function formatPlan(plan) {
|
|
180
|
+
const lines = [
|
|
181
|
+
`target: ${plan.adapter.target} (${plan.adapter.kind})`,
|
|
182
|
+
`root: ${plan.targetRoot}`,
|
|
183
|
+
`ledger: ${plan.installStatePath}`,
|
|
184
|
+
`sensitive: ${plan.sensitive ? 'yes (direct-mode credentials inlined)' : 'no'}`,
|
|
185
|
+
`operations: ${plan.operations.length}`,
|
|
186
|
+
'',
|
|
187
|
+
];
|
|
188
|
+
for (const [i, op] of plan.operations.entries()) {
|
|
189
|
+
const tag = op.kind === 'copy-file'
|
|
190
|
+
? `copy ${op.sourcePath}`
|
|
191
|
+
: op.kind === 'write-file'
|
|
192
|
+
? `write ${op.content.length} bytes`
|
|
193
|
+
: `merge ${JSON.stringify(op.mergePayload).length} bytes`;
|
|
194
|
+
lines.push(` [${i + 1}] ${op.kind.padEnd(10)} → ${op.destinationPath}`);
|
|
195
|
+
lines.push(` ${tag}`);
|
|
196
|
+
}
|
|
197
|
+
return lines.join('\n');
|
|
198
|
+
}
|
|
199
|
+
async function runInstall(args) {
|
|
200
|
+
const resolved = await resolveProfile({
|
|
201
|
+
server: args.server,
|
|
202
|
+
token: args.token,
|
|
203
|
+
profileId: args.profile,
|
|
204
|
+
});
|
|
205
|
+
// Adapters read the server base from HN_SERVER when emitting `hnx mcp serve`
|
|
206
|
+
// shim entries (they don't receive the resolver's options directly).
|
|
207
|
+
process.env.HN_SERVER = args.server;
|
|
208
|
+
const plan = planInstall(resolved, {
|
|
209
|
+
...(args.target !== undefined ? { target: args.target } : {}),
|
|
210
|
+
input: args.out ? { outDir: args.out } : {},
|
|
211
|
+
});
|
|
212
|
+
// eslint-disable-next-line no-console
|
|
213
|
+
console.log(formatPlan(plan));
|
|
214
|
+
// Target-specific install hints (manual steps the adapters can't do).
|
|
215
|
+
if (plan.adapter.target === 'hermes') {
|
|
216
|
+
printHermesHints(plan);
|
|
217
|
+
}
|
|
218
|
+
if (plan.adapter.target === 'codex') {
|
|
219
|
+
printCodexHints();
|
|
220
|
+
}
|
|
221
|
+
if (plan.adapter.target === 'deepseek') {
|
|
222
|
+
printDeepseekHints();
|
|
223
|
+
}
|
|
224
|
+
if (!args.apply) {
|
|
225
|
+
// eslint-disable-next-line no-console
|
|
226
|
+
console.log('\n(dry-run — no files written. Add --apply to materialize.)');
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
applyInstall(plan, {
|
|
230
|
+
profileId: resolved.profile.id,
|
|
231
|
+
profileName: resolved.profile.name,
|
|
232
|
+
profileVersion: resolved.profile.version,
|
|
233
|
+
});
|
|
234
|
+
// eslint-disable-next-line no-console
|
|
235
|
+
console.log(`\nInstalled ${plan.operations.length} operation(s) into ${plan.targetRoot}.`);
|
|
236
|
+
if (plan.sensitive) {
|
|
237
|
+
// eslint-disable-next-line no-console
|
|
238
|
+
console.warn('WARNING: this install carries decrypted direct-mode credentials (chmod 0700 applied).');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** Render an uninstall plan for the dry-run preview. */
|
|
242
|
+
function formatUninstallPlan(plan) {
|
|
243
|
+
const lines = [
|
|
244
|
+
`target: ${plan.profile.name} (installed ${plan.installedAt})`,
|
|
245
|
+
`root: ${plan.targetRoot}`,
|
|
246
|
+
`steps: ${plan.steps.length}`,
|
|
247
|
+
'',
|
|
248
|
+
];
|
|
249
|
+
for (const [i, s] of plan.steps.entries()) {
|
|
250
|
+
const flag = s.conflicts
|
|
251
|
+
? ' [modified since install → .hnx.bak]'
|
|
252
|
+
: s.exists
|
|
253
|
+
? ''
|
|
254
|
+
: ' [already gone]';
|
|
255
|
+
lines.push(` [${i + 1}] ${s.action.padEnd(7)} ${s.destinationPath}${flag}`);
|
|
256
|
+
}
|
|
257
|
+
return lines.join('\n');
|
|
258
|
+
}
|
|
259
|
+
function runUninstall(args) {
|
|
260
|
+
if (!args.target) {
|
|
261
|
+
throw new InstallError('Missing required argument --target', 'VALIDATION_FAILED');
|
|
262
|
+
}
|
|
263
|
+
const plan = planUninstall({
|
|
264
|
+
target: args.target,
|
|
265
|
+
input: args.out ? { outDir: args.out } : {},
|
|
266
|
+
});
|
|
267
|
+
if (!plan) {
|
|
268
|
+
// eslint-disable-next-line no-console
|
|
269
|
+
console.error(`hnx: no install-state ledger found for target '${args.target}' — nothing installed (or already uninstalled).`);
|
|
270
|
+
return 1;
|
|
271
|
+
}
|
|
272
|
+
// eslint-disable-next-line no-console
|
|
273
|
+
console.log(formatUninstallPlan(plan));
|
|
274
|
+
if (!args.apply) {
|
|
275
|
+
// eslint-disable-next-line no-console
|
|
276
|
+
console.log('\n(dry-run — nothing removed. Add --apply to uninstall.)');
|
|
277
|
+
return 0;
|
|
278
|
+
}
|
|
279
|
+
const touched = applyUninstall(plan);
|
|
280
|
+
// eslint-disable-next-line no-console
|
|
281
|
+
console.log(`\nUninstalled: ${touched} file(s) restored or removed.`);
|
|
282
|
+
// eslint-disable-next-line no-console
|
|
283
|
+
console.log('Reminder: manual steps from install (e.g. plugins.enabled, env vars) are yours to undo.');
|
|
284
|
+
return 0;
|
|
285
|
+
}
|
|
286
|
+
function parseEnrollArgs(argv) {
|
|
287
|
+
const args = { server: '', token: '' };
|
|
288
|
+
for (let i = 0; i < argv.length; i++) {
|
|
289
|
+
const a = argv[i];
|
|
290
|
+
const next = () => {
|
|
291
|
+
const v = argv[++i];
|
|
292
|
+
if (v === undefined)
|
|
293
|
+
throw new InstallError(`Missing value for ${a}`, 'VALIDATION_FAILED');
|
|
294
|
+
return v;
|
|
295
|
+
};
|
|
296
|
+
switch (a) {
|
|
297
|
+
case '--server':
|
|
298
|
+
args.server = next();
|
|
299
|
+
break;
|
|
300
|
+
case '--token':
|
|
301
|
+
args.token = next();
|
|
302
|
+
break;
|
|
303
|
+
case '--name':
|
|
304
|
+
args.name = next();
|
|
305
|
+
break;
|
|
306
|
+
default:
|
|
307
|
+
throw new InstallError(`Unknown argument: ${a}`, 'VALIDATION_FAILED');
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
for (const [k, v] of [
|
|
311
|
+
['--server', args.server],
|
|
312
|
+
['--token', args.token],
|
|
313
|
+
]) {
|
|
314
|
+
if (!v)
|
|
315
|
+
throw new InstallError(`Missing required argument ${k}`, 'VALIDATION_FAILED');
|
|
316
|
+
}
|
|
317
|
+
return args;
|
|
318
|
+
}
|
|
319
|
+
async function runEnroll(args) {
|
|
320
|
+
const client = new HarnessNexusClient({ baseUrl: args.server, token: args.token });
|
|
321
|
+
const { machine, token } = await client.createMachine({
|
|
322
|
+
name: args.name ?? hostname(),
|
|
323
|
+
});
|
|
324
|
+
saveDaemonConfig({
|
|
325
|
+
server: args.server,
|
|
326
|
+
token,
|
|
327
|
+
machineId: machine.id,
|
|
328
|
+
...(machine.name !== undefined ? { machineName: machine.name } : {}),
|
|
329
|
+
});
|
|
330
|
+
// eslint-disable-next-line no-console
|
|
331
|
+
console.log(`Enrolled machine '${machine.name}' (${machine.id}).`);
|
|
332
|
+
// eslint-disable-next-line no-console
|
|
333
|
+
console.log(`Machine token saved to ${daemonConfigPath()} (0600) — never shown again.`);
|
|
334
|
+
// eslint-disable-next-line no-console
|
|
335
|
+
console.log('Bring it online with: hnx daemon');
|
|
336
|
+
}
|
|
337
|
+
function parseDaemonArgs(argv) {
|
|
338
|
+
const args = {};
|
|
339
|
+
for (let i = 0; i < argv.length; i++) {
|
|
340
|
+
const a = argv[i];
|
|
341
|
+
const next = () => {
|
|
342
|
+
const v = argv[++i];
|
|
343
|
+
if (v === undefined)
|
|
344
|
+
throw new InstallError(`Missing value for ${a}`, 'VALIDATION_FAILED');
|
|
345
|
+
return v;
|
|
346
|
+
};
|
|
347
|
+
switch (a) {
|
|
348
|
+
case '--server':
|
|
349
|
+
args.server = next();
|
|
350
|
+
break;
|
|
351
|
+
case '--token':
|
|
352
|
+
args.token = next();
|
|
353
|
+
break;
|
|
354
|
+
case '--machine-id':
|
|
355
|
+
args.machineId = next();
|
|
356
|
+
break;
|
|
357
|
+
default:
|
|
358
|
+
throw new InstallError(`Unknown argument: ${a}`, 'VALIDATION_FAILED');
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return args;
|
|
362
|
+
}
|
|
363
|
+
async function runDaemonCommand(args) {
|
|
364
|
+
const config = loadDaemonConfig();
|
|
365
|
+
const server = args.server ?? config?.server;
|
|
366
|
+
const token = args.token ?? config?.token;
|
|
367
|
+
const machineId = args.machineId ?? config?.machineId;
|
|
368
|
+
if (!server || !token || !machineId) {
|
|
369
|
+
throw new InstallError('No daemon configuration found. Run "hnx enroll" first, or pass --server/--token/--machine-id.', 'VALIDATION_FAILED');
|
|
370
|
+
}
|
|
371
|
+
await runDaemon({ server, token, machineId });
|
|
372
|
+
}
|
|
373
|
+
function parseMcpServeArgs(argv) {
|
|
374
|
+
const args = { profile: '' };
|
|
375
|
+
for (let i = 0; i < argv.length; i++) {
|
|
376
|
+
const a = argv[i];
|
|
377
|
+
const next = () => {
|
|
378
|
+
const v = argv[++i];
|
|
379
|
+
if (v === undefined)
|
|
380
|
+
throw new InstallError(`Missing value for ${a}`, 'VALIDATION_FAILED');
|
|
381
|
+
return v;
|
|
382
|
+
};
|
|
383
|
+
switch (a) {
|
|
384
|
+
case '--profile':
|
|
385
|
+
args.profile = next();
|
|
386
|
+
break;
|
|
387
|
+
case '--server':
|
|
388
|
+
args.server = next();
|
|
389
|
+
break;
|
|
390
|
+
case '--token':
|
|
391
|
+
args.token = next();
|
|
392
|
+
break;
|
|
393
|
+
default:
|
|
394
|
+
throw new InstallError(`Unknown argument: ${a}`, 'VALIDATION_FAILED');
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (!args.profile) {
|
|
398
|
+
throw new InstallError('Missing required argument --profile', 'VALIDATION_FAILED');
|
|
399
|
+
}
|
|
400
|
+
return args;
|
|
401
|
+
}
|
|
402
|
+
async function runMcpServeCommand(args) {
|
|
403
|
+
const config = loadDaemonConfig();
|
|
404
|
+
const server = args.server ?? config?.server;
|
|
405
|
+
const token = args.token ?? config?.token;
|
|
406
|
+
if (!server || !token) {
|
|
407
|
+
throw new InstallError('No server/token: run "hnx enroll" first, or pass --server/--token.', 'VALIDATION_FAILED');
|
|
408
|
+
}
|
|
409
|
+
await runMcpServe({ profileId: args.profile, server, token });
|
|
410
|
+
}
|
|
411
|
+
async function main(argv) {
|
|
412
|
+
const [, , subcommand, ...rest] = argv;
|
|
413
|
+
if (!subcommand || subcommand === '-h' || subcommand === '--help') {
|
|
414
|
+
// eslint-disable-next-line no-console
|
|
415
|
+
console.log(HELP);
|
|
416
|
+
return 0;
|
|
417
|
+
}
|
|
418
|
+
if (subcommand === 'install' || subcommand === 'uninstall') {
|
|
419
|
+
if (rest.includes('-h') || rest.includes('--help')) {
|
|
420
|
+
// eslint-disable-next-line no-console
|
|
421
|
+
console.log(HELP);
|
|
422
|
+
return 0;
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
if (subcommand === 'install') {
|
|
426
|
+
const args = parseArgs(rest);
|
|
427
|
+
await runInstall(args);
|
|
428
|
+
return 0;
|
|
429
|
+
}
|
|
430
|
+
return runUninstall(parseArgs(rest, /* loose */ true));
|
|
431
|
+
}
|
|
432
|
+
catch (e) {
|
|
433
|
+
if (e instanceof InstallError) {
|
|
434
|
+
// eslint-disable-next-line no-console
|
|
435
|
+
console.error(`hnx: ${e.code}: ${e.message}`);
|
|
436
|
+
return 1;
|
|
437
|
+
}
|
|
438
|
+
// eslint-disable-next-line no-console
|
|
439
|
+
console.error(`hnx: unexpected error: ${e instanceof Error ? e.message : String(e)}`);
|
|
440
|
+
return 2;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
if (subcommand === 'enroll' || subcommand === 'daemon' || subcommand === 'mcp') {
|
|
444
|
+
if (rest.includes('-h') || rest.includes('--help')) {
|
|
445
|
+
// eslint-disable-next-line no-console
|
|
446
|
+
console.log(HELP);
|
|
447
|
+
return 0;
|
|
448
|
+
}
|
|
449
|
+
try {
|
|
450
|
+
if (subcommand === 'enroll') {
|
|
451
|
+
await runEnroll(parseEnrollArgs(rest));
|
|
452
|
+
return 0;
|
|
453
|
+
}
|
|
454
|
+
if (subcommand === 'daemon') {
|
|
455
|
+
await runDaemonCommand(parseDaemonArgs(rest));
|
|
456
|
+
return 0;
|
|
457
|
+
}
|
|
458
|
+
const [serve, ...serveRest] = rest;
|
|
459
|
+
if (serve !== 'serve') {
|
|
460
|
+
throw new InstallError(`Unknown 'mcp' subcommand '${String(serve)}' — expected 'hnx mcp serve'.`, 'VALIDATION_FAILED');
|
|
461
|
+
}
|
|
462
|
+
await runMcpServeCommand(parseMcpServeArgs(serveRest));
|
|
463
|
+
return 0;
|
|
464
|
+
}
|
|
465
|
+
catch (e) {
|
|
466
|
+
if (e instanceof InstallError) {
|
|
467
|
+
// eslint-disable-next-line no-console
|
|
468
|
+
console.error(`hnx: ${e.code}: ${e.message}`);
|
|
469
|
+
return 1;
|
|
470
|
+
}
|
|
471
|
+
// eslint-disable-next-line no-console
|
|
472
|
+
console.error(`hnx: unexpected error: ${e instanceof Error ? e.message : String(e)}`);
|
|
473
|
+
return 2;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// eslint-disable-next-line no-console
|
|
477
|
+
console.error(`hnx: unknown subcommand '${subcommand}'. Run 'hnx --help'.`);
|
|
478
|
+
return 2;
|
|
479
|
+
}
|
|
480
|
+
main(process.argv).then((code) => process.exit(code));
|
|
481
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentTarget } from '@harness-nexus/core';
|
|
2
|
+
import type { InstallPlan, ResolveInput, TargetAdapter } from './types.js';
|
|
3
|
+
export interface AdapterConfig {
|
|
4
|
+
id: string;
|
|
5
|
+
target: AgentTarget;
|
|
6
|
+
kind: 'home' | 'project';
|
|
7
|
+
/** Path segments under the home/project root (e.g. ['.hermes'], ['.codex']). */
|
|
8
|
+
rootSegments: string[];
|
|
9
|
+
/** Ledger filename written inside the target root. */
|
|
10
|
+
installStateFilename?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Override the default planOperations. The default writes a single
|
|
13
|
+
* `write-file` op recording the profile metadata — real adapters replace this
|
|
14
|
+
* with per-artifact emission.
|
|
15
|
+
*/
|
|
16
|
+
planOperations?: (resolved: import('./types.js').ResolvedProfile, input: ResolveInput, adapter: TargetAdapter) => InstallPlan;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Produce a frozen target adapter from a config. The default `planOperations`
|
|
20
|
+
* emits a minimal `harness-nexus-profile.json` so the pipeline is exercisable
|
|
21
|
+
* end-to-end before real adapters land (3.4+).
|
|
22
|
+
*/
|
|
23
|
+
export declare function createTargetAdapter(config: AdapterConfig): TargetAdapter;
|
|
24
|
+
//# sourceMappingURL=adapter-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-factory.d.ts","sourceRoot":"","sources":["../../src/install/adapter-factory.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EACV,WAAW,EAEX,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,gFAAgF;IAChF,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sDAAsD;IACtD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,cAAc,CAAC,EAAE,CACf,QAAQ,EAAE,OAAO,YAAY,EAAE,eAAe,EAC9C,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,aAAa,KACnB,WAAW,CAAC;CAClB;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAiCxE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Target adapter factory — mirrors ECC's `createInstallTargetAdapter`
|
|
3
|
+
* (`scripts/lib/install-targets/helpers.js`). A small config object yields a
|
|
4
|
+
* frozen `TargetAdapter` with sensible defaults; adapters needing format
|
|
5
|
+
* transformation override `planOperations`. Adding a target = one new file.
|
|
6
|
+
*
|
|
7
|
+
* See `docs/research/phase-3-ecc-install-patterns.md` Pattern 1–2.
|
|
8
|
+
*/
|
|
9
|
+
import os from 'node:os';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
const DEFAULT_INSTALL_STATE_FILENAME = 'harness-nexus-install-state.json';
|
|
12
|
+
/**
|
|
13
|
+
* Produce a frozen target adapter from a config. The default `planOperations`
|
|
14
|
+
* emits a minimal `harness-nexus-profile.json` so the pipeline is exercisable
|
|
15
|
+
* end-to-end before real adapters land (3.4+).
|
|
16
|
+
*/
|
|
17
|
+
export function createTargetAdapter(config) {
|
|
18
|
+
const installStateFilename = config.installStateFilename ?? DEFAULT_INSTALL_STATE_FILENAME;
|
|
19
|
+
const adapter = {
|
|
20
|
+
id: config.id,
|
|
21
|
+
target: config.target,
|
|
22
|
+
kind: config.kind,
|
|
23
|
+
resolveRoot(input = {}) {
|
|
24
|
+
if (input.outDir)
|
|
25
|
+
return input.outDir;
|
|
26
|
+
const base = input.homeDir ?? os.homedir();
|
|
27
|
+
return path.join(base, ...config.rootSegments);
|
|
28
|
+
},
|
|
29
|
+
planOperations(resolved, input) {
|
|
30
|
+
if (config.planOperations)
|
|
31
|
+
return config.planOperations(resolved, input, adapter);
|
|
32
|
+
return defaultPlanOperations(adapter, resolved, input, installStateFilename);
|
|
33
|
+
},
|
|
34
|
+
validate(input = {}) {
|
|
35
|
+
const issues = [];
|
|
36
|
+
if (config.kind === 'home' && !input.homeDir && !os.homedir()) {
|
|
37
|
+
issues.push({
|
|
38
|
+
severity: 'error',
|
|
39
|
+
code: 'missing-home-dir',
|
|
40
|
+
message: 'A home directory is required for home-scope install targets.',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return issues;
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
return Object.freeze(adapter);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The default plan: write a single JSON metadata file describing the resolved
|
|
50
|
+
* profile. This is NOT a real target format — it exists so the plan/apply
|
|
51
|
+
* pipeline can be exercised end-to-end in 3.3 before any real adapter ships.
|
|
52
|
+
* Real adapters override `planOperations` to emit their native layout.
|
|
53
|
+
*/
|
|
54
|
+
function defaultPlanOperations(adapter, resolved, input, installStateFilename) {
|
|
55
|
+
const targetRoot = adapter.resolveRoot(input);
|
|
56
|
+
const installStatePath = path.join(targetRoot, installStateFilename);
|
|
57
|
+
const profileMetaPath = path.join(targetRoot, 'harness-nexus-profile.json');
|
|
58
|
+
const meta = {
|
|
59
|
+
name: resolved.profile.name,
|
|
60
|
+
target: resolved.profile.target,
|
|
61
|
+
version: resolved.profile.version,
|
|
62
|
+
entries: resolved.profile.entries.map((e) => ({ kind: e.kind, resourceId: e.resourceId })),
|
|
63
|
+
artifactCount: resolved.artifacts.length,
|
|
64
|
+
};
|
|
65
|
+
const operations = [
|
|
66
|
+
{
|
|
67
|
+
kind: 'write-file',
|
|
68
|
+
content: `${JSON.stringify(meta, null, 2)}\n`,
|
|
69
|
+
destinationPath: profileMetaPath,
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
return {
|
|
73
|
+
adapter: { id: adapter.id, target: adapter.target, kind: adapter.kind },
|
|
74
|
+
targetRoot,
|
|
75
|
+
installStatePath,
|
|
76
|
+
operations,
|
|
77
|
+
sensitive: false,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=adapter-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-factory.js","sourceRoot":"","sources":["../../src/install/adapter-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TargetAdapter } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replace (or append) one `[section]` in a TOML document, preserving every
|
|
4
|
+
* other line. Re-running with the same section is idempotent — an overwrite,
|
|
5
|
+
* unlike ECC's strictly add-only merge, matching our "plans are idempotent
|
|
6
|
+
* overwrites" upgrade semantics.
|
|
7
|
+
*/
|
|
8
|
+
export declare function mergeTomlSection(existing: string, section: string, body: string): string;
|
|
9
|
+
export declare const codexAdapter: TargetAdapter;
|
|
10
|
+
/** Warnings from the most recent codex plan (read by the CLI for output). */
|
|
11
|
+
export interface CodexPlanWarnings {
|
|
12
|
+
skipped: string[];
|
|
13
|
+
needsHnx: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function getCodexPlanWarnings(): CodexPlanWarnings;
|
|
16
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/install/adapters/codex.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAgD,aAAa,EAAE,MAAM,aAAa,CAAC;AA+B/F;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAWxF;AAgCD,eAAO,MAAM,YAAY,EAAE,aA+EzB,CAAC;AAEH,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD"}
|