@indigoai-us/hq-cli 5.255.0 → 5.257.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,18 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.257.0] — 2026-09-28
6
+
7
+ ### Added
8
+
9
+ - Add `hq lanes hold` to record company-scoped repository merge holds and
10
+ refuse recognized merge commands while the `lanes.repo-merge-hold` gate is
11
+ enabled. Hold history and release reasons stay in the local record. Checks
12
+ fail open with a named error when they cannot parse a command or read a hold,
13
+ and recognize pull-request URLs plus assignment, `env`, and `timeout` forms.
14
+
15
+ ## [5.256.0] — 2026-09-28
16
+
5
17
  ## [5.255.0] — 2026-09-28
6
18
 
7
19
  ### Changed
@@ -26,6 +38,7 @@
26
38
  - `hq db sql --remote` is hidden because remote SQL is not available in this
27
39
  CLI build. Existing scripts get a clear error, and local SQL remains
28
40
  available without `--remote`.
41
+ - `hq secrets` and `hq run` now use cached secrets during a temporary server outage, up to each secret’s configured cache lifetime. The default is three hours; revoked and high-security secrets still fail closed.
29
42
 
30
43
  ## [5.253.0] — 2026-09-27
31
44
 
@@ -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";
@@ -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",
@@ -350,7 +350,9 @@ export function registerImportCommands(integrations) {
350
350
  }
351
351
  const secretNames = [...Object.values({ ...(manifest.env ?? {}), ...(manifest.headers ?? {}) }), ...(manifest.args ?? [])]
352
352
  .flatMap((value) => [...value.matchAll(/\$\{secret:([A-Z][A-Z0-9_]*(?:\/[A-Z][A-Z0-9_]*)*)\}/g)].map((match) => match[1]));
353
- const secrets = await loadRevealedSecrets(token, companyUid, secretNames);
353
+ const secrets = await loadRevealedSecrets(token, companyUid, secretNames, undefined, {
354
+ allowOfflineFallback: false,
355
+ });
354
356
  const result = registerServer({
355
357
  name: safeName,
356
358
  manifest,
@@ -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