@indigoai-us/hq-cli 5.312.0 → 5.312.2-beta.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,10 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.312.2-beta.0] — 2026-10-02
6
+ - Fix checkpoint Stop hook-state creation and the jq-absent early exit to match the bundled shell.
7
+ - Let `hq sync now` skip unchanged server-owned cloud placeholders while keeping their warnings visible, so the sync can complete.
8
+
5
9
  ## [5.312.0] — 2026-10-02
6
10
  - The desktop app can turn event-driven daemon sync on or off with its Instant Sync setting. The daemon stores the preference and restarts when a running daemon needs to apply it.
7
11
  - `hq dm channel` now explains empty channels and displays a readable fallback for bodyless system notifications.
@@ -1697,6 +1697,7 @@ async function runNowSingle(hqRoot, company, personal, message, onConflict, mode
1697
1697
  hqRoot,
1698
1698
  progressRecorder: trackingProgressRecorder(planLimitTracker, pushProgressCompany),
1699
1699
  skipUnchanged: true,
1700
+ serverOwnedPathPolicy: "skip",
1700
1701
  propagateDeletes: true,
1701
1702
  propagateDeletePolicy: resolveDeletePolicy(),
1702
1703
  ...(onConflict ? { onConflict } : {}),
@@ -481,6 +481,11 @@ export function executeCheckpointStopGate(input, context, overrides = {}) {
481
481
  return { code: 0, stdout: "", stderr: "" };
482
482
  }
483
483
  const evidence = payloadReplyEvidence(payload);
484
+ // The shell's jq-backed input_fields assignment exits successfully before
485
+ // any state work when jq is unavailable. Keep that early-exit ordering even
486
+ // though the native parser does not otherwise need jq.
487
+ if (!deps.commandExists("jq", env))
488
+ return { code: 0, stdout: "", stderr: "" };
484
489
  const transcriptPath = toShellString(payload.transcript_path);
485
490
  const sessionId = toShellString(payload.session_id);
486
491
  if (env.HQ_CHECKPOINT_SIBLING === "1")
@@ -517,6 +522,13 @@ export function executeCheckpointStopGate(input, context, overrides = {}) {
517
522
  else
518
523
  return { code: 0, stdout: "", stderr };
519
524
  const stateDir = path.join(root, "workspace", "orchestrator", "hook-state");
525
+ try {
526
+ deps.mkdir(stateDir);
527
+ }
528
+ catch {
529
+ // hook-lib.sh runs `mkdir -p ... 2>/dev/null || true`; the directory and
530
+ // write checks below determine whether this invocation can continue.
531
+ }
520
532
  if (!deps.isDirectory(stateDir) || !deps.canWrite(stateDir))
521
533
  return { code: 0, stdout: "", stderr };
522
534
  const eligibilityFile = path.join(stateDir, `checkpoint-gate-eligible-${runtime}`);
@@ -1,6 +1,6 @@
1
1
  export declare const AGENT_MODEL_PROVIDERS: readonly ["codex", "grok", "claude"];
2
2
  export type AgentModelProvider = (typeof AGENT_MODEL_PROVIDERS)[number];
3
- export interface AgentCatalogModel {
3
+ interface AgentCatalogModel {
4
4
  id: string;
5
5
  label: string;
6
6
  visibility: string;
@@ -10,7 +10,7 @@ export interface AgentCatalogModel {
10
10
  selectable: boolean;
11
11
  unavailableReason?: string | null;
12
12
  }
13
- export interface AgentCatalogProvider {
13
+ interface AgentCatalogProvider {
14
14
  models: AgentCatalogModel[];
15
15
  defaultModel: string;
16
16
  }
@@ -58,4 +58,5 @@ export declare function validateAgentModelSelection(catalog: AgentModelCatalog,
58
58
  export declare function modelSelectionErrorMessage(modelId: string, result: Extract<ModelSelectionResult, {
59
59
  ok: false;
60
60
  }>): string;
61
+ export {};
61
62
  //# sourceMappingURL=model-catalog.d.ts.map
@@ -1,12 +1,4 @@
1
1
  import * as fs from "node:fs";
2
- export interface CompanySkillWrapperOwnershipDiagnostics {
3
- kind: "directory" | "symlink" | "file" | "other";
4
- bridgeState: "all_live" | "partial" | "none" | "empty" | "not_applicable";
5
- markerState: "bound" | "missing" | "invalid" | "unbound" | "unavailable" | "not_applicable";
6
- linkTarget: "company_skills" | "outside_company_skills" | "unavailable" | "not_applicable";
7
- platform: "win32" | "darwin" | "linux" | "other";
8
- nameEncoding: "percent_encoded" | "literal";
9
- }
10
2
  export declare function companySkillWrapperSentryTagsFor(error: unknown): Record<string, string> | undefined;
11
3
  export interface SurfaceCompanySkillInput {
12
4
  hqRoot: string;
@@ -1,4 +1,4 @@
1
- export type BridgeCommand = "status" | "install" | "doctor";
1
+ type BridgeCommand = "status" | "install" | "doctor";
2
2
  export type BridgeOptions = {
3
3
  command: BridgeCommand;
4
4
  hqRoot: string;
@@ -28,4 +28,5 @@ export declare function isHqRootLike(candidate: string): boolean;
28
28
  export declare function outputStyleSlug(name: string): string;
29
29
  /** Runs one bridge command; returns the process exit code. */
30
30
  export declare function runCodexSkillBridge(options: BridgeOptions, io: BridgeIo): number;
31
+ export {};
31
32
  //# sourceMappingURL=codex-skill-bridge.d.ts.map
@@ -1,6 +1,5 @@
1
1
  /** Shared authenticated request path for the hq-deploy control plane. */
2
2
  export declare const DEPLOY_API_URL: string;
3
3
  export declare function deployHeaders(token: string, json?: boolean, extra?: Record<string, string>): Record<string, string>;
4
- export declare function deployApiUrl(route: string): string;
5
4
  export declare function deployApiRequest(token: string, route: string, method: string, body?: unknown, extraHeaders?: Record<string, string>): Promise<Response>;
6
5
  //# sourceMappingURL=deploy-api.d.ts.map
@@ -8,7 +8,7 @@ export function deployHeaders(token, json = true, extra = {}) {
8
8
  ...extra,
9
9
  };
10
10
  }
11
- export function deployApiUrl(route) {
11
+ function deployApiUrl(route) {
12
12
  return `${DEPLOY_API_URL.replace(/\/+$/, "")}${route}`;
13
13
  }
14
14
  export async function deployApiRequest(token, route, method, body, extraHeaders = {}) {
@@ -8,12 +8,12 @@ export type DigestSignal = {
8
8
  kind: string;
9
9
  text: string;
10
10
  };
11
- export type FocusItem = {
11
+ type FocusItem = {
12
12
  title: string;
13
13
  project: string;
14
14
  reason: string;
15
15
  };
16
- export type ReportRunRecord = {
16
+ type ReportRunRecord = {
17
17
  generatedAt: string;
18
18
  inputs: {
19
19
  template: string;
@@ -58,4 +58,5 @@ export declare function renderDailyDigest(input: {
58
58
  generatedAt?: string;
59
59
  }): DigestPage;
60
60
  export declare function writeDigestPage(directory: string, page: DigestPage): void;
61
+ export {};
61
62
  //# sourceMappingURL=report-run.d.ts.map
@@ -3,7 +3,6 @@ export type ReportTemplate = {
3
3
  path: string;
4
4
  body: string;
5
5
  };
6
- export declare function reportPackageRoot(): string;
7
6
  export declare function listReportTemplates(root?: string): ReportTemplate[];
8
7
  /** Verbatim runbook. Callers substitute `<reportId>` when the id is known. */
9
8
  export declare function loadUpdateReportRunbook(root?: string): string;
@@ -3,9 +3,6 @@ import { readdirSync, readFileSync } from "node:fs";
3
3
  import path from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
6
- export function reportPackageRoot() {
7
- return PACKAGE_ROOT;
8
- }
9
6
  export function listReportTemplates(root = PACKAGE_ROOT) {
10
7
  const dir = path.join(root, "templates", "reports");
11
8
  return readdirSync(dir)
@@ -1,4 +1,3 @@
1
- export declare const SCAFFOLD_CLI_UPGRADE_COMMAND = "npm install -g @indigoai-us/hq-cli@latest";
2
1
  export type ScaffoldCliFloorComparison = {
3
2
  status: "pass" | "fail" | "warn" | "skip";
4
3
  message: string;
@@ -1,5 +1,5 @@
1
1
  import semver from "semver";
2
- export const SCAFFOLD_CLI_UPGRADE_COMMAND = "npm install -g @indigoai-us/hq-cli@latest";
2
+ const SCAFFOLD_CLI_UPGRADE_COMMAND = "npm install -g @indigoai-us/hq-cli@latest";
3
3
  const MINIMUM_VERSION_RANGE = /^>=(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;
4
4
  /** Compare an installed CLI version with the scaffold's supported floor. */
5
5
  export function compareScaffoldCliFloor(required, currentVersion) {
@@ -1,4 +1,4 @@
1
- export interface SchemaConflict {
1
+ interface SchemaConflict {
2
2
  paths: [string, string];
3
3
  slugs: [string, string];
4
4
  }
@@ -9,4 +9,5 @@ export interface DiscoverSchemasResult {
9
9
  conflict: SchemaConflict | null;
10
10
  }
11
11
  export declare function discoverSchemas(cwd: string): DiscoverSchemasResult;
12
+ export {};
12
13
  //# sourceMappingURL=discover-schemas.d.ts.map
@@ -59,8 +59,6 @@ export declare function createPackageRootResolver(options: PackageRootResolverOp
59
59
  * answer survives a change in output layout.
60
60
  */
61
61
  export declare function packageRoot(): string;
62
- /** Reset the memoized package root. Tests only. */
63
- export declare function __resetPackageRootCache(): void;
64
62
  /**
65
63
  * Derive this package's installed root from the running module's OWN path using
66
64
  * STRING operations only — no `readFileSync`, `realpathSync`, or `existsSync`.
@@ -170,7 +170,7 @@ export function createPackageRootResolver(options) {
170
170
  };
171
171
  }
172
172
  const currentModulePath = fileURLToPath(import.meta.url);
173
- let defaultPackageRootResolver = createPackageRootResolver({
173
+ const defaultPackageRootResolver = createPackageRootResolver({
174
174
  moduleDir: path.dirname(currentModulePath),
175
175
  modulePath: currentModulePath,
176
176
  });
@@ -184,13 +184,6 @@ let defaultPackageRootResolver = createPackageRootResolver({
184
184
  export function packageRoot() {
185
185
  return defaultPackageRootResolver();
186
186
  }
187
- /** Reset the memoized package root. Tests only. */
188
- export function __resetPackageRootCache() {
189
- defaultPackageRootResolver = createPackageRootResolver({
190
- moduleDir: path.dirname(currentModulePath),
191
- modulePath: currentModulePath,
192
- });
193
- }
194
187
  /**
195
188
  * The trailing path segments that mark an installed copy of this package:
196
189
  * `node_modules` followed by the package name's own segments (for
@@ -11,7 +11,7 @@ export declare const INCOMPLETE_INSTALL_REMEDY: string;
11
11
  /** A resolver for the running install's root; returns null instead of throwing. */
12
12
  export type PackageRootResolver = () => string | null;
13
13
  /** Which strategy produced the running install's root, recorded in diagnostics. */
14
- export type PackageRootResolverSource = "manifest-walk" | "string-derivation" | "unresolved" | "injected";
14
+ type PackageRootResolverSource = "manifest-walk" | "string-derivation" | "unresolved" | "injected";
15
15
  /**
16
16
  * If `err` is an in-process incomplete-install module-load failure — the CJS
17
17
  * relative-sibling shape (HQ-CLI-1N), the ESM vanished-at-read shape (HQ-CLI-1M),
@@ -30,7 +30,7 @@ export declare function incompleteInstallMessage(err: unknown, resolvePackageRoo
30
30
  * whose `path` did not survive delivery — the esm-loader open shape (HQ-CLI-1M) or
31
31
  * the resolve-time lstat shape (HQ-CLI-1S). The two frame booleans say which.
32
32
  */
33
- export type IncompleteInstallEsmDiagnostics = {
33
+ type IncompleteInstallEsmDiagnostics = {
34
34
  /** The resolved install root, or the literal `<unresolved>` when none was found. */
35
35
  packageRoot: string;
36
36
  /** True only when a root was actually resolved (by any strategy). */
@@ -62,7 +62,7 @@ export type IncompleteInstallEsmDiagnostics = {
62
62
  * the closed error name and the bounded package name are recorded; never the
63
63
  * message, argv, or a full path.
64
64
  */
65
- export type IncompleteInstallEvalThrowDiagnostics = {
65
+ type IncompleteInstallEvalThrowDiagnostics = {
66
66
  evalThrow: true;
67
67
  errorName: string;
68
68
  throwSitePackage: string;
@@ -77,13 +77,13 @@ export type IncompleteInstallEvalThrowDiagnostics = {
77
77
  * the requirer's own manifest did NOT declare it. Both names live inside
78
78
  * hq-cli's dependency graph, so grouping cardinality stays bounded.
79
79
  */
80
- export type IncompleteInstallBareDiagnostics = {
80
+ type IncompleteInstallBareDiagnostics = {
81
81
  missingPackage: string;
82
82
  requiringPackage: string;
83
83
  requirerDeclaresMissing: false;
84
84
  };
85
85
  /** The four lexical scopes a NOT-suppressed CJS relative requirer can fall into. */
86
- export type RelativeRequirerScope = "dist" | "assets" | "outside-root" | "unresolved-root";
86
+ type RelativeRequirerScope = "dist" | "assets" | "outside-root" | "unresolved-root";
87
87
  /**
88
88
  * Bounded, scrubber-safe diagnostics for a NOT-suppressed CJS RELATIVE-specifier
89
89
  * miss (HQ-CLI-1N): the CJS relative-sibling shape that reached the capture path
@@ -93,7 +93,7 @@ export type RelativeRequirerScope = "dist" | "assets" | "outside-root" | "unreso
93
93
  * against the root — never the requirer path and never the specifier — so
94
94
  * grouping cardinality cannot inflate. `code` is always `MODULE_NOT_FOUND`.
95
95
  */
96
- export type IncompleteInstallRelativeDiagnostics = {
96
+ type IncompleteInstallRelativeDiagnostics = {
97
97
  code: string;
98
98
  relativeSpecifier: true;
99
99
  packageRoot: string;
@@ -136,4 +136,5 @@ export type IncompleteInstallDiagnostics = Partial<IncompleteInstallEsmDiagnosti
136
136
  export declare function incompleteInstallCaptureContext(err: unknown, resolvePackageRoot?: PackageRootResolver, fileSystem?: Pick<typeof fs, "existsSync"> & Partial<Pick<typeof fs, "readFileSync">>): {
137
137
  incomplete_install: IncompleteInstallDiagnostics;
138
138
  } | undefined;
139
+ export {};
139
140
  //# sourceMappingURL=incomplete-install-error.d.ts.map
@@ -18,16 +18,6 @@ export interface LargeFileGuardOptions {
18
18
  /** Bypass the throttle. */
19
19
  force?: boolean;
20
20
  }
21
- /**
22
- * Render a repo-relative path as a literal `.gitignore` pattern.
23
- *
24
- * The leading slash anchors it to the repo root — without it a bare filename
25
- * would also ignore same-named files in every subdirectory. Glob and
26
- * character-class metacharacters are escaped so the rule matches the one real
27
- * path and nothing else, and a trailing space is escaped because git strips
28
- * unescaped ones.
29
- */
30
- export declare function toGitignorePattern(relPath: string): string;
31
21
  /**
32
22
  * Scan `hqRoot` for files above the size limit, ignore them, and drop any that
33
23
  * are already in the index.
@@ -177,7 +177,7 @@ function oversizedInWorktree(hqRoot, threshold) {
177
177
  * path and nothing else, and a trailing space is escaped because git strips
178
178
  * unescaped ones.
179
179
  */
180
- export function toGitignorePattern(relPath) {
180
+ function toGitignorePattern(relPath) {
181
181
  const escaped = relPath.replace(/([\\*?[\]!#])/g, "\\$1");
182
182
  const anchored = `/${escaped}`;
183
183
  return anchored.endsWith(" ") ? `${anchored.slice(0, -1)}\\ ` : anchored;
@@ -6,7 +6,7 @@
6
6
  * so a malformed install cannot turn an error report into an unbounded or
7
7
  * multi-line payload.
8
8
  */
9
- export type PackageRootVisitOutcome = "no-manifest" | "eacces" | "eisdir" | "parse-error" | "name-mismatch" | "read-error" | "omitted";
9
+ type PackageRootVisitOutcome = "no-manifest" | "eacces" | "eisdir" | "parse-error" | "name-mismatch" | "read-error" | "omitted";
10
10
  export type PackageRootVisit = {
11
11
  directory: string;
12
12
  outcome: PackageRootVisitOutcome;
@@ -64,7 +64,7 @@ import { type RestartDaemonResult } from "../lib/mesh/live/daemon/install.js";
64
64
  * One update + one re-exec per user invocation, ever.
65
65
  */
66
66
  export declare const REEXEC_GUARD_ENV = "HQ_RESCUE_SELF_UPDATED";
67
- export type SelfUpdateAction =
67
+ type SelfUpdateAction =
68
68
  /** Opted out, guard set, lock held elsewhere, or latest unknown — nothing attempted. */
69
69
  "skipped"
70
70
  /** Already at (or ahead of) npm latest. */
@@ -200,4 +200,5 @@ export declare function selfUpdateAndReexec(argv: readonly string[], deps?: Self
200
200
  * outcome the daemon restarts itself onto the new version.
201
201
  */
202
202
  export declare function daemonSelfUpdate(deps?: SelfUpdateDeps): Promise<SelfUpdateOutcome>;
203
+ export {};
203
204
  //# sourceMappingURL=self-update.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigoai-us/hq-cli",
3
- "version": "5.312.0",
3
+ "version": "5.312.2-beta.0",
4
4
  "description": "HQ by Indigo management CLI — modules and cloud sync",
5
5
  "main": "dist/index.js",
6
6
  "bin": {