@renaiss-shipflow/cli 0.15.1 → 0.16.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/commands/activity.d.ts.map +1 -1
- package/dist/commands/activity.js +22 -28
- package/dist/commands/activity.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +6 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/channels.d.ts.map +1 -1
- package/dist/commands/channels.js +31 -42
- package/dist/commands/channels.js.map +1 -1
- package/dist/commands/claims.d.ts.map +1 -1
- package/dist/commands/claims.js +3 -2
- package/dist/commands/claims.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +23 -6
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/features.d.ts.map +1 -1
- package/dist/commands/features.js +3 -2
- package/dist/commands/features.js.map +1 -1
- package/dist/commands/helpers.d.ts +23 -4
- package/dist/commands/helpers.d.ts.map +1 -1
- package/dist/commands/helpers.js +17 -18
- package/dist/commands/helpers.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +11 -5
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/issues.js +5 -5
- package/dist/commands/issues.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +15 -3
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +3 -2
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/repos.d.ts.map +1 -1
- package/dist/commands/repos.js +50 -65
- package/dist/commands/repos.js.map +1 -1
- package/dist/commands/stats.d.ts.map +1 -1
- package/dist/commands/stats.js +37 -43
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +3 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +20 -5
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/trigger.js +15 -16
- package/dist/commands/trigger.js.map +1 -1
- package/dist/commands/workflows.d.ts.map +1 -1
- package/dist/commands/workflows.js +43 -67
- package/dist/commands/workflows.js.map +1 -1
- package/dist/packet.d.ts +77 -1
- package/dist/packet.d.ts.map +1 -1
- package/dist/packet.js +87 -16
- package/dist/packet.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/stats.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getClient, getOrg, getFormat,
|
|
1
|
+
import { getClient, getOrg, getFormat, runAction } from "./helpers.js";
|
|
2
2
|
import { formatOutput, printTable } from "../output.js";
|
|
3
3
|
const STAGE_TABLE_HEADERS = [
|
|
4
4
|
"Stage",
|
|
@@ -55,51 +55,45 @@ export function registerStatsCommand(program) {
|
|
|
55
55
|
.option("--days <n>", "Lookback window in days for --tokens (default 30)", "30")
|
|
56
56
|
.option("--json", "Output as JSON")
|
|
57
57
|
.option("--yaml", "Output as YAML")
|
|
58
|
-
.action(async
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const windowDays = Number.isFinite(days) && days > 0 ? days : 30;
|
|
67
|
-
const stats = await client.getTokenStats(org, windowDays);
|
|
68
|
-
formatOutput(format, stats, () => {
|
|
69
|
-
console.log(`AI Token Usage (last ${windowDays} days)`);
|
|
70
|
-
console.log(` Total Requests: ${num(stats.totalRequests)}`);
|
|
71
|
-
console.log(` Tokens In: ${num(stats.totalTokensIn)}`);
|
|
72
|
-
console.log(` Tokens Out: ${num(stats.totalTokensOut)}`);
|
|
73
|
-
console.log(` Cache Hits: ${cacheHits(stats.totalCacheReadTokens ?? 0, stats.totalTokensIn)}`);
|
|
74
|
-
console.log(` Total Cost: ${cost(stats.totalCostUsd)}`);
|
|
75
|
-
const rows = buildStageRows(stats);
|
|
76
|
-
if (rows.length === 0) {
|
|
77
|
-
console.log(`\nNo AI usage recorded for this period.`);
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
console.log(`\nBy Stage:`);
|
|
81
|
-
printTable(STAGE_TABLE_HEADERS, rows);
|
|
82
|
-
});
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
const stats = await client.getStats(org);
|
|
58
|
+
.action(runAction(async (opts, cmd) => {
|
|
59
|
+
const client = getClient(cmd);
|
|
60
|
+
const org = getOrg(cmd);
|
|
61
|
+
const format = getFormat(cmd);
|
|
62
|
+
if (opts.tokens) {
|
|
63
|
+
const days = Number.parseInt(String(opts.days), 10);
|
|
64
|
+
const windowDays = Number.isFinite(days) && days > 0 ? days : 30;
|
|
65
|
+
const stats = await client.getTokenStats(org, windowDays);
|
|
86
66
|
formatOutput(format, stats, () => {
|
|
87
|
-
console.log(`Usage
|
|
88
|
-
console.log(` Total
|
|
89
|
-
console.log(`
|
|
90
|
-
console.log(`
|
|
91
|
-
console.log(`
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
67
|
+
console.log(`AI Token Usage (last ${windowDays} days)`);
|
|
68
|
+
console.log(` Total Requests: ${num(stats.totalRequests)}`);
|
|
69
|
+
console.log(` Tokens In: ${num(stats.totalTokensIn)}`);
|
|
70
|
+
console.log(` Tokens Out: ${num(stats.totalTokensOut)}`);
|
|
71
|
+
console.log(` Cache Hits: ${cacheHits(stats.totalCacheReadTokens ?? 0, stats.totalTokensIn)}`);
|
|
72
|
+
console.log(` Total Cost: ${cost(stats.totalCostUsd)}`);
|
|
73
|
+
const rows = buildStageRows(stats);
|
|
74
|
+
if (rows.length === 0) {
|
|
75
|
+
console.log(`\nNo AI usage recorded for this period.`);
|
|
76
|
+
return;
|
|
97
77
|
}
|
|
78
|
+
console.log(`\nBy Stage:`);
|
|
79
|
+
printTable(STAGE_TABLE_HEADERS, rows);
|
|
98
80
|
});
|
|
81
|
+
return;
|
|
99
82
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
83
|
+
const stats = await client.getStats(org);
|
|
84
|
+
formatOutput(format, stats, () => {
|
|
85
|
+
console.log(`Usage Statistics`);
|
|
86
|
+
console.log(` Total Executions: ${stats.totalExecutions}`);
|
|
87
|
+
console.log(` Succeeded: ${stats.successCount}`);
|
|
88
|
+
console.log(` Failed: ${stats.failureCount}`);
|
|
89
|
+
console.log(` Active Repos: ${stats.activeRepos}`);
|
|
90
|
+
if (stats.workflowBreakdown && Object.keys(stats.workflowBreakdown).length > 0) {
|
|
91
|
+
console.log(` By Workflow:`);
|
|
92
|
+
for (const [type, count] of Object.entries(stats.workflowBreakdown)) {
|
|
93
|
+
console.log(` ${type}: ${count}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}));
|
|
104
98
|
}
|
|
105
99
|
//# sourceMappingURL=stats.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwB5D"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { ShipFlowClient } from "../client.js";
|
|
2
2
|
import { resolveApiUrl, resolveAuthToken, loadCredentials, refreshOpts } from "../config.js";
|
|
3
3
|
import { resolveProject } from "../project.js";
|
|
4
|
+
import { runAction } from "./helpers.js";
|
|
4
5
|
export function registerStatusCommand(program) {
|
|
5
6
|
program
|
|
6
7
|
.command("status")
|
|
7
8
|
.description("Show ShipFlow status for the current project")
|
|
8
9
|
.option("--json", "Output JSON")
|
|
9
|
-
.action(async (opts) => {
|
|
10
|
+
.action(runAction(async (opts) => {
|
|
10
11
|
const auth = resolveAuthToken();
|
|
11
12
|
const creds = loadCredentials();
|
|
12
13
|
if (!auth || !creds) {
|
|
@@ -30,6 +31,6 @@ export function registerStatusCommand(program) {
|
|
|
30
31
|
const summary = v?.data?.exec_summary || v?.summary || "(no summary)";
|
|
31
32
|
console.log(` ${k}: ${String(summary).split("\n")[0]}`);
|
|
32
33
|
}
|
|
33
|
-
});
|
|
34
|
+
}));
|
|
34
35
|
}
|
|
35
36
|
//# sourceMappingURL=status.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAG,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAG,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACtG,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7H,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,MAAM,GAAI,MAAM,CAAC,eAAyB,IAAI,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,GAAI,MAAM,CAAC,eAA2C,IAAI,EAAE,CAAC;QAC5E,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAI,CAAS,EAAE,IAAI,EAAE,YAAY,IAAK,CAAS,EAAE,OAAO,IAAI,cAAc,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6B1D;AAED,MAAM,WAAW,cAAc;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAE/E;;uEAEuE;AACvE,wBAAgB,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAUtE;AAmBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAiBhE"}
|
package/dist/commands/test.js
CHANGED
|
@@ -6,20 +6,35 @@ export function registerTestCommand(program) {
|
|
|
6
6
|
program
|
|
7
7
|
.command("test")
|
|
8
8
|
.description("Run the project's local test command (auto-detected)")
|
|
9
|
+
.option("--json", "Emit a machine-readable summary line (runner + exit code); test output still streams")
|
|
9
10
|
.allowUnknownOption()
|
|
10
|
-
.action(() => {
|
|
11
|
+
.action((opts) => {
|
|
11
12
|
const root = getCwdRepoRoot();
|
|
12
13
|
if (!root) {
|
|
13
|
-
|
|
14
|
+
if (opts.json)
|
|
15
|
+
console.log(JSON.stringify({ error: "Not in a git repo." }));
|
|
16
|
+
else
|
|
17
|
+
console.error("Not in a git repo.");
|
|
14
18
|
process.exit(1);
|
|
15
19
|
}
|
|
16
20
|
const runner = detectRunner(root);
|
|
17
21
|
if (!runner) {
|
|
18
|
-
|
|
22
|
+
if (opts.json)
|
|
23
|
+
console.log(JSON.stringify({ error: "Could not detect a test runner." }));
|
|
24
|
+
else
|
|
25
|
+
console.error("Could not detect a test runner. Run your test command manually.");
|
|
19
26
|
process.exit(2);
|
|
20
27
|
}
|
|
21
|
-
|
|
22
|
-
|
|
28
|
+
// The child streams to inherited stdio; suppress the human announce line
|
|
29
|
+
// under --json so the JSON summary is the only line this command adds.
|
|
30
|
+
const command = [runner.cmd, ...runner.args].join(" ");
|
|
31
|
+
if (!opts.json)
|
|
32
|
+
console.log(`> ${command}`);
|
|
33
|
+
const code = runRunner(runner, root);
|
|
34
|
+
if (opts.json) {
|
|
35
|
+
console.log(JSON.stringify({ runner: command, source: runner.source, exitCode: code, passed: code === 0 }));
|
|
36
|
+
}
|
|
37
|
+
process.exit(code);
|
|
23
38
|
});
|
|
24
39
|
}
|
|
25
40
|
/** Spawn the detected runner and return the exit code to use. On a spawn
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sDAAsD,CAAC;SACnE,kBAAkB,EAAE;SACpB,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/trigger.js
CHANGED
|
@@ -1,25 +1,24 @@
|
|
|
1
|
-
import { getClient, getOrg,
|
|
1
|
+
import { getClient, getOrg, runAction } from "./helpers.js";
|
|
2
2
|
export function registerTriggerCommand(program) {
|
|
3
3
|
program
|
|
4
4
|
.command("trigger")
|
|
5
5
|
.description("Manually trigger a workflow")
|
|
6
6
|
.argument("<workflow-type>", "Workflow type to trigger (e.g. regression_tests)")
|
|
7
7
|
.requiredOption("--repo <repo>", "Repository name")
|
|
8
|
-
.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
console.log(
|
|
8
|
+
.option("--json", "Output JSON")
|
|
9
|
+
.action(runAction(async (workflowType, opts, cmd) => {
|
|
10
|
+
const client = getClient(cmd);
|
|
11
|
+
const org = getOrg(cmd);
|
|
12
|
+
// Trigger is implemented as an update with a trigger signal.
|
|
13
|
+
// The backend dispatches the workflow when it receives this.
|
|
14
|
+
await client.updateWorkflow(org, opts.repo, workflowType, {
|
|
15
|
+
settings: { _trigger: true },
|
|
16
|
+
});
|
|
17
|
+
if (opts.json) {
|
|
18
|
+
console.log(JSON.stringify({ workflowType, repo: opts.repo, triggered: true }));
|
|
19
|
+
return;
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
});
|
|
21
|
+
console.log(`Workflow "${workflowType}" triggered on ${opts.repo}.`);
|
|
22
|
+
}));
|
|
24
23
|
}
|
|
25
24
|
//# sourceMappingURL=trigger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../src/commands/trigger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"trigger.js","sourceRoot":"","sources":["../../src/commands/trigger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,QAAQ,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;SAC/E,cAAc,CAAC,eAAe,EAAE,iBAAiB,CAAC;SAClD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,YAAoB,EAAE,IAAsC,EAAE,GAAY,EAAE,EAAE;QACrG,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAExB,6DAA6D;QAC7D,6DAA6D;QAC7D,MAAM,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE;YACxD,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC7B,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,kBAAkB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/commands/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/commands/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgF/D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getClient, getOrg, getFormat,
|
|
1
|
+
import { getClient, getOrg, getFormat, runAction } from "./helpers.js";
|
|
2
2
|
import { formatOutput, printTable } from "../output.js";
|
|
3
3
|
export function registerWorkflowCommands(program) {
|
|
4
4
|
const workflows = program
|
|
@@ -10,90 +10,66 @@ export function registerWorkflowCommands(program) {
|
|
|
10
10
|
.requiredOption("--repo <repo>", "Repository name")
|
|
11
11
|
.option("--json", "Output as JSON")
|
|
12
12
|
.option("--yaml", "Output as YAML")
|
|
13
|
-
.action(async
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
catch (err) {
|
|
34
|
-
handleError(err);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
13
|
+
.action(runAction(async (opts, cmd) => {
|
|
14
|
+
const client = getClient(cmd);
|
|
15
|
+
const org = getOrg(cmd);
|
|
16
|
+
const repo = await client.getRepo(org, opts.repo);
|
|
17
|
+
const format = getFormat(cmd);
|
|
18
|
+
formatOutput(format, repo.workflowConfigs, () => {
|
|
19
|
+
if (repo.workflowConfigs.length === 0) {
|
|
20
|
+
console.log("No workflows configured for this repository.");
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
printTable(["Type", "Enabled", "Last Run", "Status"], repo.workflowConfigs.map((wf) => [
|
|
24
|
+
wf.workflowType,
|
|
25
|
+
wf.enabled ? "yes" : "no",
|
|
26
|
+
wf.lastRunAt ?? "never",
|
|
27
|
+
wf.lastRunStatus ?? "-",
|
|
28
|
+
]));
|
|
29
|
+
});
|
|
30
|
+
}));
|
|
37
31
|
workflows
|
|
38
32
|
.command("enable")
|
|
39
33
|
.description("Enable a workflow for a repository")
|
|
40
34
|
.argument("<type>", "Workflow type (e.g. issue_triage, patch_notes)")
|
|
41
35
|
.requiredOption("--repo <repo>", "Repository name")
|
|
42
|
-
.action(async
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
console.log(`Workflow "${type}" enabled on ${opts.repo}.`);
|
|
49
|
-
}
|
|
50
|
-
catch (err) {
|
|
51
|
-
handleError(err);
|
|
52
|
-
}
|
|
53
|
-
});
|
|
36
|
+
.action(runAction(async (type, opts, cmd) => {
|
|
37
|
+
const client = getClient(cmd);
|
|
38
|
+
const org = getOrg(cmd);
|
|
39
|
+
await client.updateWorkflow(org, opts.repo, type, { enabled: true });
|
|
40
|
+
console.log(`Workflow "${type}" enabled on ${opts.repo}.`);
|
|
41
|
+
}));
|
|
54
42
|
workflows
|
|
55
43
|
.command("disable")
|
|
56
44
|
.description("Disable a workflow for a repository")
|
|
57
45
|
.argument("<type>", "Workflow type (e.g. issue_triage, patch_notes)")
|
|
58
46
|
.requiredOption("--repo <repo>", "Repository name")
|
|
59
|
-
.action(async
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
console.log(`Workflow "${type}" disabled on ${opts.repo}.`);
|
|
66
|
-
}
|
|
67
|
-
catch (err) {
|
|
68
|
-
handleError(err);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
47
|
+
.action(runAction(async (type, opts, cmd) => {
|
|
48
|
+
const client = getClient(cmd);
|
|
49
|
+
const org = getOrg(cmd);
|
|
50
|
+
await client.updateWorkflow(org, opts.repo, type, { enabled: false });
|
|
51
|
+
console.log(`Workflow "${type}" disabled on ${opts.repo}.`);
|
|
52
|
+
}));
|
|
71
53
|
workflows
|
|
72
54
|
.command("configure")
|
|
73
55
|
.description("Configure workflow settings")
|
|
74
56
|
.argument("<type>", "Workflow type")
|
|
75
57
|
.requiredOption("--repo <repo>", "Repository name")
|
|
76
58
|
.option("--set <key=value...>", "Set configuration values", collectKeyValue, {})
|
|
77
|
-
.action(async
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
console.error("Error: At least one --set key=value is required.");
|
|
85
|
-
process.exit(1);
|
|
86
|
-
}
|
|
87
|
-
await client.updateWorkflow(org, opts.repo, type, { settings });
|
|
88
|
-
console.log(`Workflow "${type}" configured on ${opts.repo}.`);
|
|
89
|
-
for (const [k, v] of Object.entries(settings)) {
|
|
90
|
-
console.log(` ${k} = ${v}`);
|
|
91
|
-
}
|
|
59
|
+
.action(runAction(async (type, opts, cmd) => {
|
|
60
|
+
const client = getClient(cmd);
|
|
61
|
+
const org = getOrg(cmd);
|
|
62
|
+
const settings = opts.set;
|
|
63
|
+
if (Object.keys(settings).length === 0) {
|
|
64
|
+
console.error("Error: At least one --set key=value is required.");
|
|
65
|
+
process.exit(1);
|
|
92
66
|
}
|
|
93
|
-
|
|
94
|
-
|
|
67
|
+
await client.updateWorkflow(org, opts.repo, type, { settings });
|
|
68
|
+
console.log(`Workflow "${type}" configured on ${opts.repo}.`);
|
|
69
|
+
for (const [k, v] of Object.entries(settings)) {
|
|
70
|
+
console.log(` ${k} = ${v}`);
|
|
95
71
|
}
|
|
96
|
-
});
|
|
72
|
+
}));
|
|
97
73
|
}
|
|
98
74
|
/** Commander custom option parser for repeatable key=value pairs. */
|
|
99
75
|
function collectKeyValue(value, prev) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/commands/workflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/commands/workflows.ts"],"names":[],"mappings":"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"}
|
package/dist/packet.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GhComment, GhIssue, GhPR, GhReviewThread } from "./gh.js";
|
|
1
|
+
import type { GhCheck, GhComment, GhIssue, GhPR, GhReviewThread } from "./gh.js";
|
|
2
2
|
export declare const PACKET_PER_FILE_CAP: number;
|
|
3
3
|
export declare const PACKET_TOTAL_CAP: number;
|
|
4
4
|
export declare const PACKET_BRIEF_CAP: number;
|
|
@@ -18,6 +18,18 @@ export interface FilteredDiff {
|
|
|
18
18
|
}
|
|
19
19
|
/** Noise-filter and budget the diff (per-file + total caps). */
|
|
20
20
|
export declare function filterDiffForPacket(diff: string): FilteredDiff;
|
|
21
|
+
/** CI rollup reduced to pass/fail/pending counts + the failing check names.
|
|
22
|
+
* Shared by the text packet and the `--json` packet so both report CI
|
|
23
|
+
* identically. A neutral/skipped check counts as passing; an empty/pending
|
|
24
|
+
* conclusion (or an in-progress status) counts as pending; anything else fails. */
|
|
25
|
+
export interface CiSummary {
|
|
26
|
+
passing: number;
|
|
27
|
+
failing: number;
|
|
28
|
+
pending: number;
|
|
29
|
+
failingChecks: string[];
|
|
30
|
+
reported: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function summarizeChecks(checks: GhCheck[]): CiSummary;
|
|
21
33
|
/** Lines from PR comments that carry test evidence / health captions. */
|
|
22
34
|
export declare function extractEvidenceLines(comments: GhComment[]): string[];
|
|
23
35
|
/** One feature from the project map, reduced to what the packet needs. */
|
|
@@ -73,4 +85,68 @@ export interface PacketInput {
|
|
|
73
85
|
}
|
|
74
86
|
/** Render the full review packet as markdown. */
|
|
75
87
|
export declare function buildReviewPacket(input: PacketInput): string;
|
|
88
|
+
/** Structured form of the review packet — the SAME content `buildReviewPacket`
|
|
89
|
+
* renders as markdown, as a machine-readable object for `pr packet --json`.
|
|
90
|
+
* The loop reviewer consumes this: it carries the spec/brief, PR description,
|
|
91
|
+
* deviations, CI rollup, unresolved threads, evidence + per-feature coverage,
|
|
92
|
+
* the relevant feature slice, and the noise-filtered budgeted diff. */
|
|
93
|
+
export interface ReviewPacketData {
|
|
94
|
+
pr: {
|
|
95
|
+
number: number;
|
|
96
|
+
title: string;
|
|
97
|
+
headRefName?: string;
|
|
98
|
+
baseRefName?: string;
|
|
99
|
+
isDraft?: boolean;
|
|
100
|
+
mergeable?: string;
|
|
101
|
+
labels: string[];
|
|
102
|
+
};
|
|
103
|
+
/** Spec/acceptance brief. `linked:false` carries the missing-brief warning —
|
|
104
|
+
* the reviewer must NOT infer the spec from the diff. */
|
|
105
|
+
spec: {
|
|
106
|
+
linked: boolean;
|
|
107
|
+
issue?: {
|
|
108
|
+
number: number;
|
|
109
|
+
linkKind: string;
|
|
110
|
+
title: string;
|
|
111
|
+
body: string;
|
|
112
|
+
truncated: boolean;
|
|
113
|
+
};
|
|
114
|
+
warning?: string;
|
|
115
|
+
};
|
|
116
|
+
prDescription?: {
|
|
117
|
+
text: string;
|
|
118
|
+
truncated: boolean;
|
|
119
|
+
};
|
|
120
|
+
/** The "### Deviations from brief" section, when the worker logged one. */
|
|
121
|
+
deviations?: string;
|
|
122
|
+
ci: CiSummary;
|
|
123
|
+
reviewThreads: {
|
|
124
|
+
unresolved: number;
|
|
125
|
+
items: {
|
|
126
|
+
path: string | null;
|
|
127
|
+
line: number | null;
|
|
128
|
+
author: string;
|
|
129
|
+
body: string;
|
|
130
|
+
}[];
|
|
131
|
+
};
|
|
132
|
+
evidence: {
|
|
133
|
+
lines: string[];
|
|
134
|
+
/** Present only when the feature map was supplied AND the PR touches ≥1 feature. */
|
|
135
|
+
featuresTouched?: string[];
|
|
136
|
+
/** The multi-feature under-coverage warning (null when covered / N/A). */
|
|
137
|
+
coverageWarning?: string | null;
|
|
138
|
+
};
|
|
139
|
+
/** The relevant feature slice — omitted when there's no map or nothing touched. */
|
|
140
|
+
features?: {
|
|
141
|
+
touched: {
|
|
142
|
+
name: string;
|
|
143
|
+
layer?: string;
|
|
144
|
+
testPriority?: string;
|
|
145
|
+
description?: string;
|
|
146
|
+
}[];
|
|
147
|
+
sameLayerNeighbors: string[];
|
|
148
|
+
};
|
|
149
|
+
diff: FilteredDiff;
|
|
150
|
+
}
|
|
151
|
+
export declare function buildReviewPacketData(input: PacketInput): ReviewPacketData;
|
|
76
152
|
//# sourceMappingURL=packet.d.ts.map
|
package/dist/packet.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packet.d.ts","sourceRoot":"","sources":["../src/packet.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"packet.d.ts","sourceRoot":"","sources":["../src/packet.ts"],"names":[],"mappings":"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"}
|