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.
package/dist/deps.js CHANGED
@@ -1,46 +1,109 @@
1
1
  import { execSync } from "child_process";
2
+ import { createInterface } from "readline";
3
+ import chalk from "chalk";
2
4
  import { success, warn, info } from "./ui.js";
5
+ import { detectPlatform } from "./platform.js";
3
6
  const deps = [
4
7
  {
5
8
  name: "Node.js",
6
9
  command: "node --version",
7
10
  required: true,
8
11
  installHint: "https://nodejs.org",
12
+ autoInstallable: false,
13
+ installCommands: {},
9
14
  },
10
15
  {
11
16
  name: "Claude Code CLI",
12
17
  command: "claude --version",
13
18
  required: true,
14
19
  installHint: "npm install -g @anthropic-ai/claude-code",
20
+ autoInstallable: true,
21
+ installCommands: {
22
+ npm: "npm install -g @anthropic-ai/claude-code",
23
+ },
15
24
  },
16
25
  {
17
26
  name: "qmd (search)",
18
27
  command: "qmd --version",
19
28
  required: true,
20
29
  installHint: "npm install -g @tobilu/qmd",
30
+ autoInstallable: true,
31
+ installCommands: {
32
+ npm: "npm install -g @tobilu/qmd",
33
+ },
21
34
  },
22
35
  {
23
36
  name: "yq",
24
37
  command: "yq --version",
25
38
  required: true,
26
39
  installHint: "brew install yq",
40
+ autoInstallable: true,
41
+ installCommands: {
42
+ brew: "brew install yq",
43
+ apt: "sudo snap install yq",
44
+ dnf: "sudo dnf install yq",
45
+ pacman: "sudo pacman -S yq",
46
+ },
27
47
  },
28
48
  {
29
49
  name: "gh CLI",
30
50
  command: "gh --version",
31
51
  required: false,
32
52
  installHint: "brew install gh",
53
+ autoInstallable: true,
54
+ installCommands: {
55
+ brew: "brew install gh",
56
+ apt: "sudo apt install gh",
57
+ dnf: "sudo dnf install gh",
58
+ pacman: "sudo pacman -S github-cli",
59
+ },
33
60
  },
34
61
  {
35
62
  name: "Vercel CLI",
36
63
  command: "vercel --version",
37
64
  required: false,
38
65
  installHint: "npm install -g vercel",
66
+ autoInstallable: true,
67
+ installCommands: {
68
+ npm: "npm install -g vercel",
69
+ },
70
+ },
71
+ {
72
+ name: "hq-cli",
73
+ command: "hq --version",
74
+ required: false,
75
+ installHint: "npm install -g @indigoai-us/hq-cli",
76
+ autoInstallable: true,
77
+ installCommands: {
78
+ npm: "npm install -g @indigoai-us/hq-cli",
79
+ },
39
80
  },
40
81
  ];
82
+ /**
83
+ * Pick the best install command for a dep given the detected platform.
84
+ * Prefers the system package manager, falls back to npm if available.
85
+ * Returns null when no suitable command exists (e.g. Node.js — manual install).
86
+ */
87
+ export function getInstallCommand(dep, platform) {
88
+ const cmds = dep.installCommands;
89
+ // Try system package manager first (yum falls back to dnf commands)
90
+ const pm = platform.packageManager === "yum" ? "dnf" : platform.packageManager;
91
+ if (pm && cmds[pm]) {
92
+ return cmds[pm];
93
+ }
94
+ // Fall back to npm
95
+ if (platform.npmAvailable && cmds.npm) {
96
+ return cmds.npm;
97
+ }
98
+ return null;
99
+ }
41
100
  function checkCommand(command) {
42
101
  try {
43
- const output = execSync(command, { stdio: "pipe", encoding: "utf-8" });
102
+ const output = execSync(command, {
103
+ stdio: "pipe",
104
+ encoding: "utf-8",
105
+ timeout: 10_000, // 10s — prevents hanging on slow commands (e.g. claude --version)
106
+ });
44
107
  const version = output.trim().split("\n")[0];
45
108
  return version;
46
109
  }
@@ -48,24 +111,134 @@ function checkCommand(command) {
48
111
  return null;
49
112
  }
50
113
  }
51
- export function checkDeps() {
114
+ /**
115
+ * Standalone confirm helper using readline directly.
116
+ * Avoids importing from scaffold.ts to prevent circular dependencies.
117
+ */
118
+ async function confirm(question, defaultYes) {
119
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
120
+ const hint = defaultYes ? "Y/n" : "y/N";
121
+ return new Promise((resolve) => {
122
+ rl.question(` ? ${question} (${hint}) `, (answer) => {
123
+ rl.close();
124
+ const trimmed = answer.trim();
125
+ if (!trimmed) {
126
+ resolve(defaultYes);
127
+ }
128
+ else {
129
+ resolve(trimmed.toLowerCase().startsWith("y"));
130
+ }
131
+ });
132
+ });
133
+ }
134
+ export async function checkDeps() {
52
135
  console.log();
53
136
  console.log(" Checking dependencies...");
137
+ const platform = detectPlatform();
54
138
  let allRequired = true;
139
+ const results = [];
55
140
  for (const dep of deps) {
56
141
  const version = checkCommand(dep.command);
57
142
  if (version) {
58
143
  success(`${dep.name} ${version}`);
144
+ results.push({ name: dep.name, required: dep.required, status: "installed", version, installHint: dep.installHint });
145
+ continue;
59
146
  }
60
- else if (dep.required) {
61
- warn(`${dep.name} not found`);
62
- info(`Install: ${dep.installHint}`);
63
- allRequired = false;
147
+ // Dep is missing — decide how to handle
148
+ const installCmd = dep.autoInstallable ? getInstallCommand(dep, platform) : null;
149
+ if (installCmd) {
150
+ // Can offer auto-install
151
+ const defaultYes = dep.required;
152
+ const optionalTag = dep.required ? "" : " (optional)";
153
+ const accepted = await confirm(`Install ${dep.name}?${optionalTag} [${installCmd}]`, defaultYes);
154
+ if (accepted) {
155
+ info(`Running: ${installCmd}`);
156
+ try {
157
+ execSync(installCmd, { stdio: "inherit" });
158
+ }
159
+ catch {
160
+ // install command failed — will be caught by re-check below
161
+ }
162
+ // Re-check after install attempt
163
+ const recheck = checkCommand(dep.command);
164
+ if (recheck) {
165
+ success(`${dep.name} ${recheck}`);
166
+ results.push({ name: dep.name, required: dep.required, status: "just-installed", version: recheck, installHint: dep.installHint });
167
+ continue;
168
+ }
169
+ else {
170
+ warn(`${dep.name} install failed — could not verify after install`);
171
+ results.push({ name: dep.name, required: dep.required, status: "missing", installHint: dep.installHint });
172
+ if (dep.required) {
173
+ allRequired = false;
174
+ }
175
+ }
176
+ }
177
+ else {
178
+ // User declined
179
+ if (dep.required) {
180
+ warn(`${dep.name} not found (required)`);
181
+ results.push({ name: dep.name, required: dep.required, status: "missing", installHint: dep.installHint });
182
+ allRequired = false;
183
+ }
184
+ else {
185
+ info(`${dep.name} (optional) — skipped`);
186
+ results.push({ name: dep.name, required: dep.required, status: "skipped", installHint: dep.installHint });
187
+ }
188
+ }
64
189
  }
65
190
  else {
66
- info(`${dep.name} (optional)${dep.installHint}`);
191
+ // No auto-install available show manual hint
192
+ if (dep.required) {
193
+ warn(`${dep.name} not found`);
194
+ info(`Install manually: ${dep.installHint}`);
195
+ results.push({ name: dep.name, required: dep.required, status: "missing", installHint: dep.installHint });
196
+ allRequired = false;
197
+ }
198
+ else {
199
+ info(`${dep.name} (optional) — ${dep.installHint}`);
200
+ results.push({ name: dep.name, required: dep.required, status: "skipped", installHint: dep.installHint });
201
+ }
67
202
  }
68
203
  }
204
+ // ─── Summary Banner ──────────────────────────────────────────────────────
205
+ printDepSummary(results, allRequired);
69
206
  return { allRequired };
70
207
  }
208
+ function printDepSummary(results, allRequired) {
209
+ const statusIcon = (r) => {
210
+ switch (r.status) {
211
+ case "installed":
212
+ return chalk.green("✓");
213
+ case "just-installed":
214
+ return chalk.green("✓") + chalk.cyan(" new");
215
+ case "missing":
216
+ return chalk.red("✗");
217
+ case "skipped":
218
+ return chalk.dim("~");
219
+ }
220
+ };
221
+ console.log();
222
+ console.log(chalk.dim(" ─── Dependency Summary ───────────────────────"));
223
+ console.log();
224
+ for (const r of results) {
225
+ const icon = statusIcon(r);
226
+ const ver = r.version ? chalk.dim(` ${r.version}`) : "";
227
+ const tag = r.required ? "" : chalk.dim(" (optional)");
228
+ console.log(` ${icon} ${r.name}${ver}${tag}`);
229
+ }
230
+ console.log();
231
+ const missing = results.filter((r) => r.required && r.status === "missing");
232
+ if (missing.length > 0) {
233
+ warn("Some required dependencies are missing:");
234
+ console.log();
235
+ for (const m of missing) {
236
+ console.log(chalk.yellow(" →") + ` ${m.name}: ${chalk.dim(m.installHint)}`);
237
+ }
238
+ console.log();
239
+ }
240
+ else {
241
+ success("All required dependencies installed");
242
+ }
243
+ }
71
244
  //# sourceMappingURL=deps.js.map
package/dist/deps.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAS9C,MAAM,IAAI,GAAU;IAClB;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,oBAAoB;KAClC;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,0CAA0C;KACxD;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,4BAA4B;KAC1C;IACD;QACE,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,iBAAiB;KAC/B;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,iBAAiB;KAC/B;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,uBAAuB;KACrC;CACF,CAAC;AAEF,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACpC,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,iBAAiB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA8B/C,MAAM,IAAI,GAAU;IAClB;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,oBAAoB;QACjC,eAAe,EAAE,KAAK;QACtB,eAAe,EAAE,EAAE;KACpB;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,0CAA0C;QACvD,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE;YACf,GAAG,EAAE,0CAA0C;SAChD;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,eAAe;QACxB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,4BAA4B;QACzC,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE;YACf,GAAG,EAAE,4BAA4B;SAClC;KACF;IACD;QACE,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,iBAAiB;QAC9B,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE;YACf,IAAI,EAAE,iBAAiB;YACvB,GAAG,EAAE,sBAAsB;YAC3B,GAAG,EAAE,qBAAqB;YAC1B,MAAM,EAAE,mBAAmB;SAC5B;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,iBAAiB;QAC9B,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE;YACf,IAAI,EAAE,iBAAiB;YACvB,GAAG,EAAE,qBAAqB;YAC1B,GAAG,EAAE,qBAAqB;YAC1B,MAAM,EAAE,2BAA2B;SACpC;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,uBAAuB;QACpC,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE;YACf,GAAG,EAAE,uBAAuB;SAC7B;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,oCAAoC;QACjD,eAAe,EAAE,IAAI;QACrB,eAAe,EAAE;YACf,GAAG,EAAE,oCAAoC;SAC1C;KACF;CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAQ,EACR,QAAsB;IAEtB,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC;IAEjC,oEAAoE;IACpE,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;IAC/E,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,EAAE,CAAE,CAAC;IACnB,CAAC;IAED,mBAAmB;IACnB,IAAI,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;YAC/B,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM,EAAE,kEAAkE;SACpF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,UAAmB;IAC1D,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,OAAO,QAAQ,KAAK,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACnD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,MAAM,OAAO,GAAgB,EAAE,CAAC;IAEhC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACrH,SAAS;QACX,CAAC;QAED,wCAAwC;QACxC,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEjF,IAAI,UAAU,EAAE,CAAC;YACf,yBAAyB;YACzB,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC;YAChC,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,WAAW,GAAG,CAAC,IAAI,IAAI,WAAW,KAAK,UAAU,GAAG,EACpD,UAAU,CACX,CAAC;YAEF,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;gBAC/B,IAAI,CAAC;oBACH,QAAQ,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,4DAA4D;gBAC9D,CAAC;gBAED,iCAAiC;gBACjC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1C,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;oBACnI,SAAS;gBACX,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,kDAAkD,CAAC,CAAC;oBACpE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;oBAC1G,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;wBACjB,WAAW,GAAG,KAAK,CAAC;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,gBAAgB;gBAChB,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACjB,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,uBAAuB,CAAC,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;oBAC1G,WAAW,GAAG,KAAK,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,uBAAuB,CAAC,CAAC;oBACzC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC5G,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,+CAA+C;YAC/C,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjB,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC;gBAC9B,IAAI,CAAC,qBAAqB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1G,WAAW,GAAG,KAAK,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,iBAAiB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC5G,CAAC;QACH,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEtC,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,eAAe,CAAC,OAAoB,EAAE,WAAoB;IACjE,MAAM,UAAU,GAAG,CAAC,CAAY,EAAU,EAAE;QAC1C,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;YACjB,KAAK,WAAW;gBACd,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,KAAK,gBAAgB;gBACnB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxB,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAE5E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,qCAAqC,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -7,13 +7,14 @@ const pkg = require("../package.json");
7
7
  const program = new Command();
8
8
  program
9
9
  .name("create-hq")
10
- .description("Create a new HQ — Personal OS for AI Workers")
10
+ .description("Create a new HQ by Indigo — Personal OS for AI Workers")
11
11
  .version(pkg.version)
12
12
  .argument("[directory]", "where to create HQ", "hq")
13
13
  .option("--skip-deps", "skip dependency checks")
14
14
  .option("--skip-cli", "don't install @indigoai-us/hq-cli globally")
15
15
  .option("--skip-sync", "don't prompt for cloud sync setup")
16
16
  .option("--tag <version>", "fetch a specific HQ version tag (e.g. v9.1.0)")
17
+ .option("--local-template <path>", "use a local template directory instead of fetching from GitHub")
17
18
  .action(async (directory, options) => {
18
19
  try {
19
20
  await scaffold(directory, options);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,QAAQ,CAAC,aAAa,EAAE,oBAAoB,EAAE,IAAI,CAAC;KACnD,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;KAC/C,MAAM,CAAC,YAAY,EAAE,4CAA4C,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,mCAAmC,CAAC;KAC1D,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAAO,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CACpE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,QAAQ,CAAC,aAAa,EAAE,oBAAoB,EAAE,IAAI,CAAC;KACnD,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC;KAC/C,MAAM,CAAC,YAAY,EAAE,4CAA4C,CAAC;KAClE,MAAM,CAAC,aAAa,EAAE,mCAAmC,CAAC;KAC1D,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,yBAAyB,EAAE,gEAAgE,CAAC;KACnG,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAAO,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CACpE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,71 @@
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
+ /**
13
+ * Read the registry URL from packages/sources.yaml in the target HQ dir.
14
+ * Falls back to the default registry URL if sources.yaml is not present
15
+ * (which is expected during initial scaffold before the template is fully
16
+ * written).
17
+ */
18
+ export declare function getRegistryUrl(hqRoot: string): string;
19
+ export interface PackageMeta {
20
+ slug: string;
21
+ name: string;
22
+ description: string;
23
+ tier: string;
24
+ latest_version: string;
25
+ author?: string;
26
+ }
27
+ export interface EntitlementEntry {
28
+ slug: string;
29
+ tier: string;
30
+ granted_at: string;
31
+ expires_at?: string;
32
+ }
33
+ export interface DownloadInfo {
34
+ url: string;
35
+ sha256: string;
36
+ signature?: string;
37
+ }
38
+ /** A package shown in the TUI list with its selection state. */
39
+ export interface PackageChoice {
40
+ pkg: PackageMeta;
41
+ entitled: boolean;
42
+ selected: boolean;
43
+ }
44
+ /**
45
+ * Fetch the public package catalog.
46
+ * Returns an empty array on failure (network down, etc.).
47
+ */
48
+ export declare function fetchPublicPackages(registryUrl: string): Promise<PackageMeta[]>;
49
+ /**
50
+ * Fetch packages the authenticated user is entitled to.
51
+ * Returns an empty array on failure.
52
+ */
53
+ export declare function fetchEntitlements(registryUrl: string, authToken: string): Promise<EntitlementEntry[]>;
54
+ /**
55
+ * Build the combined package list for the TUI.
56
+ * Entitled packages are pre-checked; non-entitled are shown with lock icon.
57
+ */
58
+ export declare function buildPackageChoices(allPackages: PackageMeta[], entitlements: EntitlementEntry[]): PackageChoice[];
59
+ /**
60
+ * Download, verify, and extract a single package into the target HQ.
61
+ * Returns true on success, false on failure (non-throwing for batch installs).
62
+ */
63
+ export declare function installPackage(registryUrl: string, slug: string, hqRoot: string, authToken?: string): Promise<boolean>;
64
+ /** Format a package for display in the selection list. */
65
+ export declare function formatPackageChoice(choice: PackageChoice): string;
66
+ /**
67
+ * Install multiple packages in sequence, reporting progress.
68
+ * Returns the list of successfully installed slugs.
69
+ */
70
+ export declare function installSelectedPackages(registryUrl: string, slugs: string[], hqRoot: string, authToken?: string): Promise<string[]>;
71
+ //# sourceMappingURL=packages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../src/packages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWrD;AAID,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,WAAW,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AA4BD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,EAAE,CAAC,CAUxB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAW7B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,WAAW,EAAE,EAC1B,YAAY,EAAE,gBAAgB,EAAE,GAC/B,aAAa,EAAE,CAOjB;AAkDD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAqElB;AA4ID,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAOjE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB"}