@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.
@@ -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
- const project = await Project.fromCwd();
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 (options.dryRun) {
104
- logger.log('info', 'Dry-run mode - no changes will be made');
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvRCx3Q0FBd0M7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRCxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxFQUNwQixVQVVJLEVBQUUsRUFDUSxFQUFFO0lBQ2hCLGdDQUFnQztJQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FB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
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<unknown>;
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
- const done = plugins.smartpromise.defer();
9
- logger.log('warn', 'no action specified');
10
- const dirEntries = await plugins.smartfs.directory(paths.templatesDir).list();
11
- const templates = [];
12
- for (const entry of dirEntries) {
13
- try {
14
- const stats = await plugins.smartfs
15
- .file(plugins.path.join(paths.templatesDir, entry.path))
16
- .stat();
17
- if (stats.isDirectory) {
18
- templates.push(entry.name);
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
- catch {
22
- // Skip entries that can't be accessed
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2Rfc3RhbmRhcmQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O3FEQUVxRDtBQUNyRCxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBRXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDMUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBRTFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlFLE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUMvQixLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU87aUJBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdkQsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxzQ0FBc0M7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDcEIsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNqQyxRQUFRLElBQUksWUFBWSxRQUFRLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FDUixNQUFNLEVBQ047Ozt1Q0FHbUMsUUFBUTs7R0FFNUMsQ0FDQSxDQUFDO0lBQ0YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyJ9
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
- "gitzone": {
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.3.0",
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.3",
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
- "scripts": {
99
- "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",
100
- "build": "tsbuild tsfolders",
101
- "clean": "(rm -rf test/)",
102
- "prepareTest": "(git clone https://gitlab.com/sandboxzone/sandbox-npmts.git test/)",
103
- "testBuild": "npm run build && rm -r dist/",
104
- "testCli": "(cd test && node ../cli.ts.js)",
105
- "testCommit": "(cd test && node ../cli.ts.js commit)",
106
- "testDeprecate": "(cd test && node ../cli.ts.js deprecate)",
107
- "testOpen": "(cd test && node ../cli.ts.js open ci)",
108
- "testReadme": "(cd test && node ../cli.ts.js readme)",
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
+ }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@git.zone/cli',
6
- version: '2.3.0',
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
  }
@@ -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
- if (!project.gitzoneConfig.data.projectType) {
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'],
@@ -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: Push to remote (optional)
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++;
@@ -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
  */
@@ -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
  /**