@git.zone/cli 2.3.0 → 2.7.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/classes.project.d.ts +3 -1
- package/dist_ts/classes.project.js +4 -3
- package/dist_ts/gitzone.cli.js +3 -1
- package/dist_ts/mod_commit/index.js +39 -2
- package/dist_ts/mod_commit/mod.ui.d.ts +12 -0
- package/dist_ts/mod_commit/mod.ui.js +46 -1
- package/dist_ts/mod_config/index.js +23 -1
- package/dist_ts/mod_format/classes.baseformatter.d.ts +14 -1
- package/dist_ts/mod_format/classes.baseformatter.js +88 -1
- package/dist_ts/mod_format/index.d.ts +11 -0
- package/dist_ts/mod_format/index.js +54 -5
- package/dist_ts/mod_format/interfaces.format.d.ts +10 -0
- package/dist_ts/mod_standard/index.d.ts +1 -1
- package/dist_ts/mod_standard/index.js +75 -27
- package/npmextra.json +12 -5
- package/package.json +31 -21
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.project.ts +3 -2
- package/ts/gitzone.cli.ts +2 -0
- package/ts/mod_commit/index.ts +40 -1
- package/ts/mod_commit/mod.ui.ts +57 -0
- package/ts/mod_config/index.ts +27 -0
- package/ts/mod_format/classes.baseformatter.ts +91 -1
- package/ts/mod_format/index.ts +76 -5
- package/ts/mod_format/interfaces.format.ts +12 -1
- package/ts/mod_standard/index.ts +78 -31
|
@@ -2,6 +2,7 @@ import * as plugins from './mod.plugins.js';
|
|
|
2
2
|
import { Project } from '../classes.project.js';
|
|
3
3
|
import { FormatContext } from './classes.formatcontext.js';
|
|
4
4
|
import { FormatPlanner } from './classes.formatplanner.js';
|
|
5
|
+
import { BaseFormatter } from './classes.baseformatter.js';
|
|
5
6
|
import { logger, setVerboseMode } from '../gitzone.logging.js';
|
|
6
7
|
// Import wrapper classes for formatters
|
|
7
8
|
import { CleanupFormatter } from './formatters/cleanup.formatter.js';
|
|
@@ -19,7 +20,10 @@ export let run = async (options = {}) => {
|
|
|
19
20
|
if (options.verbose) {
|
|
20
21
|
setVerboseMode(true);
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
+
// Determine if we should write changes
|
|
24
|
+
// Default is dry-mode (no writing) unless --write/-w is specified
|
|
25
|
+
const shouldWrite = options.write ?? (options.dryRun === false);
|
|
26
|
+
const project = await Project.fromCwd({ requireProjectType: false });
|
|
23
27
|
const context = new FormatContext();
|
|
24
28
|
// Cache system removed - no longer needed
|
|
25
29
|
const planner = new FormatPlanner();
|
|
@@ -99,9 +103,9 @@ export let run = async (options = {}) => {
|
|
|
99
103
|
if (options.planOnly) {
|
|
100
104
|
return;
|
|
101
105
|
}
|
|
102
|
-
// Dry-run mode
|
|
103
|
-
if (
|
|
104
|
-
logger.log('info', 'Dry-run mode -
|
|
106
|
+
// Dry-run mode (default behavior)
|
|
107
|
+
if (!shouldWrite) {
|
|
108
|
+
logger.log('info', 'Dry-run mode - use --write (-w) to apply changes');
|
|
105
109
|
return;
|
|
106
110
|
}
|
|
107
111
|
// Interactive confirmation
|
|
@@ -151,4 +155,49 @@ export const handleListBackups = async () => {
|
|
|
151
155
|
export const handleCleanBackups = async () => {
|
|
152
156
|
logger.log('info', 'Backup cleaning has been disabled - backup system removed');
|
|
153
157
|
};
|
|
154
|
-
|
|
158
|
+
// Formatters that don't require projectType to be set
|
|
159
|
+
const formattersNotRequiringProjectType = ['npmextra', 'prettier', 'cleanup', 'packagejson'];
|
|
160
|
+
/**
|
|
161
|
+
* Run a single formatter by name (for use by other modules)
|
|
162
|
+
*/
|
|
163
|
+
export const runFormatter = async (formatterName, options = {}) => {
|
|
164
|
+
// Determine if this formatter requires projectType
|
|
165
|
+
const requireProjectType = !formattersNotRequiringProjectType.includes(formatterName);
|
|
166
|
+
const project = await Project.fromCwd({ requireProjectType });
|
|
167
|
+
const context = new FormatContext();
|
|
168
|
+
// Map formatter names to classes
|
|
169
|
+
const formatterMap = {
|
|
170
|
+
cleanup: CleanupFormatter,
|
|
171
|
+
npmextra: NpmextraFormatter,
|
|
172
|
+
license: LicenseFormatter,
|
|
173
|
+
packagejson: PackageJsonFormatter,
|
|
174
|
+
templates: TemplatesFormatter,
|
|
175
|
+
gitignore: GitignoreFormatter,
|
|
176
|
+
tsconfig: TsconfigFormatter,
|
|
177
|
+
prettier: PrettierFormatter,
|
|
178
|
+
readme: ReadmeFormatter,
|
|
179
|
+
copy: CopyFormatter,
|
|
180
|
+
};
|
|
181
|
+
const FormatterClass = formatterMap[formatterName];
|
|
182
|
+
if (!FormatterClass) {
|
|
183
|
+
throw new Error(`Unknown formatter: ${formatterName}`);
|
|
184
|
+
}
|
|
185
|
+
const formatter = new FormatterClass(context, project);
|
|
186
|
+
// Check-only mode: just check for diffs and optionally display them
|
|
187
|
+
if (options.checkOnly) {
|
|
188
|
+
const result = await formatter.check();
|
|
189
|
+
if (result.hasDiff && options.showDiff) {
|
|
190
|
+
formatter.displayAllDiffs(result);
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
// Normal mode: analyze and apply changes
|
|
195
|
+
const changes = await formatter.analyze();
|
|
196
|
+
for (const change of changes) {
|
|
197
|
+
await formatter.applyChange(change);
|
|
198
|
+
}
|
|
199
|
+
if (!options.silent) {
|
|
200
|
+
logger.log('success', `Formatter '${formatterName}' completed`);
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0Qsd0NBQXdDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFL0QsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUssRUFDcEIsVUFXSSxFQUFFLEVBQ1EsRUFBRTtJQUNo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
|
|
@@ -38,6 +38,16 @@ export type IPlannedChange = {
|
|
|
38
38
|
module: string;
|
|
39
39
|
description: string;
|
|
40
40
|
content?: string;
|
|
41
|
+
originalContent?: string;
|
|
41
42
|
diff?: string;
|
|
42
43
|
size?: number;
|
|
43
44
|
};
|
|
45
|
+
export interface ICheckResult {
|
|
46
|
+
hasDiff: boolean;
|
|
47
|
+
diffs: Array<{
|
|
48
|
+
path: string;
|
|
49
|
+
type: 'create' | 'modify' | 'delete';
|
|
50
|
+
before?: string;
|
|
51
|
+
after?: string;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare let run: () => Promise<
|
|
1
|
+
export declare let run: () => Promise<void>;
|
|
@@ -5,34 +5,82 @@ import * as plugins from './mod.plugins.js';
|
|
|
5
5
|
import * as paths from '../paths.js';
|
|
6
6
|
import { logger } from '../gitzone.logging.js';
|
|
7
7
|
export let run = async () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
8
|
+
console.log('');
|
|
9
|
+
console.log('╭─────────────────────────────────────────────────────────────╮');
|
|
10
|
+
console.log('│ gitzone - Development Workflow CLI │');
|
|
11
|
+
console.log('╰─────────────────────────────────────────────────────────────╯');
|
|
12
|
+
console.log('');
|
|
13
|
+
const interactInstance = new plugins.smartinteract.SmartInteract();
|
|
14
|
+
const response = await interactInstance.askQuestion({
|
|
15
|
+
type: 'list',
|
|
16
|
+
name: 'action',
|
|
17
|
+
message: 'What would you like to do?',
|
|
18
|
+
default: 'commit',
|
|
19
|
+
choices: [
|
|
20
|
+
{ name: 'Commit changes (semantic versioning)', value: 'commit' },
|
|
21
|
+
{ name: 'Format project files', value: 'format' },
|
|
22
|
+
{ name: 'Configure release settings', value: 'config' },
|
|
23
|
+
{ name: 'Create from template', value: 'template' },
|
|
24
|
+
{ name: 'Manage dev services (MongoDB, S3)', value: 'services' },
|
|
25
|
+
{ name: 'Open project assets', value: 'open' },
|
|
26
|
+
{ name: 'Show help', value: 'help' },
|
|
27
|
+
],
|
|
28
|
+
});
|
|
29
|
+
const action = response.value;
|
|
30
|
+
switch (action) {
|
|
31
|
+
case 'commit': {
|
|
32
|
+
const modCommit = await import('../mod_commit/index.js');
|
|
33
|
+
await modCommit.run({ _: ['commit'] });
|
|
34
|
+
break;
|
|
20
35
|
}
|
|
21
|
-
|
|
22
|
-
|
|
36
|
+
case 'format': {
|
|
37
|
+
const modFormat = await import('../mod_format/index.js');
|
|
38
|
+
await modFormat.run({ interactive: true });
|
|
39
|
+
break;
|
|
23
40
|
}
|
|
41
|
+
case 'config': {
|
|
42
|
+
const modConfig = await import('../mod_config/index.js');
|
|
43
|
+
await modConfig.run({ _: ['config'] });
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case 'template': {
|
|
47
|
+
const modTemplate = await import('../mod_template/index.js');
|
|
48
|
+
await modTemplate.run({ _: ['template'] });
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case 'services': {
|
|
52
|
+
const modServices = await import('../mod_services/index.js');
|
|
53
|
+
await modServices.run({ _: ['services'] });
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case 'open': {
|
|
57
|
+
const modOpen = await import('../mod_open/index.js');
|
|
58
|
+
await modOpen.run({ _: ['open'] });
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case 'help':
|
|
62
|
+
showHelp();
|
|
63
|
+
break;
|
|
24
64
|
}
|
|
25
|
-
let projects = `\n`;
|
|
26
|
-
for (const template of templates) {
|
|
27
|
-
projects += ` - ${template}\n`;
|
|
28
|
-
}
|
|
29
|
-
logger.log('info', `
|
|
30
|
-
You can do one of the following things:
|
|
31
|
-
* create a new project with 'gitzone template [template]'
|
|
32
|
-
the following templates exist: ${projects}
|
|
33
|
-
* format a project with 'gitzone format'
|
|
34
|
-
`);
|
|
35
|
-
done.resolve();
|
|
36
|
-
return done.promise;
|
|
37
65
|
};
|
|
38
|
-
|
|
66
|
+
function showHelp() {
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log('Usage: gitzone <command> [options]');
|
|
69
|
+
console.log('');
|
|
70
|
+
console.log('Commands:');
|
|
71
|
+
console.log(' commit Create a semantic commit with versioning');
|
|
72
|
+
console.log(' format Format and standardize project files');
|
|
73
|
+
console.log(' config Manage release registry configuration');
|
|
74
|
+
console.log(' template Create a new project from template');
|
|
75
|
+
console.log(' services Manage dev services (MongoDB, S3/MinIO)');
|
|
76
|
+
console.log(' open Open project assets (GitLab, npm, etc.)');
|
|
77
|
+
console.log(' docker Docker-related operations');
|
|
78
|
+
console.log(' deprecate Deprecate a package on npm');
|
|
79
|
+
console.log(' meta Run meta commands');
|
|
80
|
+
console.log(' start Start working on a project');
|
|
81
|
+
console.log(' helpers Run helper utilities');
|
|
82
|
+
console.log('');
|
|
83
|
+
console.log('Run gitzone <command> --help for more information on a command.');
|
|
84
|
+
console.log('');
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfc3RhbmRhcmQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O3FEQUVxRDtBQUNyRCxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBRXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7SUFDL0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUVBQWlFLENBQUMsQ0FBQztJQUMvRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWhCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsV0FBVyxDQUFDO1FBQ2xELElBQUksRUFBRSxNQUFNO1FBQ1osSUFBSSxFQUFFLFFBQVE7UUFDZCxPQUFPLEVBQUUsNEJBQTRCO1FBQ3JDLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE9BQU8sRUFBRTtZQUNQLEVBQUUsSUFBSSxFQUFFLHNDQUFzQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDakUsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUNqRCxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO1lBQ3ZELEVBQUUsSUFBSSxFQUFFLHNCQUFzQixF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
|
package/npmextra.json
CHANGED
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
"npmAccessLevel": "private",
|
|
5
5
|
"npmRegistryUrl": "verdaccio.lossless.one"
|
|
6
6
|
},
|
|
7
|
-
"
|
|
7
|
+
"tsdoc": {
|
|
8
|
+
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
|
|
9
|
+
},
|
|
10
|
+
"@git.zone/cli": {
|
|
8
11
|
"projectType": "npm",
|
|
9
12
|
"module": {
|
|
10
13
|
"githost": "gitlab.com",
|
|
@@ -31,9 +34,13 @@
|
|
|
31
34
|
"Docker",
|
|
32
35
|
"CI/CD"
|
|
33
36
|
]
|
|
37
|
+
},
|
|
38
|
+
"release": {
|
|
39
|
+
"registries": [
|
|
40
|
+
"https://verdaccio.lossless.digital",
|
|
41
|
+
"https://registry.npmjs.org"
|
|
42
|
+
],
|
|
43
|
+
"accessLevel": "public"
|
|
34
44
|
}
|
|
35
|
-
},
|
|
36
|
-
"tsdoc": {
|
|
37
|
-
"legal": "\n## License and Legal Information\n\nThis repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. \n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.\n\n### Company Information\n\nTask Venture Capital GmbH \nRegistered at District court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or if you require further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n"
|
|
38
45
|
}
|
|
39
|
-
}
|
|
46
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/cli",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.7.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",
|
|
@@ -10,6 +10,24 @@
|
|
|
10
10
|
"gitzone": "./cli.js",
|
|
11
11
|
"gzone": "./cli.js"
|
|
12
12
|
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"test": "(npm run clean && npm run prepareTest && npm run testCli && npm run testFormat && npm run testCommit && npm run testDeprecate && npm run testVersion && npm run testReadme && npm run testUpdate && npm run testTemplateNpm && npm run testTemplateLit) && rm -rf test",
|
|
15
|
+
"build": "tsbuild tsfolders",
|
|
16
|
+
"clean": "(rm -rf test/)",
|
|
17
|
+
"prepareTest": "(git clone https://gitlab.com/sandboxzone/sandbox-npmts.git test/)",
|
|
18
|
+
"testBuild": "npm run build && rm -r dist/",
|
|
19
|
+
"testCli": "(cd test && node ../cli.ts.js)",
|
|
20
|
+
"testCommit": "(cd test && node ../cli.ts.js commit)",
|
|
21
|
+
"testDeprecate": "(cd test && node ../cli.ts.js deprecate)",
|
|
22
|
+
"testOpen": "(cd test && node ../cli.ts.js open ci)",
|
|
23
|
+
"testReadme": "(cd test && node ../cli.ts.js readme)",
|
|
24
|
+
"testFormat": "(cd test && node ../cli.ts.js format)",
|
|
25
|
+
"testTemplateNpm": "(rm -rf test/testtemplate_npm/ && mkdir test/testtemplate_npm && cd test/testtemplate_npm && node ../../cli.ts.js template npm)",
|
|
26
|
+
"testTemplateLit": "(rm -rf test/testtemplate_lit/ && mkdir test/testtemplate_lit && cd test/testtemplate_lit && node ../../cli.ts.js template lit)",
|
|
27
|
+
"testUpdate": "(cd test && node ../cli.ts.js update)",
|
|
28
|
+
"testVersion": "(cd test && node ../cli.ts.js -v)",
|
|
29
|
+
"buildDocs": "tsdoc"
|
|
30
|
+
},
|
|
13
31
|
"repository": {
|
|
14
32
|
"type": "git",
|
|
15
33
|
"url": "https://gitlab.com/gitzone/private/gitzone.git"
|
|
@@ -58,7 +76,7 @@
|
|
|
58
76
|
"@push.rocks/npmextra": "^5.3.3",
|
|
59
77
|
"@push.rocks/projectinfo": "^5.0.2",
|
|
60
78
|
"@push.rocks/smartcli": "^4.0.19",
|
|
61
|
-
"@push.rocks/smartdiff": "^1.0
|
|
79
|
+
"@push.rocks/smartdiff": "^1.1.0",
|
|
62
80
|
"@push.rocks/smartfile": "^13.1.2",
|
|
63
81
|
"@push.rocks/smartfs": "^1.2.0",
|
|
64
82
|
"@push.rocks/smartgulp": "^3.0.4",
|
|
@@ -95,22 +113,14 @@
|
|
|
95
113
|
"browserslist": [
|
|
96
114
|
"last 1 chrome versions"
|
|
97
115
|
],
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
"testFormat": "(cd test && node ../cli.ts.js format)",
|
|
110
|
-
"testTemplateNpm": "(rm -rf test/testtemplate_npm/ && mkdir test/testtemplate_npm && cd test/testtemplate_npm && node ../../cli.ts.js template npm)",
|
|
111
|
-
"testTemplateLit": "(rm -rf test/testtemplate_lit/ && mkdir test/testtemplate_lit && cd test/testtemplate_lit && node ../../cli.ts.js template lit)",
|
|
112
|
-
"testUpdate": "(cd test && node ../cli.ts.js update)",
|
|
113
|
-
"testVersion": "(cd test && node ../cli.ts.js -v)",
|
|
114
|
-
"buildDocs": "tsdoc"
|
|
115
|
-
}
|
|
116
|
-
}
|
|
116
|
+
"pnpm": {
|
|
117
|
+
"overrides": {},
|
|
118
|
+
"onlyBuiltDependencies": [
|
|
119
|
+
"esbuild",
|
|
120
|
+
"mongodb-memory-server",
|
|
121
|
+
"puppeteer",
|
|
122
|
+
"sharp"
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
"packageManager": "pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6"
|
|
126
|
+
}
|
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: '2.
|
|
6
|
+
version: '2.7.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/classes.project.ts
CHANGED
|
@@ -8,10 +8,11 @@ import type { TGitzoneProjectType } from './classes.gitzoneconfig.js';
|
|
|
8
8
|
* the Project class is a tool to work with a gitzone project
|
|
9
9
|
*/
|
|
10
10
|
export class Project {
|
|
11
|
-
public static async fromCwd() {
|
|
11
|
+
public static async fromCwd(options: { requireProjectType?: boolean } = {}) {
|
|
12
12
|
const gitzoneConfig = await GitzoneConfig.fromCwd();
|
|
13
13
|
const project = new Project(gitzoneConfig);
|
|
14
|
-
|
|
14
|
+
const requireProjectType = options.requireProjectType ?? true;
|
|
15
|
+
if (requireProjectType && !project.gitzoneConfig.data.projectType) {
|
|
15
16
|
throw new Error('Please define a project type');
|
|
16
17
|
}
|
|
17
18
|
return project;
|
package/ts/gitzone.cli.ts
CHANGED
|
@@ -80,7 +80,9 @@ export let run = async () => {
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
// Handle format with options
|
|
83
|
+
// Default is dry-mode, use --write/-w to apply changes
|
|
83
84
|
await modFormat.run({
|
|
85
|
+
write: argvArg.write || argvArg.w,
|
|
84
86
|
dryRun: argvArg['dry-run'],
|
|
85
87
|
yes: argvArg.yes,
|
|
86
88
|
planOnly: argvArg['plan-only'],
|
package/ts/mod_commit/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { ReleaseConfig } from '../mod_config/classes.releaseconfig.js';
|
|
|
10
10
|
export const run = async (argvArg: any) => {
|
|
11
11
|
// Check if release flag is set and validate registries early
|
|
12
12
|
const wantsRelease = !!(argvArg.r || argvArg.release);
|
|
13
|
+
const wantsBuild = !!(argvArg.b || argvArg.build);
|
|
13
14
|
let releaseConfig: ReleaseConfig | null = null;
|
|
14
15
|
|
|
15
16
|
if (wantsRelease) {
|
|
@@ -23,6 +24,16 @@ export const run = async (argvArg: any) => {
|
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
// Print execution plan at the start
|
|
28
|
+
ui.printExecutionPlan({
|
|
29
|
+
autoAccept: !!(argvArg.y || argvArg.yes),
|
|
30
|
+
push: !!(argvArg.p || argvArg.push),
|
|
31
|
+
build: wantsBuild,
|
|
32
|
+
release: wantsRelease,
|
|
33
|
+
format: !!argvArg.format,
|
|
34
|
+
registries: releaseConfig?.getRegistries(),
|
|
35
|
+
});
|
|
36
|
+
|
|
26
37
|
if (argvArg.format) {
|
|
27
38
|
const formatMod = await import('../mod_format/index.js');
|
|
28
39
|
await formatMod.run();
|
|
@@ -153,6 +164,7 @@ export const run = async (argvArg: any) => {
|
|
|
153
164
|
const willPush = answerBucket.getAnswerFor('pushToOrigin') && !(process.env.CI === 'true');
|
|
154
165
|
const willRelease = answerBucket.getAnswerFor('createRelease') && releaseConfig?.hasRegistries();
|
|
155
166
|
let totalSteps = 5; // Base steps: commitinfo, changelog, staging, commit, version
|
|
167
|
+
if (wantsBuild) totalSteps += 2; // build step + verification step
|
|
156
168
|
if (willPush) totalSteps++;
|
|
157
169
|
if (willRelease) totalSteps++;
|
|
158
170
|
let currentStep = 0;
|
|
@@ -215,7 +227,34 @@ export const run = async (argvArg: any) => {
|
|
|
215
227
|
const projectType = await helpers.detectProjectType();
|
|
216
228
|
const newVersion = await helpers.bumpProjectVersion(projectType, commitVersionType, currentStep, totalSteps);
|
|
217
229
|
|
|
218
|
-
// Step 6:
|
|
230
|
+
// Step 6: Run build (optional)
|
|
231
|
+
if (wantsBuild) {
|
|
232
|
+
currentStep++;
|
|
233
|
+
ui.printStep(currentStep, totalSteps, '🔨 Running build', 'in-progress');
|
|
234
|
+
const buildResult = await smartshellInstance.exec('pnpm build');
|
|
235
|
+
if (buildResult.exitCode !== 0) {
|
|
236
|
+
ui.printStep(currentStep, totalSteps, '🔨 Running build', 'error');
|
|
237
|
+
logger.log('error', 'Build failed. Aborting release.');
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
240
|
+
ui.printStep(currentStep, totalSteps, '🔨 Running build', 'done');
|
|
241
|
+
|
|
242
|
+
// Step 7: Verify no uncommitted changes
|
|
243
|
+
currentStep++;
|
|
244
|
+
ui.printStep(currentStep, totalSteps, '🔍 Verifying clean working tree', 'in-progress');
|
|
245
|
+
const statusResult = await smartshellInstance.exec('git status --porcelain');
|
|
246
|
+
if (statusResult.stdout.trim() !== '') {
|
|
247
|
+
ui.printStep(currentStep, totalSteps, '🔍 Verifying clean working tree', 'error');
|
|
248
|
+
logger.log('error', 'Build produced uncommitted changes. This usually means build output is not gitignored.');
|
|
249
|
+
logger.log('error', 'Uncommitted files:');
|
|
250
|
+
console.log(statusResult.stdout);
|
|
251
|
+
logger.log('error', 'Aborting release. Please ensure build artifacts are in .gitignore');
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
ui.printStep(currentStep, totalSteps, '🔍 Verifying clean working tree', 'done');
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Step: Push to remote (optional)
|
|
219
258
|
const currentBranch = await helpers.detectCurrentBranch();
|
|
220
259
|
if (willPush) {
|
|
221
260
|
currentStep++;
|
package/ts/mod_commit/mod.ui.ts
CHANGED
|
@@ -18,6 +18,15 @@ interface ICommitSummary {
|
|
|
18
18
|
releasedRegistries?: string[];
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
+
interface IExecutionPlanOptions {
|
|
22
|
+
autoAccept: boolean;
|
|
23
|
+
push: boolean;
|
|
24
|
+
build: boolean;
|
|
25
|
+
release: boolean;
|
|
26
|
+
format: boolean;
|
|
27
|
+
registries?: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
21
30
|
interface IRecommendation {
|
|
22
31
|
recommendedNextVersion: string;
|
|
23
32
|
recommendedNextVersionLevel: string;
|
|
@@ -41,6 +50,54 @@ export function printHeader(title: string): void {
|
|
|
41
50
|
console.log('');
|
|
42
51
|
}
|
|
43
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Print execution plan at the start of commit
|
|
55
|
+
*/
|
|
56
|
+
export function printExecutionPlan(options: IExecutionPlanOptions): void {
|
|
57
|
+
console.log('');
|
|
58
|
+
console.log('╭───────────────────────────────────────────────────────────────╮');
|
|
59
|
+
console.log('│ gitzone commit - Execution Plan │');
|
|
60
|
+
console.log('╰───────────────────────────────────────────────────────────────╯');
|
|
61
|
+
console.log('');
|
|
62
|
+
|
|
63
|
+
// Show active options
|
|
64
|
+
console.log(' Options:');
|
|
65
|
+
console.log(` Auto-accept ${options.autoAccept ? '✓ enabled (-y)' : '○ interactive mode'}`);
|
|
66
|
+
console.log(` Push to remote ${options.push ? '✓ enabled (-p)' : '○ disabled'}`);
|
|
67
|
+
console.log(` Build & verify ${options.build ? '✓ enabled (-b)' : '○ disabled'}`);
|
|
68
|
+
console.log(` Release to npm ${options.release ? '✓ enabled (-r)' : '○ disabled'}`);
|
|
69
|
+
if (options.format) {
|
|
70
|
+
console.log(` Format first ✓ enabled (--format)`);
|
|
71
|
+
}
|
|
72
|
+
console.log('');
|
|
73
|
+
|
|
74
|
+
// Show steps
|
|
75
|
+
console.log(' Steps:');
|
|
76
|
+
let stepNum = 1;
|
|
77
|
+
if (options.format) {
|
|
78
|
+
console.log(` ${stepNum++}. Format project files`);
|
|
79
|
+
}
|
|
80
|
+
console.log(` ${stepNum++}. Analyze repository changes`);
|
|
81
|
+
console.log(` ${stepNum++}. Bake commit info into code`);
|
|
82
|
+
console.log(` ${stepNum++}. Generate changelog.md`);
|
|
83
|
+
console.log(` ${stepNum++}. Stage and commit files`);
|
|
84
|
+
console.log(` ${stepNum++}. Bump version`);
|
|
85
|
+
if (options.build) {
|
|
86
|
+
console.log(` ${stepNum++}. Run build`);
|
|
87
|
+
console.log(` ${stepNum++}. Verify clean working tree`);
|
|
88
|
+
}
|
|
89
|
+
if (options.push) {
|
|
90
|
+
console.log(` ${stepNum++}. Push to remote`);
|
|
91
|
+
}
|
|
92
|
+
if (options.release) {
|
|
93
|
+
console.log(` ${stepNum++}. Publish to npm registries`);
|
|
94
|
+
if (options.registries && options.registries.length > 0) {
|
|
95
|
+
options.registries.forEach(r => console.log(` → ${r}`));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
console.log('');
|
|
99
|
+
}
|
|
100
|
+
|
|
44
101
|
/**
|
|
45
102
|
* Print a section with a border
|
|
46
103
|
*/
|
package/ts/mod_config/index.ts
CHANGED
|
@@ -2,9 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
import * as plugins from './mod.plugins.js';
|
|
4
4
|
import { ReleaseConfig } from './classes.releaseconfig.js';
|
|
5
|
+
import { runFormatter, type ICheckResult } from '../mod_format/index.js';
|
|
5
6
|
|
|
6
7
|
export { ReleaseConfig };
|
|
7
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Format npmextra.json with diff preview
|
|
11
|
+
* Shows diff first, asks for confirmation, then applies
|
|
12
|
+
*/
|
|
13
|
+
async function formatNpmextraWithDiff(): Promise<void> {
|
|
14
|
+
// Check for diffs first
|
|
15
|
+
const checkResult = await runFormatter('npmextra', {
|
|
16
|
+
checkOnly: true,
|
|
17
|
+
showDiff: true,
|
|
18
|
+
}) as ICheckResult | void;
|
|
19
|
+
|
|
20
|
+
if (checkResult && checkResult.hasDiff) {
|
|
21
|
+
const shouldApply = await plugins.smartinteract.SmartInteract.getCliConfirmation(
|
|
22
|
+
'Apply formatting changes to npmextra.json?',
|
|
23
|
+
true
|
|
24
|
+
);
|
|
25
|
+
if (shouldApply) {
|
|
26
|
+
await runFormatter('npmextra', { silent: true });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
8
31
|
export const run = async (argvArg: any) => {
|
|
9
32
|
const command = argvArg._?.[1];
|
|
10
33
|
const value = argvArg._?.[2];
|
|
@@ -149,6 +172,7 @@ async function handleAdd(url?: string): Promise<void> {
|
|
|
149
172
|
if (added) {
|
|
150
173
|
await config.save();
|
|
151
174
|
plugins.logger.log('success', `Added registry: ${url}`);
|
|
175
|
+
await formatNpmextraWithDiff();
|
|
152
176
|
} else {
|
|
153
177
|
plugins.logger.log('warn', `Registry already exists: ${url}`);
|
|
154
178
|
}
|
|
@@ -184,6 +208,7 @@ async function handleRemove(url?: string): Promise<void> {
|
|
|
184
208
|
if (removed) {
|
|
185
209
|
await config.save();
|
|
186
210
|
plugins.logger.log('success', `Removed registry: ${url}`);
|
|
211
|
+
await formatNpmextraWithDiff();
|
|
187
212
|
} else {
|
|
188
213
|
plugins.logger.log('warn', `Registry not found: ${url}`);
|
|
189
214
|
}
|
|
@@ -210,6 +235,7 @@ async function handleClear(): Promise<void> {
|
|
|
210
235
|
config.clearRegistries();
|
|
211
236
|
await config.save();
|
|
212
237
|
plugins.logger.log('success', 'All registries cleared.');
|
|
238
|
+
await formatNpmextraWithDiff();
|
|
213
239
|
} else {
|
|
214
240
|
plugins.logger.log('info', 'Operation cancelled.');
|
|
215
241
|
}
|
|
@@ -249,6 +275,7 @@ async function handleAccessLevel(level?: string): Promise<void> {
|
|
|
249
275
|
config.setAccessLevel(level as 'public' | 'private');
|
|
250
276
|
await config.save();
|
|
251
277
|
plugins.logger.log('success', `Access level set to: ${level}`);
|
|
278
|
+
await formatNpmextraWithDiff();
|
|
252
279
|
}
|
|
253
280
|
|
|
254
281
|
/**
|