@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 +4 -4
- package/bin/run.js +2 -2
- package/bin/runCli.js +3 -3
- package/crew.config.example.ts +23 -25
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +4 -4
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +28 -17
- package/dist/commands/upgrade.js +2 -2
- package/dist/lib/adapters/linear/fetch.d.ts +1 -1
- package/dist/lib/adapters/linear/fetch.d.ts.map +1 -1
- package/dist/lib/adapters/linear/fetch.js +7 -7
- package/dist/lib/adapters/linear/parsing.d.ts +1 -1
- package/dist/lib/adapters/linear/parsing.d.ts.map +1 -1
- package/dist/lib/adapters/linear/parsing.js +9 -9
- package/dist/lib/adapters/registry.js +2 -2
- package/dist/lib/config.d.ts +13 -19
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +82 -76
- package/dist/lib/launchCommand.js +7 -7
- package/dist/lib/npmGlobal.d.ts +1 -1
- package/dist/lib/npmGlobal.d.ts.map +1 -1
- package/dist/lib/npmGlobal.js +7 -7
- package/dist/lib/runState.js +7 -7
- package/dist/lib/stagedLaunch.js +5 -5
- package/dist/lib/util.d.ts +1 -1
- package/dist/lib/util.d.ts.map +1 -1
- package/dist/lib/util.js +4 -4
- package/dist/lib/worktrees.js +18 -18
- package/dist/lib/xdg.js +5 -5
- package/docs/configuration.md +46 -36
- package/docs/troubleshooting.md +3 -3
- package/package.json +7 -7
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
115
|
+
claude: {},
|
|
116
116
|
},
|
|
117
117
|
},
|
|
118
118
|
} satisfies Config;
|
package/bin/run.js
CHANGED
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
|
|
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
|
});
|
package/crew.config.example.ts
CHANGED
|
@@ -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
|
-
//
|
|
54
|
-
//
|
|
55
|
-
// //
|
|
56
|
-
// //
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
//
|
|
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;
|
|
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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -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
|
|
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 (!
|
|
123
|
+
if (!isBuiltInModelName(modelName)) {
|
|
124
124
|
return undefined;
|
|
125
125
|
}
|
|
126
|
-
return `install ${token} or
|
|
126
|
+
return `install ${token} or remove \`models.definitions.${modelName}\` from crew.config.ts`;
|
|
127
127
|
}
|
|
128
|
-
function
|
|
128
|
+
function isBuiltInModelName(value) {
|
|
129
129
|
return value === "claude" || value === "codex";
|
|
130
130
|
}
|
|
131
131
|
function format(check) {
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
|
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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -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
|
|
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, "
|
|
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:");
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readFileSync } from "node:fs";
|
|
2
|
-
import
|
|
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
|
|
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":"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
|
|
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 === "
|
|
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
|
-
|
|
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
|
-
|
|
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 === "
|
|
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
|
|
383
|
-
if (modelResolution.kind !== "
|
|
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
|
|
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
|
|
@@ -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,
|
|
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,
|
|
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
|
|
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 (
|
|
118
|
-
|
|
117
|
+
if (notEnabledFallback === undefined && isBuiltInModelNotEnabled(config, name)) {
|
|
118
|
+
notEnabledFallback = name;
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
const fallback = { model: config.models.default };
|
|
122
|
-
if (
|
|
123
|
-
fallback.
|
|
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.
|
|
136
|
+
if (parsed.notEnabledFallback !== undefined) {
|
|
137
137
|
return {
|
|
138
|
-
kind: "
|
|
139
|
-
requestedModel: parsed.
|
|
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
|
|
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;
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -103,26 +103,21 @@ export interface ModelDefinition {
|
|
|
103
103
|
sandbox?: SandboxDefinition;
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
|
-
* User-facing model entry shape.
|
|
107
|
-
*
|
|
108
|
-
*
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
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
|
|
259
|
-
*
|
|
260
|
-
*
|
|
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
|
|
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
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAMrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5D,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAIzD,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,MAAM,CAAC;AAEtD,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAKrD,CAAC;AAEX;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;;;OAOG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACjD,CAAC;IACF;;;;OAIG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|