@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 +23 -0
- package/dist/command-catalog.generated.d.ts +108 -0
- package/dist/command-catalog.generated.js +139 -0
- package/dist/commands/agent-kit.d.ts +8 -6
- package/dist/commands/agent-kit.js +8 -6
- package/dist/commands/index-cmd.js +5 -1
- package/dist/commands/lanes-hold.d.ts +41 -0
- package/dist/commands/lanes-hold.js +805 -0
- package/dist/commands/lanes.js +30 -1
- package/dist/commands/packs.js +11 -1
- package/dist/commands/reindex.js +6 -5
- package/dist/lib/agent-kit/paths.d.ts +1 -1
- package/dist/lib/agent-kit/paths.js +1 -1
- package/dist/lib/agent-kit/run/heartbeat.d.ts +4 -6
- package/dist/lib/agent-kit/run/heartbeat.js +4 -6
- package/dist/lib/lanes/envelope-repair-dispatch.d.ts +26 -0
- package/dist/lib/lanes/envelope-repair-dispatch.js +74 -0
- package/dist/lib/lanes/registry-flag.d.ts +1 -0
- package/dist/lib/lanes/registry-flag.js +4 -1
- package/dist/lib/lanes/spawn.d.ts +12 -0
- package/dist/lib/lanes/spawn.js +87 -0
- package/dist/lib/lanes/watcher-main.d.ts +3 -1
- package/dist/lib/lanes/watcher-main.js +27 -17
- package/package.json +1 -1
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
|
|
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
|
|
10
|
-
* systemd --user on Linux), each of which just runs
|
|
11
|
-
* `node hq agent kit run <service
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
|
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
|
|
10
|
-
* systemd --user on Linux), each of which just runs
|
|
11
|
-
* `node hq agent kit run <service
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
-
|
|
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
|