@clipboard-health/groundcrew 4.46.4 → 4.46.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,QAAA,MAAM,sBAAsB,YAAI,2BAA2B,EAAE,gBAAgB,CAAU,CAAC;AAExF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAgB,mBAAmB,IAAI,oBAAoB,GAAG,SAAS,CAYtE;AAED,wBAAgB,eAAe,IAAI,YAAY,CAQ9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,YAAY,GAAG,MAAM,YAAY,CAMhF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,QAAA,MAAM,sBAAsB,YAAI,2BAA2B,EAAE,gBAAgB,CAAU,CAAC;AAExF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAgB,mBAAmB,IAAI,oBAAoB,GAAG,SAAS,CAatE;AAED,wBAAgB,eAAe,IAAI,YAAY,CAQ9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,YAAY,GAAG,MAAM,YAAY,CAMhF"}
@@ -4,6 +4,7 @@ const LINEAR_API_KEY_SOURCES = ["GROUNDCREW_LINEAR_API_KEY", "LINEAR_API_KEY"];
4
4
  export function resolveLinearApiKey() {
5
5
  for (const source of LINEAR_API_KEY_SOURCES) {
6
6
  const value = readEnvironmentVariable(source);
7
+ /* v8 ignore next */
7
8
  if (value === undefined) {
8
9
  continue;
9
10
  }
@@ -34,7 +34,11 @@ export declare const sourceManifestSchema: z.ZodObject<{
34
34
  files: z.ZodDefault<z.ZodArray<z.ZodString>>;
35
35
  prerequisites: z.ZodOptional<z.ZodArray<z.ZodObject<{
36
36
  bin: z.ZodString;
37
- install: z.ZodOptional<z.ZodString>;
37
+ install: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
38
+ darwin: z.ZodOptional<z.ZodString>;
39
+ linux: z.ZodOptional<z.ZodString>;
40
+ default: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$strict>]>>;
38
42
  setup: z.ZodOptional<z.ZodString>;
39
43
  }, z.core.$strict>>>;
40
44
  secrets: z.ZodOptional<z.ZodArray<z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/shell/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0BxB;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;kBASjC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAa/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/shell/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2CxB;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;kBASjC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAa/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -12,9 +12,25 @@
12
12
  * bridges the two once the scripts are materialized.
13
13
  */
14
14
  import { z } from "zod";
15
+ /**
16
+ * A prerequisite's install hint. A plain string applies to every platform; an
17
+ * object keys hints by Node's `process.platform` value (`darwin`, `linux`) so a
18
+ * consumer can index by platform directly, with `default` as the fallback for
19
+ * platforms without an explicit entry. Only crew-config reads this field, so the
20
+ * per-OS shape stays JSON-serializable and an older crew-config that expects a
21
+ * string simply shows no hint for the object form (a graceful degradation).
22
+ */
23
+ const installSchema = z.union([
24
+ z.string(),
25
+ z.strictObject({
26
+ darwin: z.string().optional(),
27
+ linux: z.string().optional(),
28
+ default: z.string().optional(),
29
+ }),
30
+ ]);
15
31
  const prerequisiteSchema = z.strictObject({
16
32
  bin: z.string().min(1),
17
- install: z.string().optional(),
33
+ install: installSchema.optional(),
18
34
  setup: z.string().optional(),
19
35
  });
20
36
  const secretSchema = z.strictObject({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clipboard-health/groundcrew",
3
- "version": "4.46.4",
3
+ "version": "4.46.5",
4
4
  "description": "Linear-driven orchestrator that launches AI coding agents in git worktrees, with workspace lifecycle and usage tracking.",
5
5
  "keywords": [
6
6
  "agent",
@@ -84,7 +84,7 @@
84
84
  "@tsconfig/node24": "24.0.4",
85
85
  "@tsconfig/strictest": "2.0.8",
86
86
  "@types/node": "25.9.4",
87
- "@typescript/native-preview": "7.0.0-dev.20260703.1",
87
+ "@typescript/native-preview": "7.0.0-dev.20260705.1",
88
88
  "@vitest/coverage-v8": "4.1.9",
89
89
  "cspell": "10.0.1",
90
90
  "dependency-cruiser": "18.0.0",
@@ -14,8 +14,20 @@ calls with a subcommand per operation:
14
14
 
15
15
  ## Prerequisites
16
16
 
17
- - [`jira` CLI](https://github.com/ankitpokhrel/jira-cli) — `brew install ankitpokhrel/jira-cli/jira-cli`, then `jira init`.
18
- - [`jq`](https://jqlang.github.io/jq/) `brew install jq`.
17
+ - [`jira` CLI](https://github.com/ankitpokhrel/jira-cli), then `jira init`:
18
+ - macOS: `brew install ankitpokhrel/jira-cli/jira-cli`
19
+ - Linux (Ubuntu): `sudo snap install jira-cli && sudo snap alias jira-cli jira`
20
+ - [`jq`](https://jqlang.github.io/jq/):
21
+ - macOS: `brew install jq`
22
+ - Linux: `sudo apt-get install jq`
23
+
24
+ The Ubuntu snap ships the binary as `jira-cli`, but the `snap alias` step drops a
25
+ `jira` symlink on PATH, so `jira` is the single canonical command name on every
26
+ platform. That is deliberate: the manifest keeps `bin: "jira"` and
27
+ `setup: "jira init"`, and `jira.sh` keeps invoking the `jira` command verbatim,
28
+ so there is no per-OS binary name to plumb through. If you install the snap without aliasing,
29
+ the `jira` prerequisite probe fails and the setup screen surfaces this install
30
+ hint, which now includes the alias step.
19
31
 
20
32
  > **Note:** `list` and `get` detect "no results" and "not found" by matching the
21
33
  > `jira` CLI's stderr wording (it exposes no machine-readable signal for either).
@@ -74,9 +86,10 @@ the token on per invocation.
74
86
  | `groundcrew` | `groundcrew` | Opts the issue in. The default JQL fetches only issues carrying this label, so work is dispatched explicitly rather than every open issue being swept up. The label name is just a JQL convention — change the `labels = …` clause in `JIRA_GROUNDCREW_JQL` to use a different one. |
75
87
  | `repo:<name>` | `repo:wild-horses` | Sets `repository: "wild-horses"`. Use a bare repository name when your config's `knownRepositories` lists it by name — no owner needed. |
76
88
  | `repo:<Owner>__<name>` | `repo:ClipboardHealth__groundcrew` | Sets `repository: "ClipboardHealth/groundcrew"`. JIRA labels cannot contain `/`, so the slash is encoded as exactly **two** underscores (`__`). Every `__` decodes to `/`, so only two-component `Owner/name` repos are supported — a repository whose owner or name itself contains `__` cannot be expressed. |
77
- | `agent:<name>` | `agent:claude` | **Optional** omit it to use `JIRA_DEFAULT_AGENT` (`claude` in the sample config). Only add this label to override the default for a specific issue. |
89
+ | `agent:<name>` | `agent:claude` | Sets `agent: "claude"`. Omit it only when `JIRA_DEFAULT_AGENT` is configured separately; the shipped source leaves that default empty so unlabeled issues are listed but not auto-dispatched. |
78
90
 
79
- So a typical dispatchable issue carries just `groundcrew` + a `repo:` label.
91
+ So a typical dispatchable issue carries `groundcrew` + a `repo:` label + an
92
+ `agent:` label.
80
93
  An issue without a `repo:` label is listed but not dispatchable (and with no
81
94
  `agent:` label and no `JIRA_DEFAULT_AGENT`, its agent is `null`).
82
95
 
@@ -96,9 +109,9 @@ the token on per invocation.
96
109
  },
97
110
  "env": {
98
111
  "JIRA_GROUNDCREW_JQL": "labels = groundcrew AND (statusCategory != Done OR (statusCategory = Done AND updated >= -7d))",
99
- "JIRA_REVIEW_PATTERN": "review",
100
- "JIRA_TODO_PATTERN": "",
101
- "JIRA_DEFAULT_AGENT": "claude",
112
+ "JIRA_REVIEW_PATTERN": "In Review",
113
+ "JIRA_TODO_PATTERN": "New",
114
+ "JIRA_DEFAULT_AGENT": "",
102
115
  "JIRA_STATE_IN_PROGRESS": "In Progress",
103
116
  "JIRA_STATE_IN_REVIEW": "In Review",
104
117
  "JIRA_STATE_DONE": "Done"
@@ -118,9 +131,9 @@ The script reads these from the source's `env` block:
118
131
  | Variable | Default | Purpose |
119
132
  | --------------------- | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
120
133
  | `JIRA_GROUNDCREW_JQL` | `labels = groundcrew AND (statusCategory != Done OR (statusCategory = Done AND updated >= -7d))` | Which issues `list` returns, capped at the first 20 (`--paginate 0:20` in `jira.sh`). Defaults to open issues plus those done in the last 7 days (so groundcrew can clean up their worktrees). Omit `ORDER BY` (jira-cli adds its own). |
121
- | `JIRA_REVIEW_PATTERN` | `review` | Case-insensitive regex; matching In-Progress status names map to `in-review`. |
122
- | `JIRA_TODO_PATTERN` | _(empty -> off)_ | Case-insensitive regex; matching In-Progress status names map to `todo` so groundcrew dispatches them as new work. Set it to e.g. `acknowledged` for an "Acknowledged" triage status. Checked before `JIRA_REVIEW_PATTERN`. |
123
- | `JIRA_DEFAULT_AGENT` | _(empty -> `null`)_ | Agent used when an issue has no `agent:` label. |
134
+ | `JIRA_REVIEW_PATTERN` | `In Review` | Case-insensitive regex; matching In-Progress status names map to `in-review`. |
135
+ | `JIRA_TODO_PATTERN` | `New` | Case-insensitive regex; matching In-Progress status names map to `todo` so groundcrew dispatches them as new work. The shipped source seeds `New`; clear the row to turn this off. Checked before `JIRA_REVIEW_PATTERN`. |
136
+ | `JIRA_DEFAULT_AGENT` | _(empty -> `null`)_ | Agent used when an issue has no `agent:` label. Set it to an agent name only when every matching Jira issue should be eligible for that agent by default. |
124
137
  | `JIRA_TOKEN_FILE` | `~/.config/groundcrew/jira.token` | Token file path. |
125
138
  | `JIRA_STATE_*` | `In Progress` / `In Review` / `Done` | Native JIRA state names used by `move`. Match your project's workflow. |
126
139
 
@@ -7,12 +7,18 @@
7
7
  "prerequisites": [
8
8
  {
9
9
  "bin": "jira",
10
- "install": "brew install ankitpokhrel/jira-cli/jira-cli",
10
+ "install": {
11
+ "darwin": "brew install ankitpokhrel/jira-cli/jira-cli",
12
+ "linux": "sudo snap install jira-cli && sudo snap alias jira-cli jira"
13
+ },
11
14
  "setup": "jira init"
12
15
  },
13
16
  {
14
17
  "bin": "jq",
15
- "install": "brew install jq"
18
+ "install": {
19
+ "darwin": "brew install jq",
20
+ "linux": "sudo apt-get install jq"
21
+ }
16
22
  }
17
23
  ],
18
24
  "secrets": [
@@ -24,6 +30,10 @@
24
30
  }
25
31
  ],
26
32
  "env": {
33
+ "JIRA_GROUNDCREW_JQL": "labels = groundcrew AND (statusCategory != Done OR (statusCategory = Done AND updated >= -7d))",
34
+ "JIRA_REVIEW_PATTERN": "In Review",
35
+ "JIRA_TODO_PATTERN": "New",
36
+ "JIRA_DEFAULT_AGENT": "",
27
37
  "JIRA_STATE_IN_PROGRESS": "In Progress",
28
38
  "JIRA_STATE_IN_REVIEW": "In Review",
29
39
  "JIRA_STATE_DONE": "Done"