@fuzdev/fuz_gitops 0.78.1 → 0.79.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 (179) hide show
  1. package/README.md +78 -24
  2. package/dist/ModulesDetail.svelte +15 -22
  3. package/dist/ModulesDetail.svelte.d.ts.map +1 -1
  4. package/dist/ModulesNav.svelte +4 -1
  5. package/dist/ModulesPage.svelte +1 -3
  6. package/dist/ModulesPage.svelte.d.ts.map +1 -1
  7. package/dist/PageHeader.svelte +2 -2
  8. package/dist/PageHeader.svelte.d.ts +0 -3
  9. package/dist/PageHeader.svelte.d.ts.map +1 -1
  10. package/dist/PullRequestsDetail.svelte +10 -9
  11. package/dist/PullRequestsDetail.svelte.d.ts.map +1 -1
  12. package/dist/PullRequestsPage.svelte +1 -3
  13. package/dist/PullRequestsPage.svelte.d.ts.map +1 -1
  14. package/dist/ReposTable.svelte +27 -48
  15. package/dist/ReposTable.svelte.d.ts.map +1 -1
  16. package/dist/ReposTree.svelte +5 -19
  17. package/dist/ReposTree.svelte.d.ts.map +1 -1
  18. package/dist/ReposTreeNav.svelte +5 -7
  19. package/dist/ReposTreeNav.svelte.d.ts.map +1 -1
  20. package/dist/TablePage.svelte +1 -3
  21. package/dist/TablePage.svelte.d.ts.map +1 -1
  22. package/dist/TreeItemPage.svelte +1 -3
  23. package/dist/TreeItemPage.svelte.d.ts.map +1 -1
  24. package/dist/TreePage.svelte +1 -3
  25. package/dist/TreePage.svelte.d.ts.map +1 -1
  26. package/dist/ci_reconcile.d.ts +6 -10
  27. package/dist/ci_reconcile.d.ts.map +1 -1
  28. package/dist/ci_reconcile.js +6 -8
  29. package/dist/dependency_graph.d.ts +26 -49
  30. package/dist/dependency_graph.d.ts.map +1 -1
  31. package/dist/dependency_graph.js +37 -80
  32. package/dist/dependency_updater.d.ts +1 -1
  33. package/dist/dependency_updater.d.ts.map +1 -1
  34. package/dist/dependency_updater.js +6 -1
  35. package/dist/fetch_repo_data.d.ts +34 -8
  36. package/dist/fetch_repo_data.d.ts.map +1 -1
  37. package/dist/fetch_repo_data.js +44 -22
  38. package/dist/fs_fetch_value_cache.d.ts +1 -1
  39. package/dist/fs_fetch_value_cache.js +1 -1
  40. package/dist/git_operations.d.ts +6 -49
  41. package/dist/git_operations.d.ts.map +1 -1
  42. package/dist/git_operations.js +13 -126
  43. package/dist/github.d.ts +17 -2
  44. package/dist/github.d.ts.map +1 -1
  45. package/dist/github.js +15 -6
  46. package/dist/github_helpers.d.ts.map +1 -1
  47. package/dist/github_helpers.js +3 -11
  48. package/dist/gitops_analyze.task.d.ts +24 -2
  49. package/dist/gitops_analyze.task.d.ts.map +1 -1
  50. package/dist/gitops_analyze.task.js +43 -30
  51. package/dist/gitops_config.d.ts +34 -79
  52. package/dist/gitops_config.d.ts.map +1 -1
  53. package/dist/gitops_config.js +76 -53
  54. package/dist/gitops_constants.d.ts +6 -4
  55. package/dist/gitops_constants.d.ts.map +1 -1
  56. package/dist/gitops_constants.js +6 -4
  57. package/dist/gitops_plan.task.d.ts +29 -3
  58. package/dist/gitops_plan.task.d.ts.map +1 -1
  59. package/dist/gitops_plan.task.js +80 -58
  60. package/dist/gitops_publish.task.d.ts +62 -2
  61. package/dist/gitops_publish.task.d.ts.map +1 -1
  62. package/dist/gitops_publish.task.js +187 -102
  63. package/dist/gitops_run.task.d.ts +74 -0
  64. package/dist/gitops_run.task.d.ts.map +1 -1
  65. package/dist/gitops_run.task.js +174 -160
  66. package/dist/gitops_sync.task.d.ts +65 -3
  67. package/dist/gitops_sync.task.d.ts.map +1 -1
  68. package/dist/gitops_sync.task.js +154 -30
  69. package/dist/gitops_task_helpers.d.ts +86 -59
  70. package/dist/gitops_task_helpers.d.ts.map +1 -1
  71. package/dist/gitops_task_helpers.js +120 -79
  72. package/dist/gitops_validate.task.d.ts +1 -2
  73. package/dist/gitops_validate.task.d.ts.map +1 -1
  74. package/dist/gitops_validate.task.js +15 -22
  75. package/dist/graph_validation.d.ts +16 -27
  76. package/dist/graph_validation.d.ts.map +1 -1
  77. package/dist/graph_validation.js +23 -64
  78. package/dist/local_repo.d.ts +50 -62
  79. package/dist/local_repo.d.ts.map +1 -1
  80. package/dist/local_repo.js +80 -193
  81. package/dist/log_helpers.d.ts +8 -8
  82. package/dist/log_helpers.d.ts.map +1 -1
  83. package/dist/multi_repo_publisher.d.ts +10 -0
  84. package/dist/multi_repo_publisher.d.ts.map +1 -1
  85. package/dist/multi_repo_publisher.js +115 -51
  86. package/dist/npm_registry.d.ts +23 -19
  87. package/dist/npm_registry.d.ts.map +1 -1
  88. package/dist/npm_registry.js +20 -47
  89. package/dist/operations.d.ts +75 -180
  90. package/dist/operations.d.ts.map +1 -1
  91. package/dist/operations.js +15 -7
  92. package/dist/operations_defaults.d.ts +17 -2
  93. package/dist/operations_defaults.d.ts.map +1 -1
  94. package/dist/operations_defaults.js +104 -121
  95. package/dist/output_helpers.d.ts +36 -0
  96. package/dist/output_helpers.d.ts.map +1 -1
  97. package/dist/output_helpers.js +37 -3
  98. package/dist/preflight_checks.d.ts +20 -27
  99. package/dist/preflight_checks.d.ts.map +1 -1
  100. package/dist/preflight_checks.js +37 -126
  101. package/dist/publish_steps.d.ts +2 -4
  102. package/dist/publish_steps.d.ts.map +1 -1
  103. package/dist/publish_steps.js +2 -6
  104. package/dist/publishing_event.d.ts +2 -8
  105. package/dist/publishing_event.d.ts.map +1 -1
  106. package/dist/publishing_event.js +5 -4
  107. package/dist/publishing_event_handler.d.ts +10 -8
  108. package/dist/publishing_event_handler.d.ts.map +1 -1
  109. package/dist/publishing_event_handler.js +14 -12
  110. package/dist/publishing_plan.d.ts +16 -1
  111. package/dist/publishing_plan.d.ts.map +1 -1
  112. package/dist/publishing_plan.js +328 -250
  113. package/dist/publishing_plan_logging.d.ts +1 -1
  114. package/dist/publishing_plan_logging.d.ts.map +1 -1
  115. package/dist/publishing_plan_logging.js +21 -14
  116. package/dist/repo.svelte.d.ts +7 -0
  117. package/dist/repo.svelte.d.ts.map +1 -1
  118. package/dist/repo.svelte.js +3 -0
  119. package/dist/repo_readiness.d.ts +210 -0
  120. package/dist/repo_readiness.d.ts.map +1 -0
  121. package/dist/repo_readiness.js +516 -0
  122. package/dist/repos_status.d.ts +3340 -0
  123. package/dist/repos_status.d.ts.map +1 -0
  124. package/dist/repos_status.js +555 -0
  125. package/dist/repos_status_load.d.ts +65 -0
  126. package/dist/repos_status_load.d.ts.map +1 -0
  127. package/dist/repos_status_load.js +131 -0
  128. package/package.json +7 -27
  129. package/src/lib/ci_reconcile.ts +7 -11
  130. package/src/lib/dependency_graph.ts +45 -97
  131. package/src/lib/dependency_updater.ts +7 -1
  132. package/src/lib/fetch_repo_data.ts +66 -29
  133. package/src/lib/fs_fetch_value_cache.ts +1 -1
  134. package/src/lib/git_operations.ts +15 -187
  135. package/src/lib/github.ts +20 -8
  136. package/src/lib/github_helpers.ts +5 -12
  137. package/src/lib/gitops_analyze.task.ts +79 -41
  138. package/src/lib/gitops_config.ts +88 -137
  139. package/src/lib/gitops_constants.ts +6 -4
  140. package/src/lib/gitops_plan.task.ts +113 -61
  141. package/src/lib/gitops_publish.task.ts +255 -122
  142. package/src/lib/gitops_run.task.ts +250 -178
  143. package/src/lib/gitops_sync.task.ts +208 -33
  144. package/src/lib/gitops_task_helpers.ts +166 -110
  145. package/src/lib/gitops_validate.task.ts +17 -27
  146. package/src/lib/graph_validation.ts +25 -86
  147. package/src/lib/local_repo.ts +109 -316
  148. package/src/lib/log_helpers.ts +8 -18
  149. package/src/lib/multi_repo_publisher.ts +138 -53
  150. package/src/lib/npm_registry.ts +37 -62
  151. package/src/lib/operations.ts +78 -150
  152. package/src/lib/operations_defaults.ts +108 -154
  153. package/src/lib/output_helpers.ts +55 -3
  154. package/src/lib/preflight_checks.ts +47 -183
  155. package/src/lib/publish_steps.ts +15 -13
  156. package/src/lib/publishing_event.ts +5 -4
  157. package/src/lib/publishing_event_handler.ts +18 -16
  158. package/src/lib/publishing_plan.ts +451 -287
  159. package/src/lib/publishing_plan_logging.ts +32 -23
  160. package/src/lib/repo.svelte.ts +8 -0
  161. package/src/lib/repo_readiness.ts +647 -0
  162. package/src/lib/repos_status.ts +671 -0
  163. package/src/lib/repos_status_load.ts +173 -0
  164. package/dist/config_reconcile.d.ts +0 -46
  165. package/dist/config_reconcile.d.ts.map +0 -1
  166. package/dist/config_reconcile.js +0 -64
  167. package/dist/paths.d.ts +0 -7
  168. package/dist/paths.d.ts.map +0 -1
  169. package/dist/paths.js +0 -6
  170. package/dist/repo_ops.d.ts +0 -59
  171. package/dist/repo_ops.d.ts.map +0 -1
  172. package/dist/repo_ops.js +0 -170
  173. package/dist/resolved_gitops_config.d.ts +0 -9
  174. package/dist/resolved_gitops_config.d.ts.map +0 -1
  175. package/dist/resolved_gitops_config.js +0 -12
  176. package/src/lib/config_reconcile.ts +0 -98
  177. package/src/lib/paths.ts +0 -6
  178. package/src/lib/repo_ops.ts +0 -216
  179. package/src/lib/resolved_gitops_config.ts +0 -27
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repos_status.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/repos_status.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAAuD,CAAC;AACxF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,555 @@
1
+ /**
2
+ * Zod schemas for the `repos status --json` document, the report the Rust
3
+ * `repos` tool (`crates/fuz_repos`) prints, and the error document it prints
4
+ * in place of the report on a fatal error.
5
+ *
6
+ * The schemas mirror the Rust types by hand, each named as its Rust type
7
+ * prefixed `Repos` (`EntryStatus` is `ReposEntryStatus`), with fields as
8
+ * serde writes them: snake_case, a tagged enum as an object whose `kind`
9
+ * names its variant, an `Option` as `null` (never omitted), counts as
10
+ * integers, and times as unix seconds. A flattened enum's `kind`
11
+ * and payload sit beside its struct's own fields, so those structs are
12
+ * unions here (`ReposUnregisteredClone`, `ReposStatusErrorBody`) — or, for
13
+ * an enum with no payloads, an object whose `kind` is an enum
14
+ * (`ReposProbeError`). Where a
15
+ * Rust enum holds variants the status document never carries, the mirror
16
+ * leaves them out: `ReposFetchFailure` has no push rejection, and
17
+ * `ReposStatusErrorBody` holds only the errors `repos status --json` can
18
+ * print.
19
+ *
20
+ * Every object is strict and every union closed, so a field or variant the
21
+ * mirror doesn't know fails the parse. The Rust side bumps `version` on any
22
+ * change to the document's shape; a consumer checks it first, and on a
23
+ * mismatch reports both versions and how to install the binary this repo
24
+ * builds (`cargo install --path crates/fuz_repos --locked`) rather than a
25
+ * parse error.
26
+ *
27
+ * Drift is caught by the golden fixtures: a Rust test writes every status
28
+ * document shape to `src/test/fixtures/repos_status/`, covering every
29
+ * variant the status report and its error document can hold, and a TS test
30
+ * parses each with these schemas. The field semantics live in the Rust
31
+ * rustdoc and the JSON contract in `docs/repos.md`. The `repos sync --json`
32
+ * and `repos push --json` documents have no TS consumer and aren't
33
+ * mirrored here.
34
+ *
35
+ * @module
36
+ */
37
+ import { z } from 'zod';
38
+ /**
39
+ * The `repos status --json` document's format version, Rust's
40
+ * `STATUS_FORMAT_VERSION`: the one these schemas parse.
41
+ */
42
+ export const REPOS_STATUS_FORMAT_VERSION = 18;
43
+ // u32 and u64 on the Rust side
44
+ const Count = z.number().int().nonnegative();
45
+ const UnixSeconds = z.number().int().nonnegative().meta({ description: 'a time in unix seconds' });
46
+ // --- sessions ---
47
+ /** Where a live Claude Code session was recorded. */
48
+ export const ReposSessionSource = z.enum(['session_file', 'roster_worker']);
49
+ /** A live Claude Code session: its process, and where it works. */
50
+ export const ReposSession = z.strictObject({
51
+ pid: Count,
52
+ cwd: z.string(),
53
+ worktree: z.string().nullable(),
54
+ process_cwd: z.string().nullable(),
55
+ source: ReposSessionSource
56
+ });
57
+ /** Why busy detection can't vouch for every live session. */
58
+ export const ReposUnavailable = z.discriminatedUnion('kind', [
59
+ z.strictObject({ kind: z.literal('home_unknown') }),
60
+ z.strictObject({ kind: z.literal('relative_config_dir'), path: z.string() }),
61
+ z.strictObject({ kind: z.literal('unreadable'), path: z.string(), error: z.string() }),
62
+ z.strictObject({ kind: z.literal('unparseable'), path: z.string(), error: z.string() }),
63
+ z.strictObject({
64
+ kind: z.literal('foreign_pid_domain'),
65
+ path: z.string(),
66
+ pid_domain: z.string(),
67
+ source: ReposSessionSource
68
+ })
69
+ ]);
70
+ /** Busy detection as the report carries it. */
71
+ export const ReposSessions = z.discriminatedUnion('kind', [
72
+ z.strictObject({ kind: z.literal('available'), unscoped: z.array(ReposSession) }),
73
+ z.strictObject({ kind: z.literal('unavailable'), reason: ReposUnavailable })
74
+ ]);
75
+ // --- registry ---
76
+ /** Which registry table an entry comes from. */
77
+ export const ReposEntryKind = z.enum(['repo', 'reference']);
78
+ /** A repo's declared visibility on its host. */
79
+ export const ReposVisibility = z.enum(['public', 'private']);
80
+ /** A repo's list of the sibling checkouts it uses. */
81
+ export const ReposCheckoutList = z.enum(['requires', 'consults']);
82
+ /** An entry by table and key. */
83
+ export const ReposEntryName = z.strictObject({ kind: ReposEntryKind, key: z.string() });
84
+ /** A registry integrity rule broken. */
85
+ export const ReposRegistryIssue = z.discriminatedUnion('kind', [
86
+ z.strictObject({ kind: z.literal('repo_not_owned'), key: z.string(), account: z.string() }),
87
+ z.strictObject({ kind: z.literal('fork_not_owned'), key: z.string() }),
88
+ z.strictObject({ kind: z.literal('dir_not_a_name'), entry: ReposEntryName, dir: z.string() }),
89
+ z.strictObject({
90
+ kind: z.literal('dir_claimed_twice'),
91
+ dir: z.string(),
92
+ first: ReposEntryName,
93
+ second: ReposEntryName
94
+ }),
95
+ z.strictObject({ kind: z.literal('key_in_both'), key: z.string() }),
96
+ z.strictObject({ kind: z.literal('key_is_other_dir'), key: z.string(), entry: ReposEntryName }),
97
+ z.strictObject({
98
+ kind: z.literal('unknown_checkout_ref'),
99
+ key: z.string(),
100
+ field: ReposCheckoutList,
101
+ target: z.string()
102
+ }),
103
+ z.strictObject({ kind: z.literal('self_ref'), key: z.string(), field: ReposCheckoutList }),
104
+ z.strictObject({ kind: z.literal('requires_and_consults'), key: z.string(), target: z.string() })
105
+ ]);
106
+ // --- verdicts ---
107
+ /** What holds a branch's action back. */
108
+ export const ReposBranchHold = z.enum([
109
+ 'pinned',
110
+ 'entry',
111
+ 'push_url',
112
+ 'fetch_failed',
113
+ 'dirty_checkout',
114
+ 'unprobed_worktree',
115
+ 'several_checkouts',
116
+ 'busy',
117
+ 'busy_unknown'
118
+ ]);
119
+ /** What holds a reference's refresh back. */
120
+ export const ReposRefreshHold = z.enum(['pinned', 'entry', 'origin_not_https']);
121
+ /** What holds a missing entry's clone back. */
122
+ export const ReposCloneHold = z.enum(['entry', 'busy', 'unprobed_worktree']);
123
+ /** What a run does about refreshing a third-party reference or a pin. */
124
+ export const ReposRefreshVerdict = z.discriminatedUnion('kind', [
125
+ z.strictObject({ kind: z.literal('act') }),
126
+ z.strictObject({ kind: z.literal('held'), by: ReposRefreshHold })
127
+ ]);
128
+ /** Whether a repo is at the entry's dir. */
129
+ export const ReposPresence = z.discriminatedUnion('kind', [
130
+ z.strictObject({ kind: z.literal('present') }),
131
+ z.strictObject({ kind: z.literal('missing') }),
132
+ z.strictObject({ kind: z.literal('not_a_repo') })
133
+ ]);
134
+ /** How sync would clone a missing entry. */
135
+ export const ReposCloneRecipe = z.strictObject({
136
+ url: z.string(),
137
+ branch: z.string().nullable(),
138
+ shallow: z.boolean(),
139
+ sparse: z.string().nullable()
140
+ });
141
+ /** What sync does about a missing entry: clone it, or why not yet. */
142
+ export const ReposCloneVerdict = z.discriminatedUnion('kind', [
143
+ z.strictObject({ kind: z.literal('act'), recipe: ReposCloneRecipe }),
144
+ z.strictObject({ kind: z.literal('held'), recipe: ReposCloneRecipe, by: ReposCloneHold })
145
+ ]);
146
+ /** A sync action on a branch. */
147
+ export const ReposSyncAction = z.discriminatedUnion('kind', [
148
+ z.strictObject({ kind: z.literal('push'), commits: Count }),
149
+ z.strictObject({ kind: z.literal('fast_forward'), commits: Count }),
150
+ z.strictObject({ kind: z.literal('move') })
151
+ ]);
152
+ /** Why a branch is left to a person. */
153
+ export const ReposBranchNeedsHuman = z.enum([
154
+ 'diverged',
155
+ 'unmapped',
156
+ 'archived_ahead',
157
+ 'shallow_local_work',
158
+ 'upstream_not_a_branch'
159
+ ]);
160
+ /** Why a branch reads as cleanup. */
161
+ export const ReposCleanupReason = z.enum(['merged', 'upstream_gone']);
162
+ /** What sync does about a branch. */
163
+ export const ReposVerdict = z.discriminatedUnion('kind', [
164
+ z.strictObject({ kind: z.literal('quiet') }),
165
+ z.strictObject({ kind: z.literal('act'), action: ReposSyncAction }),
166
+ z.strictObject({ kind: z.literal('held'), action: ReposSyncAction, by: ReposBranchHold }),
167
+ z.strictObject({ kind: z.literal('needs_human'), reason: ReposBranchNeedsHuman }),
168
+ z.strictObject({ kind: z.literal('local_only') }),
169
+ z.strictObject({
170
+ kind: z.literal('cleanup'),
171
+ reason: ReposCleanupReason,
172
+ removable_worktree: z.string().nullable()
173
+ })
174
+ ]);
175
+ // --- checkouts and branches ---
176
+ /** A clone's shape: shallow, sparse, or partial. */
177
+ export const ReposLayout = z.strictObject({
178
+ shallow: z.boolean(),
179
+ sparse: z.boolean(),
180
+ partial_filter: z.string().nullable()
181
+ });
182
+ /**
183
+ * A checkout's HEAD: a probed checkout's, an unprobed worktree's, or an
184
+ * unlisted git dir's — the last two `null` when it can't be read.
185
+ */
186
+ export const ReposHead = z.discriminatedUnion('kind', [
187
+ z.strictObject({ kind: z.literal('branch'), name: z.string() }),
188
+ z.strictObject({ kind: z.literal('detached'), commit: z.string() })
189
+ ]);
190
+ /** A checkout's uncommitted work, by kind. */
191
+ export const ReposUncommitted = z.strictObject({
192
+ staged: Count,
193
+ unstaged: Count,
194
+ untracked: Count,
195
+ conflicted: Count
196
+ });
197
+ /** A git operation in progress. */
198
+ export const ReposInProgressOp = z.enum([
199
+ 'rebase',
200
+ 'merge',
201
+ 'cherry_pick',
202
+ 'revert',
203
+ 'bisect',
204
+ 'sequencer',
205
+ 'am'
206
+ ]);
207
+ /** One checkout of a repo: its primary, or a linked worktree probed. */
208
+ export const ReposCheckout = z.strictObject({
209
+ path: z.string(),
210
+ primary: z.boolean(),
211
+ head: ReposHead,
212
+ uncommitted: ReposUncommitted,
213
+ in_progress: ReposInProgressOp.nullable(),
214
+ locked: z.boolean(),
215
+ linked: z.boolean(),
216
+ submodules: z.boolean().nullable(),
217
+ busy: z.array(ReposSession)
218
+ });
219
+ /** A branch's relation to its upstream. */
220
+ export const ReposRelation = z.discriminatedUnion('kind', [
221
+ z.strictObject({ kind: z.literal('in_sync') }),
222
+ z.strictObject({ kind: z.literal('ahead'), commits: Count }),
223
+ z.strictObject({ kind: z.literal('behind'), commits: Count }),
224
+ z.strictObject({ kind: z.literal('diverged'), ahead: Count, behind: Count }),
225
+ z.strictObject({ kind: z.literal('shallow') }),
226
+ z.strictObject({ kind: z.literal('gone') }),
227
+ z.strictObject({ kind: z.literal('unmapped') }),
228
+ z.strictObject({ kind: z.literal('untracked') })
229
+ ]);
230
+ /** One local branch and its verdict. */
231
+ export const ReposBranchStatus = z.strictObject({
232
+ name: z.string(),
233
+ upstream: z.string().nullable(),
234
+ worktree: z.string().nullable(),
235
+ symref: z.string().nullable(),
236
+ unique_commits: Count,
237
+ newest_commit_at: UnixSeconds,
238
+ relation: ReposRelation,
239
+ verdict: ReposVerdict
240
+ });
241
+ /** Whether an entry's primary checkout sits where the registry puts it. */
242
+ export const ReposAtRest = z.strictObject({
243
+ on_branch: z.boolean().nullable(),
244
+ clean: z.boolean(),
245
+ idle: z.boolean(),
246
+ followed: ReposRelation.nullable()
247
+ });
248
+ // --- worktrees not probed ---
249
+ /** Why a worktree wasn't probed. */
250
+ export const ReposUnprobedWhy = z.discriminatedUnion('kind', [
251
+ z.strictObject({ kind: z.literal('prunable') }),
252
+ z.strictObject({ kind: z.literal('missing') }),
253
+ z.strictObject({ kind: z.literal('failed'), error: z.string() })
254
+ ]);
255
+ /** What an unprobed worktree's git dir holds that a prune would lose. */
256
+ export const ReposGitDirHolds = z.strictObject({
257
+ submodules: z.boolean(),
258
+ worktree_refs: z.boolean(),
259
+ staged: z.boolean().nullable()
260
+ });
261
+ /** What pruning an unprobed worktree would lose. */
262
+ export const ReposPruneLoss = z.discriminatedUnion('kind', [
263
+ z.strictObject({ kind: z.literal('operation'), op: ReposInProgressOp }),
264
+ z.strictObject({ kind: z.literal('detached_head') }),
265
+ z.strictObject({ kind: z.literal('unknown_head') }),
266
+ z.strictObject({ kind: z.literal('missing_branch'), name: z.string() }),
267
+ z.strictObject({ kind: z.literal('submodules') }),
268
+ z.strictObject({ kind: z.literal('worktree_refs') }),
269
+ z.strictObject({ kind: z.literal('staged_changes') }),
270
+ z.strictObject({ kind: z.literal('unmatched_git_dir') }),
271
+ z.strictObject({ kind: z.literal('relative_gitdir'), git_dir: z.string() })
272
+ ]);
273
+ /** Whether pruning an unprobed worktree is safe. */
274
+ export const ReposPrune = z.discriminatedUnion('kind', [
275
+ z.strictObject({ kind: z.literal('safe') }),
276
+ z.strictObject({ kind: z.literal('loses'), losses: z.array(ReposPruneLoss) }),
277
+ z.strictObject({ kind: z.literal('moved'), to: z.array(z.string()) })
278
+ ]);
279
+ /** A worktree of the repo that couldn't be probed. */
280
+ export const ReposUnprobedWorktree = z.strictObject({
281
+ path: z.string(),
282
+ git_dir: z.string().nullable(),
283
+ head: ReposHead.nullable().meta({ description: 'null when its HEAD cannot be read' }),
284
+ locked: z.boolean(),
285
+ in_progress: ReposInProgressOp.nullable(),
286
+ why: ReposUnprobedWhy,
287
+ holds: ReposGitDirHolds.nullable()
288
+ });
289
+ /** An unprobed worktree (flattened) with its prune verdict and live sessions. */
290
+ export const ReposUnprobedWorktreeStatus = ReposUnprobedWorktree.extend({
291
+ prune: ReposPrune.nullable(),
292
+ busy: z.array(ReposSession)
293
+ });
294
+ // --- remotes ---
295
+ /** The `origin` remote as git sees it, when it isn't the registry's `url`. */
296
+ export const ReposOriginRemote = z.discriminatedUnion('kind', [
297
+ z.strictObject({ kind: z.literal('url'), url: z.string() }),
298
+ z.strictObject({ kind: z.literal('no_url') }),
299
+ z.strictObject({ kind: z.literal('missing') })
300
+ ]);
301
+ /** Why no `git remote` command fits an origin's fix. */
302
+ export const ReposOriginByHand = z.enum([
303
+ 'outside_repo_file',
304
+ 'valueless_url',
305
+ 'empty_value',
306
+ 'several_urls'
307
+ ]);
308
+ /** How to point `origin` at the registry's URL. */
309
+ export const ReposOriginFix = z.discriminatedUnion('kind', [
310
+ z.strictObject({ kind: z.literal('add') }),
311
+ z.strictObject({ kind: z.literal('set_url') }),
312
+ z.strictObject({ kind: z.literal('by_hand'), reason: ReposOriginByHand })
313
+ ]);
314
+ /** Why a remote couldn't be reached. */
315
+ export const ReposUnreachableCause = z.enum(['dns', 'connection', 'host_key', 'auth']);
316
+ /** How to repair a fetch refspec naming a ref gone from origin. */
317
+ export const ReposRefGoneFix = z.discriminatedUnion('kind', [
318
+ z.strictObject({ kind: z.literal('unset_refspec'), pattern: z.string() }),
319
+ z.strictObject({ kind: z.literal('set_branches'), branch: z.string().nullable() }),
320
+ z.strictObject({ kind: z.literal('by_hand') })
321
+ ]);
322
+ /**
323
+ * Why a fetch or the visibility check failed, or why the tool refused to
324
+ * fetch: Rust's `RemoteFailure` without `rejected`, which only a push meets.
325
+ */
326
+ export const ReposFetchFailure = z.discriminatedUnion('kind', [
327
+ z.strictObject({ kind: z.literal('ref_gone'), refname: z.string(), fix: ReposRefGoneFix }),
328
+ z.strictObject({
329
+ kind: z.literal('unreachable'),
330
+ cause: ReposUnreachableCause,
331
+ message: z.string()
332
+ }),
333
+ z.strictObject({ kind: z.literal('repo_not_found'), message: z.string() }),
334
+ z.strictObject({
335
+ kind: z.literal('timed_out'),
336
+ after_secs: Count.meta({ description: "the runner's timeout in seconds" })
337
+ }),
338
+ z.strictObject({ kind: z.literal('failed'), message: z.string() }),
339
+ z.strictObject({ kind: z.literal('refspec_outside_origin'), refspec: z.string() }),
340
+ z.strictObject({
341
+ kind: z.literal('origin_refs_shared'),
342
+ remote: z.string(),
343
+ refspec: z.string()
344
+ }),
345
+ z.strictObject({ kind: z.literal('legacy_remotes_unreadable'), path: z.string() })
346
+ ]);
347
+ /** What an anonymous read of a repo declared private found. */
348
+ export const ReposVisibilityCheck = z.discriminatedUnion('kind', [
349
+ z.strictObject({ kind: z.literal('leak') }),
350
+ z.strictObject({ kind: z.literal('private') }),
351
+ z.strictObject({ kind: z.literal('unknown'), failure: ReposFetchFailure })
352
+ ]);
353
+ // --- entries ---
354
+ /** What kind of failure stopped an entry's probe. */
355
+ export const ReposProbeErrorKind = z.enum([
356
+ 'path_unreadable',
357
+ 'non_utf8_path',
358
+ 'config_unreadable',
359
+ 'fetch_url_unreadable',
360
+ 'push_urls_unreadable',
361
+ 'git_not_run',
362
+ 'git_timed_out',
363
+ 'git_failed',
364
+ 'unexpected_output'
365
+ ]);
366
+ /** Why an entry's probe failed: its kind, and a message for display. */
367
+ export const ReposProbeError = z.strictObject({
368
+ kind: ReposProbeErrorKind,
369
+ message: z.string()
370
+ });
371
+ /** Why sync would stop on an entry and leave it to a person. */
372
+ export const ReposNeedsHuman = z.discriminatedUnion('kind', [
373
+ z.strictObject({ kind: z.literal('not_a_repo'), detail: z.string() }),
374
+ z.strictObject({
375
+ kind: z.literal('operation_in_progress'),
376
+ checkout: z.string(),
377
+ op: ReposInProgressOp
378
+ }),
379
+ z.strictObject({
380
+ kind: z.literal('origin_mismatch'),
381
+ origin: ReposOriginRemote,
382
+ expected: z.string(),
383
+ fix: ReposOriginFix
384
+ }),
385
+ z.strictObject({
386
+ kind: z.literal('origin_not_https'),
387
+ fetch_url: z.string(),
388
+ expected: z.string(),
389
+ fix: ReposOriginFix.nullable()
390
+ }),
391
+ z.strictObject({
392
+ kind: z.literal('fetch_url_mismatch'),
393
+ fetch_url: z.string(),
394
+ expected: z.string(),
395
+ fix: ReposOriginFix.nullable()
396
+ }),
397
+ z.strictObject({ kind: z.literal('worktree_unreadable'), path: z.string() }),
398
+ z.strictObject({ kind: z.literal('default_branch_missing'), branch: z.string() }),
399
+ z.strictObject({ kind: z.literal('default_branch_no_upstream'), branch: z.string() }),
400
+ z.strictObject({ kind: z.literal('default_branch_gone'), branch: z.string() }),
401
+ z.strictObject({ kind: z.literal('unexpected_detached'), checkout: z.string() }),
402
+ z.strictObject({
403
+ kind: z.literal('checkout_unresolvable'),
404
+ checkout: z.string(),
405
+ path: z.string(),
406
+ error: z.string()
407
+ }),
408
+ z.strictObject({
409
+ kind: z.literal('unlisted_git_dir'),
410
+ git_dir: z.string(),
411
+ head: ReposHead.nullable().meta({ description: 'null when its HEAD cannot be read' }),
412
+ busy: z.array(ReposSession)
413
+ }),
414
+ z.strictObject({
415
+ kind: z.literal('push_url_mismatch'),
416
+ push_urls: z.array(z.string()),
417
+ expected: z.string()
418
+ }),
419
+ z.strictObject({ kind: z.literal('clone_shares_repo'), with: z.string() }),
420
+ z.strictObject({ kind: z.literal('cloned_unregistered'), dir: z.string() })
421
+ ]);
422
+ /** One registry entry's state. */
423
+ export const ReposEntryStatus = z.strictObject({
424
+ key: z.string(),
425
+ kind: ReposEntryKind,
426
+ dir: z.string(),
427
+ url: z.string(),
428
+ writable: z.boolean(),
429
+ archived: z.boolean(),
430
+ visibility: ReposVisibility.nullable(),
431
+ ci: z.boolean(),
432
+ branch: z.string().nullable(),
433
+ pinned: z.boolean(),
434
+ refresh: ReposRefreshVerdict.nullable(),
435
+ presence: ReposPresence,
436
+ clone: ReposCloneVerdict.nullable(),
437
+ layout: ReposLayout.nullable(),
438
+ checkouts: z.array(ReposCheckout),
439
+ branches: z.array(ReposBranchStatus),
440
+ at_rest: ReposAtRest.nullable(),
441
+ stashes: Count,
442
+ fetched_at: UnixSeconds.nullable(),
443
+ needs_human: z.array(ReposNeedsHuman),
444
+ probe_error: ReposProbeError.nullable(),
445
+ unprobed_worktrees: z.array(ReposUnprobedWorktreeStatus),
446
+ fetch_error: ReposFetchFailure.nullable(),
447
+ visibility_check: ReposVisibilityCheck.nullable()
448
+ });
449
+ // --- unregistered clones ---
450
+ /** What keeps a moved worktree's repair from being offered. */
451
+ export const ReposRepairBlock = z.discriminatedUnion('kind', [
452
+ z.strictObject({ kind: z.literal('rewrites'), path: z.string(), git_dir: z.string() }),
453
+ z.strictObject({ kind: z.literal('claimed_dir'), git_dir: z.string() }),
454
+ z.strictObject({ kind: z.literal('swapped'), git_dir: z.string(), with: z.string() }),
455
+ z.strictObject({ kind: z.literal('relative_gitdir'), git_dir: z.string() }),
456
+ z.strictObject({ kind: z.literal('unreadable_gitdir'), git_dir: z.string() }),
457
+ z.strictObject({ kind: z.literal('non_utf8_path') }),
458
+ z.strictObject({ kind: z.literal('nul_in_gitdir'), git_dir: z.string() })
459
+ ]);
460
+ // `UnregisteredClone`'s own fields, beside its flattened `UnregisteredKind`
461
+ const unregistered_clone_fields = {
462
+ dir: z.string(),
463
+ origin: z.string().nullable(),
464
+ owned: z.boolean()
465
+ };
466
+ /**
467
+ * A child of the workspace root holding a `.git` that no registry entry
468
+ * claims, its `kind` flattened beside its own fields.
469
+ */
470
+ export const ReposUnregisteredClone = z.discriminatedUnion('kind', [
471
+ z.strictObject({ ...unregistered_clone_fields, kind: z.literal('clone') }),
472
+ z.strictObject({ ...unregistered_clone_fields, kind: z.literal('worktree') }),
473
+ z.strictObject({
474
+ ...unregistered_clone_fields,
475
+ kind: z.literal('moved_worktree'),
476
+ entry: z.string(),
477
+ blocked_by: ReposRepairBlock.nullable(),
478
+ exit_noise: z.string().nullable()
479
+ }),
480
+ z.strictObject({
481
+ ...unregistered_clone_fields,
482
+ kind: z.literal('orphaned_worktree'),
483
+ entry: z.string()
484
+ }),
485
+ z.strictObject({
486
+ ...unregistered_clone_fields,
487
+ kind: z.literal('shared_git_dir'),
488
+ entry: z.string(),
489
+ with: z.string().nullable()
490
+ }),
491
+ z.strictObject({ ...unregistered_clone_fields, kind: z.literal('unfinished_clone') })
492
+ ]);
493
+ // --- the documents ---
494
+ /** The `repos status --json` report. */
495
+ export const ReposStatusReport = z.strictObject({
496
+ version: z.literal(REPOS_STATUS_FORMAT_VERSION),
497
+ workspace: z.string(),
498
+ registry: z.string(),
499
+ fetched: z.boolean(),
500
+ sessions: ReposSessions,
501
+ entries: z.array(ReposEntryStatus),
502
+ unregistered: z
503
+ .array(ReposUnregisteredClone)
504
+ .nullable()
505
+ .meta({ description: 'null when the scan did not run (a run with targets)' })
506
+ });
507
+ // `ErrorBody`'s own fields, beside its flattened `ErrorKind`
508
+ const error_body_fields = {
509
+ message: z.string(),
510
+ hint: z.string().nullable()
511
+ };
512
+ /**
513
+ * A fatal error as `repos status --json` prints it, its `kind` flattened
514
+ * beside `message` and `hint`. Only the kinds `status` can print: the rest
515
+ * of Rust's `ErrorKind` are `repos push`'s, or precede knowing `--json`.
516
+ */
517
+ export const ReposStatusErrorBody = z.discriminatedUnion('kind', [
518
+ z.strictObject({ ...error_body_fields, kind: z.literal('references_with_targets') }),
519
+ z.strictObject({ ...error_body_fields, kind: z.literal('root_not_found') }),
520
+ z.strictObject({ ...error_body_fields, kind: z.literal('registry_not_found') }),
521
+ z.strictObject({ ...error_body_fields, kind: z.literal('root_in_entry'), key: z.string() }),
522
+ z.strictObject({ ...error_body_fields, kind: z.literal('registry_read') }),
523
+ z.strictObject({ ...error_body_fields, kind: z.literal('registry_parse') }),
524
+ z.strictObject({
525
+ ...error_body_fields,
526
+ kind: z.literal('registry_invalid'),
527
+ issues: z.array(ReposRegistryIssue)
528
+ }),
529
+ z.strictObject({ ...error_body_fields, kind: z.literal('git_not_found') }),
530
+ z.strictObject({
531
+ ...error_body_fields,
532
+ kind: z.literal('git_too_old'),
533
+ found: z.string(),
534
+ required: z.string()
535
+ }),
536
+ z.strictObject({
537
+ ...error_body_fields,
538
+ kind: z.literal('unknown_entry'),
539
+ name: z.string(),
540
+ suggestions: z.array(z.string())
541
+ }),
542
+ z.strictObject({ ...error_body_fields, kind: z.literal('io') })
543
+ ]);
544
+ /** The document `repos status --json` prints on a fatal error, in place of the report. */
545
+ export const ReposStatusErrorReport = z.strictObject({
546
+ version: z.literal(REPOS_STATUS_FORMAT_VERSION),
547
+ error: ReposStatusErrorBody
548
+ });
549
+ /**
550
+ * Either document `repos status --json` prints. No tag is needed: `error`
551
+ * is the error document's alone, and each side's strictness refuses the
552
+ * other's fields. A consumer wanting a sharper parse error branches on
553
+ * `error` first and parses with that side's schema.
554
+ */
555
+ export const ReposStatusDocument = z.union([ReposStatusReport, ReposStatusErrorReport]);
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Reads fleet git state from the Rust `repos` binary: runs
3
+ * `repos status <keys…> --json` through the injected `ReposOperations` and
4
+ * parses what it printed with the `repos_status.ts` mirror.
5
+ *
6
+ * Parsing is pure (`parse_repos_status_output`): the format version is read
7
+ * first, so a binary and npm package out of step fail with both versions and
8
+ * the install command rather than a schema error; then the document is parsed
9
+ * strictly as a report or, when it carries `error`, as an error document,
10
+ * whose kind maps to a message saying what to change.
11
+ *
12
+ * @module
13
+ */
14
+ import type { Result } from '@fuzdev/fuz_util/result.ts';
15
+ import { ReposStatusReport, type ReposStatusErrorBody } from './repos_status.js';
16
+ import type { ReposCommandOutput, ReposOperations } from './operations.js';
17
+ /**
18
+ * How to install the `repos` binary, run in a `fuz_repos` checkout. The npm
19
+ * package doesn't carry the binary, so the two are installed separately.
20
+ */
21
+ export declare const REPOS_INSTALL_COMMAND = "cargo install --path crates/fuz_repos --locked";
22
+ /**
23
+ * The `repos` invocation a suggested fix names: `repos`, or `repos --registry
24
+ * <path>` when the run passed one, the path POSIX-shell-quoted when it needs it.
25
+ *
26
+ * @param registry - the run's `--registry`, if any
27
+ * @returns the command prefix, ready for a subcommand
28
+ */
29
+ export declare const to_repos_command: (registry: string | undefined) => string;
30
+ /**
31
+ * Why `repos status` gave no report: a message saying what to change, and the
32
+ * error document when `repos` printed one.
33
+ */
34
+ export interface ReposStatusLoadFailure {
35
+ message: string;
36
+ error?: ReposStatusErrorBody;
37
+ }
38
+ /**
39
+ * Parses what `repos status --json` printed into its report, or a message
40
+ * saying what went wrong and what to change.
41
+ *
42
+ * @param output - the command's stdout, stderr, and exit code
43
+ * @returns the report, or a message naming the error document's kind and hint, a format version mismatch, or output that isn't a status document; an error document rides along as `error`
44
+ */
45
+ export declare const parse_repos_status_output: (output: ReposCommandOutput) => Result<{
46
+ report: ReposStatusReport;
47
+ }, ReposStatusLoadFailure>;
48
+ /**
49
+ * Runs `repos status <keys…> --json` and parses its report.
50
+ *
51
+ * @param options.keys - the registry keys to report on; must not be empty, since no targets means every entry
52
+ * @param options.registry - a `repos.toml` to use instead of the one found walking up from the cwd
53
+ * @param options.fetch - fetch each entry from origin first (`--fetch`), which writes remote-tracking refs and nothing else
54
+ * @param options.repos_ops - the `repos` runner
55
+ * @returns the report, or a message saying what went wrong and what to change
56
+ */
57
+ export declare const load_repos_status: (options: {
58
+ keys: Array<string>;
59
+ registry?: string;
60
+ fetch?: boolean;
61
+ repos_ops: ReposOperations;
62
+ }) => Promise<Result<{
63
+ report: ReposStatusReport;
64
+ }, ReposStatusLoadFailure>>;
65
+ //# sourceMappingURL=repos_status_load.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repos_status_load.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/repos_status_load.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGzD,OAAO,EAGN,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE3E;;;GAGG;AACH,eAAO,MAAM,qBAAqB,mDAAmD,CAAC;AAEtF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,GAAG,SAAS,KAAG,MACe,CAAC;AAKhF;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,GACrC,QAAQ,kBAAkB,KACxB,MAAM,CAAC;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,EAAE,sBAAsB,CAyD9D,CAAC;AAsBF;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAAU,SAAS;IAChD,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,eAAe,CAAC;CAC3B,KAAG,OAAO,CAAC,MAAM,CAAC;IAAE,MAAM,EAAE,iBAAiB,CAAA;CAAE,EAAE,sBAAsB,CAAC,CAiBxE,CAAC"}