@fuzdev/fuz_gitops 0.57.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/LICENSE +21 -0
- package/README.md +119 -0
- package/dist/ModulesDetail.svelte +180 -0
- package/dist/ModulesDetail.svelte.d.ts +10 -0
- package/dist/ModulesDetail.svelte.d.ts.map +1 -0
- package/dist/ModulesNav.svelte +43 -0
- package/dist/ModulesNav.svelte.d.ts +11 -0
- package/dist/ModulesNav.svelte.d.ts.map +1 -0
- package/dist/ModulesPage.svelte +50 -0
- package/dist/ModulesPage.svelte.d.ts +9 -0
- package/dist/ModulesPage.svelte.d.ts.map +1 -0
- package/dist/PageFooter.svelte +15 -0
- package/dist/PageFooter.svelte.d.ts +19 -0
- package/dist/PageFooter.svelte.d.ts.map +1 -0
- package/dist/PageHeader.svelte +35 -0
- package/dist/PageHeader.svelte.d.ts +19 -0
- package/dist/PageHeader.svelte.d.ts.map +1 -0
- package/dist/PullRequestsDetail.svelte +53 -0
- package/dist/PullRequestsDetail.svelte.d.ts +10 -0
- package/dist/PullRequestsDetail.svelte.d.ts.map +1 -0
- package/dist/PullRequestsPage.svelte +47 -0
- package/dist/PullRequestsPage.svelte.d.ts +11 -0
- package/dist/PullRequestsPage.svelte.d.ts.map +1 -0
- package/dist/ReposTable.svelte +189 -0
- package/dist/ReposTable.svelte.d.ts +9 -0
- package/dist/ReposTable.svelte.d.ts.map +1 -0
- package/dist/ReposTree.svelte +88 -0
- package/dist/ReposTree.svelte.d.ts +11 -0
- package/dist/ReposTree.svelte.d.ts.map +1 -0
- package/dist/ReposTreeNav.svelte +55 -0
- package/dist/ReposTreeNav.svelte.d.ts +11 -0
- package/dist/ReposTreeNav.svelte.d.ts.map +1 -0
- package/dist/TablePage.svelte +46 -0
- package/dist/TablePage.svelte.d.ts +9 -0
- package/dist/TablePage.svelte.d.ts.map +1 -0
- package/dist/TreeItemPage.svelte +75 -0
- package/dist/TreeItemPage.svelte.d.ts +10 -0
- package/dist/TreeItemPage.svelte.d.ts.map +1 -0
- package/dist/TreePage.svelte +64 -0
- package/dist/TreePage.svelte.d.ts +9 -0
- package/dist/TreePage.svelte.d.ts.map +1 -0
- package/dist/changeset_generator.d.ts +38 -0
- package/dist/changeset_generator.d.ts.map +1 -0
- package/dist/changeset_generator.js +110 -0
- package/dist/changeset_reader.d.ts +75 -0
- package/dist/changeset_reader.d.ts.map +1 -0
- package/dist/changeset_reader.js +167 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/dependency_graph.d.ts +120 -0
- package/dist/dependency_graph.d.ts.map +1 -0
- package/dist/dependency_graph.js +341 -0
- package/dist/dependency_updater.d.ts +46 -0
- package/dist/dependency_updater.d.ts.map +1 -0
- package/dist/dependency_updater.js +213 -0
- package/dist/fetch_repo_data.d.ts +19 -0
- package/dist/fetch_repo_data.d.ts.map +1 -0
- package/dist/fetch_repo_data.js +49 -0
- package/dist/fs_fetch_value_cache.d.ts +24 -0
- package/dist/fs_fetch_value_cache.d.ts.map +1 -0
- package/dist/fs_fetch_value_cache.js +61 -0
- package/dist/git_operations.d.ts +54 -0
- package/dist/git_operations.d.ts.map +1 -0
- package/dist/git_operations.js +144 -0
- package/dist/github.d.ts +91 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +94 -0
- package/dist/github_helpers.d.ts +10 -0
- package/dist/github_helpers.d.ts.map +1 -0
- package/dist/github_helpers.js +13 -0
- package/dist/gitops_analyze.task.d.ts +17 -0
- package/dist/gitops_analyze.task.d.ts.map +1 -0
- package/dist/gitops_analyze.task.js +188 -0
- package/dist/gitops_config.d.ts +56 -0
- package/dist/gitops_config.d.ts.map +1 -0
- package/dist/gitops_config.js +63 -0
- package/dist/gitops_plan.task.d.ts +28 -0
- package/dist/gitops_plan.task.d.ts.map +1 -0
- package/dist/gitops_plan.task.js +217 -0
- package/dist/gitops_publish.task.d.ts +29 -0
- package/dist/gitops_publish.task.d.ts.map +1 -0
- package/dist/gitops_publish.task.js +178 -0
- package/dist/gitops_sync.task.d.ts +18 -0
- package/dist/gitops_sync.task.d.ts.map +1 -0
- package/dist/gitops_sync.task.js +95 -0
- package/dist/gitops_task_helpers.d.ts +63 -0
- package/dist/gitops_task_helpers.d.ts.map +1 -0
- package/dist/gitops_task_helpers.js +84 -0
- package/dist/gitops_validate.task.d.ts +12 -0
- package/dist/gitops_validate.task.d.ts.map +1 -0
- package/dist/gitops_validate.task.js +210 -0
- package/dist/graph_validation.d.ts +39 -0
- package/dist/graph_validation.d.ts.map +1 -0
- package/dist/graph_validation.js +79 -0
- package/dist/local_repo.d.ts +84 -0
- package/dist/local_repo.d.ts.map +1 -0
- package/dist/local_repo.js +213 -0
- package/dist/log_helpers.d.ts +43 -0
- package/dist/log_helpers.d.ts.map +1 -0
- package/dist/log_helpers.js +98 -0
- package/dist/multi_repo_publisher.d.ts +34 -0
- package/dist/multi_repo_publisher.d.ts.map +1 -0
- package/dist/multi_repo_publisher.js +364 -0
- package/dist/npm_install_helpers.d.ts +23 -0
- package/dist/npm_install_helpers.d.ts.map +1 -0
- package/dist/npm_install_helpers.js +60 -0
- package/dist/npm_registry.d.ts +46 -0
- package/dist/npm_registry.d.ts.map +1 -0
- package/dist/npm_registry.js +96 -0
- package/dist/operations.d.ts +409 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +34 -0
- package/dist/operations_defaults.d.ts +19 -0
- package/dist/operations_defaults.d.ts.map +1 -0
- package/dist/operations_defaults.js +279 -0
- package/dist/output_helpers.d.ts +27 -0
- package/dist/output_helpers.d.ts.map +1 -0
- package/dist/output_helpers.js +39 -0
- package/dist/paths.d.ts +11 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/preflight_checks.d.ts +47 -0
- package/dist/preflight_checks.d.ts.map +1 -0
- package/dist/preflight_checks.js +181 -0
- package/dist/publishing_plan.d.ts +100 -0
- package/dist/publishing_plan.d.ts.map +1 -0
- package/dist/publishing_plan.js +353 -0
- package/dist/publishing_plan_helpers.d.ts +30 -0
- package/dist/publishing_plan_helpers.d.ts.map +1 -0
- package/dist/publishing_plan_helpers.js +112 -0
- package/dist/publishing_plan_logging.d.ts +18 -0
- package/dist/publishing_plan_logging.d.ts.map +1 -0
- package/dist/publishing_plan_logging.js +342 -0
- package/dist/repo.svelte.d.ts +52 -0
- package/dist/repo.svelte.d.ts.map +1 -0
- package/dist/repo.svelte.js +70 -0
- package/dist/repo_ops.d.ts +57 -0
- package/dist/repo_ops.d.ts.map +1 -0
- package/dist/repo_ops.js +167 -0
- package/dist/resolved_gitops_config.d.ts +9 -0
- package/dist/resolved_gitops_config.d.ts.map +1 -0
- package/dist/resolved_gitops_config.js +12 -0
- package/dist/semver.d.ts +24 -0
- package/dist/semver.d.ts.map +1 -0
- package/dist/semver.js +140 -0
- package/dist/serialization_types.d.ts +57 -0
- package/dist/serialization_types.d.ts.map +1 -0
- package/dist/serialization_types.js +40 -0
- package/dist/version_utils.d.ts +48 -0
- package/dist/version_utils.d.ts.map +1 -0
- package/dist/version_utils.js +125 -0
- package/package.json +107 -0
- package/src/lib/changeset_generator.ts +162 -0
- package/src/lib/changeset_reader.ts +218 -0
- package/src/lib/constants.ts +8 -0
- package/src/lib/dependency_graph.ts +423 -0
- package/src/lib/dependency_updater.ts +297 -0
- package/src/lib/fetch_repo_data.ts +64 -0
- package/src/lib/fs_fetch_value_cache.ts +75 -0
- package/src/lib/git_operations.ts +208 -0
- package/src/lib/github.ts +128 -0
- package/src/lib/github_helpers.ts +31 -0
- package/src/lib/gitops_analyze.task.ts +261 -0
- package/src/lib/gitops_config.ts +123 -0
- package/src/lib/gitops_plan.task.ts +272 -0
- package/src/lib/gitops_publish.task.ts +227 -0
- package/src/lib/gitops_sync.task.ts +109 -0
- package/src/lib/gitops_task_helpers.ts +126 -0
- package/src/lib/gitops_validate.task.ts +248 -0
- package/src/lib/graph_validation.ts +109 -0
- package/src/lib/local_repo.ts +359 -0
- package/src/lib/log_helpers.ts +147 -0
- package/src/lib/multi_repo_publisher.ts +464 -0
- package/src/lib/npm_install_helpers.ts +85 -0
- package/src/lib/npm_registry.ts +143 -0
- package/src/lib/operations.ts +334 -0
- package/src/lib/operations_defaults.ts +335 -0
- package/src/lib/output_helpers.ts +64 -0
- package/src/lib/paths.ts +11 -0
- package/src/lib/preflight_checks.ts +269 -0
- package/src/lib/publishing_plan.ts +531 -0
- package/src/lib/publishing_plan_helpers.ts +145 -0
- package/src/lib/publishing_plan_logging.ts +470 -0
- package/src/lib/repo.svelte.ts +95 -0
- package/src/lib/repo_ops.ts +213 -0
- package/src/lib/resolved_gitops_config.ts +27 -0
- package/src/lib/semver.ts +166 -0
- package/src/lib/serialization_types.ts +90 -0
- package/src/lib/version_utils.ts +150 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { styleText as st } from 'node:util';
|
|
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';
|
|
6
|
+
import { format_wildcard_dependencies, format_dev_cycles, format_production_cycles, } from './log_helpers.js';
|
|
7
|
+
import { format_and_output } from './output_helpers.js';
|
|
8
|
+
/** @nodocs */
|
|
9
|
+
export const Args = z.strictObject({
|
|
10
|
+
path: z
|
|
11
|
+
.string()
|
|
12
|
+
.meta({ description: 'path to the gitops config file, absolute or relative to the cwd' })
|
|
13
|
+
.default('gitops.config.ts'),
|
|
14
|
+
dir: z
|
|
15
|
+
.string()
|
|
16
|
+
.meta({ description: 'path containing the repos, defaults to the parent of the `path` dir' })
|
|
17
|
+
.optional(),
|
|
18
|
+
format: z
|
|
19
|
+
.enum(['stdout', 'json', 'markdown'])
|
|
20
|
+
.meta({ description: 'output format' })
|
|
21
|
+
.default('stdout'),
|
|
22
|
+
outfile: z.string().meta({ description: 'write output to file instead of logging' }).optional(),
|
|
23
|
+
});
|
|
24
|
+
/** @nodocs */
|
|
25
|
+
export const task = {
|
|
26
|
+
Args,
|
|
27
|
+
summary: 'analyze dependency structure and relationships across repos',
|
|
28
|
+
run: async ({ args, log }) => {
|
|
29
|
+
const { path, dir, format, outfile } = args;
|
|
30
|
+
// Get repos ready (without downloading)
|
|
31
|
+
const { local_repos } = await get_gitops_ready({ path, dir, download: false, log });
|
|
32
|
+
// Build dependency graph and validate (but don't throw on cycles for analyze)
|
|
33
|
+
const { graph, publishing_order: order } = validate_dependency_graph(local_repos, {
|
|
34
|
+
log,
|
|
35
|
+
throw_on_prod_cycles: false, // Analyze should report, not throw
|
|
36
|
+
log_cycles: false, // We'll show cycles in our formatted output
|
|
37
|
+
log_order: false, // We'll show order in our formatted output
|
|
38
|
+
});
|
|
39
|
+
// Perform additional analysis
|
|
40
|
+
const builder = new DependencyGraphBuilder();
|
|
41
|
+
const analysis = builder.analyze(graph);
|
|
42
|
+
// Publishing order (may be null if prod cycles exist)
|
|
43
|
+
const publishing_order = order.length > 0 ? order : null;
|
|
44
|
+
// Format and output using output_helpers
|
|
45
|
+
const data = {
|
|
46
|
+
repos: local_repos,
|
|
47
|
+
graph,
|
|
48
|
+
analysis,
|
|
49
|
+
publishing_order,
|
|
50
|
+
};
|
|
51
|
+
await format_and_output(data, create_formatters(), { format, outfile, log });
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
// Create formatters for output_helpers
|
|
55
|
+
const create_formatters = () => ({
|
|
56
|
+
json: (data) => format_json(data.graph, data.analysis, data.publishing_order),
|
|
57
|
+
markdown: (data) => format_markdown(data.repos, data.graph, data.analysis, data.publishing_order),
|
|
58
|
+
stdout: (data, log) => format_stdout(data.repos, data.graph, data.analysis, data.publishing_order, log),
|
|
59
|
+
});
|
|
60
|
+
// Helper to calculate common statistics
|
|
61
|
+
const calculate_stats = (graph) => {
|
|
62
|
+
const total_deps = Array.from(graph.nodes.values()).reduce((sum, node) => sum + node.dependencies.size, 0);
|
|
63
|
+
const internal_deps = Array.from(graph.nodes.values()).reduce((sum, node) => sum + Array.from(node.dependencies.keys()).filter((name) => graph.nodes.has(name)).length, 0);
|
|
64
|
+
return { total_deps, internal_deps };
|
|
65
|
+
};
|
|
66
|
+
const format_json = (graph, analysis, publishing_order) => {
|
|
67
|
+
const output = {
|
|
68
|
+
graph: graph.toJSON(),
|
|
69
|
+
analysis,
|
|
70
|
+
publishing_order,
|
|
71
|
+
};
|
|
72
|
+
return JSON.stringify(output, null, 2);
|
|
73
|
+
};
|
|
74
|
+
const format_markdown = (repos, graph, analysis, publishing_order) => {
|
|
75
|
+
const lines = ['# Dependency Analysis'];
|
|
76
|
+
// Summary stats
|
|
77
|
+
const { total_deps, internal_deps } = calculate_stats(graph);
|
|
78
|
+
lines.push('', '## Summary', '');
|
|
79
|
+
lines.push(`- **Total packages**: ${repos.length}`);
|
|
80
|
+
lines.push(`- **Total dependencies**: ${total_deps}`);
|
|
81
|
+
lines.push(`- **Internal dependencies**: ${internal_deps}`);
|
|
82
|
+
lines.push(`- **Wildcard dependencies**: ${analysis.wildcard_deps.length}`);
|
|
83
|
+
lines.push(`- **Production/peer cycles**: ${analysis.production_cycles.length}`);
|
|
84
|
+
lines.push(`- **Dev cycles**: ${analysis.dev_cycles.length}`);
|
|
85
|
+
// Publishing order
|
|
86
|
+
if (publishing_order) {
|
|
87
|
+
lines.push('', '## Publishing Order', '');
|
|
88
|
+
publishing_order.forEach((name, i) => {
|
|
89
|
+
const node = graph.get_node(name);
|
|
90
|
+
const version = node ? `v${node.version}` : '';
|
|
91
|
+
lines.push(`${i + 1}. \`${name}\` ${version}`);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// Cycles (show problems first)
|
|
95
|
+
if (analysis.production_cycles.length > 0) {
|
|
96
|
+
lines.push('', '## ❌ Production/Peer Circular Dependencies', '');
|
|
97
|
+
lines.push('> **These block publishing and must be resolved!**');
|
|
98
|
+
lines.push('');
|
|
99
|
+
for (const cycle of analysis.production_cycles) {
|
|
100
|
+
lines.push(`- ${cycle.map((n) => `\`${n}\``).join(' → ')}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (analysis.dev_cycles.length > 0) {
|
|
104
|
+
lines.push('', '## ⚠️ Dev Circular Dependencies', '');
|
|
105
|
+
lines.push('> These are normal and do not block publishing.');
|
|
106
|
+
lines.push('');
|
|
107
|
+
for (const cycle of analysis.dev_cycles) {
|
|
108
|
+
lines.push(`- ${cycle.map((n) => `\`${n}\``).join(' → ')}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Wildcard dependencies
|
|
112
|
+
if (analysis.wildcard_deps.length > 0) {
|
|
113
|
+
lines.push('', '## ⚠️ Wildcard Dependencies', '');
|
|
114
|
+
lines.push('| Package | Dependency | Version |');
|
|
115
|
+
lines.push('|---------|------------|---------|');
|
|
116
|
+
for (const { pkg, dep, version } of analysis.wildcard_deps) {
|
|
117
|
+
lines.push(`| \`${pkg}\` | \`${dep}\` | \`${version}\` |`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Dependency graph (simplified)
|
|
121
|
+
lines.push('', '## Internal Dependencies', '');
|
|
122
|
+
for (const node of graph.nodes.values()) {
|
|
123
|
+
const internal_deps = Array.from(node.dependencies.entries()).filter(([name]) => graph.nodes.has(name));
|
|
124
|
+
if (internal_deps.length > 0) {
|
|
125
|
+
lines.push(`- **${node.name}**`);
|
|
126
|
+
for (const [dep_name, spec] of internal_deps) {
|
|
127
|
+
const badge = spec.type === 'peer' ? '(peer)' : spec.type === 'dev' ? '(dev)' : '';
|
|
128
|
+
lines.push(` - ${dep_name} ${badge}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return lines;
|
|
133
|
+
};
|
|
134
|
+
const format_stdout = (repos, graph, analysis, publishing_order, log) => {
|
|
135
|
+
log.info(st('cyan', `📊 Analyzing ${repos.length} repositories...`));
|
|
136
|
+
// Publishing order
|
|
137
|
+
if (publishing_order) {
|
|
138
|
+
log.info(st('yellow', 'Publishing order:'));
|
|
139
|
+
publishing_order.forEach((name, i) => {
|
|
140
|
+
const node = graph.get_node(name);
|
|
141
|
+
const version = node ? node.version : 'unknown';
|
|
142
|
+
log.info(` ${st('dim', `${i + 1}.`)} ${name} ${st('dim', `(${version})`)}`);
|
|
143
|
+
});
|
|
144
|
+
log.info('');
|
|
145
|
+
}
|
|
146
|
+
// Dependencies summary
|
|
147
|
+
log.info(st('yellow', 'Dependency relationships:'));
|
|
148
|
+
for (const node of graph.nodes.values()) {
|
|
149
|
+
const internal_deps = Array.from(node.dependencies.entries()).filter(([name]) => graph.nodes.has(name));
|
|
150
|
+
if (internal_deps.length > 0) {
|
|
151
|
+
log.info(` ${st('cyan', node.name)}`);
|
|
152
|
+
for (const [dep_name, spec] of internal_deps) {
|
|
153
|
+
const type_color = spec.type === 'peer' ? 'magenta' : spec.type === 'dev' ? 'dim' : 'white';
|
|
154
|
+
log.info(` ${st(type_color, '→')} ${dep_name} ${st('dim', `(${spec.type}: ${spec.version})`)}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
log.info('');
|
|
159
|
+
// Dependency analysis
|
|
160
|
+
for (const line of format_wildcard_dependencies(analysis)) {
|
|
161
|
+
log.info(line);
|
|
162
|
+
}
|
|
163
|
+
for (const line of format_production_cycles(analysis)) {
|
|
164
|
+
log.info(line);
|
|
165
|
+
}
|
|
166
|
+
for (const line of format_dev_cycles(analysis)) {
|
|
167
|
+
log.info(line);
|
|
168
|
+
}
|
|
169
|
+
// Success message based on cycle detection
|
|
170
|
+
const has_prod_cycles = analysis.production_cycles.length > 0;
|
|
171
|
+
const has_dev_cycles = analysis.dev_cycles.length > 0;
|
|
172
|
+
if (!has_prod_cycles && !has_dev_cycles) {
|
|
173
|
+
log.info(st('green', '✅ No circular dependencies detected'));
|
|
174
|
+
}
|
|
175
|
+
else if (!has_prod_cycles) {
|
|
176
|
+
log.info(st('green', '✓ Publishing order computed successfully (dev deps excluded)'));
|
|
177
|
+
}
|
|
178
|
+
// Summary
|
|
179
|
+
const { total_deps, internal_deps } = calculate_stats(graph);
|
|
180
|
+
log.info('');
|
|
181
|
+
log.info(st('cyan', 'Summary:'));
|
|
182
|
+
log.info(` Total packages: ${repos.length}`);
|
|
183
|
+
log.info(` Total dependencies: ${total_deps}`);
|
|
184
|
+
log.info(` Internal dependencies: ${internal_deps}`);
|
|
185
|
+
log.info(` Wildcard dependencies: ${analysis.wildcard_deps.length}`);
|
|
186
|
+
log.info(` Production/peer circular dependencies: ${analysis.production_cycles.length}`);
|
|
187
|
+
log.info(` Dev circular dependencies: ${analysis.dev_cycles.length}`);
|
|
188
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration types and normalization for gitops multi-repo management.
|
|
3
|
+
*
|
|
4
|
+
* Two-phase configuration system:
|
|
5
|
+
* - `RawGitopsConfig` - User-friendly format with optional fields and flexible types
|
|
6
|
+
* - `GitopsConfig` - Internal format with required fields and strict types
|
|
7
|
+
*
|
|
8
|
+
* This allows users to provide minimal configs (e.g., just URLs as strings) while
|
|
9
|
+
* the system works with normalized configs internally for type safety.
|
|
10
|
+
*/
|
|
11
|
+
import type { Url } from '@fuzdev/fuz_util/url.js';
|
|
12
|
+
import type { GitBranch } from '@fuzdev/fuz_util/git.js';
|
|
13
|
+
export interface GitopsConfig {
|
|
14
|
+
repos: Array<GitopsRepoConfig>;
|
|
15
|
+
repos_dir: string;
|
|
16
|
+
}
|
|
17
|
+
export type CreateGitopsConfig = (base_config: GitopsConfig) => RawGitopsConfig | Promise<RawGitopsConfig>;
|
|
18
|
+
export interface RawGitopsConfig {
|
|
19
|
+
repos?: Array<Url | RawGitopsRepoConfig>;
|
|
20
|
+
repos_dir?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface GitopsRepoConfig {
|
|
23
|
+
/**
|
|
24
|
+
* The HTTPS URL to the repo. Does not include a `.git` suffix.
|
|
25
|
+
* @example 'https://github.com/fuzdev/fuz_ui'
|
|
26
|
+
*/
|
|
27
|
+
repo_url: Url;
|
|
28
|
+
/**
|
|
29
|
+
* Relative or absolute path to the repo's local directory.
|
|
30
|
+
* If `null`, the directory is inferred from the URL and cwd.
|
|
31
|
+
* @example 'relative/path/to/repo'
|
|
32
|
+
* @example '/absolute/path/to/repo'
|
|
33
|
+
*/
|
|
34
|
+
repo_dir: string | null;
|
|
35
|
+
/**
|
|
36
|
+
* The branch name to use when fetching the repo. Defaults to `main`.
|
|
37
|
+
*/
|
|
38
|
+
branch: GitBranch;
|
|
39
|
+
}
|
|
40
|
+
export interface RawGitopsRepoConfig {
|
|
41
|
+
repo_url: Url;
|
|
42
|
+
repo_dir?: string | null;
|
|
43
|
+
branch?: GitBranch;
|
|
44
|
+
}
|
|
45
|
+
export declare const create_empty_gitops_config: () => GitopsConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Transforms a `RawGitopsConfig` to the more strict `GitopsConfig`.
|
|
48
|
+
* This allows users to provide a more relaxed config.
|
|
49
|
+
*/
|
|
50
|
+
export declare const normalize_gitops_config: (raw_config: RawGitopsConfig) => GitopsConfig;
|
|
51
|
+
export interface GitopsConfigModule {
|
|
52
|
+
readonly default: RawGitopsConfig | CreateGitopsConfig;
|
|
53
|
+
}
|
|
54
|
+
export declare const load_gitops_config: (config_path: string) => Promise<GitopsConfig | null>;
|
|
55
|
+
export declare const validate_gitops_config_module: (config_module: any, config_path: string) => asserts config_module is GitopsConfigModule;
|
|
56
|
+
//# sourceMappingURL=gitops_config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitops_config.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/gitops_config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,yBAAyB,CAAC;AAGjD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAIvD,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAChC,WAAW,EAAE,YAAY,KACrB,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAChC;;;OAGG;IACH,QAAQ,EAAE,GAAG,CAAC;IAEd;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,MAAM,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,eAAO,MAAM,0BAA0B,QAAO,YAG5C,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,YAAY,eAAe,KAAG,YAUrE,CAAC;AAaF,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,kBAAkB,CAAC;CACvD;AAED,eAAO,MAAM,kBAAkB,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAazF,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,CAC3C,aAAa,EAAE,GAAG,EAClB,WAAW,EAAE,MAAM,KACf,OAAO,CAAC,aAAa,IAAI,kBAS7B,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration types and normalization for gitops multi-repo management.
|
|
3
|
+
*
|
|
4
|
+
* Two-phase configuration system:
|
|
5
|
+
* - `RawGitopsConfig` - User-friendly format with optional fields and flexible types
|
|
6
|
+
* - `GitopsConfig` - Internal format with required fields and strict types
|
|
7
|
+
*
|
|
8
|
+
* This allows users to provide minimal configs (e.g., just URLs as strings) while
|
|
9
|
+
* the system works with normalized configs internally for type safety.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { strip_end } from '@fuzdev/fuz_util/string.js';
|
|
13
|
+
import { DEFAULT_REPOS_DIR } from './paths.js';
|
|
14
|
+
export const create_empty_gitops_config = () => ({
|
|
15
|
+
repos: [],
|
|
16
|
+
repos_dir: DEFAULT_REPOS_DIR,
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Transforms a `RawGitopsConfig` to the more strict `GitopsConfig`.
|
|
20
|
+
* This allows users to provide a more relaxed config.
|
|
21
|
+
*/
|
|
22
|
+
export const normalize_gitops_config = (raw_config) => {
|
|
23
|
+
const empty_config = create_empty_gitops_config();
|
|
24
|
+
// All of the raw config properties are optional,
|
|
25
|
+
// so fall back to the empty values when `undefined`.
|
|
26
|
+
const { repos, repos_dir } = raw_config;
|
|
27
|
+
return {
|
|
28
|
+
repos: repos ? repos.map((r) => parse_fuz_repo_config(r)) : empty_config.repos,
|
|
29
|
+
// Default to two dirs up from config if not specified
|
|
30
|
+
repos_dir: repos_dir ?? DEFAULT_REPOS_DIR,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const parse_fuz_repo_config = (r) => {
|
|
34
|
+
if (typeof r === 'string') {
|
|
35
|
+
return { repo_url: r, repo_dir: null, branch: 'main' }; // TODO @zts use flavored for GitBranch
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
repo_url: strip_end(r.repo_url, '.git'),
|
|
39
|
+
repo_dir: r.repo_dir ?? null,
|
|
40
|
+
branch: r.branch ?? 'main', // TODO @zts use flavored for GitBranch
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export const load_gitops_config = async (config_path) => {
|
|
44
|
+
if (!existsSync(config_path)) {
|
|
45
|
+
// No user config file found.
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
// Import the user's `gitops.config.ts`.
|
|
49
|
+
const config_module = await import(config_path);
|
|
50
|
+
validate_gitops_config_module(config_module, config_path);
|
|
51
|
+
return normalize_gitops_config(typeof config_module.default === 'function'
|
|
52
|
+
? await config_module.default(create_empty_gitops_config())
|
|
53
|
+
: config_module.default);
|
|
54
|
+
};
|
|
55
|
+
export const validate_gitops_config_module = (config_module, config_path) => {
|
|
56
|
+
const config = config_module.default;
|
|
57
|
+
if (!config) {
|
|
58
|
+
throw Error(`Invalid Fuz config module at ${config_path}: expected a default export`);
|
|
59
|
+
}
|
|
60
|
+
else if (!(typeof config === 'function' || typeof config === 'object')) {
|
|
61
|
+
throw Error(`Invalid Fuz config module at ${config_path}: the default export must be a function or object`);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Task } from '@ryanatkn/gro';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/** @nodocs */
|
|
4
|
+
export declare const Args: z.ZodObject<{
|
|
5
|
+
path: z.ZodDefault<z.ZodString>;
|
|
6
|
+
dir: z.ZodOptional<z.ZodString>;
|
|
7
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
8
|
+
json: "json";
|
|
9
|
+
stdout: "stdout";
|
|
10
|
+
markdown: "markdown";
|
|
11
|
+
}>>;
|
|
12
|
+
outfile: z.ZodOptional<z.ZodString>;
|
|
13
|
+
verbose: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
}, z.core.$strict>;
|
|
15
|
+
export type Args = z.infer<typeof Args>;
|
|
16
|
+
/**
|
|
17
|
+
* Generate a publishing plan showing what would happen during multi-repo publishing.
|
|
18
|
+
* Shows version changes, dependency updates, and breaking change cascades.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* gro gitops_plan
|
|
22
|
+
* gro gitops_plan --dir ../repos
|
|
23
|
+
* gro gitops_plan --path ./custom.config.ts
|
|
24
|
+
*
|
|
25
|
+
* @nodocs
|
|
26
|
+
*/
|
|
27
|
+
export declare const task: Task<Args>;
|
|
28
|
+
//# sourceMappingURL=gitops_plan.task.d.ts.map
|
|
@@ -0,0 +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,eAAe,CAAC;AACxC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAYtB,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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { styleText as st } from 'node:util';
|
|
3
|
+
import { get_gitops_ready } from './gitops_task_helpers.js';
|
|
4
|
+
import { generate_publishing_plan, log_publishing_plan, } from './publishing_plan.js';
|
|
5
|
+
import { format_and_output } from './output_helpers.js';
|
|
6
|
+
/** @nodocs */
|
|
7
|
+
export const Args = z.strictObject({
|
|
8
|
+
path: z
|
|
9
|
+
.string()
|
|
10
|
+
.meta({ description: 'path to the gitops config file, absolute or relative to the cwd' })
|
|
11
|
+
.default('gitops.config.ts'),
|
|
12
|
+
dir: z
|
|
13
|
+
.string()
|
|
14
|
+
.meta({ description: 'path containing the repos, defaults to the parent of the `path` dir' })
|
|
15
|
+
.optional(),
|
|
16
|
+
format: z
|
|
17
|
+
.enum(['stdout', 'json', 'markdown'])
|
|
18
|
+
.meta({ description: 'output format' })
|
|
19
|
+
.default('stdout'),
|
|
20
|
+
outfile: z.string().meta({ description: 'write output to file instead of logging' }).optional(),
|
|
21
|
+
verbose: z.boolean().meta({ description: 'show additional details' }).default(false),
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Generate a publishing plan showing what would happen during multi-repo publishing.
|
|
25
|
+
* Shows version changes, dependency updates, and breaking change cascades.
|
|
26
|
+
*
|
|
27
|
+
* Usage:
|
|
28
|
+
* gro gitops_plan
|
|
29
|
+
* gro gitops_plan --dir ../repos
|
|
30
|
+
* gro gitops_plan --path ./custom.config.ts
|
|
31
|
+
*
|
|
32
|
+
* @nodocs
|
|
33
|
+
*/
|
|
34
|
+
export const task = {
|
|
35
|
+
summary: 'generate a publishing plan based on changesets',
|
|
36
|
+
Args,
|
|
37
|
+
run: async ({ args, log }) => {
|
|
38
|
+
const { dir, path, format, outfile, verbose } = args;
|
|
39
|
+
log.info(st('cyan', 'Generating multi-repo publishing plan...'));
|
|
40
|
+
// Load local repos
|
|
41
|
+
const { local_repos } = await get_gitops_ready({
|
|
42
|
+
path,
|
|
43
|
+
dir,
|
|
44
|
+
download: false, // Don't download if missing
|
|
45
|
+
log,
|
|
46
|
+
});
|
|
47
|
+
if (local_repos.length === 0) {
|
|
48
|
+
log.error('No local repos found');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
log.info(` Found ${local_repos.length} local repos`);
|
|
52
|
+
// Generate publishing plan
|
|
53
|
+
const plan = await generate_publishing_plan(local_repos, { log, verbose });
|
|
54
|
+
// Format and output using output_helpers
|
|
55
|
+
await format_and_output(plan, create_plan_formatters({ verbose }), { format, outfile, log });
|
|
56
|
+
// Exit with error if there are blocking issues
|
|
57
|
+
if (plan.errors.length > 0) {
|
|
58
|
+
throw new Error('Publishing plan found errors that would block publishing');
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const create_plan_formatters = (options = {}) => ({
|
|
63
|
+
json: (plan) => {
|
|
64
|
+
const output = {
|
|
65
|
+
publishing_order: plan.publishing_order,
|
|
66
|
+
version_changes: plan.version_changes,
|
|
67
|
+
dependency_updates: plan.dependency_updates,
|
|
68
|
+
breaking_cascades: Object.fromEntries(plan.breaking_cascades),
|
|
69
|
+
warnings: plan.warnings,
|
|
70
|
+
info: plan.info,
|
|
71
|
+
errors: plan.errors,
|
|
72
|
+
};
|
|
73
|
+
return JSON.stringify(output, null, 2);
|
|
74
|
+
},
|
|
75
|
+
markdown: (plan) => format_plan_as_markdown(plan),
|
|
76
|
+
stdout: (plan, log) => log_publishing_plan(plan, log, options),
|
|
77
|
+
});
|
|
78
|
+
const format_plan_as_markdown = (plan) => {
|
|
79
|
+
const lines = [];
|
|
80
|
+
const { publishing_order, version_changes, dependency_updates, breaking_cascades, warnings, info, errors, } = plan;
|
|
81
|
+
lines.push('# Publishing Plan');
|
|
82
|
+
lines.push('');
|
|
83
|
+
// Errors
|
|
84
|
+
if (errors.length > 0) {
|
|
85
|
+
lines.push('## ❌ Errors');
|
|
86
|
+
lines.push('');
|
|
87
|
+
for (const error of errors) {
|
|
88
|
+
lines.push(`- ${error}`);
|
|
89
|
+
}
|
|
90
|
+
lines.push('');
|
|
91
|
+
}
|
|
92
|
+
// Publishing order
|
|
93
|
+
if (publishing_order.length > 0) {
|
|
94
|
+
lines.push('## Publishing Order');
|
|
95
|
+
lines.push('');
|
|
96
|
+
lines.push(publishing_order.map((p) => `\`${p}\``).join(' → '));
|
|
97
|
+
lines.push('');
|
|
98
|
+
}
|
|
99
|
+
// Version changes
|
|
100
|
+
if (version_changes.length > 0) {
|
|
101
|
+
const with_changesets = version_changes.filter((vc) => vc.has_changesets && !vc.needs_bump_escalation);
|
|
102
|
+
const with_escalation = version_changes.filter((vc) => vc.needs_bump_escalation);
|
|
103
|
+
const with_auto_changesets = version_changes.filter((vc) => vc.will_generate_changeset);
|
|
104
|
+
if (with_changesets.length > 0) {
|
|
105
|
+
lines.push('## Version Changes (from changesets)');
|
|
106
|
+
lines.push('');
|
|
107
|
+
lines.push('| Package | From | To | Bump | Major |');
|
|
108
|
+
lines.push('|---------|------|----|------|-------|');
|
|
109
|
+
for (const change of with_changesets) {
|
|
110
|
+
const is_major = change.bump_type === 'major' ? '💥 Yes' : 'No';
|
|
111
|
+
lines.push(`| \`${change.package_name}\` | ${change.from} | ${change.to} | ${change.bump_type} | ${is_major} |`);
|
|
112
|
+
}
|
|
113
|
+
lines.push('');
|
|
114
|
+
}
|
|
115
|
+
if (with_escalation.length > 0) {
|
|
116
|
+
lines.push('## Version Changes (bump escalation required)');
|
|
117
|
+
lines.push('');
|
|
118
|
+
lines.push('| Package | From | To | Changesets Bump | Required Bump | Major |');
|
|
119
|
+
lines.push('|---------|------|-----|-----------------|---------------|-------|');
|
|
120
|
+
for (const change of with_escalation) {
|
|
121
|
+
const is_major = change.bump_type === 'major' ? '💥 Yes' : 'No';
|
|
122
|
+
lines.push(`| \`${change.package_name}\` | ${change.from} | ${change.to} | ${change.existing_bump} | ${change.required_bump} | ${is_major} |`);
|
|
123
|
+
}
|
|
124
|
+
lines.push('');
|
|
125
|
+
lines.push('> ⬆️ These packages have changesets, but dependencies require a larger version bump.');
|
|
126
|
+
lines.push('');
|
|
127
|
+
}
|
|
128
|
+
if (with_auto_changesets.length > 0) {
|
|
129
|
+
lines.push('## Version Changes (auto-generated for dependency updates)');
|
|
130
|
+
lines.push('');
|
|
131
|
+
lines.push('| Package | From | To | Bump | Major |');
|
|
132
|
+
lines.push('|---------|------|-----|------|-------|');
|
|
133
|
+
for (const change of with_auto_changesets) {
|
|
134
|
+
const is_major = change.bump_type === 'major' ? '💥 Yes' : 'No';
|
|
135
|
+
lines.push(`| \`${change.package_name}\` | ${change.from} | ${change.to} | ${change.bump_type} | ${is_major} |`);
|
|
136
|
+
}
|
|
137
|
+
lines.push('');
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
lines.push('## No Packages to Publish');
|
|
142
|
+
lines.push('');
|
|
143
|
+
lines.push('No packages have changesets to publish.');
|
|
144
|
+
lines.push('');
|
|
145
|
+
}
|
|
146
|
+
// Dependency cascades
|
|
147
|
+
if (breaking_cascades.size > 0) {
|
|
148
|
+
lines.push('## Dependency Cascades');
|
|
149
|
+
lines.push('');
|
|
150
|
+
for (const [pkg, affected] of breaking_cascades) {
|
|
151
|
+
lines.push(`- \`${pkg}\` affects: ${affected.map((a) => `\`${a}\``).join(', ')}`);
|
|
152
|
+
}
|
|
153
|
+
lines.push('');
|
|
154
|
+
}
|
|
155
|
+
// Dependency updates - show diff-style
|
|
156
|
+
if (dependency_updates.length > 0) {
|
|
157
|
+
// Group by package
|
|
158
|
+
const updates_by_package = new Map();
|
|
159
|
+
for (const update of dependency_updates) {
|
|
160
|
+
const updates = updates_by_package.get(update.dependent_package) || [];
|
|
161
|
+
updates.push(update);
|
|
162
|
+
updates_by_package.set(update.dependent_package, updates);
|
|
163
|
+
}
|
|
164
|
+
lines.push('## Dependency Updates');
|
|
165
|
+
lines.push('');
|
|
166
|
+
for (const [pkg, updates] of updates_by_package) {
|
|
167
|
+
const has_version_change = version_changes.some((vc) => vc.package_name === pkg);
|
|
168
|
+
const label = has_version_change ? '' : ' (no republish)';
|
|
169
|
+
lines.push(`### ${pkg}${label}`);
|
|
170
|
+
lines.push('');
|
|
171
|
+
lines.push('```diff');
|
|
172
|
+
for (const update of updates) {
|
|
173
|
+
const type_label = update.type === 'dependencies'
|
|
174
|
+
? 'prod'
|
|
175
|
+
: update.type === 'peerDependencies'
|
|
176
|
+
? 'peer'
|
|
177
|
+
: 'dev';
|
|
178
|
+
lines.push(`- "${update.updated_dependency}": "${update.current_version}" # ${type_label}`);
|
|
179
|
+
lines.push(`+ "${update.updated_dependency}": "${update.new_version}" # ${type_label}`);
|
|
180
|
+
}
|
|
181
|
+
lines.push('```');
|
|
182
|
+
lines.push('');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Warnings (actual issues requiring attention)
|
|
186
|
+
if (warnings.length > 0) {
|
|
187
|
+
lines.push('## ⚠️ Warnings');
|
|
188
|
+
lines.push('');
|
|
189
|
+
lines.push('*Issues that require attention:*');
|
|
190
|
+
lines.push('');
|
|
191
|
+
for (const warning of warnings) {
|
|
192
|
+
lines.push(`- ${warning}`);
|
|
193
|
+
}
|
|
194
|
+
lines.push('');
|
|
195
|
+
}
|
|
196
|
+
// Info (packages with no changes - normal status)
|
|
197
|
+
if (info.length > 0) {
|
|
198
|
+
lines.push('## ℹ️ No Changes to Publish');
|
|
199
|
+
lines.push('');
|
|
200
|
+
lines.push('*These packages have no changesets and no dependency updates:*');
|
|
201
|
+
lines.push('');
|
|
202
|
+
for (const pkg of info) {
|
|
203
|
+
lines.push(`- \`${pkg}\``);
|
|
204
|
+
}
|
|
205
|
+
lines.push('');
|
|
206
|
+
}
|
|
207
|
+
// Summary
|
|
208
|
+
const major_bump_count = version_changes.filter((vc) => vc.bump_type === 'major').length;
|
|
209
|
+
lines.push('## Summary');
|
|
210
|
+
lines.push('');
|
|
211
|
+
lines.push(`- **Packages to publish**: ${version_changes.length}`);
|
|
212
|
+
lines.push(`- **Dependency updates**: ${dependency_updates.length}`);
|
|
213
|
+
lines.push(`- **Major version bumps**: ${major_bump_count}`);
|
|
214
|
+
lines.push(`- **Warnings**: ${warnings.length}`);
|
|
215
|
+
lines.push(`- **Errors**: ${errors.length}`);
|
|
216
|
+
return lines;
|
|
217
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Task } from '@ryanatkn/gro';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/** @nodocs */
|
|
4
|
+
export declare const Args: z.ZodObject<{
|
|
5
|
+
path: z.ZodDefault<z.ZodString>;
|
|
6
|
+
dir: z.ZodOptional<z.ZodString>;
|
|
7
|
+
peer_strategy: z.ZodDefault<z.ZodEnum<{
|
|
8
|
+
exact: "exact";
|
|
9
|
+
caret: "caret";
|
|
10
|
+
tilde: "tilde";
|
|
11
|
+
}>>;
|
|
12
|
+
dry_run: z.ZodDefault<z.ZodBoolean>;
|
|
13
|
+
format: z.ZodDefault<z.ZodEnum<{
|
|
14
|
+
json: "json";
|
|
15
|
+
stdout: "stdout";
|
|
16
|
+
markdown: "markdown";
|
|
17
|
+
}>>;
|
|
18
|
+
deploy: z.ZodDefault<z.ZodBoolean>;
|
|
19
|
+
plan: z.ZodDefault<z.ZodBoolean>;
|
|
20
|
+
'no-plan': z.ZodDefault<z.ZodBoolean>;
|
|
21
|
+
max_wait: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
skip_install: z.ZodDefault<z.ZodBoolean>;
|
|
23
|
+
outfile: z.ZodOptional<z.ZodString>;
|
|
24
|
+
verbose: z.ZodDefault<z.ZodBoolean>;
|
|
25
|
+
}, z.core.$strict>;
|
|
26
|
+
export type Args = z.infer<typeof Args>;
|
|
27
|
+
/** @nodocs */
|
|
28
|
+
export declare const task: Task<Args>;
|
|
29
|
+
//# sourceMappingURL=gitops_publish.task.d.ts.map
|
|
@@ -0,0 +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,eAAe,CAAC;AACxC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAatB,cAAc;AACd,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;kBAqCf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,cAAc;AACd,eAAO,MAAM,IAAI,EAAE,IAAI,CAAC,IAAI,CA0F3B,CAAC"}
|