jonah-fleet 1.24.0 ā 1.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/dist/index.js +33 -8
- package/dist/lib/loop-guard.d.ts +5 -0
- package/dist/lib/loop-guard.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/scripts/run-with-loop-guard.js +44 -6
- package/templates/workflows/analytics-review-cron.yml +15 -0
- package/templates/workflows/design-review-cron.yml +10 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,31 @@ All notable changes to `jonah-fleet` will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.25.1](https://github.com/juliendurandeu/jonah-fleet/compare/v1.25.0...v1.25.1) (2026-09-23)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **radar:** calibrate upstream heuristics to eliminate false positive Category A and B alerts ([5a4ebfe](https://github.com/juliendurandeu/jonah-fleet/commit/5a4ebfe8588867ef0ff3aacab8ad6b6162cc5636))
|
|
14
|
+
|
|
15
|
+
## [1.25.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.24.0...v1.25.0) (2026-09-23)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
* **guard:** enrich LoopGuard diagnostics with action details and provision MCP in review workflows ([#367](https://github.com/juliendurandeu/jonah-fleet/issues/367)) ([a93d783](https://github.com/juliendurandeu/jonah-fleet/commit/a93d7833fd3caf6b5a4f8e50ccfeaa2d1e146c36))
|
|
21
|
+
|
|
22
|
+
## [Unreleased]
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* **guard:** capture action arguments on LoopGuard circuit breaker trips, enrich failure cards and reports with formatted action details, and surface active tool commands in runner stdout.
|
|
27
|
+
* **workflows:** provision MCP servers for Antigravity CLI in `analytics-review-cron.yml` and `design-review-cron.yml`.
|
|
28
|
+
|
|
29
|
+
### Bug Fixes
|
|
30
|
+
|
|
31
|
+
* **radar:** calibrate upstream heuristic classifier to filter release chores, non-GitHub platforms, and internal build details, eliminating false Category A/B alerts in weekly digests.
|
|
32
|
+
|
|
8
33
|
## [1.24.0](https://github.com/juliendurandeu/jonah-fleet/compare/v1.23.1...v1.24.0) (2026-09-23)
|
|
9
34
|
|
|
10
35
|
|
package/dist/index.js
CHANGED
|
@@ -3623,7 +3623,8 @@ var LoopGuard = class {
|
|
|
3623
3623
|
message: `Tool circuit breaker tripped: ${this.consecutiveErrorCount} consecutive identical tool errors for '${toolName}' with unchanged arguments.`,
|
|
3624
3624
|
toolName,
|
|
3625
3625
|
actionHash: hash,
|
|
3626
|
-
count: this.consecutiveErrorCount
|
|
3626
|
+
count: this.consecutiveErrorCount,
|
|
3627
|
+
args
|
|
3627
3628
|
});
|
|
3628
3629
|
}
|
|
3629
3630
|
} else {
|
|
@@ -3646,7 +3647,8 @@ var LoopGuard = class {
|
|
|
3646
3647
|
message: `Action repetition loop detected: tool '${toolName}' called ${repetitionCount} times with identical parameters within sliding window of ${this.slidingWindowSize}.`,
|
|
3647
3648
|
toolName,
|
|
3648
3649
|
actionHash: hash,
|
|
3649
|
-
count: repetitionCount
|
|
3650
|
+
count: repetitionCount,
|
|
3651
|
+
args
|
|
3650
3652
|
});
|
|
3651
3653
|
}
|
|
3652
3654
|
}
|
|
@@ -3674,7 +3676,8 @@ var LoopGuard = class {
|
|
|
3674
3676
|
message: `Alternating ping-pong action loop detected: ${this.pingPongThreshold} consecutive alternating cycles between tools (A-B-A-B-A-B).`,
|
|
3675
3677
|
toolName,
|
|
3676
3678
|
actionHash: hash,
|
|
3677
|
-
count: this.pingPongThreshold
|
|
3679
|
+
count: this.pingPongThreshold,
|
|
3680
|
+
args
|
|
3678
3681
|
});
|
|
3679
3682
|
}
|
|
3680
3683
|
}
|
|
@@ -3717,6 +3720,18 @@ var LoopGuard = class {
|
|
|
3717
3720
|
return trip;
|
|
3718
3721
|
}
|
|
3719
3722
|
};
|
|
3723
|
+
function formatActionSummary(toolName, args) {
|
|
3724
|
+
if (!args) return toolName;
|
|
3725
|
+
if (typeof args === "string") return `${toolName}: ${args}`;
|
|
3726
|
+
if (args.CommandLine) return `${toolName}: ${args.CommandLine}`;
|
|
3727
|
+
if (args.command) return `${toolName}: ${args.command}`;
|
|
3728
|
+
if (args.TargetFile) return `${toolName}: ${args.TargetFile}`;
|
|
3729
|
+
if (args.path) return `${toolName}: ${args.path}`;
|
|
3730
|
+
if (args.AbsolutePath) return `${toolName}: ${args.AbsolutePath}`;
|
|
3731
|
+
if (args.Query) return `${toolName}: ${args.Query}`;
|
|
3732
|
+
const str = canonicalStringify(args);
|
|
3733
|
+
return str.length > 200 ? `${toolName}: ${str.slice(0, 197)}...` : `${toolName}: ${str}`;
|
|
3734
|
+
}
|
|
3720
3735
|
function formatLoopGuardFailureCard(options) {
|
|
3721
3736
|
const serverUrl = options.serverUrl || process.env.GITHUB_SERVER_URL || "https://github.com";
|
|
3722
3737
|
const repository = options.repository || process.env.GITHUB_REPOSITORY || "";
|
|
@@ -3728,16 +3743,19 @@ function formatLoopGuardFailureCard(options) {
|
|
|
3728
3743
|
`- **Status**: Loop guard circuit breaker tripped (\`loop_circuit_breaker\`)`,
|
|
3729
3744
|
`- **Root Cause Category**: \`loop_circuit_breaker\``,
|
|
3730
3745
|
`- **Trigger**: \`${options.trip.reason}\``,
|
|
3731
|
-
`- **Reason**: ${options.trip.message}
|
|
3732
|
-
`- **Action**: Process terminated to prevent runaway token burn`
|
|
3746
|
+
`- **Reason**: ${options.trip.message}`
|
|
3733
3747
|
];
|
|
3748
|
+
if (options.trip.args !== void 0) {
|
|
3749
|
+
lines.push(`- **Triggered Action**: \`${formatActionSummary(options.trip.toolName, options.trip.args)}\``);
|
|
3750
|
+
}
|
|
3751
|
+
lines.push(`- **Action**: Process terminated to prevent runaway token burn`);
|
|
3734
3752
|
if (logUrl) {
|
|
3735
3753
|
lines.push(`- **Action Log**: [View Run Logs](${logUrl})`);
|
|
3736
3754
|
}
|
|
3737
3755
|
return lines.join("\n");
|
|
3738
3756
|
}
|
|
3739
3757
|
function formatLoopGuardReport(options) {
|
|
3740
|
-
|
|
3758
|
+
const reportLines = [
|
|
3741
3759
|
`# Run Report`,
|
|
3742
3760
|
``,
|
|
3743
3761
|
`## Result`,
|
|
@@ -3758,10 +3776,16 @@ function formatLoopGuardReport(options) {
|
|
|
3758
3776
|
`The autonomous execution was halted by the deterministic loop-guard wrapper.`,
|
|
3759
3777
|
`- **Category**: \`loop_circuit_breaker\``,
|
|
3760
3778
|
`- **Trigger**: \`${options.trip.reason}\``,
|
|
3761
|
-
`- **Tool**: \`${options.trip.toolName}
|
|
3779
|
+
`- **Tool**: \`${options.trip.toolName}\``
|
|
3780
|
+
];
|
|
3781
|
+
if (options.trip.args !== void 0) {
|
|
3782
|
+
reportLines.push(`- **Parameters**: \`${formatActionSummary(options.trip.toolName, options.trip.args)}\``);
|
|
3783
|
+
}
|
|
3784
|
+
reportLines.push(
|
|
3762
3785
|
`- **Action Hash**: \`${options.trip.actionHash}\``,
|
|
3763
3786
|
`- **Message**: ${options.trip.message}`
|
|
3764
|
-
|
|
3787
|
+
);
|
|
3788
|
+
return reportLines.join("\n");
|
|
3765
3789
|
}
|
|
3766
3790
|
|
|
3767
3791
|
// src/lib/runner.ts
|
|
@@ -6297,6 +6321,7 @@ export {
|
|
|
6297
6321
|
LoopGuard,
|
|
6298
6322
|
canonicalStringify,
|
|
6299
6323
|
computeActionHash,
|
|
6324
|
+
formatActionSummary,
|
|
6300
6325
|
formatLoopGuardFailureCard,
|
|
6301
6326
|
formatLoopGuardReport
|
|
6302
6327
|
};
|
package/dist/lib/loop-guard.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface LoopGuardTrip {
|
|
|
5
5
|
toolName: string;
|
|
6
6
|
actionHash: string;
|
|
7
7
|
count: number;
|
|
8
|
+
args?: any;
|
|
8
9
|
}
|
|
9
10
|
export interface ActionRecord {
|
|
10
11
|
toolName: string;
|
|
@@ -57,6 +58,10 @@ export declare class LoopGuard {
|
|
|
57
58
|
feedLine(line: string): LoopGuardTrip | null;
|
|
58
59
|
private triggerTrip;
|
|
59
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Formats a concise, human-readable summary of a tool action and its parameters.
|
|
63
|
+
*/
|
|
64
|
+
export declare function formatActionSummary(toolName: string, args: any): string;
|
|
60
65
|
export interface LoopGuardFailureCardOptions {
|
|
61
66
|
routine: string;
|
|
62
67
|
trip: LoopGuardTrip;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-guard.d.ts","sourceRoot":"","sources":["../../src/lib/loop-guard.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"loop-guard.d.ts","sourceRoot":"","sources":["../../src/lib/loop-guard.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAarD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAGrE;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,yBAAyB,CAAS;IAC1C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,MAAM,CAAC,CAAgC;IAE/C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,qBAAqB,CAAa;IAC1C,OAAO,CAAC,aAAa,CAA8B;IAEnD,YAAY,OAAO,GAAE,gBAAqB,EAMzC;IAEM,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI,CAE9D;IAEM,SAAS,IAAI,OAAO,CAE1B;IAEM,OAAO,IAAI,aAAa,GAAG,IAAI,CAErC;IAEM,UAAU,IAAI,YAAY,EAAE,CAElC;IAEM,KAAK,IAAI,IAAI,CAKnB;IAED;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,OAAe,GAAG,aAAa,GAAG,IAAI,CA0H/F;IAED;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAwBlD;IAED,OAAO,CAAC,WAAW;CAWpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,MAAM,CAWvE;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CA0BvF;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,CAmC7E"}
|
package/package.json
CHANGED
|
@@ -98,6 +98,7 @@ export class LoopGuard {
|
|
|
98
98
|
toolName,
|
|
99
99
|
actionHash: hash,
|
|
100
100
|
count: this.consecutiveErrorCount,
|
|
101
|
+
args,
|
|
101
102
|
});
|
|
102
103
|
}
|
|
103
104
|
} else {
|
|
@@ -126,6 +127,7 @@ export class LoopGuard {
|
|
|
126
127
|
toolName,
|
|
127
128
|
actionHash: hash,
|
|
128
129
|
count: repetitionCount,
|
|
130
|
+
args,
|
|
129
131
|
});
|
|
130
132
|
}
|
|
131
133
|
}
|
|
@@ -167,6 +169,7 @@ export class LoopGuard {
|
|
|
167
169
|
toolName,
|
|
168
170
|
actionHash: hash,
|
|
169
171
|
count: this.pingPongThreshold,
|
|
172
|
+
args,
|
|
170
173
|
});
|
|
171
174
|
}
|
|
172
175
|
}
|
|
@@ -209,6 +212,22 @@ export class LoopGuard {
|
|
|
209
212
|
}
|
|
210
213
|
}
|
|
211
214
|
|
|
215
|
+
/**
|
|
216
|
+
* Formats a concise, human-readable summary of a tool action and its parameters.
|
|
217
|
+
*/
|
|
218
|
+
export function formatActionSummary(toolName, args) {
|
|
219
|
+
if (!args) return toolName;
|
|
220
|
+
if (typeof args === 'string') return `${toolName}: ${args}`;
|
|
221
|
+
if (args.CommandLine) return `${toolName}: ${args.CommandLine}`;
|
|
222
|
+
if (args.command) return `${toolName}: ${args.command}`;
|
|
223
|
+
if (args.TargetFile) return `${toolName}: ${args.TargetFile}`;
|
|
224
|
+
if (args.path) return `${toolName}: ${args.path}`;
|
|
225
|
+
if (args.AbsolutePath) return `${toolName}: ${args.AbsolutePath}`;
|
|
226
|
+
if (args.Query) return `${toolName}: ${args.Query}`;
|
|
227
|
+
const str = canonicalStringify(args);
|
|
228
|
+
return str.length > 200 ? `${toolName}: ${str.slice(0, 197)}...` : `${toolName}: ${str}`;
|
|
229
|
+
}
|
|
230
|
+
|
|
212
231
|
export function formatLoopGuardFailureCard(options) {
|
|
213
232
|
const serverUrl = options.serverUrl || process.env.GITHUB_SERVER_URL || 'https://github.com';
|
|
214
233
|
const repository = options.repository || process.env.GITHUB_REPOSITORY || '';
|
|
@@ -222,9 +241,14 @@ export function formatLoopGuardFailureCard(options) {
|
|
|
222
241
|
`- **Root Cause Category**: \`loop_circuit_breaker\``,
|
|
223
242
|
`- **Trigger**: \`${options.trip.reason}\``,
|
|
224
243
|
`- **Reason**: ${options.trip.message}`,
|
|
225
|
-
`- **Action**: Process terminated to prevent runaway token burn`,
|
|
226
244
|
];
|
|
227
245
|
|
|
246
|
+
if (options.trip.args !== undefined) {
|
|
247
|
+
lines.push(`- **Triggered Action**: \`${formatActionSummary(options.trip.toolName, options.trip.args)}\``);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
lines.push(`- **Action**: Process terminated to prevent runaway token burn`);
|
|
251
|
+
|
|
228
252
|
if (logUrl) {
|
|
229
253
|
lines.push(`- **Action Log**: [View Run Logs](${logUrl})`);
|
|
230
254
|
}
|
|
@@ -233,7 +257,7 @@ export function formatLoopGuardFailureCard(options) {
|
|
|
233
257
|
}
|
|
234
258
|
|
|
235
259
|
export function formatLoopGuardReport(options) {
|
|
236
|
-
|
|
260
|
+
const reportLines = [
|
|
237
261
|
`# Run Report`,
|
|
238
262
|
``,
|
|
239
263
|
`## Result`,
|
|
@@ -255,9 +279,18 @@ export function formatLoopGuardReport(options) {
|
|
|
255
279
|
`- **Category**: \`loop_circuit_breaker\``,
|
|
256
280
|
`- **Trigger**: \`${options.trip.reason}\``,
|
|
257
281
|
`- **Tool**: \`${options.trip.toolName}\``,
|
|
282
|
+
];
|
|
283
|
+
|
|
284
|
+
if (options.trip.args !== undefined) {
|
|
285
|
+
reportLines.push(`- **Parameters**: \`${formatActionSummary(options.trip.toolName, options.trip.args)}\``);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
reportLines.push(
|
|
258
289
|
`- **Action Hash**: \`${options.trip.actionHash}\``,
|
|
259
290
|
`- **Message**: ${options.trip.message}`,
|
|
260
|
-
|
|
291
|
+
);
|
|
292
|
+
|
|
293
|
+
return reportLines.join('\n');
|
|
261
294
|
}
|
|
262
295
|
|
|
263
296
|
class LineParser {
|
|
@@ -332,6 +365,9 @@ async function main() {
|
|
|
332
365
|
onTrip: (trip) => {
|
|
333
366
|
tripped = trip;
|
|
334
367
|
console.error(`\nšØ ::error::[LoopGuard] ${trip.message}`);
|
|
368
|
+
if (trip.args) {
|
|
369
|
+
console.error(`šØ Action Details: ${formatActionSummary(trip.toolName, trip.args)}`);
|
|
370
|
+
}
|
|
335
371
|
|
|
336
372
|
if (childProcess && !childProcess.killed) {
|
|
337
373
|
console.error(`š Terminating runner process with SIGTERM...`);
|
|
@@ -364,12 +400,14 @@ async function main() {
|
|
|
364
400
|
}
|
|
365
401
|
} else if (su.step_type === 'tool') {
|
|
366
402
|
const name = su.tool_name || su.tool_info?.name || 'tool';
|
|
403
|
+
const params = su.tool_info?.parameters;
|
|
404
|
+
const summary = formatActionSummary(name, params);
|
|
367
405
|
if (su.state === 'ACTIVE') {
|
|
368
|
-
console.log(`\n[tool:start] ${
|
|
406
|
+
console.log(`\n[tool:start] ${summary}`);
|
|
369
407
|
} else if (su.state === 'DONE') {
|
|
370
|
-
console.log(`[tool:done] ${
|
|
408
|
+
console.log(`[tool:done] ${summary}`);
|
|
371
409
|
} else if (su.state === 'ERROR') {
|
|
372
|
-
console.log(`[tool:error] ${
|
|
410
|
+
console.log(`[tool:error] ${summary}`);
|
|
373
411
|
}
|
|
374
412
|
}
|
|
375
413
|
} else if (parsed.event === 'result' && parsed.result?.response) {
|
|
@@ -82,6 +82,21 @@ jobs:
|
|
|
82
82
|
fi
|
|
83
83
|
echo "ā Preflight credential validation passed."
|
|
84
84
|
|
|
85
|
+
- name: Configure MCP servers for Antigravity CLI
|
|
86
|
+
env:
|
|
87
|
+
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
|
|
88
|
+
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
|
|
89
|
+
run: |
|
|
90
|
+
if [ -n "$POSTHOG_API_KEY" ]; then
|
|
91
|
+
echo "Configuring PostHog MCP server..."
|
|
92
|
+
agy mcp add --header "Authorization: Bearer $POSTHOG_API_KEY" posthog https://mcp.posthog.com/mcp || true
|
|
93
|
+
fi
|
|
94
|
+
if [ -n "$VERCEL_TOKEN" ]; then
|
|
95
|
+
echo "Configuring Vercel MCP server..."
|
|
96
|
+
agy mcp add --header "Authorization: Bearer $VERCEL_TOKEN" vercel https://mcp.vercel.com || true
|
|
97
|
+
fi
|
|
98
|
+
agy mcp list || true
|
|
99
|
+
|
|
85
100
|
- name: Discover and compile domain skills (SwarmClaw Pattern #4)
|
|
86
101
|
id: skills
|
|
87
102
|
run: |
|
|
@@ -89,6 +89,16 @@ jobs:
|
|
|
89
89
|
fi
|
|
90
90
|
echo "ā Preflight credential validation passed."
|
|
91
91
|
|
|
92
|
+
- name: Configure MCP servers for Antigravity CLI
|
|
93
|
+
env:
|
|
94
|
+
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
|
|
95
|
+
run: |
|
|
96
|
+
if [ -n "$VERCEL_TOKEN" ]; then
|
|
97
|
+
echo "Configuring Vercel MCP server..."
|
|
98
|
+
agy mcp add --header "Authorization: Bearer $VERCEL_TOKEN" vercel https://mcp.vercel.com || true
|
|
99
|
+
fi
|
|
100
|
+
agy mcp list || true
|
|
101
|
+
|
|
92
102
|
- name: Discover and compile domain skills (SwarmClaw Pattern #4)
|
|
93
103
|
id: skills
|
|
94
104
|
run: |
|
|
@@ -129,7 +139,6 @@ jobs:
|
|
|
129
139
|
ROUTINE: design-review
|
|
130
140
|
ROUTINE_ISSUE_NUMBER: ${{ steps.run-issue.outputs.issue_number }}
|
|
131
141
|
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
|
|
132
|
-
POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
|
|
133
142
|
TARGET_SURFACE: ${{ inputs.target_surface }}
|
|
134
143
|
SKILLS_PROMPT: ${{ steps.skills.outputs.skills_prompt }}
|
|
135
144
|
GITHUB_SERVER_URL: ${{ github.server_url }}
|