@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/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 (e.g. `--no-linear`), so we avoid blowing up on a missing
107
- * API key when no Linear call is actually made. The factory is taken as a
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@clipboard-health/groundcrew",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "description": "Linear-driven orchestrator that launches AI coding agents in git worktrees, with workspace lifecycle and usage tracking.",
5
5
  "keywords": [
6
6
  "agent",
@@ -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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"}