issue-flow 0.17.0 → 0.18.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/dist/{agent-TB6W7PT7.js → agent-HMZTXCRT.js} +5 -5
- package/dist/{analyze-6M3KEOX7.js → analyze-Q4ONIWRZ.js} +10 -10
- package/dist/{apply-ADB3ZK7W.js → apply-EEFPY2W4.js} +5 -5
- package/dist/{bench-FM7I7EIV.js → bench-WWWXLTFH.js} +9 -9
- package/dist/{chunk-KZ5EY5XX.js → chunk-34OCSKOB.js} +7 -7
- package/dist/{chunk-UWDCIFTP.js → chunk-45WZ6GMI.js} +27 -43
- package/dist/chunk-45WZ6GMI.js.map +1 -0
- package/dist/{chunk-QMIQR7EE.js → chunk-62GVVZQO.js} +3 -3
- package/dist/{chunk-YII4U7ZD.js → chunk-6K2LCFG6.js} +2 -2
- package/dist/{chunk-A4H7P7T7.js → chunk-7UMMFOL2.js} +3 -3
- package/dist/chunk-7UMMFOL2.js.map +1 -0
- package/dist/{chunk-HJBF4WD2.js → chunk-CWSQVHVV.js} +59 -25
- package/dist/chunk-CWSQVHVV.js.map +1 -0
- package/dist/{chunk-SGTTR4XW.js → chunk-E4I6MMHD.js} +4 -4
- package/dist/{chunk-6YQT3SSM.js → chunk-ECU7YO7S.js} +2 -2
- package/dist/{chunk-MI5TREN3.js → chunk-EG2MGDP5.js} +6 -6
- package/dist/{chunk-RCZJQUTC.js → chunk-HOAHMERN.js} +43 -10
- package/dist/chunk-HOAHMERN.js.map +1 -0
- package/dist/{chunk-HLAPOUEM.js → chunk-KMCS76ZW.js} +3 -3
- package/dist/{chunk-KZXQWC7U.js → chunk-KRAGAUKD.js} +8 -8
- package/dist/{chunk-E6KXCV3T.js → chunk-LGHND47K.js} +2 -2
- package/dist/{chunk-DV7HUC4Z.js → chunk-LI35PIIS.js} +2 -2
- package/dist/{chunk-Z5O2XBWA.js → chunk-LTH6XYZ3.js} +5 -5
- package/dist/{chunk-2SUFAE6X.js → chunk-NEWNXZ65.js} +21 -12
- package/dist/{chunk-2SUFAE6X.js.map → chunk-NEWNXZ65.js.map} +1 -1
- package/dist/{chunk-LPWPFIIB.js → chunk-OODXFCQV.js} +7 -7
- package/dist/{chunk-ISZ54SVE.js → chunk-PMLE7KAQ.js} +17 -9
- package/dist/chunk-PMLE7KAQ.js.map +1 -0
- package/dist/{chunk-HY5HLFDU.js → chunk-QF7VEL3M.js} +115 -14
- package/dist/chunk-QF7VEL3M.js.map +1 -0
- package/dist/{chunk-B3TSS7BT.js → chunk-QJ44VG5G.js} +2 -2
- package/dist/{chunk-VE3IYNDN.js → chunk-SA6HXL4Y.js} +2 -2
- package/dist/{chunk-UK4E2FUA.js → chunk-TZYINKCC.js} +75 -53
- package/dist/chunk-TZYINKCC.js.map +1 -0
- package/dist/{chunk-32JSYXEK.js → chunk-V7QOIQYC.js} +2 -2
- package/dist/{chunk-ANI2NTR4.js → chunk-XUEMATVY.js} +6 -6
- package/dist/{chunk-D6ZBGJ3L.js → chunk-ZVZMWNCG.js} +129 -35
- package/dist/chunk-ZVZMWNCG.js.map +1 -0
- package/dist/cli.js +35 -35
- package/dist/cli.js.map +1 -1
- package/dist/{config-KGZUPAUP.js → config-LEBZZCJP.js} +4 -4
- package/dist/{conventions-RYN7OXJN.js → conventions-XOT6YW5L.js} +6 -6
- package/dist/{execute-QL3ZQIAP.js → execute-LELOSR5T.js} +14 -14
- package/dist/{generate-CX6KNHZS.js → generate-JGW5JSKB.js} +10 -10
- package/dist/{init-PDVQDRS6.js → init-TO6MUXO4.js} +7 -5
- package/dist/{operations-CAKIT2BO.js → operations-O4FORFIH.js} +4 -4
- package/dist/{plan-PRORGS3L.js → plan-OXAT344Q.js} +12 -12
- package/dist/{policy-WX6O2JID.js → policy-U5NBFAO5.js} +5 -5
- package/dist/{pr-27RMQI5F.js → pr-UZHNKKZC.js} +12 -12
- package/dist/{pr-review-VNESMAMT.js → pr-review-Q4ACAWDM.js} +9 -9
- package/dist/{prd-ZNC4T5BS.js → prd-6CYEMLDY.js} +12 -12
- package/dist/{recorder-N7U66HCO.js → recorder-2BAKPBRA.js} +2 -2
- package/dist/{resume-VLWIE264.js → resume-URCU6CIJ.js} +26 -26
- package/dist/{review-7CREJDKB.js → review-LVZT2TMW.js} +13 -13
- package/dist/{routing-VCDYHSXA.js → routing-EK6RBZM4.js} +6 -6
- package/dist/run-2RXJCJKT.js +56 -0
- package/dist/{usage-U7QNGCPK.js → usage-KTMYXAPF.js} +3 -3
- package/dist/{web-HUNDHCJ4.js → web-B5UPHHR5.js} +8 -8
- package/package.json +1 -1
- package/web/AGENTS.md +115 -7
- package/web/public/app.css +393 -245
- package/web/public/app.js +108 -38
- package/web/public/index.html +106 -78
- package/dist/chunk-A4H7P7T7.js.map +0 -1
- package/dist/chunk-D6ZBGJ3L.js.map +0 -1
- package/dist/chunk-HJBF4WD2.js.map +0 -1
- package/dist/chunk-HY5HLFDU.js.map +0 -1
- package/dist/chunk-ISZ54SVE.js.map +0 -1
- package/dist/chunk-RCZJQUTC.js.map +0 -1
- package/dist/chunk-UK4E2FUA.js.map +0 -1
- package/dist/chunk-UWDCIFTP.js.map +0 -1
- package/dist/run-3MPORLF5.js +0 -56
- /package/dist/{agent-TB6W7PT7.js.map → agent-HMZTXCRT.js.map} +0 -0
- /package/dist/{analyze-6M3KEOX7.js.map → analyze-Q4ONIWRZ.js.map} +0 -0
- /package/dist/{apply-ADB3ZK7W.js.map → apply-EEFPY2W4.js.map} +0 -0
- /package/dist/{bench-FM7I7EIV.js.map → bench-WWWXLTFH.js.map} +0 -0
- /package/dist/{chunk-KZ5EY5XX.js.map → chunk-34OCSKOB.js.map} +0 -0
- /package/dist/{chunk-QMIQR7EE.js.map → chunk-62GVVZQO.js.map} +0 -0
- /package/dist/{chunk-YII4U7ZD.js.map → chunk-6K2LCFG6.js.map} +0 -0
- /package/dist/{chunk-SGTTR4XW.js.map → chunk-E4I6MMHD.js.map} +0 -0
- /package/dist/{chunk-6YQT3SSM.js.map → chunk-ECU7YO7S.js.map} +0 -0
- /package/dist/{chunk-MI5TREN3.js.map → chunk-EG2MGDP5.js.map} +0 -0
- /package/dist/{chunk-HLAPOUEM.js.map → chunk-KMCS76ZW.js.map} +0 -0
- /package/dist/{chunk-KZXQWC7U.js.map → chunk-KRAGAUKD.js.map} +0 -0
- /package/dist/{chunk-E6KXCV3T.js.map → chunk-LGHND47K.js.map} +0 -0
- /package/dist/{chunk-DV7HUC4Z.js.map → chunk-LI35PIIS.js.map} +0 -0
- /package/dist/{chunk-Z5O2XBWA.js.map → chunk-LTH6XYZ3.js.map} +0 -0
- /package/dist/{chunk-LPWPFIIB.js.map → chunk-OODXFCQV.js.map} +0 -0
- /package/dist/{chunk-B3TSS7BT.js.map → chunk-QJ44VG5G.js.map} +0 -0
- /package/dist/{chunk-VE3IYNDN.js.map → chunk-SA6HXL4Y.js.map} +0 -0
- /package/dist/{chunk-32JSYXEK.js.map → chunk-V7QOIQYC.js.map} +0 -0
- /package/dist/{chunk-ANI2NTR4.js.map → chunk-XUEMATVY.js.map} +0 -0
- /package/dist/{config-KGZUPAUP.js.map → config-LEBZZCJP.js.map} +0 -0
- /package/dist/{conventions-RYN7OXJN.js.map → conventions-XOT6YW5L.js.map} +0 -0
- /package/dist/{execute-QL3ZQIAP.js.map → execute-LELOSR5T.js.map} +0 -0
- /package/dist/{generate-CX6KNHZS.js.map → generate-JGW5JSKB.js.map} +0 -0
- /package/dist/{init-PDVQDRS6.js.map → init-TO6MUXO4.js.map} +0 -0
- /package/dist/{operations-CAKIT2BO.js.map → operations-O4FORFIH.js.map} +0 -0
- /package/dist/{plan-PRORGS3L.js.map → plan-OXAT344Q.js.map} +0 -0
- /package/dist/{policy-WX6O2JID.js.map → policy-U5NBFAO5.js.map} +0 -0
- /package/dist/{pr-27RMQI5F.js.map → pr-UZHNKKZC.js.map} +0 -0
- /package/dist/{pr-review-VNESMAMT.js.map → pr-review-Q4ACAWDM.js.map} +0 -0
- /package/dist/{prd-ZNC4T5BS.js.map → prd-6CYEMLDY.js.map} +0 -0
- /package/dist/{recorder-N7U66HCO.js.map → recorder-2BAKPBRA.js.map} +0 -0
- /package/dist/{resume-VLWIE264.js.map → resume-URCU6CIJ.js.map} +0 -0
- /package/dist/{review-7CREJDKB.js.map → review-LVZT2TMW.js.map} +0 -0
- /package/dist/{routing-VCDYHSXA.js.map → routing-EK6RBZM4.js.map} +0 -0
- /package/dist/{run-3MPORLF5.js.map → run-2RXJCJKT.js.map} +0 -0
- /package/dist/{usage-U7QNGCPK.js.map → usage-KTMYXAPF.js.map} +0 -0
- /package/dist/{web-HUNDHCJ4.js.map → web-B5UPHHR5.js.map} +0 -0
|
@@ -42,16 +42,50 @@ function modelForTier(harness, tier) {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
// src/routing/policy.ts
|
|
45
|
-
var RECOMMENDED_POLICY_VERSION = "
|
|
45
|
+
var RECOMMENDED_POLICY_VERSION = "2";
|
|
46
46
|
var RECOMMENDED_POLICY = {
|
|
47
|
-
analyze: {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
analyze: {
|
|
48
|
+
preferredTier: "fast",
|
|
49
|
+
optimizeFor: "cost-speed",
|
|
50
|
+
affinityHarness: "codex-cli"
|
|
51
|
+
},
|
|
52
|
+
generate: {
|
|
53
|
+
preferredTier: "mid",
|
|
54
|
+
optimizeFor: "balanced",
|
|
55
|
+
affinityHarness: "claude-code"
|
|
56
|
+
},
|
|
57
|
+
prd: {
|
|
58
|
+
preferredTier: "mid",
|
|
59
|
+
optimizeFor: "balanced",
|
|
60
|
+
affinityHarness: "claude-code"
|
|
61
|
+
},
|
|
62
|
+
plan: {
|
|
63
|
+
preferredTier: "fast",
|
|
64
|
+
optimizeFor: "cost-speed",
|
|
65
|
+
affinityHarness: "codex-cli"
|
|
66
|
+
},
|
|
67
|
+
execute: {
|
|
68
|
+
preferredTier: "mid",
|
|
69
|
+
escalateTo: "strong",
|
|
70
|
+
optimizeFor: "time-to-correct",
|
|
71
|
+
affinityHarness: "claude-code"
|
|
72
|
+
},
|
|
73
|
+
review: {
|
|
74
|
+
preferredTier: "strong",
|
|
75
|
+
optimizeFor: "quality",
|
|
76
|
+
independentFrom: "execute",
|
|
77
|
+
affinityHarness: "codex-cli"
|
|
78
|
+
},
|
|
79
|
+
pr: {
|
|
80
|
+
preferredTier: "fast",
|
|
81
|
+
optimizeFor: "cost-speed",
|
|
82
|
+
affinityHarness: "codex-cli"
|
|
83
|
+
},
|
|
84
|
+
"pr-review": {
|
|
85
|
+
preferredTier: "strong",
|
|
86
|
+
optimizeFor: "quality",
|
|
87
|
+
affinityHarness: "codex-cli"
|
|
88
|
+
}
|
|
55
89
|
};
|
|
56
90
|
var PROVIDERS = {
|
|
57
91
|
"claude-code": "claude",
|
|
@@ -64,11 +98,12 @@ function recommendedFor(phase) {
|
|
|
64
98
|
}
|
|
65
99
|
function recommendedTarget(phase) {
|
|
66
100
|
const entry = recommendedFor(phase);
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const
|
|
101
|
+
const harness = entry.affinityHarness;
|
|
102
|
+
if (harness === void 0) return null;
|
|
103
|
+
const model = modelForTier(harness, entry.preferredTier);
|
|
104
|
+
const provider = PROVIDERS[harness];
|
|
70
105
|
if (model === null || provider === void 0) return null;
|
|
71
|
-
return { harness
|
|
106
|
+
return { harness, provider, model: model.id, tier: entry.preferredTier };
|
|
72
107
|
}
|
|
73
108
|
|
|
74
109
|
// src/routing/priors.ts
|
|
@@ -158,10 +193,46 @@ function classify(hay, signals) {
|
|
|
158
193
|
// src/routing/capabilities.ts
|
|
159
194
|
function filterEligible(input) {
|
|
160
195
|
const reasons = [];
|
|
196
|
+
let eligible = true;
|
|
161
197
|
if (input.requiresExtraDirectories && input.capabilities.extraDirectories === "none") {
|
|
162
198
|
reasons.push("MISSING_CAPABILITY:extraDirectories");
|
|
199
|
+
reasons.push("CAPABILITY_MISMATCH");
|
|
200
|
+
eligible = false;
|
|
201
|
+
}
|
|
202
|
+
const readiness = input.readiness;
|
|
203
|
+
if (readiness !== void 0 && readiness !== null) {
|
|
204
|
+
if (!readiness.installed) {
|
|
205
|
+
reasons.push("PROVIDER_NOT_INSTALLED");
|
|
206
|
+
eligible = false;
|
|
207
|
+
} else if (readiness.cooldownUntil !== null && Date.parse(readiness.cooldownUntil) > Date.parse(readiness.observedAt)) {
|
|
208
|
+
reasons.push("PROVIDER_COOLDOWN");
|
|
209
|
+
eligible = false;
|
|
210
|
+
} else if (readiness.authentication === "failed") {
|
|
211
|
+
reasons.push("AUTHENTICATION_FAILED");
|
|
212
|
+
reasons.push("PROVIDER_UNAVAILABLE");
|
|
213
|
+
eligible = false;
|
|
214
|
+
} else if (readiness.state === "unavailable") {
|
|
215
|
+
reasons.push("PROVIDER_UNAVAILABLE");
|
|
216
|
+
eligible = false;
|
|
217
|
+
} else if (readiness.authentication === "unverified" || readiness.state === "conditional") {
|
|
218
|
+
reasons.push("AUTHENTICATION_UNVERIFIED");
|
|
219
|
+
reasons.push("READINESS_CONDITIONAL");
|
|
220
|
+
if (input.allowConditional === false) {
|
|
221
|
+
reasons.push("PROVIDER_UNAVAILABLE");
|
|
222
|
+
eligible = false;
|
|
223
|
+
}
|
|
224
|
+
} else {
|
|
225
|
+
reasons.push("READINESS_CONFIRMED");
|
|
226
|
+
}
|
|
227
|
+
const modelAccess = readiness.models[0]?.access;
|
|
228
|
+
if (modelAccess === "denied") {
|
|
229
|
+
reasons.push("MODEL_NOT_ACCESSIBLE");
|
|
230
|
+
eligible = false;
|
|
231
|
+
} else if (modelAccess === "unverified") {
|
|
232
|
+
reasons.push("MODEL_ACCESS_UNVERIFIED");
|
|
233
|
+
}
|
|
163
234
|
}
|
|
164
|
-
return { eligible
|
|
235
|
+
return { eligible, reasonCodes: reasons };
|
|
165
236
|
}
|
|
166
237
|
|
|
167
238
|
// src/routing/score.ts
|
|
@@ -176,6 +247,12 @@ var PROFILE_WEIGHTS = {
|
|
|
176
247
|
function clampLearned(value) {
|
|
177
248
|
return Math.max(-DELTA, Math.min(DELTA, value));
|
|
178
249
|
}
|
|
250
|
+
function readinessMultiplier(state) {
|
|
251
|
+
if (state === "ready") return 1;
|
|
252
|
+
if (state === "conditional") return 0.72;
|
|
253
|
+
if (state === "unavailable") return 0;
|
|
254
|
+
return 1;
|
|
255
|
+
}
|
|
179
256
|
function scoreCandidates(inputs) {
|
|
180
257
|
const profile = inputs[0]?.profile ?? "balanced";
|
|
181
258
|
const scored = inputs.map((input) => {
|
|
@@ -186,7 +263,8 @@ function scoreCandidates(inputs) {
|
|
|
186
263
|
const weights = PROFILE_WEIGHTS[profile];
|
|
187
264
|
const costScore = 1 / input.relativeCost;
|
|
188
265
|
const latencyScore = 1 / input.relativeLatency;
|
|
189
|
-
const
|
|
266
|
+
const preferenceBonus = (input.preferredTierMatch === true ? 0.12 : 0) + (input.affinityMatch === true ? 0.08 : 0);
|
|
267
|
+
const score = input.eligible ? ((prior + learned) * weights.quality + costScore * weights.cost + latencyScore * weights.latency + preferenceBonus) * readinessMultiplier(input.readinessState) : 0;
|
|
190
268
|
const reasonCodes = [...input.reasonCodes];
|
|
191
269
|
if (input.eligible && samples === 0) reasonCodes.push("COLD_START");
|
|
192
270
|
if (input.eligible && learned > 0) reasonCodes.push("HIGH_HISTORICAL_SUCCESS");
|
|
@@ -259,32 +337,48 @@ function decideRouting(input) {
|
|
|
259
337
|
reasonCodes: ["EXPLICIT_CONFIG"]
|
|
260
338
|
};
|
|
261
339
|
}
|
|
340
|
+
const recommendation = input.policy === "recommended" ? recommendedFor(input.phase) : null;
|
|
341
|
+
const allowConditional = recommendation?.allowConditional !== false;
|
|
262
342
|
const scored = scoreCandidates(
|
|
263
343
|
Object.keys(CAPS).flatMap((harness) => {
|
|
344
|
+
const providerId = PROVIDER[harness];
|
|
345
|
+
const readiness = input.readiness === void 0 || input.readiness === null ? null : input.readiness.providers[providerId] ?? null;
|
|
264
346
|
const eligibility = filterEligible({
|
|
265
347
|
harness,
|
|
266
348
|
capabilities: CAPS[harness],
|
|
267
349
|
phase: input.phase,
|
|
268
|
-
requiresExtraDirectories: input.requiresExtraDirectories === true
|
|
350
|
+
requiresExtraDirectories: input.requiresExtraDirectories === true,
|
|
351
|
+
readiness,
|
|
352
|
+
allowConditional
|
|
353
|
+
});
|
|
354
|
+
return modelsFor(harness, CAPS[harness]).map((model) => {
|
|
355
|
+
const reasonCodes = [...eligibility.reasonCodes];
|
|
356
|
+
const preferredTierMatch = recommendation !== null && model.tier === recommendation.preferredTier;
|
|
357
|
+
const affinityMatch = recommendation !== null && recommendation.affinityHarness === harness;
|
|
358
|
+
if (preferredTierMatch) reasonCodes.push("RECOMMENDED_POLICY");
|
|
359
|
+
if (affinityMatch) reasonCodes.push("HARNESS_AFFINITY");
|
|
360
|
+
if (model.tier === "fast" && analyzed.risk !== "high") {
|
|
361
|
+
reasonCodes.push("CHEAPER_TIER_SUFFICIENT");
|
|
362
|
+
}
|
|
363
|
+
if (model.tier === "strong" && (analyzed.risk === "high" || profile === "quality")) {
|
|
364
|
+
reasonCodes.push("STRONGER_TIER_FOR_RISK");
|
|
365
|
+
}
|
|
366
|
+
return {
|
|
367
|
+
harness,
|
|
368
|
+
provider: providerId,
|
|
369
|
+
model: model.id,
|
|
370
|
+
tier: model.tier,
|
|
371
|
+
relativeCost: model.relativeCost,
|
|
372
|
+
relativeLatency: model.relativeLatency,
|
|
373
|
+
eligible: eligibility.eligible,
|
|
374
|
+
reasonCodes,
|
|
375
|
+
taskClass: analyzed.taskClass,
|
|
376
|
+
profile,
|
|
377
|
+
readinessState: readiness?.state ?? null,
|
|
378
|
+
preferredTierMatch,
|
|
379
|
+
affinityMatch
|
|
380
|
+
};
|
|
269
381
|
});
|
|
270
|
-
const recommendation = input.policy === "recommended" ? recommendedFor(input.phase) : null;
|
|
271
|
-
return modelsFor(harness, CAPS[harness]).map((model) => ({
|
|
272
|
-
harness,
|
|
273
|
-
provider: PROVIDER[harness] ?? harness,
|
|
274
|
-
model: model.id,
|
|
275
|
-
tier: model.tier,
|
|
276
|
-
relativeCost: model.relativeCost,
|
|
277
|
-
relativeLatency: model.relativeLatency,
|
|
278
|
-
eligible: eligibility.eligible && (recommendation === null || model.tier === recommendation.tier && (recommendation.preferHarness === void 0 || recommendation.preferHarness === harness)),
|
|
279
|
-
reasonCodes: [
|
|
280
|
-
...eligibility.reasonCodes,
|
|
281
|
-
...recommendation !== null && model.tier === recommendation.tier && (recommendation.preferHarness === void 0 || recommendation.preferHarness === harness) ? ["RECOMMENDED_POLICY"] : [],
|
|
282
|
-
...model.tier === "fast" && analyzed.risk !== "high" ? ["CHEAPER_TIER_SUFFICIENT"] : [],
|
|
283
|
-
...model.tier === "strong" && (analyzed.risk === "high" || profile === "quality") ? ["STRONGER_TIER_FOR_RISK"] : []
|
|
284
|
-
],
|
|
285
|
-
taskClass: analyzed.taskClass,
|
|
286
|
-
profile
|
|
287
|
-
}));
|
|
288
382
|
})
|
|
289
383
|
);
|
|
290
384
|
const selected = pickSelected(scored);
|
|
@@ -318,4 +412,4 @@ export {
|
|
|
318
412
|
PRIORS_VERSION,
|
|
319
413
|
decideRouting
|
|
320
414
|
};
|
|
321
|
-
//# sourceMappingURL=chunk-
|
|
415
|
+
//# sourceMappingURL=chunk-ZVZMWNCG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/routing/models.ts","../src/routing/policy.ts","../src/routing/priors.ts","../src/routing/analyze.ts","../src/routing/capabilities.ts","../src/routing/score.ts","../src/routing/decide.ts"],"sourcesContent":["import type { AgentCapabilities } from '../agents/types.js';\n\nexport const MODEL_CATALOG_VERSION = '1';\n\nexport type ModelTier = 'fast' | 'mid' | 'strong';\n\nexport interface ModelEntry {\n id: string | null;\n tier: ModelTier;\n relativeCost: number;\n relativeLatency: number;\n}\n\n/**\n * Deliberately hand-maintained. Harnesses do not expose a stable price/tier API,\n * so relative values are more durable than USD prices and keep the router pure.\n */\nexport const MODEL_CATALOG: Record<string, readonly ModelEntry[]> = {\n 'claude-code': [\n { id: 'haiku', tier: 'fast', relativeCost: 1, relativeLatency: 1 },\n { id: 'sonnet', tier: 'mid', relativeCost: 3.5, relativeLatency: 1.5 },\n { id: 'opus', tier: 'strong', relativeCost: 8, relativeLatency: 2.2 },\n ],\n 'codex-cli': [\n { id: 'gpt-5.6-luna', tier: 'fast', relativeCost: 1, relativeLatency: 1 },\n { id: 'gpt-5.6-terra', tier: 'mid', relativeCost: 3, relativeLatency: 1.45 },\n { id: 'gpt-5.6-sol', tier: 'strong', relativeCost: 7, relativeLatency: 2.1 },\n ],\n 'cursor-cli': [\n { id: 'auto-fast', tier: 'fast', relativeCost: 1, relativeLatency: 1 },\n { id: 'auto', tier: 'mid', relativeCost: 3, relativeLatency: 1.5 },\n { id: 'auto-strong', tier: 'strong', relativeCost: 7, relativeLatency: 2.1 },\n ],\n 'antigravity-cli': [\n { id: 'gemini-3.5-flash-low', tier: 'fast', relativeCost: 1, relativeLatency: 1 },\n { id: 'gemini-3.5-flash-medium', tier: 'mid', relativeCost: 2.5, relativeLatency: 1.4 },\n { id: 'gemini-3.5-pro-high', tier: 'strong', relativeCost: 6, relativeLatency: 2 },\n ],\n};\n\nconst DEFAULT_ONLY: readonly ModelEntry[] = [\n { id: null, tier: 'mid', relativeCost: 1, relativeLatency: 1 },\n];\n\nexport function modelsFor(harness: string, capabilities: AgentCapabilities): readonly ModelEntry[] {\n if (!capabilities.modelSelection) return DEFAULT_ONLY;\n return MODEL_CATALOG[harness] ?? DEFAULT_ONLY;\n}\n\nexport function modelForTier(harness: string, tier: ModelTier): ModelEntry | null {\n return MODEL_CATALOG[harness]?.find((entry) => entry.tier === tier) ?? null;\n}\n","import type { AgentPhase, AgentProviderId } from '../agents/types.js';\nimport { type ModelTier, modelForTier } from './models.js';\nimport type { ExecutionTarget } from './types.js';\n\nexport const RECOMMENDED_POLICY_VERSION = '2';\n\nexport type OptimizeFor = 'cost-speed' | 'time-to-correct' | 'quality' | 'balanced';\n\n/**\n * Phase objectives for the opinionated policy. Affinity is a soft prior /\n * tie-break — never an eligibility filter that eliminates other harnesses.\n */\nexport interface RecommendedPolicyEntry {\n preferredTier: ModelTier;\n optimizeFor: OptimizeFor;\n escalateTo?: ModelTier;\n independentFrom?: AgentPhase;\n /** When true (default), conditional providers may win if no ready peer exists. */\n allowConditional?: boolean;\n /** Soft harness affinity for scoring — not a hard pin. */\n affinityHarness?: string;\n}\n\n/** The token-economy guidance from docs/agents.md, made executable and reviewable. */\nexport const RECOMMENDED_POLICY: Record<AgentPhase, RecommendedPolicyEntry> = {\n analyze: {\n preferredTier: 'fast',\n optimizeFor: 'cost-speed',\n affinityHarness: 'codex-cli',\n },\n generate: {\n preferredTier: 'mid',\n optimizeFor: 'balanced',\n affinityHarness: 'claude-code',\n },\n prd: {\n preferredTier: 'mid',\n optimizeFor: 'balanced',\n affinityHarness: 'claude-code',\n },\n plan: {\n preferredTier: 'fast',\n optimizeFor: 'cost-speed',\n affinityHarness: 'codex-cli',\n },\n execute: {\n preferredTier: 'mid',\n escalateTo: 'strong',\n optimizeFor: 'time-to-correct',\n affinityHarness: 'claude-code',\n },\n review: {\n preferredTier: 'strong',\n optimizeFor: 'quality',\n independentFrom: 'execute',\n affinityHarness: 'codex-cli',\n },\n pr: {\n preferredTier: 'fast',\n optimizeFor: 'cost-speed',\n affinityHarness: 'codex-cli',\n },\n 'pr-review': {\n preferredTier: 'strong',\n optimizeFor: 'quality',\n affinityHarness: 'codex-cli',\n },\n};\n\nconst PROVIDERS: Record<string, AgentProviderId> = {\n 'claude-code': 'claude',\n 'codex-cli': 'codex',\n 'cursor-cli': 'cursor',\n 'antigravity-cli': 'antigravity',\n};\n\nexport function recommendedFor(phase: AgentPhase): RecommendedPolicyEntry {\n return RECOMMENDED_POLICY[phase];\n}\n\n/**\n * Illustrative affinity target for `routing explain`. The live decision may\n * pick a different harness when readiness or score says so.\n */\nexport function recommendedTarget(phase: AgentPhase): ExecutionTarget | null {\n const entry = recommendedFor(phase);\n const harness = entry.affinityHarness;\n if (harness === undefined) return null;\n const model = modelForTier(harness, entry.preferredTier);\n const provider = PROVIDERS[harness];\n if (model === null || provider === undefined) return null;\n return { harness, provider, model: model.id, tier: entry.preferredTier };\n}\n","import type { ModelTier } from './models.js';\nimport type { TaskClass } from './types.js';\n\n/** Bump when a cell's provenance changes. */\nexport const PRIORS_VERSION = '2';\n\n/**\n * Cold-start priors. Provenance: author judgement on 2026-08-30 from the\n * #79 baseline and the #76 capability matrix — not measured affinity.\n */\ntype HarnessPriors = Record<string, Record<ModelTier, number>>;\n\nfunction tiers(mid: number): Record<ModelTier, number> {\n return { fast: Math.max(0, mid - 0.25), mid, strong: Math.min(1, mid + 0.12) };\n}\n\nfunction harnesses(values: Record<string, number>): HarnessPriors {\n return Object.fromEntries(Object.entries(values).map(([harness, mid]) => [harness, tiers(mid)]));\n}\n\nexport const PRIORS: Record<TaskClass, HarnessPriors> = {\n bugfix: harnesses({\n 'claude-code': 0.7,\n 'codex-cli': 0.95,\n 'cursor-cli': 0.65,\n 'antigravity-cli': 0.6,\n }),\n feature: harnesses({\n 'claude-code': 0.85,\n 'codex-cli': 0.8,\n 'cursor-cli': 0.7,\n 'antigravity-cli': 0.65,\n }),\n refactor: harnesses({\n 'claude-code': 0.75,\n 'codex-cli': 0.9,\n 'cursor-cli': 0.65,\n 'antigravity-cli': 0.6,\n }),\n docs: harnesses({\n 'claude-code': 0.8,\n 'codex-cli': 0.7,\n 'cursor-cli': 0.75,\n 'antigravity-cli': 0.7,\n }),\n test: harnesses({\n 'claude-code': 0.7,\n 'codex-cli': 0.9,\n 'cursor-cli': 0.65,\n 'antigravity-cli': 0.6,\n }),\n infra: harnesses({\n 'claude-code': 0.8,\n 'codex-cli': 0.75,\n 'cursor-cli': 0.6,\n 'antigravity-cli': 0.55,\n }),\n analysis: harnesses({\n 'claude-code': 0.95,\n 'codex-cli': 0.6,\n 'cursor-cli': 0.7,\n 'antigravity-cli': 0.65,\n }),\n};\n\nexport function priorFor(taskClass: TaskClass, harness: string, tier: ModelTier): number {\n return PRIORS[taskClass][harness]?.[tier] ?? 0.5;\n}\n","import type { RiskLevel, TaskClass, TaskSignals } from './types.js';\n\nconst RISK_PATHS = [/auth/i, /migrat/i, /infra/i, /\\.github\\//i, /permission/i, /secret/i];\n\nexport interface AnalyzedTask {\n taskClass: TaskClass;\n risk: RiskLevel;\n}\n\n/** Deterministic. No model, no I/O. Every class is reachable. */\nexport function analyzeTask(signals: TaskSignals = {}): AnalyzedTask {\n const hay = [\n signals.title ?? '',\n signals.body ?? '',\n ...(signals.labels ?? []),\n ...(signals.paths ?? []),\n ]\n .join(' ')\n .toLowerCase();\n\n const taskClass = classify(hay, signals);\n const risk = RISK_PATHS.some((pattern) =>\n (signals.paths ?? []).some((path) => pattern.test(path)),\n )\n ? 'high'\n : /security|auth|migrat/.test(hay)\n ? 'high'\n : /refactor|large|epic/.test(hay)\n ? 'medium'\n : 'low';\n\n return { taskClass, risk };\n}\n\nfunction classify(hay: string, signals: TaskSignals): TaskClass {\n if (/\\bdocs?\\b|readme|changelog/.test(hay)) return 'docs';\n if (/\\btest|spec|coverage/.test(hay)) return 'test';\n if (/\\bcie?|deploy|infra|workflow|docker/.test(hay)) return 'infra';\n if (/\\banaly[sz]e|investigat|research/.test(hay)) return 'analysis';\n if (/\\bbug|fix|regres+ion|crash/.test(hay)) return 'bugfix';\n if (/\\brefactor|cleanup|extract/.test(hay)) return 'refactor';\n if (/\\bfeat|feature|add |implement/.test(hay)) return 'feature';\n if ((signals.labels ?? []).some((label) => /bug/i.test(label))) return 'bugfix';\n if ((signals.labels ?? []).some((label) => /enhancement|feature/i.test(label))) return 'feature';\n return 'feature';\n}\n","import type { ProviderReadiness } from '../agents/availability.js';\nimport type { AgentCapabilities, AgentPhase } from '../agents/types.js';\n\nexport interface EligibilityInput {\n harness: string;\n capabilities: AgentCapabilities;\n phase: AgentPhase;\n requiresExtraDirectories: boolean;\n readiness?: ProviderReadiness | null;\n /** Default true. When false, conditional/unverified providers are ineligible. */\n allowConditional?: boolean;\n}\n\nexport interface Eligibility {\n eligible: boolean;\n reasonCodes: string[];\n}\n\n/**\n * Restriction missing (`toolAllowlist`) is ignored. Enablement missing\n * (`extraDirectories`) is ineligible when the phase needs addDirs.\n * Readiness is injected by the caller — this module stays pure.\n */\nexport function filterEligible(input: EligibilityInput): Eligibility {\n const reasons: string[] = [];\n let eligible = true;\n\n if (input.requiresExtraDirectories && input.capabilities.extraDirectories === 'none') {\n reasons.push('MISSING_CAPABILITY:extraDirectories');\n reasons.push('CAPABILITY_MISMATCH');\n eligible = false;\n }\n\n const readiness = input.readiness;\n if (readiness !== undefined && readiness !== null) {\n if (!readiness.installed) {\n reasons.push('PROVIDER_NOT_INSTALLED');\n eligible = false;\n } else if (\n readiness.cooldownUntil !== null &&\n Date.parse(readiness.cooldownUntil) > Date.parse(readiness.observedAt)\n ) {\n reasons.push('PROVIDER_COOLDOWN');\n eligible = false;\n } else if (readiness.authentication === 'failed') {\n reasons.push('AUTHENTICATION_FAILED');\n reasons.push('PROVIDER_UNAVAILABLE');\n eligible = false;\n } else if (readiness.state === 'unavailable') {\n reasons.push('PROVIDER_UNAVAILABLE');\n eligible = false;\n } else if (readiness.authentication === 'unverified' || readiness.state === 'conditional') {\n reasons.push('AUTHENTICATION_UNVERIFIED');\n reasons.push('READINESS_CONDITIONAL');\n if (input.allowConditional === false) {\n reasons.push('PROVIDER_UNAVAILABLE');\n eligible = false;\n }\n } else {\n reasons.push('READINESS_CONFIRMED');\n }\n\n const modelAccess = readiness.models[0]?.access;\n if (modelAccess === 'denied') {\n reasons.push('MODEL_NOT_ACCESSIBLE');\n eligible = false;\n } else if (modelAccess === 'unverified') {\n reasons.push('MODEL_ACCESS_UNVERIFIED');\n }\n }\n\n return { eligible, reasonCodes: reasons };\n}\n","import type { ModelTier } from './models.js';\nimport { priorFor } from './priors.js';\nimport type { Candidate, RoutingProfile, TaskClass } from './types.js';\n\nexport const DELTA = 0.2;\nexport const MIN_SAMPLE_SIZE = 8;\n\nexport const PROFILE_WEIGHTS: Record<\n RoutingProfile,\n { quality: number; cost: number; latency: number }\n> = {\n economy: { quality: 0.5, cost: 0.4, latency: 0.1 },\n balanced: { quality: 0.6, cost: 0.25, latency: 0.15 },\n quality: { quality: 0.85, cost: 0.05, latency: 0.1 },\n speed: { quality: 0.45, cost: 0.1, latency: 0.45 },\n};\n\nexport interface ScoreInput {\n harness: string;\n provider: string;\n model?: string | null;\n tier: ModelTier;\n relativeCost: number;\n relativeLatency: number;\n eligible: boolean;\n reasonCodes: string[];\n taskClass: TaskClass;\n learned?: number;\n samples?: number;\n profile?: RoutingProfile;\n /** Observed cost status from #78; catalog-relative cost is always available. */\n costStatus?: 'reported' | 'estimated' | 'unknown';\n readinessState?: 'ready' | 'conditional' | 'unavailable' | null;\n preferredTierMatch?: boolean;\n affinityMatch?: boolean;\n}\n\nexport function clampLearned(value: number): number {\n return Math.max(-DELTA, Math.min(DELTA, value));\n}\n\nfunction readinessMultiplier(state: ScoreInput['readinessState']): number {\n if (state === 'ready') return 1;\n if (state === 'conditional') return 0.72;\n if (state === 'unavailable') return 0;\n return 1;\n}\n\nexport function scoreCandidates(inputs: readonly ScoreInput[]): Candidate[] {\n const profile = inputs[0]?.profile ?? 'balanced';\n const scored: Candidate[] = inputs.map((input) => {\n const prior = priorFor(input.taskClass, input.harness, input.tier);\n const samples = input.samples ?? 0;\n const rawLearned = samples >= MIN_SAMPLE_SIZE ? (input.learned ?? 0) : 0;\n const learned = clampLearned(rawLearned);\n const weights = PROFILE_WEIGHTS[profile];\n // This is catalog-relative ordering, not observed USD. An unknown reported\n // cost still contributes no measured-cost signal; the declared tier order\n // remains available to economy/balanced profiles.\n const costScore = 1 / input.relativeCost;\n const latencyScore = 1 / input.relativeLatency;\n const preferenceBonus =\n (input.preferredTierMatch === true ? 0.12 : 0) + (input.affinityMatch === true ? 0.08 : 0);\n const score = input.eligible\n ? ((prior + learned) * weights.quality +\n costScore * weights.cost +\n latencyScore * weights.latency +\n preferenceBonus) *\n readinessMultiplier(input.readinessState)\n : 0;\n const reasonCodes = [...input.reasonCodes];\n if (input.eligible && samples === 0) reasonCodes.push('COLD_START');\n if (input.eligible && learned > 0) reasonCodes.push('HIGH_HISTORICAL_SUCCESS');\n return {\n harness: input.harness,\n provider: input.provider,\n model: input.model ?? null,\n tier: input.tier,\n relativeCost: input.relativeCost,\n relativeLatency: input.relativeLatency,\n eligible: input.eligible,\n prior,\n learned,\n samples,\n score,\n reasonCodes,\n };\n });\n\n return scored.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.harness.localeCompare(b.harness);\n });\n}\n\nexport function pickSelected(candidates: readonly Candidate[]): Candidate {\n const eligible = candidates.filter((candidate) => candidate.eligible);\n if (eligible.length === 0) {\n throw new Error(\n `No eligible routing candidate: ${candidates.map((c) => `${c.harness} (${c.reasonCodes.join(',')})`).join('; ')}`,\n );\n }\n return eligible[0] as Candidate;\n}\n","import type { ReadinessSnapshot } from '../agents/availability.js';\nimport type { AgentPhase } from '../agents/types.js';\nimport {\n ANTIGRAVITY_CAPABILITIES,\n CLAUDE_CAPABILITIES,\n CODEX_CAPABILITIES,\n CURSOR_CAPABILITIES,\n} from '../agents/types.js';\nimport { analyzeTask } from './analyze.js';\nimport { filterEligible } from './capabilities.js';\nimport { MODEL_CATALOG_VERSION, modelsFor } from './models.js';\nimport { RECOMMENDED_POLICY_VERSION, recommendedFor } from './policy.js';\nimport { PRIORS_VERSION } from './priors.js';\nimport { pickSelected, scoreCandidates } from './score.js';\nimport type { RoutingDecision, RoutingMode, RoutingProfile, TaskSignals } from './types.js';\n\nconst CAPS = {\n 'claude-code': CLAUDE_CAPABILITIES,\n 'codex-cli': CODEX_CAPABILITIES,\n 'cursor-cli': CURSOR_CAPABILITIES,\n 'antigravity-cli': ANTIGRAVITY_CAPABILITIES,\n} as const;\n\nconst PROVIDER: Record<string, string> = {\n 'claude-code': 'claude',\n 'codex-cli': 'codex',\n 'cursor-cli': 'cursor',\n 'antigravity-cli': 'antigravity',\n};\n\nexport function decideRouting(input: {\n signals?: TaskSignals;\n phase: AgentPhase;\n actualHarness: string;\n actualProvider?: string;\n actualModel?: string | null;\n mode: RoutingMode;\n profile?: RoutingProfile;\n requiresExtraDirectories?: boolean;\n skipScore?: boolean;\n policy?: 'recommended';\n /** Injected inventory — router stays pure (no probes). */\n readiness?: ReadinessSnapshot | null;\n}): RoutingDecision | null {\n if (input.mode === 'off') return null;\n const analyzed = analyzeTask(input.signals ?? {});\n const profile = input.profile ?? 'balanced';\n const policyVersion = `${PRIORS_VERSION}:${MODEL_CATALOG_VERSION}:${input.policy === 'recommended' ? RECOMMENDED_POLICY_VERSION : 'adaptive'}`;\n\n if (input.skipScore) {\n return {\n policyVersion,\n profile,\n taskClass: analyzed.taskClass,\n risk: analyzed.risk,\n mode: input.mode,\n candidates: [],\n selected: {\n harness: input.actualHarness,\n provider: input.actualProvider ?? PROVIDER[input.actualHarness] ?? input.actualHarness,\n model: input.actualModel ?? null,\n },\n actual: {\n harness: input.actualHarness,\n provider: input.actualProvider ?? PROVIDER[input.actualHarness] ?? input.actualHarness,\n model: input.actualModel ?? null,\n },\n reasonCodes: ['EXPLICIT_CONFIG'],\n };\n }\n\n const recommendation = input.policy === 'recommended' ? recommendedFor(input.phase) : null;\n const allowConditional = recommendation?.allowConditional !== false;\n\n const scored = scoreCandidates(\n (Object.keys(CAPS) as (keyof typeof CAPS)[]).flatMap((harness) => {\n const providerId = PROVIDER[harness] as 'claude' | 'codex' | 'cursor' | 'antigravity';\n const readiness =\n input.readiness === undefined || input.readiness === null\n ? null\n : (input.readiness.providers[providerId] ?? null);\n const eligibility = filterEligible({\n harness,\n capabilities: CAPS[harness],\n phase: input.phase,\n requiresExtraDirectories: input.requiresExtraDirectories === true,\n readiness,\n allowConditional,\n });\n return modelsFor(harness, CAPS[harness]).map((model) => {\n const reasonCodes = [...eligibility.reasonCodes];\n const preferredTierMatch =\n recommendation !== null && model.tier === recommendation.preferredTier;\n const affinityMatch = recommendation !== null && recommendation.affinityHarness === harness;\n if (preferredTierMatch) reasonCodes.push('RECOMMENDED_POLICY');\n if (affinityMatch) reasonCodes.push('HARNESS_AFFINITY');\n if (model.tier === 'fast' && analyzed.risk !== 'high') {\n reasonCodes.push('CHEAPER_TIER_SUFFICIENT');\n }\n if (model.tier === 'strong' && (analyzed.risk === 'high' || profile === 'quality')) {\n reasonCodes.push('STRONGER_TIER_FOR_RISK');\n }\n return {\n harness,\n provider: providerId,\n model: model.id,\n tier: model.tier,\n relativeCost: model.relativeCost,\n relativeLatency: model.relativeLatency,\n eligible: eligibility.eligible,\n reasonCodes,\n taskClass: analyzed.taskClass,\n profile,\n readinessState: readiness?.state ?? null,\n preferredTierMatch,\n affinityMatch,\n };\n });\n }),\n );\n const selected = pickSelected(scored);\n return {\n policyVersion,\n profile,\n taskClass: analyzed.taskClass,\n risk: analyzed.risk,\n mode: input.mode,\n candidates: scored,\n selected: {\n harness: selected.harness,\n provider: selected.provider,\n model: selected.model ?? null,\n tier: selected.tier,\n },\n actual: {\n harness: input.actualHarness,\n provider: input.actualProvider ?? PROVIDER[input.actualHarness] ?? input.actualHarness,\n model: input.actualModel ?? null,\n },\n reasonCodes: selected.reasonCodes.includes('COLD_START')\n ? ['HIGH_PRIOR', ...selected.reasonCodes]\n : selected.reasonCodes,\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli.js
CHANGED
|
@@ -12,8 +12,8 @@ import {
|
|
|
12
12
|
setRoutingCliOverrides,
|
|
13
13
|
setVerifyCliOverrides,
|
|
14
14
|
setWebCliOverrides
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-QF7VEL3M.js";
|
|
16
|
+
import "./chunk-LI35PIIS.js";
|
|
17
17
|
import {
|
|
18
18
|
printError,
|
|
19
19
|
setGlobalTimeout,
|
|
@@ -24,7 +24,7 @@ import "./chunk-QPGEFLMY.js";
|
|
|
24
24
|
import "./chunk-HAKDLR6N.js";
|
|
25
25
|
import "./chunk-YVPZUN6X.js";
|
|
26
26
|
import "./chunk-DUS5ZNKL.js";
|
|
27
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-6K2LCFG6.js";
|
|
28
28
|
import "./chunk-PPZ3K4YM.js";
|
|
29
29
|
import "./chunk-SOM4QA6C.js";
|
|
30
30
|
import {
|
|
@@ -353,8 +353,8 @@ withIssueOptions(
|
|
|
353
353
|
)
|
|
354
354
|
).action(
|
|
355
355
|
async (options) => {
|
|
356
|
-
const { loadIssuesConfig } = await import("./config-
|
|
357
|
-
const { runInit } = await import("./init-
|
|
356
|
+
const { loadIssuesConfig } = await import("./config-LEBZZCJP.js");
|
|
357
|
+
const { runInit } = await import("./init-TO6MUXO4.js");
|
|
358
358
|
const { preferredProvider } = await loadIssuesConfig();
|
|
359
359
|
const code = await runInit(preferredProvider, {
|
|
360
360
|
...options,
|
|
@@ -376,7 +376,7 @@ withGlobalOptions(
|
|
|
376
376
|
}
|
|
377
377
|
throw error;
|
|
378
378
|
}
|
|
379
|
-
const { runGenerate } = await import("./generate-
|
|
379
|
+
const { runGenerate } = await import("./generate-JGW5JSKB.js");
|
|
380
380
|
const code = await runGenerate(options.prompt, target);
|
|
381
381
|
process.exit(code);
|
|
382
382
|
});
|
|
@@ -419,7 +419,7 @@ withUserStoryNumberingOptions(
|
|
|
419
419
|
}
|
|
420
420
|
throw error;
|
|
421
421
|
}
|
|
422
|
-
const { runPipeline } = await import("./run-
|
|
422
|
+
const { runPipeline } = await import("./run-2RXJCJKT.js");
|
|
423
423
|
const code = await runPipeline(
|
|
424
424
|
issues,
|
|
425
425
|
options.mode,
|
|
@@ -448,7 +448,7 @@ withIssueOptions(
|
|
|
448
448
|
program.command("resume").description("Resume an interrupted pipeline from the phase it stopped at").argument("[issue]", "Issue to resume. Omitted: the most recently attempted one").option("--all", "Resume every unfinished issue of this project, in order").option("--mode <mode>", "Execution mode: auto | manual", "auto")
|
|
449
449
|
)
|
|
450
450
|
).action(async (issue, options) => {
|
|
451
|
-
const { runResume } = await import("./resume-
|
|
451
|
+
const { runResume } = await import("./resume-URCU6CIJ.js");
|
|
452
452
|
const code = await runResume(issue, {
|
|
453
453
|
...options.all === void 0 ? {} : { all: options.all },
|
|
454
454
|
...options.mode === void 0 ? {} : { mode: options.mode }
|
|
@@ -458,7 +458,7 @@ withIssueOptions(
|
|
|
458
458
|
withGlobalOptions(
|
|
459
459
|
program.command("status").description("What is running right now, in which phase, and since when").argument("[issue]", "Restrict the report to one issue").option("--json", "Emit the assembled state as JSON")
|
|
460
460
|
).action(async (issue, options) => {
|
|
461
|
-
const { runStatus } = await import("./operations-
|
|
461
|
+
const { runStatus } = await import("./operations-O4FORFIH.js");
|
|
462
462
|
process.exit(
|
|
463
463
|
await runStatus(issue, { ...options.json === void 0 ? {} : { json: options.json } })
|
|
464
464
|
);
|
|
@@ -467,7 +467,7 @@ withGlobalOptions(
|
|
|
467
467
|
program.command("usage").description("Aggregate execution telemetry from tasks.json").argument("[issue]", "Restrict the report to one issue").option("--issue <issue>", "Same as the positional argument").option("--since <date>", "Only executions started on or after this ISO date").option("--by <key>", "Group by harness, provider, model, purpose or status").option("--json", "Emit the assembled totals as JSON")
|
|
468
468
|
).action(
|
|
469
469
|
async (issue, options) => {
|
|
470
|
-
const { runUsage, USAGE_GROUP_KEYS } = await import("./usage-
|
|
470
|
+
const { runUsage, USAGE_GROUP_KEYS } = await import("./usage-KTMYXAPF.js");
|
|
471
471
|
const by = options.by;
|
|
472
472
|
if (by !== void 0 && !USAGE_GROUP_KEYS.includes(by)) {
|
|
473
473
|
printError("Must be one of: harness, provider, model, purpose, status.");
|
|
@@ -491,14 +491,14 @@ withGlobalOptions(
|
|
|
491
491
|
withGlobalOptions(
|
|
492
492
|
program.command("runs").description("History of the runs of this project, with how each ended")
|
|
493
493
|
).action(async () => {
|
|
494
|
-
const { runRuns } = await import("./operations-
|
|
494
|
+
const { runRuns } = await import("./operations-O4FORFIH.js");
|
|
495
495
|
process.exit(await runRuns());
|
|
496
496
|
});
|
|
497
497
|
withGlobalOptions(
|
|
498
498
|
program.command("logs").description("Read the execution journal (events.jsonl), filtered and readable").argument("[issue]", "Issue to read. Omitted: the most recently attempted one").option("--issue <issue>", "Same as the positional argument").option("--follow", "Keep reading as the journal grows").option("--tail <n>", "How many entries to show first (default 50)", parseInteger).option("--kind <kinds>", "Only these event types, comma separated (retry, phase:end, \u2026)")
|
|
499
499
|
).action(
|
|
500
500
|
async (issue, options) => {
|
|
501
|
-
const { runLogs } = await import("./operations-
|
|
501
|
+
const { runLogs } = await import("./operations-O4FORFIH.js");
|
|
502
502
|
const kinds = options.kind === void 0 ? void 0 : options.kind.split(",").map((kind) => kind.trim()).filter((kind) => kind !== "");
|
|
503
503
|
process.exit(
|
|
504
504
|
await runLogs(issue ?? options.issue, {
|
|
@@ -512,13 +512,13 @@ withGlobalOptions(
|
|
|
512
512
|
withGlobalOptions(
|
|
513
513
|
program.command("pause").description("Ask the running pipeline to stop after writing a checkpoint")
|
|
514
514
|
).action(async () => {
|
|
515
|
-
const { runPause } = await import("./operations-
|
|
515
|
+
const { runPause } = await import("./operations-O4FORFIH.js");
|
|
516
516
|
process.exit(await runPause());
|
|
517
517
|
});
|
|
518
518
|
withGlobalOptions(
|
|
519
519
|
program.command("cancel").description("Stop the run and mark the issue so a resume does not pick it up").argument("[issue]", "Issue to cancel. Omitted: the most recently attempted one")
|
|
520
520
|
).action(async (issue) => {
|
|
521
|
-
const { runCancel } = await import("./operations-
|
|
521
|
+
const { runCancel } = await import("./operations-O4FORFIH.js");
|
|
522
522
|
process.exit(await runCancel(issue));
|
|
523
523
|
});
|
|
524
524
|
withIssueOptions(
|
|
@@ -526,7 +526,7 @@ withIssueOptions(
|
|
|
526
526
|
program.command("analyze").description("Analyze an issue with the configured agent").argument("<issue>", "Issue number")
|
|
527
527
|
)
|
|
528
528
|
).action(async (issue) => {
|
|
529
|
-
const { runAnalyze } = await import("./analyze-
|
|
529
|
+
const { runAnalyze } = await import("./analyze-Q4ONIWRZ.js");
|
|
530
530
|
const code = await runAnalyze(issue);
|
|
531
531
|
process.exit(code);
|
|
532
532
|
});
|
|
@@ -535,7 +535,7 @@ withIssueOptions(
|
|
|
535
535
|
program.command("prd").description("Generate a PRD from an analyzed issue with the configured agent").argument("<issue>", "Issue number")
|
|
536
536
|
)
|
|
537
537
|
).action(async (issue) => {
|
|
538
|
-
const { runPrd } = await import("./prd-
|
|
538
|
+
const { runPrd } = await import("./prd-6CYEMLDY.js");
|
|
539
539
|
const code = await runPrd(issue);
|
|
540
540
|
process.exit(code);
|
|
541
541
|
});
|
|
@@ -556,7 +556,7 @@ withUserStoryNumberingOptions(
|
|
|
556
556
|
}
|
|
557
557
|
throw error;
|
|
558
558
|
}
|
|
559
|
-
const { runPlan } = await import("./plan-
|
|
559
|
+
const { runPlan } = await import("./plan-OXAT344Q.js");
|
|
560
560
|
const code = await runPlan(issue, void 0, numbering);
|
|
561
561
|
process.exit(code);
|
|
562
562
|
});
|
|
@@ -575,7 +575,7 @@ withWebOptions(
|
|
|
575
575
|
).action(
|
|
576
576
|
async (positionalMaxIter, options) => {
|
|
577
577
|
try {
|
|
578
|
-
const { runExecute } = await import("./execute-
|
|
578
|
+
const { runExecute } = await import("./execute-LELOSR5T.js");
|
|
579
579
|
const code = await runExecute(positionalMaxIter, options);
|
|
580
580
|
process.exit(code);
|
|
581
581
|
} catch (error) {
|
|
@@ -589,7 +589,7 @@ withIssueOptions(
|
|
|
589
589
|
program.command("review").description("Validate an issue resolution with the configured agent").argument("<issue>", "Issue number")
|
|
590
590
|
)
|
|
591
591
|
).action(async (issue) => {
|
|
592
|
-
const { runReview } = await import("./review-
|
|
592
|
+
const { runReview } = await import("./review-LVZT2TMW.js");
|
|
593
593
|
const code = await runReview(issue);
|
|
594
594
|
process.exit(code);
|
|
595
595
|
});
|
|
@@ -598,7 +598,7 @@ withIssueOptions(
|
|
|
598
598
|
program.command("pr").description("Create a pull request with the configured agent").argument("<issue>", "Issue number")
|
|
599
599
|
)
|
|
600
600
|
).action(async (issue) => {
|
|
601
|
-
const { runPr } = await import("./pr-
|
|
601
|
+
const { runPr } = await import("./pr-UZHNKKZC.js");
|
|
602
602
|
const code = await runPr(issue);
|
|
603
603
|
process.exit(code);
|
|
604
604
|
});
|
|
@@ -606,21 +606,21 @@ var webCommand = program.command("web").description("Manage the web monitoring s
|
|
|
606
606
|
webCommand.command("serve").description(
|
|
607
607
|
"Run the web monitor server in the foreground (internal \u2014 spawned detached by --web)"
|
|
608
608
|
).option("--port <n>", "Web server port (default: 3737)", parseInteger).option("--host <h>", "Web server host (default: 0.0.0.0)").option("--refresh <s>", "Suggested UI polling interval in seconds", parseInteger).action(async (options) => {
|
|
609
|
-
const { runWebServe } = await import("./web-
|
|
609
|
+
const { runWebServe } = await import("./web-B5UPHHR5.js");
|
|
610
610
|
const code = await runWebServe(options);
|
|
611
611
|
if (code !== 0) {
|
|
612
612
|
process.exit(code);
|
|
613
613
|
}
|
|
614
614
|
});
|
|
615
615
|
webCommand.command("stop").description("Stop the running web monitor server").action(async () => {
|
|
616
|
-
const { runWebStop } = await import("./web-
|
|
616
|
+
const { runWebStop } = await import("./web-B5UPHHR5.js");
|
|
617
617
|
const code = await runWebStop();
|
|
618
618
|
process.exit(code);
|
|
619
619
|
});
|
|
620
620
|
withGlobalOptions(
|
|
621
621
|
program.command("policy").description("Inspect the policies discovered in this repository and their provenance").option("--scope <dir>", "Resolve the policy for a subdirectory (monorepo)").option("--json", "Emit the resolved policy as JSON")
|
|
622
622
|
).action(async (options) => {
|
|
623
|
-
const { runPolicy } = await import("./policy-
|
|
623
|
+
const { runPolicy } = await import("./policy-U5NBFAO5.js");
|
|
624
624
|
const code = await runPolicy(options);
|
|
625
625
|
process.exit(code);
|
|
626
626
|
});
|
|
@@ -628,49 +628,49 @@ var routingCommand = withGlobalOptions(
|
|
|
628
628
|
program.command("routing").description("Inspect and configure adaptive harness/model routing")
|
|
629
629
|
);
|
|
630
630
|
routingCommand.option("--json", "Emit the resolved routing config as JSON").action(async (_options, command) => {
|
|
631
|
-
const { runRoutingInspect } = await import("./routing-
|
|
631
|
+
const { runRoutingInspect } = await import("./routing-EK6RBZM4.js");
|
|
632
632
|
process.exit(await runRoutingInspect(command.opts()));
|
|
633
633
|
});
|
|
634
634
|
routingCommand.command("explain").description("Explain the resolved routing target for every phase").option("--json", "Emit JSON").action(async (_options, command) => {
|
|
635
|
-
const { runRoutingExplain } = await import("./routing-
|
|
635
|
+
const { runRoutingExplain } = await import("./routing-EK6RBZM4.js");
|
|
636
636
|
process.exit(await runRoutingExplain(command.optsWithGlobals()));
|
|
637
637
|
});
|
|
638
|
-
routingCommand.command("use").description("Enable an embedded routing policy").argument("<policy>", "Policy name (recommended)").option("--global", "Write ~/.issue-flow/config.json (default)").option("--project", "Write .issue-flow.json instead").action(async (policy, _options, command) => {
|
|
639
|
-
const { runRoutingUse } = await import("./routing-
|
|
638
|
+
routingCommand.command("use").description("Enable an embedded routing policy").argument("<policy>", "Policy name (recommended)").option("--global", "Write ~/.issue-flow/config.json (default)").option("--project", "Write .issue-flow.json instead").option("--active", "Apply the policy to future runs instead of leaving routing in shadow mode").action(async (policy, _options, command) => {
|
|
639
|
+
const { runRoutingUse } = await import("./routing-EK6RBZM4.js");
|
|
640
640
|
process.exit(await runRoutingUse(policy, command.optsWithGlobals()));
|
|
641
641
|
});
|
|
642
642
|
routingCommand.command("report").description("Shadow agreement between selected and actual harness").option("--issue <n>", "Issue number").option("--json", "Emit JSON").action(async (_options, command) => {
|
|
643
|
-
const { runRoutingReport } = await import("./routing-
|
|
643
|
+
const { runRoutingReport } = await import("./routing-EK6RBZM4.js");
|
|
644
644
|
process.exit(await runRoutingReport(command.optsWithGlobals()));
|
|
645
645
|
});
|
|
646
646
|
var conventionsCommand = withGlobalOptions(
|
|
647
647
|
program.command("conventions").description("Compute the repository Git convention (branch, commit, PR title)")
|
|
648
648
|
);
|
|
649
649
|
conventionsCommand.command("branch").description("Print the deterministic branch name for an issue").option("--issue <n>", "Issue number").option("--title <text>", "Issue title, when the issue cannot be resolved").option("--json", "Emit JSON").action(async (options) => {
|
|
650
|
-
const { runConventionsBranch } = await import("./conventions-
|
|
650
|
+
const { runConventionsBranch } = await import("./conventions-XOT6YW5L.js");
|
|
651
651
|
process.exit(await runConventionsBranch(options));
|
|
652
652
|
});
|
|
653
653
|
conventionsCommand.command("commit").description("Print a Conventional Commit message").requiredOption("--type <type>", "Change type (feat, fix, docs, \u2026)").option("--scope <scope>", "Optional scope").requiredOption("--subject <text>", "Commit subject").option("--issue <n>", "Issue number for the Refs trailer").option("--story <id>", "Story id (US-010)").option("--breaking <text>", "Breaking change description").option("--json", "Emit JSON").action(
|
|
654
654
|
async (options) => {
|
|
655
|
-
const { runConventionsCommit } = await import("./conventions-
|
|
655
|
+
const { runConventionsCommit } = await import("./conventions-XOT6YW5L.js");
|
|
656
656
|
process.exit(await runConventionsCommit(options));
|
|
657
657
|
}
|
|
658
658
|
);
|
|
659
659
|
conventionsCommand.command("pr-title").description("Print the Conventional Commit Pull Request title").option("--issue <n>", "Issue number").option("--title <text>", "Issue title, when the issue cannot be resolved").option("--json", "Emit JSON").action(async (options) => {
|
|
660
|
-
const { runConventionsPrTitle } = await import("./conventions-
|
|
660
|
+
const { runConventionsPrTitle } = await import("./conventions-XOT6YW5L.js");
|
|
661
661
|
process.exit(await runConventionsPrTitle(options));
|
|
662
662
|
});
|
|
663
663
|
var agentCommand = withGlobalOptions(
|
|
664
664
|
program.command("agent").description("Inspect the resolved agent and model for each phase").option("--json", "Emit the resolved agent configuration as JSON")
|
|
665
665
|
);
|
|
666
666
|
agentCommand.action(async (options) => {
|
|
667
|
-
const { runAgent } = await import("./agent-
|
|
667
|
+
const { runAgent } = await import("./agent-HMZTXCRT.js");
|
|
668
668
|
const code = await runAgent(options);
|
|
669
669
|
process.exit(code);
|
|
670
670
|
});
|
|
671
671
|
agentCommand.command("use").description("Write an agent preference to config.json or .issue-flow.json").argument("<provider>", "claude, codex, cursor or antigravity").option("--model <model>", "Model identifier for this preference").option("--global", "Write to ~/.issue-flow/config.json (default)").option("--project", "Write to .issue-flow.json in the repository").option("--phase <phase>", "Write only the override for this phase").action(
|
|
672
672
|
async (provider, options) => {
|
|
673
|
-
const { runAgentUse } = await import("./agent-
|
|
673
|
+
const { runAgentUse } = await import("./agent-HMZTXCRT.js");
|
|
674
674
|
const code = await runAgentUse(provider, options);
|
|
675
675
|
process.exit(code);
|
|
676
676
|
}
|
|
@@ -682,7 +682,7 @@ withGlobalOptions(
|
|
|
682
682
|
)
|
|
683
683
|
).action(
|
|
684
684
|
async (pr, options) => {
|
|
685
|
-
const { runPrReview } = await import("./pr-review-
|
|
685
|
+
const { runPrReview } = await import("./pr-review-Q4ACAWDM.js");
|
|
686
686
|
const code = await runPrReview(pr, options);
|
|
687
687
|
process.exit(code);
|
|
688
688
|
}
|
|
@@ -708,7 +708,7 @@ withGlobalOptions(
|
|
|
708
708
|
printError("Unknown bench mode. Use 'synthetic' or 'real'.");
|
|
709
709
|
process.exit(1);
|
|
710
710
|
}
|
|
711
|
-
const { runBench } = await import("./bench-
|
|
711
|
+
const { runBench } = await import("./bench-WWWXLTFH.js");
|
|
712
712
|
process.exit(
|
|
713
713
|
await runBench({
|
|
714
714
|
...options.mode === void 0 ? {} : { mode: options.mode },
|