@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.
Files changed (122) hide show
  1. package/README.md +15 -8
  2. package/dist/PageHeader.svelte +3 -3
  3. package/dist/PageHeader.svelte.d.ts +3 -3
  4. package/dist/PageHeader.svelte.d.ts.map +1 -1
  5. package/dist/changeset_generator.d.ts.map +1 -1
  6. package/dist/changeset_generator.js +2 -16
  7. package/dist/changeset_reader.d.ts +1 -1
  8. package/dist/changeset_reader.d.ts.map +1 -1
  9. package/dist/changeset_reader.js +1 -1
  10. package/dist/dependency_graph.d.ts.map +1 -1
  11. package/dist/dependency_graph.js +6 -6
  12. package/dist/fetch_repo_data.d.ts.map +1 -1
  13. package/dist/fetch_repo_data.js +3 -2
  14. package/dist/git_operations.d.ts +5 -0
  15. package/dist/git_operations.d.ts.map +1 -1
  16. package/dist/git_operations.js +5 -0
  17. package/dist/gitops_analyze.task.d.ts +1 -0
  18. package/dist/gitops_analyze.task.d.ts.map +1 -1
  19. package/dist/gitops_analyze.task.js +12 -17
  20. package/dist/gitops_plan.task.d.ts +1 -0
  21. package/dist/gitops_plan.task.d.ts.map +1 -1
  22. package/dist/gitops_plan.task.js +9 -2
  23. package/dist/gitops_publish.task.d.ts +2 -2
  24. package/dist/gitops_publish.task.d.ts.map +1 -1
  25. package/dist/gitops_publish.task.js +83 -28
  26. package/dist/gitops_run.task.d.ts +2 -1
  27. package/dist/gitops_run.task.d.ts.map +1 -1
  28. package/dist/gitops_run.task.js +40 -7
  29. package/dist/gitops_sync.task.d.ts +1 -0
  30. package/dist/gitops_sync.task.d.ts.map +1 -1
  31. package/dist/gitops_sync.task.js +16 -2
  32. package/dist/gitops_task_helpers.d.ts +16 -2
  33. package/dist/gitops_task_helpers.d.ts.map +1 -1
  34. package/dist/gitops_task_helpers.js +11 -3
  35. package/dist/gitops_validate.task.d.ts +1 -0
  36. package/dist/gitops_validate.task.d.ts.map +1 -1
  37. package/dist/gitops_validate.task.js +20 -20
  38. package/dist/graph_validation.d.ts +16 -1
  39. package/dist/graph_validation.d.ts.map +1 -1
  40. package/dist/graph_validation.js +15 -0
  41. package/dist/local_repo.d.ts +25 -12
  42. package/dist/local_repo.d.ts.map +1 -1
  43. package/dist/local_repo.js +99 -79
  44. package/dist/log_helpers.d.ts +0 -5
  45. package/dist/log_helpers.d.ts.map +1 -1
  46. package/dist/log_helpers.js +8 -19
  47. package/dist/multi_repo_publisher.d.ts +21 -2
  48. package/dist/multi_repo_publisher.d.ts.map +1 -1
  49. package/dist/multi_repo_publisher.js +279 -287
  50. package/dist/operations.d.ts +6 -26
  51. package/dist/operations.d.ts.map +1 -1
  52. package/dist/operations_defaults.d.ts.map +1 -1
  53. package/dist/operations_defaults.js +4 -20
  54. package/dist/output_helpers.d.ts.map +1 -1
  55. package/dist/output_helpers.js +7 -6
  56. package/dist/paths.d.ts +0 -4
  57. package/dist/paths.d.ts.map +1 -1
  58. package/dist/paths.js +0 -4
  59. package/dist/publish_gate.d.ts +44 -0
  60. package/dist/publish_gate.d.ts.map +1 -0
  61. package/dist/publish_gate.js +32 -0
  62. package/dist/publish_steps.d.ts +60 -0
  63. package/dist/publish_steps.d.ts.map +1 -0
  64. package/dist/publish_steps.js +113 -0
  65. package/dist/publishing_event.d.ts +12 -19
  66. package/dist/publishing_event.d.ts.map +1 -1
  67. package/dist/publishing_event.js +16 -25
  68. package/dist/publishing_plan.d.ts +1 -2
  69. package/dist/publishing_plan.d.ts.map +1 -1
  70. package/dist/publishing_plan.js +21 -4
  71. package/dist/publishing_plan_helpers.d.ts +1 -1
  72. package/dist/publishing_plan_helpers.d.ts.map +1 -1
  73. package/dist/publishing_plan_helpers.js +2 -15
  74. package/dist/publishing_plan_logging.d.ts.map +1 -1
  75. package/dist/publishing_plan_logging.js +15 -23
  76. package/dist/repo.svelte.d.ts +10 -6
  77. package/dist/repo.svelte.d.ts.map +1 -1
  78. package/dist/repo.svelte.js +6 -14
  79. package/dist/version_utils.d.ts +17 -3
  80. package/dist/version_utils.d.ts.map +1 -1
  81. package/dist/version_utils.js +22 -0
  82. package/package.json +14 -15
  83. package/src/lib/changeset_generator.ts +10 -19
  84. package/src/lib/changeset_reader.ts +2 -3
  85. package/src/lib/dependency_graph.ts +6 -8
  86. package/src/lib/fetch_repo_data.ts +3 -2
  87. package/src/lib/git_operations.ts +5 -0
  88. package/src/lib/gitops_analyze.task.ts +18 -23
  89. package/src/lib/gitops_plan.task.ts +10 -2
  90. package/src/lib/gitops_publish.task.ts +92 -27
  91. package/src/lib/gitops_run.task.ts +39 -7
  92. package/src/lib/gitops_sync.task.ts +18 -3
  93. package/src/lib/gitops_task_helpers.ts +20 -3
  94. package/src/lib/gitops_validate.task.ts +30 -22
  95. package/src/lib/graph_validation.ts +26 -0
  96. package/src/lib/local_repo.ts +124 -88
  97. package/src/lib/log_helpers.ts +8 -26
  98. package/src/lib/multi_repo_publisher.ts +336 -353
  99. package/src/lib/operations.ts +6 -22
  100. package/src/lib/operations_defaults.ts +4 -20
  101. package/src/lib/output_helpers.ts +7 -6
  102. package/src/lib/paths.ts +0 -5
  103. package/src/lib/publish_gate.ts +53 -0
  104. package/src/lib/publish_steps.ts +149 -0
  105. package/src/lib/publishing_event.ts +16 -25
  106. package/src/lib/publishing_plan.ts +26 -6
  107. package/src/lib/publishing_plan_helpers.ts +5 -18
  108. package/src/lib/publishing_plan_logging.ts +19 -39
  109. package/src/lib/repo.svelte.ts +12 -15
  110. package/src/lib/version_utils.ts +30 -9
  111. package/dist/npm_install_helpers.d.ts +0 -23
  112. package/dist/npm_install_helpers.d.ts.map +0 -1
  113. package/dist/npm_install_helpers.js +0 -60
  114. package/dist/semver.d.ts +0 -26
  115. package/dist/semver.d.ts.map +0 -1
  116. package/dist/semver.js +0 -137
  117. package/dist/serialization_types.d.ts +0 -59
  118. package/dist/serialization_types.d.ts.map +0 -1
  119. package/dist/serialization_types.js +0 -42
  120. package/src/lib/npm_install_helpers.ts +0 -85
  121. package/src/lib/semver.ts +0 -170
  122. 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
- [Gro's public package patterns](https://github.com/fuzdev/gro/blob/main/src/docs/gro_plugin_sveltekit_app.md#well_known_package_json))
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 # 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)
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/grogarden/gro)
123
- and the [Fuz template](https://github.com/fuz-dev/fuz_template).
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
 
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type {PackageJson} from '@fuzdev/fuz_util/package_json.js';
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: {package_json: PackageJson} | {url: string; package_json: null};
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.package_json?.glyph}</Breadcrumb></nav>
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 { PackageJson } from '@fuzdev/fuz_util/package_json.js';
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
- package_json: PackageJson;
6
+ pkg_json: PkgJson;
7
7
  } | {
8
8
  url: string;
9
- package_json: null;
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,WAAW,EAAC,MAAM,kCAAkC,CAAC;AAElE,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,YAAY,EAAE,WAAW,CAAA;KAAC,GAAG;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,IAAI,CAAA;KAAC,CAAC;IACtE,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
+ {"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;AAEhE,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;AAwBF;;;;;;;;;;;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"}
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 { BumpType } from './semver.js';
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,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAG1C,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"}
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"}
@@ -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.library.package_json.version || '0.0.0';
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":"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"}
1
+ {"version":3,"file":"dependency_graph.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/dependency_graph.ts"],"names":[],"mappings":"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"}
@@ -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: library.package_json.version || '0.0.0',
30
+ version: package_json.version || '0.0.0',
31
31
  repo,
32
32
  dependencies: new Map(),
33
33
  dependents: new Set(),
34
- publishable: !!library.package_json.private === false, // eslint-disable-line @typescript-eslint/no-unnecessary-boolean-literal-compare
34
+ publishable: !package_json.private,
35
35
  };
36
36
  // Extract dependencies
37
- const deps = library.package_json.dependencies || EMPTY_OBJECT;
38
- const dev_deps = library.package_json.devDependencies || EMPTY_OBJECT;
39
- const peer_deps = library.package_json.peerDependencies || EMPTY_OBJECT;
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,CAiCzB,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"}
@@ -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, library_json, repo_config } of resolved_repos) {
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
  });
@@ -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"}
@@ -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;
@@ -10,6 +10,7 @@ export declare const Args: z.ZodObject<{
10
10
  markdown: "markdown";
11
11
  }>>;
12
12
  outfile: z.ZodOptional<z.ZodString>;
13
+ sync: z.ZodDefault<z.ZodBoolean>;
13
14
  }, z.core.$strict>;
14
15
  export type Args = z.infer<typeof Args>;
15
16
  /** @nodocs */
@@ -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;;;;;;;;;kBAcf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,cAAc;AACd,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAkC3B,CAAC"}
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 { DependencyGraphBuilder } from './dependency_graph.js';
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 validate (but don't throw on cycles for analyze)
34
- const { graph, publishing_order: order } = validate_dependency_graph(local_repos, {
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,
@@ -11,6 +11,7 @@ export declare const Args: z.ZodObject<{
11
11
  }>>;
12
12
  outfile: z.ZodOptional<z.ZodString>;
13
13
  verbose: z.ZodDefault<z.ZodBoolean>;
14
+ sync: z.ZodDefault<z.ZodBoolean>;
14
15
  }, z.core.$strict>;
15
16
  export type Args = z.infer<typeof Args>;
16
17
  /**
@@ -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;;;;;;;;;;kBAef,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAkC3B,CAAC"}
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"}
@@ -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;AACtC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAetB,cAAc;AACd,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;kBAsCf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,cAAc;AACd,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CA+F3B,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 { publish_repos, } from './multi_repo_publisher.js';
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.boolean().meta({ description: 'dual of no-plan' }).default(true),
31
- 'no-plan': z
32
+ plan: z
32
33
  .boolean()
33
- .meta({ description: 'skip plan confirmation before publishing' })
34
- .default(false),
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, skip_install, emit_json, outfile, verbose, } = args;
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
- // Show plan if requested (skip for dry runs)
64
- if (plan && wetrun) {
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
- const plan_result = await generate_publishing_plan(repos, { log, verbose });
67
- log_publishing_plan(plan_result, log, { verbose });
68
- if (plan_result.errors.length > 0) {
69
- throw new Error('Cannot proceed with publishing due to errors');
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 publish_repos(repos, options);
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 publish_repos function's logging
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 (!result.ok || fatal_error) {
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 publish_repos function's logging
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
- command: z.ZodString;
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;AAStB,eAAO,MAAM,IAAI;;;;;;;;kBAaf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAaxC,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CAgL3B,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"}