@clipboard-health/groundcrew 4.0.1 → 4.0.2
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/README.md +51 -72
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -25
- package/dist/commands/doctor.d.ts +1 -6
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +24 -37
- package/dist/commands/interruptWorkspace.js +1 -1
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +178 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/lib/util.d.ts +3 -2
- package/dist/lib/util.d.ts.map +1 -1
- package/dist/lib/util.js +18 -2
- package/package.json +1 -1
- package/dist/commands/ticketCheck.d.ts +0 -22
- package/dist/commands/ticketCheck.d.ts.map +0 -1
- package/dist/commands/ticketCheck.js +0 -23
- package/dist/commands/ticketDoctor.d.ts +0 -223
- package/dist/commands/ticketDoctor.d.ts.map +0 -1
- package/dist/commands/ticketDoctor.js +0 -1134
package/dist/lib/util.js
CHANGED
|
@@ -35,9 +35,19 @@ export function writeError(message) {
|
|
|
35
35
|
// so tests don't write to the host filesystem; the CLI arms it after
|
|
36
36
|
// loadConfig() resolves `logging.file`.
|
|
37
37
|
let logFilePath;
|
|
38
|
+
let suppressedLogDepth = 0;
|
|
38
39
|
export function setLogFile(path) {
|
|
39
40
|
logFilePath = path;
|
|
40
41
|
}
|
|
42
|
+
export async function withLogOutputSuppressed(operation) {
|
|
43
|
+
suppressedLogDepth += 1;
|
|
44
|
+
try {
|
|
45
|
+
return await operation();
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
suppressedLogDepth -= 1;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
41
51
|
function appendLogLine(line) {
|
|
42
52
|
if (logFilePath === undefined) {
|
|
43
53
|
return;
|
|
@@ -55,6 +65,9 @@ function appendLogLine(line) {
|
|
|
55
65
|
}
|
|
56
66
|
}
|
|
57
67
|
export function log(message) {
|
|
68
|
+
if (suppressedLogDepth > 0) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
58
71
|
const timestamp = new Date().toLocaleTimeString();
|
|
59
72
|
const line = `[${timestamp}] ${message}`;
|
|
60
73
|
writeOutput(line);
|
|
@@ -68,6 +81,9 @@ function formatLogEventFieldValue(value) {
|
|
|
68
81
|
return JSON.stringify(raw);
|
|
69
82
|
}
|
|
70
83
|
export function logEvent(event, fields) {
|
|
84
|
+
if (suppressedLogDepth > 0) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
71
87
|
const parts = [`event=${formatLogEventFieldValue(event)}`];
|
|
72
88
|
for (const [key, value] of Object.entries(fields)) {
|
|
73
89
|
if (value === undefined) {
|
|
@@ -103,8 +119,8 @@ export function getLinearClient() {
|
|
|
103
119
|
/**
|
|
104
120
|
* Returns a zero-arg getter that lazily constructs (and caches) a Linear
|
|
105
121
|
* client on first call. Used by CLI entry points that may not need the
|
|
106
|
-
* client at all
|
|
107
|
-
*
|
|
122
|
+
* client at all, so we avoid blowing up on a missing API key when no Linear
|
|
123
|
+
* call is actually made. The factory is taken as a
|
|
108
124
|
* parameter (rather than calling `getLinearClient` directly) so callers can
|
|
109
125
|
* pass their own module-level import of `getLinearClient` — that binding
|
|
110
126
|
* respects `vi.mock` intercepts, whereas an intra-module reference would
|
package/package.json
CHANGED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface TicketCheck {
|
|
2
|
-
name: string;
|
|
3
|
-
status: "ok" | "fail" | "skipped";
|
|
4
|
-
detail?: string;
|
|
5
|
-
failureSummary?: string;
|
|
6
|
-
}
|
|
7
|
-
export interface Section {
|
|
8
|
-
name: string;
|
|
9
|
-
checks: TicketCheck[];
|
|
10
|
-
/** When present and `checks` is empty, the section renders as `(skipped — <skipReason>)`. */
|
|
11
|
-
skipReason?: string;
|
|
12
|
-
}
|
|
13
|
-
interface RenderInput {
|
|
14
|
-
command: string;
|
|
15
|
-
argument: string;
|
|
16
|
-
title?: string;
|
|
17
|
-
sections: Section[];
|
|
18
|
-
verdict: string;
|
|
19
|
-
}
|
|
20
|
-
export declare function renderTicketCheckResult(input: RenderInput): string[];
|
|
21
|
-
export {};
|
|
22
|
-
//# sourceMappingURL=ticketCheck.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ticketCheck.d.ts","sourceRoot":"","sources":["../../src/commands/ticketCheck.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAqBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAMpE"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
const STATUS_TAG = {
|
|
2
|
-
ok: "[ok]",
|
|
3
|
-
fail: "[--]",
|
|
4
|
-
skipped: "[? ]",
|
|
5
|
-
};
|
|
6
|
-
function formatCheck(check) {
|
|
7
|
-
const tag = STATUS_TAG[check.status];
|
|
8
|
-
const detail = check.detail === undefined ? "" : ` (${check.detail})`;
|
|
9
|
-
return ` ${tag} ${check.name}${detail}`;
|
|
10
|
-
}
|
|
11
|
-
function sectionLines(section) {
|
|
12
|
-
if (section.checks.length === 0 && section.skipReason !== undefined) {
|
|
13
|
-
return [section.name, ` (skipped — ${section.skipReason})`];
|
|
14
|
-
}
|
|
15
|
-
return [section.name, ...section.checks.map(formatCheck)];
|
|
16
|
-
}
|
|
17
|
-
export function renderTicketCheckResult(input) {
|
|
18
|
-
const titlePart = input.title === undefined ? "" : ` (${input.title})`;
|
|
19
|
-
const header = `groundcrew ${input.command} ${input.argument}${titlePart}`;
|
|
20
|
-
const bar = "─".repeat(header.length);
|
|
21
|
-
const body = input.sections.flatMap((section) => ["", ...sectionLines(section)]);
|
|
22
|
-
return [header, bar, ...body, "", input.verdict];
|
|
23
|
-
}
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
import { type Blocker, type RawLinearIssue } from "../lib/boardSource.ts";
|
|
2
|
-
import { type ResolvedConfig } from "../lib/config.ts";
|
|
3
|
-
import { type RunState } from "../lib/runState.ts";
|
|
4
|
-
import { type UsageByModel } from "../lib/usage.ts";
|
|
5
|
-
import { type WorkspaceAccessHint, type WorkspaceProbe } from "../lib/workspaces.ts";
|
|
6
|
-
import { type WorktreeDirtiness, type WorktreeEntry } from "../lib/worktrees.ts";
|
|
7
|
-
import { type TicketCheck } from "./ticketCheck.ts";
|
|
8
|
-
export type TicketDoctorVerdict = {
|
|
9
|
-
kind: "pr-open";
|
|
10
|
-
number: number;
|
|
11
|
-
url: string;
|
|
12
|
-
} | {
|
|
13
|
-
kind: "pr-merged";
|
|
14
|
-
number: number;
|
|
15
|
-
url: string;
|
|
16
|
-
} | {
|
|
17
|
-
kind: "interrupted";
|
|
18
|
-
reason: string;
|
|
19
|
-
nextStep: string;
|
|
20
|
-
} | {
|
|
21
|
-
kind: "failed-launch";
|
|
22
|
-
reason: string;
|
|
23
|
-
nextStep: string;
|
|
24
|
-
} | {
|
|
25
|
-
kind: "in-flight";
|
|
26
|
-
reason: string;
|
|
27
|
-
} | {
|
|
28
|
-
kind: "recoverable";
|
|
29
|
-
reason: string;
|
|
30
|
-
nextStep: string;
|
|
31
|
-
} | {
|
|
32
|
-
kind: "would-dispatch";
|
|
33
|
-
} | {
|
|
34
|
-
kind: "ineligible";
|
|
35
|
-
reason: string;
|
|
36
|
-
} | {
|
|
37
|
-
kind: "unresolvable";
|
|
38
|
-
reason: string;
|
|
39
|
-
} | {
|
|
40
|
-
kind: "lost";
|
|
41
|
-
reason: string;
|
|
42
|
-
};
|
|
43
|
-
export type LinearStatusProbe = {
|
|
44
|
-
kind: "terminal";
|
|
45
|
-
stateName: string;
|
|
46
|
-
} | {
|
|
47
|
-
kind: "non-terminal";
|
|
48
|
-
stateName: string;
|
|
49
|
-
} | {
|
|
50
|
-
kind: "skipped";
|
|
51
|
-
} | {
|
|
52
|
-
kind: "unresolvable";
|
|
53
|
-
reason: string;
|
|
54
|
-
};
|
|
55
|
-
export type WorktreeProbe = {
|
|
56
|
-
kind: "present-clean";
|
|
57
|
-
} | {
|
|
58
|
-
kind: "present-dirty";
|
|
59
|
-
modified: number;
|
|
60
|
-
untracked: number;
|
|
61
|
-
} | {
|
|
62
|
-
kind: "present-unknown-dirtiness";
|
|
63
|
-
reason: string;
|
|
64
|
-
} | {
|
|
65
|
-
kind: "absent";
|
|
66
|
-
};
|
|
67
|
-
export type LocalBranchProbe = {
|
|
68
|
-
kind: "present";
|
|
69
|
-
ahead: number;
|
|
70
|
-
behind: number;
|
|
71
|
-
defaultBranch?: string;
|
|
72
|
-
} | {
|
|
73
|
-
kind: "absent";
|
|
74
|
-
} | {
|
|
75
|
-
kind: "unknown";
|
|
76
|
-
reason: string;
|
|
77
|
-
};
|
|
78
|
-
export type RemoteBranchProbe = {
|
|
79
|
-
kind: "present";
|
|
80
|
-
} | {
|
|
81
|
-
kind: "absent";
|
|
82
|
-
} | {
|
|
83
|
-
kind: "unknown";
|
|
84
|
-
reason: string;
|
|
85
|
-
};
|
|
86
|
-
export type PullRequestProbe = {
|
|
87
|
-
kind: "open";
|
|
88
|
-
number: number;
|
|
89
|
-
url: string;
|
|
90
|
-
} | {
|
|
91
|
-
kind: "merged";
|
|
92
|
-
number: number;
|
|
93
|
-
url: string;
|
|
94
|
-
} | {
|
|
95
|
-
kind: "absent";
|
|
96
|
-
} | {
|
|
97
|
-
kind: "gh-missing";
|
|
98
|
-
} | {
|
|
99
|
-
kind: "unknown";
|
|
100
|
-
reason: string;
|
|
101
|
-
};
|
|
102
|
-
export interface DecideVerdictInput {
|
|
103
|
-
linear: LinearStatusProbe;
|
|
104
|
-
worktree: WorktreeProbe;
|
|
105
|
-
localBranch: LocalBranchProbe;
|
|
106
|
-
remoteBranch: RemoteBranchProbe;
|
|
107
|
-
pullRequest: PullRequestProbe;
|
|
108
|
-
branch: string;
|
|
109
|
-
worktreeDir: string | undefined;
|
|
110
|
-
workspaceName: string | undefined;
|
|
111
|
-
runState: RunState | undefined;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Returns a post-dispatch verdict if the probe bundle matches one of the
|
|
115
|
-
* "ticket has moved past dispatch" cases. Returns `undefined` otherwise,
|
|
116
|
-
* signalling that the caller should fall through to the pre-dispatch path.
|
|
117
|
-
*
|
|
118
|
-
* Precedence: PR verdicts always win. Failed launches report before ordinary
|
|
119
|
-
* local recovery. Interrupted runs report concrete recoverable git work first
|
|
120
|
-
* when it exists, then fall back to `interrupted`. Ordinary post-dispatch cases
|
|
121
|
-
* report in-flight before recoverable. Inside `recoverable`, dirty worktree
|
|
122
|
-
* beats clean-with-un-pushed-local beats remote-only beats stranded local.
|
|
123
|
-
*/
|
|
124
|
-
export declare function decidePostDispatchVerdict(input: DecideVerdictInput): TicketDoctorVerdict | undefined;
|
|
125
|
-
export interface TicketDoctorDependencies {
|
|
126
|
-
config: ResolvedConfig;
|
|
127
|
-
ticket: string;
|
|
128
|
-
/**
|
|
129
|
-
* Injected to keep `ticketDoctor` pure and easy to unit-test. `undefined`
|
|
130
|
-
* means the caller passed `--no-linear` — the Linear-backed pre-dispatch
|
|
131
|
-
* checks (status, label, repo, eligibility) are all skipped.
|
|
132
|
-
*/
|
|
133
|
-
fetchRawIssue: ((input: {
|
|
134
|
-
ticket: string;
|
|
135
|
-
}) => Promise<RawLinearIssue>) | undefined;
|
|
136
|
-
fetchBlockersFor: (input: {
|
|
137
|
-
ticket: string;
|
|
138
|
-
uuid: string;
|
|
139
|
-
}) => Promise<readonly Blocker[]>;
|
|
140
|
-
fetchUsage: () => Promise<UsageByModel>;
|
|
141
|
-
countInProgress: () => Promise<number>;
|
|
142
|
-
findWorktree: (ticket: string) => WorktreeEntry | undefined;
|
|
143
|
-
probeWorkspaces: () => Promise<WorkspaceProbe>;
|
|
144
|
-
workspaceAccessHint: (name: string) => Promise<WorkspaceAccessHint | undefined>;
|
|
145
|
-
probeWorkingTree: (input: {
|
|
146
|
-
worktreeDir: string;
|
|
147
|
-
}) => Promise<WorktreeDirtiness>;
|
|
148
|
-
/**
|
|
149
|
-
* Resolves the default branch for `repoDir` (e.g. "master" vs "main") from
|
|
150
|
-
* the local clone's `refs/remotes/<remote>/HEAD`, falling back to
|
|
151
|
-
* `config.git.defaultBranch`. Injected so probeLocalBranchSection can pass a
|
|
152
|
-
* per-repo branch into `probeLocalBranch` without each probe needing to
|
|
153
|
-
* shell out to git itself.
|
|
154
|
-
*/
|
|
155
|
-
resolveDefaultBranch: (input: {
|
|
156
|
-
repoDir: string;
|
|
157
|
-
}) => Promise<string>;
|
|
158
|
-
probeLocalBranch: (input: {
|
|
159
|
-
repoDir: string;
|
|
160
|
-
branch: string;
|
|
161
|
-
remote: string;
|
|
162
|
-
defaultBranch: string;
|
|
163
|
-
}) => Promise<LocalBranchProbe>;
|
|
164
|
-
probeRemoteBranch: (input: {
|
|
165
|
-
repoDir: string;
|
|
166
|
-
branch: string;
|
|
167
|
-
remote: string;
|
|
168
|
-
doFetch: boolean;
|
|
169
|
-
}) => Promise<RemoteBranchProbe>;
|
|
170
|
-
probePullRequest: (input: {
|
|
171
|
-
repoDir: string;
|
|
172
|
-
branch: string;
|
|
173
|
-
}) => Promise<PullRequestProbe>;
|
|
174
|
-
readRunState: (ticket: string) => RunState | undefined;
|
|
175
|
-
doFetch: boolean;
|
|
176
|
-
}
|
|
177
|
-
export interface TicketDoctorResult {
|
|
178
|
-
ticket: string;
|
|
179
|
-
title?: string;
|
|
180
|
-
resolution: TicketCheck[];
|
|
181
|
-
eligibility: TicketCheck[];
|
|
182
|
-
runState: TicketCheck[];
|
|
183
|
-
worktree: TicketCheck[];
|
|
184
|
-
workspace: TicketCheck[];
|
|
185
|
-
localBranch: TicketCheck[];
|
|
186
|
-
remoteBranch: TicketCheck[];
|
|
187
|
-
pullRequest: TicketCheck[];
|
|
188
|
-
skipReasons: {
|
|
189
|
-
resolution: string;
|
|
190
|
-
eligibility: string;
|
|
191
|
-
worktree: string;
|
|
192
|
-
runState: string;
|
|
193
|
-
workspace: string;
|
|
194
|
-
localBranch: string;
|
|
195
|
-
remoteBranch: string;
|
|
196
|
-
pullRequest: string;
|
|
197
|
-
};
|
|
198
|
-
verdict: TicketDoctorVerdict;
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Pure-with-async orchestrator that gathers all sections plus the verdict.
|
|
202
|
-
* All I/O happens via injected probes — the function itself does no
|
|
203
|
-
* filesystem, network, or stdout work.
|
|
204
|
-
*/
|
|
205
|
-
export declare function ticketDoctor(dependencies: TicketDoctorDependencies): Promise<TicketDoctorResult>;
|
|
206
|
-
interface TicketDoctorArguments {
|
|
207
|
-
ticket: string;
|
|
208
|
-
doLinear: boolean;
|
|
209
|
-
doFetch: boolean;
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Parses optional `--no-linear` and `--no-fetch` flags that follow
|
|
213
|
-
* `crew doctor --ticket <id>`. The ticket id is consumed by `cli.ts` before
|
|
214
|
-
* this point.
|
|
215
|
-
*/
|
|
216
|
-
export declare function parseTicketDoctorFlags(argv: string[]): {
|
|
217
|
-
doLinear: boolean;
|
|
218
|
-
doFetch: boolean;
|
|
219
|
-
};
|
|
220
|
-
export declare function renderTicketDoctorResult(result: TicketDoctorResult): string[];
|
|
221
|
-
export declare function runTicketDoctor(parsed: TicketDoctorArguments): Promise<boolean>;
|
|
222
|
-
export {};
|
|
223
|
-
//# sourceMappingURL=ticketDoctor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ticketDoctor.d.ts","sourceRoot":"","sources":["../../src/commands/ticketDoctor.ts"],"names":[],"mappings":"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"}
|