@teambit/ripple 0.0.44 → 0.0.46
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/ripple-utils.d.ts +19 -8
- package/dist/ripple-utils.js +63 -17
- package/dist/ripple-utils.js.map +1 -1
- package/dist/ripple.cmd.d.ts +11 -10
- package/dist/ripple.cmd.js +120 -45
- package/dist/ripple.cmd.js.map +1 -1
- package/dist/ripple.main.runtime.d.ts +20 -5
- package/dist/ripple.main.runtime.js +51 -2
- package/dist/ripple.main.runtime.js.map +1 -1
- package/package.json +5 -4
- /package/dist/{preview-1776960512780.js → preview-1777389063199.js} +0 -0
package/dist/ripple-utils.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import stripAnsi from 'strip-ansi';
|
|
2
|
-
import type {
|
|
2
|
+
import type { LastExportData } from '@teambit/export';
|
|
3
|
+
import type { RippleMain, RippleJobFull } from './ripple.main.runtime';
|
|
3
4
|
export { stripAnsi };
|
|
4
5
|
export declare function colorPhase(phase?: string): string;
|
|
5
6
|
export declare function isFailedPhase(phase?: string): boolean;
|
|
@@ -8,17 +9,27 @@ export declare function isFailedPhase(phase?: string): boolean;
|
|
|
8
9
|
* e.g. "scope/name@abc123" → "scope/name"
|
|
9
10
|
*/
|
|
10
11
|
export declare function stripComponentVersion(id: string): string;
|
|
12
|
+
export type ResolveSource = 'arg' | 'lane' | 'last-export';
|
|
13
|
+
export type ResolvedJobId = {
|
|
14
|
+
id: string;
|
|
15
|
+
source: ResolveSource;
|
|
16
|
+
lastExport?: LastExportData;
|
|
17
|
+
job?: RippleJobFull;
|
|
18
|
+
} | {
|
|
19
|
+
error: string;
|
|
20
|
+
};
|
|
11
21
|
/**
|
|
12
|
-
* resolve a job ID from explicit argument, --lane flag,
|
|
13
|
-
*
|
|
22
|
+
* resolve a job ID from explicit argument, --lane flag, current workspace lane, or the
|
|
23
|
+
* last-export.json written by the export command (used when on main).
|
|
24
|
+
* when opts.allowedPhases is set, the resolved job's phase is validated.
|
|
14
25
|
*/
|
|
15
26
|
export declare function resolveJobId(ripple: RippleMain, jobId: string | undefined, flags: {
|
|
16
27
|
lane?: string;
|
|
17
28
|
}, opts?: {
|
|
18
29
|
allowedPhases?: string[];
|
|
19
30
|
actionVerb?: string;
|
|
20
|
-
}): Promise<
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
}): Promise<ResolvedJobId>;
|
|
32
|
+
/**
|
|
33
|
+
* format a relative time delta (e.g. "2 minutes ago", "3 days ago") for a contextual header.
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatAge(timestamp: string): string;
|
package/dist/ripple-utils.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.colorPhase = colorPhase;
|
|
7
|
+
exports.formatAge = formatAge;
|
|
7
8
|
exports.isFailedPhase = isFailedPhase;
|
|
8
9
|
exports.resolveJobId = resolveJobId;
|
|
9
10
|
Object.defineProperty(exports, "stripAnsi", {
|
|
@@ -59,39 +60,84 @@ function stripComponentVersion(id) {
|
|
|
59
60
|
const atIdx = id.indexOf('@');
|
|
60
61
|
return atIdx > 0 ? id.substring(0, atIdx) : id;
|
|
61
62
|
}
|
|
62
|
-
|
|
63
63
|
/**
|
|
64
|
-
* resolve a job ID from explicit argument, --lane flag,
|
|
65
|
-
*
|
|
64
|
+
* resolve a job ID from explicit argument, --lane flag, current workspace lane, or the
|
|
65
|
+
* last-export.json written by the export command (used when on main).
|
|
66
|
+
* when opts.allowedPhases is set, the resolved job's phase is validated.
|
|
66
67
|
*/
|
|
67
68
|
async function resolveJobId(ripple, jobId, flags, opts) {
|
|
68
69
|
if (jobId) return {
|
|
69
|
-
id: jobId
|
|
70
|
+
id: jobId,
|
|
71
|
+
source: 'arg'
|
|
70
72
|
};
|
|
71
73
|
const laneId = flags.lane || ripple.getCurrentLaneId();
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
const lastExport = await ripple.getLastExport();
|
|
75
|
+
const lastLaneStr = lastExport?.lane ? `${lastExport.lane.scope}/${lastExport.lane.name}` : undefined;
|
|
76
|
+
|
|
77
|
+
// prefer last-export when its lane matches the user's current context (or both are main).
|
|
78
|
+
// last-export is per-workspace, so it identifies *this user's* last export — more specific than
|
|
79
|
+
// the latest lane job, which might be someone else's.
|
|
80
|
+
if (lastExport?.rippleJobs?.length && lastLaneStr === laneId) {
|
|
81
|
+
const slug = lastExport.rippleJobs[lastExport.rippleJobs.length - 1];
|
|
82
|
+
const job = await ripple.getJobBySlug(slug);
|
|
83
|
+
if (!job) {
|
|
84
|
+
return {
|
|
85
|
+
error: `Could not find Ripple CI job for your last export "${slug}".`
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const phaseError = checkPhase(job, opts, 'Last export job');
|
|
89
|
+
if (phaseError) return {
|
|
90
|
+
error: phaseError
|
|
75
91
|
};
|
|
76
|
-
}
|
|
77
|
-
const found = await ripple.findLatestJobForLane(laneId);
|
|
78
|
-
if (!found) {
|
|
79
92
|
return {
|
|
80
|
-
|
|
93
|
+
id: job.id,
|
|
94
|
+
source: 'last-export',
|
|
95
|
+
lastExport,
|
|
96
|
+
job
|
|
81
97
|
};
|
|
82
98
|
}
|
|
83
|
-
if (
|
|
84
|
-
const
|
|
85
|
-
if (!
|
|
86
|
-
const verb = opts.actionVerb || 'act on';
|
|
99
|
+
if (laneId) {
|
|
100
|
+
const found = await ripple.findLatestJobForLane(laneId);
|
|
101
|
+
if (!found) {
|
|
87
102
|
return {
|
|
88
|
-
error: `
|
|
103
|
+
error: `No Ripple CI job found for lane "${laneId}".`
|
|
89
104
|
};
|
|
90
105
|
}
|
|
106
|
+
const phaseError = checkPhase(found, opts, `Latest job for lane "${laneId}"`);
|
|
107
|
+
if (phaseError) return {
|
|
108
|
+
error: phaseError
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
id: found.id,
|
|
112
|
+
source: 'lane'
|
|
113
|
+
};
|
|
91
114
|
}
|
|
92
115
|
return {
|
|
93
|
-
|
|
116
|
+
error: 'Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace with a recent export.'
|
|
94
117
|
};
|
|
95
118
|
}
|
|
119
|
+
function checkPhase(job, opts, contextLabel) {
|
|
120
|
+
if (!opts?.allowedPhases) return null;
|
|
121
|
+
const phase = job.status?.phase?.toUpperCase();
|
|
122
|
+
if (opts.allowedPhases.includes(phase || '')) return null;
|
|
123
|
+
const verb = opts.actionVerb || 'act on';
|
|
124
|
+
return `${contextLabel} is ${job.status?.phase || 'unknown'} (${job.id}), cannot ${verb}. Provide a specific job ID.`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* format a relative time delta (e.g. "2 minutes ago", "3 days ago") for a contextual header.
|
|
129
|
+
*/
|
|
130
|
+
function formatAge(timestamp) {
|
|
131
|
+
const ms = Date.now() - new Date(timestamp).getTime();
|
|
132
|
+
if (!Number.isFinite(ms) || ms < 0) return 'just now';
|
|
133
|
+
const seconds = Math.floor(ms / 1000);
|
|
134
|
+
if (seconds < 60) return 'just now';
|
|
135
|
+
const minutes = Math.floor(seconds / 60);
|
|
136
|
+
if (minutes < 60) return `${minutes} minute${minutes === 1 ? '' : 's'} ago`;
|
|
137
|
+
const hours = Math.floor(minutes / 60);
|
|
138
|
+
if (hours < 24) return `${hours} hour${hours === 1 ? '' : 's'} ago`;
|
|
139
|
+
const days = Math.floor(hours / 24);
|
|
140
|
+
return `${days} day${days === 1 ? '' : 's'} ago`;
|
|
141
|
+
}
|
|
96
142
|
|
|
97
143
|
//# sourceMappingURL=ripple-utils.js.map
|
package/dist/ripple-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_chalk","data","_interopRequireDefault","require","_stripAnsi","e","__esModule","default","colorPhase","phase","chalk","yellow","toUpperCase","green","red","blue","gray","isFailedPhase","p","stripComponentVersion","id","atIdx","indexOf","substring","resolveJobId","ripple","jobId","flags","opts","laneId","lane","getCurrentLaneId","error","found","findLatestJobForLane","allowedPhases","status","includes","verb","actionVerb"],"sources":["ripple-utils.ts"],"sourcesContent":["import chalk from 'chalk';\nimport stripAnsi from 'strip-ansi';\nimport type { RippleMain } from './ripple.main.runtime';\n\nexport { stripAnsi };\n\nexport function colorPhase(phase?: string): string {\n if (!phase) return chalk.yellow('unknown');\n switch (phase.toUpperCase()) {\n case 'SUCCESS':\n return chalk.green(phase);\n case 'FAILED':\n case 'FAILURE':\n return chalk.red(phase);\n case 'RUNNING':\n case 'IN_PROGRESS':\n return chalk.blue(phase);\n case 'STOPPED':\n case 'PAUSED':\n return chalk.gray(phase);\n default:\n return chalk.yellow(phase);\n }\n}\n\nexport function isFailedPhase(phase?: string): boolean {\n const p = phase?.toUpperCase();\n return p === 'FAILURE' || p === 'FAILED';\n}\n\n/**\n * strip \"@hash\" or \"@version\" suffix from a component ID.\n * e.g. \"scope/name@abc123\" → \"scope/name\"\n */\nexport function stripComponentVersion(id: string): string {\n const atIdx = id.indexOf('@');\n return atIdx > 0 ? id.substring(0, atIdx) : id;\n}\n\n/**\n * resolve a job ID from explicit argument, --lane flag,
|
|
1
|
+
{"version":3,"names":["_chalk","data","_interopRequireDefault","require","_stripAnsi","e","__esModule","default","colorPhase","phase","chalk","yellow","toUpperCase","green","red","blue","gray","isFailedPhase","p","stripComponentVersion","id","atIdx","indexOf","substring","resolveJobId","ripple","jobId","flags","opts","source","laneId","lane","getCurrentLaneId","lastExport","getLastExport","lastLaneStr","scope","name","undefined","rippleJobs","length","slug","job","getJobBySlug","error","phaseError","checkPhase","found","findLatestJobForLane","contextLabel","allowedPhases","status","includes","verb","actionVerb","formatAge","timestamp","ms","Date","now","getTime","Number","isFinite","seconds","Math","floor","minutes","hours","days"],"sources":["ripple-utils.ts"],"sourcesContent":["import chalk from 'chalk';\nimport stripAnsi from 'strip-ansi';\nimport type { LastExportData } from '@teambit/export';\nimport type { RippleMain, RippleJobFull } from './ripple.main.runtime';\n\nexport { stripAnsi };\n\nexport function colorPhase(phase?: string): string {\n if (!phase) return chalk.yellow('unknown');\n switch (phase.toUpperCase()) {\n case 'SUCCESS':\n return chalk.green(phase);\n case 'FAILED':\n case 'FAILURE':\n return chalk.red(phase);\n case 'RUNNING':\n case 'IN_PROGRESS':\n return chalk.blue(phase);\n case 'STOPPED':\n case 'PAUSED':\n return chalk.gray(phase);\n default:\n return chalk.yellow(phase);\n }\n}\n\nexport function isFailedPhase(phase?: string): boolean {\n const p = phase?.toUpperCase();\n return p === 'FAILURE' || p === 'FAILED';\n}\n\n/**\n * strip \"@hash\" or \"@version\" suffix from a component ID.\n * e.g. \"scope/name@abc123\" → \"scope/name\"\n */\nexport function stripComponentVersion(id: string): string {\n const atIdx = id.indexOf('@');\n return atIdx > 0 ? id.substring(0, atIdx) : id;\n}\n\nexport type ResolveSource = 'arg' | 'lane' | 'last-export';\n\nexport type ResolvedJobId =\n | { id: string; source: ResolveSource; lastExport?: LastExportData; job?: RippleJobFull }\n | { error: string };\n\n/**\n * resolve a job ID from explicit argument, --lane flag, current workspace lane, or the\n * last-export.json written by the export command (used when on main).\n * when opts.allowedPhases is set, the resolved job's phase is validated.\n */\nexport async function resolveJobId(\n ripple: RippleMain,\n jobId: string | undefined,\n flags: { lane?: string },\n opts?: { allowedPhases?: string[]; actionVerb?: string }\n): Promise<ResolvedJobId> {\n if (jobId) return { id: jobId, source: 'arg' };\n\n const laneId = flags.lane || ripple.getCurrentLaneId();\n const lastExport = await ripple.getLastExport();\n const lastLaneStr = lastExport?.lane ? `${lastExport.lane.scope}/${lastExport.lane.name}` : undefined;\n\n // prefer last-export when its lane matches the user's current context (or both are main).\n // last-export is per-workspace, so it identifies *this user's* last export — more specific than\n // the latest lane job, which might be someone else's.\n if (lastExport?.rippleJobs?.length && lastLaneStr === laneId) {\n const slug = lastExport.rippleJobs[lastExport.rippleJobs.length - 1];\n const job = await ripple.getJobBySlug(slug);\n if (!job) {\n return { error: `Could not find Ripple CI job for your last export \"${slug}\".` };\n }\n const phaseError = checkPhase(job, opts, 'Last export job');\n if (phaseError) return { error: phaseError };\n return { id: job.id, source: 'last-export', lastExport, job };\n }\n\n if (laneId) {\n const found = await ripple.findLatestJobForLane(laneId);\n if (!found) {\n return { error: `No Ripple CI job found for lane \"${laneId}\".` };\n }\n const phaseError = checkPhase(found, opts, `Latest job for lane \"${laneId}\"`);\n if (phaseError) return { error: phaseError };\n return { id: found.id, source: 'lane' };\n }\n\n return {\n error:\n 'Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace with a recent export.',\n };\n}\n\nfunction checkPhase(\n job: { id: string; status?: { phase?: string } },\n opts: { allowedPhases?: string[]; actionVerb?: string } | undefined,\n contextLabel: string\n): string | null {\n if (!opts?.allowedPhases) return null;\n const phase = job.status?.phase?.toUpperCase();\n if (opts.allowedPhases.includes(phase || '')) return null;\n const verb = opts.actionVerb || 'act on';\n return `${contextLabel} is ${job.status?.phase || 'unknown'} (${job.id}), cannot ${verb}. Provide a specific job ID.`;\n}\n\n/**\n * format a relative time delta (e.g. \"2 minutes ago\", \"3 days ago\") for a contextual header.\n */\nexport function formatAge(timestamp: string): string {\n const ms = Date.now() - new Date(timestamp).getTime();\n if (!Number.isFinite(ms) || ms < 0) return 'just now';\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes} minute${minutes === 1 ? '' : 's'} ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours} hour${hours === 1 ? '' : 's'} ago`;\n const days = Math.floor(hours / 24);\n return `${days} day${days === 1 ? '' : 's'} ago`;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/ripple.cmd.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Command, CommandOptions } from '@teambit/cli';
|
|
2
|
+
import type { LastExportData } from '@teambit/export';
|
|
2
3
|
import type { RippleMain, RippleJob, CiGraphNode } from './ripple.main.runtime';
|
|
3
4
|
export declare class RippleCmd implements Command {
|
|
4
5
|
name: string;
|
|
@@ -69,18 +70,14 @@ export declare class RippleLogCmd implements Command {
|
|
|
69
70
|
lane?: string;
|
|
70
71
|
component?: string;
|
|
71
72
|
}): Promise<{
|
|
72
|
-
job:
|
|
73
|
-
hash?: string;
|
|
74
|
-
ciGraph?: string;
|
|
75
|
-
ciComponentGraph?: string;
|
|
76
|
-
};
|
|
73
|
+
job: import("./ripple.main.runtime").RippleJobFull;
|
|
77
74
|
componentBuild: import("./ripple.main.runtime").ComponentBuildSummary | null;
|
|
75
|
+
source: import("./ripple-utils").ResolveSource;
|
|
76
|
+
lastExport: LastExportData | undefined;
|
|
78
77
|
} | {
|
|
79
|
-
job: (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
ciComponentGraph?: string;
|
|
83
|
-
}) | null;
|
|
78
|
+
job: import("./ripple.main.runtime").RippleJobFull | null;
|
|
79
|
+
source: import("./ripple-utils").ResolveSource | undefined;
|
|
80
|
+
lastExport: LastExportData | undefined;
|
|
84
81
|
componentBuild?: undefined;
|
|
85
82
|
}>;
|
|
86
83
|
}
|
|
@@ -109,10 +106,14 @@ export declare class RippleErrorsCmd implements Command {
|
|
|
109
106
|
job: null;
|
|
110
107
|
ciNodes: never[];
|
|
111
108
|
containerLogs: {};
|
|
109
|
+
source: "lane" | "arg" | "last-export" | undefined;
|
|
110
|
+
lastExport: LastExportData | undefined;
|
|
112
111
|
} | {
|
|
113
112
|
job: any;
|
|
114
113
|
ciNodes: CiGraphNode[];
|
|
115
114
|
containerLogs: Record<string, string[]>;
|
|
115
|
+
source: "lane" | "arg" | "last-export" | undefined;
|
|
116
|
+
lastExport: LastExportData | undefined;
|
|
116
117
|
error?: undefined;
|
|
117
118
|
}>;
|
|
118
119
|
private getErrors;
|
package/dist/ripple.cmd.js
CHANGED
|
@@ -29,6 +29,27 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
29
29
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
30
30
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
31
31
|
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
32
|
+
/**
|
|
33
|
+
* a last-export entry matches the target context when its saved lane equals the current lane
|
|
34
|
+
* (or both are undefined / "main"). this prevents using a stale last-export from a different lane
|
|
35
|
+
* after the user has switched lanes.
|
|
36
|
+
*/
|
|
37
|
+
function lastExportMatchesTarget(last, targetLane) {
|
|
38
|
+
const lastLaneStr = last.lane ? `${last.lane.scope}/${last.lane.name}` : undefined;
|
|
39
|
+
return lastLaneStr === targetLane;
|
|
40
|
+
}
|
|
41
|
+
function lastExportHeader(lastExport, job) {
|
|
42
|
+
const age = (0, _rippleUtils().formatAge)(lastExport.timestamp);
|
|
43
|
+
const target = lastExport.lane ? `lane "${lastExport.lane.scope}/${lastExport.lane.name}"` : 'main';
|
|
44
|
+
const phase = job.status?.phase?.toUpperCase();
|
|
45
|
+
if (phase === 'SUCCESS') {
|
|
46
|
+
return _chalk().default.green(`✓ Your last export (${age}) to ${target} succeeded.`);
|
|
47
|
+
}
|
|
48
|
+
if ((0, _rippleUtils().isFailedPhase)(phase)) {
|
|
49
|
+
return _chalk().default.red(`✗ Your last export (${age}) to ${target} failed.`);
|
|
50
|
+
}
|
|
51
|
+
return _chalk().default.gray(`Your last export (${age}) to ${target} — status: ${(0, _rippleUtils().colorPhase)(phase)}.`);
|
|
52
|
+
}
|
|
32
53
|
class RippleCmd {
|
|
33
54
|
constructor() {
|
|
34
55
|
_defineProperty(this, "name", 'ripple <sub-command>');
|
|
@@ -153,38 +174,49 @@ class RippleLogCmd {
|
|
|
153
174
|
constructor(ripple) {
|
|
154
175
|
this.ripple = ripple;
|
|
155
176
|
_defineProperty(this, "name", 'log [job-id]');
|
|
156
|
-
_defineProperty(this, "description", 'show job details and component build task summaries (auto-detects current lane when
|
|
177
|
+
_defineProperty(this, "description", 'show job details and component build task summaries (auto-detects current lane, or your last export when on main)');
|
|
157
178
|
_defineProperty(this, "skipWorkspace", true);
|
|
158
179
|
_defineProperty(this, "remoteOp", true);
|
|
159
180
|
_defineProperty(this, "alias", '');
|
|
160
181
|
_defineProperty(this, "options", [['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'], ['c', 'component <component>', 'show build tasks for a specific component (full component ID)'], ['j', 'json', 'return the output as JSON']]);
|
|
161
182
|
_defineProperty(this, "arguments", [{
|
|
162
183
|
name: 'job-id',
|
|
163
|
-
description: 'the Ripple CI job ID (optional — auto-detects from current lane)'
|
|
184
|
+
description: 'the Ripple CI job ID (optional — auto-detects from current lane, or your last export when on main)'
|
|
164
185
|
}]);
|
|
165
186
|
}
|
|
166
187
|
async resolveJob(jobId, flags) {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
188
|
+
const resolved = await (0, _rippleUtils().resolveJobId)(this.ripple, jobId, flags);
|
|
189
|
+
if ('error' in resolved) return {
|
|
190
|
+
job: null,
|
|
191
|
+
error: resolved.error,
|
|
192
|
+
source: undefined,
|
|
193
|
+
lastExport: undefined
|
|
194
|
+
};
|
|
195
|
+
// when resolved from last-export, the resolver already fetched the full job — reuse it
|
|
196
|
+
const job = resolved.job ?? (await this.ripple.getJob(resolved.id));
|
|
197
|
+
return {
|
|
198
|
+
job,
|
|
199
|
+
error: undefined,
|
|
200
|
+
source: resolved.source,
|
|
201
|
+
lastExport: resolved.lastExport
|
|
202
|
+
};
|
|
174
203
|
}
|
|
175
204
|
async report([jobId], flags) {
|
|
176
|
-
const
|
|
205
|
+
const {
|
|
206
|
+
job,
|
|
207
|
+
error,
|
|
208
|
+
source,
|
|
209
|
+
lastExport
|
|
210
|
+
} = await this.resolveJob(jobId, flags);
|
|
177
211
|
if (!job) {
|
|
178
|
-
if (
|
|
179
|
-
|
|
180
|
-
if (laneId) {
|
|
181
|
-
return _chalk().default.red(`No Ripple CI job found for lane "${laneId}".`);
|
|
182
|
-
}
|
|
183
|
-
return _chalk().default.red('Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace on a lane.');
|
|
184
|
-
}
|
|
185
|
-
return _chalk().default.red(`Job "${jobId}" not found.`);
|
|
212
|
+
if (jobId) return _chalk().default.red(`Job "${jobId}" not found.`);
|
|
213
|
+
return _chalk().default.red(error || 'Could not find a Ripple CI job.');
|
|
186
214
|
}
|
|
187
215
|
const lines = [];
|
|
216
|
+
if (source === 'last-export' && lastExport) {
|
|
217
|
+
lines.push(lastExportHeader(lastExport, job));
|
|
218
|
+
lines.push('');
|
|
219
|
+
}
|
|
188
220
|
lines.push(_chalk().default.bold('Job Details'));
|
|
189
221
|
lines.push(` ${_chalk().default.cyan('ID:')} ${job.id}`);
|
|
190
222
|
if (job.name) lines.push(` ${_chalk().default.cyan('Name:')} ${job.name}`);
|
|
@@ -266,16 +298,24 @@ class RippleLogCmd {
|
|
|
266
298
|
}
|
|
267
299
|
}
|
|
268
300
|
async json([jobId], flags) {
|
|
269
|
-
const
|
|
301
|
+
const {
|
|
302
|
+
job,
|
|
303
|
+
source,
|
|
304
|
+
lastExport
|
|
305
|
+
} = await this.resolveJob(jobId, flags);
|
|
270
306
|
if (flags.component && job) {
|
|
271
307
|
const summary = await this.ripple.getComponentBuildSummary(job.id, flags.component);
|
|
272
308
|
return {
|
|
273
309
|
job,
|
|
274
|
-
componentBuild: summary
|
|
310
|
+
componentBuild: summary,
|
|
311
|
+
source,
|
|
312
|
+
lastExport
|
|
275
313
|
};
|
|
276
314
|
}
|
|
277
315
|
return {
|
|
278
|
-
job
|
|
316
|
+
job,
|
|
317
|
+
source,
|
|
318
|
+
lastExport
|
|
279
319
|
};
|
|
280
320
|
}
|
|
281
321
|
}
|
|
@@ -284,20 +324,23 @@ class RippleErrorsCmd {
|
|
|
284
324
|
constructor(ripple) {
|
|
285
325
|
this.ripple = ripple;
|
|
286
326
|
_defineProperty(this, "name", 'errors [job-id]');
|
|
287
|
-
_defineProperty(this, "description", 'show build errors for a Ripple CI job (auto-detects current lane when
|
|
327
|
+
_defineProperty(this, "description", 'show build errors for a Ripple CI job (auto-detects current lane, or your last export when on main)');
|
|
288
328
|
_defineProperty(this, "skipWorkspace", true);
|
|
289
329
|
_defineProperty(this, "remoteOp", true);
|
|
290
330
|
_defineProperty(this, "alias", '');
|
|
291
|
-
_defineProperty(this, "options", [['', 'lane <lane>', 'lane ID to find the latest
|
|
331
|
+
_defineProperty(this, "options", [['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'], ['', 'log', 'show full build log for failed containers (not just the error summary)'], ['j', 'json', 'return the output as JSON']]);
|
|
292
332
|
_defineProperty(this, "arguments", [{
|
|
293
333
|
name: 'job-id',
|
|
294
|
-
description: 'the Ripple CI job ID (optional — auto-detects from current lane)'
|
|
334
|
+
description: 'the Ripple CI job ID (optional — auto-detects from current lane, or your last export when on main)'
|
|
295
335
|
}]);
|
|
296
336
|
}
|
|
297
337
|
async report([jobId], flags) {
|
|
298
338
|
const {
|
|
299
339
|
job,
|
|
300
|
-
ciNodes
|
|
340
|
+
ciNodes,
|
|
341
|
+
source,
|
|
342
|
+
lastExport,
|
|
343
|
+
error
|
|
301
344
|
} = await this.getErrors(jobId, flags);
|
|
302
345
|
if (!job) {
|
|
303
346
|
if (jobId) {
|
|
@@ -305,11 +348,15 @@ class RippleErrorsCmd {
|
|
|
305
348
|
}
|
|
306
349
|
const laneId = flags.lane || this.ripple.getCurrentLaneId();
|
|
307
350
|
if (laneId) {
|
|
308
|
-
return _chalk().default.red(`No
|
|
351
|
+
return _chalk().default.red(`No Ripple CI job found for lane "${laneId}".`);
|
|
309
352
|
}
|
|
310
|
-
return _chalk().default.red('Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace
|
|
353
|
+
return _chalk().default.red(error || 'Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace with a recent export.');
|
|
311
354
|
}
|
|
312
355
|
const lines = [];
|
|
356
|
+
if (source === 'last-export' && lastExport) {
|
|
357
|
+
lines.push(lastExportHeader(lastExport, job));
|
|
358
|
+
lines.push('');
|
|
359
|
+
}
|
|
313
360
|
lines.push(_chalk().default.bold(`Ripple CI Errors — ${job.name || job.id}`));
|
|
314
361
|
lines.push(` ${_chalk().default.cyan('Job ID:')} ${job.id}`);
|
|
315
362
|
lines.push(` ${_chalk().default.cyan('Status:')} ${(0, _rippleUtils().colorPhase)(job.status?.phase)}`);
|
|
@@ -383,14 +430,21 @@ class RippleErrorsCmd {
|
|
|
383
430
|
async json([jobId], flags) {
|
|
384
431
|
const {
|
|
385
432
|
job,
|
|
386
|
-
ciNodes
|
|
433
|
+
ciNodes,
|
|
434
|
+
source,
|
|
435
|
+
lastExport,
|
|
436
|
+
error
|
|
387
437
|
} = await this.getErrors(jobId, flags);
|
|
388
|
-
if (!job)
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
438
|
+
if (!job) {
|
|
439
|
+
return {
|
|
440
|
+
error: error || 'No job found',
|
|
441
|
+
job: null,
|
|
442
|
+
ciNodes: [],
|
|
443
|
+
containerLogs: {},
|
|
444
|
+
source,
|
|
445
|
+
lastExport
|
|
446
|
+
};
|
|
447
|
+
}
|
|
394
448
|
|
|
395
449
|
// fetch error logs for failed containers in parallel
|
|
396
450
|
const failedNodes = ciNodes.filter(n => (0, _rippleUtils().isFailedPhase)(n.phase));
|
|
@@ -403,28 +457,47 @@ class RippleErrorsCmd {
|
|
|
403
457
|
return {
|
|
404
458
|
job,
|
|
405
459
|
ciNodes,
|
|
406
|
-
containerLogs
|
|
460
|
+
containerLogs,
|
|
461
|
+
source,
|
|
462
|
+
lastExport
|
|
407
463
|
};
|
|
408
464
|
}
|
|
409
465
|
async getErrors(jobId, flags) {
|
|
410
|
-
let job;
|
|
466
|
+
let job = null;
|
|
467
|
+
let source;
|
|
468
|
+
let lastExport;
|
|
411
469
|
if (jobId) {
|
|
412
470
|
job = await this.ripple.getJob(jobId);
|
|
471
|
+
source = 'arg';
|
|
413
472
|
} else {
|
|
414
473
|
const laneId = flags.lane || this.ripple.getCurrentLaneId();
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
474
|
+
const last = await this.ripple.getLastExport();
|
|
475
|
+
if (last?.rippleJobs?.length && lastExportMatchesTarget(last, laneId)) {
|
|
476
|
+
const slug = last.rippleJobs[last.rippleJobs.length - 1];
|
|
477
|
+
job = await this.ripple.getJobBySlug(slug);
|
|
478
|
+
source = 'last-export';
|
|
479
|
+
lastExport = last;
|
|
480
|
+
if (!job) {
|
|
481
|
+
return {
|
|
482
|
+
job: null,
|
|
483
|
+
ciNodes: [],
|
|
484
|
+
source: 'last-export',
|
|
485
|
+
lastExport: last,
|
|
486
|
+
error: `Could not find Ripple CI job for your last export "${slug}".`
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
} else if (laneId) {
|
|
490
|
+
const found = await this.ripple.findLatestJobForLane(laneId);
|
|
491
|
+
job = found ? await this.ripple.getJob(found.id) : null;
|
|
492
|
+
source = 'lane';
|
|
420
493
|
}
|
|
421
|
-
const found = await this.ripple.findLatestJobForLane(laneId, 'FAILURE');
|
|
422
|
-
job = found ? await this.ripple.getJob(found.id) : null;
|
|
423
494
|
}
|
|
424
495
|
if (!job) {
|
|
425
496
|
return {
|
|
426
497
|
job: null,
|
|
427
|
-
ciNodes: []
|
|
498
|
+
ciNodes: [],
|
|
499
|
+
source,
|
|
500
|
+
lastExport
|
|
428
501
|
};
|
|
429
502
|
}
|
|
430
503
|
|
|
@@ -432,7 +505,9 @@ class RippleErrorsCmd {
|
|
|
432
505
|
const ciNodes = this.ripple.getCiGraphNodes(job);
|
|
433
506
|
return {
|
|
434
507
|
job,
|
|
435
|
-
ciNodes
|
|
508
|
+
ciNodes,
|
|
509
|
+
source,
|
|
510
|
+
lastExport
|
|
436
511
|
};
|
|
437
512
|
}
|
|
438
513
|
}
|
package/dist/ripple.cmd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_chalk","data","_interopRequireDefault","require","_cliTable","_rippleUtils","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RippleCmd","constructor","report","code","exports","RippleListCmd","ripple","args","flags","jobs","ownerUsed","getFilteredJobs","length","hint","lane","scope","tip","chalk","yellow","table","Table","head","cyan","chars","top","bottom","left","mid","right","middle","style","job","push","id","truncate","name","getScopeFromLaneId","laneId","colorPhase","status","phase","user","username","formatDate","startedAt","formatDuration","finishedAt","header","gray","toString","filter","Boolean","join","json","requestedLimit","limit","parseInt","isFinite","Error","filters","all","owner","getDefaultOwner","owners","lanes","scopes","toUpperCase","needsClientFilter","fetchLimit","Math","max","listJobs","userFilter","toLowerCase","j","includes","slice","RippleLogCmd","description","resolveJob","jobId","getJob","getCurrentLaneId","found","findLatestJobForLane","red","lines","bold","displayName","Date","toLocaleString","jobUrl","getJobUrl","component","appendComponentDetail","appendComponentList","componentId","summary","getComponentBuildSummary","tasks","task","startTime","warnings","ciNodes","getCiGraphNodes","totalComponents","reduce","sum","n","componentIds","shown","node","compId","icon","isFailedPhase","green","componentBuild","RippleErrorsCmd","getErrors","failedNodes","succeededNodes","otherNodes","failedComponents","flatMap","blockedComponents","containerNames","map","containerName","logMap","getContainerLogs","compList","logMessages","get","errorLines","log","extractErrorsFromLog","msg","clean","stripAnsi","test","succeededCount","error","containerLogs","messages","RippleRetryCmd","resolved","resolveJobId","allowedPhases","actionVerb","result","retryJob","RippleStopCmd","stopJob","dateStr","start","getTime","end","now","ms","seconds","floor","minutes","remainingSeconds","hours","remainingMinutes","split","str","substring"],"sources":["ripple.cmd.ts"],"sourcesContent":["import type { Command, CommandOptions } from '@teambit/cli';\nimport chalk from 'chalk';\nimport Table from 'cli-table';\nimport type { RippleMain, RippleJob, CiGraphNode } from './ripple.main.runtime';\nimport { colorPhase, isFailedPhase, stripAnsi, resolveJobId } from './ripple-utils';\n\nexport class RippleCmd implements Command {\n name = 'ripple <sub-command>';\n description = 'manage Ripple CI jobs on bit.cloud';\n extendedDescription = 'view, retry, and manage Ripple CI jobs that build your components in the cloud after export.';\n group = 'collaborate';\n skipWorkspace = true;\n remoteOp = true;\n\n options: CommandOptions = [];\n commands: Command[] = [];\n\n async report() {\n return { code: 1, data: '[ripple] please specify a subcommand. See --help for available commands.' };\n }\n}\n\nexport class RippleListCmd implements Command {\n name = 'list';\n description = 'list recent Ripple CI jobs (filtered by workspace owner by default)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'all', 'show jobs from all owners, not just the workspace owner'],\n ['o', 'owner <owner>', 'filter by organization (default: detected from workspace defaultScope)'],\n ['s', 'scope <scope>', 'filter by scope (e.g. \"teambit.cloud\")'],\n ['', 'lane <lane>', 'filter by lane ID (e.g. \"scope/lane-name\")'],\n ['u', 'user <user>', 'filter by username'],\n ['', 'status <status>', 'filter by status (e.g. SUCCESS, FAILURE, RUNNING)'],\n ['l', 'limit <limit>', 'max number of jobs to show (default: 20)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report(\n args: [],\n flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }\n ) {\n const { jobs, ownerUsed } = await this.getFilteredJobs(flags);\n\n if (!jobs || jobs.length === 0) {\n let hint = '';\n if (flags.lane) hint = ` for lane \"${flags.lane}\"`;\n else if (flags.scope) hint = ` for scope \"${flags.scope}\"`;\n else if (ownerUsed) hint = ` for owner \"${ownerUsed}\"`;\n const tip = ownerUsed ? ' Use --all to see jobs from all owners.' : '';\n return chalk.yellow(`No Ripple CI jobs found${hint}.${tip}`);\n }\n\n const table = new Table({\n head: [\n chalk.cyan('Job ID'),\n chalk.cyan('Name'),\n chalk.cyan('Scope'),\n chalk.cyan('Status'),\n chalk.cyan('User'),\n chalk.cyan('Started'),\n chalk.cyan('Duration'),\n ],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n style: { 'padding-left': 1, 'padding-right': 1 },\n });\n\n for (const job of jobs) {\n table.push([\n job.id,\n truncate(job.name || '-', 40),\n getScopeFromLaneId(job.laneId),\n colorPhase(job.status?.phase),\n job.user?.username || '-',\n formatDate(job.status?.startedAt),\n formatDuration(job.status?.startedAt, job.status?.finishedAt),\n ]);\n }\n\n const header = ownerUsed ? chalk.gray(`showing jobs for owner \"${ownerUsed}\" (use --all for all jobs)`) : '';\n return [header, table.toString()].filter(Boolean).join('\\n');\n }\n\n async json(\n args: [],\n flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }\n ) {\n const { jobs } = await this.getFilteredJobs(flags);\n return { jobs: jobs || [] };\n }\n\n private async getFilteredJobs(flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }): Promise<{ jobs: RippleJob[]; ownerUsed?: string }> {\n const requestedLimit = flags.limit ? parseInt(flags.limit, 10) : 20;\n if (!Number.isFinite(requestedLimit) || requestedLimit < 1) {\n throw new Error(`Invalid --limit value \"${flags.limit}\". Expected a positive integer.`);\n }\n\n // build server-side filters\n const filters: { lanes?: string[]; owners?: string[]; scopes?: string[]; status?: string } = {};\n\n // determine owner for default filtering (skip when --lane or --scope is given explicitly)\n let ownerUsed: string | undefined;\n if (!flags.all && !flags.lane && !flags.scope) {\n ownerUsed = flags.owner || this.ripple.getDefaultOwner();\n } else if (flags.owner) {\n ownerUsed = flags.owner;\n }\n\n if (ownerUsed) filters.owners = [ownerUsed];\n if (flags.lane) filters.lanes = [flags.lane];\n if (flags.scope) filters.scopes = [flags.scope];\n if (flags.status) filters.status = flags.status.toUpperCase();\n\n // user filter is not supported server-side, so overfetch if needed\n const needsClientFilter = !!flags.user;\n const fetchLimit = needsClientFilter ? Math.max(requestedLimit * 5, 100) : requestedLimit;\n let jobs = await this.ripple.listJobs({ filters, limit: fetchLimit });\n\n // apply client-side filters for fields not supported by FilterOptions\n if (flags.user) {\n const userFilter = flags.user.toLowerCase();\n jobs = jobs.filter((j) => j.user?.username?.toLowerCase().includes(userFilter));\n }\n\n jobs = jobs.slice(0, requestedLimit);\n\n return { jobs, ownerUsed };\n }\n}\n\nexport class RippleLogCmd implements Command {\n name = 'log [job-id]';\n description = 'show job details and component build task summaries (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['c', 'component <component>', 'show build tasks for a specific component (full component ID)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [{ name: 'job-id', description: 'the Ripple CI job ID (optional — auto-detects from current lane)' }];\n\n constructor(private ripple: RippleMain) {}\n\n private async resolveJob(jobId: string | undefined, flags: { lane?: string }) {\n if (jobId) {\n return this.ripple.getJob(jobId);\n }\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n if (!laneId) return null;\n const found = await this.ripple.findLatestJobForLane(laneId);\n return found ? this.ripple.getJob(found.id) : null;\n }\n\n async report([jobId]: [string], flags: { lane?: string; component?: string }) {\n const job = await this.resolveJob(jobId, flags);\n if (!job) {\n if (!jobId) {\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n if (laneId) {\n return chalk.red(`No Ripple CI job found for lane \"${laneId}\".`);\n }\n return chalk.red(\n 'Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace on a lane.'\n );\n }\n return chalk.red(`Job \"${jobId}\" not found.`);\n }\n\n const lines: string[] = [];\n lines.push(chalk.bold('Job Details'));\n lines.push(` ${chalk.cyan('ID:')} ${job.id}`);\n if (job.name) lines.push(` ${chalk.cyan('Name:')} ${job.name}`);\n lines.push(` ${chalk.cyan('Status:')} ${colorPhase(job.status?.phase)}`);\n if (job.laneId) lines.push(` ${chalk.cyan('Lane:')} ${job.laneId}`);\n if (job.user?.displayName)\n lines.push(` ${chalk.cyan('User:')} ${job.user.displayName} (${job.user.username})`);\n if (job.status?.startedAt)\n lines.push(` ${chalk.cyan('Started:')} ${new Date(job.status.startedAt).toLocaleString()}`);\n if (job.status?.finishedAt)\n lines.push(` ${chalk.cyan('Finished:')} ${new Date(job.status.finishedAt).toLocaleString()}`);\n const jobUrl = this.ripple.getJobUrl(job);\n lines.push(` ${chalk.cyan('URL:')} ${jobUrl}`);\n\n if (flags.component) {\n await this.appendComponentDetail(lines, job.id, flags.component);\n } else {\n this.appendComponentList(lines, job);\n }\n\n return lines.join('\\n');\n }\n\n private async appendComponentDetail(lines: string[], jobId: string, componentId: string) {\n const summary = await this.ripple.getComponentBuildSummary(jobId, componentId);\n if (!summary) {\n lines.push('');\n lines.push(chalk.yellow(`No build summary found for component \"${componentId}\" in this job.`));\n return;\n }\n lines.push('');\n lines.push(chalk.bold(`Build Tasks for ${summary.name || componentId}`));\n if (!summary.tasks || summary.tasks.length === 0) {\n lines.push(chalk.gray(' No build tasks found.'));\n return;\n }\n const table = new Table({\n head: [chalk.cyan('Task'), chalk.cyan('Status'), chalk.cyan('Started'), chalk.cyan('Warnings')],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n style: { 'padding-left': 1, 'padding-right': 1 },\n });\n for (const task of summary.tasks) {\n table.push([\n task.name || '-',\n colorPhase(task.status?.status),\n task.startTime ? new Date(task.startTime).toLocaleString() : '-',\n task.status?.warnings ? chalk.yellow(String(task.status.warnings)) : '0',\n ]);\n }\n lines.push(table.toString());\n }\n\n private appendComponentList(lines: string[], job: { ciGraph?: string }) {\n const ciNodes = this.ripple.getCiGraphNodes(job);\n if (ciNodes.length === 0) return;\n const totalComponents = ciNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n lines.push('');\n lines.push(chalk.bold(`Components (${totalComponents})`));\n lines.push(chalk.gray(' Use --component <id> to see build tasks for a specific component'));\n let shown = 0;\n for (const node of ciNodes) {\n if (shown >= 30) {\n lines.push(chalk.gray(` ... and ${totalComponents - shown} more`));\n break;\n }\n for (const compId of node.componentIds) {\n if (shown >= 30) break;\n const icon = isFailedPhase(node.phase)\n ? chalk.red('✗')\n : node.phase === 'SUCCESS'\n ? chalk.green('✓')\n : chalk.yellow('○');\n lines.push(` ${icon} ${compId}`);\n shown++;\n }\n }\n }\n\n async json([jobId]: [string], flags: { lane?: string; component?: string }) {\n const job = await this.resolveJob(jobId, flags);\n if (flags.component && job) {\n const summary = await this.ripple.getComponentBuildSummary(job.id, flags.component);\n return { job, componentBuild: summary };\n }\n return { job };\n }\n}\n\nexport class RippleErrorsCmd implements Command {\n name = 'errors [job-id]';\n description = 'show build errors for a Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest failed job for (default: detected from .bitmap)'],\n ['', 'log', 'show full build log for failed containers (not just the error summary)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [{ name: 'job-id', description: 'the Ripple CI job ID (optional — auto-detects from current lane)' }];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string; log?: boolean }) {\n const { job, ciNodes } = await this.getErrors(jobId, flags);\n\n if (!job) {\n if (jobId) {\n return chalk.red(`Job \"${jobId}\" not found.`);\n }\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n if (laneId) {\n return chalk.red(`No failed Ripple CI job found for lane \"${laneId}\".`);\n }\n return chalk.red(\n 'Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace on a lane.'\n );\n }\n\n const lines: string[] = [];\n lines.push(chalk.bold(`Ripple CI Errors — ${job.name || job.id}`));\n lines.push(` ${chalk.cyan('Job ID:')} ${job.id}`);\n lines.push(` ${chalk.cyan('Status:')} ${colorPhase(job.status?.phase)}`);\n if (job.laneId) lines.push(` ${chalk.cyan('Lane:')} ${job.laneId}`);\n lines.push(` ${chalk.cyan('URL:')} ${this.ripple.getJobUrl(job)}`);\n\n if (ciNodes.length === 0) {\n lines.push('');\n lines.push(chalk.yellow('Could not determine which components are in this job.'));\n return lines.join('\\n');\n }\n\n const failedNodes = ciNodes.filter((n) => isFailedPhase(n.phase));\n const succeededNodes = ciNodes.filter((n) => n.phase === 'SUCCESS');\n const otherNodes = ciNodes.filter((n) => !isFailedPhase(n.phase) && n.phase !== 'SUCCESS');\n\n const totalComponents = ciNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n const failedComponents = failedNodes.flatMap((n) => n.componentIds);\n const blockedComponents = otherNodes.flatMap((n) => n.componentIds);\n\n if (failedComponents.length === 0) {\n if (job.status?.phase?.toUpperCase() === 'FAILURE') {\n lines.push('');\n lines.push(\n chalk.yellow(`${totalComponents} component(s) in this job — no individual component failures found.`)\n );\n lines.push(chalk.yellow('The failure may be in a pipeline-level step. Check the Ripple CI URL above.'));\n } else {\n lines.push('');\n lines.push(chalk.green(`All ${totalComponents} component(s) built successfully.`));\n }\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(chalk.red.bold(`${failedComponents.length} component(s) with build failures:`));\n\n // fetch all build logs in parallel\n const containerNames = failedNodes.map((n) => n.containerName);\n const logMap = await this.ripple.getContainerLogs(job.id, containerNames);\n\n for (const node of failedNodes) {\n const compList = node.componentIds.join(', ');\n lines.push('');\n lines.push(chalk.bold(` ${compList}`));\n\n const logMessages = logMap.get(node.containerName);\n if (logMessages && logMessages.length > 0) {\n const errorLines = flags.log ? logMessages : this.ripple.extractErrorsFromLog(logMessages);\n if (errorLines.length > 0) {\n for (const msg of errorLines) {\n const clean = stripAnsi(msg);\n // skip stack trace lines (noisy) unless --log is used\n if (!flags.log && /^\\s+at\\s/.test(clean)) continue;\n if (clean.length > 0) {\n lines.push(` ${clean}`);\n }\n }\n } else {\n lines.push(chalk.gray(' No error details found in build log.'));\n }\n } else {\n lines.push(chalk.gray(' Build log not available.'));\n }\n }\n\n if (blockedComponents.length > 0) {\n lines.push('');\n lines.push(chalk.yellow(`${blockedComponents.length} component(s) not built (blocked by failure):`));\n for (const compId of blockedComponents) {\n lines.push(` ${chalk.yellow('○')} ${compId}`);\n }\n }\n\n if (succeededNodes.length > 0) {\n const succeededCount = succeededNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n lines.push('');\n lines.push(chalk.green(`${succeededCount} component(s) built successfully.`));\n }\n\n return lines.join('\\n');\n }\n\n async json([jobId]: [string], flags: { lane?: string; log?: boolean }) {\n const { job, ciNodes } = await this.getErrors(jobId, flags);\n if (!job) return { error: 'No job found', job: null, ciNodes: [], containerLogs: {} };\n\n // fetch error logs for failed containers in parallel\n const failedNodes = ciNodes.filter((n) => isFailedPhase(n.phase));\n const containerNames = failedNodes.map((n) => n.containerName);\n const logMap = await this.ripple.getContainerLogs(job.id, containerNames);\n const containerLogs: Record<string, string[]> = {};\n for (const [name, messages] of logMap) {\n containerLogs[name] = flags.log ? messages : this.ripple.extractErrorsFromLog(messages);\n }\n\n return { job, ciNodes, containerLogs };\n }\n\n private async getErrors(\n jobId: string | undefined,\n flags: { lane?: string }\n ): Promise<{\n job: any;\n ciNodes: CiGraphNode[];\n }> {\n let job;\n\n if (jobId) {\n job = await this.ripple.getJob(jobId);\n } else {\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n if (!laneId) {\n return { job: null, ciNodes: [] };\n }\n const found = await this.ripple.findLatestJobForLane(laneId, 'FAILURE');\n job = found ? await this.ripple.getJob(found.id) : null;\n }\n\n if (!job) {\n return { job: null, ciNodes: [] };\n }\n\n // use ciGraph (internal graph) for job-specific build status per container/component\n const ciNodes = this.ripple.getCiGraphNodes(job);\n\n return { job, ciNodes };\n }\n}\n\nexport class RippleRetryCmd implements Command {\n name = 'retry [job-id]';\n description = 'retry a failed Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n { name: 'job-id', description: 'the Ripple CI job ID to retry (optional — auto-detects from current lane)' },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['FAILURE', 'FAILED'],\n actionVerb: 'retry',\n });\n if ('error' in resolved) return chalk.red(resolved.error);\n\n const result = await this.ripple.retryJob(resolved.id);\n if (!result) {\n return chalk.red(`Failed to retry job \"${resolved.id}\". Make sure the job exists and has failed.`);\n }\n const lines: string[] = [];\n lines.push(chalk.green(`Successfully retried job \"${resolved.id}\".`));\n if (result.id) lines.push(` ${chalk.cyan('New Job ID:')} ${result.id}`);\n if (result.status?.phase) lines.push(` ${chalk.cyan('Status:')} ${result.status.phase}`);\n const jobUrl = this.ripple.getJobUrl(result);\n lines.push(` ${chalk.cyan('URL:')} ${jobUrl}`);\n return lines.join('\\n');\n }\n\n async json([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['FAILURE', 'FAILED'],\n actionVerb: 'retry',\n });\n if ('error' in resolved) return { error: resolved.error };\n const result = await this.ripple.retryJob(resolved.id);\n return { job: result };\n }\n}\n\nexport class RippleStopCmd implements Command {\n name = 'stop [job-id]';\n description = 'stop a running Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n { name: 'job-id', description: 'the Ripple CI job ID to stop (optional — auto-detects from current lane)' },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['RUNNING', 'IN_PROGRESS', 'PROCESSING'],\n actionVerb: 'stop',\n });\n if ('error' in resolved) return chalk.red(resolved.error);\n\n const result = await this.ripple.stopJob(resolved.id);\n if (!result) {\n return chalk.red(`Failed to stop job \"${resolved.id}\". Make sure the job exists and is currently running.`);\n }\n return chalk.green(`Successfully stopped job \"${resolved.id}\".`);\n }\n\n async json([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['RUNNING', 'IN_PROGRESS', 'PROCESSING'],\n actionVerb: 'stop',\n });\n if ('error' in resolved) return { error: resolved.error };\n const result = await this.ripple.stopJob(resolved.id);\n return { job: result };\n }\n}\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return '-';\n try {\n return new Date(dateStr).toLocaleString();\n } catch {\n return dateStr;\n }\n}\n\nfunction formatDuration(startedAt?: string, finishedAt?: string): string {\n if (!startedAt) return '-';\n const start = new Date(startedAt).getTime();\n const end = finishedAt ? new Date(finishedAt).getTime() : Date.now();\n const ms = end - start;\n if (ms < 0) return '-';\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n\nfunction getScopeFromLaneId(laneId?: string): string {\n if (!laneId) return '-';\n return laneId.split('/')[0] || '-';\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.substring(0, max - 1)}…`;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_chalk","data","_interopRequireDefault","require","_cliTable","_rippleUtils","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","lastExportMatchesTarget","last","targetLane","lastLaneStr","lane","scope","name","undefined","lastExportHeader","lastExport","job","age","formatAge","timestamp","target","phase","status","toUpperCase","chalk","green","isFailedPhase","red","gray","colorPhase","RippleCmd","constructor","report","code","exports","RippleListCmd","ripple","args","flags","jobs","ownerUsed","getFilteredJobs","length","hint","tip","yellow","table","Table","head","cyan","chars","top","bottom","left","mid","right","middle","style","push","id","truncate","getScopeFromLaneId","laneId","user","username","formatDate","startedAt","formatDuration","finishedAt","header","toString","filter","Boolean","join","json","requestedLimit","limit","parseInt","isFinite","Error","filters","all","owner","getDefaultOwner","owners","lanes","scopes","needsClientFilter","fetchLimit","Math","max","listJobs","userFilter","toLowerCase","j","includes","slice","RippleLogCmd","description","resolveJob","jobId","resolved","resolveJobId","error","source","getJob","lines","bold","displayName","Date","toLocaleString","jobUrl","getJobUrl","component","appendComponentDetail","appendComponentList","componentId","summary","getComponentBuildSummary","tasks","task","startTime","warnings","ciNodes","getCiGraphNodes","totalComponents","reduce","sum","n","componentIds","shown","node","compId","icon","componentBuild","RippleErrorsCmd","getErrors","getCurrentLaneId","failedNodes","succeededNodes","otherNodes","failedComponents","flatMap","blockedComponents","containerNames","map","containerName","logMap","getContainerLogs","compList","logMessages","get","errorLines","log","extractErrorsFromLog","msg","clean","stripAnsi","test","succeededCount","containerLogs","messages","getLastExport","rippleJobs","slug","getJobBySlug","found","findLatestJobForLane","RippleRetryCmd","allowedPhases","actionVerb","result","retryJob","RippleStopCmd","stopJob","dateStr","start","getTime","end","now","ms","seconds","floor","minutes","remainingSeconds","hours","remainingMinutes","split","str","substring"],"sources":["ripple.cmd.ts"],"sourcesContent":["import type { Command, CommandOptions } from '@teambit/cli';\nimport chalk from 'chalk';\nimport Table from 'cli-table';\nimport type { LastExportData } from '@teambit/export';\nimport type { RippleMain, RippleJob, CiGraphNode } from './ripple.main.runtime';\nimport { colorPhase, isFailedPhase, stripAnsi, resolveJobId, formatAge } from './ripple-utils';\n\n/**\n * a last-export entry matches the target context when its saved lane equals the current lane\n * (or both are undefined / \"main\"). this prevents using a stale last-export from a different lane\n * after the user has switched lanes.\n */\nfunction lastExportMatchesTarget(last: LastExportData, targetLane: string | undefined): boolean {\n const lastLaneStr = last.lane ? `${last.lane.scope}/${last.lane.name}` : undefined;\n return lastLaneStr === targetLane;\n}\n\nfunction lastExportHeader(lastExport: LastExportData, job: { status?: { phase?: string } }): string {\n const age = formatAge(lastExport.timestamp);\n const target = lastExport.lane ? `lane \"${lastExport.lane.scope}/${lastExport.lane.name}\"` : 'main';\n const phase = job.status?.phase?.toUpperCase();\n if (phase === 'SUCCESS') {\n return chalk.green(`✓ Your last export (${age}) to ${target} succeeded.`);\n }\n if (isFailedPhase(phase)) {\n return chalk.red(`✗ Your last export (${age}) to ${target} failed.`);\n }\n return chalk.gray(`Your last export (${age}) to ${target} — status: ${colorPhase(phase)}.`);\n}\n\nexport class RippleCmd implements Command {\n name = 'ripple <sub-command>';\n description = 'manage Ripple CI jobs on bit.cloud';\n extendedDescription = 'view, retry, and manage Ripple CI jobs that build your components in the cloud after export.';\n group = 'collaborate';\n skipWorkspace = true;\n remoteOp = true;\n\n options: CommandOptions = [];\n commands: Command[] = [];\n\n async report() {\n return { code: 1, data: '[ripple] please specify a subcommand. See --help for available commands.' };\n }\n}\n\nexport class RippleListCmd implements Command {\n name = 'list';\n description = 'list recent Ripple CI jobs (filtered by workspace owner by default)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'all', 'show jobs from all owners, not just the workspace owner'],\n ['o', 'owner <owner>', 'filter by organization (default: detected from workspace defaultScope)'],\n ['s', 'scope <scope>', 'filter by scope (e.g. \"teambit.cloud\")'],\n ['', 'lane <lane>', 'filter by lane ID (e.g. \"scope/lane-name\")'],\n ['u', 'user <user>', 'filter by username'],\n ['', 'status <status>', 'filter by status (e.g. SUCCESS, FAILURE, RUNNING)'],\n ['l', 'limit <limit>', 'max number of jobs to show (default: 20)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report(\n args: [],\n flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }\n ) {\n const { jobs, ownerUsed } = await this.getFilteredJobs(flags);\n\n if (!jobs || jobs.length === 0) {\n let hint = '';\n if (flags.lane) hint = ` for lane \"${flags.lane}\"`;\n else if (flags.scope) hint = ` for scope \"${flags.scope}\"`;\n else if (ownerUsed) hint = ` for owner \"${ownerUsed}\"`;\n const tip = ownerUsed ? ' Use --all to see jobs from all owners.' : '';\n return chalk.yellow(`No Ripple CI jobs found${hint}.${tip}`);\n }\n\n const table = new Table({\n head: [\n chalk.cyan('Job ID'),\n chalk.cyan('Name'),\n chalk.cyan('Scope'),\n chalk.cyan('Status'),\n chalk.cyan('User'),\n chalk.cyan('Started'),\n chalk.cyan('Duration'),\n ],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n style: { 'padding-left': 1, 'padding-right': 1 },\n });\n\n for (const job of jobs) {\n table.push([\n job.id,\n truncate(job.name || '-', 40),\n getScopeFromLaneId(job.laneId),\n colorPhase(job.status?.phase),\n job.user?.username || '-',\n formatDate(job.status?.startedAt),\n formatDuration(job.status?.startedAt, job.status?.finishedAt),\n ]);\n }\n\n const header = ownerUsed ? chalk.gray(`showing jobs for owner \"${ownerUsed}\" (use --all for all jobs)`) : '';\n return [header, table.toString()].filter(Boolean).join('\\n');\n }\n\n async json(\n args: [],\n flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }\n ) {\n const { jobs } = await this.getFilteredJobs(flags);\n return { jobs: jobs || [] };\n }\n\n private async getFilteredJobs(flags: {\n all?: boolean;\n owner?: string;\n scope?: string;\n lane?: string;\n user?: string;\n status?: string;\n limit?: string;\n }): Promise<{ jobs: RippleJob[]; ownerUsed?: string }> {\n const requestedLimit = flags.limit ? parseInt(flags.limit, 10) : 20;\n if (!Number.isFinite(requestedLimit) || requestedLimit < 1) {\n throw new Error(`Invalid --limit value \"${flags.limit}\". Expected a positive integer.`);\n }\n\n // build server-side filters\n const filters: { lanes?: string[]; owners?: string[]; scopes?: string[]; status?: string } = {};\n\n // determine owner for default filtering (skip when --lane or --scope is given explicitly)\n let ownerUsed: string | undefined;\n if (!flags.all && !flags.lane && !flags.scope) {\n ownerUsed = flags.owner || this.ripple.getDefaultOwner();\n } else if (flags.owner) {\n ownerUsed = flags.owner;\n }\n\n if (ownerUsed) filters.owners = [ownerUsed];\n if (flags.lane) filters.lanes = [flags.lane];\n if (flags.scope) filters.scopes = [flags.scope];\n if (flags.status) filters.status = flags.status.toUpperCase();\n\n // user filter is not supported server-side, so overfetch if needed\n const needsClientFilter = !!flags.user;\n const fetchLimit = needsClientFilter ? Math.max(requestedLimit * 5, 100) : requestedLimit;\n let jobs = await this.ripple.listJobs({ filters, limit: fetchLimit });\n\n // apply client-side filters for fields not supported by FilterOptions\n if (flags.user) {\n const userFilter = flags.user.toLowerCase();\n jobs = jobs.filter((j) => j.user?.username?.toLowerCase().includes(userFilter));\n }\n\n jobs = jobs.slice(0, requestedLimit);\n\n return { jobs, ownerUsed };\n }\n}\n\nexport class RippleLogCmd implements Command {\n name = 'log [job-id]';\n description =\n 'show job details and component build task summaries (auto-detects current lane, or your last export when on main)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['c', 'component <component>', 'show build tasks for a specific component (full component ID)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n {\n name: 'job-id',\n description: 'the Ripple CI job ID (optional — auto-detects from current lane, or your last export when on main)',\n },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n private async resolveJob(jobId: string | undefined, flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags);\n if ('error' in resolved) return { job: null, error: resolved.error, source: undefined, lastExport: undefined };\n // when resolved from last-export, the resolver already fetched the full job — reuse it\n const job = resolved.job ?? (await this.ripple.getJob(resolved.id));\n return { job, error: undefined, source: resolved.source, lastExport: resolved.lastExport };\n }\n\n async report([jobId]: [string], flags: { lane?: string; component?: string }) {\n const { job, error, source, lastExport } = await this.resolveJob(jobId, flags);\n if (!job) {\n if (jobId) return chalk.red(`Job \"${jobId}\" not found.`);\n return chalk.red(error || 'Could not find a Ripple CI job.');\n }\n\n const lines: string[] = [];\n if (source === 'last-export' && lastExport) {\n lines.push(lastExportHeader(lastExport, job));\n lines.push('');\n }\n lines.push(chalk.bold('Job Details'));\n lines.push(` ${chalk.cyan('ID:')} ${job.id}`);\n if (job.name) lines.push(` ${chalk.cyan('Name:')} ${job.name}`);\n lines.push(` ${chalk.cyan('Status:')} ${colorPhase(job.status?.phase)}`);\n if (job.laneId) lines.push(` ${chalk.cyan('Lane:')} ${job.laneId}`);\n if (job.user?.displayName)\n lines.push(` ${chalk.cyan('User:')} ${job.user.displayName} (${job.user.username})`);\n if (job.status?.startedAt)\n lines.push(` ${chalk.cyan('Started:')} ${new Date(job.status.startedAt).toLocaleString()}`);\n if (job.status?.finishedAt)\n lines.push(` ${chalk.cyan('Finished:')} ${new Date(job.status.finishedAt).toLocaleString()}`);\n const jobUrl = this.ripple.getJobUrl(job);\n lines.push(` ${chalk.cyan('URL:')} ${jobUrl}`);\n\n if (flags.component) {\n await this.appendComponentDetail(lines, job.id, flags.component);\n } else {\n this.appendComponentList(lines, job);\n }\n\n return lines.join('\\n');\n }\n\n private async appendComponentDetail(lines: string[], jobId: string, componentId: string) {\n const summary = await this.ripple.getComponentBuildSummary(jobId, componentId);\n if (!summary) {\n lines.push('');\n lines.push(chalk.yellow(`No build summary found for component \"${componentId}\" in this job.`));\n return;\n }\n lines.push('');\n lines.push(chalk.bold(`Build Tasks for ${summary.name || componentId}`));\n if (!summary.tasks || summary.tasks.length === 0) {\n lines.push(chalk.gray(' No build tasks found.'));\n return;\n }\n const table = new Table({\n head: [chalk.cyan('Task'), chalk.cyan('Status'), chalk.cyan('Started'), chalk.cyan('Warnings')],\n chars: {\n top: '',\n 'top-mid': '',\n 'top-left': '',\n 'top-right': '',\n bottom: '',\n 'bottom-mid': '',\n 'bottom-left': '',\n 'bottom-right': '',\n left: '',\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n right: '',\n 'right-mid': '',\n middle: ' ',\n },\n style: { 'padding-left': 1, 'padding-right': 1 },\n });\n for (const task of summary.tasks) {\n table.push([\n task.name || '-',\n colorPhase(task.status?.status),\n task.startTime ? new Date(task.startTime).toLocaleString() : '-',\n task.status?.warnings ? chalk.yellow(String(task.status.warnings)) : '0',\n ]);\n }\n lines.push(table.toString());\n }\n\n private appendComponentList(lines: string[], job: { ciGraph?: string }) {\n const ciNodes = this.ripple.getCiGraphNodes(job);\n if (ciNodes.length === 0) return;\n const totalComponents = ciNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n lines.push('');\n lines.push(chalk.bold(`Components (${totalComponents})`));\n lines.push(chalk.gray(' Use --component <id> to see build tasks for a specific component'));\n let shown = 0;\n for (const node of ciNodes) {\n if (shown >= 30) {\n lines.push(chalk.gray(` ... and ${totalComponents - shown} more`));\n break;\n }\n for (const compId of node.componentIds) {\n if (shown >= 30) break;\n const icon = isFailedPhase(node.phase)\n ? chalk.red('✗')\n : node.phase === 'SUCCESS'\n ? chalk.green('✓')\n : chalk.yellow('○');\n lines.push(` ${icon} ${compId}`);\n shown++;\n }\n }\n }\n\n async json([jobId]: [string], flags: { lane?: string; component?: string }) {\n const { job, source, lastExport } = await this.resolveJob(jobId, flags);\n if (flags.component && job) {\n const summary = await this.ripple.getComponentBuildSummary(job.id, flags.component);\n return { job, componentBuild: summary, source, lastExport };\n }\n return { job, source, lastExport };\n }\n}\n\nexport class RippleErrorsCmd implements Command {\n name = 'errors [job-id]';\n description = 'show build errors for a Ripple CI job (auto-detects current lane, or your last export when on main)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['', 'log', 'show full build log for failed containers (not just the error summary)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n {\n name: 'job-id',\n description: 'the Ripple CI job ID (optional — auto-detects from current lane, or your last export when on main)',\n },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string; log?: boolean }) {\n const { job, ciNodes, source, lastExport, error } = await this.getErrors(jobId, flags);\n\n if (!job) {\n if (jobId) {\n return chalk.red(`Job \"${jobId}\" not found.`);\n }\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n if (laneId) {\n return chalk.red(`No Ripple CI job found for lane \"${laneId}\".`);\n }\n return chalk.red(\n error ||\n 'Could not find a Ripple CI job. Provide a job ID, use --lane, or run from a workspace with a recent export.'\n );\n }\n\n const lines: string[] = [];\n if (source === 'last-export' && lastExport) {\n lines.push(lastExportHeader(lastExport, job));\n lines.push('');\n }\n lines.push(chalk.bold(`Ripple CI Errors — ${job.name || job.id}`));\n lines.push(` ${chalk.cyan('Job ID:')} ${job.id}`);\n lines.push(` ${chalk.cyan('Status:')} ${colorPhase(job.status?.phase)}`);\n if (job.laneId) lines.push(` ${chalk.cyan('Lane:')} ${job.laneId}`);\n lines.push(` ${chalk.cyan('URL:')} ${this.ripple.getJobUrl(job)}`);\n\n if (ciNodes.length === 0) {\n lines.push('');\n lines.push(chalk.yellow('Could not determine which components are in this job.'));\n return lines.join('\\n');\n }\n\n const failedNodes = ciNodes.filter((n) => isFailedPhase(n.phase));\n const succeededNodes = ciNodes.filter((n) => n.phase === 'SUCCESS');\n const otherNodes = ciNodes.filter((n) => !isFailedPhase(n.phase) && n.phase !== 'SUCCESS');\n\n const totalComponents = ciNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n const failedComponents = failedNodes.flatMap((n) => n.componentIds);\n const blockedComponents = otherNodes.flatMap((n) => n.componentIds);\n\n if (failedComponents.length === 0) {\n if (job.status?.phase?.toUpperCase() === 'FAILURE') {\n lines.push('');\n lines.push(\n chalk.yellow(`${totalComponents} component(s) in this job — no individual component failures found.`)\n );\n lines.push(chalk.yellow('The failure may be in a pipeline-level step. Check the Ripple CI URL above.'));\n } else {\n lines.push('');\n lines.push(chalk.green(`All ${totalComponents} component(s) built successfully.`));\n }\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(chalk.red.bold(`${failedComponents.length} component(s) with build failures:`));\n\n // fetch all build logs in parallel\n const containerNames = failedNodes.map((n) => n.containerName);\n const logMap = await this.ripple.getContainerLogs(job.id, containerNames);\n\n for (const node of failedNodes) {\n const compList = node.componentIds.join(', ');\n lines.push('');\n lines.push(chalk.bold(` ${compList}`));\n\n const logMessages = logMap.get(node.containerName);\n if (logMessages && logMessages.length > 0) {\n const errorLines = flags.log ? logMessages : this.ripple.extractErrorsFromLog(logMessages);\n if (errorLines.length > 0) {\n for (const msg of errorLines) {\n const clean = stripAnsi(msg);\n // skip stack trace lines (noisy) unless --log is used\n if (!flags.log && /^\\s+at\\s/.test(clean)) continue;\n if (clean.length > 0) {\n lines.push(` ${clean}`);\n }\n }\n } else {\n lines.push(chalk.gray(' No error details found in build log.'));\n }\n } else {\n lines.push(chalk.gray(' Build log not available.'));\n }\n }\n\n if (blockedComponents.length > 0) {\n lines.push('');\n lines.push(chalk.yellow(`${blockedComponents.length} component(s) not built (blocked by failure):`));\n for (const compId of blockedComponents) {\n lines.push(` ${chalk.yellow('○')} ${compId}`);\n }\n }\n\n if (succeededNodes.length > 0) {\n const succeededCount = succeededNodes.reduce((sum, n) => sum + n.componentIds.length, 0);\n lines.push('');\n lines.push(chalk.green(`${succeededCount} component(s) built successfully.`));\n }\n\n return lines.join('\\n');\n }\n\n async json([jobId]: [string], flags: { lane?: string; log?: boolean }) {\n const { job, ciNodes, source, lastExport, error } = await this.getErrors(jobId, flags);\n if (!job) {\n return { error: error || 'No job found', job: null, ciNodes: [], containerLogs: {}, source, lastExport };\n }\n\n // fetch error logs for failed containers in parallel\n const failedNodes = ciNodes.filter((n) => isFailedPhase(n.phase));\n const containerNames = failedNodes.map((n) => n.containerName);\n const logMap = await this.ripple.getContainerLogs(job.id, containerNames);\n const containerLogs: Record<string, string[]> = {};\n for (const [name, messages] of logMap) {\n containerLogs[name] = flags.log ? messages : this.ripple.extractErrorsFromLog(messages);\n }\n\n return { job, ciNodes, containerLogs, source, lastExport };\n }\n\n private async getErrors(\n jobId: string | undefined,\n flags: { lane?: string }\n ): Promise<{\n job: any;\n ciNodes: CiGraphNode[];\n source?: 'arg' | 'lane' | 'last-export';\n lastExport?: LastExportData;\n error?: string;\n }> {\n let job: any = null;\n let source: 'arg' | 'lane' | 'last-export' | undefined;\n let lastExport: LastExportData | undefined;\n\n if (jobId) {\n job = await this.ripple.getJob(jobId);\n source = 'arg';\n } else {\n const laneId = flags.lane || this.ripple.getCurrentLaneId();\n const last = await this.ripple.getLastExport();\n if (last?.rippleJobs?.length && lastExportMatchesTarget(last, laneId)) {\n const slug = last.rippleJobs[last.rippleJobs.length - 1];\n job = await this.ripple.getJobBySlug(slug);\n source = 'last-export';\n lastExport = last;\n if (!job) {\n return {\n job: null,\n ciNodes: [],\n source: 'last-export',\n lastExport: last,\n error: `Could not find Ripple CI job for your last export \"${slug}\".`,\n };\n }\n } else if (laneId) {\n const found = await this.ripple.findLatestJobForLane(laneId);\n job = found ? await this.ripple.getJob(found.id) : null;\n source = 'lane';\n }\n }\n\n if (!job) {\n return { job: null, ciNodes: [], source, lastExport };\n }\n\n // use ciGraph (internal graph) for job-specific build status per container/component\n const ciNodes = this.ripple.getCiGraphNodes(job);\n\n return { job, ciNodes, source, lastExport };\n }\n}\n\nexport class RippleRetryCmd implements Command {\n name = 'retry [job-id]';\n description = 'retry a failed Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n { name: 'job-id', description: 'the Ripple CI job ID to retry (optional — auto-detects from current lane)' },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['FAILURE', 'FAILED'],\n actionVerb: 'retry',\n });\n if ('error' in resolved) return chalk.red(resolved.error);\n\n const result = await this.ripple.retryJob(resolved.id);\n if (!result) {\n return chalk.red(`Failed to retry job \"${resolved.id}\". Make sure the job exists and has failed.`);\n }\n const lines: string[] = [];\n lines.push(chalk.green(`Successfully retried job \"${resolved.id}\".`));\n if (result.id) lines.push(` ${chalk.cyan('New Job ID:')} ${result.id}`);\n if (result.status?.phase) lines.push(` ${chalk.cyan('Status:')} ${result.status.phase}`);\n const jobUrl = this.ripple.getJobUrl(result);\n lines.push(` ${chalk.cyan('URL:')} ${jobUrl}`);\n return lines.join('\\n');\n }\n\n async json([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['FAILURE', 'FAILED'],\n actionVerb: 'retry',\n });\n if ('error' in resolved) return { error: resolved.error };\n const result = await this.ripple.retryJob(resolved.id);\n return { job: result };\n }\n}\n\nexport class RippleStopCmd implements Command {\n name = 'stop [job-id]';\n description = 'stop a running Ripple CI job (auto-detects current lane when no job-id given)';\n skipWorkspace = true;\n remoteOp = true;\n alias = '';\n\n options: CommandOptions = [\n ['', 'lane <lane>', 'lane ID to find the latest job for (default: detected from .bitmap)'],\n ['j', 'json', 'return the output as JSON'],\n ];\n\n arguments = [\n { name: 'job-id', description: 'the Ripple CI job ID to stop (optional — auto-detects from current lane)' },\n ];\n\n constructor(private ripple: RippleMain) {}\n\n async report([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['RUNNING', 'IN_PROGRESS', 'PROCESSING'],\n actionVerb: 'stop',\n });\n if ('error' in resolved) return chalk.red(resolved.error);\n\n const result = await this.ripple.stopJob(resolved.id);\n if (!result) {\n return chalk.red(`Failed to stop job \"${resolved.id}\". Make sure the job exists and is currently running.`);\n }\n return chalk.green(`Successfully stopped job \"${resolved.id}\".`);\n }\n\n async json([jobId]: [string], flags: { lane?: string }) {\n const resolved = await resolveJobId(this.ripple, jobId, flags, {\n allowedPhases: ['RUNNING', 'IN_PROGRESS', 'PROCESSING'],\n actionVerb: 'stop',\n });\n if ('error' in resolved) return { error: resolved.error };\n const result = await this.ripple.stopJob(resolved.id);\n return { job: result };\n }\n}\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return '-';\n try {\n return new Date(dateStr).toLocaleString();\n } catch {\n return dateStr;\n }\n}\n\nfunction formatDuration(startedAt?: string, finishedAt?: string): string {\n if (!startedAt) return '-';\n const start = new Date(startedAt).getTime();\n const end = finishedAt ? new Date(finishedAt).getTime() : Date.now();\n const ms = end - start;\n if (ms < 0) return '-';\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n if (minutes < 60) return `${minutes}m ${remainingSeconds}s`;\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n return `${hours}h ${remainingMinutes}m`;\n}\n\nfunction getScopeFromLaneId(laneId?: string): string {\n if (!laneId) return '-';\n return laneId.split('/')[0] || '-';\n}\n\nfunction truncate(str: string, max: number): string {\n if (str.length <= max) return str;\n return `${str.substring(0, max - 1)}…`;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,6 +3,7 @@ import { type CLIMain } from '@teambit/cli';
|
|
|
3
3
|
import { type LoggerMain, type Logger } from '@teambit/logger';
|
|
4
4
|
import { type CloudMain } from '@teambit/cloud';
|
|
5
5
|
import type { Workspace } from '@teambit/workspace';
|
|
6
|
+
import { type LastExportData } from '@teambit/export';
|
|
6
7
|
export type JobStatus = {
|
|
7
8
|
startedAt?: string;
|
|
8
9
|
finishedAt?: string;
|
|
@@ -10,6 +11,8 @@ export type JobStatus = {
|
|
|
10
11
|
};
|
|
11
12
|
export type RippleJob = {
|
|
12
13
|
id: string;
|
|
14
|
+
/** url-safe identifier used by the cloud UI; the bit.cloud /ripple-ci/job/ page resolves by slug, not id */
|
|
15
|
+
slug?: string;
|
|
13
16
|
name?: string;
|
|
14
17
|
laneId?: string;
|
|
15
18
|
simulation?: boolean;
|
|
@@ -19,6 +22,11 @@ export type RippleJob = {
|
|
|
19
22
|
};
|
|
20
23
|
status?: JobStatus;
|
|
21
24
|
};
|
|
25
|
+
export type RippleJobFull = RippleJob & {
|
|
26
|
+
hash?: string;
|
|
27
|
+
ciGraph?: string;
|
|
28
|
+
ciComponentGraph?: string;
|
|
29
|
+
};
|
|
22
30
|
export type BuildTaskStatus = {
|
|
23
31
|
status?: string;
|
|
24
32
|
warnings?: number;
|
|
@@ -48,6 +56,7 @@ export declare class RippleMain {
|
|
|
48
56
|
constructor(cloud: CloudMain, logger: Logger, workspace?: Workspace | undefined);
|
|
49
57
|
private static LIST_JOBS;
|
|
50
58
|
private static GET_JOB;
|
|
59
|
+
private static GET_JOB_BY_SLUG;
|
|
51
60
|
private static GET_COMPONENT_BUILD_SUMMARY;
|
|
52
61
|
private static RETRY_JOB;
|
|
53
62
|
private static STOP_JOB;
|
|
@@ -63,11 +72,7 @@ export declare class RippleMain {
|
|
|
63
72
|
status?: string;
|
|
64
73
|
};
|
|
65
74
|
}): Promise<RippleJob[]>;
|
|
66
|
-
getJob(jobId: string): Promise<
|
|
67
|
-
hash?: string;
|
|
68
|
-
ciGraph?: string;
|
|
69
|
-
ciComponentGraph?: string;
|
|
70
|
-
}) | null>;
|
|
75
|
+
getJob(jobId: string): Promise<RippleJobFull | null>;
|
|
71
76
|
/**
|
|
72
77
|
* parse a job's ciGraph (internal graph) to extract per-node build status.
|
|
73
78
|
* ciGraph has the job-specific build results (unlike ciComponentGraph which is static).
|
|
@@ -98,6 +103,16 @@ export declare class RippleMain {
|
|
|
98
103
|
* returns the laneId in "scope/lane-name" format, or undefined if not on a lane.
|
|
99
104
|
*/
|
|
100
105
|
getCurrentLaneId(): string | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* read the last-export.json written by ExportMain after a successful export.
|
|
108
|
+
* used to auto-resolve the ripple job when the user is on main (no current lane).
|
|
109
|
+
*/
|
|
110
|
+
getLastExport(): Promise<LastExportData | null>;
|
|
111
|
+
/**
|
|
112
|
+
* the central-hub returns url slugs in `metadata.jobs`, not the GraphQL job ids accepted by getJob(jobId).
|
|
113
|
+
* the schema also supports getJob(slug: ID!), which we use here to fetch the job directly from a slug.
|
|
114
|
+
*/
|
|
115
|
+
getJobBySlug(slug: string): Promise<RippleJobFull | null>;
|
|
101
116
|
/**
|
|
102
117
|
* find the latest job for a given laneId, optionally filtered by status phase.
|
|
103
118
|
*/
|
|
@@ -39,6 +39,13 @@ function _legacy() {
|
|
|
39
39
|
};
|
|
40
40
|
return data;
|
|
41
41
|
}
|
|
42
|
+
function _export() {
|
|
43
|
+
const data = require("@teambit/export");
|
|
44
|
+
_export = function () {
|
|
45
|
+
return data;
|
|
46
|
+
};
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
42
49
|
function _rippleUtils() {
|
|
43
50
|
const data = require("./ripple-utils");
|
|
44
51
|
_rippleUtils = function () {
|
|
@@ -285,6 +292,26 @@ class RippleMain {
|
|
|
285
292
|
return laneId.toString();
|
|
286
293
|
}
|
|
287
294
|
|
|
295
|
+
/**
|
|
296
|
+
* read the last-export.json written by ExportMain after a successful export.
|
|
297
|
+
* used to auto-resolve the ripple job when the user is on main (no current lane).
|
|
298
|
+
*/
|
|
299
|
+
async getLastExport() {
|
|
300
|
+
if (!this.workspace) return null;
|
|
301
|
+
return (0, _export().readLastExport)(this.workspace.scope.path);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* the central-hub returns url slugs in `metadata.jobs`, not the GraphQL job ids accepted by getJob(jobId).
|
|
306
|
+
* the schema also supports getJob(slug: ID!), which we use here to fetch the job directly from a slug.
|
|
307
|
+
*/
|
|
308
|
+
async getJobBySlug(slug) {
|
|
309
|
+
const data = await this.fetchRippleGQL(RippleMain.GET_JOB_BY_SLUG, {
|
|
310
|
+
slug
|
|
311
|
+
});
|
|
312
|
+
return data?.getJob ?? null;
|
|
313
|
+
}
|
|
314
|
+
|
|
288
315
|
/**
|
|
289
316
|
* find the latest job for a given laneId, optionally filtered by status phase.
|
|
290
317
|
*/
|
|
@@ -311,15 +338,18 @@ class RippleMain {
|
|
|
311
338
|
return defaultScope.split('.')[0];
|
|
312
339
|
}
|
|
313
340
|
getJobUrl(job) {
|
|
341
|
+
// the bit.cloud UI resolves the /ripple-ci/job/<id-or-slug> segment by slug;
|
|
342
|
+
// job.id (a uuid) returns "No CI job found", so prefer slug when present.
|
|
343
|
+
const segment = job.slug || job.id;
|
|
314
344
|
if (job.laneId) {
|
|
315
345
|
// laneId format: "scope/lane-name", e.g. "att-bit.duc/my-lane"
|
|
316
346
|
const [scope, ...laneParts] = job.laneId.split('/');
|
|
317
347
|
const laneName = laneParts.join('/');
|
|
318
348
|
if (scope && laneName) {
|
|
319
|
-
return `https://${(0, _legacy().getCloudDomain)()}/${scope.split('.').join('/')}/~lane/${laneName}/~ripple-ci/job/${
|
|
349
|
+
return `https://${(0, _legacy().getCloudDomain)()}/${scope.split('.').join('/')}/~lane/${laneName}/~ripple-ci/job/${segment}`;
|
|
320
350
|
}
|
|
321
351
|
}
|
|
322
|
-
return `https://${(0, _legacy().getCloudDomain)()}/ripple-ci/job/${
|
|
352
|
+
return `https://${(0, _legacy().getCloudDomain)()}/ripple-ci/job/${segment}`;
|
|
323
353
|
}
|
|
324
354
|
static async provider([cli, cloud, loggerAspect, workspace]) {
|
|
325
355
|
const logger = loggerAspect.createLogger(_ripple().RippleAspect.id);
|
|
@@ -349,6 +379,23 @@ _defineProperty(RippleMain, "GET_JOB", `
|
|
|
349
379
|
query getJob($jobId: ID!) {
|
|
350
380
|
getJob(jobId: $jobId) {
|
|
351
381
|
id
|
|
382
|
+
slug
|
|
383
|
+
name
|
|
384
|
+
laneId
|
|
385
|
+
hash
|
|
386
|
+
simulation
|
|
387
|
+
user { username displayName }
|
|
388
|
+
status { startedAt finishedAt phase }
|
|
389
|
+
ciGraph
|
|
390
|
+
ciComponentGraph
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
`);
|
|
394
|
+
_defineProperty(RippleMain, "GET_JOB_BY_SLUG", `
|
|
395
|
+
query getJobBySlug($slug: ID!) {
|
|
396
|
+
getJob(slug: $slug) {
|
|
397
|
+
id
|
|
398
|
+
slug
|
|
352
399
|
name
|
|
353
400
|
laneId
|
|
354
401
|
hash
|
|
@@ -378,6 +425,7 @@ _defineProperty(RippleMain, "RETRY_JOB", `
|
|
|
378
425
|
mutation retryJob($jobId: ID!) {
|
|
379
426
|
retryJob(jobId: $jobId) {
|
|
380
427
|
id
|
|
428
|
+
slug
|
|
381
429
|
name
|
|
382
430
|
laneId
|
|
383
431
|
status { startedAt finishedAt phase }
|
|
@@ -388,6 +436,7 @@ _defineProperty(RippleMain, "STOP_JOB", `
|
|
|
388
436
|
mutation stopJob($jobId: ID!) {
|
|
389
437
|
stopJob(jobId: $jobId) {
|
|
390
438
|
id
|
|
439
|
+
slug
|
|
391
440
|
name
|
|
392
441
|
laneId
|
|
393
442
|
status { startedAt finishedAt phase }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_cli","data","require","_logger","_cloud","_workspace","_legacy","_rippleUtils","_stripAnsi","_interopRequireDefault","_ripple","_ripple2","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RippleMain","constructor","cloud","logger","workspace","ensureAuthenticated","getAuthToken","Error","fetchRippleGQL","query","variables","graphqlUrl","getCloudApi","body","JSON","stringify","headers","getAuthHeader","response","fetch","method","ok","text","catch","status","json","errors","messages","map","message","join","listJobs","opts","LIST_JOBS","filters","limit","offset","getJob","jobId","GET_JOB","getCiGraphNodes","job","ciGraph","graph","parse","nodes","node","attr","ids","id","stripComponentVersion","componentIds","containerName","name","phase","getComponentBuildSummary","componentId","GET_COMPONENT_BUILD_SUMMARY","getContainerLog","url","Accept","controller","AbortController","hardTimeout","setTimeout","abort","idleTimer","signal","clearTimeout","reader","getReader","decoder","TextDecoder","buffer","resetIdle","done","read","decode","stream","lines","split","pop","line","startsWith","parsed","substring","err","warn","getContainerLogs","containerNames","results","Promise","allSettled","log","logMap","Map","result","set","extractErrorsFromLog","patterns","pattern","idx","findIndex","m","stripAnsi","includes","slice","retryJob","RETRY_JOB","stopJob","STOP_JOB","getCurrentLaneId","undefined","laneId","isDefault","toString","findLatestJobForLane","lanes","jobs","getDefaultOwner","defaultScope","getJobUrl","scope","laneParts","laneName","getCloudDomain","provider","cli","loggerAspect","createLogger","RippleAspect","ripple","rippleCmd","RippleCmd","commands","RippleListCmd","RippleLogCmd","RippleErrorsCmd","RippleRetryCmd","RippleStopCmd","register","exports","MainRuntime","CLIAspect","CloudAspect","LoggerAspect","WorkspaceAspect","addRuntime"],"sources":["ripple.main.runtime.ts"],"sourcesContent":["import type { RuntimeDefinition } from '@teambit/harmony';\nimport { CLIAspect, type CLIMain, MainRuntime } from '@teambit/cli';\nimport { LoggerAspect, type LoggerMain, type Logger } from '@teambit/logger';\nimport { CloudAspect, type CloudMain } from '@teambit/cloud';\nimport type { Workspace } from '@teambit/workspace';\nimport { WorkspaceAspect } from '@teambit/workspace';\nimport { getCloudDomain } from '@teambit/legacy.constants';\nimport { stripComponentVersion } from './ripple-utils';\nimport stripAnsi from 'strip-ansi';\nimport { RippleAspect } from './ripple.aspect';\nimport { RippleCmd, RippleListCmd, RippleLogCmd, RippleErrorsCmd, RippleRetryCmd, RippleStopCmd } from './ripple.cmd';\n\nexport type JobStatus = {\n startedAt?: string;\n finishedAt?: string;\n phase?: string;\n};\n\nexport type RippleJob = {\n id: string;\n name?: string;\n laneId?: string;\n simulation?: boolean;\n user?: { username?: string; displayName?: string };\n status?: JobStatus;\n};\n\nexport type BuildTaskStatus = {\n status?: string;\n warnings?: number;\n};\n\nexport type BuildTaskSummary = {\n name?: string;\n description?: string;\n startTime?: string;\n status?: BuildTaskStatus;\n};\n\nexport type ComponentBuildSummary = {\n id?: string;\n name?: string;\n tasks?: BuildTaskSummary[];\n};\n\nexport type CiGraphNode = {\n componentIds: string[];\n containerName: string;\n phase: string;\n};\n\nexport class RippleMain {\n static runtime: RuntimeDefinition = MainRuntime;\n static dependencies = [CLIAspect, CloudAspect, LoggerAspect, WorkspaceAspect];\n\n constructor(\n private cloud: CloudMain,\n private logger: Logger,\n private workspace?: Workspace\n ) {}\n\n private static LIST_JOBS = `\n query listJobs($filters: FilterOptions, $limit: Int, $offset: Int) {\n listJobs(filters: $filters, limit: $limit, offset: $offset) {\n id\n name\n laneId\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static GET_JOB = `\n query getJob($jobId: ID!) {\n getJob(jobId: $jobId) {\n id\n name\n laneId\n hash\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n ciGraph\n ciComponentGraph\n }\n }\n `;\n\n private static GET_COMPONENT_BUILD_SUMMARY = `\n query getComponentBuildSummary($jobId: ID!, $componentId: String!) {\n getComponentBuildSummary(jobId: $jobId, componentId: $componentId) {\n id\n name\n tasks {\n name\n description\n startTime\n status { status warnings }\n }\n }\n }\n `;\n\n private static RETRY_JOB = `\n mutation retryJob($jobId: ID!) {\n retryJob(jobId: $jobId) {\n id\n name\n laneId\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static STOP_JOB = `\n mutation stopJob($jobId: ID!) {\n stopJob(jobId: $jobId) {\n id\n name\n laneId\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private ensureAuthenticated(): void {\n if (!this.cloud.getAuthToken()) {\n throw new Error('You are not logged in. Please run \"bit login\" first.');\n }\n }\n\n private async fetchRippleGQL<T>(query: string, variables?: Record<string, any>): Promise<T | null> {\n this.ensureAuthenticated();\n const graphqlUrl = `${this.cloud.getCloudApi()}/graphql`;\n const body = JSON.stringify({ query, variables });\n const headers = {\n 'Content-Type': 'application/json',\n ...this.cloud.getAuthHeader(),\n };\n const response = await fetch(graphqlUrl, { method: 'POST', headers, body });\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Ripple CI API returned HTTP ${response.status}: ${text}`);\n }\n const json = (await response.json()) as { data?: T; errors?: Array<{ message: string }> };\n if (json.errors?.length) {\n const messages = json.errors.map((e) => e.message).join(', ');\n throw new Error(`Ripple CI API error: ${messages}`);\n }\n return json.data ?? null;\n }\n\n async listJobs(opts: {\n limit?: number;\n offset?: number;\n filters?: { lanes?: string[]; owners?: string[]; scopes?: string[]; status?: string };\n }): Promise<RippleJob[]> {\n const data = await this.fetchRippleGQL<{ listJobs: RippleJob[] }>(RippleMain.LIST_JOBS, {\n filters: opts.filters,\n limit: opts.limit ?? 20,\n offset: opts.offset,\n });\n return data?.listJobs ?? [];\n }\n\n async getJob(\n jobId: string\n ): Promise<(RippleJob & { hash?: string; ciGraph?: string; ciComponentGraph?: string }) | null> {\n const data = await this.fetchRippleGQL<{\n getJob: RippleJob & { hash?: string; ciGraph?: string; ciComponentGraph?: string };\n }>(RippleMain.GET_JOB, { jobId });\n return data?.getJob ?? null;\n }\n\n /**\n * parse a job's ciGraph (internal graph) to extract per-node build status.\n * ciGraph has the job-specific build results (unlike ciComponentGraph which is static).\n * each node represents a build container that builds one or more components.\n */\n getCiGraphNodes(job: { ciGraph?: string }): CiGraphNode[] {\n if (!job.ciGraph) return [];\n try {\n const graph = JSON.parse(job.ciGraph) as { nodes?: Array<{ id: string; attr: string | Record<string, any> }> };\n if (!graph.nodes) return [];\n return graph.nodes.map((node) => {\n const attr = typeof node.attr === 'string' ? JSON.parse(node.attr) : node.attr;\n const ids: string[] = (attr.ids || []).map((id: string) => stripComponentVersion(id));\n return {\n componentIds: ids,\n containerName: attr.status?.name || node.id,\n phase: attr.status?.phase || 'UNKNOWN',\n };\n });\n } catch {\n return [];\n }\n }\n\n async getComponentBuildSummary(jobId: string, componentId: string): Promise<ComponentBuildSummary | null> {\n const data = await this.fetchRippleGQL<{ getComponentBuildSummary: ComponentBuildSummary }>(\n RippleMain.GET_COMPONENT_BUILD_SUMMARY,\n { jobId, componentId }\n );\n return data?.getComponentBuildSummary ?? null;\n }\n\n /**\n * fetch build logs for a specific container in a job via the REST SSE endpoint.\n * uses an idle timeout to detect end-of-stream (SSE connections may not close).\n */\n async getContainerLog(jobId: string, containerName: string): Promise<string[]> {\n this.ensureAuthenticated();\n const url = `${this.cloud.getCloudApi()}/ripple-ci/api/job/log/${jobId}/${containerName}`;\n const headers = {\n Accept: 'text/event-stream',\n ...this.cloud.getAuthHeader(),\n };\n const controller = new AbortController();\n // hard cap to avoid hanging forever\n const hardTimeout = setTimeout(() => controller.abort(), 30_000);\n const messages: string[] = [];\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n const response = await fetch(url, { headers, signal: controller.signal });\n if (!response.ok || !response.body) {\n clearTimeout(hardTimeout);\n return [];\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const resetIdle = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => controller.abort(), 3_000);\n };\n resetIdle();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n const { done, value } = await reader.read();\n if (done) break;\n resetIdle();\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n try {\n const parsed = JSON.parse(line.substring(6)) as { message?: string };\n if (parsed.message != null) messages.push(parsed.message);\n } catch {\n // skip malformed lines\n }\n }\n }\n } catch (err: any) {\n if (err?.name !== 'AbortError') {\n this.logger.warn(`Failed to fetch container log: ${err?.message}`);\n }\n } finally {\n if (idleTimer) clearTimeout(idleTimer);\n clearTimeout(hardTimeout);\n }\n return messages;\n }\n\n /**\n * fetch build logs for multiple containers in parallel.\n */\n async getContainerLogs(jobId: string, containerNames: string[]): Promise<Map<string, string[]>> {\n const results = await Promise.allSettled(\n containerNames.map(async (name) => {\n const log = await this.getContainerLog(jobId, name);\n return { name, log };\n })\n );\n const logMap = new Map<string, string[]>();\n for (const result of results) {\n if (result.status === 'fulfilled') {\n logMap.set(result.value.name, result.value.log);\n }\n }\n return logMap;\n }\n\n /**\n * extract the error section from container log messages.\n * looks for common error patterns in the build output.\n */\n extractErrorsFromLog(messages: string[]): string[] {\n const patterns = ['errors were found', 'Failed task', 'threw an error', 'Error:', 'FAIL'];\n for (const pattern of patterns) {\n const idx = messages.findIndex((m) => stripAnsi(m).includes(pattern));\n if (idx >= 0) {\n return messages.slice(idx);\n }\n }\n // last resort: grab the last 30 lines if the log has content\n if (messages.length > 0) {\n return messages.slice(-30);\n }\n return [];\n }\n\n async retryJob(jobId: string): Promise<RippleJob | null> {\n const data = await this.fetchRippleGQL<{ retryJob: RippleJob }>(RippleMain.RETRY_JOB, { jobId });\n return data?.retryJob ?? null;\n }\n\n async stopJob(jobId: string): Promise<RippleJob | null> {\n const data = await this.fetchRippleGQL<{ stopJob: RippleJob }>(RippleMain.STOP_JOB, { jobId });\n return data?.stopJob ?? null;\n }\n\n /**\n * detect the current lane from the workspace.\n * returns the laneId in \"scope/lane-name\" format, or undefined if not on a lane.\n */\n getCurrentLaneId(): string | undefined {\n if (!this.workspace) return undefined;\n const laneId = this.workspace.getCurrentLaneId();\n if (!laneId || laneId.isDefault()) return undefined;\n return laneId.toString();\n }\n\n /**\n * find the latest job for a given laneId, optionally filtered by status phase.\n */\n async findLatestJobForLane(laneId: string, phase?: string): Promise<RippleJob | null> {\n const filters: { lanes: string[]; status?: string } = { lanes: [laneId] };\n if (phase) {\n filters.status = phase;\n }\n const jobs = await this.listJobs({ filters, limit: 1 });\n return jobs[0] ?? null;\n }\n\n /**\n * detect the workspace owner from the workspace defaultScope.\n */\n getDefaultOwner(): string | undefined {\n const defaultScope = this.workspace?.defaultScope;\n if (!defaultScope?.includes('.')) return undefined;\n return defaultScope.split('.')[0];\n }\n\n getJobUrl(job: RippleJob): string {\n if (job.laneId) {\n // laneId format: \"scope/lane-name\", e.g. \"att-bit.duc/my-lane\"\n const [scope, ...laneParts] = job.laneId.split('/');\n const laneName = laneParts.join('/');\n if (scope && laneName) {\n return `https://${getCloudDomain()}/${scope.split('.').join('/')}/~lane/${laneName}/~ripple-ci/job/${job.id}`;\n }\n }\n return `https://${getCloudDomain()}/ripple-ci/job/${job.id}`;\n }\n\n static async provider([cli, cloud, loggerAspect, workspace]: [CLIMain, CloudMain, LoggerMain, Workspace]) {\n const logger = loggerAspect.createLogger(RippleAspect.id);\n const ripple = new RippleMain(cloud, logger, workspace);\n\n const rippleCmd = new RippleCmd();\n rippleCmd.commands = [\n new RippleListCmd(ripple),\n new RippleLogCmd(ripple),\n new RippleErrorsCmd(ripple),\n new RippleRetryCmd(ripple),\n new RippleStopCmd(ripple),\n ];\n cli.register(rippleCmd);\n\n return ripple;\n }\n}\n\nRippleAspect.addRuntime(RippleMain);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_cli","data","require","_logger","_cloud","_workspace","_legacy","_export","_rippleUtils","_stripAnsi","_interopRequireDefault","_ripple","_ripple2","e","__esModule","default","ownKeys","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RippleMain","constructor","cloud","logger","workspace","ensureAuthenticated","getAuthToken","Error","fetchRippleGQL","query","variables","graphqlUrl","getCloudApi","body","JSON","stringify","headers","getAuthHeader","response","fetch","method","ok","text","catch","status","json","errors","messages","map","message","join","listJobs","opts","LIST_JOBS","filters","limit","offset","getJob","jobId","GET_JOB","getCiGraphNodes","job","ciGraph","graph","parse","nodes","node","attr","ids","id","stripComponentVersion","componentIds","containerName","name","phase","getComponentBuildSummary","componentId","GET_COMPONENT_BUILD_SUMMARY","getContainerLog","url","Accept","controller","AbortController","hardTimeout","setTimeout","abort","idleTimer","signal","clearTimeout","reader","getReader","decoder","TextDecoder","buffer","resetIdle","done","read","decode","stream","lines","split","pop","line","startsWith","parsed","substring","err","warn","getContainerLogs","containerNames","results","Promise","allSettled","log","logMap","Map","result","set","extractErrorsFromLog","patterns","pattern","idx","findIndex","m","stripAnsi","includes","slice","retryJob","RETRY_JOB","stopJob","STOP_JOB","getCurrentLaneId","undefined","laneId","isDefault","toString","getLastExport","readLastExport","scope","path","getJobBySlug","slug","GET_JOB_BY_SLUG","findLatestJobForLane","lanes","jobs","getDefaultOwner","defaultScope","getJobUrl","segment","laneParts","laneName","getCloudDomain","provider","cli","loggerAspect","createLogger","RippleAspect","ripple","rippleCmd","RippleCmd","commands","RippleListCmd","RippleLogCmd","RippleErrorsCmd","RippleRetryCmd","RippleStopCmd","register","exports","MainRuntime","CLIAspect","CloudAspect","LoggerAspect","WorkspaceAspect","addRuntime"],"sources":["ripple.main.runtime.ts"],"sourcesContent":["import type { RuntimeDefinition } from '@teambit/harmony';\nimport { CLIAspect, type CLIMain, MainRuntime } from '@teambit/cli';\nimport { LoggerAspect, type LoggerMain, type Logger } from '@teambit/logger';\nimport { CloudAspect, type CloudMain } from '@teambit/cloud';\nimport type { Workspace } from '@teambit/workspace';\nimport { WorkspaceAspect } from '@teambit/workspace';\nimport { getCloudDomain } from '@teambit/legacy.constants';\nimport { readLastExport, type LastExportData } from '@teambit/export';\nimport { stripComponentVersion } from './ripple-utils';\nimport stripAnsi from 'strip-ansi';\nimport { RippleAspect } from './ripple.aspect';\nimport { RippleCmd, RippleListCmd, RippleLogCmd, RippleErrorsCmd, RippleRetryCmd, RippleStopCmd } from './ripple.cmd';\n\nexport type JobStatus = {\n startedAt?: string;\n finishedAt?: string;\n phase?: string;\n};\n\nexport type RippleJob = {\n id: string;\n /** url-safe identifier used by the cloud UI; the bit.cloud /ripple-ci/job/ page resolves by slug, not id */\n slug?: string;\n name?: string;\n laneId?: string;\n simulation?: boolean;\n user?: { username?: string; displayName?: string };\n status?: JobStatus;\n};\n\nexport type RippleJobFull = RippleJob & { hash?: string; ciGraph?: string; ciComponentGraph?: string };\n\nexport type BuildTaskStatus = {\n status?: string;\n warnings?: number;\n};\n\nexport type BuildTaskSummary = {\n name?: string;\n description?: string;\n startTime?: string;\n status?: BuildTaskStatus;\n};\n\nexport type ComponentBuildSummary = {\n id?: string;\n name?: string;\n tasks?: BuildTaskSummary[];\n};\n\nexport type CiGraphNode = {\n componentIds: string[];\n containerName: string;\n phase: string;\n};\n\nexport class RippleMain {\n static runtime: RuntimeDefinition = MainRuntime;\n static dependencies = [CLIAspect, CloudAspect, LoggerAspect, WorkspaceAspect];\n\n constructor(\n private cloud: CloudMain,\n private logger: Logger,\n private workspace?: Workspace\n ) {}\n\n private static LIST_JOBS = `\n query listJobs($filters: FilterOptions, $limit: Int, $offset: Int) {\n listJobs(filters: $filters, limit: $limit, offset: $offset) {\n id\n name\n laneId\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static GET_JOB = `\n query getJob($jobId: ID!) {\n getJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n hash\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n ciGraph\n ciComponentGraph\n }\n }\n `;\n\n private static GET_JOB_BY_SLUG = `\n query getJobBySlug($slug: ID!) {\n getJob(slug: $slug) {\n id\n slug\n name\n laneId\n hash\n simulation\n user { username displayName }\n status { startedAt finishedAt phase }\n ciGraph\n ciComponentGraph\n }\n }\n `;\n\n private static GET_COMPONENT_BUILD_SUMMARY = `\n query getComponentBuildSummary($jobId: ID!, $componentId: String!) {\n getComponentBuildSummary(jobId: $jobId, componentId: $componentId) {\n id\n name\n tasks {\n name\n description\n startTime\n status { status warnings }\n }\n }\n }\n `;\n\n private static RETRY_JOB = `\n mutation retryJob($jobId: ID!) {\n retryJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private static STOP_JOB = `\n mutation stopJob($jobId: ID!) {\n stopJob(jobId: $jobId) {\n id\n slug\n name\n laneId\n status { startedAt finishedAt phase }\n }\n }\n `;\n\n private ensureAuthenticated(): void {\n if (!this.cloud.getAuthToken()) {\n throw new Error('You are not logged in. Please run \"bit login\" first.');\n }\n }\n\n private async fetchRippleGQL<T>(query: string, variables?: Record<string, any>): Promise<T | null> {\n this.ensureAuthenticated();\n const graphqlUrl = `${this.cloud.getCloudApi()}/graphql`;\n const body = JSON.stringify({ query, variables });\n const headers = {\n 'Content-Type': 'application/json',\n ...this.cloud.getAuthHeader(),\n };\n const response = await fetch(graphqlUrl, { method: 'POST', headers, body });\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new Error(`Ripple CI API returned HTTP ${response.status}: ${text}`);\n }\n const json = (await response.json()) as { data?: T; errors?: Array<{ message: string }> };\n if (json.errors?.length) {\n const messages = json.errors.map((e) => e.message).join(', ');\n throw new Error(`Ripple CI API error: ${messages}`);\n }\n return json.data ?? null;\n }\n\n async listJobs(opts: {\n limit?: number;\n offset?: number;\n filters?: { lanes?: string[]; owners?: string[]; scopes?: string[]; status?: string };\n }): Promise<RippleJob[]> {\n const data = await this.fetchRippleGQL<{ listJobs: RippleJob[] }>(RippleMain.LIST_JOBS, {\n filters: opts.filters,\n limit: opts.limit ?? 20,\n offset: opts.offset,\n });\n return data?.listJobs ?? [];\n }\n\n async getJob(jobId: string): Promise<RippleJobFull | null> {\n const data = await this.fetchRippleGQL<{\n getJob: RippleJobFull;\n }>(RippleMain.GET_JOB, { jobId });\n return data?.getJob ?? null;\n }\n\n /**\n * parse a job's ciGraph (internal graph) to extract per-node build status.\n * ciGraph has the job-specific build results (unlike ciComponentGraph which is static).\n * each node represents a build container that builds one or more components.\n */\n getCiGraphNodes(job: { ciGraph?: string }): CiGraphNode[] {\n if (!job.ciGraph) return [];\n try {\n const graph = JSON.parse(job.ciGraph) as { nodes?: Array<{ id: string; attr: string | Record<string, any> }> };\n if (!graph.nodes) return [];\n return graph.nodes.map((node) => {\n const attr = typeof node.attr === 'string' ? JSON.parse(node.attr) : node.attr;\n const ids: string[] = (attr.ids || []).map((id: string) => stripComponentVersion(id));\n return {\n componentIds: ids,\n containerName: attr.status?.name || node.id,\n phase: attr.status?.phase || 'UNKNOWN',\n };\n });\n } catch {\n return [];\n }\n }\n\n async getComponentBuildSummary(jobId: string, componentId: string): Promise<ComponentBuildSummary | null> {\n const data = await this.fetchRippleGQL<{ getComponentBuildSummary: ComponentBuildSummary }>(\n RippleMain.GET_COMPONENT_BUILD_SUMMARY,\n { jobId, componentId }\n );\n return data?.getComponentBuildSummary ?? null;\n }\n\n /**\n * fetch build logs for a specific container in a job via the REST SSE endpoint.\n * uses an idle timeout to detect end-of-stream (SSE connections may not close).\n */\n async getContainerLog(jobId: string, containerName: string): Promise<string[]> {\n this.ensureAuthenticated();\n const url = `${this.cloud.getCloudApi()}/ripple-ci/api/job/log/${jobId}/${containerName}`;\n const headers = {\n Accept: 'text/event-stream',\n ...this.cloud.getAuthHeader(),\n };\n const controller = new AbortController();\n // hard cap to avoid hanging forever\n const hardTimeout = setTimeout(() => controller.abort(), 30_000);\n const messages: string[] = [];\n let idleTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n const response = await fetch(url, { headers, signal: controller.signal });\n if (!response.ok || !response.body) {\n clearTimeout(hardTimeout);\n return [];\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n const resetIdle = () => {\n if (idleTimer) clearTimeout(idleTimer);\n idleTimer = setTimeout(() => controller.abort(), 3_000);\n };\n resetIdle();\n // eslint-disable-next-line no-constant-condition\n while (true) {\n // eslint-disable-next-line no-await-in-loop\n const { done, value } = await reader.read();\n if (done) break;\n resetIdle();\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue;\n try {\n const parsed = JSON.parse(line.substring(6)) as { message?: string };\n if (parsed.message != null) messages.push(parsed.message);\n } catch {\n // skip malformed lines\n }\n }\n }\n } catch (err: any) {\n if (err?.name !== 'AbortError') {\n this.logger.warn(`Failed to fetch container log: ${err?.message}`);\n }\n } finally {\n if (idleTimer) clearTimeout(idleTimer);\n clearTimeout(hardTimeout);\n }\n return messages;\n }\n\n /**\n * fetch build logs for multiple containers in parallel.\n */\n async getContainerLogs(jobId: string, containerNames: string[]): Promise<Map<string, string[]>> {\n const results = await Promise.allSettled(\n containerNames.map(async (name) => {\n const log = await this.getContainerLog(jobId, name);\n return { name, log };\n })\n );\n const logMap = new Map<string, string[]>();\n for (const result of results) {\n if (result.status === 'fulfilled') {\n logMap.set(result.value.name, result.value.log);\n }\n }\n return logMap;\n }\n\n /**\n * extract the error section from container log messages.\n * looks for common error patterns in the build output.\n */\n extractErrorsFromLog(messages: string[]): string[] {\n const patterns = ['errors were found', 'Failed task', 'threw an error', 'Error:', 'FAIL'];\n for (const pattern of patterns) {\n const idx = messages.findIndex((m) => stripAnsi(m).includes(pattern));\n if (idx >= 0) {\n return messages.slice(idx);\n }\n }\n // last resort: grab the last 30 lines if the log has content\n if (messages.length > 0) {\n return messages.slice(-30);\n }\n return [];\n }\n\n async retryJob(jobId: string): Promise<RippleJob | null> {\n const data = await this.fetchRippleGQL<{ retryJob: RippleJob }>(RippleMain.RETRY_JOB, { jobId });\n return data?.retryJob ?? null;\n }\n\n async stopJob(jobId: string): Promise<RippleJob | null> {\n const data = await this.fetchRippleGQL<{ stopJob: RippleJob }>(RippleMain.STOP_JOB, { jobId });\n return data?.stopJob ?? null;\n }\n\n /**\n * detect the current lane from the workspace.\n * returns the laneId in \"scope/lane-name\" format, or undefined if not on a lane.\n */\n getCurrentLaneId(): string | undefined {\n if (!this.workspace) return undefined;\n const laneId = this.workspace.getCurrentLaneId();\n if (!laneId || laneId.isDefault()) return undefined;\n return laneId.toString();\n }\n\n /**\n * read the last-export.json written by ExportMain after a successful export.\n * used to auto-resolve the ripple job when the user is on main (no current lane).\n */\n async getLastExport(): Promise<LastExportData | null> {\n if (!this.workspace) return null;\n return readLastExport(this.workspace.scope.path);\n }\n\n /**\n * the central-hub returns url slugs in `metadata.jobs`, not the GraphQL job ids accepted by getJob(jobId).\n * the schema also supports getJob(slug: ID!), which we use here to fetch the job directly from a slug.\n */\n async getJobBySlug(slug: string): Promise<RippleJobFull | null> {\n const data = await this.fetchRippleGQL<{\n getJob: RippleJobFull;\n }>(RippleMain.GET_JOB_BY_SLUG, { slug });\n return data?.getJob ?? null;\n }\n\n /**\n * find the latest job for a given laneId, optionally filtered by status phase.\n */\n async findLatestJobForLane(laneId: string, phase?: string): Promise<RippleJob | null> {\n const filters: { lanes: string[]; status?: string } = { lanes: [laneId] };\n if (phase) {\n filters.status = phase;\n }\n const jobs = await this.listJobs({ filters, limit: 1 });\n return jobs[0] ?? null;\n }\n\n /**\n * detect the workspace owner from the workspace defaultScope.\n */\n getDefaultOwner(): string | undefined {\n const defaultScope = this.workspace?.defaultScope;\n if (!defaultScope?.includes('.')) return undefined;\n return defaultScope.split('.')[0];\n }\n\n getJobUrl(job: RippleJob): string {\n // the bit.cloud UI resolves the /ripple-ci/job/<id-or-slug> segment by slug;\n // job.id (a uuid) returns \"No CI job found\", so prefer slug when present.\n const segment = job.slug || job.id;\n if (job.laneId) {\n // laneId format: \"scope/lane-name\", e.g. \"att-bit.duc/my-lane\"\n const [scope, ...laneParts] = job.laneId.split('/');\n const laneName = laneParts.join('/');\n if (scope && laneName) {\n return `https://${getCloudDomain()}/${scope.split('.').join('/')}/~lane/${laneName}/~ripple-ci/job/${segment}`;\n }\n }\n return `https://${getCloudDomain()}/ripple-ci/job/${segment}`;\n }\n\n static async provider([cli, cloud, loggerAspect, workspace]: [CLIMain, CloudMain, LoggerMain, Workspace]) {\n const logger = loggerAspect.createLogger(RippleAspect.id);\n const ripple = new RippleMain(cloud, logger, workspace);\n\n const rippleCmd = new RippleCmd();\n rippleCmd.commands = [\n new RippleListCmd(ripple),\n new RippleLogCmd(ripple),\n new RippleErrorsCmd(ripple),\n new RippleRetryCmd(ripple),\n new RippleStopCmd(ripple),\n ];\n cli.register(rippleCmd);\n\n return ripple;\n }\n}\n\nRippleAspect.addRuntime(RippleMain);\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teambit/ripple",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.46",
|
|
4
4
|
"homepage": "https://bit.cloud/teambit/cloud/ripple",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"componentId": {
|
|
7
7
|
"scope": "teambit.cloud",
|
|
8
8
|
"name": "ripple",
|
|
9
|
-
"version": "0.0.
|
|
9
|
+
"version": "0.0.46"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"chalk": "4.1.2",
|
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
"@teambit/cli": "0.0.1320",
|
|
17
17
|
"@teambit/legacy.constants": "0.0.26",
|
|
18
18
|
"@teambit/logger": "0.0.1413",
|
|
19
|
-
"@teambit/
|
|
20
|
-
"@teambit/
|
|
19
|
+
"@teambit/export": "1.0.968",
|
|
20
|
+
"@teambit/cloud": "0.0.1260",
|
|
21
|
+
"@teambit/workspace": "1.0.968"
|
|
21
22
|
},
|
|
22
23
|
"devDependencies": {
|
|
23
24
|
"@types/cli-table": "^0.3.0",
|
|
File without changes
|