@fuzdev/fuz_gitops 0.72.0 → 0.74.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 +15 -8
- package/dist/PageHeader.svelte +3 -3
- package/dist/PageHeader.svelte.d.ts +3 -3
- package/dist/PageHeader.svelte.d.ts.map +1 -1
- package/dist/changeset_generator.d.ts.map +1 -1
- package/dist/changeset_generator.js +2 -16
- package/dist/changeset_reader.d.ts +1 -1
- package/dist/changeset_reader.d.ts.map +1 -1
- package/dist/changeset_reader.js +1 -1
- package/dist/dependency_graph.d.ts.map +1 -1
- package/dist/dependency_graph.js +6 -6
- package/dist/fetch_repo_data.d.ts.map +1 -1
- package/dist/fetch_repo_data.js +3 -2
- package/dist/git_operations.d.ts +5 -0
- package/dist/git_operations.d.ts.map +1 -1
- package/dist/git_operations.js +5 -0
- package/dist/gitops_analyze.task.d.ts +1 -0
- package/dist/gitops_analyze.task.d.ts.map +1 -1
- package/dist/gitops_analyze.task.js +12 -17
- package/dist/gitops_plan.task.d.ts +1 -0
- package/dist/gitops_plan.task.d.ts.map +1 -1
- package/dist/gitops_plan.task.js +9 -2
- package/dist/gitops_publish.task.d.ts +2 -2
- package/dist/gitops_publish.task.d.ts.map +1 -1
- package/dist/gitops_publish.task.js +83 -28
- package/dist/gitops_run.task.d.ts +2 -1
- package/dist/gitops_run.task.d.ts.map +1 -1
- package/dist/gitops_run.task.js +40 -7
- package/dist/gitops_sync.task.d.ts +1 -0
- package/dist/gitops_sync.task.d.ts.map +1 -1
- package/dist/gitops_sync.task.js +16 -2
- package/dist/gitops_task_helpers.d.ts +16 -2
- package/dist/gitops_task_helpers.d.ts.map +1 -1
- package/dist/gitops_task_helpers.js +11 -3
- package/dist/gitops_validate.task.d.ts +1 -0
- package/dist/gitops_validate.task.d.ts.map +1 -1
- package/dist/gitops_validate.task.js +20 -20
- package/dist/graph_validation.d.ts +16 -1
- package/dist/graph_validation.d.ts.map +1 -1
- package/dist/graph_validation.js +15 -0
- package/dist/local_repo.d.ts +25 -12
- package/dist/local_repo.d.ts.map +1 -1
- package/dist/local_repo.js +99 -79
- package/dist/log_helpers.d.ts +0 -5
- package/dist/log_helpers.d.ts.map +1 -1
- package/dist/log_helpers.js +8 -19
- package/dist/multi_repo_publisher.d.ts +21 -2
- package/dist/multi_repo_publisher.d.ts.map +1 -1
- package/dist/multi_repo_publisher.js +279 -287
- package/dist/operations.d.ts +6 -26
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations_defaults.d.ts.map +1 -1
- package/dist/operations_defaults.js +4 -20
- package/dist/output_helpers.d.ts.map +1 -1
- package/dist/output_helpers.js +7 -6
- package/dist/paths.d.ts +0 -4
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +0 -4
- package/dist/publish_gate.d.ts +44 -0
- package/dist/publish_gate.d.ts.map +1 -0
- package/dist/publish_gate.js +32 -0
- package/dist/publish_steps.d.ts +60 -0
- package/dist/publish_steps.d.ts.map +1 -0
- package/dist/publish_steps.js +113 -0
- package/dist/publishing_event.d.ts +12 -19
- package/dist/publishing_event.d.ts.map +1 -1
- package/dist/publishing_event.js +16 -25
- package/dist/publishing_plan.d.ts +1 -2
- package/dist/publishing_plan.d.ts.map +1 -1
- package/dist/publishing_plan.js +21 -4
- package/dist/publishing_plan_helpers.d.ts +1 -1
- package/dist/publishing_plan_helpers.d.ts.map +1 -1
- package/dist/publishing_plan_helpers.js +2 -15
- package/dist/publishing_plan_logging.d.ts.map +1 -1
- package/dist/publishing_plan_logging.js +15 -23
- package/dist/repo.svelte.d.ts +10 -6
- package/dist/repo.svelte.d.ts.map +1 -1
- package/dist/repo.svelte.js +6 -14
- package/dist/version_utils.d.ts +17 -3
- package/dist/version_utils.d.ts.map +1 -1
- package/dist/version_utils.js +22 -0
- package/package.json +14 -15
- package/src/lib/changeset_generator.ts +10 -19
- package/src/lib/changeset_reader.ts +2 -3
- package/src/lib/dependency_graph.ts +6 -8
- package/src/lib/fetch_repo_data.ts +3 -2
- package/src/lib/git_operations.ts +5 -0
- package/src/lib/gitops_analyze.task.ts +18 -23
- package/src/lib/gitops_plan.task.ts +10 -2
- package/src/lib/gitops_publish.task.ts +92 -27
- package/src/lib/gitops_run.task.ts +39 -7
- package/src/lib/gitops_sync.task.ts +18 -3
- package/src/lib/gitops_task_helpers.ts +20 -3
- package/src/lib/gitops_validate.task.ts +30 -22
- package/src/lib/graph_validation.ts +26 -0
- package/src/lib/local_repo.ts +124 -88
- package/src/lib/log_helpers.ts +8 -26
- package/src/lib/multi_repo_publisher.ts +336 -353
- package/src/lib/operations.ts +6 -22
- package/src/lib/operations_defaults.ts +4 -20
- package/src/lib/output_helpers.ts +7 -6
- package/src/lib/paths.ts +0 -5
- package/src/lib/publish_gate.ts +53 -0
- package/src/lib/publish_steps.ts +149 -0
- package/src/lib/publishing_event.ts +16 -25
- package/src/lib/publishing_plan.ts +26 -6
- package/src/lib/publishing_plan_helpers.ts +5 -18
- package/src/lib/publishing_plan_logging.ts +19 -39
- package/src/lib/repo.svelte.ts +12 -15
- package/src/lib/version_utils.ts +30 -9
- package/dist/npm_install_helpers.d.ts +0 -23
- package/dist/npm_install_helpers.d.ts.map +0 -1
- package/dist/npm_install_helpers.js +0 -60
- package/dist/semver.d.ts +0 -26
- package/dist/semver.d.ts.map +0 -1
- package/dist/semver.js +0 -137
- package/dist/serialization_types.d.ts +0 -59
- package/dist/serialization_types.d.ts.map +0 -1
- package/dist/serialization_types.js +0 -42
- package/src/lib/npm_install_helpers.ts +0 -85
- package/src/lib/semver.ts +0 -170
- package/src/lib/serialization_types.ts +0 -92
package/README.md
CHANGED
|
@@ -14,8 +14,8 @@ fuz_gitops is alternative to the monorepo pattern that more loosely couples repo
|
|
|
14
14
|
With fuz_gitops you can:
|
|
15
15
|
|
|
16
16
|
- dynamically compose repos
|
|
17
|
-
- fetch metadata about collections of repos and import it as typesafe JSON (using
|
|
18
|
-
[
|
|
17
|
+
- fetch metadata about collections of repos and import it as typesafe JSON (using fuz_ui's
|
|
18
|
+
[vite_plugin_pkg_json](https://ui.fuz.dev/docs/vite_plugin_pkg_json))
|
|
19
19
|
- publish a generated docs website for your collections of repos
|
|
20
20
|
- import its components to view and interact with repo collection metadata
|
|
21
21
|
- publish metadata about your collections of repos to the web for other users and tools
|
|
@@ -96,12 +96,19 @@ gro gitops_sync --download # clone missing repos first
|
|
|
96
96
|
### Diagnostic commands (read-only)
|
|
97
97
|
|
|
98
98
|
```bash
|
|
99
|
-
gro gitops_validate
|
|
100
|
-
gro gitops_analyze
|
|
101
|
-
gro gitops_plan
|
|
102
|
-
gro gitops_publish
|
|
99
|
+
gro gitops_validate # run all validation checks (analyze + plan + dry run)
|
|
100
|
+
gro gitops_analyze # analyze dependency graph and detect cycles
|
|
101
|
+
gro gitops_plan # generate publishing plan showing version changes and cascades
|
|
102
|
+
gro gitops_publish # simulate publishing without side effects (dry run default)
|
|
103
|
+
gro gitops_publish --preview # show the ordered side-effects a --wetrun would perform
|
|
103
104
|
```
|
|
104
105
|
|
|
106
|
+
These read each repo's working tree exactly as it sits on disk — no branch
|
|
107
|
+
switching, pulling, or installing — so they're safe to run with feature
|
|
108
|
+
branches checked out and uncommitted changes. Pass `--sync` to refresh repos
|
|
109
|
+
(switch to the configured branch, pull, install) before running, or run
|
|
110
|
+
`gro gitops_sync` first.
|
|
111
|
+
|
|
105
112
|
### Publishing packages
|
|
106
113
|
|
|
107
114
|
```bash
|
|
@@ -119,8 +126,8 @@ gro gitops_publish --wetrun --no-plan # skip plan confirmation
|
|
|
119
126
|
- ./docs/troubleshooting.md - Common errors and
|
|
120
127
|
debugging tips
|
|
121
128
|
|
|
122
|
-
Getting started as a dev? Start with [Gro](https://github.com/
|
|
123
|
-
and the [Fuz template](https://github.com/
|
|
129
|
+
Getting started as a dev? Start with [Gro](https://github.com/fuzdev/gro)
|
|
130
|
+
and the [Fuz template](https://github.com/fuzdev/fuz_template).
|
|
124
131
|
|
|
125
132
|
TODO
|
|
126
133
|
|
package/dist/PageHeader.svelte
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type {
|
|
2
|
+
import type {PkgJson} from '@fuzdev/fuz_util/pkg_json.js';
|
|
3
3
|
import Breadcrumb from '@fuzdev/fuz_ui/Breadcrumb.svelte';
|
|
4
4
|
import type {Snippet} from 'svelte';
|
|
5
5
|
import type {SvelteHTMLElements} from 'svelte/elements';
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
nav,
|
|
12
12
|
children,
|
|
13
13
|
}: {
|
|
14
|
-
repo: {
|
|
14
|
+
repo: {pkg_json: PkgJson} | {url: string; pkg_json: null};
|
|
15
15
|
nav_attrs?: SvelteHTMLElements['nav'];
|
|
16
16
|
attrs?: SvelteHTMLElements['header'];
|
|
17
17
|
nav?: Snippet;
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
{#if nav}
|
|
25
25
|
{@render nav()}
|
|
26
26
|
{:else}
|
|
27
|
-
<nav {...nav_attrs}><Breadcrumb>{repo.
|
|
27
|
+
<nav {...nav_attrs}><Breadcrumb>{repo.pkg_json?.glyph}</Breadcrumb></nav>
|
|
28
28
|
{/if}
|
|
29
29
|
</header>
|
|
30
30
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { PkgJson } from '@fuzdev/fuz_util/pkg_json.js';
|
|
2
2
|
import type { Snippet } from 'svelte';
|
|
3
3
|
import type { SvelteHTMLElements } from 'svelte/elements';
|
|
4
4
|
type $$ComponentProps = {
|
|
5
5
|
repo: {
|
|
6
|
-
|
|
6
|
+
pkg_json: PkgJson;
|
|
7
7
|
} | {
|
|
8
8
|
url: string;
|
|
9
|
-
|
|
9
|
+
pkg_json: null;
|
|
10
10
|
};
|
|
11
11
|
nav_attrs?: SvelteHTMLElements['nav'];
|
|
12
12
|
attrs?: SvelteHTMLElements['header'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/PageHeader.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"PageHeader.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/PageHeader.svelte"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,8BAA8B,CAAC;AAE1D,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AAEvD,KAAK,gBAAgB,GAAI;IACxB,IAAI,EAAE;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAC,GAAG;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAC,CAAC;IAC1D,SAAS,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACrC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AA6BH,QAAA,MAAM,UAAU,sDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changeset_generator.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/changeset_generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"changeset_generator.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/changeset_generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAMhE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAGlD,MAAM,WAAW,uBAAuB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IACvC,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,uCAAuC,GACnD,MAAM,SAAS,EACf,SAAS,KAAK,CAAC,uBAAuB,CAAC,EACvC,UAAS;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAAM,KACjD,OAAO,CAAC,MAAM,CAiChB,CAAC;AAWF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,GACtC,cAAc,MAAM,EACpB,SAAS,KAAK,CAAC,uBAAuB,CAAC,EACvC,WAAW,OAAO,GAAG,OAAO,GAAG,OAAO,KACpC,MAsCF,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACrC,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,oBAAoB,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,KAC/C,KAAK,CAAC,uBAAuB,CAoB/B,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
9
|
import { join } from 'node:path';
|
|
10
|
-
import { strip_version_prefix } from './version_utils.js';
|
|
10
|
+
import { strip_version_prefix, required_bump_for_dependency_update, } from './version_utils.js';
|
|
11
11
|
import { default_fs_operations } from './operations_defaults.js';
|
|
12
12
|
/**
|
|
13
13
|
* Creates a changeset file for dependency updates.
|
|
@@ -40,21 +40,7 @@ export const create_changeset_for_dependency_updates = async (repo, updates, opt
|
|
|
40
40
|
log?.info(` Created changeset: ${filename}`);
|
|
41
41
|
return filepath;
|
|
42
42
|
};
|
|
43
|
-
const calculate_required_bump = (repo, updates) =>
|
|
44
|
-
const current_version = repo.library.package_json.version || '0.0.0';
|
|
45
|
-
const [major] = current_version.split('.').map(Number);
|
|
46
|
-
const is_pre_1_0 = major === 0;
|
|
47
|
-
// Check if any dependency had breaking changes
|
|
48
|
-
const has_breaking = updates.some((u) => u.breaking);
|
|
49
|
-
if (has_breaking) {
|
|
50
|
-
// Breaking changes propagate
|
|
51
|
-
// Pre-1.0: use minor for breaking changes
|
|
52
|
-
// 1.0+: use major for breaking changes
|
|
53
|
-
return is_pre_1_0 ? 'minor' : 'major';
|
|
54
|
-
}
|
|
55
|
-
// For non-breaking dependency updates, always use patch
|
|
56
|
-
return 'patch';
|
|
57
|
-
};
|
|
43
|
+
const calculate_required_bump = (repo, updates) => required_bump_for_dependency_update(repo.package_json.version || '0.0.0', updates.some((u) => u.breaking));
|
|
58
44
|
/**
|
|
59
45
|
* Generates markdown changeset content for dependency updates.
|
|
60
46
|
*
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { Logger } from '@fuzdev/fuz_util/log.js';
|
|
10
10
|
import type { LocalRepo } from './local_repo.js';
|
|
11
|
-
import type
|
|
11
|
+
import { type BumpType } from './version_utils.js';
|
|
12
12
|
export interface ChangesetInfo {
|
|
13
13
|
filename: string;
|
|
14
14
|
packages: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changeset_reader.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/changeset_reader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAKpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"changeset_reader.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/changeset_reader.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAKpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAA6C,KAAK,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAE7F,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,QAAQ,CAAA;KAAC,CAAC,CAAC;IACrD,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,uBAAuB,GACnC,SAAS,MAAM,EACf,iBAAyB,KACvB,aAAa,GAAG,IAmClB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAChC,UAAU,MAAM,EAChB,MAAM,MAAM,KACV,OAAO,CAAC,aAAa,GAAG,IAAI,CAgB9B,CAAC;AAEF,eAAO,MAAM,eAAe,GAC3B,MAAM,SAAS,EACf,MAAM,MAAM,KACV,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAsB9B,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,GAC1C,YAAY,KAAK,CAAC,aAAa,CAAC,EAChC,cAAc,MAAM,KAClB,QAAQ,GAAG,IAcb,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAU,MAAM,SAAS,KAAG,OAAO,CAAC,OAAO,CAarE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAChC,MAAM,SAAS,EACf,MAAM,MAAM,KACV,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,QAAQ,CAAA;CAAC,GAAG,IAAI,CAsBvD,CAAC"}
|
package/dist/changeset_reader.js
CHANGED
|
@@ -161,7 +161,7 @@ export const predict_next_version = async (repo, log) => {
|
|
|
161
161
|
if (!bump_type) {
|
|
162
162
|
return null;
|
|
163
163
|
}
|
|
164
|
-
const current_version = repo.
|
|
164
|
+
const current_version = repo.package_json.version || '0.0.0';
|
|
165
165
|
const next_version = calculate_next_version(current_version, bump_type);
|
|
166
166
|
log?.debug(` Predicted ${repo.library.name}: ${current_version} → ${next_version} (${bump_type})`);
|
|
167
167
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency_graph.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/dependency_graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE/C,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,KAAK,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,cAAc,CAAA;SAAC,CAAC,CAAC;QAC1D,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,WAAW,EAAE,OAAO,CAAC;KACrB,CAAC,CAAC;IACH,KAAK,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,eAAe;;IAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACnC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;;IAOzB,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"dependency_graph.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/dependency_graph.ts"],"names":[],"mappings":"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"}
|
package/dist/dependency_graph.js
CHANGED
|
@@ -24,19 +24,19 @@ export class DependencyGraph {
|
|
|
24
24
|
init_from_repos(repos) {
|
|
25
25
|
// First pass: create nodes
|
|
26
26
|
for (const repo of repos) {
|
|
27
|
-
const { library } = repo;
|
|
27
|
+
const { library, package_json } = repo;
|
|
28
28
|
const node = {
|
|
29
29
|
name: library.name,
|
|
30
|
-
version:
|
|
30
|
+
version: package_json.version || '0.0.0',
|
|
31
31
|
repo,
|
|
32
32
|
dependencies: new Map(),
|
|
33
33
|
dependents: new Set(),
|
|
34
|
-
publishable:
|
|
34
|
+
publishable: !package_json.private,
|
|
35
35
|
};
|
|
36
36
|
// Extract dependencies
|
|
37
|
-
const deps =
|
|
38
|
-
const dev_deps =
|
|
39
|
-
const peer_deps =
|
|
37
|
+
const deps = package_json.dependencies || EMPTY_OBJECT;
|
|
38
|
+
const dev_deps = package_json.devDependencies || EMPTY_OBJECT;
|
|
39
|
+
const peer_deps = package_json.peerDependencies || EMPTY_OBJECT;
|
|
40
40
|
// Add dependencies, prioritizing prod/peer over dev
|
|
41
41
|
// (if a package appears in multiple dep types, use the stronger constraint)
|
|
42
42
|
for (const [name, version] of Object.entries(deps)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch_repo_data.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/fetch_repo_data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAG/D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,GAC3B,gBAAgB,KAAK,CAAC,SAAS,CAAC,EAChC,QAAQ,MAAM,EACd,QAAQ,eAAe,EACvB,MAAM,MAAM,EACZ,cAAU,EACV,qBAAqB,MAAM,KACzB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"fetch_repo_data.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/fetch_repo_data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAG/D,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,GAC3B,gBAAgB,KAAK,CAAC,SAAS,CAAC,EAChC,QAAQ,MAAM,EACd,QAAQ,eAAe,EACvB,MAAM,MAAM,EACZ,cAAU,EACV,qBAAqB,MAAM,KACzB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAkCzB,CAAC"}
|
package/dist/fetch_repo_data.js
CHANGED
|
@@ -15,7 +15,7 @@ import { fetch_github_check_runs, fetch_github_pull_requests } from './github.js
|
|
|
15
15
|
*/
|
|
16
16
|
export const fetch_repo_data = async (resolved_repos, token, cache, log, delay = 33, github_api_version) => {
|
|
17
17
|
const repos = [];
|
|
18
|
-
for (const { library,
|
|
18
|
+
for (const { library, package_json, repo_config } of resolved_repos) {
|
|
19
19
|
const repo_url = library.repo_url;
|
|
20
20
|
// CI status
|
|
21
21
|
await wait(delay);
|
|
@@ -39,7 +39,8 @@ export const fetch_repo_data = async (resolved_repos, token, cache, log, delay =
|
|
|
39
39
|
if (!pull_requests)
|
|
40
40
|
log?.error('failed to fetch issues: ' + repo_url);
|
|
41
41
|
repos.push({
|
|
42
|
-
library_json,
|
|
42
|
+
library_json: library.library_json,
|
|
43
|
+
package_json,
|
|
43
44
|
check_runs,
|
|
44
45
|
pull_requests,
|
|
45
46
|
});
|
package/dist/git_operations.d.ts
CHANGED
|
@@ -20,6 +20,11 @@ export declare const git_tag: (tag_name: string, message?: string, options?: Spa
|
|
|
20
20
|
* Pushes a tag to origin and throws if anything goes wrong.
|
|
21
21
|
*/
|
|
22
22
|
export declare const git_push_tag: (tag_name: string, origin?: GitOrigin, options?: SpawnOptions) => Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Returns `true` if the working tree has any changes — staged, unstaged, or
|
|
25
|
+
* untracked (`git status --porcelain`). Broader than `git_list_uncommitted_files`,
|
|
26
|
+
* which reports only tracked working-tree changes relative to HEAD.
|
|
27
|
+
*/
|
|
23
28
|
export declare const git_has_changes: (options?: SpawnOptions) => Promise<boolean>;
|
|
24
29
|
/**
|
|
25
30
|
* Lists uncommitted files in the working tree (`git diff --name-only HEAD`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git_operations.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/git_operations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAMN,KAAK,SAAS,EACd,KAAK,SAAS,EACd,MAAM,yBAAyB,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,OAAO,GACnB,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAC7B,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CAQd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,MAAM,EAAE,UAAU,YAAY,KAAG,OAAO,CAAC,IAAI,CAOtF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC9B,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAC7B,SAAS,MAAM,EACf,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CAGd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GACnB,UAAU,MAAM,EAChB,UAAU,MAAM,EAChB,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CASd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GACxB,UAAU,MAAM,EAChB,SAAQ,SAAiC,EACzC,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF,eAAO,MAAM,eAAe,GAAU,UAAU,YAAY,KAAG,OAAO,CAAC,OAAO,CAG7E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,GACtC,UAAU,YAAY,KACpB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAQvB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAChC,aAAa,MAAM,EACnB,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,UAAU,YAAY,KACpB,OAAO,CAAC,OAAO,CAOjB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAU,UAAU,MAAM,EAAE,UAAU,YAAY,KAAG,OAAO,CAAC,IAAI,CAStF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,UAAU,YAAY,KAAG,OAAO,CAAC,IAAI,CAOxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC7B,QAAQ,SAAS,EACjB,OAAM,OAAc,EACpB,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CAoBd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gCAAgC,GAAU,UAAU,YAAY,KAAG,OAAO,CAAC,MAAM,CAM7F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gCAAgC,GAC5C,SAAS,MAAM,EACf,UAAU,YAAY,KACpB,OAAO,CAAC,MAAM,CAMhB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oCAAoC,GAChD,UAAU,YAAY,KACpB,OAAO,CAAC,OAAO,CAGjB,CAAC;AAEF,eAAO,MAAM,cAAc,GAC1B,SAAQ,MAAiB,EACzB,UAAU,YAAY,KACpB,OAAO,CAAC,OAAO,CAQjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"git_operations.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/git_operations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAMN,KAAK,SAAS,EACd,KAAK,SAAS,EACd,MAAM,yBAAyB,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,OAAO,GACnB,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAC7B,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CAQd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,MAAM,EAAE,UAAU,YAAY,KAAG,OAAO,CAAC,IAAI,CAOtF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC9B,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAC7B,SAAS,MAAM,EACf,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CAGd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GACnB,UAAU,MAAM,EAChB,UAAU,MAAM,EAChB,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CASd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,GACxB,UAAU,MAAM,EAChB,SAAQ,SAAiC,EACzC,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CAOd,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAU,UAAU,YAAY,KAAG,OAAO,CAAC,OAAO,CAG7E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,GACtC,UAAU,YAAY,KACpB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAQvB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAChC,aAAa,MAAM,EACnB,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,UAAU,YAAY,KACpB,OAAO,CAAC,OAAO,CAOjB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAU,UAAU,MAAM,EAAE,UAAU,YAAY,KAAG,OAAO,CAAC,IAAI,CAStF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAU,UAAU,YAAY,KAAG,OAAO,CAAC,IAAI,CAOxE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC7B,QAAQ,SAAS,EACjB,OAAM,OAAc,EACpB,UAAU,YAAY,KACpB,OAAO,CAAC,IAAI,CAoBd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gCAAgC,GAAU,UAAU,YAAY,KAAG,OAAO,CAAC,MAAM,CAM7F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gCAAgC,GAC5C,SAAS,MAAM,EACf,UAAU,YAAY,KACpB,OAAO,CAAC,MAAM,CAMhB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oCAAoC,GAChD,UAAU,YAAY,KACpB,OAAO,CAAC,OAAO,CAGjB,CAAC;AAEF,eAAO,MAAM,cAAc,GAC1B,SAAQ,MAAiB,EACzB,UAAU,YAAY,KACpB,OAAO,CAAC,OAAO,CAQjB,CAAC"}
|
package/dist/git_operations.js
CHANGED
|
@@ -45,6 +45,11 @@ export const git_push_tag = async (tag_name, origin = 'origin', options) => {
|
|
|
45
45
|
throw Error(`git_push_tag failed for tag '${tag_name}' with ${spawn_result_to_message(result)}${stderr ? ': ' + stderr.trim() : ''}`);
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
|
+
/**
|
|
49
|
+
* Returns `true` if the working tree has any changes — staged, unstaged, or
|
|
50
|
+
* untracked (`git status --porcelain`). Broader than `git_list_uncommitted_files`,
|
|
51
|
+
* which reports only tracked working-tree changes relative to HEAD.
|
|
52
|
+
*/
|
|
48
53
|
export const git_has_changes = async (options) => {
|
|
49
54
|
const { stdout } = await spawn_out('git', ['status', '--porcelain'], options);
|
|
50
55
|
return stdout ? stdout.trim().length > 0 : false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitops_analyze.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_analyze.task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAgBtB,cAAc;AACd,eAAO,MAAM,IAAI
|
|
1
|
+
{"version":3,"file":"gitops_analyze.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_analyze.task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAgBtB,cAAc;AACd,eAAO,MAAM,IAAI;;;;;;;;;;kBAqBf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,cAAc;AACd,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAsB3B,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { styleText as st } from 'node:util';
|
|
3
3
|
import { get_gitops_ready } from './gitops_task_helpers.js';
|
|
4
|
-
import {
|
|
5
|
-
import { validate_dependency_graph } from './graph_validation.js';
|
|
4
|
+
import { analyze_repos } from './graph_validation.js';
|
|
6
5
|
import { format_wildcard_dependencies, format_dev_cycles, format_production_cycles, } from './log_helpers.js';
|
|
7
6
|
import { format_and_output } from './output_helpers.js';
|
|
8
7
|
import { GITOPS_CONFIG_PATH_DEFAULT } from './gitops_constants.js';
|
|
@@ -21,27 +20,23 @@ export const Args = z.strictObject({
|
|
|
21
20
|
.meta({ description: 'output format' })
|
|
22
21
|
.default('stdout'),
|
|
23
22
|
outfile: z.string().meta({ description: 'write output to file instead of logging' }).optional(),
|
|
23
|
+
sync: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.meta({
|
|
26
|
+
description: 'sync repos (switch branch, pull, install) before analyzing instead of reading the working tree as-is',
|
|
27
|
+
})
|
|
28
|
+
.default(false),
|
|
24
29
|
});
|
|
25
30
|
/** @nodocs */
|
|
26
31
|
export const task = {
|
|
27
32
|
Args,
|
|
28
33
|
summary: 'analyze dependency structure and relationships across repos',
|
|
29
34
|
run: async ({ args, log }) => {
|
|
30
|
-
const { config, dir, format, outfile } = args;
|
|
31
|
-
// Get repos ready (without downloading)
|
|
32
|
-
const { local_repos } = await get_gitops_ready({ config, dir, download: false, log });
|
|
33
|
-
// Build dependency graph and
|
|
34
|
-
const { graph, publishing_order
|
|
35
|
-
log,
|
|
36
|
-
throw_on_prod_cycles: false, // Analyze should report, not throw
|
|
37
|
-
log_cycles: false, // We'll show cycles in our formatted output
|
|
38
|
-
log_order: false, // We'll show order in our formatted output
|
|
39
|
-
});
|
|
40
|
-
// Perform additional analysis
|
|
41
|
-
const builder = new DependencyGraphBuilder();
|
|
42
|
-
const analysis = builder.analyze(graph);
|
|
43
|
-
// Publishing order (may be null if prod cycles exist)
|
|
44
|
-
const publishing_order = order.length > 0 ? order : null;
|
|
35
|
+
const { config, dir, format, outfile, sync } = args;
|
|
36
|
+
// Get repos ready (without downloading); read the working tree as-is unless `--sync`
|
|
37
|
+
const { local_repos } = await get_gitops_ready({ config, dir, download: false, sync, log });
|
|
38
|
+
// Build the dependency graph and analyze cycles/wildcards (tolerating cycles)
|
|
39
|
+
const { graph, analysis, publishing_order } = analyze_repos(local_repos);
|
|
45
40
|
// Format and output using output_helpers
|
|
46
41
|
const data = {
|
|
47
42
|
repos: local_repos,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitops_plan.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_plan.task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAatB,cAAc;AACd,eAAO,MAAM,IAAI
|
|
1
|
+
{"version":3,"file":"gitops_plan.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_plan.task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAatB,cAAc;AACd,eAAO,MAAM,IAAI;;;;;;;;;;;kBAsBf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAmC3B,CAAC"}
|
package/dist/gitops_plan.task.js
CHANGED
|
@@ -20,6 +20,12 @@ export const Args = z.strictObject({
|
|
|
20
20
|
.default('stdout'),
|
|
21
21
|
outfile: z.string().meta({ description: 'write output to file instead of logging' }).optional(),
|
|
22
22
|
verbose: z.boolean().meta({ description: 'show additional details' }).default(false),
|
|
23
|
+
sync: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.meta({
|
|
26
|
+
description: 'sync repos (switch branch, pull, install) before planning instead of reading the working tree as-is',
|
|
27
|
+
})
|
|
28
|
+
.default(false),
|
|
23
29
|
});
|
|
24
30
|
/**
|
|
25
31
|
* Generate a publishing plan showing what would happen during multi-repo publishing.
|
|
@@ -36,13 +42,14 @@ export const task = {
|
|
|
36
42
|
summary: 'generate a publishing plan based on changesets',
|
|
37
43
|
Args,
|
|
38
44
|
run: async ({ args, log }) => {
|
|
39
|
-
const { dir, config, format, outfile, verbose } = args;
|
|
45
|
+
const { dir, config, format, outfile, verbose, sync } = args;
|
|
40
46
|
log.info(st('cyan', 'Generating multi-repo publishing plan...'));
|
|
41
|
-
// Load local repos
|
|
47
|
+
// Load local repos; read the working tree as-is unless `--sync`
|
|
42
48
|
const { local_repos } = await get_gitops_ready({
|
|
43
49
|
config,
|
|
44
50
|
dir,
|
|
45
51
|
download: false, // Don't download if missing
|
|
52
|
+
sync,
|
|
46
53
|
log,
|
|
47
54
|
});
|
|
48
55
|
if (local_repos.length === 0) {
|
|
@@ -17,12 +17,12 @@ export declare const Args: z.ZodObject<{
|
|
|
17
17
|
}>>;
|
|
18
18
|
deploy: z.ZodDefault<z.ZodBoolean>;
|
|
19
19
|
plan: z.ZodDefault<z.ZodBoolean>;
|
|
20
|
-
'no-plan': z.ZodDefault<z.ZodBoolean>;
|
|
21
20
|
max_wait: z.ZodDefault<z.ZodNumber>;
|
|
22
|
-
skip_install: z.ZodDefault<z.ZodBoolean>;
|
|
23
21
|
emit_json: z.ZodDefault<z.ZodBoolean>;
|
|
24
22
|
outfile: z.ZodOptional<z.ZodString>;
|
|
25
23
|
verbose: z.ZodDefault<z.ZodBoolean>;
|
|
24
|
+
sync: z.ZodDefault<z.ZodBoolean>;
|
|
25
|
+
preview: z.ZodDefault<z.ZodBoolean>;
|
|
26
26
|
}, z.core.$strict>;
|
|
27
27
|
export type Args = z.infer<typeof Args>;
|
|
28
28
|
/** @nodocs */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitops_publish.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_publish.task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"gitops_publish.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_publish.task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAiBtB,cAAc;AACd,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;kBA4Cf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,cAAc;AACd,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAiH3B,CAAC"}
|
|
@@ -2,9 +2,11 @@ import { z } from 'zod';
|
|
|
2
2
|
import { createInterface } from 'node:readline/promises';
|
|
3
3
|
import { styleText as st } from 'node:util';
|
|
4
4
|
import { get_gitops_ready } from './gitops_task_helpers.js';
|
|
5
|
-
import {
|
|
5
|
+
import { execute_publishing_plan, } from './multi_repo_publisher.js';
|
|
6
6
|
import { stdout_handler } from './publishing_event_handler.js';
|
|
7
7
|
import { generate_publishing_plan, log_publishing_plan } from './publishing_plan.js';
|
|
8
|
+
import { derive_publish_steps, format_publish_steps } from './publish_steps.js';
|
|
9
|
+
import { decide_publish_gate, publish_run_failed } from './publish_gate.js';
|
|
8
10
|
import { format_and_output } from './output_helpers.js';
|
|
9
11
|
import { GITOPS_CONFIG_PATH_DEFAULT, GITOPS_NPM_WAIT_TIMEOUT_DEFAULT } from './gitops_constants.js';
|
|
10
12
|
/** @nodocs */
|
|
@@ -27,47 +29,64 @@ export const Args = z.strictObject({
|
|
|
27
29
|
.meta({ description: 'output format' })
|
|
28
30
|
.default('stdout'),
|
|
29
31
|
deploy: z.boolean().meta({ description: 'deploy all repos after publishing' }).default(false),
|
|
30
|
-
plan: z
|
|
31
|
-
'no-plan': z
|
|
32
|
+
plan: z
|
|
32
33
|
.boolean()
|
|
33
|
-
.meta({ description: '
|
|
34
|
-
.default(
|
|
34
|
+
.meta({ description: 'show the plan and confirm before publishing; --no-plan to skip' })
|
|
35
|
+
.default(true),
|
|
35
36
|
max_wait: z
|
|
36
37
|
.number()
|
|
37
38
|
.meta({ description: 'max time to wait for npm propagation in ms' })
|
|
38
39
|
.default(GITOPS_NPM_WAIT_TIMEOUT_DEFAULT),
|
|
39
|
-
skip_install: z
|
|
40
|
-
.boolean()
|
|
41
|
-
.meta({ description: 'skip npm install after dependency updates' })
|
|
42
|
-
.default(false),
|
|
43
40
|
emit_json: z
|
|
44
41
|
.boolean()
|
|
45
42
|
.meta({ description: 'stream structured publishing events as JSON-lines to stdout' })
|
|
46
43
|
.default(false),
|
|
47
44
|
outfile: z.string().meta({ description: 'write output to file instead of logging' }).optional(),
|
|
48
45
|
verbose: z.boolean().meta({ description: 'show additional details in plan output' }).default(false),
|
|
46
|
+
sync: z
|
|
47
|
+
.boolean()
|
|
48
|
+
.meta({
|
|
49
|
+
description: 'sync repos (switch branch, pull, install) before the dry run instead of reading the working tree as-is; always on for --wetrun',
|
|
50
|
+
})
|
|
51
|
+
.default(false),
|
|
52
|
+
preview: z
|
|
53
|
+
.boolean()
|
|
54
|
+
.meta({ description: 'show the ordered side-effects a --wetrun would perform' })
|
|
55
|
+
.default(false),
|
|
49
56
|
});
|
|
50
57
|
/** @nodocs */
|
|
51
58
|
export const task = {
|
|
52
59
|
summary: 'publish all repos in dependency order',
|
|
53
60
|
Args,
|
|
54
61
|
run: async ({ args, log }) => {
|
|
55
|
-
const { config, dir, peer_strategy, wetrun, format, deploy, plan, max_wait,
|
|
56
|
-
// Load repos
|
|
62
|
+
const { config, dir, peer_strategy, wetrun, format, deploy, plan, max_wait, emit_json, outfile, verbose, sync, preview, } = args;
|
|
63
|
+
// Load repos. A dry run reads the working tree as-is unless `--sync`;
|
|
64
|
+
// a real publish (`--wetrun`) always syncs so preflight sees the canonical branches.
|
|
57
65
|
const { local_repos: repos } = await get_gitops_ready({
|
|
58
66
|
config,
|
|
59
67
|
dir,
|
|
60
68
|
download: false, // Don't download if missing
|
|
69
|
+
sync: sync || wetrun,
|
|
61
70
|
log,
|
|
62
71
|
});
|
|
63
|
-
//
|
|
64
|
-
|
|
72
|
+
// Generate the plan once; the executor consumes this exact plan (no second pass).
|
|
73
|
+
const publishing_plan = await generate_publishing_plan(repos, { verbose });
|
|
74
|
+
const preview_steps = preview ? derive_publish_steps(publishing_plan, { deploy }) : null;
|
|
75
|
+
// Decide whether to show the plan + confirm, block, or proceed (the decision table lives
|
|
76
|
+
// in `decide_publish_gate`; readline + exit stay here at the edge).
|
|
77
|
+
const gate = decide_publish_gate({ wetrun, show_plan: plan, plan: publishing_plan });
|
|
78
|
+
// A real publish that shows its plan prints it first — including before a `blocked` throw,
|
|
79
|
+
// so the operator sees the errors that blocked it.
|
|
80
|
+
if (gate.action !== 'proceed') {
|
|
65
81
|
log.info(st('cyan', 'Publishing Plan'));
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
82
|
+
log_publishing_plan(publishing_plan, log, { verbose });
|
|
83
|
+
}
|
|
84
|
+
if (gate.action === 'blocked') {
|
|
85
|
+
throw new Error(gate.message);
|
|
86
|
+
}
|
|
87
|
+
else if (gate.action === 'confirm') {
|
|
88
|
+
if (preview_steps)
|
|
89
|
+
log_preview(preview_steps, log);
|
|
71
90
|
// Ask for confirmation
|
|
72
91
|
log.info(st('yellow', '⚠️ This will publish the packages shown above.'));
|
|
73
92
|
process.stdout.write('Continue with publishing? (y/n): ');
|
|
@@ -77,14 +96,18 @@ export const task = {
|
|
|
77
96
|
process.exit(0);
|
|
78
97
|
}
|
|
79
98
|
}
|
|
99
|
+
else if (preview_steps && format === 'stdout') {
|
|
100
|
+
// proceed (dry run or --no-plan): only render to stdout for the human format;
|
|
101
|
+
// json/markdown carry the preview in their structured output, so logging here too
|
|
102
|
+
// would corrupt that stream.
|
|
103
|
+
log_preview(preview_steps, log);
|
|
104
|
+
}
|
|
80
105
|
// Publishing options
|
|
81
106
|
const options = {
|
|
82
107
|
wetrun,
|
|
83
|
-
update_deps: true, // Always update dependencies
|
|
84
108
|
version_strategy: peer_strategy,
|
|
85
109
|
deploy,
|
|
86
110
|
max_wait,
|
|
87
|
-
skip_install,
|
|
88
111
|
log,
|
|
89
112
|
// Live JSON-lines stream when requested; events also surface on the result.
|
|
90
113
|
events: emit_json ? stdout_handler() : undefined,
|
|
@@ -93,7 +116,7 @@ export const task = {
|
|
|
93
116
|
let result;
|
|
94
117
|
let fatal_error = null;
|
|
95
118
|
try {
|
|
96
|
-
result = await
|
|
119
|
+
result = await execute_publishing_plan(repos, publishing_plan, options);
|
|
97
120
|
}
|
|
98
121
|
catch (error) {
|
|
99
122
|
// Construct a failure result for fatal errors so output can still be generated
|
|
@@ -106,33 +129,42 @@ export const task = {
|
|
|
106
129
|
duration: 0,
|
|
107
130
|
events: [],
|
|
108
131
|
summary: { total: 0, published: 0, failed: 1, skipped: 0, duration: 0 },
|
|
132
|
+
plan_errors: publishing_plan.errors,
|
|
133
|
+
plan_warnings: publishing_plan.warnings,
|
|
109
134
|
};
|
|
110
135
|
}
|
|
111
136
|
// Format and output result (always runs, even on fatal errors)
|
|
112
|
-
// Note: stdout format is handled by
|
|
137
|
+
// Note: stdout format is handled by the executor's logging
|
|
113
138
|
if (format !== 'stdout') {
|
|
114
|
-
await format_and_output({ result, fatal_error }, create_publish_formatters(), {
|
|
139
|
+
await format_and_output({ result, fatal_error, preview_steps }, create_publish_formatters(), {
|
|
115
140
|
format,
|
|
116
141
|
outfile,
|
|
117
142
|
log,
|
|
118
143
|
});
|
|
119
144
|
}
|
|
120
145
|
// Exit with error if failed
|
|
121
|
-
if (
|
|
146
|
+
if (publish_run_failed(result, fatal_error)) {
|
|
122
147
|
process.exit(1);
|
|
123
148
|
}
|
|
124
149
|
},
|
|
125
150
|
};
|
|
126
151
|
const create_publish_formatters = () => ({
|
|
127
|
-
json: (data) => JSON.stringify(data.result, null, 2),
|
|
128
|
-
markdown: (data) => format_result_markdown(data.result, data.fatal_error),
|
|
152
|
+
json: (data) => JSON.stringify(data.preview_steps ? { ...data.result, preview: data.preview_steps } : data.result, null, 2),
|
|
153
|
+
markdown: (data) => format_result_markdown(data.result, data.fatal_error, data.preview_steps),
|
|
129
154
|
stdout: () => {
|
|
130
|
-
// stdout format is handled by
|
|
155
|
+
// stdout format is handled by the executor's logging
|
|
131
156
|
// This should never be called due to early return in task
|
|
132
157
|
},
|
|
133
158
|
});
|
|
159
|
+
/** Logs the ordered side-effect preview to stdout. */
|
|
160
|
+
const log_preview = (steps, log) => {
|
|
161
|
+
log.info(st('cyan', '\nSide-effect preview (what a real publish would perform):'));
|
|
162
|
+
for (const line of format_publish_steps(steps)) {
|
|
163
|
+
log.info(st('dim', ` ${line}`));
|
|
164
|
+
}
|
|
165
|
+
};
|
|
134
166
|
// Format the publishing result as markdown
|
|
135
|
-
const format_result_markdown = (result, fatal_error) => {
|
|
167
|
+
const format_result_markdown = (result, fatal_error, preview_steps) => {
|
|
136
168
|
const lines = [];
|
|
137
169
|
lines.push('# Publishing Result');
|
|
138
170
|
lines.push('');
|
|
@@ -168,6 +200,29 @@ const format_result_markdown = (result, fatal_error) => {
|
|
|
168
200
|
lines.push(`- \`${name}\`: ${error.message}`);
|
|
169
201
|
}
|
|
170
202
|
}
|
|
203
|
+
if (result.plan_warnings.length > 0) {
|
|
204
|
+
lines.push('');
|
|
205
|
+
lines.push('## Plan Warnings');
|
|
206
|
+
lines.push('');
|
|
207
|
+
for (const warning of result.plan_warnings)
|
|
208
|
+
lines.push(`- ${warning}`);
|
|
209
|
+
}
|
|
210
|
+
if (result.plan_errors.length > 0) {
|
|
211
|
+
lines.push('');
|
|
212
|
+
lines.push('## Plan Errors');
|
|
213
|
+
lines.push('');
|
|
214
|
+
for (const plan_error of result.plan_errors)
|
|
215
|
+
lines.push(`- ${plan_error}`);
|
|
216
|
+
}
|
|
217
|
+
if (preview_steps) {
|
|
218
|
+
lines.push('');
|
|
219
|
+
lines.push('## Side-Effect Preview');
|
|
220
|
+
lines.push('');
|
|
221
|
+
lines.push('```');
|
|
222
|
+
for (const line of format_publish_steps(preview_steps))
|
|
223
|
+
lines.push(line);
|
|
224
|
+
lines.push('```');
|
|
225
|
+
}
|
|
171
226
|
return lines;
|
|
172
227
|
};
|
|
173
228
|
/**
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { type Task } from '@fuzdev/gro';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
export declare const Args: z.ZodObject<{
|
|
4
|
-
|
|
4
|
+
_: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
5
5
|
config: z.ZodDefault<z.ZodString>;
|
|
6
6
|
concurrency: z.ZodDefault<z.ZodNumber>;
|
|
7
7
|
format: z.ZodDefault<z.ZodEnum<{
|
|
8
8
|
text: "text";
|
|
9
9
|
json: "json";
|
|
10
10
|
}>>;
|
|
11
|
+
outfile: z.ZodOptional<z.ZodString>;
|
|
11
12
|
}, z.core.$strict>;
|
|
12
13
|
export type Args = z.infer<typeof Args>;
|
|
13
14
|
export declare const task: Task<Args>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitops_run.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_run.task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,IAAI,EAAC,MAAM,aAAa,CAAC;AACjD,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"gitops_run.task.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_run.task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,IAAI,EAAC,MAAM,aAAa,CAAC;AACjD,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAUtB,eAAO,MAAM,IAAI;;;;;;;;;kBAmBf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAaxC,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAyM3B,CAAC"}
|