@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 +4 -0
- package/dist/commands/cloud.js +1 -0
- package/dist/commands/core-checkpoint-stop-gate-native.js +12 -0
- package/dist/lib/agents/model-catalog.d.ts +3 -2
- package/dist/lib/company-skill-wrapper.d.ts +0 -8
- package/dist/lib/core-utils/codex-skill-bridge.d.ts +2 -1
- package/dist/lib/deploy-api.d.ts +0 -1
- package/dist/lib/deploy-api.js +1 -1
- package/dist/lib/report-run.d.ts +3 -2
- package/dist/lib/report-templates.d.ts +0 -1
- package/dist/lib/report-templates.js +0 -3
- package/dist/lib/scaffold-cli-floor.d.ts +0 -1
- package/dist/lib/scaffold-cli-floor.js +1 -1
- package/dist/run/discover-schemas.d.ts +2 -1
- package/dist/utils/hq-roots.d.ts +0 -2
- package/dist/utils/hq-roots.js +1 -8
- package/dist/utils/incomplete-install-error.d.ts +7 -6
- package/dist/utils/large-file-guard.d.ts +0 -10
- package/dist/utils/large-file-guard.js +1 -1
- package/dist/utils/package-root-diagnostics.d.ts +1 -1
- package/dist/utils/self-update.d.ts +2 -1
- package/package.json +1 -1
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.
|
package/dist/commands/cloud.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
package/dist/lib/deploy-api.d.ts
CHANGED
|
@@ -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
|
package/dist/lib/deploy-api.js
CHANGED
|
@@ -8,7 +8,7 @@ export function deployHeaders(token, json = true, extra = {}) {
|
|
|
8
8
|
...extra,
|
|
9
9
|
};
|
|
10
10
|
}
|
|
11
|
-
|
|
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 = {}) {
|
package/dist/lib/report-run.d.ts
CHANGED
|
@@ -8,12 +8,12 @@ export type DigestSignal = {
|
|
|
8
8
|
kind: string;
|
|
9
9
|
text: string;
|
|
10
10
|
};
|
|
11
|
-
|
|
11
|
+
type FocusItem = {
|
|
12
12
|
title: string;
|
|
13
13
|
project: string;
|
|
14
14
|
reason: string;
|
|
15
15
|
};
|
|
16
|
-
|
|
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,5 +1,5 @@
|
|
|
1
1
|
import semver from "semver";
|
|
2
|
-
|
|
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
|
-
|
|
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
|
package/dist/utils/hq-roots.d.ts
CHANGED
|
@@ -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`.
|
package/dist/utils/hq-roots.js
CHANGED
|
@@ -170,7 +170,7 @@ export function createPackageRootResolver(options) {
|
|
|
170
170
|
};
|
|
171
171
|
}
|
|
172
172
|
const currentModulePath = fileURLToPath(import.meta.url);
|
|
173
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|