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