@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,142 +0,0 @@
1
- import { Context } from "effect";
2
- import { createHash, randomUUID } from "node:crypto";
3
- import { chmod, mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
4
- import { homedir } from "node:os";
5
- import { join } from "node:path";
6
-
7
- import type { CheckResult } from "#gh/types";
8
-
9
- const CACHE_TTL_MS = 30_000;
10
- const WATCH_PENDING_TTL_MS = 5_000;
11
- const CACHE_DIR = join(homedir(), ".cache", "agent-tools", "gh-check-status-v1");
12
-
13
- export const CheckStatusCacheDirectory = Context.Reference<string | undefined>(
14
- "@agent-tools/CheckStatusCacheDirectory",
15
- { defaultValue: () => CACHE_DIR },
16
- );
17
-
18
- type CacheEntry = { fetchedAt: number; checks: CheckResult[] };
19
-
20
- const keyFor = (identity: string, repo: string, pr: number, headSha: string) =>
21
- createHash("sha256")
22
- .update(`${identity}\n${repo.toLowerCase()}\n${pr}\n${headSha}`)
23
- .digest("hex");
24
-
25
- const validChecks = (value: unknown): value is CheckResult[] =>
26
- Array.isArray(value) &&
27
- value.every(
28
- (item) =>
29
- item !== null &&
30
- typeof item === "object" &&
31
- typeof item.name === "string" &&
32
- typeof item.state === "string" &&
33
- typeof item.bucket === "string" &&
34
- typeof item.link === "string",
35
- );
36
-
37
- export const readCheckStatusCache = async (
38
- identity: string,
39
- repo: string,
40
- pr: number,
41
- headSha: string,
42
- now: number,
43
- watchPending = false,
44
- directory = CACHE_DIR,
45
- ): Promise<CheckResult[] | null> => {
46
- try {
47
- const prefix = keyFor(identity, repo, pr, headSha);
48
- const files = (await readdir(directory)).filter((name) => name.startsWith(`${prefix}.`));
49
- let latest: CacheEntry | null = null;
50
- const entries = await Promise.all(
51
- files.map(async (name) => {
52
- try {
53
- return {
54
- name,
55
- value: JSON.parse(await readFile(join(directory, name), "utf8")) as unknown,
56
- };
57
- } catch {
58
- return { name, value: null };
59
- }
60
- }),
61
- );
62
- const staleFiles: string[] = [];
63
- for (const { name, value: entry } of entries) {
64
- if (!name.endsWith(".json")) continue;
65
- if (entry === null || typeof entry !== "object") continue;
66
- const candidate = entry as Partial<CacheEntry>;
67
- const fetchedAt = candidate.fetchedAt;
68
- if (
69
- typeof fetchedAt !== "number" ||
70
- !Number.isFinite(fetchedAt) ||
71
- !validChecks(candidate.checks) ||
72
- candidate.checks.length === 0
73
- ) {
74
- staleFiles.push(join(directory, name));
75
- continue;
76
- }
77
- if (fetchedAt > now || now - fetchedAt > CACHE_TTL_MS) {
78
- staleFiles.push(join(directory, name));
79
- continue;
80
- }
81
- if (watchPending && !candidate.checks.some((check) => check.bucket === "pending")) continue;
82
- if (latest === null || fetchedAt > latest.fetchedAt)
83
- latest = { fetchedAt, checks: candidate.checks };
84
- }
85
- await Promise.all(staleFiles.map((path) => rm(path, { force: true }).catch(() => undefined)));
86
- if (latest === null || (watchPending && now - latest.fetchedAt > WATCH_PENDING_TTL_MS))
87
- return null;
88
- return latest.checks;
89
- } catch {
90
- return null;
91
- }
92
- };
93
-
94
- export const writeCheckStatusCache = async (
95
- identity: string,
96
- repo: string,
97
- pr: number,
98
- headSha: string,
99
- checks: CheckResult[],
100
- fetchedAt: number,
101
- directory = CACHE_DIR,
102
- ): Promise<void> => {
103
- if (checks.length === 0) return;
104
- try {
105
- await mkdir(directory, { recursive: true, mode: 0o700 });
106
- await chmod(directory, 0o700);
107
- await Promise.all(
108
- (await readdir(directory))
109
- .filter((name) => name.endsWith(".json"))
110
- .map(async (name) => {
111
- const path = join(directory, name);
112
- try {
113
- const entry: unknown = JSON.parse(await readFile(path, "utf8"));
114
- if (
115
- entry !== null &&
116
- typeof entry === "object" &&
117
- "fetchedAt" in entry &&
118
- typeof entry.fetchedAt === "number" &&
119
- Number.isFinite(entry.fetchedAt) &&
120
- fetchedAt - entry.fetchedAt <= CACHE_TTL_MS
121
- )
122
- return;
123
- await rm(path, { force: true });
124
- } catch {
125
- /* Another writer can remove a stale snapshot first. */
126
- }
127
- }),
128
- );
129
- const prefix = keyFor(identity, repo, pr, headSha);
130
- const temporary = join(directory, `${prefix}.${process.pid}.${randomUUID()}.tmp`);
131
- const destination = join(
132
- directory,
133
- `${prefix}.${fetchedAt}.${process.pid}.${randomUUID()}.json`,
134
- );
135
- await writeFile(temporary, JSON.stringify({ fetchedAt, checks } satisfies CacheEntry), {
136
- mode: 0o600,
137
- });
138
- await rename(temporary, destination);
139
- } catch {
140
- // A cache write must never replace a successful GitHub response with an error.
141
- }
142
- };