@indigoai-us/hq-cli 5.190.0 → 5.191.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/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.191.0] — 2026-09-25
6
+
7
+ ### Fixed
8
+
9
+ - `hq agents provision` now rejects an invalid `--slug` before sending the agent create request.
10
+
5
11
  ## [5.190.0] — 2026-09-25
6
12
 
7
13
  ### Added
@@ -19,6 +25,12 @@
19
25
  - `hq bot promote` accepts server-signed upload URLs without SSE headers when the bucket supplies encryption. SSE header names are checked case-insensitively, and any supplied encryption must be a complete SSE-KMS pair.
20
26
  - Company slug lookup errors now point to the supported `hq sources entities` command.
21
27
 
28
+ ### Added
29
+
30
+ - QMD native-binding startup failures after sync can emit an actionable warning
31
+ when the `qmd.reindex-startup-warning` hq-flags canary is enabled. The flag
32
+ defaults off, and sync still succeeds when indexing cannot run.
33
+
22
34
  ## [5.189.0] — 2026-09-25
23
35
 
24
36
  ### Added
@@ -55,6 +55,8 @@ export const VALID_PROVIDERS = new Set(["codex", "grok", "claude", "agents-v2"])
55
55
  export const VALID_AUTH_MODES = new Set(["subscription", "apiKey"]);
56
56
  /** Customer-facing agent size keys served by hq-pro's authoritative catalog. */
57
57
  export const VALID_AGENT_SIZE_KEYS = new Set(["basic", "power", "dev"]);
58
+ // Keep cloud agent create slugs aligned with hq-pro-agents POST /v1/agents.
59
+ const AGENT_SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,62}$/;
58
60
  const CLAUDE_PROVISION_COMMAND = "hq agents provision <name> --provider agents-v2 --model claude-opus-5-5";
59
61
  const CLAUDE_API_KEY_ARGS = "--auth-mode apiKey --api-key-env <VAR>";
60
62
  function claudeProvisionGuidance() {
@@ -1281,6 +1283,12 @@ export function registerAgentsCommand(program) {
1281
1283
  .addHelpText("after", `\n${claudeProvisionGuidance()}\n`)
1282
1284
  .action(async function (name, opts) {
1283
1285
  try {
1286
+ const slug = opts.slug ?? slugifyAgentName(name);
1287
+ if (!AGENT_SLUG_PATTERN.test(slug)) {
1288
+ console.error(chalk.red("Agent slug must start with a lowercase letter or digit, contain only lowercase letters, digits, and hyphens, and be at most 63 characters. " +
1289
+ "Update --slug or the agent name."));
1290
+ process.exit(1);
1291
+ }
1284
1292
  // Both of these previously fell back to their default on an
1285
1293
  // unrecognised value, silently provisioning a billable box the operator
1286
1294
  // did not ask for. They now exit(1) instead — see parseEnumOption.
@@ -1341,7 +1349,6 @@ export function registerAgentsCommand(program) {
1341
1349
  // Every path confirms hq-pro's company-specific quote. Omission still
1342
1350
  // leaves the POST size implicit, preserving the server-side default.
1343
1351
  confirmAgentCreateQuoteOrExit(quotedSize, opts.yes, opts.json);
1344
- const slug = opts.slug ?? slugifyAgentName(name);
1345
1352
  try {
1346
1353
  const result = await provisionAgent(token, {
1347
1354
  companyUid,
@@ -1,6 +1,8 @@
1
1
  import { type EmbedLockDependencies } from "../search-index/embed-lock.js";
2
2
  import { type LoadGateDependencies } from "../search-index/load-gate.js";
3
3
  import { type UtilityIo } from "./common.js";
4
+ export declare const QMD_REINDEX_STARTUP_WARNING_FLAG = "qmd.reindex-startup-warning";
5
+ export declare const QMD_REINDEX_STARTUP_WARNING_FLAG_FALLBACK = false;
4
6
  export type QmdReindexOptions = UtilityIo & {
5
7
  cwd?: string;
6
8
  /** Test seams; default to the real search-index implementations. */
@@ -17,6 +19,8 @@ export type QmdReindexOptions = UtilityIo & {
17
19
  embedLockDependencies?: EmbedLockDependencies;
18
20
  /** Test seams for the host load gate consulted while the embed lock is held. */
19
21
  loadGateDependencies?: LoadGateDependencies;
22
+ /** Test seam for the hq-flags-gated warning on qmd native startup failures. */
23
+ startupFailureWarningsEnabled?: () => boolean;
20
24
  };
21
25
  export declare function qmdReindexAfterSync(args?: string[], options?: QmdReindexOptions): number;
22
26
  //# sourceMappingURL=qmd-reindex-after-sync.d.ts.map
@@ -15,7 +15,14 @@ import { reconcileCollections, resolveQmdBin, resolveQmdHome, runQmd } from "../
15
15
  import { applyIndexSizeLimit } from "../search-index/max-doc-bytes.js";
16
16
  import { defaultEmbedLockDependencies, runWithEmbedLock, } from "../search-index/embed-lock.js";
17
17
  import { LoadGateConfigurationError, checkEmbedLoad, defaultLoadGateDependencies, recordSuccessfulEmbed, } from "../search-index/load-gate.js";
18
+ import { resolveProcessFlagGate } from "../flag-registry.js";
19
+ import { isQmdNativeBindingError, QMD_NATIVE_BINDING_REMEDY, } from "../../utils/qmd-native-binding-error.js";
18
20
  import { ioFor, line } from "./common.js";
21
+ export const QMD_REINDEX_STARTUP_WARNING_FLAG = "qmd.reindex-startup-warning";
22
+ export const QMD_REINDEX_STARTUP_WARNING_FLAG_FALLBACK = false;
23
+ function qmdStartupFailureWarningsEnabled() {
24
+ return resolveProcessFlagGate(QMD_REINDEX_STARTUP_WARNING_FLAG, { fallback: QMD_REINDEX_STARTUP_WARNING_FLAG_FALLBACK }, () => QMD_REINDEX_STARTUP_WARNING_FLAG_FALLBACK);
25
+ }
19
26
  export function qmdReindexAfterSync(args = [], options = {}) {
20
27
  let hqRoot = "";
21
28
  let embed = false;
@@ -42,6 +49,15 @@ export function qmdReindexAfterSync(args = [], options = {}) {
42
49
  const run = options.run ?? ((argv, opts) => runQmd(argv, opts));
43
50
  const sizeLimit = options.sizeLimit ?? ((root) => applyIndexSizeLimit(root));
44
51
  const { stderr } = ioFor(options);
52
+ let startupFailureWarningShown = false;
53
+ const warnOnNativeStartupFailure = (error) => {
54
+ if (startupFailureWarningShown ||
55
+ !isQmdNativeBindingError(error) ||
56
+ !(options.startupFailureWarningsEnabled ?? qmdStartupFailureWarningsEnabled)())
57
+ return;
58
+ startupFailureWarningShown = true;
59
+ line(stderr, `hq: search index was not updated after sync; ${QMD_NATIVE_BINDING_REMEDY}`);
60
+ };
45
61
  // Every qmd interaction is best-effort: the shell suffixed each with `|| true`.
46
62
  try {
47
63
  reconcile(hqRoot, { bin });
@@ -62,7 +78,8 @@ export function qmdReindexAfterSync(args = [], options = {}) {
62
78
  try {
63
79
  run(["update"], { bin, cwd: hqRoot });
64
80
  }
65
- catch {
81
+ catch (error) {
82
+ warnOnNativeStartupFailure(error);
66
83
  /* never fail a sync on index freshness */
67
84
  }
68
85
  if (embed) {
@@ -91,6 +108,7 @@ export function qmdReindexAfterSync(args = [], options = {}) {
91
108
  catch (error) {
92
109
  if (error instanceof LoadGateConfigurationError)
93
110
  line(stderr, `hq: ${error.message}`);
111
+ warnOnNativeStartupFailure(error);
94
112
  /* embeddings are deferred-cost and optional */
95
113
  }
96
114
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigoai-us/hq-cli",
3
- "version": "5.190.0",
3
+ "version": "5.191.0",
4
4
  "description": "HQ by Indigo management CLI — modules and cloud sync",
5
5
  "main": "dist/index.js",
6
6
  "bin": {