@blogic-cz/agent-tools 1.7.5 → 1.9.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.
Files changed (142) hide show
  1. package/README.md +2 -1
  2. package/dist/config/loader.d.ts.map +1 -1
  3. package/dist/config/types.d.ts +1 -0
  4. package/dist/config/types.d.ts.map +1 -1
  5. package/dist/credential-guard/index.d.ts.map +1 -1
  6. package/dist/db-tool/service.d.ts.map +1 -1
  7. package/dist/gh-tool/branch.d.ts +2 -3
  8. package/dist/gh-tool/branch.d.ts.map +1 -1
  9. package/dist/gh-tool/environment.d.ts +1 -1
  10. package/dist/gh-tool/environment.d.ts.map +1 -1
  11. package/dist/gh-tool/gist.d.ts +8 -28
  12. package/dist/gh-tool/gist.d.ts.map +1 -1
  13. package/dist/gh-tool/issue/commands.d.ts +11 -9
  14. package/dist/gh-tool/issue/commands.d.ts.map +1 -1
  15. package/dist/gh-tool/issue/core.d.ts +116 -9
  16. package/dist/gh-tool/issue/core.d.ts.map +1 -1
  17. package/dist/gh-tool/issue/triage.d.ts +6 -6
  18. package/dist/gh-tool/issue/triage.d.ts.map +1 -1
  19. package/dist/gh-tool/label.d.ts +20 -0
  20. package/dist/gh-tool/label.d.ts.map +1 -0
  21. package/dist/gh-tool/pr/commands.d.ts +53 -46
  22. package/dist/gh-tool/pr/commands.d.ts.map +1 -1
  23. package/dist/gh-tool/pr/core.d.ts +156 -86
  24. package/dist/gh-tool/pr/core.d.ts.map +1 -1
  25. package/dist/gh-tool/pr/review.d.ts +16 -16
  26. package/dist/gh-tool/pr/review.d.ts.map +1 -1
  27. package/dist/gh-tool/pr/snapshot.d.ts +9 -0
  28. package/dist/gh-tool/pr/snapshot.d.ts.map +1 -0
  29. package/dist/gh-tool/pr/stack-read.d.ts +1 -6
  30. package/dist/gh-tool/pr/stack-read.d.ts.map +1 -1
  31. package/dist/gh-tool/pr/stack.d.ts +3 -3
  32. package/dist/gh-tool/pr/stack.d.ts.map +1 -1
  33. package/dist/gh-tool/{api.d.ts → read/api.d.ts} +9 -3
  34. package/dist/gh-tool/read/api.d.ts.map +1 -0
  35. package/dist/gh-tool/read/cache.d.ts +44 -0
  36. package/dist/gh-tool/read/cache.d.ts.map +1 -0
  37. package/dist/gh-tool/read/catalog.d.ts +170 -0
  38. package/dist/gh-tool/read/catalog.d.ts.map +1 -0
  39. package/dist/gh-tool/read/classes.d.ts +98 -0
  40. package/dist/gh-tool/read/classes.d.ts.map +1 -0
  41. package/dist/gh-tool/read/commands.d.ts +3 -0
  42. package/dist/gh-tool/read/commands.d.ts.map +1 -0
  43. package/dist/gh-tool/read/commits.d.ts +10 -0
  44. package/dist/gh-tool/read/commits.d.ts.map +1 -0
  45. package/dist/gh-tool/read/gated.d.ts +14 -0
  46. package/dist/gh-tool/read/gated.d.ts.map +1 -0
  47. package/dist/gh-tool/read/index.d.ts +5 -0
  48. package/dist/gh-tool/read/index.d.ts.map +1 -0
  49. package/dist/gh-tool/read/issues.d.ts +80 -0
  50. package/dist/gh-tool/read/issues.d.ts.map +1 -0
  51. package/dist/gh-tool/read/keys.d.ts +64 -0
  52. package/dist/gh-tool/read/keys.d.ts.map +1 -0
  53. package/dist/gh-tool/read/porcelain.d.ts +68 -0
  54. package/dist/gh-tool/read/porcelain.d.ts.map +1 -0
  55. package/dist/gh-tool/read/pulls.d.ts +137 -0
  56. package/dist/gh-tool/read/pulls.d.ts.map +1 -0
  57. package/dist/gh-tool/read/reads.d.ts +220 -0
  58. package/dist/gh-tool/read/reads.d.ts.map +1 -0
  59. package/dist/gh-tool/read/rest.d.ts +49 -0
  60. package/dist/gh-tool/read/rest.d.ts.map +1 -0
  61. package/dist/gh-tool/read/review-guards.d.ts +20 -0
  62. package/dist/gh-tool/read/review-guards.d.ts.map +1 -0
  63. package/dist/gh-tool/read/review-model.d.ts +190 -0
  64. package/dist/gh-tool/read/review-model.d.ts.map +1 -0
  65. package/dist/gh-tool/read/reviews.d.ts +9 -0
  66. package/dist/gh-tool/read/reviews.d.ts.map +1 -0
  67. package/dist/gh-tool/read/stacks.d.ts +7 -0
  68. package/dist/gh-tool/read/stacks.d.ts.map +1 -0
  69. package/dist/gh-tool/read/store.d.ts +70 -0
  70. package/dist/gh-tool/read/store.d.ts.map +1 -0
  71. package/dist/gh-tool/{service.d.ts → read/transport.d.ts} +5 -3
  72. package/dist/gh-tool/read/transport.d.ts.map +1 -0
  73. package/dist/gh-tool/read/waits.d.ts +22 -0
  74. package/dist/gh-tool/read/waits.d.ts.map +1 -0
  75. package/dist/gh-tool/read/writes.d.ts +16 -0
  76. package/dist/gh-tool/read/writes.d.ts.map +1 -0
  77. package/dist/gh-tool/release.d.ts +10 -26
  78. package/dist/gh-tool/release.d.ts.map +1 -1
  79. package/dist/gh-tool/repo.d.ts +9 -4
  80. package/dist/gh-tool/repo.d.ts.map +1 -1
  81. package/dist/gh-tool/types.d.ts +1 -1
  82. package/dist/gh-tool/types.d.ts.map +1 -1
  83. package/dist/gh-tool/workflow.d.ts +43 -21
  84. package/dist/gh-tool/workflow.d.ts.map +1 -1
  85. package/dist/observability-tool/shared.d.ts.map +1 -1
  86. package/dist/shared/content-security.d.ts +2 -0
  87. package/dist/shared/content-security.d.ts.map +1 -1
  88. package/package.json +7 -6
  89. package/schemas/agent-tools.schema.json +5 -0
  90. package/src/api-tool/proxy-entry.ts +3 -1
  91. package/src/config/loader.ts +1 -0
  92. package/src/config/types.ts +1 -0
  93. package/src/credential-guard/index.ts +169 -1
  94. package/src/db-tool/service.ts +4 -1
  95. package/src/gh-tool/branch.ts +5 -8
  96. package/src/gh-tool/environment.ts +2 -1
  97. package/src/gh-tool/gist.ts +8 -35
  98. package/src/gh-tool/issue/commands.ts +12 -2
  99. package/src/gh-tool/issue/core.ts +58 -122
  100. package/src/gh-tool/issue/triage.ts +4 -26
  101. package/src/gh-tool/label.ts +57 -0
  102. package/src/gh-tool/main.ts +24 -4
  103. package/src/gh-tool/pr/commands.ts +17 -15
  104. package/src/gh-tool/pr/core.ts +486 -582
  105. package/src/gh-tool/pr/review.ts +106 -454
  106. package/src/gh-tool/pr/snapshot.ts +23 -0
  107. package/src/gh-tool/pr/stack-read.ts +1 -73
  108. package/src/gh-tool/pr/stack.ts +37 -36
  109. package/src/gh-tool/{api.ts → read/api.ts} +40 -7
  110. package/src/gh-tool/read/cache.ts +192 -0
  111. package/src/gh-tool/read/catalog.ts +310 -0
  112. package/src/gh-tool/read/classes.ts +31 -0
  113. package/src/gh-tool/read/commands.ts +25 -0
  114. package/src/gh-tool/read/commits.ts +28 -0
  115. package/src/gh-tool/read/gated.ts +56 -0
  116. package/src/gh-tool/read/index.ts +4 -0
  117. package/src/gh-tool/read/issues.ts +124 -0
  118. package/src/gh-tool/read/keys.ts +104 -0
  119. package/src/gh-tool/read/porcelain.ts +58 -0
  120. package/src/gh-tool/read/pulls.ts +266 -0
  121. package/src/gh-tool/read/reads.ts +306 -0
  122. package/src/gh-tool/read/rest.ts +111 -0
  123. package/src/gh-tool/read/review-guards.ts +61 -0
  124. package/src/gh-tool/read/review-model.ts +286 -0
  125. package/src/gh-tool/read/reviews.ts +114 -0
  126. package/src/gh-tool/read/stacks.ts +73 -0
  127. package/src/gh-tool/read/store.ts +504 -0
  128. package/src/gh-tool/{service.ts → read/transport.ts} +26 -6
  129. package/src/gh-tool/read/waits.ts +52 -0
  130. package/src/gh-tool/read/writes.ts +37 -0
  131. package/src/gh-tool/release.ts +15 -168
  132. package/src/gh-tool/repo.ts +26 -78
  133. package/src/gh-tool/types.ts +1 -1
  134. package/src/gh-tool/workflow.ts +123 -214
  135. package/src/observability-tool/shared.ts +2 -1
  136. package/src/shared/content-security.ts +10 -1
  137. package/src/shared/credential-patterns.ts +1 -1
  138. package/dist/gh-tool/api.d.ts.map +0 -1
  139. package/dist/gh-tool/pr/check-status-cache.d.ts +0 -6
  140. package/dist/gh-tool/pr/check-status-cache.d.ts.map +0 -1
  141. package/dist/gh-tool/service.d.ts.map +0 -1
  142. package/src/gh-tool/pr/check-status-cache.ts +0 -142
@@ -1,134 +1,16 @@
1
+ import { passthrough } from "./read/catalog";
2
+ import type * as Catalog from "./read/catalog";
3
+ import { writes } from "./read/writes";
1
4
  import { Command, Flag } from "effect/cli";
2
5
  import { Effect, Option } from "effect";
3
6
 
4
7
  import { formatOption, logFormatted } from "#shared";
5
8
  import { resolveOptionalTextInput, validateOutboundText } from "#gh/text-input";
6
9
  import { GitHubCommandError } from "#gh/errors";
7
- import { GitHubService } from "./service";
8
-
9
- type ReleaseListItem = {
10
- tagName: string;
11
- name: string;
12
- isDraft: boolean;
13
- isPrerelease: boolean;
14
- createdAt: string;
15
- publishedAt: string | null;
16
- };
17
-
18
- type ReleaseAuthor = {
19
- login: string;
20
- };
21
-
22
- type ReleaseAsset = {
23
- name: string;
24
- size: number;
25
- downloadCount: number;
26
- contentType: string;
27
- createdAt: string;
28
- updatedAt: string;
29
- url: string;
30
- };
31
-
32
- type ReleaseDetail = {
33
- tagName: string;
34
- name: string;
35
- isDraft: boolean;
36
- isPrerelease: boolean;
37
- createdAt: string;
38
- publishedAt: string | null;
39
- url: string;
40
- body: string;
41
- targetCommitish: string;
42
- author: ReleaseAuthor | null;
43
- assets: ReleaseAsset[];
44
- };
45
-
46
- type ReleaseCreateResult = {
47
- created: true;
48
- tagName: string;
49
- name: string;
50
- url: string;
51
- isDraft: boolean;
52
- isPrerelease: boolean;
53
- };
54
-
55
- type ReleaseEditResult = {
56
- edited: true;
57
- tagName: string;
58
- name: string;
59
- url: string;
60
- isDraft: boolean;
61
- isPrerelease: boolean;
62
- };
63
-
64
- type ReleaseDeleteResult = {
65
- deleted: boolean;
66
- tagName: string;
67
- tagCleaned: boolean;
68
- dryRun?: true;
69
- message?: string;
70
- };
10
+ import { GitHubService } from "./read/transport";
71
11
 
72
- type LatestRelease = {
73
- tagName: string;
74
- name: string;
75
- createdAt: string;
76
- publishedAt: string | null;
77
- isLatest: boolean;
78
- };
79
-
80
- type ReleaseStatusResult = {
81
- latestRelease: LatestRelease | null;
82
- repo: {
83
- owner: string;
84
- name: string;
85
- defaultBranch: string;
86
- url: string;
87
- };
88
- };
89
-
90
- const listReleases = Effect.fn("release.listReleases")(function* (opts: {
91
- limit: number;
92
- repo: string | null;
93
- }) {
94
- const gh = yield* GitHubService;
95
-
96
- const args = [
97
- "release",
98
- "list",
99
- "--json",
100
- "tagName,name,isDraft,isPrerelease,createdAt,publishedAt",
101
- "--limit",
102
- String(opts.limit),
103
- ];
104
-
105
- if (opts.repo !== null) {
106
- args.push("--repo", opts.repo);
107
- }
108
-
109
- return yield* gh.runGhJson<ReleaseListItem[]>(args);
110
- });
111
-
112
- const viewRelease = Effect.fn("release.viewRelease")(function* (opts: {
113
- tag: string;
114
- repo: string | null;
115
- }) {
116
- const gh = yield* GitHubService;
117
-
118
- const args = [
119
- "release",
120
- "view",
121
- opts.tag,
122
- "--json",
123
- "tagName,name,isDraft,isPrerelease,createdAt,publishedAt,url,body,targetCommitish,author,assets",
124
- ];
125
-
126
- if (opts.repo !== null) {
127
- args.push("--repo", opts.repo);
128
- }
129
-
130
- return yield* gh.runGhJson<ReleaseDetail>(args);
131
- });
12
+ const listReleases = passthrough.listReleases;
13
+ const viewRelease = passthrough.viewRelease;
132
14
 
133
15
  export const resolveCreateNotes = (opts: {
134
16
  body: string | null;
@@ -194,7 +76,7 @@ export const createRelease = Effect.fn("release.createRelease")(function* (opts:
194
76
  ];
195
77
  if (opts.target !== null) args.push("-f", `target_commitish=${opts.target}`);
196
78
  if (opts.notesStartTag !== null) args.push("-f", `previous_tag_name=${opts.notesStartTag}`);
197
- return yield* gh.runGhJson<{ name: string; body: string }>(args);
79
+ return yield* writes.json<{ name: string; body: string }>(args, []);
198
80
  }),
199
81
  );
200
82
  if (typeof generated?.body !== "string" || typeof generated.name !== "string") {
@@ -250,7 +132,7 @@ export const createRelease = Effect.fn("release.createRelease")(function* (opts:
250
132
  args.push("--repo", opts.repo);
251
133
  }
252
134
 
253
- const result = yield* gh.runGh(args);
135
+ const result = yield* writes.run(args, []);
254
136
  const lines = result.stdout
255
137
  .trim()
256
138
  .split("\n")
@@ -259,7 +141,7 @@ export const createRelease = Effect.fn("release.createRelease")(function* (opts:
259
141
 
260
142
  const url = lines.length > 0 ? lines[lines.length - 1] : "";
261
143
 
262
- const created: ReleaseCreateResult = {
144
+ const created: Catalog.ReleaseCreateResult = {
263
145
  created: true,
264
146
  tagName: opts.tag,
265
147
  name: title ?? opts.tag,
@@ -280,8 +162,6 @@ export const editRelease = Effect.fn("release.editRelease")(function* (opts: {
280
162
  latest: boolean | null;
281
163
  repo: string | null;
282
164
  }) {
283
- const gh = yield* GitHubService;
284
-
285
165
  if (opts.title !== null) {
286
166
  yield* validateOutboundText(opts.title, "gh-tool release edit");
287
167
  }
@@ -328,14 +208,14 @@ export const editRelease = Effect.fn("release.editRelease")(function* (opts: {
328
208
  args.push("--repo", opts.repo);
329
209
  }
330
210
 
331
- yield* gh.runGh(args);
211
+ yield* writes.run(args, []);
332
212
 
333
213
  const updated = yield* viewRelease({
334
214
  tag: opts.tag,
335
215
  repo: opts.repo,
336
216
  });
337
217
 
338
- const edited: ReleaseEditResult = {
218
+ const edited: Catalog.ReleaseEditResult = {
339
219
  edited: true,
340
220
  tagName: updated.tagName,
341
221
  name: updated.name,
@@ -353,13 +233,11 @@ const deleteRelease = Effect.fn("release.deleteRelease")(function* (opts: {
353
233
  confirm: boolean;
354
234
  repo: string | null;
355
235
  }) {
356
- const gh = yield* GitHubService;
357
-
358
236
  if (!opts.confirm) {
359
237
  const scope = opts.repo !== null ? ` in ${opts.repo}` : "";
360
238
  const cleanup = opts.cleanupTag ? " and its git tag" : "";
361
239
 
362
- const dryRun: ReleaseDeleteResult = {
240
+ const dryRun: Catalog.ReleaseDeleteResult = {
363
241
  deleted: false,
364
242
  tagName: opts.tag,
365
243
  tagCleaned: opts.cleanupTag,
@@ -380,9 +258,9 @@ const deleteRelease = Effect.fn("release.deleteRelease")(function* (opts: {
380
258
  args.push("--repo", opts.repo);
381
259
  }
382
260
 
383
- yield* gh.runGh(args);
261
+ yield* writes.run(args, []);
384
262
 
385
- const deleted: ReleaseDeleteResult = {
263
+ const deleted: Catalog.ReleaseDeleteResult = {
386
264
  deleted: true,
387
265
  tagName: opts.tag,
388
266
  tagCleaned: opts.cleanupTag,
@@ -391,38 +269,7 @@ const deleteRelease = Effect.fn("release.deleteRelease")(function* (opts: {
391
269
  return deleted;
392
270
  });
393
271
 
394
- const releaseStatus = Effect.fn("release.releaseStatus")(function* (repo: string | null) {
395
- const gh = yield* GitHubService;
396
-
397
- const args = [
398
- "release",
399
- "list",
400
- "--json",
401
- "tagName,name,createdAt,publishedAt,isLatest",
402
- "--limit",
403
- "1",
404
- ];
405
- if (repo !== null) {
406
- args.push("--repo", repo);
407
- }
408
-
409
- const [repoInfo, releases] = yield* Effect.all([
410
- gh.getRepoInfo(),
411
- gh.runGhJson<LatestRelease[]>(args),
412
- ]);
413
-
414
- const result: ReleaseStatusResult = {
415
- latestRelease: releases.length > 0 ? releases[0] : null,
416
- repo: {
417
- owner: repoInfo.owner,
418
- name: repoInfo.name,
419
- defaultBranch: repoInfo.defaultBranch,
420
- url: repoInfo.url,
421
- },
422
- };
423
-
424
- return result;
425
- });
272
+ const releaseStatus = passthrough.releaseStatus;
426
273
 
427
274
  export const releaseCreateCommand = Command.make(
428
275
  "create",
@@ -2,88 +2,17 @@ import { Command, Flag } from "effect/cli";
2
2
  import { Effect, Option } from "effect";
3
3
 
4
4
  import { formatOption, logFormatted } from "#shared";
5
- import { GitHubCommandError } from "./errors";
6
- import { GitHubService } from "./service";
5
+ import { passthrough } from "./read/catalog";
6
+ import { GitHubService } from "./read/transport";
7
+ import { commitAuthor } from "./read/commits";
8
+ import { resolveRepo } from "./read/reads";
7
9
 
8
10
  // ---------------------------------------------------------------------------
9
11
  // Types
10
12
  // ---------------------------------------------------------------------------
11
13
 
12
- type OrgRepo = {
13
- name: string;
14
- description: string | null;
15
- visibility: string;
16
- updatedAt: string;
17
- url: string;
18
- isArchived: boolean;
19
- };
20
-
21
- type CodeSearchResponse = {
22
- items: Array<{
23
- repository: {
24
- full_name: string;
25
- };
26
- path: string;
27
- html_url: string;
28
- }>;
29
- };
30
-
31
- // ---------------------------------------------------------------------------
32
- // Internal handlers
33
- // ---------------------------------------------------------------------------
34
-
35
- const listOrgRepos = Effect.fn("repo.listOrgRepos")(function* (opts: {
36
- org: string;
37
- limit: number;
38
- visibility: string | null;
39
- }) {
40
- const gh = yield* GitHubService;
41
-
42
- const args = [
43
- "repo",
44
- "list",
45
- opts.org,
46
- "--json",
47
- "name,description,visibility,updatedAt,url,isArchived",
48
- "--limit",
49
- String(opts.limit),
50
- ];
51
-
52
- if (opts.visibility !== null) {
53
- args.push("--visibility", opts.visibility);
54
- }
55
-
56
- return yield* gh.runGhJson<OrgRepo[]>(args);
57
- });
58
-
59
- const searchOrgCode = Effect.fn("repo.searchOrgCode")(function* (opts: {
60
- org: string;
61
- query: string;
62
- limit: number;
63
- }) {
64
- const gh = yield* GitHubService;
65
-
66
- const trimmedQuery = opts.query.trim();
67
- if (trimmedQuery.length === 0) {
68
- return yield* new GitHubCommandError({
69
- message: "Search query cannot be empty",
70
- command: "repo search-code",
71
- exitCode: 1,
72
- stderr: "Search query cannot be empty",
73
- });
74
- }
75
-
76
- const searchQuery = encodeURIComponent(`${trimmedQuery} org:${opts.org}`);
77
- const args = ["api", `/search/code?q=${searchQuery}&per_page=${opts.limit}`];
78
-
79
- const response = yield* gh.runGhJson<CodeSearchResponse>(args);
80
-
81
- return response.items.map((item) => ({
82
- repo: item.repository.full_name,
83
- path: item.path,
84
- url: item.html_url,
85
- }));
86
- });
14
+ const listOrgRepos = passthrough.listOrgRepos;
15
+ const searchOrgCode = passthrough.searchOrgCode;
87
16
 
88
17
  // ---------------------------------------------------------------------------
89
18
  // CLI Commands
@@ -94,6 +23,25 @@ const repoOption = Flag.String("repo").pipe(
94
23
  Flag.optional,
95
24
  );
96
25
 
26
+ export const repoCommitAuthorCommand = Command.make(
27
+ "commit-author",
28
+ {
29
+ sha: Flag.String("sha").pipe(Flag.withDescription("Commit SHA")),
30
+ repo: repoOption,
31
+ format: formatOption,
32
+ },
33
+ ({ sha, repo, format }) =>
34
+ Effect.gen(function* () {
35
+ const gh = yield* GitHubService;
36
+ yield* gh.withRepoTarget(
37
+ Option.getOrNull(repo),
38
+ Effect.gen(function* () {
39
+ yield* logFormatted(yield* commitAuthor(yield* resolveRepo(null), sha), format);
40
+ }),
41
+ );
42
+ }),
43
+ ).pipe(Command.withDescription("Look up a commit's GitHub author through the shared read cache"));
44
+
97
45
  export const repoInfoCommand = Command.make(
98
46
  "info",
99
47
  { format: formatOption, repo: repoOption },
@@ -103,7 +51,7 @@ export const repoInfoCommand = Command.make(
103
51
  yield* gh.withRepoTarget(
104
52
  Option.getOrNull(repo),
105
53
  Effect.gen(function* () {
106
- const info = yield* gh.getRepoInfo();
54
+ const info = yield* passthrough.repoInfo();
107
55
  yield* logFormatted(info, format);
108
56
  }),
109
57
  );
@@ -184,7 +184,7 @@ export type RerunCheckJob = {
184
184
  export type RerunCheckAttempt = {
185
185
  databaseId: number;
186
186
  attempt?: number | null;
187
- jobs: RerunCheckJob[];
187
+ jobs: readonly RerunCheckJob[];
188
188
  status?: string;
189
189
  };
190
190