@indigoai-us/hq-cli 5.256.0 → 5.258.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,29 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.258.0] — 2026-09-28
6
+
7
+ ### Fixed
8
+
9
+ - Envelope repair runs through the currently installed CLI so a long-lived
10
+ watcher cannot use stale worker-profile validation.
11
+ - Updated the external-agent CLI guide to match the kit services, probe checks,
12
+ shipped skills, and MCP tools.
13
+ - Fixed the Docker agent-kit launcher to supervise configured services through
14
+ `hq agent kit run all`.
15
+ - `hq packages list` and `hq packs list` return an error when run outside an HQ tree.
16
+ - `hq index collections` prints a summary when no collections are expected or registered.
17
+
18
+ ## [5.257.0] — 2026-09-28
19
+
20
+ ### Added
21
+
22
+ - Add `hq lanes hold` to record company-scoped repository merge holds and
23
+ refuse recognized merge commands while the `lanes.repo-merge-hold` gate is
24
+ enabled. Hold history and release reasons stay in the local record. Checks
25
+ fail open with a named error when they cannot parse a command or read a hold,
26
+ and recognize pull-request URLs plus assignment, `env`, and `timeout` forms.
27
+
5
28
  ## [5.256.0] — 2026-09-28
6
29
 
7
30
  ## [5.255.0] — 2026-09-28
@@ -7375,6 +7375,102 @@ export declare const COMMAND_CATALOG: readonly [{
7375
7375
  readonly description: "Emit JSON instead of the team page text";
7376
7376
  }];
7377
7377
  readonly subcommands: readonly [];
7378
+ }, {
7379
+ readonly name: "hold";
7380
+ readonly description: "Set and enforce repository merge holds";
7381
+ readonly aliases: readonly [];
7382
+ readonly hidden: false;
7383
+ readonly usage: "[options] [command]";
7384
+ readonly arguments: readonly [];
7385
+ readonly options: readonly [];
7386
+ readonly subcommands: readonly [{
7387
+ readonly name: "set";
7388
+ readonly description: "Set or replace a repository merge hold";
7389
+ readonly aliases: readonly [];
7390
+ readonly hidden: false;
7391
+ readonly usage: "[options] <repo>";
7392
+ readonly arguments: readonly [{
7393
+ readonly name: "repo";
7394
+ readonly required: true;
7395
+ readonly variadic: false;
7396
+ }];
7397
+ readonly options: readonly [{
7398
+ readonly flags: "--company <slug>";
7399
+ readonly description: "Company that owns this repository hold";
7400
+ }, {
7401
+ readonly flags: "--reason <text>";
7402
+ readonly description: "Why merges are held";
7403
+ }, {
7404
+ readonly flags: "--until <time>";
7405
+ readonly description: "Expiry as an ISO timestamp or duration such as 4h";
7406
+ }, {
7407
+ readonly flags: "--json";
7408
+ readonly description: "JSON on stdout (always)";
7409
+ }];
7410
+ readonly subcommands: readonly [];
7411
+ }, {
7412
+ readonly name: "list";
7413
+ readonly description: "List active and expired repository merge holds";
7414
+ readonly aliases: readonly [];
7415
+ readonly hidden: false;
7416
+ readonly usage: "[options]";
7417
+ readonly arguments: readonly [];
7418
+ readonly options: readonly [{
7419
+ readonly flags: "--json";
7420
+ readonly description: "Print JSON";
7421
+ }];
7422
+ readonly subcommands: readonly [];
7423
+ }, {
7424
+ readonly name: "show";
7425
+ readonly description: "Show a repository merge hold";
7426
+ readonly aliases: readonly [];
7427
+ readonly hidden: false;
7428
+ readonly usage: "[options] <repo>";
7429
+ readonly arguments: readonly [{
7430
+ readonly name: "repo";
7431
+ readonly required: true;
7432
+ readonly variadic: false;
7433
+ }];
7434
+ readonly options: readonly [{
7435
+ readonly flags: "--json";
7436
+ readonly description: "JSON on stdout (always)";
7437
+ }];
7438
+ readonly subcommands: readonly [];
7439
+ }, {
7440
+ readonly name: "release";
7441
+ readonly description: "Release an existing repository merge hold";
7442
+ readonly aliases: readonly [];
7443
+ readonly hidden: false;
7444
+ readonly usage: "[options] <repo>";
7445
+ readonly arguments: readonly [{
7446
+ readonly name: "repo";
7447
+ readonly required: true;
7448
+ readonly variadic: false;
7449
+ }];
7450
+ readonly options: readonly [{
7451
+ readonly flags: "--reason <text>";
7452
+ readonly description: "Why the hold is being released";
7453
+ }, {
7454
+ readonly flags: "--json";
7455
+ readonly description: "JSON on stdout (always)";
7456
+ }];
7457
+ readonly subcommands: readonly [];
7458
+ }, {
7459
+ readonly name: "check";
7460
+ readonly description: "Refuse merge commands targeting an actively held repository";
7461
+ readonly aliases: readonly [];
7462
+ readonly hidden: false;
7463
+ readonly usage: "[options]";
7464
+ readonly arguments: readonly [];
7465
+ readonly options: readonly [{
7466
+ readonly flags: "--command <shell-command>";
7467
+ readonly description: "Command to inspect without executing it";
7468
+ }, {
7469
+ readonly flags: "--json";
7470
+ readonly description: "Print JSON";
7471
+ }];
7472
+ readonly subcommands: readonly [];
7473
+ }];
7378
7474
  }, {
7379
7475
  readonly name: "outpost-pruner";
7380
7476
  readonly description: "Inspect, install, and run safe outpost worktree pruning";
@@ -8084,6 +8180,18 @@ export declare const COMMAND_CATALOG: readonly [{
8084
8180
  readonly description: "JSON on stdout (always)";
8085
8181
  }];
8086
8182
  readonly subcommands: readonly [];
8183
+ }, {
8184
+ readonly name: "_spawn-envelope-repair";
8185
+ readonly description: "";
8186
+ readonly aliases: readonly [];
8187
+ readonly hidden: true;
8188
+ readonly usage: "[options]";
8189
+ readonly arguments: readonly [];
8190
+ readonly options: readonly [{
8191
+ readonly flags: "--json";
8192
+ readonly description: "JSON on stdout (always)";
8193
+ }];
8194
+ readonly subcommands: readonly [];
8087
8195
  }, {
8088
8196
  readonly name: "_monitor-message";
8089
8197
  readonly description: "";
@@ -9534,6 +9534,130 @@ export const COMMAND_CATALOG = [
9534
9534
  ],
9535
9535
  "subcommands": []
9536
9536
  },
9537
+ {
9538
+ "name": "hold",
9539
+ "description": "Set and enforce repository merge holds",
9540
+ "aliases": [],
9541
+ "hidden": false,
9542
+ "usage": "[options] [command]",
9543
+ "arguments": [],
9544
+ "options": [],
9545
+ "subcommands": [
9546
+ {
9547
+ "name": "set",
9548
+ "description": "Set or replace a repository merge hold",
9549
+ "aliases": [],
9550
+ "hidden": false,
9551
+ "usage": "[options] <repo>",
9552
+ "arguments": [
9553
+ {
9554
+ "name": "repo",
9555
+ "required": true,
9556
+ "variadic": false
9557
+ }
9558
+ ],
9559
+ "options": [
9560
+ {
9561
+ "flags": "--company <slug>",
9562
+ "description": "Company that owns this repository hold"
9563
+ },
9564
+ {
9565
+ "flags": "--reason <text>",
9566
+ "description": "Why merges are held"
9567
+ },
9568
+ {
9569
+ "flags": "--until <time>",
9570
+ "description": "Expiry as an ISO timestamp or duration such as 4h"
9571
+ },
9572
+ {
9573
+ "flags": "--json",
9574
+ "description": "JSON on stdout (always)"
9575
+ }
9576
+ ],
9577
+ "subcommands": []
9578
+ },
9579
+ {
9580
+ "name": "list",
9581
+ "description": "List active and expired repository merge holds",
9582
+ "aliases": [],
9583
+ "hidden": false,
9584
+ "usage": "[options]",
9585
+ "arguments": [],
9586
+ "options": [
9587
+ {
9588
+ "flags": "--json",
9589
+ "description": "Print JSON"
9590
+ }
9591
+ ],
9592
+ "subcommands": []
9593
+ },
9594
+ {
9595
+ "name": "show",
9596
+ "description": "Show a repository merge hold",
9597
+ "aliases": [],
9598
+ "hidden": false,
9599
+ "usage": "[options] <repo>",
9600
+ "arguments": [
9601
+ {
9602
+ "name": "repo",
9603
+ "required": true,
9604
+ "variadic": false
9605
+ }
9606
+ ],
9607
+ "options": [
9608
+ {
9609
+ "flags": "--json",
9610
+ "description": "JSON on stdout (always)"
9611
+ }
9612
+ ],
9613
+ "subcommands": []
9614
+ },
9615
+ {
9616
+ "name": "release",
9617
+ "description": "Release an existing repository merge hold",
9618
+ "aliases": [],
9619
+ "hidden": false,
9620
+ "usage": "[options] <repo>",
9621
+ "arguments": [
9622
+ {
9623
+ "name": "repo",
9624
+ "required": true,
9625
+ "variadic": false
9626
+ }
9627
+ ],
9628
+ "options": [
9629
+ {
9630
+ "flags": "--reason <text>",
9631
+ "description": "Why the hold is being released"
9632
+ },
9633
+ {
9634
+ "flags": "--json",
9635
+ "description": "JSON on stdout (always)"
9636
+ }
9637
+ ],
9638
+ "subcommands": []
9639
+ },
9640
+ {
9641
+ "name": "check",
9642
+ "description": "Refuse merge commands targeting an actively held repository",
9643
+ "aliases": [],
9644
+ "hidden": false,
9645
+ "usage": "[options]",
9646
+ "arguments": [],
9647
+ "options": [
9648
+ {
9649
+ "flags": "--command <shell-command>",
9650
+ "description": "Command to inspect without executing it"
9651
+ },
9652
+ {
9653
+ "flags": "--json",
9654
+ "description": "Print JSON"
9655
+ }
9656
+ ],
9657
+ "subcommands": []
9658
+ }
9659
+ ]
9660
+ },
9537
9661
  {
9538
9662
  "name": "outpost-pruner",
9539
9663
  "description": "Inspect, install, and run safe outpost worktree pruning",
@@ -10457,6 +10581,21 @@ export const COMMAND_CATALOG = [
10457
10581
  ],
10458
10582
  "subcommands": []
10459
10583
  },
10584
+ {
10585
+ "name": "_spawn-envelope-repair",
10586
+ "description": "",
10587
+ "aliases": [],
10588
+ "hidden": true,
10589
+ "usage": "[options]",
10590
+ "arguments": [],
10591
+ "options": [
10592
+ {
10593
+ "flags": "--json",
10594
+ "description": "JSON on stdout (always)"
10595
+ }
10596
+ ],
10597
+ "subcommands": []
10598
+ },
10460
10599
  {
10461
10600
  "name": "_monitor-message",
10462
10601
  "description": "",
@@ -4,13 +4,15 @@
4
4
  *
5
5
  * sync company vault pull loop → component-sync
6
6
  * inbox inbox poller (mirror + optional ack) → component-inbox
7
- * heartbeat 60 s POST /v1/agents/{uid}/heartbeat with the three above
7
+ * heartbeat 60 s POST /v1/agents/{uid}/heartbeat with enabled component status
8
8
  *
9
- * `install` renders one user-level unit per service (LaunchAgent on macOS,
10
- * systemd --user on Linux), each of which just runs
11
- * `node hq agent kit run <service>`; the Docker image runs the same four
12
- * commands. Hosts where the service manager is unusable (no systemd user
13
- * session bus, permission refused, launchd unavailable) fall back to one
9
+ * `install` renders one user-level unit per enabled service (LaunchAgent on
10
+ * macOS, systemd --user on Linux), each of which just runs
11
+ * `node hq agent kit run <service>`. The Docker entrypoint runs
12
+ * `hq agent kit run all`, which supervises the services enabled in kit.json,
13
+ * including sync only when file mirroring is configured. Hosts where the
14
+ * service manager is unusable, such as a missing systemd user session bus or
15
+ * unavailable launchd, fall back to one
14
16
  * detached `hq agent kit run all` supervisor (pid in ~/.hq-agent/kit.pid,
15
17
  * output in ~/.hq-agent/logs/kit.log). Logs: ~/.hq-agent/logs/<service>.log. Skills:
16
18
  * ~/.hq-agent/skills/<name>/SKILL.md.
@@ -4,13 +4,15 @@
4
4
  *
5
5
  * sync company vault pull loop → component-sync
6
6
  * inbox inbox poller (mirror + optional ack) → component-inbox
7
- * heartbeat 60 s POST /v1/agents/{uid}/heartbeat with the three above
7
+ * heartbeat 60 s POST /v1/agents/{uid}/heartbeat with enabled component status
8
8
  *
9
- * `install` renders one user-level unit per service (LaunchAgent on macOS,
10
- * systemd --user on Linux), each of which just runs
11
- * `node hq agent kit run <service>`; the Docker image runs the same four
12
- * commands. Hosts where the service manager is unusable (no systemd user
13
- * session bus, permission refused, launchd unavailable) fall back to one
9
+ * `install` renders one user-level unit per enabled service (LaunchAgent on
10
+ * macOS, systemd --user on Linux), each of which just runs
11
+ * `node hq agent kit run <service>`. The Docker entrypoint runs
12
+ * `hq agent kit run all`, which supervises the services enabled in kit.json,
13
+ * including sync only when file mirroring is configured. Hosts where the
14
+ * service manager is unusable, such as a missing systemd user session bus or
15
+ * unavailable launchd, fall back to one
14
16
  * detached `hq agent kit run all` supervisor (pid in ~/.hq-agent/kit.pid,
15
17
  * output in ~/.hq-agent/logs/kit.log). Logs: ~/.hq-agent/logs/<service>.log. Skills:
16
18
  * ~/.hq-agent/skills/<name>/SKILL.md.
@@ -131,7 +131,11 @@ export function registerIndexCommand(program, dependencies = defaults) {
131
131
  .action((options) => {
132
132
  const hqRoot = resolveRoot(options.hqRoot);
133
133
  const registered = dependencies.listRegisteredCollections(hqRoot);
134
- for (const line of collectionStatusLines(dependencies.deriveCollections(hqRoot), registered))
134
+ const expected = dependencies.deriveCollections(hqRoot);
135
+ const lines = collectionStatusLines(expected, registered);
136
+ if (lines.length === 0)
137
+ console.log(collectionSummary(expected, registered));
138
+ for (const line of lines)
135
139
  console.log(line);
136
140
  });
137
141
  index
@@ -0,0 +1,41 @@
1
+ import type { Command } from "commander";
2
+ import type { LaneCompanyRef } from "../lib/lanes/types.js";
3
+ export declare const LANES_REPO_MERGE_HOLD_FLAG = "lanes.repo-merge-hold";
4
+ export declare const REPO_MERGE_HOLDS_REL: string;
5
+ declare const HOLD_SCHEMA_VERSION = "hq-lanes-repo-merge-hold.v1";
6
+ interface HoldHistoryEntry {
7
+ set_at: string;
8
+ until: string;
9
+ reason: string;
10
+ set_by_lane: string | null;
11
+ set_by_session: string | null;
12
+ released_at?: string;
13
+ released_reason?: string;
14
+ }
15
+ export interface RepoMergeHold {
16
+ schema_version: typeof HOLD_SCHEMA_VERSION;
17
+ repo: string;
18
+ company: LaneCompanyRef;
19
+ reason: string;
20
+ set_at: string;
21
+ until: string;
22
+ set_by_lane: string | null;
23
+ set_by_session: string | null;
24
+ released_at?: string;
25
+ released_reason?: string;
26
+ history: HoldHistoryEntry[];
27
+ }
28
+ export interface LaneRepoMergeHoldDeps {
29
+ hqRoot: () => string;
30
+ resolveCompany: (company?: string) => Promise<LaneCompanyRef>;
31
+ now: () => Date;
32
+ env: NodeJS.ProcessEnv;
33
+ mergeHoldEnabled?: (company: LaneCompanyRef) => boolean | Promise<boolean>;
34
+ }
35
+ type WrapHandler = <Args extends unknown[]>(action: (...args: Args) => Promise<void>) => (...args: Args) => Promise<void>;
36
+ export declare function repoMergeHoldPath(hqRoot: string, repo: string): string;
37
+ /** Serialize the read-modify-write cycle so concurrent set/release calls cannot overwrite each other. */
38
+ export declare function withRepoMergeHoldRecordLock<T>(recordPath: string, action: () => T | Promise<T>): Promise<T>;
39
+ export declare function registerLaneRepoMergeHoldCommand(lanes: Command, deps: LaneRepoMergeHoldDeps, wrap: WrapHandler): void;
40
+ export {};
41
+ //# sourceMappingURL=lanes-hold.d.ts.map