@indigoai-us/hq-cli 5.5.0 → 5.5.2
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/dist/bin/hq-auth-refresh.js +0 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +2 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/auth.d.ts +0 -3
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +0 -3
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/cloud.d.ts +12 -2
- package/dist/commands/cloud.d.ts.map +1 -1
- package/dist/commands/cloud.js +112 -80
- package/dist/commands/cloud.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +18 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +28 -9
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +8 -3
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/onboard.d.ts +23 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +142 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/pack-install.d.ts +44 -0
- package/dist/commands/pack-install.d.ts.map +1 -0
- package/dist/commands/pack-install.js +513 -0
- package/dist/commands/pack-install.js.map +1 -0
- package/dist/commands/pkg-install.d.ts.map +1 -1
- package/dist/commands/pkg-install.js +20 -8
- package/dist/commands/pkg-install.js.map +1 -1
- package/dist/commands/pkg-list.js +4 -4
- package/dist/commands/pkg-list.js.map +1 -1
- package/dist/commands/pkg-update.js +3 -3
- package/dist/commands/pkg-update.js.map +1 -1
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +521 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +10 -2
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/team-sync.d.ts.map +1 -1
- package/dist/commands/team-sync.js +6 -6
- package/dist/commands/team-sync.js.map +1 -1
- package/dist/commands/whoami.d.ts +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +23 -7
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/strategies/link.d.ts +2 -2
- package/dist/strategies/link.d.ts.map +1 -1
- package/dist/strategies/link.js.map +1 -1
- package/dist/strategies/merge.d.ts +2 -2
- package/dist/strategies/merge.d.ts.map +1 -1
- package/dist/strategies/merge.js.map +1 -1
- package/dist/types.d.ts +37 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/cognito-session.d.ts +18 -7
- package/dist/utils/cognito-session.d.ts.map +1 -1
- package/dist/utils/cognito-session.js +35 -8
- package/dist/utils/cognito-session.js.map +1 -1
- package/dist/utils/manifest.d.ts +13 -0
- package/dist/utils/manifest.d.ts.map +1 -1
- package/dist/utils/manifest.js +24 -1
- package/dist/utils/manifest.js.map +1 -1
- package/dist/utils/secrets-cache.d.ts +7 -0
- package/dist/utils/secrets-cache.d.ts.map +1 -0
- package/dist/utils/secrets-cache.js +134 -0
- package/dist/utils/secrets-cache.js.map +1 -0
- package/package.json +15 -5
- package/src/commands/add.ts +7 -6
- package/src/commands/auth.ts +0 -3
- package/src/commands/cloud.ts +214 -101
- package/src/commands/list.ts +20 -1
- package/src/commands/login.ts +28 -9
- package/src/commands/logout.ts +8 -3
- package/src/commands/onboard.ts +193 -0
- package/src/commands/pack-install.ts +667 -0
- package/src/commands/pkg-install.ts +34 -16
- package/src/commands/pkg-list.ts +4 -4
- package/src/commands/pkg-update.ts +3 -3
- package/src/commands/secrets.ts +670 -0
- package/src/commands/sync.ts +20 -4
- package/src/commands/team-sync.ts +7 -8
- package/src/commands/whoami.ts +22 -7
- package/src/index.ts +9 -1
- package/src/strategies/link.ts +2 -2
- package/src/strategies/merge.ts +2 -2
- package/src/types.ts +54 -4
- package/src/utils/cognito-session.ts +46 -14
- package/src/utils/manifest.test.ts +148 -0
- package/src/utils/manifest.ts +22 -1
- package/src/utils/secrets-cache.ts +129 -0
- package/tsconfig.json +2 -1
- package/src/utils/auth.ts +0 -193
- package/src/utils/token-store.ts +0 -83
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hq install <source> — content-pack installer (US-003, hq-core v12.0.0+)
|
|
3
|
+
*
|
|
4
|
+
* Source patterns and transports:
|
|
5
|
+
* @scope/name[@version] → npm (default pin = latest, frozen on install)
|
|
6
|
+
* https://... | git@... | *.git → git (SHA-pinned by default; --branch to follow)
|
|
7
|
+
* github:owner/repo[#...] → git (sugar — expands to https://github.com/owner/repo.git)
|
|
8
|
+
* ./path | ../path | /path | file:... → local (path recorded as-is)
|
|
9
|
+
*
|
|
10
|
+
* Git fragment grammar (after '#'):
|
|
11
|
+
* '#<ref>' → whole repo at ref (tag / branch / SHA)
|
|
12
|
+
* '#<subpath>' → subdirectory of repo at default branch
|
|
13
|
+
* '#<subpath>@<ref>' → subdirectory at ref
|
|
14
|
+
* Fragment disambiguation: if the token after '#' contains '/' it's a subpath;
|
|
15
|
+
* otherwise it's a ref. Subpath enables monorepo-hosted packs (e.g.
|
|
16
|
+
* 'github:indigoai-us/hq#packages/hq-pack-gstack@abc1234') without a separate
|
|
17
|
+
* registry or release tarball.
|
|
18
|
+
*
|
|
19
|
+
* Distinct from pkg-install.ts (entitlement-gated registry flow against the
|
|
20
|
+
* proprietary HQ registry — that still runs for plain slugs). Spec:
|
|
21
|
+
* knowledge/public/hq-core/package-yaml-spec.md.
|
|
22
|
+
*
|
|
23
|
+
* Flow:
|
|
24
|
+
* 1. Classify source → transport
|
|
25
|
+
* 2. Fetch payload to tmpdir (npm pack | git clone | rsync)
|
|
26
|
+
* 3. Parse + validate package.yaml (10 checks from spec)
|
|
27
|
+
* 4. Evaluate `conditional` predicate — skip if exits non-zero
|
|
28
|
+
* 5. Confirm hooks if `contributes.hooks` non-empty (unless --allow-hooks)
|
|
29
|
+
* 6. Move into packages/{name}/
|
|
30
|
+
* 7. Append entry to modules.yaml with strategy: package
|
|
31
|
+
* 8. Run scan-packages.sh to wire contributions into host paths
|
|
32
|
+
*/
|
|
33
|
+
import * as fs from 'fs';
|
|
34
|
+
import * as os from 'os';
|
|
35
|
+
import * as path from 'path';
|
|
36
|
+
import * as readline from 'readline';
|
|
37
|
+
import * as yaml from 'js-yaml';
|
|
38
|
+
import { execFileSync, spawnSync } from 'child_process';
|
|
39
|
+
import chalk from 'chalk';
|
|
40
|
+
import semverSatisfies from 'semver/functions/satisfies.js';
|
|
41
|
+
import semverValid from 'semver/functions/valid.js';
|
|
42
|
+
import semverValidRange from 'semver/ranges/valid.js';
|
|
43
|
+
import { findHqRoot, readManifest, writeManifest, } from '../utils/manifest.js';
|
|
44
|
+
function classify(source) {
|
|
45
|
+
if (source.startsWith('@'))
|
|
46
|
+
return 'npm';
|
|
47
|
+
if (source.startsWith('http://') ||
|
|
48
|
+
source.startsWith('https://') ||
|
|
49
|
+
source.startsWith('git@') ||
|
|
50
|
+
source.startsWith('git://') ||
|
|
51
|
+
source.startsWith('github:') ||
|
|
52
|
+
source.endsWith('.git') ||
|
|
53
|
+
/\.git#/.test(source)) {
|
|
54
|
+
return 'git';
|
|
55
|
+
}
|
|
56
|
+
// A '#' fragment is only meaningful to git (ref / subpath). If we see one
|
|
57
|
+
// on a file: or path source, the caller means "clone this local git repo"
|
|
58
|
+
// — route to git. Local transport does not consume fragments.
|
|
59
|
+
if (source.includes('#')) {
|
|
60
|
+
return 'git';
|
|
61
|
+
}
|
|
62
|
+
if (source.startsWith('./') ||
|
|
63
|
+
source.startsWith('../') ||
|
|
64
|
+
source.startsWith('/') ||
|
|
65
|
+
source.startsWith('file:')) {
|
|
66
|
+
return 'local';
|
|
67
|
+
}
|
|
68
|
+
// Fallback: bare slug — caller (dispatcher) routes those to legacy flow.
|
|
69
|
+
throw new Error(`Cannot classify source "${source}" as pack (npm @scope/name, git URL, or path). ` +
|
|
70
|
+
`Bare slugs go through the registry (Cognito) flow.`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Expand 'github:owner/repo' shorthand to a cloneable URL. Passes anything
|
|
74
|
+
* else through unchanged. Separate from classify() so the transport-dispatch
|
|
75
|
+
* stays readable.
|
|
76
|
+
*/
|
|
77
|
+
function expandGithubShorthand(url) {
|
|
78
|
+
if (!url.startsWith('github:'))
|
|
79
|
+
return url;
|
|
80
|
+
const slug = url.slice('github:'.length);
|
|
81
|
+
if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(slug)) {
|
|
82
|
+
throw new Error(`github: shorthand must be 'github:owner/repo' (got 'github:${slug}')`);
|
|
83
|
+
}
|
|
84
|
+
return `https://github.com/${slug}.git`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parse a git source's '#<...>' fragment into { url, subpath, ref }.
|
|
88
|
+
* Disambiguation: fragment containing '/' is a subpath (optionally with
|
|
89
|
+
* '@<ref>' suffix); fragment without '/' is a ref.
|
|
90
|
+
*/
|
|
91
|
+
function parseGitFragment(source) {
|
|
92
|
+
const hashAt = source.indexOf('#');
|
|
93
|
+
if (hashAt < 0)
|
|
94
|
+
return { url: source };
|
|
95
|
+
const url = source.slice(0, hashAt);
|
|
96
|
+
const frag = source.slice(hashAt + 1);
|
|
97
|
+
if (frag.includes('/')) {
|
|
98
|
+
// subpath[@ref]
|
|
99
|
+
const atAt = frag.lastIndexOf('@');
|
|
100
|
+
if (atAt > 0) {
|
|
101
|
+
return { url, subpath: frag.slice(0, atAt), ref: frag.slice(atAt + 1) };
|
|
102
|
+
}
|
|
103
|
+
return { url, subpath: frag };
|
|
104
|
+
}
|
|
105
|
+
return { url, ref: frag || undefined };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* sourceMatchesPackPattern — exported for the dispatcher in pkg-install.ts
|
|
109
|
+
* so it can decide whether to route to the new content-pack handler or fall
|
|
110
|
+
* back to the legacy registry flow.
|
|
111
|
+
*/
|
|
112
|
+
export function sourceMatchesPackPattern(source) {
|
|
113
|
+
try {
|
|
114
|
+
classify(source);
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function fetchNpm(source, tmpDir) {
|
|
122
|
+
// Use `npm pack` to grab the tarball without actually installing anything.
|
|
123
|
+
// Capture output to get the produced filename. Arguments are passed as an
|
|
124
|
+
// argv array — never interpolated into a shell string — so `source` cannot
|
|
125
|
+
// break out even if it contains metacharacters.
|
|
126
|
+
const out = execFileSync('npm', ['pack', '--silent', '--pack-destination', tmpDir, source], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'inherit'] });
|
|
127
|
+
const tarball = out.trim().split('\n').filter(Boolean).pop();
|
|
128
|
+
if (!tarball) {
|
|
129
|
+
throw new Error(`npm pack produced no tarball for "${source}"`);
|
|
130
|
+
}
|
|
131
|
+
const tarballPath = path.join(tmpDir, tarball);
|
|
132
|
+
const extractDir = path.join(tmpDir, 'extracted');
|
|
133
|
+
fs.mkdirSync(extractDir, { recursive: true });
|
|
134
|
+
execFileSync('tar', ['-xzf', tarballPath, '-C', extractDir], {
|
|
135
|
+
stdio: 'inherit',
|
|
136
|
+
});
|
|
137
|
+
// npm tarballs unpack into ./package/
|
|
138
|
+
const payloadDir = path.join(extractDir, 'package');
|
|
139
|
+
if (!fs.existsSync(payloadDir)) {
|
|
140
|
+
throw new Error(`npm tarball layout unexpected — no "package/" in ${tarballPath}`);
|
|
141
|
+
}
|
|
142
|
+
// Freeze version from the resolved tarball filename when caller passed e.g.
|
|
143
|
+
// '@scope/name' (no @version) — fall back to the source string.
|
|
144
|
+
// npm pack writes the filename as scope-name-version.tgz (no leading @).
|
|
145
|
+
const m = /([0-9]+\.[0-9]+\.[0-9]+[^.]*)\.tgz$/.exec(tarball);
|
|
146
|
+
const resolvedSource = m ? `${stripVersion(source)}@${m[1]}` : source;
|
|
147
|
+
return { payloadDir, resolvedSource };
|
|
148
|
+
}
|
|
149
|
+
function stripVersion(src) {
|
|
150
|
+
// '@scope/name@1.0.0' → '@scope/name'
|
|
151
|
+
const at = src.lastIndexOf('@');
|
|
152
|
+
if (at > 0)
|
|
153
|
+
return src.slice(0, at);
|
|
154
|
+
return src;
|
|
155
|
+
}
|
|
156
|
+
function fetchGit(source, tmpDir, followBranch) {
|
|
157
|
+
const parsed = parseGitFragment(source);
|
|
158
|
+
const url = expandGithubShorthand(parsed.url);
|
|
159
|
+
const { subpath, ref } = parsed;
|
|
160
|
+
// Defensive: subpath must not escape the clone root.
|
|
161
|
+
if (subpath) {
|
|
162
|
+
if (subpath.startsWith('/') ||
|
|
163
|
+
subpath.split('/').some((seg) => seg === '..' || seg === '')) {
|
|
164
|
+
throw new Error(`Invalid subpath "${subpath}" — must be a relative path within the repo.`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Defensive: reject refs that would be ambiguous or shell-dangerous.
|
|
168
|
+
// `git` itself would tolerate most of these, but refusing them early avoids
|
|
169
|
+
// having to reason about quoting later.
|
|
170
|
+
if (ref && /[\s;&|`$<>(){}\\]/.test(ref)) {
|
|
171
|
+
throw new Error(`Invalid ref "${ref}" — contains disallowed characters.`);
|
|
172
|
+
}
|
|
173
|
+
const cloneDir = path.join(tmpDir, 'clone');
|
|
174
|
+
// Disambiguate ref=branch-or-tag vs. ref=SHA authoritatively via `git
|
|
175
|
+
// ls-remote`. Hex-shaped branch names (e.g. `deadbeef`) previously got
|
|
176
|
+
// silently downgraded to the "no --branch" path by a heuristic regex;
|
|
177
|
+
// that is now fixed. Arguments are passed as argv; no shell.
|
|
178
|
+
const refIsNamedRef = !!ref && isNamedRef(url, ref);
|
|
179
|
+
const cloneArgs = ['clone', '--depth', '1'];
|
|
180
|
+
if (refIsNamedRef)
|
|
181
|
+
cloneArgs.push('--branch', ref);
|
|
182
|
+
cloneArgs.push(url, cloneDir);
|
|
183
|
+
execFileSync('git', cloneArgs, { stdio: 'inherit' });
|
|
184
|
+
if (ref && !refIsNamedRef) {
|
|
185
|
+
// SHA (or something ls-remote didn't recognize as a ref). Try a direct
|
|
186
|
+
// checkout first — works if the SHA happens to be HEAD of the default
|
|
187
|
+
// branch — otherwise unshallow and retry.
|
|
188
|
+
try {
|
|
189
|
+
execFileSync('git', ['-C', cloneDir, 'checkout', ref], {
|
|
190
|
+
stdio: 'inherit',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
execFileSync('git', ['-C', cloneDir, 'fetch', '--unshallow', 'origin'], {
|
|
195
|
+
stdio: 'inherit',
|
|
196
|
+
});
|
|
197
|
+
execFileSync('git', ['-C', cloneDir, 'checkout', ref], {
|
|
198
|
+
stdio: 'inherit',
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const resolvedSha = execFileSync('git', ['-C', cloneDir, 'rev-parse', 'HEAD'], { encoding: 'utf-8' }).trim();
|
|
203
|
+
// If a subpath is specified, the payload is only that subdirectory.
|
|
204
|
+
let payloadDir = cloneDir;
|
|
205
|
+
if (subpath) {
|
|
206
|
+
const subAbs = path.join(cloneDir, subpath);
|
|
207
|
+
if (!fs.existsSync(subAbs) || !fs.statSync(subAbs).isDirectory()) {
|
|
208
|
+
throw new Error(`subpath "${subpath}" not found in ${url}@${resolvedSha.slice(0, 7)}`);
|
|
209
|
+
}
|
|
210
|
+
payloadDir = path.join(tmpDir, 'payload');
|
|
211
|
+
fs.mkdirSync(payloadDir, { recursive: true });
|
|
212
|
+
rsyncDir(subAbs, payloadDir);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Drop .git — the pack should be file content, not a nested repo
|
|
216
|
+
fs.rmSync(path.join(cloneDir, '.git'), { recursive: true, force: true });
|
|
217
|
+
}
|
|
218
|
+
// Recorded source shape:
|
|
219
|
+
// with subpath: url#subpath@<sha|ref>
|
|
220
|
+
// without subpath: url#<sha|ref>
|
|
221
|
+
// --branch opt-in follows the ref by name; default SHA-pins.
|
|
222
|
+
const recordedRef = followBranch && ref ? ref : resolvedSha;
|
|
223
|
+
const resolvedSource = subpath
|
|
224
|
+
? `${parsed.url}#${subpath}@${recordedRef}`
|
|
225
|
+
: `${parsed.url}#${recordedRef}`;
|
|
226
|
+
return { payloadDir, resolvedSource, resolvedSha };
|
|
227
|
+
}
|
|
228
|
+
function fetchLocal(source, tmpDir) {
|
|
229
|
+
const clean = source.startsWith('file:') ? source.slice('file:'.length) : source;
|
|
230
|
+
const abs = path.resolve(process.cwd(), clean);
|
|
231
|
+
if (!fs.existsSync(abs) || !fs.statSync(abs).isDirectory()) {
|
|
232
|
+
throw new Error(`Local path not a directory: ${abs}`);
|
|
233
|
+
}
|
|
234
|
+
const payloadDir = path.join(tmpDir, 'local');
|
|
235
|
+
fs.mkdirSync(payloadDir, { recursive: true });
|
|
236
|
+
rsyncDir(abs, payloadDir);
|
|
237
|
+
return { payloadDir, resolvedSource: clean };
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Invoke rsync with an argv array (no shell). Trailing slashes on the source
|
|
241
|
+
* path are preserved by passing the exact strings through execFileSync.
|
|
242
|
+
*/
|
|
243
|
+
function rsyncDir(src, dest) {
|
|
244
|
+
const srcSlashed = src.endsWith('/') ? src : `${src}/`;
|
|
245
|
+
const destSlashed = dest.endsWith('/') ? dest : `${dest}/`;
|
|
246
|
+
execFileSync('rsync', [
|
|
247
|
+
'-a',
|
|
248
|
+
'--exclude=.git',
|
|
249
|
+
'--exclude=node_modules',
|
|
250
|
+
'--exclude=.DS_Store',
|
|
251
|
+
srcSlashed,
|
|
252
|
+
destSlashed,
|
|
253
|
+
], { stdio: 'inherit' });
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Ask git whether <ref> resolves as a named branch or tag on <url>. Returns
|
|
257
|
+
* true only when ls-remote prints a matching refs/heads/<ref> or
|
|
258
|
+
* refs/tags/<ref>. Anything else (including hex-shaped branch names that
|
|
259
|
+
* happen to be missing, network failures, or explicit SHAs) falls through to
|
|
260
|
+
* the SHA-checkout path. Uses argv — no shell.
|
|
261
|
+
*/
|
|
262
|
+
function isNamedRef(url, ref) {
|
|
263
|
+
try {
|
|
264
|
+
const out = execFileSync('git', ['ls-remote', '--heads', '--tags', url, ref], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
265
|
+
return out.trim().length > 0;
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
// Manifest validation (spec §Validation, 10 checks)
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
function validateManifest(payloadDir, hqVersion) {
|
|
275
|
+
// 1. parse
|
|
276
|
+
const manifestPath = path.join(payloadDir, 'package.yaml');
|
|
277
|
+
if (!fs.existsSync(manifestPath)) {
|
|
278
|
+
throw new Error('package.yaml missing from pack payload');
|
|
279
|
+
}
|
|
280
|
+
let parsed;
|
|
281
|
+
try {
|
|
282
|
+
parsed = yaml.load(fs.readFileSync(manifestPath, 'utf-8'));
|
|
283
|
+
}
|
|
284
|
+
catch (e) {
|
|
285
|
+
throw new Error(`package.yaml invalid YAML: ${e.message}`);
|
|
286
|
+
}
|
|
287
|
+
const m = parsed;
|
|
288
|
+
if (!m || typeof m !== 'object') {
|
|
289
|
+
throw new Error('package.yaml must be a YAML mapping');
|
|
290
|
+
}
|
|
291
|
+
// 2. name
|
|
292
|
+
if (!m.name || !/^hq-pack-[a-z0-9][a-z0-9-]*$/.test(m.name)) {
|
|
293
|
+
throw new Error(`Invalid pack name "${m.name}" — must match ^hq-pack-[a-z0-9][a-z0-9-]*$`);
|
|
294
|
+
}
|
|
295
|
+
// 3. version
|
|
296
|
+
if (!m.version || !semverValid(m.version)) {
|
|
297
|
+
throw new Error(`Invalid version "${m.version}" — must be valid semver`);
|
|
298
|
+
}
|
|
299
|
+
// 4. publisher
|
|
300
|
+
if (!m.publisher || !/^@[a-z0-9][a-z0-9-]*$/i.test(m.publisher)) {
|
|
301
|
+
throw new Error(`Invalid publisher "${m.publisher}" — must be a valid npm scope starting with @`);
|
|
302
|
+
}
|
|
303
|
+
// 5. access
|
|
304
|
+
if (m.access !== 'public' && m.access !== 'private') {
|
|
305
|
+
throw new Error(`access must be "public" or "private" (got "${m.access}")`);
|
|
306
|
+
}
|
|
307
|
+
// 6. requires.hqCore
|
|
308
|
+
const range = m.requires?.hqCore;
|
|
309
|
+
if (!range || !semverValidRange(range)) {
|
|
310
|
+
throw new Error(`requires.hqCore must be a valid semver range (got "${range}")`);
|
|
311
|
+
}
|
|
312
|
+
if (hqVersion && !semverSatisfies(hqVersion, range)) {
|
|
313
|
+
throw new Error(`Host hqCore ${hqVersion} does not satisfy pack requirement ${range}`);
|
|
314
|
+
}
|
|
315
|
+
// 7. contributes has at least one non-empty subfield
|
|
316
|
+
const contributes = (m.contributes ?? {});
|
|
317
|
+
const nonEmpty = Object.values(contributes).some((v) => Array.isArray(v) && v.length > 0);
|
|
318
|
+
if (!nonEmpty) {
|
|
319
|
+
throw new Error('contributes must have at least one non-empty subfield');
|
|
320
|
+
}
|
|
321
|
+
// 10. payload files exist (hooks check happens separately in step 8)
|
|
322
|
+
const subpaths = {
|
|
323
|
+
workers: (i) => path.join('workers', i),
|
|
324
|
+
knowledge: (i) => path.join('knowledge', i),
|
|
325
|
+
skills: (i) => path.join('skills', i),
|
|
326
|
+
commands: (i) => path.join('commands', `${i}.md`),
|
|
327
|
+
hooks: (i) => path.join('hooks', `${i}.sh`),
|
|
328
|
+
policies: (i) => path.join('policies', `${i}.md`),
|
|
329
|
+
scripts: (i) => path.join('scripts', i),
|
|
330
|
+
};
|
|
331
|
+
for (const [key, items] of Object.entries(contributes)) {
|
|
332
|
+
if (!Array.isArray(items))
|
|
333
|
+
continue;
|
|
334
|
+
for (const item of items) {
|
|
335
|
+
const rel = subpaths[key](item);
|
|
336
|
+
const abs = path.join(payloadDir, rel);
|
|
337
|
+
if (!fs.existsSync(abs)) {
|
|
338
|
+
throw new Error(`contributes.${key} declares "${item}" but payload file missing: ${rel}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return m;
|
|
343
|
+
}
|
|
344
|
+
function readHqVersion(hqRoot) {
|
|
345
|
+
const p = path.join(hqRoot, 'core.yaml');
|
|
346
|
+
if (!fs.existsSync(p))
|
|
347
|
+
return null;
|
|
348
|
+
try {
|
|
349
|
+
const c = yaml.load(fs.readFileSync(p, 'utf-8'));
|
|
350
|
+
return c?.hqVersion ?? null;
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
// Hooks confirmation
|
|
358
|
+
// ---------------------------------------------------------------------------
|
|
359
|
+
async function confirmHooks(pkg, allowHooks) {
|
|
360
|
+
const hooks = pkg.contributes.hooks ?? [];
|
|
361
|
+
if (hooks.length === 0)
|
|
362
|
+
return true;
|
|
363
|
+
if (allowHooks) {
|
|
364
|
+
console.log(chalk.yellow(`--allow-hooks set; installing ${hooks.length} hook(s) without prompting.`));
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
console.log('');
|
|
368
|
+
console.log(chalk.yellow(`Pack ${pkg.publisher}/${pkg.name} declares ${hooks.length} hook(s):`));
|
|
369
|
+
for (const h of hooks)
|
|
370
|
+
console.log(chalk.yellow(` - ${h}.sh`));
|
|
371
|
+
console.log(chalk.yellow('These run automatically on tool events with your shell permissions.'));
|
|
372
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
373
|
+
const answer = await new Promise((resolve) => {
|
|
374
|
+
rl.question('Install anyway? [y/N] ', (a) => {
|
|
375
|
+
rl.close();
|
|
376
|
+
resolve(a);
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
return /^(y|yes)$/i.test(answer.trim());
|
|
380
|
+
}
|
|
381
|
+
// ---------------------------------------------------------------------------
|
|
382
|
+
// Conditional predicate
|
|
383
|
+
//
|
|
384
|
+
// `package.yaml:conditional` is arbitrary bash sourced from a remote pack.
|
|
385
|
+
// Evaluating it is effectively code execution — same trust surface as the
|
|
386
|
+
// post-install hooks. We therefore gate it behind the same confirmation flow:
|
|
387
|
+
// a pack with a `conditional` must be approved (interactively) or run under
|
|
388
|
+
// `--allow-hooks` (ambient trust, e.g. `create-hq --full`).
|
|
389
|
+
// ---------------------------------------------------------------------------
|
|
390
|
+
async function confirmConditional(pkg, allowHooks) {
|
|
391
|
+
if (!pkg.conditional)
|
|
392
|
+
return true;
|
|
393
|
+
if (allowHooks)
|
|
394
|
+
return true;
|
|
395
|
+
console.log('');
|
|
396
|
+
console.log(chalk.yellow(`Pack ${pkg.publisher}/${pkg.name} declares a conditional predicate:`));
|
|
397
|
+
console.log(chalk.yellow(` $ ${pkg.conditional}`));
|
|
398
|
+
console.log(chalk.yellow('This runs as bash with your shell permissions before install proceeds.'));
|
|
399
|
+
const rl = readline.createInterface({
|
|
400
|
+
input: process.stdin,
|
|
401
|
+
output: process.stdout,
|
|
402
|
+
});
|
|
403
|
+
const answer = await new Promise((resolve) => {
|
|
404
|
+
rl.question('Evaluate predicate? [y/N] ', (a) => {
|
|
405
|
+
rl.close();
|
|
406
|
+
resolve(a);
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
return /^(y|yes)$/i.test(answer.trim());
|
|
410
|
+
}
|
|
411
|
+
function evalConditional(expr) {
|
|
412
|
+
const r = spawnSync('bash', ['-c', expr], { stdio: 'ignore' });
|
|
413
|
+
return r.status === 0;
|
|
414
|
+
}
|
|
415
|
+
// ---------------------------------------------------------------------------
|
|
416
|
+
// Move into packages/ + update modules.yaml + scan
|
|
417
|
+
// ---------------------------------------------------------------------------
|
|
418
|
+
function installToPackages(payloadDir, pkg, hqRoot) {
|
|
419
|
+
const packagesDir = path.join(hqRoot, 'packages');
|
|
420
|
+
fs.mkdirSync(packagesDir, { recursive: true });
|
|
421
|
+
const destDir = path.join(packagesDir, pkg.name);
|
|
422
|
+
if (fs.existsSync(destDir)) {
|
|
423
|
+
fs.rmSync(destDir, { recursive: true, force: true });
|
|
424
|
+
}
|
|
425
|
+
// rsync preserves modes/symlinks; tar also works. argv form — no shell.
|
|
426
|
+
const srcSlashed = payloadDir.endsWith('/') ? payloadDir : `${payloadDir}/`;
|
|
427
|
+
const destSlashed = destDir.endsWith('/') ? destDir : `${destDir}/`;
|
|
428
|
+
execFileSync('rsync', ['-a', srcSlashed, destSlashed], { stdio: 'inherit' });
|
|
429
|
+
return destDir;
|
|
430
|
+
}
|
|
431
|
+
function updateModulesYaml(hqRoot, pkg, fetched) {
|
|
432
|
+
const manifest = readManifest(hqRoot) ?? { version: '1', modules: [] };
|
|
433
|
+
// Drop any existing entry for this pack (idempotent re-install)
|
|
434
|
+
manifest.modules = manifest.modules.filter((m) => m.name !== pkg.name);
|
|
435
|
+
const entry = {
|
|
436
|
+
name: pkg.name,
|
|
437
|
+
strategy: 'package',
|
|
438
|
+
source: fetched.resolvedSource,
|
|
439
|
+
version: pkg.version,
|
|
440
|
+
installed_at: path.posix.join('packages', pkg.name),
|
|
441
|
+
installed_at_iso: new Date().toISOString(),
|
|
442
|
+
access: pkg.access === 'public' ? 'public' : undefined,
|
|
443
|
+
};
|
|
444
|
+
if (fetched.resolvedSha)
|
|
445
|
+
entry.resolved_sha = fetched.resolvedSha;
|
|
446
|
+
manifest.modules.push(entry);
|
|
447
|
+
writeManifest(hqRoot, manifest);
|
|
448
|
+
}
|
|
449
|
+
function runScanPackages(hqRoot) {
|
|
450
|
+
const script = path.join(hqRoot, 'scripts', 'scan-packages.sh');
|
|
451
|
+
if (!fs.existsSync(script)) {
|
|
452
|
+
console.log(chalk.dim(` (scripts/scan-packages.sh not present — skipping auto-wire; ` +
|
|
453
|
+
`will run on next session start)`));
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
const r = spawnSync('bash', [script], {
|
|
457
|
+
cwd: hqRoot,
|
|
458
|
+
env: { ...process.env, HQ_ROOT: hqRoot },
|
|
459
|
+
stdio: 'inherit',
|
|
460
|
+
});
|
|
461
|
+
if (r.status !== 0) {
|
|
462
|
+
console.log(chalk.yellow(' scan-packages.sh exited non-zero; see output above.'));
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
export async function installPack(source, opts = {}) {
|
|
466
|
+
const transport = classify(source);
|
|
467
|
+
const hqRoot = findHqRoot();
|
|
468
|
+
const hqVersion = readHqVersion(hqRoot);
|
|
469
|
+
console.log(chalk.dim(`→ transport: ${transport}; source: ${source}`));
|
|
470
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hq-pack-'));
|
|
471
|
+
try {
|
|
472
|
+
let fetched;
|
|
473
|
+
switch (transport) {
|
|
474
|
+
case 'npm':
|
|
475
|
+
fetched = fetchNpm(source, tmpDir);
|
|
476
|
+
break;
|
|
477
|
+
case 'git':
|
|
478
|
+
fetched = fetchGit(source, tmpDir, opts.followBranch ?? false);
|
|
479
|
+
break;
|
|
480
|
+
case 'local':
|
|
481
|
+
fetched = fetchLocal(source, tmpDir);
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
const pkg = validateManifest(fetched.payloadDir, hqVersion);
|
|
485
|
+
if (pkg.conditional) {
|
|
486
|
+
const allowed = await confirmConditional(pkg, opts.allowHooks ?? false);
|
|
487
|
+
if (!allowed) {
|
|
488
|
+
console.log(chalk.red('Install aborted (conditional predicate not approved).'));
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
const ok = evalConditional(pkg.conditional);
|
|
492
|
+
if (!ok) {
|
|
493
|
+
console.log(chalk.yellow(`Skipping ${pkg.name}: conditional "${pkg.conditional}" returned non-zero.`));
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
const confirmed = await confirmHooks(pkg, opts.allowHooks ?? false);
|
|
498
|
+
if (!confirmed) {
|
|
499
|
+
console.log(chalk.red('Install aborted (hooks denied).'));
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
const destDir = installToPackages(fetched.payloadDir, pkg, hqRoot);
|
|
503
|
+
updateModulesYaml(hqRoot, pkg, fetched);
|
|
504
|
+
runScanPackages(hqRoot);
|
|
505
|
+
console.log(chalk.green(`\n✓ Installed ${pkg.name}@${pkg.version} → ${path.relative(hqRoot, destDir)}/`));
|
|
506
|
+
console.log(chalk.dim(` Wired ${Object.values(pkg.contributes).flat().filter(Boolean).length} ` +
|
|
507
|
+
`contribution(s) into host-side paths.`));
|
|
508
|
+
}
|
|
509
|
+
finally {
|
|
510
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=pack-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-install.js","sourceRoot":"","sources":["../../src/commands/pack-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkg-install.d.ts","sourceRoot":"","sources":["../../src/commands/pkg-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pkg-install.d.ts","sourceRoot":"","sources":["../../src/commands/pkg-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAiCnE"}
|
|
@@ -18,19 +18,31 @@ import * as path from 'path';
|
|
|
18
18
|
import * as yaml from 'js-yaml';
|
|
19
19
|
import { execSync } from 'child_process';
|
|
20
20
|
import chalk from 'chalk';
|
|
21
|
-
import {
|
|
21
|
+
import { ensureCognitoToken } from '../utils/cognito-session.js';
|
|
22
22
|
import { findHqRoot } from '../utils/hq-root.js';
|
|
23
23
|
import { getRegistryUrl, RegistryClient, } from '../utils/registry-client.js';
|
|
24
24
|
import { verifySha256, verifyRsaSignature } from '../utils/integrity.js';
|
|
25
25
|
import { addToRegistry } from '../utils/registry.js';
|
|
26
|
+
import { installPack, sourceMatchesPackPattern } from './pack-install.js';
|
|
26
27
|
export function registerPackageInstallCommand(parent) {
|
|
27
28
|
parent
|
|
28
|
-
.command('install <
|
|
29
|
-
.description('Install a package
|
|
30
|
-
|
|
31
|
-
.
|
|
29
|
+
.command('install <source>')
|
|
30
|
+
.description('Install a package. Sources: bare slug (registry, Cognito-gated), ' +
|
|
31
|
+
'@scope/name[@ver] (npm pack), git URL[#ref], or local path.')
|
|
32
|
+
.option('--company <co>', 'Scope the package to a specific company (registry flow only)')
|
|
33
|
+
.option('--allow-hooks', 'Skip the hooks confirmation prompt (content-pack flow)')
|
|
34
|
+
.option('--branch', 'Follow a ref instead of SHA-pinning (git content-pack flow)')
|
|
35
|
+
.action(async (source, opts) => {
|
|
32
36
|
try {
|
|
33
|
-
|
|
37
|
+
if (sourceMatchesPackPattern(source)) {
|
|
38
|
+
await installPack(source, {
|
|
39
|
+
allowHooks: opts.allowHooks,
|
|
40
|
+
followBranch: opts.branch,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
await installPackage(source, opts.company);
|
|
45
|
+
}
|
|
34
46
|
}
|
|
35
47
|
catch (error) {
|
|
36
48
|
console.error(chalk.red('Install failed:'), error instanceof Error ? error.message : 'Unknown error');
|
|
@@ -40,9 +52,9 @@ export function registerPackageInstallCommand(parent) {
|
|
|
40
52
|
}
|
|
41
53
|
async function installPackage(slug, company) {
|
|
42
54
|
// 1. Auth
|
|
43
|
-
const
|
|
55
|
+
const accessToken = await ensureCognitoToken();
|
|
44
56
|
const registryUrl = getRegistryUrl();
|
|
45
|
-
const client = new RegistryClient(registryUrl,
|
|
57
|
+
const client = new RegistryClient(registryUrl, accessToken);
|
|
46
58
|
// 2. Check entitlement
|
|
47
59
|
console.log(chalk.dim(`Checking entitlement for ${slug}...`));
|
|
48
60
|
const entitlement = await client.checkEntitlement(slug);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkg-install.js","sourceRoot":"","sources":["../../src/commands/pkg-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pkg-install.js","sourceRoot":"","sources":["../../src/commands/pkg-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import chalk from 'chalk';
|
|
7
7
|
import { findHqRoot } from '../utils/hq-root.js';
|
|
8
8
|
import { readRegistry } from '../utils/registry.js';
|
|
9
|
-
import {
|
|
9
|
+
import { loadCachedTokens, isExpiring } from '@indigoai-us/hq-cloud';
|
|
10
10
|
import { getRegistryUrl, RegistryClient, } from '../utils/registry-client.js';
|
|
11
11
|
export function registerPackageListCommand(parent) {
|
|
12
12
|
parent
|
|
@@ -43,10 +43,10 @@ async function listPackages() {
|
|
|
43
43
|
let entitlements = [];
|
|
44
44
|
let offline = false;
|
|
45
45
|
try {
|
|
46
|
-
const
|
|
47
|
-
if (
|
|
46
|
+
const cached = loadCachedTokens();
|
|
47
|
+
if (cached && !isExpiring(cached, 120)) {
|
|
48
48
|
const registryUrl = getRegistryUrl();
|
|
49
|
-
const client = new RegistryClient(registryUrl,
|
|
49
|
+
const client = new RegistryClient(registryUrl, cached.accessToken);
|
|
50
50
|
const result = await client.getMyEntitlements();
|
|
51
51
|
entitlements = result.entitlements;
|
|
52
52
|
}
|