create-hq 7.0.0 → 10.1.0

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.
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Package discovery, download, and installation for create-hq (US-008)
3
+ *
4
+ * Handles:
5
+ * - Public package discovery (GET /api/packages)
6
+ * - Entitlement check (GET /api/packages/my-entitlements)
7
+ * - Package download with SHA256 + RSA signature verification
8
+ * - Extraction to packages/installed/<slug>/
9
+ * - Registry.yaml update
10
+ * - Auto-merge for fresh HQ (register workers, commands, knowledge)
11
+ */
12
+ import * as crypto from "crypto";
13
+ import * as fs from "fs";
14
+ import * as path from "path";
15
+ import * as os from "os";
16
+ import { execSync } from "child_process";
17
+ import chalk from "chalk";
18
+ // ─── Registry URL ────────────────────────────────────────────────────────────
19
+ const DEFAULT_REGISTRY_URL = "https://registry.hq.sh/api";
20
+ /**
21
+ * Read the registry URL from packages/sources.yaml in the target HQ dir.
22
+ * Falls back to the default registry URL if sources.yaml is not present
23
+ * (which is expected during initial scaffold before the template is fully
24
+ * written).
25
+ */
26
+ export function getRegistryUrl(hqRoot) {
27
+ const sourcesPath = path.join(hqRoot, "packages", "sources.yaml");
28
+ if (fs.existsSync(sourcesPath)) {
29
+ const content = fs.readFileSync(sourcesPath, "utf-8");
30
+ // Simple YAML extraction — avoid adding js-yaml as dep to create-hq
31
+ const urlMatch = content.match(/url:\s*["']?([^\s"']+)/);
32
+ if (urlMatch?.[1]) {
33
+ return urlMatch[1];
34
+ }
35
+ }
36
+ return DEFAULT_REGISTRY_URL;
37
+ }
38
+ // ─── API client (lightweight, no class needed) ───────────────────────────────
39
+ async function apiGet(registryUrl, urlPath, authToken) {
40
+ const headers = { Accept: "application/json" };
41
+ if (authToken) {
42
+ headers["Authorization"] = `Bearer ${authToken}`;
43
+ }
44
+ const res = await fetch(`${registryUrl}${urlPath}`, {
45
+ method: "GET",
46
+ headers,
47
+ signal: AbortSignal.timeout(15_000),
48
+ });
49
+ if (!res.ok) {
50
+ const text = await res.text().catch(() => "");
51
+ throw new Error(`Registry API GET ${urlPath} failed (${res.status}): ${text}`);
52
+ }
53
+ return (await res.json());
54
+ }
55
+ /**
56
+ * Fetch the public package catalog.
57
+ * Returns an empty array on failure (network down, etc.).
58
+ */
59
+ export async function fetchPublicPackages(registryUrl) {
60
+ try {
61
+ const data = await apiGet(registryUrl, "/packages");
62
+ return data.packages ?? [];
63
+ }
64
+ catch {
65
+ return [];
66
+ }
67
+ }
68
+ /**
69
+ * Fetch packages the authenticated user is entitled to.
70
+ * Returns an empty array on failure.
71
+ */
72
+ export async function fetchEntitlements(registryUrl, authToken) {
73
+ try {
74
+ const data = await apiGet(registryUrl, "/packages/my-entitlements", authToken);
75
+ return data.entitlements ?? [];
76
+ }
77
+ catch {
78
+ return [];
79
+ }
80
+ }
81
+ /**
82
+ * Build the combined package list for the TUI.
83
+ * Entitled packages are pre-checked; non-entitled are shown with lock icon.
84
+ */
85
+ export function buildPackageChoices(allPackages, entitlements) {
86
+ const entitledSlugs = new Set(entitlements.map((e) => e.slug));
87
+ return allPackages.map((pkg) => ({
88
+ pkg,
89
+ entitled: entitledSlugs.has(pkg.slug),
90
+ selected: entitledSlugs.has(pkg.slug), // pre-check entitled packages
91
+ }));
92
+ }
93
+ // ─── Integrity verification ──────────────────────────────────────────────────
94
+ async function verifySha256(filePath, expectedHash) {
95
+ return new Promise((resolve, reject) => {
96
+ const hash = crypto.createHash("sha256");
97
+ const stream = fs.createReadStream(filePath);
98
+ stream.on("data", (chunk) => hash.update(chunk));
99
+ stream.on("end", () => {
100
+ const computed = hash.digest("hex");
101
+ resolve(computed === expectedHash.toLowerCase());
102
+ });
103
+ stream.on("error", reject);
104
+ });
105
+ }
106
+ function verifyRsaSignature(sha256Hash, signature, hqRoot) {
107
+ const keyPath = path.resolve(hqRoot, "packages", ".keys", "registry-public.pem");
108
+ if (!fs.existsSync(keyPath)) {
109
+ return false;
110
+ }
111
+ const publicKey = fs.readFileSync(keyPath, "utf-8");
112
+ const verifier = crypto.createVerify("SHA256");
113
+ verifier.update(sha256Hash);
114
+ verifier.end();
115
+ return verifier.verify(publicKey, Buffer.from(signature, "base64"));
116
+ }
117
+ // ─── Download + extract ──────────────────────────────────────────────────────
118
+ async function getDownloadInfo(registryUrl, slug, authToken) {
119
+ return apiGet(registryUrl, `/packages/${encodeURIComponent(slug)}/download`, authToken);
120
+ }
121
+ /**
122
+ * Download, verify, and extract a single package into the target HQ.
123
+ * Returns true on success, false on failure (non-throwing for batch installs).
124
+ */
125
+ export async function installPackage(registryUrl, slug, hqRoot, authToken) {
126
+ const tmpFile = path.resolve(os.tmpdir(), `hq-pkg-${slug}-${Date.now()}.tar.gz`);
127
+ try {
128
+ // 1. Get download URL
129
+ const download = await getDownloadInfo(registryUrl, slug, authToken);
130
+ // 2. Download
131
+ const response = await fetch(download.url, {
132
+ signal: AbortSignal.timeout(120_000),
133
+ });
134
+ if (!response.ok) {
135
+ throw new Error(`Download failed (${response.status})`);
136
+ }
137
+ const buffer = Buffer.from(await response.arrayBuffer());
138
+ fs.writeFileSync(tmpFile, buffer);
139
+ // 3. Verify SHA256
140
+ const hashValid = await verifySha256(tmpFile, download.sha256);
141
+ if (!hashValid) {
142
+ throw new Error("SHA256 hash mismatch — file may be corrupted or tampered with");
143
+ }
144
+ // 4. Verify RSA signature (warn-only, non-blocking)
145
+ if (download.signature) {
146
+ const sigValid = verifyRsaSignature(download.sha256, download.signature, hqRoot);
147
+ if (!sigValid) {
148
+ // Non-fatal — proceed with SHA256-only verification
149
+ }
150
+ }
151
+ // 5. Extract to packages/installed/<slug>/
152
+ const installDir = path.resolve(hqRoot, "packages", "installed", slug);
153
+ if (fs.existsSync(installDir)) {
154
+ fs.rmSync(installDir, { recursive: true, force: true });
155
+ }
156
+ fs.mkdirSync(installDir, { recursive: true });
157
+ execSync(`tar -xzf "${tmpFile}" -C "${installDir}"`, { stdio: "pipe" });
158
+ // 6. Validate package.yaml slug
159
+ const packageYamlPath = path.resolve(installDir, "package.yaml");
160
+ if (fs.existsSync(packageYamlPath)) {
161
+ const pkgContent = fs.readFileSync(packageYamlPath, "utf-8");
162
+ const slugMatch = pkgContent.match(/^slug:\s*(.+)$/m);
163
+ if (slugMatch?.[1]?.trim() && slugMatch[1].trim() !== slug) {
164
+ fs.rmSync(installDir, { recursive: true, force: true });
165
+ throw new Error(`Package slug mismatch: expected "${slug}", got "${slugMatch[1].trim()}"`);
166
+ }
167
+ }
168
+ // 7. Update registry.yaml
169
+ updateRegistry(hqRoot, slug, registryUrl);
170
+ // 8. Auto-merge into fresh HQ
171
+ autoMergePackage(installDir, hqRoot);
172
+ return true;
173
+ }
174
+ catch {
175
+ return false;
176
+ }
177
+ finally {
178
+ if (fs.existsSync(tmpFile)) {
179
+ fs.unlinkSync(tmpFile);
180
+ }
181
+ }
182
+ }
183
+ // ─── Registry.yaml update ────────────────────────────────────────────────────
184
+ function updateRegistry(hqRoot, slug, source) {
185
+ const registryPath = path.resolve(hqRoot, "packages", "registry.yaml");
186
+ const packagesDir = path.dirname(registryPath);
187
+ if (!fs.existsSync(packagesDir)) {
188
+ fs.mkdirSync(packagesDir, { recursive: true });
189
+ }
190
+ const now = new Date().toISOString();
191
+ // Read existing registry or create empty one
192
+ let entries = [];
193
+ if (fs.existsSync(registryPath)) {
194
+ const content = fs.readFileSync(registryPath, "utf-8");
195
+ // Simple YAML array parsing — each entry starts with "- slug:"
196
+ const existing = content.match(/^packages:/m) ? content : "";
197
+ if (existing) {
198
+ // Parse existing entries (basic approach without js-yaml dep)
199
+ try {
200
+ const lines = content.split("\n");
201
+ let current = null;
202
+ for (const line of lines) {
203
+ if (line.match(/^\s*-\s+\w+:/)) {
204
+ if (current)
205
+ entries.push(current);
206
+ current = {};
207
+ const kv = line.replace(/^\s*-\s+/, "").split(/:\s*/);
208
+ if (kv.length >= 2)
209
+ current[kv[0]] = kv.slice(1).join(":");
210
+ }
211
+ else if (line.match(/^\s+\w+:/) && current) {
212
+ const kv = line.trim().split(/:\s*/);
213
+ if (kv.length >= 2)
214
+ current[kv[0]] = kv.slice(1).join(":");
215
+ }
216
+ }
217
+ if (current)
218
+ entries.push(current);
219
+ }
220
+ catch {
221
+ entries = [];
222
+ }
223
+ }
224
+ }
225
+ // Remove existing entry for this slug
226
+ entries = entries.filter((e) => e.slug !== slug);
227
+ // Add new entry
228
+ entries.push({
229
+ slug,
230
+ name: slug,
231
+ version: "latest",
232
+ source,
233
+ installed_at: now,
234
+ updated_at: now,
235
+ });
236
+ // Write back as YAML
237
+ const yamlLines = ["packages:"];
238
+ for (const entry of entries) {
239
+ let first = true;
240
+ for (const [key, value] of Object.entries(entry)) {
241
+ if (first) {
242
+ yamlLines.push(` - ${key}: ${value}`);
243
+ first = false;
244
+ }
245
+ else {
246
+ yamlLines.push(` ${key}: ${value}`);
247
+ }
248
+ }
249
+ }
250
+ fs.writeFileSync(registryPath, yamlLines.join("\n") + "\n", "utf-8");
251
+ }
252
+ // ─── Auto-merge for fresh HQ ────────────────────────────────────────────────
253
+ /**
254
+ * Merge package contents into a fresh HQ directory.
255
+ *
256
+ * Since this runs during initial scaffold (fresh HQ), there are no conflicts.
257
+ * Simply copies workers, commands, knowledge, and other assets into their
258
+ * standard locations.
259
+ */
260
+ function autoMergePackage(installDir, hqRoot) {
261
+ // Workers: copy to workers/public/<worker-name>/
262
+ const workersDir = path.join(installDir, "workers");
263
+ if (fs.existsSync(workersDir)) {
264
+ const targetWorkersDir = path.join(hqRoot, "workers", "public");
265
+ copyDirContents(workersDir, targetWorkersDir);
266
+ }
267
+ // Commands: copy to .claude/commands/
268
+ const commandsDir = path.join(installDir, "commands");
269
+ if (fs.existsSync(commandsDir)) {
270
+ const targetCommandsDir = path.join(hqRoot, ".claude", "commands");
271
+ copyDirContents(commandsDir, targetCommandsDir);
272
+ }
273
+ // Knowledge: copy to knowledge/public/
274
+ const knowledgeDir = path.join(installDir, "knowledge");
275
+ if (fs.existsSync(knowledgeDir)) {
276
+ const targetKnowledgeDir = path.join(hqRoot, "knowledge", "public");
277
+ copyDirContents(knowledgeDir, targetKnowledgeDir);
278
+ }
279
+ // Skills: copy to .claude/skills/
280
+ const skillsDir = path.join(installDir, "skills");
281
+ if (fs.existsSync(skillsDir)) {
282
+ const targetSkillsDir = path.join(hqRoot, ".claude", "skills");
283
+ copyDirContents(skillsDir, targetSkillsDir);
284
+ }
285
+ // Policies: copy to .claude/policies/
286
+ const policiesDir = path.join(installDir, "policies");
287
+ if (fs.existsSync(policiesDir)) {
288
+ const targetPoliciesDir = path.join(hqRoot, ".claude", "policies");
289
+ copyDirContents(policiesDir, targetPoliciesDir);
290
+ }
291
+ }
292
+ function copyDirContents(src, dest) {
293
+ if (!fs.existsSync(dest)) {
294
+ fs.mkdirSync(dest, { recursive: true });
295
+ }
296
+ const entries = fs.readdirSync(src, { withFileTypes: true });
297
+ for (const entry of entries) {
298
+ const srcPath = path.join(src, entry.name);
299
+ const destPath = path.join(dest, entry.name);
300
+ if (entry.isDirectory()) {
301
+ copyDirContents(srcPath, destPath);
302
+ }
303
+ else {
304
+ fs.copyFileSync(srcPath, destPath);
305
+ }
306
+ }
307
+ }
308
+ // ─── TUI display helpers ────────────────────────────────────────────────────
309
+ /** Format a package for display in the selection list. */
310
+ export function formatPackageChoice(choice) {
311
+ const { pkg, entitled } = choice;
312
+ if (entitled) {
313
+ return `${pkg.name} ${chalk.dim(`— ${pkg.description}`)}`;
314
+ }
315
+ // Non-entitled: lock icon + tier label
316
+ return `${chalk.dim("🔒")} ${chalk.dim(pkg.name)} ${chalk.dim(`— ${pkg.description}`)} ${chalk.yellow(`[${pkg.tier}]`)}`;
317
+ }
318
+ /**
319
+ * Install multiple packages in sequence, reporting progress.
320
+ * Returns the list of successfully installed slugs.
321
+ */
322
+ export async function installSelectedPackages(registryUrl, slugs, hqRoot, authToken) {
323
+ const installed = [];
324
+ for (const slug of slugs) {
325
+ const ok = await installPackage(registryUrl, slug, hqRoot, authToken);
326
+ if (ok) {
327
+ installed.push(slug);
328
+ }
329
+ }
330
+ return installed;
331
+ }
332
+ //# sourceMappingURL=packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.js","sourceRoot":"","sources":["../src/packages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type SystemPackageManager = "brew" | "apt" | "dnf" | "yum" | "pacman" | null;
2
+ export type OsType = "macos" | "linux-debian" | "linux-fedora" | "linux-arch" | "linux" | "unix";
3
+ export interface PlatformInfo {
4
+ os: OsType;
5
+ packageManager: SystemPackageManager;
6
+ npmAvailable: boolean;
7
+ }
8
+ export declare function detectPlatform(): PlatformInfo;
9
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEpF,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,cAAc,GAAG,cAAc,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,oBAAoB,CAAC;IACrC,YAAY,EAAE,OAAO,CAAC;CACvB;AAmDD,wBAAgB,cAAc,IAAI,YAAY,CAO7C"}
@@ -0,0 +1,69 @@
1
+ import { execSync } from "child_process";
2
+ function hasBin(name) {
3
+ try {
4
+ execSync(`which ${name}`, { stdio: "pipe" });
5
+ return true;
6
+ }
7
+ catch {
8
+ return false;
9
+ }
10
+ }
11
+ function detectOs() {
12
+ const platform = process.platform;
13
+ if (platform === "darwin")
14
+ return "macos";
15
+ if (platform !== "linux")
16
+ return "unix";
17
+ // Detect Linux distro family
18
+ try {
19
+ const release = execSync("cat /etc/os-release", { stdio: "pipe" }).toString();
20
+ if (/ID_LIKE=.*debian|ID=ubuntu|ID=debian/i.test(release))
21
+ return "linux-debian";
22
+ if (/ID_LIKE=.*fedora|ID_LIKE=.*rhel|ID=fedora/i.test(release))
23
+ return "linux-fedora";
24
+ if (/ID=arch|ID_LIKE=.*arch/i.test(release))
25
+ return "linux-arch";
26
+ }
27
+ catch {
28
+ // /etc/os-release missing — generic linux
29
+ }
30
+ return "linux";
31
+ }
32
+ function detectSystemPm(os) {
33
+ switch (os) {
34
+ case "macos":
35
+ return hasBin("brew") ? "brew" : null;
36
+ case "linux-debian":
37
+ return hasBin("apt") ? "apt" : null;
38
+ case "linux-fedora":
39
+ if (hasBin("dnf"))
40
+ return "dnf";
41
+ if (hasBin("yum"))
42
+ return "yum";
43
+ return null;
44
+ case "linux-arch":
45
+ return hasBin("pacman") ? "pacman" : null;
46
+ default:
47
+ // Best-effort for generic linux/unix
48
+ if (hasBin("apt"))
49
+ return "apt";
50
+ if (hasBin("dnf"))
51
+ return "dnf";
52
+ if (hasBin("yum"))
53
+ return "yum";
54
+ if (hasBin("pacman"))
55
+ return "pacman";
56
+ if (hasBin("brew"))
57
+ return "brew";
58
+ return null;
59
+ }
60
+ }
61
+ export function detectPlatform() {
62
+ const os = detectOs();
63
+ return {
64
+ os,
65
+ packageManager: detectSystemPm(os),
66
+ npmAvailable: hasBin("npm"),
67
+ };
68
+ }
69
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC;QACH,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IAExC,6BAA6B;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9E,IAAI,uCAAuC,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,cAAc,CAAC;QACjF,IAAI,4CAA4C,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,cAAc,CAAC;QACtF,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,YAAY,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;IAC5C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IAChC,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACxC,KAAK,cAAc;YACjB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACtC,KAAK,cAAc;YACjB,IAAI,MAAM,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,MAAM,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,KAAK,YAAY;YACf,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C;YACE,qCAAqC;YACrC,IAAI,MAAM,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,MAAM,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,MAAM,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,MAAM,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACtC,IAAI,MAAM,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;YAClC,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;IACtB,OAAO;QACL,EAAE;QACF,cAAc,EAAE,cAAc,CAAC,EAAE,CAAC;QAClC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC;KAC5B,CAAC;AACJ,CAAC"}
@@ -3,6 +3,7 @@ interface ScaffoldOptions {
3
3
  skipCli?: boolean;
4
4
  skipSync?: boolean;
5
5
  tag?: string;
6
+ localTemplate?: string;
6
7
  }
7
8
  export declare function scaffold(directory: string, options: ScaffoldOptions): Promise<void>;
8
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAcA,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAoBD,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CA6If"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAcA,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAoBD,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CA0Jf"}
package/dist/scaffold.js CHANGED
@@ -46,27 +46,54 @@ export async function scaffold(directory, options) {
46
46
  }
47
47
  }
48
48
  }
49
- // 2. Fetch template from GitHub
50
- const fetchLabel = "Fetching HQ template from GitHub...";
51
- stepStatus(fetchLabel, "running");
49
+ // 2. Fetch template (from local path or GitHub)
52
50
  let hqVersion = "";
53
- try {
54
- const { version } = await fetchTemplate(targetDir, options.tag);
55
- hqVersion = version;
56
- // Count what we fetched
57
- const commandCount = fs.existsSync(path.join(targetDir, ".claude", "commands"))
58
- ? fs.readdirSync(path.join(targetDir, ".claude", "commands")).filter((f) => f.endsWith(".md")).length
59
- : 0;
60
- const workerCount = fs.existsSync(path.join(targetDir, "workers"))
61
- ? fs.readdirSync(path.join(targetDir, "workers"), { recursive: true })
62
- .filter((f) => String(f).endsWith("worker.yaml")).length
63
- : 0;
64
- stepStatus(fetchLabel, "done");
65
- success(`HQ template ${version} (${commandCount} commands, ${workerCount} workers)`);
51
+ if (options.localTemplate) {
52
+ const localLabel = "Copying local HQ template...";
53
+ stepStatus(localLabel, "running");
54
+ try {
55
+ const templateSrc = path.resolve(options.localTemplate);
56
+ if (!fs.existsSync(templateSrc)) {
57
+ throw new Error(`Local template not found: ${templateSrc}`);
58
+ }
59
+ fs.ensureDirSync(targetDir);
60
+ fs.copySync(templateSrc, targetDir, { overwrite: true });
61
+ hqVersion = "local";
62
+ const commandCount = fs.existsSync(path.join(targetDir, ".claude", "commands"))
63
+ ? fs.readdirSync(path.join(targetDir, ".claude", "commands")).filter((f) => f.endsWith(".md")).length
64
+ : 0;
65
+ const workerCount = fs.existsSync(path.join(targetDir, "workers"))
66
+ ? fs.readdirSync(path.join(targetDir, "workers"), { recursive: true })
67
+ .filter((f) => String(f).endsWith("worker.yaml")).length
68
+ : 0;
69
+ stepStatus(localLabel, "done");
70
+ success(`HQ template (local) (${commandCount} commands, ${workerCount} workers)`);
71
+ }
72
+ catch (err) {
73
+ stepStatus(localLabel, "failed");
74
+ throw err;
75
+ }
66
76
  }
67
- catch (err) {
68
- stepStatus(fetchLabel, "failed");
69
- throw err;
77
+ else {
78
+ const fetchLabel = "Fetching HQ template from GitHub...";
79
+ stepStatus(fetchLabel, "running");
80
+ try {
81
+ const { version } = await fetchTemplate(targetDir, options.tag);
82
+ hqVersion = version;
83
+ const commandCount = fs.existsSync(path.join(targetDir, ".claude", "commands"))
84
+ ? fs.readdirSync(path.join(targetDir, ".claude", "commands")).filter((f) => f.endsWith(".md")).length
85
+ : 0;
86
+ const workerCount = fs.existsSync(path.join(targetDir, "workers"))
87
+ ? fs.readdirSync(path.join(targetDir, "workers"), { recursive: true })
88
+ .filter((f) => String(f).endsWith("worker.yaml")).length
89
+ : 0;
90
+ stepStatus(fetchLabel, "done");
91
+ success(`HQ template ${version} (${commandCount} commands, ${workerCount} workers)`);
92
+ }
93
+ catch (err) {
94
+ stepStatus(fetchLabel, "failed");
95
+ throw err;
96
+ }
70
97
  }
71
98
  // 3. Git init
72
99
  const gitLabel = "Initializing git repository";
@@ -109,34 +136,23 @@ export async function scaffold(directory, options) {
109
136
  }
110
137
  // 5. Check dependencies
111
138
  const depsLabel = "Checking dependencies";
112
- stepStatus(depsLabel, "running");
113
139
  if (!options.skipDeps) {
114
- checkDeps();
140
+ // No spinner here — checkDeps uses interactive readline prompts.
141
+ // An ora spinner would overwrite the prompt line, making it look stuck.
142
+ step(depsLabel);
143
+ await checkDeps();
144
+ success(depsLabel);
145
+ }
146
+ else {
147
+ stepStatus(depsLabel, "running");
148
+ stepStatus(depsLabel, "done");
115
149
  }
116
- stepStatus(depsLabel, "done");
117
150
  // 6. Smart cloud sync detection
118
151
  const alreadySynced = await detectExistingSync(targetDir);
119
152
  if (alreadySynced) {
120
153
  success("Cloud sync already configured — skipping setup");
121
154
  }
122
- // 7. Install hq-cli
123
- if (!options.skipCli) {
124
- console.log();
125
- const installCli = await confirm("Install @indigoai-us/hq-cli globally for module management?");
126
- if (installCli) {
127
- const cliLabel = "Installing @indigoai-us/hq-cli";
128
- stepStatus(cliLabel, "running");
129
- try {
130
- execSync("npm install -g @indigoai-us/hq-cli", { stdio: "pipe" });
131
- stepStatus(cliLabel, "done");
132
- }
133
- catch {
134
- stepStatus(cliLabel, "failed");
135
- warn("Failed to install @indigoai-us/hq-cli — you can install it later with: npm install -g @indigoai-us/hq-cli");
136
- }
137
- }
138
- }
139
- // 8. Cloud sync setup
155
+ // 7. Cloud sync setup
140
156
  if (!options.skipSync && !alreadySynced) {
141
157
  console.log();
142
158
  const setupSync = await confirm("Set up cloud sync? (enables mobile access via hq.indigoai.com)");
@@ -145,7 +161,7 @@ export async function scaffold(directory, options) {
145
161
  step("Run: hq sync init");
146
162
  }
147
163
  }
148
- // 9. Index with qmd
164
+ // 8. Index with qmd
149
165
  try {
150
166
  execSync("qmd index .", { cwd: targetDir, stdio: "pipe" });
151
167
  success("Indexed HQ for search");
@@ -153,7 +169,7 @@ export async function scaffold(directory, options) {
153
169
  catch {
154
170
  // qmd not installed, skip silently — already warned in deps check
155
171
  }
156
- // 10. Next steps
172
+ // 9. Next steps
157
173
  nextSteps(displayDir);
158
174
  }
159
175
  //# sourceMappingURL=scaffold.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
package/dist/ui.js CHANGED
@@ -20,7 +20,7 @@ export function banner(installerVersion, hqVersion) {
20
20
  console.log(c(" _______________ ______________ ______________"));
21
21
  console.log(c("_____________ ___________ __________________ ____________"));
22
22
  console.log();
23
- console.log(d(" Personal OS for AI Workers"));
23
+ console.log(d(" HQ by Indigo — Personal OS for AI Workers"));
24
24
  console.log();
25
25
  const parts = [];
26
26
  if (installerVersion) {