@git.zone/cli 2.14.3 → 2.16.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 (55) hide show
  1. package/.smartconfig.json +36 -11
  2. package/assets/templates/service/npmextra.json +8 -2
  3. package/assets/templates/smartconfig/_smartconfig.json +5 -1
  4. package/assets/templates/website/npmextra.json +8 -2
  5. package/dist_ts/00_commitinfo_data.js +1 -1
  6. package/dist_ts/gitzone.cli.js +15 -1
  7. package/dist_ts/helpers.changelog.d.ts +16 -0
  8. package/dist_ts/helpers.changelog.js +114 -0
  9. package/dist_ts/helpers.smartconfigmigrations.d.ts +7 -0
  10. package/dist_ts/helpers.smartconfigmigrations.js +161 -0
  11. package/dist_ts/helpers.workflow.d.ts +97 -0
  12. package/dist_ts/helpers.workflow.js +258 -0
  13. package/dist_ts/mod_commit/index.js +190 -303
  14. package/dist_ts/mod_commit/mod.helpers.d.ts +23 -0
  15. package/dist_ts/mod_commit/mod.helpers.js +22 -15
  16. package/dist_ts/mod_commit/mod.ui.d.ts +1 -1
  17. package/dist_ts/mod_commit/mod.ui.js +7 -2
  18. package/dist_ts/mod_config/classes.commitconfig.d.ts +6 -0
  19. package/dist_ts/mod_config/classes.commitconfig.js +28 -4
  20. package/dist_ts/mod_config/classes.releaseconfig.js +13 -7
  21. package/dist_ts/mod_config/index.js +77 -29
  22. package/dist_ts/mod_format/formatters/smartconfig.formatter.js +3 -57
  23. package/dist_ts/mod_release/index.d.ts +3 -0
  24. package/dist_ts/mod_release/index.js +299 -0
  25. package/dist_ts/mod_release/mod.plugins.d.ts +3 -0
  26. package/dist_ts/mod_release/mod.plugins.js +4 -0
  27. package/dist_ts/mod_standard/index.js +29 -3
  28. package/dist_ts/mod_tools/classes.packagemanager.d.ts +27 -0
  29. package/dist_ts/mod_tools/classes.packagemanager.js +140 -0
  30. package/dist_ts/mod_tools/index.d.ts +4 -0
  31. package/dist_ts/mod_tools/index.js +290 -0
  32. package/dist_ts/mod_tools/mod.plugins.d.ts +1 -0
  33. package/dist_ts/mod_tools/mod.plugins.js +2 -0
  34. package/license +2 -2
  35. package/package.json +20 -30
  36. package/readme.hints.md +15 -17
  37. package/readme.md +251 -415
  38. package/ts/00_commitinfo_data.ts +1 -1
  39. package/ts/gitzone.cli.ts +16 -0
  40. package/ts/helpers.changelog.ts +165 -0
  41. package/ts/helpers.smartconfigmigrations.ts +192 -0
  42. package/ts/helpers.workflow.ts +387 -0
  43. package/ts/mod_commit/index.ts +233 -435
  44. package/ts/mod_commit/mod.helpers.ts +28 -16
  45. package/ts/mod_commit/mod.ui.ts +7 -2
  46. package/ts/mod_config/classes.commitconfig.ts +33 -3
  47. package/ts/mod_config/classes.releaseconfig.ts +14 -7
  48. package/ts/mod_config/index.ts +89 -28
  49. package/ts/mod_format/formatters/smartconfig.formatter.ts +2 -62
  50. package/ts/mod_release/index.ts +393 -0
  51. package/ts/mod_release/mod.plugins.ts +5 -0
  52. package/ts/mod_standard/index.ts +28 -2
  53. package/ts/mod_tools/classes.packagemanager.ts +176 -0
  54. package/ts/mod_tools/index.ts +359 -0
  55. package/ts/mod_tools/mod.plugins.ts +1 -0
@@ -2,10 +2,10 @@
2
2
  import * as plugins from "./mod.plugins.js";
3
3
  import * as paths from "../paths.js";
4
4
  import { logger } from "../gitzone.logging.js";
5
- import * as helpers from "./mod.helpers.js";
6
5
  import * as ui from "./mod.ui.js";
7
- import { ReleaseConfig } from "../mod_config/classes.releaseconfig.js";
8
- import { getCliMode, printJson, runWithSuppressedOutput, } from "../helpers.climode.js";
6
+ import { getCliMode, printJson, runWithSuppressedOutput } from "../helpers.climode.js";
7
+ import { appendPendingChangelogEntry } from "../helpers.changelog.js";
8
+ import { resolveCommitWorkflow } from "../helpers.workflow.js";
9
9
  export const run = async (argvArg) => {
10
10
  const mode = await getCliMode(argvArg);
11
11
  const subcommand = argvArg._?.[1];
@@ -24,294 +24,189 @@ export const run = async (argvArg) => {
24
24
  });
25
25
  return;
26
26
  }
27
- // Read commit config from .smartconfig.json
28
- const smartconfigInstance = new plugins.smartconfig.Smartconfig();
29
- const gitzoneConfig = smartconfigInstance.dataFor("@git.zone/cli", {});
30
- const commitConfig = gitzoneConfig.commit || {};
31
- // Check flags and merge with config options
32
- const wantsRelease = !!(argvArg.r || argvArg.release);
33
- const wantsTest = !!(argvArg.t || argvArg.test || commitConfig.alwaysTest);
34
- const wantsBuild = !!(argvArg.b || argvArg.build || commitConfig.alwaysBuild);
35
- let releaseConfig = null;
36
- if (wantsRelease) {
37
- releaseConfig = await ReleaseConfig.fromCwd();
38
- if (!releaseConfig.hasRegistries()) {
39
- logger.log("error", "No release registries configured.");
40
- console.log("");
41
- console.log(" Run `gitzone config add <registry-url>` to add registries.");
42
- console.log("");
43
- process.exit(1);
44
- }
27
+ const workflow = await resolveCommitWorkflow(argvArg);
28
+ if (workflow.releaseFlagRequested) {
29
+ logger.log("warn", "`gitzone commit -r` is deprecated and no longer releases. Use `gitzone release` after committing.");
45
30
  }
46
- // Print execution plan at the start
47
- ui.printExecutionPlan({
48
- autoAccept: !!(argvArg.y || argvArg.yes),
49
- push: !!(argvArg.p || argvArg.push),
50
- test: wantsTest,
51
- build: wantsBuild,
52
- release: wantsRelease,
53
- format: !!argvArg.format,
54
- registries: releaseConfig?.getRegistries(),
55
- });
56
- if (argvArg.format) {
57
- const formatMod = await import("../mod_format/index.js");
58
- await formatMod.run();
31
+ printCommitExecutionPlan(workflow);
32
+ if (workflow.confirmation === "plan") {
33
+ return;
59
34
  }
60
- // Run tests early to fail fast before analysis
61
- if (wantsTest) {
62
- ui.printHeader("🧪 Running tests...");
63
- const smartshellForTest = new plugins.smartshell.Smartshell({
64
- executor: "bash",
65
- sourceFilePaths: [],
66
- });
67
- const testResult = await smartshellForTest.exec("pnpm test");
68
- if (testResult.exitCode !== 0) {
69
- logger.log("error", "Tests failed. Aborting commit.");
70
- process.exit(1);
35
+ const smartshellInstance = new plugins.smartshell.Smartshell({
36
+ executor: "bash",
37
+ sourceFilePaths: [],
38
+ });
39
+ let nextCommitObject;
40
+ let answerBucket;
41
+ for (const step of workflow.steps) {
42
+ switch (step) {
43
+ case "format":
44
+ await runFormatStep();
45
+ break;
46
+ case "test":
47
+ await runCommandStep(smartshellInstance, "Running tests", workflow.testCommand);
48
+ break;
49
+ case "build":
50
+ await runCommandStep(smartshellInstance, "Running build", workflow.buildCommand);
51
+ break;
52
+ case "analyze":
53
+ nextCommitObject = await runAnalyzeStep();
54
+ answerBucket = await buildAnswerBucket(nextCommitObject, workflow, mode, argvArg);
55
+ break;
56
+ case "changelog":
57
+ assertAnalysisComplete(answerBucket, nextCommitObject);
58
+ await runChangelogStep(workflow, answerBucket, nextCommitObject);
59
+ break;
60
+ case "commit":
61
+ assertAnalysisComplete(answerBucket, nextCommitObject);
62
+ await runCommitStep(smartshellInstance, answerBucket);
63
+ break;
64
+ case "push":
65
+ await runPushStep(smartshellInstance, workflow);
66
+ break;
71
67
  }
72
- logger.log("success", "All tests passed.");
73
68
  }
74
- ui.printHeader("🔍 Analyzing repository changes...");
69
+ const commitShaResult = await smartshellInstance.exec("git rev-parse --short HEAD");
70
+ const currentBranch = await detectCurrentBranch(smartshellInstance);
71
+ ui.printSummary({
72
+ projectType: "source",
73
+ branch: currentBranch,
74
+ commitType: answerBucket.getAnswerFor("commitType"),
75
+ commitScope: answerBucket.getAnswerFor("commitScope"),
76
+ commitMessage: answerBucket.getAnswerFor("commitDescription"),
77
+ commitSha: commitShaResult.stdout.trim(),
78
+ pushed: workflow.steps.includes("push"),
79
+ });
80
+ };
81
+ async function runFormatStep() {
82
+ ui.printHeader("Formatting project files");
83
+ const formatMod = await import("../mod_format/index.js");
84
+ await formatMod.run({ write: true, yes: true, interactive: false });
85
+ }
86
+ async function runCommandStep(smartshellInstance, label, command) {
87
+ ui.printHeader(label);
88
+ const result = await smartshellInstance.exec(command);
89
+ if (result.exitCode !== 0) {
90
+ logger.log("error", `${label} failed. Aborting commit.`);
91
+ process.exit(1);
92
+ }
93
+ logger.log("success", `${label} passed.`);
94
+ }
95
+ async function runAnalyzeStep() {
96
+ ui.printHeader("Analyzing repository changes");
75
97
  const aidoc = new plugins.tsdoc.AiDoc();
76
98
  await aidoc.start();
77
- const nextCommitObject = await aidoc.buildNextCommitObject(paths.cwd);
78
- await aidoc.stop();
79
- ui.printRecommendation({
80
- recommendedNextVersion: nextCommitObject.recommendedNextVersion,
81
- recommendedNextVersionLevel: nextCommitObject.recommendedNextVersionLevel,
82
- recommendedNextVersionScope: nextCommitObject.recommendedNextVersionScope,
83
- recommendedNextVersionMessage: nextCommitObject.recommendedNextVersionMessage,
84
- });
85
- let answerBucket;
86
- // Check if -y/--yes flag is set AND version is not a breaking change
87
- // Breaking changes (major version bumps) always require manual confirmation
99
+ try {
100
+ const nextCommitObject = await aidoc.buildNextCommitObject(paths.cwd);
101
+ ui.printRecommendation({
102
+ recommendedNextVersion: nextCommitObject.recommendedNextVersion,
103
+ recommendedNextVersionLevel: nextCommitObject.recommendedNextVersionLevel,
104
+ recommendedNextVersionScope: nextCommitObject.recommendedNextVersionScope,
105
+ recommendedNextVersionMessage: nextCommitObject.recommendedNextVersionMessage,
106
+ });
107
+ return nextCommitObject;
108
+ }
109
+ finally {
110
+ await aidoc.stop();
111
+ }
112
+ }
113
+ async function buildAnswerBucket(nextCommitObject, workflow, mode, argvArg) {
88
114
  const isBreakingChange = nextCommitObject.recommendedNextVersionLevel === "BREAKING CHANGE";
89
- const canAutoAccept = (argvArg.y || argvArg.yes) && !isBreakingChange;
115
+ const canAutoAccept = workflow.confirmation === "auto" && !isBreakingChange;
90
116
  if (canAutoAccept) {
91
- // Auto-mode: create AnswerBucket programmatically
92
- logger.log("info", "✓ Auto-accepting AI recommendations (--yes flag)");
93
- answerBucket = new plugins.smartinteract.AnswerBucket();
94
- answerBucket.addAnswer({
95
- name: "commitType",
96
- value: nextCommitObject.recommendedNextVersionLevel,
117
+ logger.log("info", "Auto-accepting AI recommendations");
118
+ return createAnswerBucket({
119
+ commitType: nextCommitObject.recommendedNextVersionLevel,
120
+ commitScope: nextCommitObject.recommendedNextVersionScope,
121
+ commitDescription: nextCommitObject.recommendedNextVersionMessage,
97
122
  });
98
- answerBucket.addAnswer({
123
+ }
124
+ if (isBreakingChange && (workflow.confirmation === "auto" || argvArg.y || argvArg.yes)) {
125
+ logger.log("warn", "BREAKING CHANGE detected - manual confirmation required");
126
+ }
127
+ if (!mode.interactive) {
128
+ throw new Error("Commit confirmation requires an interactive terminal. Use `-y` or set commit.confirmation to `auto`.");
129
+ }
130
+ const commitInteract = new plugins.smartinteract.SmartInteract();
131
+ commitInteract.addQuestions([
132
+ {
133
+ type: "list",
134
+ name: "commitType",
135
+ message: "Choose TYPE of the commit:",
136
+ choices: ["fix", "feat", "BREAKING CHANGE"],
137
+ default: nextCommitObject.recommendedNextVersionLevel,
138
+ },
139
+ {
140
+ type: "input",
99
141
  name: "commitScope",
100
- value: nextCommitObject.recommendedNextVersionScope,
101
- });
102
- answerBucket.addAnswer({
142
+ message: "What is the SCOPE of the commit:",
143
+ default: nextCommitObject.recommendedNextVersionScope,
144
+ },
145
+ {
146
+ type: "input",
103
147
  name: "commitDescription",
104
- value: nextCommitObject.recommendedNextVersionMessage,
105
- });
106
- answerBucket.addAnswer({
107
- name: "pushToOrigin",
108
- value: !!(argvArg.p || argvArg.push), // Only push if -p flag also provided
109
- });
110
- answerBucket.addAnswer({
111
- name: "createRelease",
112
- value: wantsRelease,
113
- });
114
- }
115
- else {
116
- // Warn if --yes was provided but we're requiring confirmation due to breaking change
117
- if (isBreakingChange && (argvArg.y || argvArg.yes)) {
118
- logger.log("warn", "⚠️ BREAKING CHANGE detected - manual confirmation required");
119
- }
120
- // Interactive mode: prompt user for input
121
- const commitInteract = new plugins.smartinteract.SmartInteract();
122
- commitInteract.addQuestions([
123
- {
124
- type: "list",
125
- name: `commitType`,
126
- message: `Choose TYPE of the commit:`,
127
- choices: [`fix`, `feat`, `BREAKING CHANGE`],
128
- default: nextCommitObject.recommendedNextVersionLevel,
129
- },
130
- {
131
- type: "input",
132
- name: `commitScope`,
133
- message: `What is the SCOPE of the commit:`,
134
- default: nextCommitObject.recommendedNextVersionScope,
135
- },
136
- {
137
- type: `input`,
138
- name: `commitDescription`,
139
- message: `What is the DESCRIPTION of the commit?`,
140
- default: nextCommitObject.recommendedNextVersionMessage,
141
- },
142
- {
143
- type: "confirm",
144
- name: `pushToOrigin`,
145
- message: `Do you want to push this version now?`,
146
- default: true,
147
- },
148
- {
149
- type: "confirm",
150
- name: `createRelease`,
151
- message: `Do you want to publish to npm registries?`,
152
- default: wantsRelease,
153
- },
154
- ]);
155
- answerBucket = await commitInteract.runQueue();
148
+ message: "What is the DESCRIPTION of the commit?",
149
+ default: nextCommitObject.recommendedNextVersionMessage,
150
+ },
151
+ ]);
152
+ return await commitInteract.runQueue();
153
+ }
154
+ function createAnswerBucket(answers) {
155
+ const answerBucket = new plugins.smartinteract.AnswerBucket();
156
+ for (const [name, value] of Object.entries(answers)) {
157
+ answerBucket.addAnswer({ name, value });
156
158
  }
159
+ return answerBucket;
160
+ }
161
+ async function runChangelogStep(workflow, answerBucket, nextCommitObject) {
162
+ await appendPendingChangelogEntry(plugins.path.join(paths.cwd, workflow.changelogFile), workflow.changelogSection, {
163
+ type: answerBucket.getAnswerFor("commitType"),
164
+ scope: answerBucket.getAnswerFor("commitScope"),
165
+ message: answerBucket.getAnswerFor("commitDescription"),
166
+ details: nextCommitObject.recommendedNextVersionDetails || [],
167
+ });
168
+ logger.log("success", `Updated ${workflow.changelogFile} pending section.`);
169
+ }
170
+ async function runCommitStep(smartshellInstance, answerBucket) {
171
+ ui.printHeader("Creating Semantic Commit");
157
172
  const commitString = createCommitStringFromAnswerBucket(answerBucket);
158
- const commitType = answerBucket.getAnswerFor("commitType");
159
- let commitVersionType;
160
- switch (commitType) {
161
- case "fix":
162
- commitVersionType = "patch";
163
- break;
164
- case "feat":
165
- commitVersionType = "minor";
166
- break;
167
- case "BREAKING CHANGE":
168
- commitVersionType = "major";
169
- break;
170
- default:
171
- throw new Error(`Unsupported commit type: ${commitType}`);
172
- }
173
- ui.printHeader("✨ Creating Semantic Commit");
174
173
  ui.printCommitMessage(commitString);
175
- const smartshellInstance = new plugins.smartshell.Smartshell({
176
- executor: "bash",
177
- sourceFilePaths: [],
178
- });
179
- // Load release config if user wants to release (interactively selected)
180
- if (answerBucket.getAnswerFor("createRelease") && !releaseConfig) {
181
- releaseConfig = await ReleaseConfig.fromCwd();
182
- if (!releaseConfig.hasRegistries()) {
183
- logger.log("error", "No release registries configured.");
184
- console.log("");
185
- console.log(" Run `gitzone config add <registry-url>` to add registries.");
186
- console.log("");
187
- process.exit(1);
188
- }
189
- }
190
- // Determine total steps based on options
191
- // Note: test runs early (like format) so not counted in numbered steps
192
- const willPush = answerBucket.getAnswerFor("pushToOrigin") && !(process.env.CI === "true");
193
- const willRelease = answerBucket.getAnswerFor("createRelease") &&
194
- releaseConfig?.hasRegistries();
195
- let totalSteps = 5; // Base steps: commitinfo, changelog, staging, commit, version
196
- if (wantsBuild)
197
- totalSteps += 2; // build step + verification step
198
- if (willPush)
199
- totalSteps++;
200
- if (willRelease)
201
- totalSteps++;
202
- let currentStep = 0;
203
- // Step 1: Baking commitinfo
204
- currentStep++;
205
- ui.printStep(currentStep, totalSteps, "🔧 Baking commit info into code", "in-progress");
206
- const commitInfo = new plugins.commitinfo.CommitInfo(paths.cwd, commitVersionType);
207
- await commitInfo.writeIntoPotentialDirs();
208
- ui.printStep(currentStep, totalSteps, "🔧 Baking commit info into code", "done");
209
- // Step 2: Writing changelog
210
- currentStep++;
211
- ui.printStep(currentStep, totalSteps, "📄 Generating changelog.md", "in-progress");
212
- let changelog = nextCommitObject.changelog || "# Changelog\n";
213
- changelog = changelog.replaceAll("{{nextVersion}}", (await commitInfo.getNextPlannedVersion()).versionString);
214
- changelog = changelog.replaceAll("{{nextVersionScope}}", `${await answerBucket.getAnswerFor("commitType")}(${await answerBucket.getAnswerFor("commitScope")})`);
215
- changelog = changelog.replaceAll("{{nextVersionMessage}}", nextCommitObject.recommendedNextVersionMessage);
216
- if (nextCommitObject.recommendedNextVersionDetails?.length > 0) {
217
- changelog = changelog.replaceAll("{{nextVersionDetails}}", "- " + nextCommitObject.recommendedNextVersionDetails.join("\n- "));
174
+ await smartshellInstance.exec("git add -A");
175
+ const result = await smartshellInstance.exec(`git commit -m ${shellQuote(commitString)}`);
176
+ if (result.exitCode !== 0) {
177
+ logger.log("error", "git commit failed.");
178
+ process.exit(1);
218
179
  }
219
- else {
220
- changelog = changelog.replaceAll("\n{{nextVersionDetails}}", "");
221
- }
222
- await plugins.smartfs
223
- .file(plugins.path.join(paths.cwd, `changelog.md`))
224
- .encoding("utf8")
225
- .write(changelog);
226
- ui.printStep(currentStep, totalSteps, "📄 Generating changelog.md", "done");
227
- // Step 3: Staging files
228
- currentStep++;
229
- ui.printStep(currentStep, totalSteps, "📦 Staging files", "in-progress");
230
- await smartshellInstance.exec(`git add -A`);
231
- ui.printStep(currentStep, totalSteps, "📦 Staging files", "done");
232
- // Step 4: Creating commit
233
- currentStep++;
234
- ui.printStep(currentStep, totalSteps, "💾 Creating git commit", "in-progress");
235
- await smartshellInstance.exec(`git commit -m "${commitString}"`);
236
- ui.printStep(currentStep, totalSteps, "💾 Creating git commit", "done");
237
- // Step 5: Bumping version
238
- currentStep++;
239
- const projectType = await helpers.detectProjectType();
240
- const newVersion = await helpers.bumpProjectVersion(projectType, commitVersionType, currentStep, totalSteps);
241
- // Step 6: Run build (optional)
242
- if (wantsBuild) {
243
- currentStep++;
244
- ui.printStep(currentStep, totalSteps, "🔨 Running build", "in-progress");
245
- const buildResult = await smartshellInstance.exec("pnpm build");
246
- if (buildResult.exitCode !== 0) {
247
- ui.printStep(currentStep, totalSteps, "🔨 Running build", "error");
248
- logger.log("error", "Build failed. Aborting release.");
249
- process.exit(1);
250
- }
251
- ui.printStep(currentStep, totalSteps, "🔨 Running build", "done");
252
- // Step 7: Verify no uncommitted changes
253
- currentStep++;
254
- ui.printStep(currentStep, totalSteps, "🔍 Verifying clean working tree", "in-progress");
255
- const statusResult = await smartshellInstance.exec("git status --porcelain");
256
- if (statusResult.stdout.trim() !== "") {
257
- ui.printStep(currentStep, totalSteps, "🔍 Verifying clean working tree", "error");
258
- logger.log("error", "Build produced uncommitted changes. This usually means build output is not gitignored.");
259
- logger.log("error", "Uncommitted files:");
260
- console.log(statusResult.stdout);
261
- logger.log("error", "Aborting release. Please ensure build artifacts are in .gitignore");
262
- process.exit(1);
263
- }
264
- ui.printStep(currentStep, totalSteps, "🔍 Verifying clean working tree", "done");
265
- }
266
- // Step: Push to remote (optional)
267
- const currentBranch = await helpers.detectCurrentBranch();
268
- if (willPush) {
269
- currentStep++;
270
- ui.printStep(currentStep, totalSteps, `🚀 Pushing to origin/${currentBranch}`, "in-progress");
271
- await smartshellInstance.exec(`git push origin ${currentBranch} --follow-tags`);
272
- ui.printStep(currentStep, totalSteps, `🚀 Pushing to origin/${currentBranch}`, "done");
180
+ }
181
+ async function runPushStep(smartshellInstance, workflow) {
182
+ const currentBranch = await detectCurrentBranch(smartshellInstance);
183
+ const followTags = workflow.pushFollowTags ? " --follow-tags" : "";
184
+ const result = await smartshellInstance.exec(`git push ${workflow.pushRemote} ${currentBranch}${followTags}`);
185
+ if (result.exitCode !== 0) {
186
+ logger.log("error", "git push failed.");
187
+ process.exit(1);
273
188
  }
274
- // Step 7: Publish to npm registries (optional)
275
- let releasedRegistries = [];
276
- if (willRelease && releaseConfig) {
277
- currentStep++;
278
- const registries = releaseConfig.getRegistries();
279
- ui.printStep(currentStep, totalSteps, `📦 Publishing to ${registries.length} registr${registries.length === 1 ? "y" : "ies"}`, "in-progress");
280
- const accessLevel = releaseConfig.getAccessLevel();
281
- for (const registry of registries) {
282
- try {
283
- await smartshellInstance.exec(`npm publish --registry=${registry} --access=${accessLevel}`);
284
- releasedRegistries.push(registry);
285
- }
286
- catch (error) {
287
- logger.log("error", `Failed to publish to ${registry}: ${error}`);
288
- }
289
- }
290
- if (releasedRegistries.length === registries.length) {
291
- ui.printStep(currentStep, totalSteps, `📦 Publishing to ${registries.length} registr${registries.length === 1 ? "y" : "ies"}`, "done");
292
- }
293
- else {
294
- ui.printStep(currentStep, totalSteps, `📦 Publishing to ${registries.length} registr${registries.length === 1 ? "y" : "ies"}`, "error");
295
- }
189
+ }
190
+ async function detectCurrentBranch(smartshellInstance) {
191
+ const branchResult = await smartshellInstance.exec("git branch --show-current");
192
+ return branchResult.stdout.trim() || "master";
193
+ }
194
+ function assertAnalysisComplete(answerBucket, nextCommitObject) {
195
+ if (!answerBucket || !nextCommitObject) {
196
+ throw new Error("Commit workflow requires analyze before changelog and commit steps.");
296
197
  }
297
- console.log(""); // Add spacing before summary
298
- // Get commit SHA for summary
299
- const commitShaResult = await smartshellInstance.exec("git rev-parse --short HEAD");
300
- const commitSha = commitShaResult.stdout.trim();
301
- // Print final summary
302
- ui.printSummary({
303
- projectType,
304
- branch: currentBranch,
305
- commitType: answerBucket.getAnswerFor("commitType"),
306
- commitScope: answerBucket.getAnswerFor("commitScope"),
307
- commitMessage: answerBucket.getAnswerFor("commitDescription"),
308
- newVersion: newVersion,
309
- commitSha: commitSha,
310
- pushed: willPush,
311
- released: releasedRegistries.length > 0,
312
- releasedRegistries: releasedRegistries.length > 0 ? releasedRegistries : undefined,
313
- });
314
- };
198
+ }
199
+ function shellQuote(value) {
200
+ return `'${value.replaceAll("'", "'\\''")}'`;
201
+ }
202
+ function printCommitExecutionPlan(workflow) {
203
+ console.log("");
204
+ console.log("gitzone commit - resolved workflow");
205
+ console.log(`confirmation: ${workflow.confirmation}`);
206
+ console.log(`steps: ${workflow.steps.join(" -> ")}`);
207
+ console.log(`changelog: ${workflow.changelogFile}#${workflow.changelogSection}`);
208
+ console.log("");
209
+ }
315
210
  async function handleRecommend(mode) {
316
211
  const recommendationBuilder = async () => {
317
212
  const aidoc = new plugins.tsdoc.AiDoc();
@@ -349,7 +244,7 @@ export function showHelp(mode) {
349
244
  printJson({
350
245
  command: "commit",
351
246
  usage: "gitzone commit [recommend] [options]",
352
- description: "Creates semantic commits or emits a read-only recommendation.",
247
+ description: "Analyzes changes and creates one semantic source commit.",
353
248
  commands: [
354
249
  {
355
250
  name: "recommend",
@@ -357,30 +252,19 @@ export function showHelp(mode) {
357
252
  },
358
253
  ],
359
254
  flags: [
360
- { flag: "-y, --yes", description: "Auto-accept AI recommendations" },
361
- { flag: "-p, --push", description: "Push to origin after commit" },
362
- { flag: "-t, --test", description: "Run tests before the commit flow" },
363
- {
364
- flag: "-b, --build",
365
- description: "Run the build after the commit flow",
366
- },
367
- {
368
- flag: "-r, --release",
369
- description: "Publish to configured registries after push",
370
- },
371
- {
372
- flag: "--format",
373
- description: "Run gitzone format before committing",
374
- },
375
- {
376
- flag: "--json",
377
- description: "Emit JSON for `commit recommend` only",
378
- },
255
+ { flag: "-y, --yes", description: "Auto-accept safe AI recommendations" },
256
+ { flag: "-p, --push", description: "Push to origin after committing" },
257
+ { flag: "-t, --test", description: "Run tests as part of the commit workflow" },
258
+ { flag: "-b, --build", description: "Run build as part of the commit workflow" },
259
+ { flag: "-f, --format", description: "Run gitzone format before committing" },
260
+ { flag: "--plan", description: "Show resolved workflow without mutating files" },
261
+ { flag: "--json", description: "Emit JSON for `commit recommend` only" },
379
262
  ],
380
263
  examples: [
381
264
  "gitzone commit recommend --json",
382
265
  "gitzone commit -y",
383
- "gitzone commit -ypbr",
266
+ "gitzone commit -ytbp",
267
+ "gitzone release",
384
268
  ],
385
269
  });
386
270
  return;
@@ -388,22 +272,25 @@ export function showHelp(mode) {
388
272
  console.log("");
389
273
  console.log("Usage: gitzone commit [recommend] [options]");
390
274
  console.log("");
275
+ console.log("Creates one semantic source commit. It does not version, tag, or publish.");
276
+ console.log("");
391
277
  console.log("Commands:");
392
278
  console.log(" recommend Generate a commit recommendation without mutating the repository");
393
279
  console.log("");
394
280
  console.log("Flags:");
395
- console.log(" -y, --yes Auto-accept AI recommendations");
396
- console.log(" -p, --push Push to origin after commit");
397
- console.log(" -t, --test Run tests before the commit flow");
398
- console.log(" -b, --build Run the build after the commit flow");
399
- console.log(" -r, --release Publish to configured registries after push");
400
- console.log(" --format Run gitzone format before committing");
281
+ console.log(" -y, --yes Auto-accept safe AI recommendations");
282
+ console.log(" -p, --push Push after commit");
283
+ console.log(" -t, --test Run tests in the configured order");
284
+ console.log(" -b, --build Run build in the configured order");
285
+ console.log(" -f, --format Run gitzone format before committing");
286
+ console.log(" --plan Show resolved workflow without mutating files");
401
287
  console.log(" --json Emit JSON for `commit recommend` only");
402
288
  console.log("");
403
289
  console.log("Examples:");
404
290
  console.log(" gitzone commit recommend --json");
405
291
  console.log(" gitzone commit -y");
406
- console.log(" gitzone commit -ypbr");
292
+ console.log(" gitzone commit -ytbp");
293
+ console.log(" gitzone release");
407
294
  console.log("");
408
295
  }
409
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdFQUFnRTtBQUVoRSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RSxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCx1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLE9BQVksRUFBRSxFQUFFO0lBQ3hDLE1BQU0sSUFBSSxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNmLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLFNBQVMsQ0FBQztZQUNSLEVBQUUsRUFBRSxLQUFLO1lBQ1QsS0FBSyxFQUNILDZHQUE2RztTQUNoSCxDQUFDLENBQUM7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
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdFQUFnRTtBQUVoRSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxxQkFBcUIsRUFBZ0MsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLE9BQVksRUFBRSxFQUFFO0lBQ3hDLE1BQU0sSUFBSSxHQUFHLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNmLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNkLFNBQVMsQ0FBQztZQUNSLEVBQUUsRUFBRSxLQUFLO1lBQ1QsS0FBSyxFQUNILDZHQUE2RztTQUNoSCxD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