@wyxos/zephyr 0.9.3 → 0.9.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wyxos/zephyr",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "description": "A streamlined deployment tool for web applications with intelligent Laravel project detection",
5
5
  "type": "module",
6
6
  "main": "./src/index.mjs",
@@ -97,6 +97,41 @@ function formatVersionReferenceLabel(reference, currentVersion) {
97
97
  return `${prefix} ${reference.shortHash} (${reference.version})`
98
98
  }
99
99
 
100
+
101
+ async function readRecentAppCommitSubjects(rootDir, versionReference, {runCommand} = {}) {
102
+ if (!versionReference?.hash || typeof runCommand !== 'function') {
103
+ return ''
104
+ }
105
+
106
+ try {
107
+ const {stdout = ''} = await runCommand('git', [
108
+ 'log',
109
+ '--format=%s',
110
+ '--max-count=80',
111
+ `${versionReference.hash}..HEAD`
112
+ ], {
113
+ capture: true,
114
+ cwd: rootDir
115
+ })
116
+
117
+ return stdout.trim()
118
+ } catch {
119
+ return ''
120
+ }
121
+ }
122
+
123
+ function inferMinimumReleaseTypeFromCommitSubjects(commitSubjects) {
124
+ if (/breaking change|breaking changes|^[a-z]+(?:\(.+\))?!:/im.test(commitSubjects)) {
125
+ return 'major'
126
+ }
127
+
128
+ if (/\bfeat(?:\(.+\))?:/im.test(commitSubjects)) {
129
+ return 'minor'
130
+ }
131
+
132
+ return null
133
+ }
134
+
100
135
  async function resolveDeploymentVersionValue(rootDir, {
101
136
  versionArg = null,
102
137
  pkg,
@@ -112,6 +147,7 @@ async function resolveDeploymentVersionValue(rootDir, {
112
147
 
113
148
  const versionBumps = await readVersionBumpCommits(rootDir, {runCommand})
114
149
  const versionReference = selectVersionSuggestionReference(pkg.version, versionBumps)
150
+ const commitSubjects = await readRecentAppCommitSubjects(rootDir, versionReference, {runCommand})
115
151
 
116
152
  return await resolveReleaseType({
117
153
  currentVersion: pkg.version,
@@ -123,7 +159,8 @@ async function resolveDeploymentVersionValue(rootDir, {
123
159
  logStep: logProcessing,
124
160
  logWarning,
125
161
  latestTag: versionReference?.hash ?? null,
126
- referenceLabel: formatVersionReferenceLabel(versionReference, pkg.version)
162
+ referenceLabel: formatVersionReferenceLabel(versionReference, pkg.version),
163
+ minimumReleaseType: inferMinimumReleaseTypeFromCommitSubjects(commitSubjects)
127
164
  })
128
165
  }
129
166
 
@@ -79,12 +79,12 @@ function inferReleaseTypeHeuristically({
79
79
  return 'patch'
80
80
  }
81
81
 
82
- function applyHeuristicFloor(releaseType, heuristicReleaseType) {
82
+ function applyReleaseTypeFloor(releaseType, floorReleaseType) {
83
83
  const releaseWeight = RELEASE_TYPE_WEIGHTS[releaseType] ?? -1
84
- const heuristicWeight = RELEASE_TYPE_WEIGHTS[heuristicReleaseType] ?? -1
84
+ const floorWeight = RELEASE_TYPE_WEIGHTS[floorReleaseType] ?? -1
85
85
 
86
- if (heuristicWeight > releaseWeight) {
87
- return heuristicReleaseType
86
+ if (floorWeight > releaseWeight) {
87
+ return floorReleaseType
88
88
  }
89
89
 
90
90
  return releaseType
@@ -187,7 +187,8 @@ async function suggestReleaseType(rootDir = process.cwd(), {
187
187
  logStep,
188
188
  logWarning,
189
189
  latestTag = null,
190
- referenceLabel = null
190
+ referenceLabel = null,
191
+ minimumReleaseType = null
191
192
  } = {}) {
192
193
  const context = await buildReleaseSuggestionContext(rootDir, {
193
194
  runCommand,
@@ -197,7 +198,10 @@ async function suggestReleaseType(rootDir = process.cwd(), {
197
198
  referenceLabel
198
199
  })
199
200
  const allowedSuggestedReleaseTypes = resolveSuggestedReleaseTypeOptions(currentVersion)
200
- const heuristicReleaseType = inferReleaseTypeHeuristically(context)
201
+ const heuristicReleaseType = applyReleaseTypeFloor(
202
+ inferReleaseTypeHeuristically(context),
203
+ sanitizeSuggestedReleaseType(minimumReleaseType, allowedSuggestedReleaseTypes)
204
+ )
201
205
 
202
206
  if (!commandExistsImpl('codex')) {
203
207
  return {
@@ -254,7 +258,7 @@ async function suggestReleaseType(rootDir = process.cwd(), {
254
258
  }
255
259
  }
256
260
 
257
- const flooredReleaseType = applyHeuristicFloor(releaseType, heuristicReleaseType)
261
+ const flooredReleaseType = applyReleaseTypeFloor(releaseType, heuristicReleaseType)
258
262
 
259
263
  return {
260
264
  ...context,
@@ -287,7 +291,8 @@ export async function resolveReleaseType({
287
291
  logStep,
288
292
  logWarning,
289
293
  latestTag = null,
290
- referenceLabel = null
294
+ referenceLabel = null,
295
+ minimumReleaseType = null
291
296
  } = {}) {
292
297
  if (releaseType) {
293
298
  return releaseType
@@ -300,7 +305,8 @@ export async function resolveReleaseType({
300
305
  logStep,
301
306
  logWarning,
302
307
  latestTag,
303
- referenceLabel
308
+ referenceLabel,
309
+ minimumReleaseType
304
310
  })
305
311
  const rangeLabel = suggested.referenceLabel || suggested.latestTag
306
312
  ? `based on changes since ${suggested.referenceLabel || suggested.latestTag}`