@indigoai-us/hq-cli 5.345.24 → 5.345.26

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/assets/scaffold/core/scripts/ontology-source-worklist.sh +12 -2
  3. package/dist/command-catalog.generated.d.ts +50 -0
  4. package/dist/command-catalog.generated.js +62 -0
  5. package/dist/commands/core-ontology-native.js +100 -16
  6. package/dist/commands/core-ontology-readme-drift-fast.d.ts +2 -0
  7. package/dist/commands/core-ontology-readme-drift-fast.js +5 -0
  8. package/dist/commands/core-qmd-reindex-after-sync-fast.d.ts +3 -0
  9. package/dist/commands/core-qmd-reindex-after-sync-fast.js +26 -0
  10. package/dist/commands/core-register-project-native.js +80 -8
  11. package/dist/commands/core.js +17 -2
  12. package/dist/commands/index-cmd.js +2 -1
  13. package/dist/commands/install-global.js +19 -4
  14. package/dist/commands/integrations-core.d.ts +4 -0
  15. package/dist/commands/integrations-core.js +15 -3
  16. package/dist/commands/lanes.js +180 -28
  17. package/dist/fast-scaffold.js +19 -0
  18. package/dist/lib/core-utils/qmd-reindex-after-sync.d.ts +1 -0
  19. package/dist/lib/core-utils/qmd-reindex-after-sync.js +4 -10
  20. package/dist/lib/lanes/grants.d.ts +0 -1
  21. package/dist/lib/lanes/grants.js +3 -6
  22. package/dist/lib/lanes/index.d.ts +2 -2
  23. package/dist/lib/lanes/index.js +2 -2
  24. package/dist/lib/lanes/keep-alive-audit.d.ts +5 -0
  25. package/dist/lib/lanes/keep-alive-audit.js +15 -1
  26. package/dist/lib/lanes/outpost-dispatch.d.ts +2 -1
  27. package/dist/lib/lanes/outpost-dispatch.js +1 -0
  28. package/dist/lib/lanes/store.js +33 -0
  29. package/dist/lib/lanes/story-ledger.d.ts +2 -0
  30. package/dist/lib/lanes/story-ledger.js +33 -0
  31. package/dist/lib/lanes/types.d.ts +10 -0
  32. package/dist/lib/lanes/types.js +1 -1
  33. package/dist/lib/search-index/background.js +2 -1
  34. package/dist/lib/search-index/collection-path-repair-flag-constants.d.ts +2 -0
  35. package/dist/lib/search-index/collection-path-repair-flag-constants.js +2 -0
  36. package/dist/lib/search-index/collection-path-repair-flag.d.ts +1 -1
  37. package/dist/lib/search-index/collection-path-repair-flag.js +2 -1
  38. package/dist/lib/search-index/index.js +1 -2
  39. package/dist/lib/search-index/reindex-single-flight-flag-constants.d.ts +3 -0
  40. package/dist/lib/search-index/reindex-single-flight-flag-constants.js +3 -0
  41. package/dist/lib/search-index/reindex-single-flight-flag.d.ts +1 -2
  42. package/dist/lib/search-index/reindex-single-flight-flag.js +2 -2
  43. package/dist/main.js +4 -1
  44. package/dist/utils/install-tree-torn.d.ts +7 -7
  45. package/dist/utils/install-tree-torn.js +10 -7
  46. package/package.json +1 -1
@@ -784,6 +784,25 @@ export function parseLaneRecord(raw, filePath) {
784
784
  }
785
785
  }
786
786
  parseOptionalCompanyField(raw, filePath);
787
+ if (raw.company_history !== undefined) {
788
+ if (!Array.isArray(raw.company_history) || raw.company_history.length > HISTORY_CAP) {
789
+ throw new LaneSchemaError(`company_history must be an array capped at ${HISTORY_CAP} entries`, {
790
+ path: filePath,
791
+ field: "company_history",
792
+ });
793
+ }
794
+ for (const [index, entry] of raw.company_history.entries()) {
795
+ const field = `company_history[${index}]`;
796
+ if (!isPlainObject(entry) || Object.keys(entry).some((key) => !["from", "to", "at", "by", "reason"].includes(key)) ||
797
+ entry.from !== null || entry.reason !== "repair_company" || !isPlainObject(entry.to)) {
798
+ throw new LaneSchemaError(`${field} must be a company repair audit entry`, { path: filePath, field });
799
+ }
800
+ requireString(entry.to.slug, `${field}.to.slug`);
801
+ requireString(entry.to.uid, `${field}.to.uid`);
802
+ requireString(entry.by, `${field}.by`);
803
+ requireTimestamp(entry.at, `${field}.at`, filePath);
804
+ }
805
+ }
787
806
  parseOptionalMeshCompanyField(raw, filePath);
788
807
  if (!isPlainObject(raw.senior)) {
789
808
  throw new LaneSchemaError("senior must be an object", { path: filePath });
@@ -1242,9 +1261,23 @@ export function mergeLaneRecords(live, sidecars) {
1242
1261
  return live;
1243
1262
  const all = [live, ...sidecars];
1244
1263
  const base = higherVersionRecord(live, sidecars);
1264
+ const attributedCompanies = all.filter((record) => record.company !== null).map((record) => record.company);
1265
+ const conflictingCompanies = attributedCompanies.some((company, index) => attributedCompanies.slice(index + 1).some((other) => company.uid && other.uid
1266
+ ? company.uid !== other.uid
1267
+ : Boolean(company.slug && other.slug && company.slug !== other.slug)));
1268
+ if (conflictingCompanies) {
1269
+ throw new LaneSchemaError("Conflicting company attribution in lane record sidecars", { lane_id: live.lane_id });
1270
+ }
1271
+ const company = base.company ?? attributedCompanies[0] ?? null;
1245
1272
  return {
1246
1273
  ...base,
1274
+ company,
1247
1275
  senior_history: unionHistory(all.map((record) => record.senior_history), entryIdentity, base.senior_history),
1276
+ ...(all.some((record) => record.company_history !== undefined)
1277
+ ? {
1278
+ company_history: unionHistory(all.map((record) => record.company_history ?? []), entryIdentity, base.company_history ?? []),
1279
+ }
1280
+ : {}),
1248
1281
  attribution_history: unionHistory(all.map((record) => record.attribution_history), attributionIdentity, base.attribution_history),
1249
1282
  ...(all.some((record) => record.account_history !== undefined)
1250
1283
  ? {
@@ -64,6 +64,8 @@ export declare function laneStoryLedgerEnabled(): boolean;
64
64
  export declare function resolveProjectStoryLedger(hqRoot: string, projectId: string, companySlug?: string): ProjectStoryLedger;
65
65
  export declare function validateProjectStories(hqRoot: string, projectId: string, storyIds: readonly string[], companySlug?: string): ProjectStoryLedger;
66
66
  export declare function syncLaneToProjectStoryLedger(hqRoot: string, lane: LaneRecord, questionRefs?: readonly StoryLedgerQuestionRef[], deps?: StoryLedgerWriteDeps): void;
67
+ /** Remove only this lane's attribution from its former personal story ledgers. */
68
+ export declare function removeLaneFromProjectStoryLedger(hqRoot: string, lane: LaneRecord): void;
67
69
  /** Read canonical ledger states for the story ids currently carried by a lane. */
68
70
  export declare function readProjectStoryStates(hqRoot: string, projectId: string, storyIds: readonly string[], companySlug?: string): Map<string, string>;
69
71
  export declare function buildLaneStatusSnapshot(input: {
@@ -643,6 +643,39 @@ export function syncLaneToProjectStoryLedger(hqRoot, lane, questionRefs = [], de
643
643
  }, deps);
644
644
  }
645
645
  }
646
+ /** Remove only this lane's attribution from its former personal story ledgers. */
647
+ export function removeLaneFromProjectStoryLedger(hqRoot, lane) {
648
+ if (!laneStoryLedgerEnabled())
649
+ return;
650
+ const refs = [...new Map(laneStoriesForLedger(lane).map((story) => [
651
+ story.project_id + "\u0000" + story.story_id,
652
+ { projectId: story.project_id, storyId: story.story_id },
653
+ ])).values()];
654
+ for (const ref of refs) {
655
+ const ledger = resolveProjectStoryLedger(hqRoot, ref.projectId);
656
+ if (!fs.existsSync(ledger.path))
657
+ continue;
658
+ updateLedgerAtomically(ledger, (current) => {
659
+ const story = current.userStories.find((item) => item.id === ref.storyId);
660
+ if (!story)
661
+ return current;
662
+ if (Array.isArray(story.lanes)) {
663
+ story.lanes = story.lanes.filter((entry) => !isJsonObject(entry) || entry.lane_id !== lane.lane_id);
664
+ }
665
+ if (Array.isArray(story.pending_questions)) {
666
+ const pendingQuestions = story.pending_questions.filter((entry) => !isJsonObject(entry) || entry.lane_id !== lane.lane_id);
667
+ if (pendingQuestions.length === 0)
668
+ delete story.pending_questions;
669
+ else
670
+ story.pending_questions = pendingQuestions;
671
+ }
672
+ if (isJsonObject(story.lane_status) && isJsonObject(story.lane_status.saved) && Array.isArray(story.lane_status.saved.pending_questions)) {
673
+ story.lane_status.saved.pending_questions = story.lane_status.saved.pending_questions.filter((entry) => !isJsonObject(entry) || entry.lane_id !== lane.lane_id);
674
+ }
675
+ return current;
676
+ });
677
+ }
678
+ }
646
679
  function storyLaneState(lane, laneStoryStatus, pendingQuestionIds) {
647
680
  if (isTerminalLaneState(lane.state))
648
681
  return lane.state;
@@ -308,6 +308,14 @@ export interface SeniorHistoryEntry {
308
308
  by: string;
309
309
  reason: string;
310
310
  }
311
+ /** Explicit repair of a legacy lane whose company attribution was missing. */
312
+ export interface CompanyHistoryEntry {
313
+ from: null;
314
+ to: LaneCompanyRef;
315
+ at: string;
316
+ by: string;
317
+ reason: "repair_company";
318
+ }
311
319
  interface LaneStopHistoryEntry {
312
320
  at: string;
313
321
  reason: string;
@@ -509,6 +517,8 @@ export interface LaneRecord {
509
517
  owner_written_by_version?: string;
510
518
  /** `null` is a core/personal lane (spec §6.2 / §10). Not an empty slug. */
511
519
  company: LaneCompanyRef | null;
520
+ /** Bounded audit history of explicit company-attribution repairs. */
521
+ company_history?: CompanyHistoryEntry[];
512
522
  /** Explicit Work Mesh attribution for a personal lane; never inferred from cwd. */
513
523
  mesh_company?: LaneCompanyRef;
514
524
  project_id: string;
@@ -224,7 +224,7 @@ export const REQUIRED_LANE_RECORD_FIELDS = [
224
224
  export const LANE_WRITERS = ["creator", "command", "watcher", "reconcile", "spawn", "story-ledger"];
225
225
  /** Field ownership at the durable-record mutation boundary (spec §10.1). */
226
226
  export const LANE_FIELD_WRITERS = {
227
- schema_version: ["creator"], lane_id: ["creator"], written_by_version: [], owner_written_by_version: [], company: ["creator"],
227
+ schema_version: ["creator"], lane_id: ["creator"], written_by_version: [], owner_written_by_version: [], company: ["creator", "command"], company_history: ["command"],
228
228
  project_id: ["command"], story_id: ["command"], no_story_reason: ["creator", "command"], ledger_sync_error: ["story-ledger"], pending_question_ids: ["story-ledger"], stories: ["creator", "command", "watcher", "reconcile", "spawn"], thread_id: ["creator", "command", "spawn"], mesh_company: ["creator", "command"],
229
229
  depth: ["command"], senior: ["command"], senior_history: ["command"],
230
230
  hire_grant: ["creator", "command"],
@@ -3,6 +3,7 @@ import * as fs from 'node:fs';
3
3
  import * as path from 'node:path';
4
4
  import { Sentry } from '../../sentry.js';
5
5
  import { reconcileCollections as defaultReconcileCollections, resolveQmdBin as defaultResolveQmdBin, runQmd as defaultRunQmd, } from './index.js';
6
+ import { qmdCollectionPathRepairEnabled } from './collection-path-repair-flag.js';
6
7
  import { applyIndexSizeLimit as defaultApplyIndexSizeLimit } from './max-doc-bytes.js';
7
8
  import { acquireEmbedLock as acquireLock, installEmbedLockCleanup, lockPath, lockRoot, lockState, releaseEmbedLock as releaseLock, } from './embed-lock.js';
8
9
  import { LoadGateConfigurationError, checkEmbedLoad, defaultLoadGateDependencies, recordSuccessfulEmbed, } from './load-gate.js';
@@ -121,7 +122,7 @@ export function defaultBackgroundDependencies(hqRoot) {
121
122
  random: () => Math.random().toString(36).slice(2),
122
123
  isProcessAlive: alive,
123
124
  resolveQmdBin: defaultResolveQmdBin,
124
- reconcileCollections: defaultReconcileCollections,
125
+ reconcileCollections: (root) => defaultReconcileCollections(root, { repairPathDrift: qmdCollectionPathRepairEnabled() }),
125
126
  applyIndexSizeLimit: defaultApplyIndexSizeLimit,
126
127
  runQmd: defaultRunQmd,
127
128
  spawnWorker: defaultSpawnWorker,
@@ -0,0 +1,2 @@
1
+ export declare const QMD_COLLECTION_PATH_REPAIR_FLAG = "qmd.collection-path-repair";
2
+ //# sourceMappingURL=collection-path-repair-flag-constants.d.ts.map
@@ -0,0 +1,2 @@
1
+ export const QMD_COLLECTION_PATH_REPAIR_FLAG = 'qmd.collection-path-repair';
2
+ //# sourceMappingURL=collection-path-repair-flag-constants.js.map
@@ -1,4 +1,4 @@
1
- export declare const QMD_COLLECTION_PATH_REPAIR_FLAG = "qmd.collection-path-repair";
1
+ export { QMD_COLLECTION_PATH_REPAIR_FLAG } from './collection-path-repair-flag-constants.js';
2
2
  /** Keep collection-path repair off unless the hq-flags registry enables a canary. */
3
3
  export declare function qmdCollectionPathRepairEnabled(): boolean;
4
4
  //# sourceMappingURL=collection-path-repair-flag.d.ts.map
@@ -1,5 +1,6 @@
1
1
  import { resolveProcessFlagGate } from '../flag-registry.js';
2
- export const QMD_COLLECTION_PATH_REPAIR_FLAG = 'qmd.collection-path-repair';
2
+ import { QMD_COLLECTION_PATH_REPAIR_FLAG } from './collection-path-repair-flag-constants.js';
3
+ export { QMD_COLLECTION_PATH_REPAIR_FLAG } from './collection-path-repair-flag-constants.js';
3
4
  /** Keep collection-path repair off unless the hq-flags registry enables a canary. */
4
5
  export function qmdCollectionPathRepairEnabled() {
5
6
  return resolveProcessFlagGate(QMD_COLLECTION_PATH_REPAIR_FLAG, { fallback: false }, () => false);
@@ -14,7 +14,6 @@ import { markExpectedUserError } from '../../utils/expected-cli-error.js';
14
14
  import { redactErrorText } from '../../utils/redact-error-text.js';
15
15
  import { planCommandSpawn } from '../../utils/windows-spawn.js';
16
16
  import { resolveQmdConfigPath } from './max-doc-bytes.js';
17
- import { qmdCollectionPathRepairEnabled } from './collection-path-repair-flag.js';
18
17
  /** The `path` implementation for a (possibly injected) platform. */
19
18
  function pathFor(platform) {
20
19
  return platform === 'win32' ? path.win32 : path.posix;
@@ -1472,7 +1471,7 @@ export function reconcileCollections(hqRoot, options = {}) {
1472
1471
  const runOptions = { bin: options.bin, runner: options.runner, cwd: hqRoot };
1473
1472
  const registered = listRegisteredCollections(hqRoot, runOptions);
1474
1473
  const expected = deriveCollections(hqRoot);
1475
- const repairPathDrift = options.repairPathDrift ?? qmdCollectionPathRepairEnabled();
1474
+ const repairPathDrift = options.repairPathDrift ?? false;
1476
1475
  const configured = repairPathDrift ? configuredCollections(hqRoot) : new Map();
1477
1476
  const stale = repairPathDrift
1478
1477
  ? expected.filter((collection) => {
@@ -0,0 +1,3 @@
1
+ export declare const QMD_REINDEX_SINGLE_FLIGHT_FLAG = "qmd.reindex-single-flight";
2
+ export declare const QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK = false;
3
+ //# sourceMappingURL=reindex-single-flight-flag-constants.d.ts.map
@@ -0,0 +1,3 @@
1
+ export const QMD_REINDEX_SINGLE_FLIGHT_FLAG = "qmd.reindex-single-flight";
2
+ export const QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK = false;
3
+ //# sourceMappingURL=reindex-single-flight-flag-constants.js.map
@@ -1,5 +1,4 @@
1
- export declare const QMD_REINDEX_SINGLE_FLIGHT_FLAG = "qmd.reindex-single-flight";
2
- export declare const QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK = false;
1
+ export { QMD_REINDEX_SINGLE_FLIGHT_FLAG, QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK } from "./reindex-single-flight-flag-constants.js";
3
2
  /** Keep whole update-to-embed passes single-flight only for explicitly enabled canaries. */
4
3
  export declare function qmdReindexSingleFlightEnabled(): boolean;
5
4
  //# sourceMappingURL=reindex-single-flight-flag.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { resolveProcessFlagGate } from "../flag-registry.js";
2
- export const QMD_REINDEX_SINGLE_FLIGHT_FLAG = "qmd.reindex-single-flight";
3
- export const QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK = false;
2
+ import { QMD_REINDEX_SINGLE_FLIGHT_FLAG, QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK } from "./reindex-single-flight-flag-constants.js";
3
+ export { QMD_REINDEX_SINGLE_FLIGHT_FLAG, QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK } from "./reindex-single-flight-flag-constants.js";
4
4
  /** Keep whole update-to-embed passes single-flight only for explicitly enabled canaries. */
5
5
  export function qmdReindexSingleFlightEnabled() {
6
6
  return resolveProcessFlagGate(QMD_REINDEX_SINGLE_FLIGHT_FLAG, { fallback: QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK }, () => QMD_REINDEX_SINGLE_FLIGHT_FLAG_FALLBACK);
package/dist/main.js CHANGED
@@ -392,9 +392,12 @@ function integrationsGatewayCaptureContext(err) {
392
392
  ? String(status)
393
393
  : status === undefined ? "unknown" : "other";
394
394
  const rpcCode = record.rpcCode;
395
+ const gatewayFailureCode = record.gatewayFailureCode;
395
396
  const codeTag = typeof rpcCode === "number" && Number.isInteger(rpcCode)
396
397
  ? GATEWAY_RPC_CODE_TAGS.get(rpcCode) ?? "other"
397
- : rpcCode === undefined ? "missing" : "other";
398
+ : gatewayFailureCode === "invalid_envelope"
399
+ ? gatewayFailureCode
400
+ : rpcCode === undefined ? "missing" : "other";
398
401
  const errorShape = record.gatewayErrorShape;
399
402
  const errorShapeTag = typeof errorShape === "string" && GATEWAY_ERROR_SHAPES.has(errorShape)
400
403
  ? errorShape
@@ -288,14 +288,14 @@ type VersionGatePhase = "preflight" | "lock_acquired" | "installer_running" | "v
288
288
  * app, the box's update timer, another `hq`) cannot make a legitimately-in-progress
289
289
  * reinstall look stale:
290
290
  * - UNLOCKED time — wall time observed with no fresh foreign lock — is bounded
291
- * by `deadlineMs`. If the target is still missing and the observable tree
291
+ * by `deadlineMs`. If the target is still missing and a fully observed tree
292
292
  * signature stays unchanged for `staleProbeMs`, the wait returns `staleTree`
293
- * early. When only a named retired npm sibling's deep scan is incomplete,
294
- * a stable partial signature ends the wait early as `retiredSiblingUnverified`
295
- * instead. That outcome preserves uncertainty and tells the user to wait for
296
- * any installer before attempting a repair. Any observed signature change
297
- * keeps the ordinary settle deadline in force. `deadlineMs === 0` evaluates
298
- * readiness once.
293
+ * early. When a named retired npm sibling's deep scan is incomplete, a stable
294
+ * partial signature is not enough to call the tree abandoned: the wait keeps
295
+ * polling until the bounded deadline, where it returns
296
+ * `retiredSiblingUnverified`. Any observed signature change also keeps the
297
+ * ordinary settle deadline in force. `deadlineMs === 0` evaluates readiness
298
+ * once.
299
299
  * - WRITER time — wall time observed under a fresh foreign lock, or while a
300
300
  * recorded foreign updater pid is alive and the tree has an in-flight signal
301
301
  * — is bounded SEPARATELY by `lockWaitMs` (default the lock contract's own
@@ -949,14 +949,14 @@ const DEFAULT_INSTALL_TREE_STALE_PROBE_MS = 1_500;
949
949
  * app, the box's update timer, another `hq`) cannot make a legitimately-in-progress
950
950
  * reinstall look stale:
951
951
  * - UNLOCKED time — wall time observed with no fresh foreign lock — is bounded
952
- * by `deadlineMs`. If the target is still missing and the observable tree
952
+ * by `deadlineMs`. If the target is still missing and a fully observed tree
953
953
  * signature stays unchanged for `staleProbeMs`, the wait returns `staleTree`
954
- * early. When only a named retired npm sibling's deep scan is incomplete,
955
- * a stable partial signature ends the wait early as `retiredSiblingUnverified`
956
- * instead. That outcome preserves uncertainty and tells the user to wait for
957
- * any installer before attempting a repair. Any observed signature change
958
- * keeps the ordinary settle deadline in force. `deadlineMs === 0` evaluates
959
- * readiness once.
954
+ * early. When a named retired npm sibling's deep scan is incomplete, a stable
955
+ * partial signature is not enough to call the tree abandoned: the wait keeps
956
+ * polling until the bounded deadline, where it returns
957
+ * `retiredSiblingUnverified`. Any observed signature change also keeps the
958
+ * ordinary settle deadline in force. `deadlineMs === 0` evaluates readiness
959
+ * once.
960
960
  * - WRITER time — wall time observed under a fresh foreign lock, or while a
961
961
  * recorded foreign updater pid is alive and the tree has an in-flight signal
962
962
  * — is bounded SEPARATELY by `lockWaitMs` (default the lock contract's own
@@ -1085,12 +1085,14 @@ export async function waitForInstallTreeSettled(args) {
1085
1085
  updaterPidAlive: updaterPidAlive(args.lockPath, fs, isPidAlive),
1086
1086
  };
1087
1087
  }
1088
+ const retiredSiblingUnverified = !lastActivitySnapshot.observed && lastActivitySnapshot.retiredSiblingPresent === true;
1088
1089
  if (!ready &&
1089
1090
  !foreignLockHeld &&
1090
1091
  !updaterPidHeld &&
1091
1092
  !retiredCheckFailed &&
1092
1093
  !sawLock &&
1093
1094
  !sawTreeChange &&
1095
+ !retiredSiblingUnverified &&
1094
1096
  staleObservationStartedAt !== null &&
1095
1097
  t - staleObservationStartedAt >= staleProbeMs) {
1096
1098
  return {
@@ -1129,6 +1131,7 @@ export async function waitForInstallTreeSettled(args) {
1129
1131
  sawTreeChange,
1130
1132
  staleTree: false,
1131
1133
  retiredSiblingPresent: retiredPresent,
1134
+ retiredSiblingUnverified: !lastActivitySnapshot.observed && lastActivitySnapshot.retiredSiblingPresent === true,
1132
1135
  retiredSiblingKind: retiredSiblingKind(args.packageRoot, fs),
1133
1136
  installTargetState: installTargetState(args.target, args.packageRoot, fs),
1134
1137
  updaterPidAlive: updaterPidAlive(args.lockPath, fs, isPidAlive),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigoai-us/hq-cli",
3
- "version": "5.345.24",
3
+ "version": "5.345.26",
4
4
  "description": "HQ by Indigo management CLI — modules and cloud sync",
5
5
  "main": "dist/index.js",
6
6
  "bin": {