@clipboard-health/groundcrew 4.7.2 → 4.8.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/README.md CHANGED
@@ -27,7 +27,7 @@ Groundcrew watches assigned tickets, creates isolated worktrees, launches agent
27
27
  - **One worktree per ticket.** Agents work in parallel without stepping on each other.
28
28
  - **Pluggable ticket sources.** Linear by default; Jira and local files via [ticket sources](./docs/ticket-sources.md).
29
29
  - **Local-first isolation.** Safehouse, Docker Sandboxes, or an explicit `none` escape hatch.
30
- - **Multi-agent routing.** Ships with `claude` and `codex`; bring your own CLI in config.
30
+ - **Multi-agent routing.** Ships `claude` and `codex` presets; bring your own CLI in config.
31
31
 
32
32
  ## Prerequisites
33
33
 
@@ -59,7 +59,7 @@ crew doctor
59
59
  crew run --watch
60
60
  ```
61
61
 
62
- `crew init --global` writes config to `${XDG_CONFIG_HOME:-$HOME/.config}/groundcrew/`. Pass `--repo` more than once for multiple repos. If you only have one CLI installed, pass `--model claude` (or `--model codex`) so Groundcrew disables the other model and `doctor` won't flag it as missing.
62
+ `crew init --global` writes config to `${XDG_CONFIG_HOME:-$HOME/.config}/groundcrew/`. Pass `--repo` more than once for multiple repos. `--model claude` or `--model codex` chooses the single built-in model preset to enable in the generated config.
63
63
 
64
64
  ## Ticket Pickup
65
65
 
@@ -96,7 +96,7 @@ See [command details](./docs/commands.md) for status output, doctor behavior, an
96
96
 
97
97
  ## Configuration
98
98
 
99
- Two keys are required; everything else has a default.
99
+ Workspace settings and at least one enabled model are required; everything else has a default.
100
100
 
101
101
  ```ts
102
102
  import type { Config } from "@clipboard-health/groundcrew";
@@ -112,7 +112,7 @@ export default {
112
112
  models: {
113
113
  default: "claude",
114
114
  definitions: {
115
- codex: { disabled: true },
115
+ claude: {},
116
116
  },
117
117
  },
118
118
  } satisfies Config;
package/bin/run.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { dirname } from "node:path";
3
+ import path from "node:path";
4
4
 
5
5
  import { runCli } from "./runCli.js";
6
6
 
7
- await runCli(dirname(import.meta.dirname), "main");
7
+ await runCli(path.dirname(import.meta.dirname), "main");
package/bin/runCli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { constants as osConstants } from "node:os";
4
- import { join } from "node:path";
4
+ import path from "node:path";
5
5
  import { pathToFileURL } from "node:url";
6
6
 
7
7
  /**
@@ -14,13 +14,13 @@ import { pathToFileURL } from "node:url";
14
14
  * @param {string} name
15
15
  */
16
16
  export async function runCli(packageRoot, name) {
17
- const compiledPath = join(packageRoot, "dist", `${name}.js`);
17
+ const compiledPath = path.join(packageRoot, "dist", `${name}.js`);
18
18
  if (existsSync(compiledPath)) {
19
19
  await import(pathToFileURL(compiledPath).href);
20
20
  return;
21
21
  }
22
22
 
23
- const sourcePath = join(packageRoot, "src", `${name}.ts`);
23
+ const sourcePath = path.join(packageRoot, "src", `${name}.ts`);
24
24
  const result = spawnSync(process.execPath, [sourcePath, ...process.argv.slice(2)], {
25
25
  stdio: "inherit",
26
26
  });
@@ -20,6 +20,21 @@ export default {
20
20
  // tickets to these and refuses unknown repos by default.
21
21
  knownRepositories: ["your-org/your-repo"],
22
22
  },
23
+ models: {
24
+ default: "claude",
25
+ // `definitions` is the enabled model set. Built-in keys can use `{}` to
26
+ // opt into the shipped command/color/usage preset. Add `codex: {}` if you
27
+ // want both shipped agents, or add a custom entry and tag tickets with
28
+ // `agent-<name>`.
29
+ definitions: {
30
+ claude: {},
31
+ // codex: {},
32
+ // cursor: {
33
+ // cmd: "cursor-agent",
34
+ // color: "#929292",
35
+ // },
36
+ },
37
+ },
23
38
  // Everything below is optional — defaults shown for reference. Uncomment
24
39
  // and edit to override.
25
40
  //
@@ -50,31 +65,14 @@ export default {
50
65
  // sessionLimitPercentage: 85,
51
66
  // },
52
67
  //
53
- // models: {
54
- // default: "claude",
55
- // // Additive: defaults for `claude` and `codex` are merged in unless you
56
- // // re-declare those keys here. Add a third agent (e.g. `cursor`) by
57
- // // dropping it in this map and tagging tickets with `agent-cursor`.
58
- // // Groundcrew runs agent commands through Safehouse/clearance unless already Safehouse-wrapped.
59
- // definitions: {
60
- // cursor: {
61
- // cmd: "cursor-agent",
62
- // color: "#929292",
63
- // },
64
- // // Optional: mint a short-lived credential outside Safehouse and
65
- // // forward it into the agent. `preLaunch` runs in the launch shell
66
- // // before the agent exec; `preLaunchEnv` lists the names to add to
67
- // // groundcrew's `safehouse-clearance --env-pass=` flag so the wrap's
68
- // // egress allowlist stays intact. Chain with `&&` so a failed mint
69
- // // aborts launch before `export`.
70
- // // claude: {
71
- // // preLaunch: "SESSION_TOKEN=$(your-mint-command) && export SESSION_TOKEN",
72
- // // preLaunchEnv: ["SESSION_TOKEN"],
73
- // // },
74
- // // To run a model under the sdx (Docker Sandboxes) runner, bind it to
75
- // // an sbx agent. Required when `local.runner` resolves to `sdx`.
76
- // // claude: { sandbox: { agent: "claude" } },
77
- // },
68
+ // To customize an enabled built-in, replace `claude: {}` above with:
69
+ // claude: {
70
+ // // Optional: mint a short-lived credential outside Safehouse and forward
71
+ // // it into the agent. Chain with `&&` so a failed mint aborts launch.
72
+ // preLaunch: "SESSION_TOKEN=$(your-mint-command) && export SESSION_TOKEN",
73
+ // preLaunchEnv: ["SESSION_TOKEN"],
74
+ // // Required for this model when `local.runner` resolves to `sdx`.
75
+ // sandbox: { agent: "claude" },
78
76
  // },
79
77
  //
80
78
  // // Local isolation backend. Defaults to `"auto"` — macOS → safehouse,
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyKH,wBAAsB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CA8E/C"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuKH,wBAAsB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CA8E/C"}
@@ -14,7 +14,7 @@ import { resolveWorkspaceKind } from "../lib/workspaces.js";
14
14
  // Tokenization stops after this many non-flag tokens. Two is enough to
15
15
  // catch wrapper + wrapped CLI commands like `safehouse claude --foo`.
16
16
  const MAX_TOKENS_PER_CMD = 2;
17
- const SHIPPED_DEFAULT_MODEL_NAMES = ["claude", "codex"];
17
+ const BUILT_IN_MODEL_NAMES = ["claude", "codex"];
18
18
  async function checkCmd(cmd, required, hint) {
19
19
  const path = await which(cmd);
20
20
  const resolvedHint = path ?? hint;
@@ -120,12 +120,12 @@ function modelCliHint(modelName, token) {
120
120
  if (token !== modelName) {
121
121
  return undefined;
122
122
  }
123
- if (!isShippedDefaultModelName(modelName)) {
123
+ if (!isBuiltInModelName(modelName)) {
124
124
  return undefined;
125
125
  }
126
- return `install ${token} or disable it in crew.config.ts: \`models.definitions.${modelName} = { disabled: true }\``;
126
+ return `install ${token} or remove \`models.definitions.${modelName}\` from crew.config.ts`;
127
127
  }
128
- function isShippedDefaultModelName(value) {
128
+ function isBuiltInModelName(value) {
129
129
  return value === "claude" || value === "codex";
130
130
  }
131
131
  function format(check) {
@@ -23,7 +23,7 @@ interface InitConfigOptions {
23
23
  repositories?: string[];
24
24
  /** Pre-fill local.runner in the generated config. */
25
25
  runner?: LocalRunnerSetting;
26
- /** Keep one shipped default model enabled and disable the other. */
26
+ /** Choose the single built-in model preset enabled by the generated config. */
27
27
  model?: InitModel;
28
28
  /** Override the source template path. */
29
29
  examplePath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUlF,QAAA,MAAM,WAAW,YAAI,QAAQ,EAAE,OAAO,CAAU,CAAC;AAEjD,KAAK,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC1C,KAAK,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,UAAU,iBAAiB;IACzB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,qDAAqD;IACrD,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,oEAAoE;IACpE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,iBAAiB,GAAG,qBAAqB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpE,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAoB5E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAUlF,QAAA,MAAM,WAAW,YAAI,QAAQ,EAAE,OAAO,CAAU,CAAC;AAEjD,KAAK,eAAe,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC1C,KAAK,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,UAAU,iBAAiB;IACzB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,qDAAqD;IACrD,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,iBAAiB,GAAG,qBAAqB,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpE,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAoB5E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjE"}
@@ -5,7 +5,7 @@
5
5
  * `cp` dance documented in the README.
6
6
  */
7
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
- import { dirname, resolve } from "node:path";
8
+ import path from "node:path";
9
9
  import { LOCAL_RUNNER_SETTINGS } from "../lib/config.js";
10
10
  import { shellSingleQuote } from "../lib/shell.js";
11
11
  import { log, writeOutput } from "../lib/util.js";
@@ -28,7 +28,7 @@ export function initConfig(options = {}) {
28
28
  log(`[dry-run] would write ${destination}`);
29
29
  return { destination, outcome: "dry-run-would-write" };
30
30
  }
31
- mkdirSync(dirname(destination), { recursive: true });
31
+ mkdirSync(path.dirname(destination), { recursive: true });
32
32
  writeFileSync(destination, renderConfig(source, options));
33
33
  log(`[wrote] ${destination}`);
34
34
  return { destination, outcome: "wrote" };
@@ -117,12 +117,12 @@ function destinationFor(args) {
117
117
  if (args.scope === "global") {
118
118
  return xdgConfigPath("groundcrew", CONFIG_FILE_NAME);
119
119
  }
120
- return resolve(args.cwd, CONFIG_FILE_NAME);
120
+ return path.resolve(args.cwd, CONFIG_FILE_NAME);
121
121
  }
122
122
  function resolveExamplePath() {
123
123
  // `init.ts` lives at src/commands/init.ts in source and dist/commands/init.js
124
124
  // after build; the example ships at the package root in both cases.
125
- return resolve(import.meta.dirname, "..", "..", EXAMPLE_FILE_NAME);
125
+ return path.resolve(import.meta.dirname, "..", "..", EXAMPLE_FILE_NAME);
126
126
  }
127
127
  function readOptionValue(argv, index, flag) {
128
128
  const value = argv[index + 1];
@@ -164,28 +164,39 @@ function renderConfig(source, options) {
164
164
  contents = replaceRequired(contents, ` // local: { runner: "auto" },`, ` local: { runner: ${tsString(options.runner)} },`, "--runner");
165
165
  }
166
166
  if (options.model !== undefined) {
167
- contents = replaceRequired(contents, " // prompts: {", `${modelBlock(options.model)}\n // prompts: {`, "--model");
167
+ contents = replaceRequired(contents, ` default: "claude",`, ` default: ${tsString(options.model)},`, "--model");
168
+ contents = replaceRequired(contents, " claude: {},", ` ${options.model}: {},`, "--model");
169
+ contents = removeDuplicateModelDefinitionLines(contents, options.model);
168
170
  }
169
171
  return contents;
170
172
  }
173
+ function removeDuplicateModelDefinitionLines(contents, model) {
174
+ const linePattern = new RegExp(`^\\s*(?://\\s*)?${escapeRegExp(model)}:\\s*\\{\\},\\s*$`);
175
+ let hasActiveEntry = false;
176
+ return contents
177
+ .split("\n")
178
+ .filter((line) => {
179
+ if (!linePattern.test(line)) {
180
+ return true;
181
+ }
182
+ const isCommented = line.trimStart().startsWith("//");
183
+ if (!isCommented && !hasActiveEntry) {
184
+ hasActiveEntry = true;
185
+ return true;
186
+ }
187
+ return false;
188
+ })
189
+ .join("\n");
190
+ }
191
+ function escapeRegExp(value) {
192
+ return value.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
193
+ }
171
194
  function replaceRequired(contents, search, replacement, flag) {
172
195
  if (!contents.includes(search)) {
173
196
  throw new Error(`crew init ${flag}: template anchor not found in ${EXAMPLE_FILE_NAME}`);
174
197
  }
175
198
  return contents.replace(search, replacement);
176
199
  }
177
- function modelBlock(model) {
178
- const disabled = model === "claude" ? "codex" : "claude";
179
- return [
180
- " models: {",
181
- ` default: ${tsString(model)},`,
182
- " definitions: {",
183
- ` ${disabled}: { disabled: true },`,
184
- " },",
185
- " },",
186
- "",
187
- ].join("\n");
188
- }
189
200
  function writeInitGuidance(destination, options) {
190
201
  writeOutput("");
191
202
  writeOutput("Next steps:");
@@ -1,5 +1,5 @@
1
1
  import { readFileSync } from "node:fs";
2
- import { join } from "node:path";
2
+ import path from "node:path";
3
3
  import { runCommand } from "../lib/commandRunner.js";
4
4
  import { which } from "../lib/host.js";
5
5
  import { classifyInstall, createDefaultNpmSpawner, detectInstallPath, detectIsSymlink, detectNpmRootGlobal, runNpmInstallGlobal, } from "../lib/npmGlobal.js";
@@ -137,7 +137,7 @@ export async function createDefaultUpgradeCliOptions(args) {
137
137
  function readInstalledVersionFromDisk(installPath) {
138
138
  let raw;
139
139
  try {
140
- raw = readFileSync(join(installPath, "package.json"), "utf8");
140
+ raw = readFileSync(path.join(installPath, "package.json"), "utf8");
141
141
  }
142
142
  catch {
143
143
  return undefined;
@@ -158,7 +158,7 @@ export declare function fetchResolvedIssue(arguments_: {
158
158
  config: ResolvedConfig;
159
159
  ticket: string;
160
160
  }): Promise<ResolvedIssue>;
161
- export declare function warnIfDisabledFallback(ticket: string, modelResolution: ModelResolution, config: ResolvedConfig): void;
161
+ export declare function warnIfNotEnabledFallback(ticket: string, modelResolution: ModelResolution, config: ResolvedConfig): void;
162
162
  export declare function blockersFromRelations(relations: IssueRelationNode[]): Blocker[];
163
163
  export {};
164
164
  //# sourceMappingURL=fetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAYpC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;OAIG;IACH,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,8FAA8F;IAC9F,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;CAC9B;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAUpE;AAkBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,OAAO,CAE1E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,OAAO,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE1E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,OAAO,CAEjF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEpE;AAyBD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;KAChD,GAAG,IAAI,CAAC;CACV;AAoFD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,OAAO,CAAC,eAAe,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,GACzD,MAAM,CAQR;AAsGD,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAKD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3B,yFAAyF;IACzF,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;OAKG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAsB,sBAAsB,CAAC,UAAU,EAAE;IACvD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC,CA8C9B;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE;IACpD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,cAAc,CAAC,CAoE1B;AAUD,wBAAsB,yBAAyB,CAAC,UAAU,EAAE;IAC1D,MAAM,EAAE,YAAY,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2ClB;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE;IACnD,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkCzB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,cAAc,GACrB,IAAI,CAON;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,OAAO,EAAE,CAS/E"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/fetch.ts"],"names":[],"mappings":"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"}
@@ -138,7 +138,7 @@ export function modelForResolution(resolution) {
138
138
  if (resolution.kind === "matched") {
139
139
  return resolution.model;
140
140
  }
141
- if (resolution.kind === "disabled-fallback") {
141
+ if (resolution.kind === "not-enabled-fallback") {
142
142
  return resolution.fallbackModel;
143
143
  }
144
144
  return "any";
@@ -185,7 +185,7 @@ function buildLinearIssue(input) {
185
185
  }
186
186
  function issueFromNode(node, config) {
187
187
  const modelResolution = resolveModelFor({ labels: node.labels.nodes, config });
188
- warnIfDisabledFallback(node.identifier, modelResolution, config);
188
+ warnIfNotEnabledFallback(node.identifier, modelResolution, config);
189
189
  const { repository, model } = resolveAgentMetadata({
190
190
  ticket: node.identifier,
191
191
  /* v8 ignore next @preserve -- BoardIssues query selects description; the ?? guard normalises a null vs undefined edge */
@@ -358,12 +358,12 @@ export async function fetchResolvedIssue(arguments_) {
358
358
  });
359
359
  }
360
360
  const modelResolution = resolveModelFor({ labels: raw.labels, config });
361
- warnIfDisabledFallback(ticket, modelResolution, config);
361
+ warnIfNotEnabledFallback(ticket, modelResolution, config);
362
362
  let model = config.models.default;
363
363
  if (modelResolution.kind === "matched") {
364
364
  ({ model } = modelResolution);
365
365
  }
366
- else if (modelResolution.kind === "disabled-fallback") {
366
+ else if (modelResolution.kind === "not-enabled-fallback") {
367
367
  model = modelResolution.fallbackModel;
368
368
  }
369
369
  return {
@@ -379,11 +379,11 @@ export async function fetchResolvedIssue(arguments_) {
379
379
  url: raw.url,
380
380
  };
381
381
  }
382
- export function warnIfDisabledFallback(ticket, modelResolution, config) {
383
- if (modelResolution.kind !== "disabled-fallback") {
382
+ export function warnIfNotEnabledFallback(ticket, modelResolution, config) {
383
+ if (modelResolution.kind !== "not-enabled-fallback") {
384
384
  return;
385
385
  }
386
- log(`${ticket.toLowerCase()}: agent-${modelResolution.requestedModel} label refers to a disabled model; falling back to models.default (${config.models.default})`);
386
+ log(`${ticket.toLowerCase()}: agent-${modelResolution.requestedModel} label refers to a model that is not enabled; falling back to models.default (${config.models.default})`);
387
387
  }
388
388
  export function blockersFromRelations(relations) {
389
389
  return relations
@@ -18,7 +18,7 @@ export type ModelResolution = {
18
18
  } | {
19
19
  kind: "agent-any";
20
20
  } | {
21
- kind: "disabled-fallback";
21
+ kind: "not-enabled-fallback";
22
22
  requestedModel: string;
23
23
  fallbackModel: string;
24
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/parsing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA6C,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjG,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE5F,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AASjF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAUnE;AAiDD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE;IAC/C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,oBAAoB,CAuBvB;AAED,UAAU,wBAAwB;IAChC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,wBAAwB,GAAG,MAAM,CA2B5E;AAkDD,wBAAgB,eAAe,CAAC,UAAU,EAAE;IAC1C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,eAAe,CAiBlB"}
1
+ {"version":3,"file":"parsing.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/linear/parsing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA6C,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjG,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAE5F,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AASpF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAUnE;AAiDD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE;IAC/C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,oBAAoB,CAuBvB;AAED,UAAU,wBAAwB;IAChC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,wBAAwB,GAAG,MAAM,CA2B5E;AAkDD,wBAAgB,eAAe,CAAC,UAAU,EAAE;IAC1C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,eAAe,CAiBlB"}
@@ -2,7 +2,7 @@
2
2
  * Linear adapter — parsing helpers for model/repository resolution from
3
3
  * issue labels and descriptions. Extracted from boardSource.ts (Task 10).
4
4
  */
5
- import { AGENT_ANY_MODEL, isShippedDefaultDisabled } from "../../config.js";
5
+ import { AGENT_ANY_MODEL, isBuiltInModelNotEnabled } from "../../config.js";
6
6
  import { RepositoryResolutionError } from "../../ticketSource.js";
7
7
  export const AGENT_LABEL_PREFIX = "agent-";
8
8
  function escapeRegex(value) {
@@ -102,7 +102,7 @@ function parseAgentLabels(labels, config) {
102
102
  if (agentLabels.length === 0) {
103
103
  return undefined;
104
104
  }
105
- let disabledFallback;
105
+ let notEnabledFallback;
106
106
  for (const label of agentLabels) {
107
107
  const name = label.name.slice(AGENT_LABEL_PREFIX.length);
108
108
  if (name === AGENT_ANY_MODEL) {
@@ -114,13 +114,13 @@ function parseAgentLabels(labels, config) {
114
114
  if (Object.hasOwn(config.models.definitions, name)) {
115
115
  return { model: name };
116
116
  }
117
- if (disabledFallback === undefined && isShippedDefaultDisabled(config, name)) {
118
- disabledFallback = name;
117
+ if (notEnabledFallback === undefined && isBuiltInModelNotEnabled(config, name)) {
118
+ notEnabledFallback = name;
119
119
  }
120
120
  }
121
121
  const fallback = { model: config.models.default };
122
- if (disabledFallback !== undefined) {
123
- fallback.disabledFallback = disabledFallback;
122
+ if (notEnabledFallback !== undefined) {
123
+ fallback.notEnabledFallback = notEnabledFallback;
124
124
  }
125
125
  return fallback;
126
126
  }
@@ -133,10 +133,10 @@ export function resolveModelFor(arguments_) {
133
133
  if (parsed.model === AGENT_ANY_MODEL) {
134
134
  return { kind: "agent-any" };
135
135
  }
136
- if (parsed.disabledFallback !== undefined) {
136
+ if (parsed.notEnabledFallback !== undefined) {
137
137
  return {
138
- kind: "disabled-fallback",
139
- requestedModel: parsed.disabledFallback,
138
+ kind: "not-enabled-fallback",
139
+ requestedModel: parsed.notEnabledFallback,
140
140
  fallbackModel: parsed.model,
141
141
  };
142
142
  }
@@ -11,7 +11,7 @@
11
11
  */
12
12
  import { __rewriteRelativeImportExtension } from "tslib";
13
13
  import { readdirSync } from "node:fs";
14
- import { resolve } from "node:path";
14
+ import path from "node:path";
15
15
  import { z } from "zod";
16
16
  /**
17
17
  * Pure logic: given a list of subdirectory names and an async loader, build a
@@ -62,7 +62,7 @@ const here = import.meta.dirname;
62
62
  async function defaultImportLoader(directoryName) {
63
63
  // Resolve relative to this module's directory. tsx maps `.js` → `.ts` in dev;
64
64
  // prod Node ESM resolves the actual `.js` file.
65
- const modulePath = resolve(here, directoryName, "index.js");
65
+ const modulePath = path.resolve(here, directoryName, "index.js");
66
66
  // oxlint-disable-next-line typescript/no-unsafe-assignment -- dynamic import return type is `any`; adapter contract is enforced by buildRegistry
67
67
  const mod = await import(__rewriteRelativeImportExtension(modulePath));
68
68
  return mod.default;
@@ -103,26 +103,21 @@ export interface ModelDefinition {
103
103
  sandbox?: SandboxDefinition;
104
104
  }
105
105
  /**
106
- * User-facing model entry shape. Discriminated union so the type system
107
- * mirrors the runtime contract: an entry is either a pure overlay
108
- * (every concrete field optional, no `disabled` key) or a pure
109
- * disable directive (`{ disabled: true }` and nothing else).
106
+ * User-facing model entry shape. Built-in model names (`claude`, `codex`)
107
+ * accept empty or partial entries because they merge over built-in presets.
108
+ * Brand-new model names must supply enough fields to satisfy `validate()`.
110
109
  *
111
110
  * `usage` accepts an extra `{ disabled: true }` sentinel that strips the
112
111
  * usage block from the merged definition — the only way to opt a shipped
113
- * default out of codexbar gating without disabling the model entirely.
112
+ * preset out of codexbar gating without removing the model entirely.
114
113
  */
115
114
  type UserUsage = ModelDefinition["usage"] | {
116
115
  disabled: true;
117
116
  };
118
117
  type EnabledUserModelDefinition = Partial<Omit<ModelDefinition, "usage">> & {
119
118
  usage?: UserUsage;
120
- disabled?: never;
121
119
  };
122
- interface DisabledUserModelDefinition {
123
- disabled: true;
124
- }
125
- type UserModelDefinition = EnabledUserModelDefinition | DisabledUserModelDefinition;
120
+ type UserModelDefinition = EnabledUserModelDefinition;
126
121
  /**
127
122
  * Loose user-facing shape — what a `config.ts` file declares.
128
123
  * Fields with defaults are optional; only `workspace.*` is required.
@@ -161,10 +156,10 @@ export interface Config {
161
156
  models?: {
162
157
  default?: string;
163
158
  /**
164
- * Additive: each entry merges over the shipped default for that key.
165
- * Override `claude.cmd` only by declaring `{ claude: { cmd: "..." } }`
166
- * the other fields stay at their default values. Brand-new model
167
- * names must supply enough fields to satisfy `validate()`.
159
+ * Explicit enabled model set. Built-in keys (`claude`, `codex`) merge over
160
+ * their presets, so `{ claude: {} }` enables Claude with the shipped
161
+ * command/color/usage. Brand-new model names must supply enough fields to
162
+ * satisfy `validate()`.
168
163
  */
169
164
  definitions?: Record<string, UserModelDefinition>;
170
165
  };
@@ -255,11 +250,10 @@ export interface ResolvedConfig {
255
250
  */
256
251
  export declare function hasPreLaunchEnv(definition: Pick<ModelDefinition, "preLaunchEnv">): boolean;
257
252
  /**
258
- * True when `name` is a shipped default the user removed via `disabled: true`.
259
- * Derived from absence in `definitions` that's the only path that removes a
260
- * shipped default, codified in `failIfLegacyModelKeys` + `mergeDefinitions`.
261
- * Consumers needing to distinguish disabled-by-user from unknown-label use this.
253
+ * True when `name` is a built-in preset but not present in the enabled
254
+ * definitions. Consumers use this to distinguish `agent-codex` when codex is
255
+ * not enabled from an arbitrary unknown label like `agent-typo`.
262
256
  */
263
- export declare function isShippedDefaultDisabled(config: Pick<ResolvedConfig, "models">, name: string): boolean;
257
+ export declare function isBuiltInModelNotEnabled(config: Pick<ResolvedConfig, "models">, name: string): boolean;
264
258
  export declare function loadConfig(): Promise<Readonly<ResolvedConfig>>;
265
259
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}