claude-task-worker 0.122.0 → 0.124.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-HFU27QHT.js +579 -0
- package/dist/{chunk-NS334FXZ.js → chunk-XJCZF5SA.js} +70 -382
- package/dist/{dispatcher-JKUMXTJ2.js → dispatcher-CIAW3Z6X.js} +1 -1
- package/dist/gh.d.ts +3 -0
- package/dist/{herdr-runner-33D6C2KI.js → herdr-runner-TNX2W4G6.js} +1 -1
- package/dist/index.js +18 -17
- package/dist/lib.js +6 -5
- package/dist/{table-DWVMNDS3.js → table-OOKBQVW5.js} +7 -1
- package/dist/table.d.ts +7 -0
- package/dist/user-config.d.ts +1 -0
- package/package.json +1 -1
- package/dist/chunk-N42YU3GJ.js +0 -184
package/dist/gh.d.ts
CHANGED
|
@@ -57,6 +57,9 @@ export interface ClosingPrRef {
|
|
|
57
57
|
body?: string;
|
|
58
58
|
}
|
|
59
59
|
export declare function listPrsClosingIssue(issueNumber: number): Promise<ClosingPrRef[]>;
|
|
60
|
+
export declare function listOpenPrsByBase(base: string): Promise<(ClosingPrRef & {
|
|
61
|
+
body: string;
|
|
62
|
+
})[]>;
|
|
60
63
|
export declare function getPrDetail(prNumber: number): Promise<(ClosingPrRef & {
|
|
61
64
|
body: string;
|
|
62
65
|
}) | null>;
|
package/dist/index.js
CHANGED
|
@@ -7,13 +7,9 @@ import {
|
|
|
7
7
|
INHERIT_CONFIG_KEY,
|
|
8
8
|
LOCAL_CONFIG_PATH,
|
|
9
9
|
SCHEDULED_WORKER_NAMES,
|
|
10
|
-
UserConfigError,
|
|
11
10
|
addAssignee,
|
|
12
11
|
addLabel,
|
|
13
|
-
assertCloudCompatibleCommand,
|
|
14
|
-
assertProjectCompatibleCommand,
|
|
15
12
|
bodyMentionsIssue,
|
|
16
|
-
buildForwardedCommand,
|
|
17
13
|
buildScriptCommand,
|
|
18
14
|
buildTokenLimitText,
|
|
19
15
|
checkCloudConfig,
|
|
@@ -35,7 +31,6 @@ import {
|
|
|
35
31
|
findPrNumberByHeadRef,
|
|
36
32
|
findPrStateByHeadRef,
|
|
37
33
|
getCurrentUser,
|
|
38
|
-
getInheritConfigPath,
|
|
39
34
|
getIssueBody,
|
|
40
35
|
getIssueState,
|
|
41
36
|
getIssueSubIssuesSummary,
|
|
@@ -43,37 +38,43 @@ import {
|
|
|
43
38
|
getPrDetail,
|
|
44
39
|
getPrMergeable,
|
|
45
40
|
getRepoInfo,
|
|
46
|
-
getRunMode,
|
|
47
41
|
getUiDesignConfig,
|
|
48
42
|
getWorktreePath,
|
|
49
|
-
hasCloudFlag,
|
|
50
43
|
hasLabel,
|
|
51
|
-
hasProjectFilter,
|
|
52
44
|
isShuttingDown,
|
|
53
45
|
isWorkerDefinition,
|
|
54
46
|
isWorkerEnabled,
|
|
55
47
|
linkClosingPr,
|
|
48
|
+
listOpenPrsByBase,
|
|
56
49
|
listPrsClosingIssue,
|
|
57
50
|
listPrsCrossReferencingIssue,
|
|
58
51
|
loadConfig,
|
|
59
|
-
loadUserConfig,
|
|
60
52
|
parseClosingIssueNumbers,
|
|
61
|
-
parseProjectFilters,
|
|
62
53
|
partitionEnabledWorkers,
|
|
63
54
|
removeStaleWorktrees,
|
|
64
55
|
renderTable,
|
|
65
56
|
resolveInheritConfigSource,
|
|
66
|
-
resolveTargetProjects,
|
|
67
57
|
resolveWorkerFilePath,
|
|
68
58
|
send,
|
|
69
59
|
setShuttingDown,
|
|
70
60
|
shutdown,
|
|
71
61
|
waitForAllProcesses,
|
|
72
62
|
writeLastRun
|
|
73
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-XJCZF5SA.js";
|
|
74
64
|
import {
|
|
75
|
-
|
|
76
|
-
|
|
65
|
+
UserConfigError,
|
|
66
|
+
assertCloudCompatibleCommand,
|
|
67
|
+
assertProjectCompatibleCommand,
|
|
68
|
+
buildForwardedCommand,
|
|
69
|
+
captureConsole,
|
|
70
|
+
getInheritConfigPath,
|
|
71
|
+
getRunMode,
|
|
72
|
+
hasCloudFlag,
|
|
73
|
+
hasProjectFilter,
|
|
74
|
+
loadUserConfig,
|
|
75
|
+
parseProjectFilters,
|
|
76
|
+
resolveTargetProjects
|
|
77
|
+
} from "./chunk-HFU27QHT.js";
|
|
77
78
|
import {
|
|
78
79
|
npmInstallGlobalLatest,
|
|
79
80
|
runCommand
|
|
@@ -422,8 +423,8 @@ function designPrLabelingFailedComment(issueNumber, prNumber, error, yolo = fals
|
|
|
422
423
|
}
|
|
423
424
|
async function adoptCloudDesignPr(issueNumber, branch, ctx) {
|
|
424
425
|
const { owner, name } = await getRepoInfo();
|
|
425
|
-
const candidates = (await
|
|
426
|
-
(c) => c.
|
|
426
|
+
const candidates = (await listOpenPrsByBase(ctx.baseBranch)).filter(
|
|
427
|
+
(c) => c.headRepo === `${owner}/${name}` && bodyMentionsIssue(c.body, issueNumber)
|
|
427
428
|
);
|
|
428
429
|
const prNumber = selectOwnedClosingPr(candidates, {
|
|
429
430
|
cloud: true,
|
|
@@ -1778,7 +1779,7 @@ if (hasProjectFilter()) {
|
|
|
1778
1779
|
let sessions = /* @__PURE__ */ new Map();
|
|
1779
1780
|
let monitorHandle;
|
|
1780
1781
|
const herdr = await import("./herdr-NDLUM6JF.js");
|
|
1781
|
-
const dispatcher = await import("./dispatcher-
|
|
1782
|
+
const dispatcher = await import("./dispatcher-CIAW3Z6X.js");
|
|
1782
1783
|
captureConsole();
|
|
1783
1784
|
const shutdownController = dispatcher.createDispatcherShutdownHandler(
|
|
1784
1785
|
(options) => dispatcher.shutdownDispatcher(sessions, monitorHandle, options)
|
package/dist/lib.js
CHANGED
|
@@ -23,18 +23,15 @@ import {
|
|
|
23
23
|
getIssueState,
|
|
24
24
|
getIssueSubIssuesSummary,
|
|
25
25
|
getLastRunAt,
|
|
26
|
-
getPermissionMode,
|
|
27
26
|
getPrDetail,
|
|
28
27
|
getPrMergeable,
|
|
29
28
|
getRemoteEnvId,
|
|
30
29
|
getRepoInfo,
|
|
31
|
-
getRunMode,
|
|
32
30
|
getUiDesignConfig,
|
|
33
31
|
getWorkerConfig,
|
|
34
32
|
getWorktreePath,
|
|
35
33
|
hasLabel,
|
|
36
34
|
hasOpenBlockers,
|
|
37
|
-
isAdvisorEnabled,
|
|
38
35
|
isCloudWorker,
|
|
39
36
|
isRunning,
|
|
40
37
|
isShuttingDown,
|
|
@@ -58,8 +55,12 @@ import {
|
|
|
58
55
|
removeWorktreeByBranch,
|
|
59
56
|
run,
|
|
60
57
|
syncDefaultBranch
|
|
61
|
-
} from "./chunk-
|
|
62
|
-
import
|
|
58
|
+
} from "./chunk-XJCZF5SA.js";
|
|
59
|
+
import {
|
|
60
|
+
getPermissionMode,
|
|
61
|
+
getRunMode,
|
|
62
|
+
isAdvisorEnabled
|
|
63
|
+
} from "./chunk-HFU27QHT.js";
|
|
63
64
|
export {
|
|
64
65
|
CLOUD_DONE_LABEL,
|
|
65
66
|
addAssignee,
|
|
@@ -6,14 +6,17 @@ import {
|
|
|
6
6
|
buildLogTableLines,
|
|
7
7
|
buildTaskTableLines,
|
|
8
8
|
captureConsole,
|
|
9
|
+
formatLogFileLine,
|
|
9
10
|
getDisplayWidth,
|
|
11
|
+
logFilePath,
|
|
10
12
|
logLines,
|
|
11
13
|
padToWidth,
|
|
12
14
|
pushLogLine,
|
|
13
15
|
selectRecentTasks,
|
|
14
16
|
truncateToWidth,
|
|
17
|
+
wrapToWidth,
|
|
15
18
|
writeScreen
|
|
16
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-HFU27QHT.js";
|
|
17
20
|
export {
|
|
18
21
|
CLOUD_WORKTREE_LABEL,
|
|
19
22
|
CONTROL_CHARS,
|
|
@@ -22,11 +25,14 @@ export {
|
|
|
22
25
|
buildLogTableLines,
|
|
23
26
|
buildTaskTableLines,
|
|
24
27
|
captureConsole,
|
|
28
|
+
formatLogFileLine,
|
|
25
29
|
getDisplayWidth,
|
|
30
|
+
logFilePath,
|
|
26
31
|
logLines,
|
|
27
32
|
padToWidth,
|
|
28
33
|
pushLogLine,
|
|
29
34
|
selectRecentTasks,
|
|
30
35
|
truncateToWidth,
|
|
36
|
+
wrapToWidth,
|
|
31
37
|
writeScreen
|
|
32
38
|
};
|
package/dist/table.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export declare function getDisplayWidth(str: string): number;
|
|
2
2
|
export declare function truncateToWidth(str: string, maxWidth: number): string;
|
|
3
|
+
/** 表示幅 maxWidth ごとに折り返す。全角は幅2として数える。 */
|
|
4
|
+
export declare function wrapToWidth(str: string, maxWidth: number): string[];
|
|
3
5
|
export declare function padToWidth(str: string, targetWidth: number): string;
|
|
4
6
|
/**
|
|
5
7
|
* クラウド実行(`--cloud`)のタスクは worktree を作らないため、Worktree 列にローカルの
|
|
@@ -37,6 +39,8 @@ export interface LogTableEntry {
|
|
|
37
39
|
stream: string;
|
|
38
40
|
text: string;
|
|
39
41
|
time: Date;
|
|
42
|
+
/** ログファイルに残す出力元のパス(タスクは worktree、ワーカー自身は cwd)。 */
|
|
43
|
+
path?: string;
|
|
40
44
|
}
|
|
41
45
|
/**
|
|
42
46
|
* 実行中タスクのログとワーカー自身の console 出力を混ぜたローリングバッファ。
|
|
@@ -44,6 +48,8 @@ export interface LogTableEntry {
|
|
|
44
48
|
*/
|
|
45
49
|
export declare const logLines: LogTableEntry[];
|
|
46
50
|
export declare function pushLogLine(entry: LogTableEntry): void;
|
|
51
|
+
export declare function logFilePath(time: Date): string;
|
|
52
|
+
export declare function formatLogFileLine(entry: LogTableEntry): string;
|
|
47
53
|
/** 画面全体をテーブルで差し替える。captureConsole() の影響を受けない。 */
|
|
48
54
|
export declare function writeScreen(lines: string[]): void;
|
|
49
55
|
export declare function captureConsole(): void;
|
|
@@ -51,5 +57,6 @@ export declare const CONTROL_CHARS: RegExp;
|
|
|
51
57
|
/**
|
|
52
58
|
* 実行中タスクの標準出力/エラー出力のログをテーブルに組み立てる純粋関数。
|
|
53
59
|
* 新しい行ほど上に来るよう時刻の降順で並べる(テーブル下端はステータス表示に隠れやすいため)。
|
|
60
|
+
* 長い行は切り詰めずに折り返す(エラーメッセージを全文読めるようにするため)。
|
|
54
61
|
*/
|
|
55
62
|
export declare function buildLogTableLines(entries: LogTableEntry[]): string[];
|
package/dist/user-config.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export interface ResolvedProject {
|
|
|
18
18
|
export declare class UserConfigError extends Error {
|
|
19
19
|
constructor(message: string);
|
|
20
20
|
}
|
|
21
|
+
export declare function getConfigDir(): string;
|
|
21
22
|
export declare function getUserConfigPath(): string;
|
|
22
23
|
export declare function loadUserConfig(): UserConfig;
|
|
23
24
|
export declare function getRunMode(): RunMode;
|
package/package.json
CHANGED
package/dist/chunk-N42YU3GJ.js
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
// src/table.ts
|
|
2
|
-
import { format } from "node:util";
|
|
3
|
-
function getDisplayWidth(str) {
|
|
4
|
-
let width = 0;
|
|
5
|
-
for (const char of str.replace(CONTROL_CHARS, "")) {
|
|
6
|
-
const code = char.codePointAt(0);
|
|
7
|
-
if (code >= 4352 && code <= 4447 || code >= 11904 && code <= 12350 || code >= 12352 && code <= 13247 || code >= 13312 && code <= 19903 || code >= 19968 && code <= 42191 || code >= 44032 && code <= 55215 || code >= 63744 && code <= 64255 || code >= 65072 && code <= 65135 || code >= 65281 && code <= 65376 || code >= 65504 && code <= 65510 || code >= 131072 && code <= 196605 || code >= 196608 && code <= 262141) {
|
|
8
|
-
width += 2;
|
|
9
|
-
} else {
|
|
10
|
-
width += 1;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
return width;
|
|
14
|
-
}
|
|
15
|
-
function truncateToWidth(str, maxWidth) {
|
|
16
|
-
let width = 0;
|
|
17
|
-
let i = 0;
|
|
18
|
-
const chars = [...str];
|
|
19
|
-
while (i < chars.length) {
|
|
20
|
-
const charWidth = getDisplayWidth(chars[i]);
|
|
21
|
-
if (width + charWidth > maxWidth - 3) {
|
|
22
|
-
return chars.slice(0, i).join("") + "...";
|
|
23
|
-
}
|
|
24
|
-
width += charWidth;
|
|
25
|
-
i++;
|
|
26
|
-
}
|
|
27
|
-
return str;
|
|
28
|
-
}
|
|
29
|
-
function padToWidth(str, targetWidth) {
|
|
30
|
-
const currentWidth = getDisplayWidth(str);
|
|
31
|
-
const padding = targetWidth - currentWidth;
|
|
32
|
-
return padding > 0 ? str + " ".repeat(padding) : str;
|
|
33
|
-
}
|
|
34
|
-
var CLOUD_WORKTREE_LABEL = "\x1B[36m\u2601 running in cloud\x1B[0m";
|
|
35
|
-
function formatDuration(start, end = /* @__PURE__ */ new Date()) {
|
|
36
|
-
const diffMs = end.getTime() - start.getTime();
|
|
37
|
-
const totalSeconds = Math.floor(diffMs / 1e3);
|
|
38
|
-
const minutes = Math.floor(totalSeconds / 60);
|
|
39
|
-
const seconds = totalSeconds % 60;
|
|
40
|
-
return `${minutes}m ${String(seconds).padStart(2, "0")}s`;
|
|
41
|
-
}
|
|
42
|
-
function formatTime(date) {
|
|
43
|
-
const h = String(date.getHours()).padStart(2, "0");
|
|
44
|
-
const m = String(date.getMinutes()).padStart(2, "0");
|
|
45
|
-
const s = String(date.getSeconds()).padStart(2, "0");
|
|
46
|
-
return `${h}:${m}:${s}`;
|
|
47
|
-
}
|
|
48
|
-
function renderBoxTable(headers, groups) {
|
|
49
|
-
const allRows = groups.flat();
|
|
50
|
-
const widths = headers.map(
|
|
51
|
-
(h, i) => Math.max(1, getDisplayWidth(h), ...allRows.map((r) => getDisplayWidth(r[i] ?? "")))
|
|
52
|
-
);
|
|
53
|
-
const border = (l, m, r) => `${l}${widths.map((w) => "\u2500".repeat(w + 2)).join(m)}${r}`;
|
|
54
|
-
const row = (cells) => `\u2502 ${cells.map((c, i) => padToWidth(c ?? "", widths[i])).join(" \u2502 ")} \u2502`;
|
|
55
|
-
const lines = [];
|
|
56
|
-
lines.push(border("\u250C", "\u252C", "\u2510"));
|
|
57
|
-
lines.push(row(headers));
|
|
58
|
-
lines.push(border("\u251C", "\u253C", "\u2524"));
|
|
59
|
-
const nonEmpty = groups.filter((g) => g.length > 0);
|
|
60
|
-
nonEmpty.forEach((group, gi) => {
|
|
61
|
-
if (gi > 0) lines.push(border("\u251C", "\u253C", "\u2524"));
|
|
62
|
-
for (const r of group) lines.push(row(r));
|
|
63
|
-
});
|
|
64
|
-
lines.push(border("\u2514", "\u2534", "\u2518"));
|
|
65
|
-
return lines;
|
|
66
|
-
}
|
|
67
|
-
var TASK_DISPLAY_LIMIT = 20;
|
|
68
|
-
var LOG_DISPLAY_LIMIT = 20;
|
|
69
|
-
function taskRecency(t) {
|
|
70
|
-
return (t.finishedAt ?? t.startedAt).getTime();
|
|
71
|
-
}
|
|
72
|
-
function selectRecentTasks(entries, limit = TASK_DISPLAY_LIMIT) {
|
|
73
|
-
const byId = /* @__PURE__ */ new Map();
|
|
74
|
-
for (const e of entries) byId.set(e.id, e);
|
|
75
|
-
const unique = [...byId.values()];
|
|
76
|
-
const running = unique.filter((t) => t.status === "running").sort((a, b) => taskRecency(b) - taskRecency(a));
|
|
77
|
-
const finished = unique.filter((t) => t.status !== "running").sort((a, b) => taskRecency(b) - taskRecency(a));
|
|
78
|
-
return [...running, ...finished].slice(0, limit);
|
|
79
|
-
}
|
|
80
|
-
function buildTaskTableLines(entries, now = /* @__PURE__ */ new Date()) {
|
|
81
|
-
if (entries.length === 0) return [];
|
|
82
|
-
const runningTasks = entries.filter((t) => t.status === "running");
|
|
83
|
-
const finishedTasks = entries.filter((t) => t.status !== "running");
|
|
84
|
-
const maxTitleWidth = 40;
|
|
85
|
-
const maxPathWidth = 40;
|
|
86
|
-
const truncTitle = (s) => getDisplayWidth(s) > maxTitleWidth ? truncateToWidth(s, maxTitleWidth) : s;
|
|
87
|
-
const truncPath = (p) => p ? getDisplayWidth(p) > maxPathWidth ? truncateToWidth(p, maxPathWidth) : p : "";
|
|
88
|
-
const hasPath = entries.some((t) => truncPath(t.path) !== "");
|
|
89
|
-
const runningRows = runningTasks.map(
|
|
90
|
-
(t) => taskRow(
|
|
91
|
-
t,
|
|
92
|
-
truncTitle(t.title),
|
|
93
|
-
truncPath(t.path),
|
|
94
|
-
hasPath,
|
|
95
|
-
t.agentStatus ? `${t.status}:${t.agentStatus}` : t.status,
|
|
96
|
-
formatTime(t.startedAt),
|
|
97
|
-
formatDuration(t.startedAt, now)
|
|
98
|
-
)
|
|
99
|
-
);
|
|
100
|
-
const finishedRows = finishedTasks.map(
|
|
101
|
-
(t) => taskRow(
|
|
102
|
-
t,
|
|
103
|
-
truncTitle(t.title),
|
|
104
|
-
truncPath(t.path),
|
|
105
|
-
hasPath,
|
|
106
|
-
t.status,
|
|
107
|
-
formatTime(t.finishedAt ?? t.startedAt),
|
|
108
|
-
formatDuration(t.startedAt, t.finishedAt ?? now)
|
|
109
|
-
)
|
|
110
|
-
);
|
|
111
|
-
const headers = hasPath ? ["#", "Title", "Worker", "Worktree", "Status", "Time", "Duration"] : ["#", "Title", "Worker", "Status", "Time", "Duration"];
|
|
112
|
-
return renderBoxTable(headers, [runningRows, finishedRows]);
|
|
113
|
-
}
|
|
114
|
-
function taskRow(t, title, path, hasPath, status, time, duration) {
|
|
115
|
-
return hasPath ? [`#${t.id}`, title, t.workerName, path, status, time, duration] : [`#${t.id}`, title, t.workerName, status, time, duration];
|
|
116
|
-
}
|
|
117
|
-
var logLines = [];
|
|
118
|
-
function pushLogLine(entry) {
|
|
119
|
-
if (entry.text.trim().length === 0) return;
|
|
120
|
-
logLines.push(entry);
|
|
121
|
-
if (logLines.length > LOG_DISPLAY_LIMIT) {
|
|
122
|
-
logLines.splice(0, logLines.length - LOG_DISPLAY_LIMIT);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
var rawLog = console.log.bind(console);
|
|
126
|
-
var rawClear = console.clear.bind(console);
|
|
127
|
-
function writeScreen(lines) {
|
|
128
|
-
rawClear();
|
|
129
|
-
rawLog(lines.join("\n"));
|
|
130
|
-
}
|
|
131
|
-
var consoleCaptured = false;
|
|
132
|
-
function captureConsole() {
|
|
133
|
-
if (consoleCaptured) return;
|
|
134
|
-
consoleCaptured = true;
|
|
135
|
-
process.on("exit", () => {
|
|
136
|
-
if (logLines.length > 0) rawLog(buildLogTableLines(logLines).join("\n"));
|
|
137
|
-
});
|
|
138
|
-
const streams = { log: "stdout", info: "stdout", warn: "stderr", error: "stderr" };
|
|
139
|
-
for (const [method, stream] of Object.entries(streams)) {
|
|
140
|
-
console[method] = (...args) => {
|
|
141
|
-
for (const line of format(...args).split("\n")) {
|
|
142
|
-
pushLogLine({ stream, text: line, time: /* @__PURE__ */ new Date() });
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
var CONTROL_CHARS = (
|
|
148
|
-
// eslint-disable-next-line no-control-regex -- ANSI/制御文字を意図的に対象にする
|
|
149
|
-
/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b\[[0-9;?]*[ -/]*[@-~]|[\x00-\x08\x0b-\x1f\x7f]/g
|
|
150
|
-
);
|
|
151
|
-
function sanitizeLogText(text) {
|
|
152
|
-
return text.replace(CONTROL_CHARS, " ").replace(/\t/g, " ");
|
|
153
|
-
}
|
|
154
|
-
function buildLogTableLines(entries) {
|
|
155
|
-
if (entries.length === 0) return [];
|
|
156
|
-
const maxTextWidth = 100;
|
|
157
|
-
const rows = [...entries].reverse().map((e) => {
|
|
158
|
-
const text = sanitizeLogText(e.text);
|
|
159
|
-
return [
|
|
160
|
-
formatTime(e.time),
|
|
161
|
-
e.id === void 0 ? "-" : `#${e.id}`,
|
|
162
|
-
e.stream,
|
|
163
|
-
getDisplayWidth(text) > maxTextWidth ? truncateToWidth(text, maxTextWidth) : text
|
|
164
|
-
];
|
|
165
|
-
});
|
|
166
|
-
return renderBoxTable(["Time", "#", "Stream", "Log"], [rows]);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export {
|
|
170
|
-
getDisplayWidth,
|
|
171
|
-
truncateToWidth,
|
|
172
|
-
padToWidth,
|
|
173
|
-
CLOUD_WORKTREE_LABEL,
|
|
174
|
-
TASK_DISPLAY_LIMIT,
|
|
175
|
-
LOG_DISPLAY_LIMIT,
|
|
176
|
-
selectRecentTasks,
|
|
177
|
-
buildTaskTableLines,
|
|
178
|
-
logLines,
|
|
179
|
-
pushLogLine,
|
|
180
|
-
writeScreen,
|
|
181
|
-
captureConsole,
|
|
182
|
-
CONTROL_CHARS,
|
|
183
|
-
buildLogTableLines
|
|
184
|
-
};
|