@google/jules-fleet 0.0.1-experimental.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/README.md +205 -0
- package/dist/analyze/formatting.d.ts +19 -0
- package/dist/analyze/goals.d.ts +18 -0
- package/dist/analyze/handler.d.ts +23 -0
- package/dist/analyze/index.d.ts +8 -0
- package/dist/analyze/milestone.d.ts +43 -0
- package/dist/analyze/prompt.d.ts +10 -0
- package/dist/analyze/spec.d.ts +54 -0
- package/dist/analyze/triage-prompt.d.ts +16 -0
- package/dist/cli/analyze.command.d.ts +24 -0
- package/dist/cli/analyze.command.mjs +1015 -0
- package/dist/cli/commands.json +1 -0
- package/dist/cli/configure.command.d.ts +21 -0
- package/dist/cli/configure.command.mjs +623 -0
- package/dist/cli/dispatch.command.d.ts +16 -0
- package/dist/cli/dispatch.command.mjs +777 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.mjs +40 -0
- package/dist/cli/init.command.d.ts +38 -0
- package/dist/cli/init.command.mjs +1287 -0
- package/dist/cli/merge.command.d.ts +36 -0
- package/dist/cli/merge.command.mjs +859 -0
- package/dist/cli/signal.command.d.ts +2 -0
- package/dist/cli/signal.command.mjs +288 -0
- package/dist/configure/handler.d.ts +19 -0
- package/dist/configure/index.d.ts +4 -0
- package/dist/configure/labels.d.ts +6 -0
- package/dist/configure/spec.d.ts +49 -0
- package/dist/dispatch/events.d.ts +12 -0
- package/dist/dispatch/handler.d.ts +21 -0
- package/dist/dispatch/index.d.ts +5 -0
- package/dist/dispatch/spec.d.ts +47 -0
- package/dist/dispatch/status.d.ts +24 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.mjs +2105 -0
- package/dist/init/handler.d.ts +22 -0
- package/dist/init/index.d.ts +4 -0
- package/dist/init/ops/commit-files.d.ts +10 -0
- package/dist/init/ops/create-branch.d.ts +16 -0
- package/dist/init/ops/create-pr.d.ts +15 -0
- package/dist/init/ops/pr-body.d.ts +5 -0
- package/dist/init/ops/upload-secrets.d.ts +11 -0
- package/dist/init/spec.d.ts +50 -0
- package/dist/init/templates/analyze.d.ts +2 -0
- package/dist/init/templates/dispatch.d.ts +2 -0
- package/dist/init/templates/example-goal.d.ts +5 -0
- package/dist/init/templates/merge.d.ts +2 -0
- package/dist/init/templates/types.d.ts +6 -0
- package/dist/init/templates.d.ts +10 -0
- package/dist/init/types.d.ts +19 -0
- package/dist/init/wizard/headless.d.ts +8 -0
- package/dist/init/wizard/index.d.ts +3 -0
- package/dist/init/wizard/interactive.d.ts +9 -0
- package/dist/init/wizard/types.d.ts +22 -0
- package/dist/merge/handler.d.ts +21 -0
- package/dist/merge/index.d.ts +5 -0
- package/dist/merge/ops/index.d.ts +4 -0
- package/dist/merge/ops/redispatch.d.ts +8 -0
- package/dist/merge/ops/squash-merge.d.ts +8 -0
- package/dist/merge/ops/update-branch.d.ts +11 -0
- package/dist/merge/ops/wait-for-ci.d.ts +7 -0
- package/dist/merge/select/by-fleet-run.d.ts +8 -0
- package/dist/merge/select/by-label.d.ts +7 -0
- package/dist/merge/select/index.d.ts +2 -0
- package/dist/merge/spec.d.ts +99 -0
- package/dist/shared/auth/cache-plugin.d.ts +9 -0
- package/dist/shared/auth/git.d.ts +22 -0
- package/dist/shared/auth/index.d.ts +4 -0
- package/dist/shared/auth/octokit.d.ts +11 -0
- package/dist/shared/auth/resolve-key.d.ts +11 -0
- package/dist/shared/events/analyze.d.ts +37 -0
- package/dist/shared/events/configure.d.ts +21 -0
- package/dist/shared/events/dispatch.d.ts +26 -0
- package/dist/shared/events/error.d.ts +7 -0
- package/dist/shared/events/index.d.ts +16 -0
- package/dist/shared/events/init.d.ts +49 -0
- package/dist/shared/events/merge.d.ts +72 -0
- package/dist/shared/events.d.ts +1 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/result/create-result-schemas.d.ts +72 -0
- package/dist/shared/result/fail.d.ts +10 -0
- package/dist/shared/result/index.d.ts +3 -0
- package/dist/shared/result/ok.d.ts +5 -0
- package/dist/shared/schemas/check-run.d.ts +16 -0
- package/dist/shared/schemas/index.d.ts +4 -0
- package/dist/shared/schemas/label.d.ts +16 -0
- package/dist/shared/schemas/pr.d.ts +19 -0
- package/dist/shared/schemas/repo-info.d.ts +16 -0
- package/dist/shared/session-dispatcher.d.ts +18 -0
- package/dist/shared/ui/assert-never.d.ts +13 -0
- package/dist/shared/ui/index.d.ts +18 -0
- package/dist/shared/ui/interactive.d.ts +19 -0
- package/dist/shared/ui/plain.d.ts +16 -0
- package/dist/shared/ui/render/analyze.d.ts +4 -0
- package/dist/shared/ui/render/configure.d.ts +4 -0
- package/dist/shared/ui/render/dispatch.d.ts +4 -0
- package/dist/shared/ui/render/error.d.ts +4 -0
- package/dist/shared/ui/render/init.d.ts +4 -0
- package/dist/shared/ui/render/merge.d.ts +4 -0
- package/dist/shared/ui/session-url.d.ts +13 -0
- package/dist/shared/ui/spec.d.ts +30 -0
- package/dist/signal/handler.d.ts +17 -0
- package/dist/signal/index.d.ts +3 -0
- package/dist/signal/spec.d.ts +60 -0
- package/package.json +76 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Init domain events */
|
|
2
|
+
export type InitEvent = {
|
|
3
|
+
type: 'init:start';
|
|
4
|
+
owner: string;
|
|
5
|
+
repo: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: 'init:branch:creating';
|
|
8
|
+
name: string;
|
|
9
|
+
base: string;
|
|
10
|
+
} | {
|
|
11
|
+
type: 'init:branch:created';
|
|
12
|
+
name: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'init:file:committed';
|
|
15
|
+
path: string;
|
|
16
|
+
} | {
|
|
17
|
+
type: 'init:file:skipped';
|
|
18
|
+
path: string;
|
|
19
|
+
reason: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: 'init:pr:creating';
|
|
22
|
+
} | {
|
|
23
|
+
type: 'init:pr:created';
|
|
24
|
+
url: string;
|
|
25
|
+
number: number;
|
|
26
|
+
} | {
|
|
27
|
+
type: 'init:done';
|
|
28
|
+
prUrl: string;
|
|
29
|
+
files: string[];
|
|
30
|
+
labels: string[];
|
|
31
|
+
} | {
|
|
32
|
+
type: 'init:auth:detected';
|
|
33
|
+
method: 'token' | 'app';
|
|
34
|
+
} | {
|
|
35
|
+
type: 'init:secret:uploading';
|
|
36
|
+
name: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: 'init:secret:uploaded';
|
|
39
|
+
name: string;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'init:secret:skipped';
|
|
42
|
+
name: string;
|
|
43
|
+
reason: string;
|
|
44
|
+
} | {
|
|
45
|
+
type: 'init:dry-run';
|
|
46
|
+
files: string[];
|
|
47
|
+
} | {
|
|
48
|
+
type: 'init:already-initialized';
|
|
49
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** Merge domain events */
|
|
2
|
+
export type MergeEvent = {
|
|
3
|
+
type: 'merge:start';
|
|
4
|
+
owner: string;
|
|
5
|
+
repo: string;
|
|
6
|
+
mode: string;
|
|
7
|
+
prCount: number;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'merge:no-prs';
|
|
10
|
+
} | {
|
|
11
|
+
type: 'merge:pr:processing';
|
|
12
|
+
number: number;
|
|
13
|
+
title: string;
|
|
14
|
+
retry?: number;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'merge:branch:updating';
|
|
17
|
+
prNumber: number;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'merge:branch:updated';
|
|
20
|
+
prNumber: number;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'merge:ci:waiting';
|
|
23
|
+
prNumber: number;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'merge:ci:check';
|
|
26
|
+
name: string;
|
|
27
|
+
status: 'pass' | 'fail' | 'pending';
|
|
28
|
+
duration?: number;
|
|
29
|
+
} | {
|
|
30
|
+
type: 'merge:ci:passed';
|
|
31
|
+
prNumber: number;
|
|
32
|
+
} | {
|
|
33
|
+
type: 'merge:ci:failed';
|
|
34
|
+
prNumber: number;
|
|
35
|
+
} | {
|
|
36
|
+
type: 'merge:ci:timeout';
|
|
37
|
+
prNumber: number;
|
|
38
|
+
} | {
|
|
39
|
+
type: 'merge:ci:none';
|
|
40
|
+
prNumber: number;
|
|
41
|
+
} | {
|
|
42
|
+
type: 'merge:pr:merging';
|
|
43
|
+
prNumber: number;
|
|
44
|
+
} | {
|
|
45
|
+
type: 'merge:pr:merged';
|
|
46
|
+
prNumber: number;
|
|
47
|
+
} | {
|
|
48
|
+
type: 'merge:pr:skipped';
|
|
49
|
+
prNumber: number;
|
|
50
|
+
reason: string;
|
|
51
|
+
} | {
|
|
52
|
+
type: 'merge:conflict:detected';
|
|
53
|
+
prNumber: number;
|
|
54
|
+
} | {
|
|
55
|
+
type: 'merge:redispatch:start';
|
|
56
|
+
oldPr: number;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'merge:redispatch:waiting';
|
|
59
|
+
oldPr: number;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'merge:redispatch:done';
|
|
62
|
+
oldPr: number;
|
|
63
|
+
newPr: number;
|
|
64
|
+
} | {
|
|
65
|
+
type: 'merge:done';
|
|
66
|
+
merged: number[];
|
|
67
|
+
skipped: number[];
|
|
68
|
+
redispatched: Array<{
|
|
69
|
+
oldPr: number;
|
|
70
|
+
newPr: number;
|
|
71
|
+
}>;
|
|
72
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { InitEvent, AnalyzeEvent, MergeEvent, DispatchEvent, ConfigureEvent, ErrorEvent, FleetEvent, FleetEmitter, } from './events/index.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ok, fail, createResultSchemas } from './result/index.js';
|
|
2
|
+
export { RepoInfoSchema, PRSchema, CheckRunSchema, LabelSchema, type RepoInfo, type PR, type CheckRun, type Label, } from './schemas/index.js';
|
|
3
|
+
export * from './auth/index.js';
|
|
4
|
+
export type { SessionDispatcher } from './session-dispatcher.js';
|
|
5
|
+
export type { FleetEvent, FleetEmitter } from './events/index.js';
|
|
6
|
+
export { createRenderer, createEmitter, isInteractive, type FleetRenderer, } from './ui/index.js';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Creates typed Success and Failure Zod schemas for the Result pattern.
|
|
4
|
+
* Handlers return `Result` instead of throwing — errors are values.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createResultSchemas<TData extends z.ZodType, TCode extends z.ZodEnum<[string, ...string[]]>>(dataSchema: TData, errorCodeSchema: TCode): {
|
|
7
|
+
Success: z.ZodObject<{
|
|
8
|
+
success: z.ZodLiteral<true>;
|
|
9
|
+
data: TData;
|
|
10
|
+
}, "strip", z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<{
|
|
11
|
+
success: z.ZodLiteral<true>;
|
|
12
|
+
data: TData;
|
|
13
|
+
}>, any> extends infer T ? { [k in keyof T]: T[k]; } : never, z.baseObjectInputType<{
|
|
14
|
+
success: z.ZodLiteral<true>;
|
|
15
|
+
data: TData;
|
|
16
|
+
}> extends infer T_1 ? { [k_1 in keyof T_1]: T_1[k_1]; } : never>;
|
|
17
|
+
Failure: z.ZodObject<{
|
|
18
|
+
success: z.ZodLiteral<false>;
|
|
19
|
+
error: z.ZodObject<{
|
|
20
|
+
code: TCode;
|
|
21
|
+
message: z.ZodString;
|
|
22
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
23
|
+
recoverable: z.ZodBoolean;
|
|
24
|
+
}, "strip", z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<{
|
|
25
|
+
code: TCode;
|
|
26
|
+
message: z.ZodString;
|
|
27
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
28
|
+
recoverable: z.ZodBoolean;
|
|
29
|
+
}>, any> extends infer T_2 ? { [k_2 in keyof T_2]: T_2[k_2]; } : never, z.baseObjectInputType<{
|
|
30
|
+
code: TCode;
|
|
31
|
+
message: z.ZodString;
|
|
32
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
33
|
+
recoverable: z.ZodBoolean;
|
|
34
|
+
}> extends infer T_3 ? { [k_3 in keyof T_3]: T_3[k_3]; } : never>;
|
|
35
|
+
}, "strip", z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<{
|
|
36
|
+
success: z.ZodLiteral<false>;
|
|
37
|
+
error: z.ZodObject<{
|
|
38
|
+
code: TCode;
|
|
39
|
+
message: z.ZodString;
|
|
40
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
41
|
+
recoverable: z.ZodBoolean;
|
|
42
|
+
}, "strip", z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<{
|
|
43
|
+
code: TCode;
|
|
44
|
+
message: z.ZodString;
|
|
45
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
46
|
+
recoverable: z.ZodBoolean;
|
|
47
|
+
}>, any> extends infer T_5 ? { [k_2 in keyof T_5]: T_5[k_2]; } : never, z.baseObjectInputType<{
|
|
48
|
+
code: TCode;
|
|
49
|
+
message: z.ZodString;
|
|
50
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
51
|
+
recoverable: z.ZodBoolean;
|
|
52
|
+
}> extends infer T_6 ? { [k_3 in keyof T_6]: T_6[k_3]; } : never>;
|
|
53
|
+
}>, any> extends infer T_4 ? { [k_4 in keyof T_4]: T_4[k_4]; } : never, z.baseObjectInputType<{
|
|
54
|
+
success: z.ZodLiteral<false>;
|
|
55
|
+
error: z.ZodObject<{
|
|
56
|
+
code: TCode;
|
|
57
|
+
message: z.ZodString;
|
|
58
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
59
|
+
recoverable: z.ZodBoolean;
|
|
60
|
+
}, "strip", z.ZodTypeAny, z.objectUtil.addQuestionMarks<z.baseObjectOutputType<{
|
|
61
|
+
code: TCode;
|
|
62
|
+
message: z.ZodString;
|
|
63
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
64
|
+
recoverable: z.ZodBoolean;
|
|
65
|
+
}>, any> extends infer T_8 ? { [k_2 in keyof T_8]: T_8[k_2]; } : never, z.baseObjectInputType<{
|
|
66
|
+
code: TCode;
|
|
67
|
+
message: z.ZodString;
|
|
68
|
+
suggestion: z.ZodOptional<z.ZodString>;
|
|
69
|
+
recoverable: z.ZodBoolean;
|
|
70
|
+
}> extends infer T_9 ? { [k_3 in keyof T_9]: T_9[k_3]; } : never>;
|
|
71
|
+
}> extends infer T_7 ? { [k_5 in keyof T_7]: T_7[k_5]; } : never>;
|
|
72
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Helper to create a failure result */
|
|
2
|
+
export declare function fail<TCode extends string>(code: TCode, message: string, recoverable?: boolean, suggestion?: string): {
|
|
3
|
+
success: false;
|
|
4
|
+
error: {
|
|
5
|
+
code: TCode;
|
|
6
|
+
message: string;
|
|
7
|
+
recoverable: boolean;
|
|
8
|
+
suggestion?: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** GitHub check run status */
|
|
3
|
+
export declare const CheckRunSchema: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
status: z.ZodString;
|
|
6
|
+
conclusion: z.ZodNullable<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
status: string;
|
|
9
|
+
name: string;
|
|
10
|
+
conclusion: string | null;
|
|
11
|
+
}, {
|
|
12
|
+
status: string;
|
|
13
|
+
name: string;
|
|
14
|
+
conclusion: string | null;
|
|
15
|
+
}>;
|
|
16
|
+
export type CheckRun = z.infer<typeof CheckRunSchema>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Label definition for configure command */
|
|
3
|
+
export declare const LabelSchema: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
color: z.ZodString;
|
|
6
|
+
description: z.ZodString;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
name: string;
|
|
9
|
+
color: string;
|
|
10
|
+
description: string;
|
|
11
|
+
}, {
|
|
12
|
+
name: string;
|
|
13
|
+
color: string;
|
|
14
|
+
description: string;
|
|
15
|
+
}>;
|
|
16
|
+
export type Label = z.infer<typeof LabelSchema>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Minimal PR shape returned by the GitHub API */
|
|
3
|
+
export declare const PRSchema: z.ZodObject<{
|
|
4
|
+
number: z.ZodNumber;
|
|
5
|
+
headRef: z.ZodString;
|
|
6
|
+
headSha: z.ZodString;
|
|
7
|
+
body: z.ZodNullable<z.ZodString>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
number: number;
|
|
10
|
+
headRef: string;
|
|
11
|
+
headSha: string;
|
|
12
|
+
body: string | null;
|
|
13
|
+
}, {
|
|
14
|
+
number: number;
|
|
15
|
+
headRef: string;
|
|
16
|
+
headSha: string;
|
|
17
|
+
body: string | null;
|
|
18
|
+
}>;
|
|
19
|
+
export type PR = z.infer<typeof PRSchema>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Validated repository info (owner/repo) */
|
|
3
|
+
export declare const RepoInfoSchema: z.ZodObject<{
|
|
4
|
+
owner: z.ZodString;
|
|
5
|
+
repo: z.ZodString;
|
|
6
|
+
fullName: z.ZodString;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
owner: string;
|
|
9
|
+
repo: string;
|
|
10
|
+
fullName: string;
|
|
11
|
+
}, {
|
|
12
|
+
owner: string;
|
|
13
|
+
repo: string;
|
|
14
|
+
fullName: string;
|
|
15
|
+
}>;
|
|
16
|
+
export type RepoInfo = z.infer<typeof RepoInfoSchema>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstraction over Jules SDK session creation.
|
|
3
|
+
* Handlers accept this interface via constructor instead of importing
|
|
4
|
+
* @google/jules-sdk directly, enabling testing and decoupling.
|
|
5
|
+
*/
|
|
6
|
+
export interface SessionDispatcher {
|
|
7
|
+
dispatch(options: {
|
|
8
|
+
prompt: string;
|
|
9
|
+
source?: {
|
|
10
|
+
github: string;
|
|
11
|
+
baseBranch: string;
|
|
12
|
+
};
|
|
13
|
+
requireApproval?: boolean;
|
|
14
|
+
autoPr?: boolean;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compile-time + runtime exhaustiveness check.
|
|
3
|
+
* Use as the default case in switch statements to ensure all event types are handled.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* switch (event.type) {
|
|
8
|
+
* case 'init:start': // ...
|
|
9
|
+
* default: assertNever(event);
|
|
10
|
+
* }
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare function assertNever(value: never, message?: string): never;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FleetRenderer } from './spec.js';
|
|
2
|
+
import type { FleetEmitter } from '../events.js';
|
|
3
|
+
export type { FleetRenderer } from './spec.js';
|
|
4
|
+
export { InteractiveRenderer } from './interactive.js';
|
|
5
|
+
export { PlainRenderer } from './plain.js';
|
|
6
|
+
export { sessionUrl, repoConfigUrl, ansiLink } from './session-url.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect whether the current environment supports interactive UI.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isInteractive(): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Create a renderer appropriate for the current environment.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createRenderer(interactive?: boolean): FleetRenderer;
|
|
15
|
+
/**
|
|
16
|
+
* Create an emitter function that forwards events to a renderer.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createEmitter(renderer: FleetRenderer): FleetEmitter;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FleetEvent } from '../events.js';
|
|
2
|
+
import type { FleetRenderer } from './spec.js';
|
|
3
|
+
/**
|
|
4
|
+
* InteractiveRenderer uses @clack/prompts for rich TUI output.
|
|
5
|
+
* Used when stdout is a TTY (local development).
|
|
6
|
+
*
|
|
7
|
+
* This is a thin shell — all domain-specific rendering is delegated
|
|
8
|
+
* to per-domain functions in render/*.ts via the RenderContext interface.
|
|
9
|
+
*/
|
|
10
|
+
export declare class InteractiveRenderer implements FleetRenderer {
|
|
11
|
+
private spinner;
|
|
12
|
+
private ctx;
|
|
13
|
+
start(title: string): void;
|
|
14
|
+
end(message: string): void;
|
|
15
|
+
error(message: string): void;
|
|
16
|
+
render(event: FleetEvent): void;
|
|
17
|
+
private startSpinner;
|
|
18
|
+
private stopSpinner;
|
|
19
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { FleetEvent } from '../events.js';
|
|
2
|
+
import type { FleetRenderer } from './spec.js';
|
|
3
|
+
/**
|
|
4
|
+
* PlainRenderer uses console.log for CI-friendly plain text output.
|
|
5
|
+
* Used when stdout is not a TTY (CI environments).
|
|
6
|
+
*
|
|
7
|
+
* This is a thin shell — all domain-specific rendering is delegated
|
|
8
|
+
* to per-domain functions in render/*.ts via the RenderContext interface.
|
|
9
|
+
*/
|
|
10
|
+
export declare class PlainRenderer implements FleetRenderer {
|
|
11
|
+
private ctx;
|
|
12
|
+
start(title: string): void;
|
|
13
|
+
end(message: string): void;
|
|
14
|
+
error(message: string): void;
|
|
15
|
+
render(event: FleetEvent): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a Jules session URL from a session ID.
|
|
3
|
+
*/
|
|
4
|
+
export declare function sessionUrl(sessionId: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Build a Jules repo config URL.
|
|
7
|
+
*/
|
|
8
|
+
export declare function repoConfigUrl(owner: string, repo: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Wrap text in an ANSI hyperlink (OSC 8) for terminals that support it.
|
|
11
|
+
* Falls back to plain text in terminals that don't.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ansiLink(text: string, url: string): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FleetEvent } from '../events.js';
|
|
2
|
+
/**
|
|
3
|
+
* FleetRenderer interface — the UI contract.
|
|
4
|
+
* Implementations render FleetEvents into terminal output.
|
|
5
|
+
*/
|
|
6
|
+
export interface FleetRenderer {
|
|
7
|
+
/** Render a single event */
|
|
8
|
+
render(event: FleetEvent): void;
|
|
9
|
+
/** Start the UI (e.g., intro banner) */
|
|
10
|
+
start(title: string): void;
|
|
11
|
+
/** End the UI (e.g., outro message) */
|
|
12
|
+
end(message: string): void;
|
|
13
|
+
/** End the UI with an error */
|
|
14
|
+
error(message: string): void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* RenderContext abstracts the difference between interactive (clack) and plain
|
|
18
|
+
* (console) rendering. Domain-specific render functions depend on this
|
|
19
|
+
* interface instead of coupling to @clack/prompts or console directly.
|
|
20
|
+
*/
|
|
21
|
+
export interface RenderContext {
|
|
22
|
+
info(msg: string): void;
|
|
23
|
+
success(msg: string): void;
|
|
24
|
+
warn(msg: string): void;
|
|
25
|
+
error(msg: string): void;
|
|
26
|
+
message(msg: string): void;
|
|
27
|
+
step(msg: string): void;
|
|
28
|
+
startSpinner(msg: string): void;
|
|
29
|
+
stopSpinner(msg?: string): void;
|
|
30
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Octokit } from 'octokit';
|
|
2
|
+
import type { SignalCreateSpec, SignalCreateInput, SignalCreateResult } from './spec.js';
|
|
3
|
+
/**
|
|
4
|
+
* Signal creation handler — GitHub adapter.
|
|
5
|
+
*
|
|
6
|
+
* Maps fleet domain concepts to GitHub Issues:
|
|
7
|
+
* - signal.kind → label (fleet-insight or fleet-assessment)
|
|
8
|
+
* - signal.tags → labels
|
|
9
|
+
* - signal.scope → milestone (resolved by title)
|
|
10
|
+
*/
|
|
11
|
+
export declare class SignalCreateHandler implements SignalCreateSpec {
|
|
12
|
+
private readonly deps;
|
|
13
|
+
constructor(deps: {
|
|
14
|
+
octokit: InstanceType<typeof Octokit>;
|
|
15
|
+
});
|
|
16
|
+
execute(input: SignalCreateInput): Promise<SignalCreateResult>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { SignalCreateInput, SignalCreateResult, SignalCreateSuccess, SignalCreateFailure, SignalCreateSpec, SignalKind, SignalCreateErrorCode, } from './spec.js';
|
|
2
|
+
export { SignalCreateInputSchema, SignalKind as SignalKindEnum } from './spec.js';
|
|
3
|
+
export { SignalCreateHandler } from './handler.js';
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const SignalKind: z.ZodEnum<["insight", "assessment"]>;
|
|
3
|
+
export type SignalKind = z.infer<typeof SignalKind>;
|
|
4
|
+
export declare const SignalCreateInputSchema: z.ZodObject<{
|
|
5
|
+
/** Repository owner */
|
|
6
|
+
owner: z.ZodString;
|
|
7
|
+
/** Repository name */
|
|
8
|
+
repo: z.ZodString;
|
|
9
|
+
/** Signal kind: insight (informational) or assessment (actionable) */
|
|
10
|
+
kind: z.ZodDefault<z.ZodEnum<["insight", "assessment"]>>;
|
|
11
|
+
/** Signal title */
|
|
12
|
+
title: z.ZodString;
|
|
13
|
+
/** Markdown body content */
|
|
14
|
+
body: z.ZodString;
|
|
15
|
+
/** Tags to apply (become labels in GitHub) */
|
|
16
|
+
tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
17
|
+
/** Scope name (maps to milestone title in GitHub) */
|
|
18
|
+
scope: z.ZodOptional<z.ZodString>;
|
|
19
|
+
}, "strip", z.ZodTypeAny, {
|
|
20
|
+
owner: string;
|
|
21
|
+
repo: string;
|
|
22
|
+
body: string;
|
|
23
|
+
title: string;
|
|
24
|
+
kind: "insight" | "assessment";
|
|
25
|
+
tags: string[];
|
|
26
|
+
scope?: string | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
owner: string;
|
|
29
|
+
repo: string;
|
|
30
|
+
body: string;
|
|
31
|
+
title: string;
|
|
32
|
+
kind?: "insight" | "assessment" | undefined;
|
|
33
|
+
tags?: string[] | undefined;
|
|
34
|
+
scope?: string | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
export type SignalCreateInput = z.infer<typeof SignalCreateInputSchema>;
|
|
37
|
+
export declare const SignalCreateErrorCode: z.ZodEnum<["GITHUB_API_ERROR", "SCOPE_NOT_FOUND", "UNKNOWN_ERROR"]>;
|
|
38
|
+
export type SignalCreateErrorCode = z.infer<typeof SignalCreateErrorCode>;
|
|
39
|
+
export interface SignalCreateSuccess {
|
|
40
|
+
success: true;
|
|
41
|
+
data: {
|
|
42
|
+
/** Created signal ID (issue number in GitHub) */
|
|
43
|
+
id: number;
|
|
44
|
+
/** URL to the created signal */
|
|
45
|
+
url: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface SignalCreateFailure {
|
|
49
|
+
success: false;
|
|
50
|
+
error: {
|
|
51
|
+
code: SignalCreateErrorCode;
|
|
52
|
+
message: string;
|
|
53
|
+
recoverable: boolean;
|
|
54
|
+
suggestion?: string;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export type SignalCreateResult = SignalCreateSuccess | SignalCreateFailure;
|
|
58
|
+
export interface SignalCreateSpec {
|
|
59
|
+
execute(input: SignalCreateInput): Promise<SignalCreateResult>;
|
|
60
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@google/jules-fleet",
|
|
3
|
+
"version": "0.0.1-experimental.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Fleet orchestration tools for Jules — analyze, dispatch, merge, init, configure",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/google-labs-code/jules-sdk.git"
|
|
9
|
+
},
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"bin": {
|
|
12
|
+
"jules-fleet": "./dist/cli/index.mjs"
|
|
13
|
+
},
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.mjs"
|
|
18
|
+
},
|
|
19
|
+
"./package.json": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20.0.0"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist/",
|
|
26
|
+
"README.md",
|
|
27
|
+
"LICENSE"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build:js": "bun run build.ts",
|
|
31
|
+
"build:types": "tsc",
|
|
32
|
+
"build": "bun run build:js && bun run build:types",
|
|
33
|
+
"prepublishOnly": "bun run build && vitest run",
|
|
34
|
+
"test": "vitest",
|
|
35
|
+
"typecheck": "tsc --noEmit"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"jules",
|
|
39
|
+
"fleet",
|
|
40
|
+
"orchestration",
|
|
41
|
+
"github",
|
|
42
|
+
"automation"
|
|
43
|
+
],
|
|
44
|
+
"author": "Google LLC",
|
|
45
|
+
"license": "Apache-2.0",
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"registry": "https://wombat-dressing-room.appspot.com",
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@clack/prompts": "^1.0.1",
|
|
52
|
+
"@octokit/auth-app": "^8.2.0",
|
|
53
|
+
"citty": "^0.1.6",
|
|
54
|
+
"glob": "^13.0.6",
|
|
55
|
+
"libsodium-wrappers": "^0.8.2",
|
|
56
|
+
"octokit": "^4.1.3",
|
|
57
|
+
"yaml": "^2.8.2",
|
|
58
|
+
"zod": "^3.25.0"
|
|
59
|
+
},
|
|
60
|
+
"peerDependencies": {
|
|
61
|
+
"@google/jules-sdk": "*"
|
|
62
|
+
},
|
|
63
|
+
"peerDependenciesMeta": {
|
|
64
|
+
"@google/jules-sdk": {
|
|
65
|
+
"optional": true
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@google/jules-sdk": "^0.0.6",
|
|
70
|
+
"@types/bun": "^1.3.9",
|
|
71
|
+
"@types/libsodium-wrappers": "^0.8.2",
|
|
72
|
+
"@types/node": "^22.15.0",
|
|
73
|
+
"typescript": "^5.8.3",
|
|
74
|
+
"vitest": "^3.2.4"
|
|
75
|
+
}
|
|
76
|
+
}
|