@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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/mod_commit/index.js +53 -17
- package/dist_ts/mod_commit/mod.helpers.d.ts +4 -2
- package/dist_ts/mod_commit/mod.helpers.js +45 -8
- package/dist_ts/mod_commit/mod.ui.d.ts +61 -0
- package/dist_ts/mod_commit/mod.ui.js +147 -0
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/mod_commit/index.ts +58 -19
- package/ts/mod_commit/mod.helpers.ts +59 -7
- package/ts/mod_commit/mod.ui.ts +196 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/cli',
|
|
6
|
-
version: '1.
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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,
|
|
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
|
-
|
|
179
|
+
newVersion = await bumpNpmVersion(versionType);
|
|
180
|
+
break;
|
|
149
181
|
case 'deno':
|
|
150
|
-
|
|
182
|
+
newVersion = await bumpDenoVersion(versionType);
|
|
183
|
+
break;
|
|
151
184
|
case 'both': {
|
|
152
185
|
// Bump npm version first (it handles git tags)
|
|
153
|
-
|
|
186
|
+
newVersion = await bumpNpmVersion(versionType);
|
|
154
187
|
// Then sync to deno.json
|
|
155
188
|
await syncVersionToDenoJson(newVersion);
|
|
156
|
-
|
|
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,
|
|
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.
|
|
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",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/cli',
|
|
6
|
-
version: '1.
|
|
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
|
}
|
package/ts/mod_commit/index.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
127
|
-
|
|
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
|
-
|
|
229
|
+
newVersion = await bumpNpmVersion(versionType);
|
|
230
|
+
break;
|
|
186
231
|
|
|
187
232
|
case 'deno':
|
|
188
|
-
|
|
233
|
+
newVersion = await bumpDenoVersion(versionType);
|
|
234
|
+
break;
|
|
189
235
|
|
|
190
236
|
case 'both': {
|
|
191
237
|
// Bump npm version first (it handles git tags)
|
|
192
|
-
|
|
238
|
+
newVersion = await bumpNpmVersion(versionType);
|
|
193
239
|
// Then sync to deno.json
|
|
194
240
|
await syncVersionToDenoJson(newVersion);
|
|
195
|
-
|
|
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
|
+
}
|