@git.zone/cli 1.18.8 → 1.19.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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/cli',
6
- version: '1.18.8',
6
+ version: '1.19.0',
7
7
  description: 'A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxlQUFlO0lBQ3JCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFdBQVcsRUFBRSwrTEFBK0w7Q0FDN00sQ0FBQSJ9
@@ -3,23 +3,23 @@ import * as plugins from './mod.plugins.js';
3
3
  import * as paths from '../paths.js';
4
4
  import { logger } from '../gitzone.logging.js';
5
5
  import * as helpers from './mod.helpers.js';
6
+ import * as ui from './mod.ui.js';
6
7
  export const run = async (argvArg) => {
7
8
  if (argvArg.format) {
8
9
  const formatMod = await import('../mod_format/index.js');
9
10
  await formatMod.run();
10
11
  }
11
- logger.log('info', `gathering facts...`);
12
+ ui.printHeader('🔍 Analyzing repository changes...');
12
13
  const aidoc = new plugins.tsdoc.AiDoc();
13
14
  await aidoc.start();
14
15
  const nextCommitObject = await aidoc.buildNextCommitObject(paths.cwd);
15
16
  await aidoc.stop();
16
- logger.log('info', `---------
17
- Next recommended commit would be:
18
- ===========
19
- -> ${nextCommitObject.recommendedNextVersion}:
20
- -> ${nextCommitObject.recommendedNextVersionLevel}(${nextCommitObject.recommendedNextVersionScope}): ${nextCommitObject.recommendedNextVersionMessage}
21
- ===========
22
- `);
17
+ ui.printRecommendation({
18
+ recommendedNextVersion: nextCommitObject.recommendedNextVersion,
19
+ recommendedNextVersionLevel: nextCommitObject.recommendedNextVersionLevel,
20
+ recommendedNextVersionScope: nextCommitObject.recommendedNextVersionScope,
21
+ recommendedNextVersionMessage: nextCommitObject.recommendedNextVersionMessage,
22
+ });
23
23
  const commitInteract = new plugins.smartinteract.SmartInteract();
24
24
  commitInteract.addQuestions([
25
25
  {
@@ -60,15 +60,24 @@ export const run = async (argvArg) => {
60
60
  return 'major';
61
61
  }
62
62
  })();
63
- logger.log('info', `OK! Creating commit with message '${commitString}'`);
63
+ ui.printHeader('✨ Creating Semantic Commit');
64
+ ui.printCommitMessage(commitString);
64
65
  const smartshellInstance = new plugins.smartshell.Smartshell({
65
66
  executor: 'bash',
66
67
  sourceFilePaths: [],
67
68
  });
68
- logger.log('info', `Baking commitinfo into code ...`);
69
+ // Determine total steps (6 if pushing, 5 if not)
70
+ const totalSteps = answerBucket.getAnswerFor('pushToOrigin') && !(process.env.CI === 'true') ? 6 : 5;
71
+ let currentStep = 0;
72
+ // Step 1: Baking commitinfo
73
+ currentStep++;
74
+ ui.printStep(currentStep, totalSteps, '🔧 Baking commit info into code', 'in-progress');
69
75
  const commitInfo = new plugins.commitinfo.CommitInfo(paths.cwd, commitVersionType);
70
76
  await commitInfo.writeIntoPotentialDirs();
71
- logger.log('info', `Writing changelog.md ...`);
77
+ ui.printStep(currentStep, totalSteps, '🔧 Baking commit info into code', 'done');
78
+ // Step 2: Writing changelog
79
+ currentStep++;
80
+ ui.printStep(currentStep, totalSteps, '📄 Generating changelog.md', 'in-progress');
72
81
  let changelog = nextCommitObject.changelog;
73
82
  changelog = changelog.replaceAll('{{nextVersion}}', (await commitInfo.getNextPlannedVersion()).versionString);
74
83
  changelog = changelog.replaceAll('{{nextVersionScope}}', `${await answerBucket.getAnswerFor('commitType')}(${await answerBucket.getAnswerFor('commitScope')})`);
@@ -80,18 +89,45 @@ export const run = async (argvArg) => {
80
89
  changelog = changelog.replaceAll('\n{{nextVersionDetails}}', '');
81
90
  }
82
91
  await plugins.smartfile.memory.toFs(changelog, plugins.path.join(paths.cwd, `changelog.md`));
83
- logger.log('info', `Staging files for commit:`);
92
+ ui.printStep(currentStep, totalSteps, '📄 Generating changelog.md', 'done');
93
+ // Step 3: Staging files
94
+ currentStep++;
95
+ ui.printStep(currentStep, totalSteps, 'đŸ“Ļ Staging files', 'in-progress');
84
96
  await smartshellInstance.exec(`git add -A`);
97
+ ui.printStep(currentStep, totalSteps, 'đŸ“Ļ Staging files', 'done');
98
+ // Step 4: Creating commit
99
+ currentStep++;
100
+ ui.printStep(currentStep, totalSteps, '💾 Creating git commit', 'in-progress');
85
101
  await smartshellInstance.exec(`git commit -m "${commitString}"`);
86
- // Detect project type and bump version accordingly
102
+ ui.printStep(currentStep, totalSteps, '💾 Creating git commit', 'done');
103
+ // Step 5: Bumping version
104
+ currentStep++;
87
105
  const projectType = await helpers.detectProjectType();
88
- await helpers.bumpProjectVersion(projectType, commitVersionType);
106
+ const newVersion = await helpers.bumpProjectVersion(projectType, commitVersionType, currentStep, totalSteps);
107
+ // Step 6: Push to remote (optional)
108
+ const currentBranch = await helpers.detectCurrentBranch();
89
109
  if (answerBucket.getAnswerFor('pushToOrigin') &&
90
110
  !(process.env.CI === 'true')) {
91
- // Detect current branch instead of hardcoding "master"
92
- const currentBranch = await helpers.detectCurrentBranch();
111
+ currentStep++;
112
+ ui.printStep(currentStep, totalSteps, `🚀 Pushing to origin/${currentBranch}`, 'in-progress');
93
113
  await smartshellInstance.exec(`git push origin ${currentBranch} --follow-tags`);
114
+ ui.printStep(currentStep, totalSteps, `🚀 Pushing to origin/${currentBranch}`, 'done');
94
115
  }
116
+ console.log(''); // Add spacing before summary
117
+ // Get commit SHA for summary
118
+ const commitShaResult = await smartshellInstance.exec('git rev-parse --short HEAD');
119
+ const commitSha = commitShaResult.stdout.trim();
120
+ // Print final summary
121
+ ui.printSummary({
122
+ projectType,
123
+ branch: currentBranch,
124
+ commitType: answerBucket.getAnswerFor('commitType'),
125
+ commitScope: answerBucket.getAnswerFor('commitScope'),
126
+ commitMessage: answerBucket.getAnswerFor('commitDescription'),
127
+ newVersion: newVersion,
128
+ commitSha: commitSha,
129
+ pushed: answerBucket.getAnswerFor('pushToOrigin') && !(process.env.CI === 'true'),
130
+ });
95
131
  };
96
132
  const createCommitStringFromAnswerBucket = (answerBucket) => {
97
133
  const commitType = answerBucket.getAnswerFor('commitType');
@@ -99,4 +135,4 @@ const createCommitStringFromAnswerBucket = (answerBucket) => {
99
135
  const commitDescription = answerBucket.getAnswerFor('commitDescription');
100
136
  return `${commitType}(${commitScope}): ${commitDescription}`;
101
137
  };
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdFQUFnRTtBQUVoRSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsT0FBWSxFQUFFLEVBQUU7SUFDeEMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEMsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFFcEIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdEUsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFbkIsTUFBTSxDQUFDLEdBQUcsQ0FDUixNQUFNLEVBQ047OztTQUdLLGdCQUFnQixDQUFDLHNCQUFzQjtTQUN2QyxnQkFBZ0IsQ0FBQywyQkFBMkIsSUFBSSxnQkFBZ0IsQ0FBQywyQkFBMkIsTUFBTSxnQkFBZ0IsQ0FBQyw2QkFBNkI7O0dBRXRKLENBQ0EsQ0FBQztJQUNGLE1BQU0sY0FBYyxH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
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGdFQUFnRTtBQUVoRSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWxDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsT0FBWSxFQUFFLEVBQUU7SUFDeEMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBRXJELE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QyxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUVwQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV0RSxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVuQixFQUFFLENBQUMsbUJBQW1CLENBQUM7UUFDckIsc0JBQXNCLEVBQUUsZ0JBQWdCLENBQUMsc0JBQXNCO1FBQy9ELDJCQUEyQixFQUFFLGdCQUFnQixDQUFDLDJCQUEyQjtRQUN6RSwyQkFBMkIsRUFBRSxnQkFBZ0IsQ0FBQywyQkFBMkI7UUFD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
@@ -11,7 +11,7 @@ export declare function detectCurrentBranch(): Promise<string>;
11
11
  */
12
12
  export declare function detectProjectType(): Promise<ProjectType>;
13
13
  /**
14
- * Bumps the version in deno.json
14
+ * Bumps the version in deno.json, commits the change, and creates a tag
15
15
  * @param versionType Type of version bump
16
16
  * @returns The new version string
17
17
  */
@@ -20,6 +20,8 @@ export declare function bumpDenoVersion(versionType: VersionType): Promise<strin
20
20
  * Bumps the project version based on project type
21
21
  * @param projectType The detected project type
22
22
  * @param versionType The type of version bump
23
+ * @param currentStep The current step number for progress display
24
+ * @param totalSteps The total number of steps for progress display
23
25
  * @returns The new version string
24
26
  */
25
- export declare function bumpProjectVersion(projectType: ProjectType, versionType: VersionType): Promise<string>;
27
+ export declare function bumpProjectVersion(projectType: ProjectType, versionType: VersionType, currentStep?: number, totalSteps?: number): Promise<string>;
@@ -1,6 +1,7 @@
1
1
  import * as plugins from './mod.plugins.js';
2
2
  import * as paths from '../paths.js';
3
3
  import { logger } from '../gitzone.logging.js';
4
+ import * as ui from './mod.ui.js';
4
5
  /**
5
6
  * Detects the current git branch
6
7
  * @returns The current branch name, defaults to 'master' if detection fails
@@ -79,12 +80,16 @@ function calculateNewVersion(currentVersion, versionType) {
79
80
  return `${major}.${minor}.${patch}`;
80
81
  }
81
82
  /**
82
- * Bumps the version in deno.json
83
+ * Bumps the version in deno.json, commits the change, and creates a tag
83
84
  * @param versionType Type of version bump
84
85
  * @returns The new version string
85
86
  */
86
87
  export async function bumpDenoVersion(versionType) {
87
88
  const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
89
+ const smartshellInstance = new plugins.smartshell.Smartshell({
90
+ executor: 'bash',
91
+ sourceFilePaths: [],
92
+ });
88
93
  try {
89
94
  // Read deno.json
90
95
  const denoConfig = plugins.smartfile.fs.toObjectSync(denoJsonPath);
@@ -98,6 +103,13 @@ export async function bumpDenoVersion(versionType) {
98
103
  denoConfig.version = newVersion;
99
104
  // Write back to disk
100
105
  await plugins.smartfile.memory.toFs(JSON.stringify(denoConfig, null, 2) + '\n', denoJsonPath);
106
+ // Stage the deno.json file
107
+ await smartshellInstance.exec('git add deno.json');
108
+ // Commit the version bump
109
+ await smartshellInstance.exec(`git commit -m "v${newVersion}"`);
110
+ // Create the version tag
111
+ await smartshellInstance.exec(`git tag v${newVersion} -m "v${newVersion}"`);
112
+ logger.log('info', `Created commit and tag v${newVersion}`);
101
113
  return newVersion;
102
114
  }
103
115
  catch (error) {
@@ -121,16 +133,27 @@ async function bumpNpmVersion(versionType) {
121
133
  return newVersion;
122
134
  }
123
135
  /**
124
- * Syncs the version from package.json to deno.json
136
+ * Syncs the version from package.json to deno.json and amends the npm commit
125
137
  * @param version The version to sync
126
138
  */
127
139
  async function syncVersionToDenoJson(version) {
128
140
  const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
141
+ const smartshellInstance = new plugins.smartshell.Smartshell({
142
+ executor: 'bash',
143
+ sourceFilePaths: [],
144
+ });
129
145
  try {
130
146
  const denoConfig = plugins.smartfile.fs.toObjectSync(denoJsonPath);
131
147
  logger.log('info', `Syncing version to deno.json: ${version}`);
132
148
  denoConfig.version = version;
133
149
  await plugins.smartfile.memory.toFs(JSON.stringify(denoConfig, null, 2) + '\n', denoJsonPath);
150
+ // Stage the deno.json file
151
+ await smartshellInstance.exec('git add deno.json');
152
+ // Amend the npm version commit to include deno.json
153
+ await smartshellInstance.exec('git commit --amend --no-edit');
154
+ // Re-create the tag with force to update it
155
+ await smartshellInstance.exec(`git tag -fa v${version} -m "v${version}"`);
156
+ logger.log('info', `Amended commit to include deno.json and updated tag v${version}`);
134
157
  }
135
158
  catch (error) {
136
159
  throw new Error(`Failed to sync version to deno.json: ${error.message}`);
@@ -140,25 +163,39 @@ async function syncVersionToDenoJson(version) {
140
163
  * Bumps the project version based on project type
141
164
  * @param projectType The detected project type
142
165
  * @param versionType The type of version bump
166
+ * @param currentStep The current step number for progress display
167
+ * @param totalSteps The total number of steps for progress display
143
168
  * @returns The new version string
144
169
  */
145
- export async function bumpProjectVersion(projectType, versionType) {
170
+ export async function bumpProjectVersion(projectType, versionType, currentStep, totalSteps) {
171
+ const projectEmoji = projectType === 'npm' ? 'đŸ“Ļ' : projectType === 'deno' ? 'đŸĻ•' : '🔀';
172
+ const description = `đŸˇī¸ Bumping version (${projectEmoji} ${projectType})`;
173
+ if (currentStep && totalSteps) {
174
+ ui.printStep(currentStep, totalSteps, description, 'in-progress');
175
+ }
176
+ let newVersion;
146
177
  switch (projectType) {
147
178
  case 'npm':
148
- return await bumpNpmVersion(versionType);
179
+ newVersion = await bumpNpmVersion(versionType);
180
+ break;
149
181
  case 'deno':
150
- return await bumpDenoVersion(versionType);
182
+ newVersion = await bumpDenoVersion(versionType);
183
+ break;
151
184
  case 'both': {
152
185
  // Bump npm version first (it handles git tags)
153
- const newVersion = await bumpNpmVersion(versionType);
186
+ newVersion = await bumpNpmVersion(versionType);
154
187
  // Then sync to deno.json
155
188
  await syncVersionToDenoJson(newVersion);
156
- return newVersion;
189
+ break;
157
190
  }
158
191
  case 'none':
159
192
  throw new Error('Cannot bump version: no package.json or deno.json found');
160
193
  default:
161
194
  throw new Error(`Unknown project type: ${projectType}`);
162
195
  }
196
+ if (currentStep && totalSteps) {
197
+ ui.printStep(currentStep, totalSteps, description, 'done');
198
+ }
199
+ return newVersion;
163
200
  }
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L21vZC5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSy9DOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CO0lBQ3ZDLElBQUksQ0FBQztRQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUMzRCxRQUFRLEVBQUUsTUFBTTtZQUNoQixlQUFlLEVBQUUsRUFBRTtTQUNwQixDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFeEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDJEQUEyRCxDQUFDLENBQUM7WUFDaEYsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDRCQUE0QixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLDRCQUE0QixDQUFDLENBQUM7UUFDMUYsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7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
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfY29tbWl0L21vZC5oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBS2xDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsbUJBQW1CO0lBQ3ZDLElBQUksQ0FBQztRQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUMzRCxRQUFRLEVBQUUsTUFBTTtZQUNoQixlQUFlLEVBQUUsRUFBRTtTQUNwQixDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFeEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDJEQUEyRCxDQUFDLENBQUM7WUFDaEYsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDRCQUE0QixVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLDRCQUE0QixDQUFDLENBQUM7UUFDMUYsT0FBTyxRQUFRLENB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
@@ -0,0 +1,61 @@
1
+ /**
2
+ * UI helper module for beautiful CLI output
3
+ */
4
+ interface ICommitSummary {
5
+ projectType: string;
6
+ branch: string;
7
+ commitType: string;
8
+ commitScope: string;
9
+ commitMessage: string;
10
+ newVersion: string;
11
+ commitSha?: string;
12
+ pushed: boolean;
13
+ repoUrl?: string;
14
+ }
15
+ interface IRecommendation {
16
+ recommendedNextVersion: string;
17
+ recommendedNextVersionLevel: string;
18
+ recommendedNextVersionScope: string;
19
+ recommendedNextVersionMessage: string;
20
+ }
21
+ /**
22
+ * Print a header with a box around it
23
+ */
24
+ export declare function printHeader(title: string): void;
25
+ /**
26
+ * Print a section with a border
27
+ */
28
+ export declare function printSection(title: string, lines: string[]): void;
29
+ /**
30
+ * Print AI recommendations in a nice box
31
+ */
32
+ export declare function printRecommendation(recommendation: IRecommendation): void;
33
+ /**
34
+ * Print a progress step
35
+ */
36
+ export declare function printStep(current: number, total: number, description: string, status: 'in-progress' | 'done' | 'error'): void;
37
+ /**
38
+ * Print final commit summary
39
+ */
40
+ export declare function printSummary(summary: ICommitSummary): void;
41
+ /**
42
+ * Print an info message with consistent formatting
43
+ */
44
+ export declare function printInfo(message: string): void;
45
+ /**
46
+ * Print a success message
47
+ */
48
+ export declare function printSuccess(message: string): void;
49
+ /**
50
+ * Print a warning message
51
+ */
52
+ export declare function printWarning(message: string): void;
53
+ /**
54
+ * Print an error message
55
+ */
56
+ export declare function printError(message: string): void;
57
+ /**
58
+ * Print commit message being created
59
+ */
60
+ export declare function printCommitMessage(commitString: string): void;
61
+ export {};
@@ -0,0 +1,147 @@
1
+ import { logger } from '../gitzone.logging.js';
2
+ /**
3
+ * Print a header with a box around it
4
+ */
5
+ export function printHeader(title) {
6
+ const width = 57;
7
+ const padding = Math.max(0, width - title.length - 2);
8
+ const leftPad = Math.floor(padding / 2);
9
+ const rightPad = padding - leftPad;
10
+ console.log('');
11
+ console.log('╭─' + '─'.repeat(width) + '─╮');
12
+ console.log('│ ' + title + ' '.repeat(rightPad + leftPad) + ' │');
13
+ console.log('╰─' + '─'.repeat(width) + '─╯');
14
+ console.log('');
15
+ }
16
+ /**
17
+ * Print a section with a border
18
+ */
19
+ export function printSection(title, lines) {
20
+ const width = 59;
21
+ console.log('┌─ ' + title + ' ' + '─'.repeat(Math.max(0, width - title.length - 3)) + '┐');
22
+ console.log('│' + ' '.repeat(width) + '│');
23
+ for (const line of lines) {
24
+ const padding = width - line.length;
25
+ console.log('│ ' + line + ' '.repeat(Math.max(0, padding - 2)) + '│');
26
+ }
27
+ console.log('│' + ' '.repeat(width) + '│');
28
+ console.log('└─' + '─'.repeat(width) + '─┘');
29
+ console.log('');
30
+ }
31
+ /**
32
+ * Print AI recommendations in a nice box
33
+ */
34
+ export function printRecommendation(recommendation) {
35
+ const lines = [
36
+ `Suggested Version: v${recommendation.recommendedNextVersion}`,
37
+ `Suggested Type: ${recommendation.recommendedNextVersionLevel}`,
38
+ `Suggested Scope: ${recommendation.recommendedNextVersionScope}`,
39
+ `Suggested Message: ${recommendation.recommendedNextVersionMessage}`,
40
+ ];
41
+ printSection('📊 AI Recommendations', lines);
42
+ }
43
+ /**
44
+ * Print a progress step
45
+ */
46
+ export function printStep(current, total, description, status) {
47
+ const statusIcon = status === 'done' ? '✓' : status === 'error' ? '✗' : 'âŗ';
48
+ const dots = '.'.repeat(Math.max(0, 40 - description.length));
49
+ console.log(` [${current}/${total}] ${description}${dots} ${statusIcon}`);
50
+ // Clear the line on next update if in progress
51
+ if (status === 'in-progress') {
52
+ process.stdout.write('\x1b[1A'); // Move cursor up one line
53
+ }
54
+ }
55
+ /**
56
+ * Get emoji for project type
57
+ */
58
+ function getProjectTypeEmoji(projectType) {
59
+ switch (projectType) {
60
+ case 'npm':
61
+ return 'đŸ“Ļ npm';
62
+ case 'deno':
63
+ return 'đŸĻ• Deno';
64
+ case 'both':
65
+ return '🔀 npm + Deno';
66
+ default:
67
+ return '❓ Unknown';
68
+ }
69
+ }
70
+ /**
71
+ * Get emoji for commit type
72
+ */
73
+ function getCommitTypeEmoji(commitType) {
74
+ switch (commitType) {
75
+ case 'fix':
76
+ return '🔧 fix';
77
+ case 'feat':
78
+ return '✨ feat';
79
+ case 'BREAKING CHANGE':
80
+ return 'đŸ’Ĩ BREAKING CHANGE';
81
+ default:
82
+ return commitType;
83
+ }
84
+ }
85
+ /**
86
+ * Print final commit summary
87
+ */
88
+ export function printSummary(summary) {
89
+ const lines = [
90
+ `Project Type: ${getProjectTypeEmoji(summary.projectType)}`,
91
+ `Branch: đŸŒŋ ${summary.branch}`,
92
+ `Commit Type: ${getCommitTypeEmoji(summary.commitType)}`,
93
+ `Scope: 📍 ${summary.commitScope}`,
94
+ `New Version: đŸˇī¸ v${summary.newVersion}`,
95
+ ];
96
+ if (summary.commitSha) {
97
+ lines.push(`Commit SHA: 📌 ${summary.commitSha}`);
98
+ }
99
+ if (summary.pushed) {
100
+ lines.push(`Remote: ✓ Pushed successfully`);
101
+ }
102
+ else {
103
+ lines.push(`Remote: ⊘ Not pushed (local only)`);
104
+ }
105
+ if (summary.repoUrl && summary.commitSha) {
106
+ lines.push('');
107
+ lines.push(`View at: ${summary.repoUrl}/commit/${summary.commitSha}`);
108
+ }
109
+ printSection('✅ Commit Summary', lines);
110
+ if (summary.pushed) {
111
+ console.log('🎉 All done! Your changes are committed and pushed.\n');
112
+ }
113
+ else {
114
+ console.log('✓ Commit created successfully.\n');
115
+ }
116
+ }
117
+ /**
118
+ * Print an info message with consistent formatting
119
+ */
120
+ export function printInfo(message) {
121
+ console.log(` â„šī¸ ${message}`);
122
+ }
123
+ /**
124
+ * Print a success message
125
+ */
126
+ export function printSuccess(message) {
127
+ console.log(` ✓ ${message}`);
128
+ }
129
+ /**
130
+ * Print a warning message
131
+ */
132
+ export function printWarning(message) {
133
+ logger.log('warn', `âš ī¸ ${message}`);
134
+ }
135
+ /**
136
+ * Print an error message
137
+ */
138
+ export function printError(message) {
139
+ logger.log('error', `✗ ${message}`);
140
+ }
141
+ /**
142
+ * Print commit message being created
143
+ */
144
+ export function printCommitMessage(commitString) {
145
+ console.log(`\n 📝 Commit: ${commitString}\n`);
146
+ }
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLnVpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2NvbW1pdC9tb2QudWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBeUIvQzs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDakIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUVuQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWEsRUFBRSxLQUFlO0lBQ3pELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVqQixPQUFPLENB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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@git.zone/cli",
3
3
  "private": false,
4
- "version": "1.18.8",
4
+ "version": "1.19.0",
5
5
  "description": "A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.",
6
6
  "main": "dist_ts/index.ts",
7
7
  "typings": "dist_ts/index.d.ts",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/cli',
6
- version: '1.18.8',
6
+ version: '1.19.0',
7
7
  description: 'A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.'
8
8
  }
@@ -4,6 +4,7 @@ import * as plugins from './mod.plugins.js';
4
4
  import * as paths from '../paths.js';
5
5
  import { logger } from '../gitzone.logging.js';
6
6
  import * as helpers from './mod.helpers.js';
7
+ import * as ui from './mod.ui.js';
7
8
 
8
9
  export const run = async (argvArg: any) => {
9
10
  if (argvArg.format) {
@@ -11,7 +12,8 @@ export const run = async (argvArg: any) => {
11
12
  await formatMod.run();
12
13
  }
13
14
 
14
- logger.log('info', `gathering facts...`);
15
+ ui.printHeader('🔍 Analyzing repository changes...');
16
+
15
17
  const aidoc = new plugins.tsdoc.AiDoc();
16
18
  await aidoc.start();
17
19
 
@@ -19,16 +21,12 @@ export const run = async (argvArg: any) => {
19
21
 
20
22
  await aidoc.stop();
21
23
 
22
- logger.log(
23
- 'info',
24
- `---------
25
- Next recommended commit would be:
26
- ===========
27
- -> ${nextCommitObject.recommendedNextVersion}:
28
- -> ${nextCommitObject.recommendedNextVersionLevel}(${nextCommitObject.recommendedNextVersionScope}): ${nextCommitObject.recommendedNextVersionMessage}
29
- ===========
30
- `,
31
- );
24
+ ui.printRecommendation({
25
+ recommendedNextVersion: nextCommitObject.recommendedNextVersion,
26
+ recommendedNextVersionLevel: nextCommitObject.recommendedNextVersionLevel,
27
+ recommendedNextVersionScope: nextCommitObject.recommendedNextVersionScope,
28
+ recommendedNextVersionMessage: nextCommitObject.recommendedNextVersionMessage,
29
+ });
32
30
  const commitInteract = new plugins.smartinteract.SmartInteract();
33
31
  commitInteract.addQuestions([
34
32
  {
@@ -70,20 +68,30 @@ export const run = async (argvArg: any) => {
70
68
  }
71
69
  })();
72
70
 
73
- logger.log('info', `OK! Creating commit with message '${commitString}'`);
71
+ ui.printHeader('✨ Creating Semantic Commit');
72
+ ui.printCommitMessage(commitString);
74
73
  const smartshellInstance = new plugins.smartshell.Smartshell({
75
74
  executor: 'bash',
76
75
  sourceFilePaths: [],
77
76
  });
78
77
 
79
- logger.log('info', `Baking commitinfo into code ...`);
78
+ // Determine total steps (6 if pushing, 5 if not)
79
+ const totalSteps = answerBucket.getAnswerFor('pushToOrigin') && !(process.env.CI === 'true') ? 6 : 5;
80
+ let currentStep = 0;
81
+
82
+ // Step 1: Baking commitinfo
83
+ currentStep++;
84
+ ui.printStep(currentStep, totalSteps, '🔧 Baking commit info into code', 'in-progress');
80
85
  const commitInfo = new plugins.commitinfo.CommitInfo(
81
86
  paths.cwd,
82
87
  commitVersionType,
83
88
  );
84
89
  await commitInfo.writeIntoPotentialDirs();
90
+ ui.printStep(currentStep, totalSteps, '🔧 Baking commit info into code', 'done');
85
91
 
86
- logger.log('info', `Writing changelog.md ...`);
92
+ // Step 2: Writing changelog
93
+ currentStep++;
94
+ ui.printStep(currentStep, totalSteps, '📄 Generating changelog.md', 'in-progress');
87
95
  let changelog = nextCommitObject.changelog;
88
96
  changelog = changelog.replaceAll(
89
97
  '{{nextVersion}}',
@@ -110,23 +118,54 @@ export const run = async (argvArg: any) => {
110
118
  changelog,
111
119
  plugins.path.join(paths.cwd, `changelog.md`),
112
120
  );
121
+ ui.printStep(currentStep, totalSteps, '📄 Generating changelog.md', 'done');
113
122
 
114
- logger.log('info', `Staging files for commit:`);
123
+ // Step 3: Staging files
124
+ currentStep++;
125
+ ui.printStep(currentStep, totalSteps, 'đŸ“Ļ Staging files', 'in-progress');
115
126
  await smartshellInstance.exec(`git add -A`);
127
+ ui.printStep(currentStep, totalSteps, 'đŸ“Ļ Staging files', 'done');
128
+
129
+ // Step 4: Creating commit
130
+ currentStep++;
131
+ ui.printStep(currentStep, totalSteps, '💾 Creating git commit', 'in-progress');
116
132
  await smartshellInstance.exec(`git commit -m "${commitString}"`);
133
+ ui.printStep(currentStep, totalSteps, '💾 Creating git commit', 'done');
117
134
 
118
- // Detect project type and bump version accordingly
135
+ // Step 5: Bumping version
136
+ currentStep++;
119
137
  const projectType = await helpers.detectProjectType();
120
- await helpers.bumpProjectVersion(projectType, commitVersionType);
138
+ const newVersion = await helpers.bumpProjectVersion(projectType, commitVersionType, currentStep, totalSteps);
121
139
 
140
+ // Step 6: Push to remote (optional)
141
+ const currentBranch = await helpers.detectCurrentBranch();
122
142
  if (
123
143
  answerBucket.getAnswerFor('pushToOrigin') &&
124
144
  !(process.env.CI === 'true')
125
145
  ) {
126
- // Detect current branch instead of hardcoding "master"
127
- const currentBranch = await helpers.detectCurrentBranch();
146
+ currentStep++;
147
+ ui.printStep(currentStep, totalSteps, `🚀 Pushing to origin/${currentBranch}`, 'in-progress');
128
148
  await smartshellInstance.exec(`git push origin ${currentBranch} --follow-tags`);
149
+ ui.printStep(currentStep, totalSteps, `🚀 Pushing to origin/${currentBranch}`, 'done');
129
150
  }
151
+
152
+ console.log(''); // Add spacing before summary
153
+
154
+ // Get commit SHA for summary
155
+ const commitShaResult = await smartshellInstance.exec('git rev-parse --short HEAD');
156
+ const commitSha = commitShaResult.stdout.trim();
157
+
158
+ // Print final summary
159
+ ui.printSummary({
160
+ projectType,
161
+ branch: currentBranch,
162
+ commitType: answerBucket.getAnswerFor('commitType'),
163
+ commitScope: answerBucket.getAnswerFor('commitScope'),
164
+ commitMessage: answerBucket.getAnswerFor('commitDescription'),
165
+ newVersion: newVersion,
166
+ commitSha: commitSha,
167
+ pushed: answerBucket.getAnswerFor('pushToOrigin') && !(process.env.CI === 'true'),
168
+ });
130
169
  };
131
170
 
132
171
  const createCommitStringFromAnswerBucket = (
@@ -1,6 +1,7 @@
1
1
  import * as plugins from './mod.plugins.js';
2
2
  import * as paths from '../paths.js';
3
3
  import { logger } from '../gitzone.logging.js';
4
+ import * as ui from './mod.ui.js';
4
5
 
5
6
  export type ProjectType = 'npm' | 'deno' | 'both' | 'none';
6
7
  export type VersionType = 'patch' | 'minor' | 'major';
@@ -90,12 +91,16 @@ function calculateNewVersion(currentVersion: string, versionType: VersionType):
90
91
  }
91
92
 
92
93
  /**
93
- * Bumps the version in deno.json
94
+ * Bumps the version in deno.json, commits the change, and creates a tag
94
95
  * @param versionType Type of version bump
95
96
  * @returns The new version string
96
97
  */
97
98
  export async function bumpDenoVersion(versionType: VersionType): Promise<string> {
98
99
  const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
100
+ const smartshellInstance = new plugins.smartshell.Smartshell({
101
+ executor: 'bash',
102
+ sourceFilePaths: [],
103
+ });
99
104
 
100
105
  try {
101
106
  // Read deno.json
@@ -121,6 +126,17 @@ export async function bumpDenoVersion(versionType: VersionType): Promise<string>
121
126
  denoJsonPath
122
127
  );
123
128
 
129
+ // Stage the deno.json file
130
+ await smartshellInstance.exec('git add deno.json');
131
+
132
+ // Commit the version bump
133
+ await smartshellInstance.exec(`git commit -m "v${newVersion}"`);
134
+
135
+ // Create the version tag
136
+ await smartshellInstance.exec(`git tag v${newVersion} -m "v${newVersion}"`);
137
+
138
+ logger.log('info', `Created commit and tag v${newVersion}`);
139
+
124
140
  return newVersion;
125
141
  } catch (error) {
126
142
  throw new Error(`Failed to bump deno.json version: ${error.message}`);
@@ -147,11 +163,15 @@ async function bumpNpmVersion(versionType: VersionType): Promise<string> {
147
163
  }
148
164
 
149
165
  /**
150
- * Syncs the version from package.json to deno.json
166
+ * Syncs the version from package.json to deno.json and amends the npm commit
151
167
  * @param version The version to sync
152
168
  */
153
169
  async function syncVersionToDenoJson(version: string): Promise<void> {
154
170
  const denoJsonPath = plugins.path.join(paths.cwd, 'deno.json');
171
+ const smartshellInstance = new plugins.smartshell.Smartshell({
172
+ executor: 'bash',
173
+ sourceFilePaths: [],
174
+ });
155
175
 
156
176
  try {
157
177
  const denoConfig = plugins.smartfile.fs.toObjectSync(
@@ -165,6 +185,17 @@ async function syncVersionToDenoJson(version: string): Promise<void> {
165
185
  JSON.stringify(denoConfig, null, 2) + '\n',
166
186
  denoJsonPath
167
187
  );
188
+
189
+ // Stage the deno.json file
190
+ await smartshellInstance.exec('git add deno.json');
191
+
192
+ // Amend the npm version commit to include deno.json
193
+ await smartshellInstance.exec('git commit --amend --no-edit');
194
+
195
+ // Re-create the tag with force to update it
196
+ await smartshellInstance.exec(`git tag -fa v${version} -m "v${version}"`);
197
+
198
+ logger.log('info', `Amended commit to include deno.json and updated tag v${version}`);
168
199
  } catch (error) {
169
200
  throw new Error(`Failed to sync version to deno.json: ${error.message}`);
170
201
  }
@@ -174,25 +205,40 @@ async function syncVersionToDenoJson(version: string): Promise<void> {
174
205
  * Bumps the project version based on project type
175
206
  * @param projectType The detected project type
176
207
  * @param versionType The type of version bump
208
+ * @param currentStep The current step number for progress display
209
+ * @param totalSteps The total number of steps for progress display
177
210
  * @returns The new version string
178
211
  */
179
212
  export async function bumpProjectVersion(
180
213
  projectType: ProjectType,
181
- versionType: VersionType
214
+ versionType: VersionType,
215
+ currentStep?: number,
216
+ totalSteps?: number
182
217
  ): Promise<string> {
218
+ const projectEmoji = projectType === 'npm' ? 'đŸ“Ļ' : projectType === 'deno' ? 'đŸĻ•' : '🔀';
219
+ const description = `đŸˇī¸ Bumping version (${projectEmoji} ${projectType})`;
220
+
221
+ if (currentStep && totalSteps) {
222
+ ui.printStep(currentStep, totalSteps, description, 'in-progress');
223
+ }
224
+
225
+ let newVersion: string;
226
+
183
227
  switch (projectType) {
184
228
  case 'npm':
185
- return await bumpNpmVersion(versionType);
229
+ newVersion = await bumpNpmVersion(versionType);
230
+ break;
186
231
 
187
232
  case 'deno':
188
- return await bumpDenoVersion(versionType);
233
+ newVersion = await bumpDenoVersion(versionType);
234
+ break;
189
235
 
190
236
  case 'both': {
191
237
  // Bump npm version first (it handles git tags)
192
- const newVersion = await bumpNpmVersion(versionType);
238
+ newVersion = await bumpNpmVersion(versionType);
193
239
  // Then sync to deno.json
194
240
  await syncVersionToDenoJson(newVersion);
195
- return newVersion;
241
+ break;
196
242
  }
197
243
 
198
244
  case 'none':
@@ -201,4 +247,10 @@ export async function bumpProjectVersion(
201
247
  default:
202
248
  throw new Error(`Unknown project type: ${projectType}`);
203
249
  }
250
+
251
+ if (currentStep && totalSteps) {
252
+ ui.printStep(currentStep, totalSteps, description, 'done');
253
+ }
254
+
255
+ return newVersion;
204
256
  }
@@ -0,0 +1,196 @@
1
+ import { logger } from '../gitzone.logging.js';
2
+
3
+ /**
4
+ * UI helper module for beautiful CLI output
5
+ */
6
+
7
+ interface ICommitSummary {
8
+ projectType: string;
9
+ branch: string;
10
+ commitType: string;
11
+ commitScope: string;
12
+ commitMessage: string;
13
+ newVersion: string;
14
+ commitSha?: string;
15
+ pushed: boolean;
16
+ repoUrl?: string;
17
+ }
18
+
19
+ interface IRecommendation {
20
+ recommendedNextVersion: string;
21
+ recommendedNextVersionLevel: string;
22
+ recommendedNextVersionScope: string;
23
+ recommendedNextVersionMessage: string;
24
+ }
25
+
26
+ /**
27
+ * Print a header with a box around it
28
+ */
29
+ export function printHeader(title: string): void {
30
+ const width = 57;
31
+ const padding = Math.max(0, width - title.length - 2);
32
+ const leftPad = Math.floor(padding / 2);
33
+ const rightPad = padding - leftPad;
34
+
35
+ console.log('');
36
+ console.log('╭─' + '─'.repeat(width) + '─╮');
37
+ console.log('│ ' + title + ' '.repeat(rightPad + leftPad) + ' │');
38
+ console.log('╰─' + '─'.repeat(width) + '─╯');
39
+ console.log('');
40
+ }
41
+
42
+ /**
43
+ * Print a section with a border
44
+ */
45
+ export function printSection(title: string, lines: string[]): void {
46
+ const width = 59;
47
+
48
+ console.log('┌─ ' + title + ' ' + '─'.repeat(Math.max(0, width - title.length - 3)) + '┐');
49
+ console.log('│' + ' '.repeat(width) + '│');
50
+
51
+ for (const line of lines) {
52
+ const padding = width - line.length;
53
+ console.log('│ ' + line + ' '.repeat(Math.max(0, padding - 2)) + '│');
54
+ }
55
+
56
+ console.log('│' + ' '.repeat(width) + '│');
57
+ console.log('└─' + '─'.repeat(width) + '─┘');
58
+ console.log('');
59
+ }
60
+
61
+ /**
62
+ * Print AI recommendations in a nice box
63
+ */
64
+ export function printRecommendation(recommendation: IRecommendation): void {
65
+ const lines = [
66
+ `Suggested Version: v${recommendation.recommendedNextVersion}`,
67
+ `Suggested Type: ${recommendation.recommendedNextVersionLevel}`,
68
+ `Suggested Scope: ${recommendation.recommendedNextVersionScope}`,
69
+ `Suggested Message: ${recommendation.recommendedNextVersionMessage}`,
70
+ ];
71
+
72
+ printSection('📊 AI Recommendations', lines);
73
+ }
74
+
75
+ /**
76
+ * Print a progress step
77
+ */
78
+ export function printStep(
79
+ current: number,
80
+ total: number,
81
+ description: string,
82
+ status: 'in-progress' | 'done' | 'error'
83
+ ): void {
84
+ const statusIcon = status === 'done' ? '✓' : status === 'error' ? '✗' : 'âŗ';
85
+ const dots = '.'.repeat(Math.max(0, 40 - description.length));
86
+
87
+ console.log(` [${current}/${total}] ${description}${dots} ${statusIcon}`);
88
+
89
+ // Clear the line on next update if in progress
90
+ if (status === 'in-progress') {
91
+ process.stdout.write('\x1b[1A'); // Move cursor up one line
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Get emoji for project type
97
+ */
98
+ function getProjectTypeEmoji(projectType: string): string {
99
+ switch (projectType) {
100
+ case 'npm':
101
+ return 'đŸ“Ļ npm';
102
+ case 'deno':
103
+ return 'đŸĻ• Deno';
104
+ case 'both':
105
+ return '🔀 npm + Deno';
106
+ default:
107
+ return '❓ Unknown';
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Get emoji for commit type
113
+ */
114
+ function getCommitTypeEmoji(commitType: string): string {
115
+ switch (commitType) {
116
+ case 'fix':
117
+ return '🔧 fix';
118
+ case 'feat':
119
+ return '✨ feat';
120
+ case 'BREAKING CHANGE':
121
+ return 'đŸ’Ĩ BREAKING CHANGE';
122
+ default:
123
+ return commitType;
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Print final commit summary
129
+ */
130
+ export function printSummary(summary: ICommitSummary): void {
131
+ const lines = [
132
+ `Project Type: ${getProjectTypeEmoji(summary.projectType)}`,
133
+ `Branch: đŸŒŋ ${summary.branch}`,
134
+ `Commit Type: ${getCommitTypeEmoji(summary.commitType)}`,
135
+ `Scope: 📍 ${summary.commitScope}`,
136
+ `New Version: đŸˇī¸ v${summary.newVersion}`,
137
+ ];
138
+
139
+ if (summary.commitSha) {
140
+ lines.push(`Commit SHA: 📌 ${summary.commitSha}`);
141
+ }
142
+
143
+ if (summary.pushed) {
144
+ lines.push(`Remote: ✓ Pushed successfully`);
145
+ } else {
146
+ lines.push(`Remote: ⊘ Not pushed (local only)`);
147
+ }
148
+
149
+ if (summary.repoUrl && summary.commitSha) {
150
+ lines.push('');
151
+ lines.push(`View at: ${summary.repoUrl}/commit/${summary.commitSha}`);
152
+ }
153
+
154
+ printSection('✅ Commit Summary', lines);
155
+
156
+ if (summary.pushed) {
157
+ console.log('🎉 All done! Your changes are committed and pushed.\n');
158
+ } else {
159
+ console.log('✓ Commit created successfully.\n');
160
+ }
161
+ }
162
+
163
+ /**
164
+ * Print an info message with consistent formatting
165
+ */
166
+ export function printInfo(message: string): void {
167
+ console.log(` â„šī¸ ${message}`);
168
+ }
169
+
170
+ /**
171
+ * Print a success message
172
+ */
173
+ export function printSuccess(message: string): void {
174
+ console.log(` ✓ ${message}`);
175
+ }
176
+
177
+ /**
178
+ * Print a warning message
179
+ */
180
+ export function printWarning(message: string): void {
181
+ logger.log('warn', `âš ī¸ ${message}`);
182
+ }
183
+
184
+ /**
185
+ * Print an error message
186
+ */
187
+ export function printError(message: string): void {
188
+ logger.log('error', `✗ ${message}`);
189
+ }
190
+
191
+ /**
192
+ * Print commit message being created
193
+ */
194
+ export function printCommitMessage(commitString: string): void {
195
+ console.log(`\n 📝 Commit: ${commitString}\n`);
196
+ }