@bonvoy/plugin-git 0.4.0 → 0.5.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/README.md CHANGED
@@ -25,9 +25,9 @@ npm install @bonvoy/plugin-git
25
25
  // bonvoy.config.js
26
26
  export default {
27
27
  git: {
28
- commitMessage: 'chore(release): :bookmark: {packages} [skip ci]', // default
29
- tagFormat: '{name}@{version}', // default
30
- push: true, // default
28
+ commitMessage: 'chore: :bookmark: release', // default
29
+ tagFormat: '{name}@{version}', // default
30
+ push: true, // default
31
31
  },
32
32
  };
33
33
  ```
@@ -36,10 +36,13 @@ export default {
36
36
 
37
37
  | Placeholder | Description |
38
38
  |-------------|-------------|
39
- | `{packages}` | Comma-separated list of released package names |
39
+ | `{packages}` | Comma-separated list of released package names (for subject) |
40
+ | `{details}` | Package list with versions, one per line (for body) |
40
41
  | `{name}` | Package name (for tag format) |
41
42
  | `{version}` | Package version (for tag format) |
42
43
 
44
+ > **Note:** If neither `{details}` is used in the commit message, package details are automatically appended as the commit body.
45
+
43
46
  ## Hooks
44
47
 
45
48
  This plugin taps into the following hooks:
package/dist/index.mjs CHANGED
@@ -99,7 +99,7 @@ var GitPlugin = class {
99
99
  ops;
100
100
  constructor(config = {}, ops) {
101
101
  this.config = {
102
- commitMessage: config.commitMessage ?? "chore: release {packages}",
102
+ commitMessage: config.commitMessage ?? "chore: :bookmark: release",
103
103
  tagFormat: config.tagFormat ?? "{name}@{version}",
104
104
  push: config.push ?? true
105
105
  };
@@ -123,12 +123,14 @@ var GitPlugin = class {
123
123
  async commitChanges(context) {
124
124
  const { packages, isDryRun, rootPath, logger } = context;
125
125
  if (packages.length === 0) return;
126
+ const packageList = packages.map((pkg) => `- ${pkg.name}@${pkg.version}`).join("\n");
126
127
  const packageNames = packages.map((pkg) => pkg.name).join(", ");
127
- const message = this.config.commitMessage.replace("{packages}", packageNames);
128
- logger.info(` Commit message: "${message}"`);
128
+ const message = this.config.commitMessage.replace("{packages}", packageNames).replace("{details}", packageList);
129
+ const fullMessage = message.includes(packageList) ? message : `${message}\n\n${packageList}`;
130
+ logger.info(` Commit message: "${fullMessage}"`);
129
131
  if (!isDryRun) {
130
132
  await this.ops.add(".", rootPath);
131
- await this.ops.commit(message, rootPath);
133
+ await this.ops.commit(fullMessage, rootPath);
132
134
  }
133
135
  }
134
136
  async createTags(context) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/operations.ts","../src/git.ts"],"sourcesContent":["import { execa } from 'execa';\n\nexport interface GitOperations {\n add(files: string, cwd: string): Promise<void>;\n commit(message: string, cwd: string): Promise<void>;\n tag(name: string, cwd: string): Promise<void>;\n push(cwd: string, branch?: string): Promise<void>;\n pushTags(tags: string[], cwd: string): Promise<void>;\n checkout(branch: string, cwd: string, create?: boolean): Promise<void>;\n getCurrentBranch(cwd: string): Promise<string>;\n tagExists(name: string, cwd: string): Promise<boolean>;\n getCommitsSinceTag(\n tag: string | null,\n cwd: string,\n ): Promise<\n Array<{ hash: string; message: string; author: string; date: string; files: string[] }>\n >;\n getLastTag(cwd: string): Promise<string | null>;\n}\n\nexport const defaultGitOperations: GitOperations = {\n async add(files, cwd) {\n await execa('git', ['add', files], { cwd });\n },\n\n async commit(message, cwd) {\n await execa('git', ['commit', '-m', message], { cwd });\n },\n\n async tag(name, cwd) {\n await execa('git', ['tag', name], { cwd });\n },\n\n /* c8 ignore start - real git operations */\n async push(cwd, branch?) {\n if (branch) {\n await execa('git', ['push', '-u', 'origin', branch], { cwd });\n } else {\n await execa('git', ['push'], { cwd });\n }\n },\n\n async pushTags(tags, cwd) {\n await execa('git', ['push', 'origin', ...tags], { cwd });\n },\n\n async checkout(branch, cwd, create = false) {\n const args = create ? ['checkout', '-b', branch] : ['checkout', branch];\n await execa('git', args, { cwd });\n },\n\n async getCurrentBranch(cwd) {\n const { stdout } = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd });\n return stdout.trim();\n },\n\n async tagExists(name, cwd) {\n try {\n await execa('git', ['rev-parse', `refs/tags/${name}`], { cwd });\n return true;\n } catch {\n return false;\n }\n },\n /* c8 ignore stop */\n\n async getLastTag(cwd) {\n try {\n const { stdout } = await execa('git', ['describe', '--tags', '--abbrev=0'], { cwd });\n return stdout.trim() || null;\n } catch {\n return null;\n }\n },\n\n async getCommitsSinceTag(tag, cwd) {\n const range = tag ? `${tag}..HEAD` : 'HEAD';\n const { stdout } = await execa(\n 'git',\n ['log', '--pretty=format:%H|%s|%an|%aI', '--name-only', range],\n { cwd },\n );\n\n if (!stdout.trim()) return [];\n\n const commits: Array<{\n hash: string;\n message: string;\n author: string;\n date: string;\n files: string[];\n }> = [];\n const entries = stdout.split('\\n\\n');\n\n for (const entry of entries) {\n const lines = entry.split('\\n');\n const [firstLine, ...fileLines] = lines;\n const [hash, message, author, date] = firstLine.split('|');\n if (hash && message) {\n commits.push({\n hash,\n message,\n author: author || '',\n date: date || '',\n files: fileLines.filter((f) => f.trim()),\n });\n }\n }\n\n return commits;\n },\n};\n","import type { BonvoyPlugin, Context, PublishContext } from '@bonvoy/core';\n\nimport { defaultGitOperations, type GitOperations } from './operations.js';\n\nexport interface GitPluginConfig {\n commitMessage?: string;\n tagFormat?: string;\n push?: boolean;\n}\n\nexport default class GitPlugin implements BonvoyPlugin {\n name = 'git';\n\n private config: Required<GitPluginConfig>;\n private ops: GitOperations;\n\n constructor(config: GitPluginConfig = {}, ops?: GitOperations) {\n this.config = {\n commitMessage: config.commitMessage ?? 'chore: release {packages}',\n tagFormat: config.tagFormat ?? '{name}@{version}',\n push: config.push ?? true,\n };\n this.ops = ops ?? defaultGitOperations;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Hook types are complex and vary by implementation\n apply(bonvoy: { hooks: { validateRepo: any; beforePublish: any } }): void {\n bonvoy.hooks.validateRepo.tapPromise(this.name, async (context: Context) => {\n await this.validateTags(context);\n });\n\n bonvoy.hooks.beforePublish.tapPromise(this.name, async (context: PublishContext) => {\n context.logger.info('📝 Committing changes...');\n await this.commitChanges(context);\n context.logger.info('🏷️ Creating git tags...');\n await this.createTags(context);\n\n if (this.config.push) {\n context.logger.info('⬆️ Pushing to remote...');\n await this.pushChanges(context);\n }\n });\n }\n\n private async commitChanges(context: PublishContext): Promise<void> {\n const { packages, isDryRun, rootPath, logger } = context;\n\n if (packages.length === 0) return;\n\n const packageNames = packages.map((pkg) => pkg.name).join(', ');\n const message = this.config.commitMessage.replace('{packages}', packageNames);\n\n logger.info(` Commit message: \"${message}\"`);\n\n if (!isDryRun) {\n await this.ops.add('.', rootPath);\n await this.ops.commit(message, rootPath);\n }\n }\n\n private async createTags(context: PublishContext): Promise<void> {\n const { packages, isDryRun, rootPath, logger } = context;\n\n for (const pkg of packages) {\n const tag = this.config.tagFormat\n .replace('{name}', pkg.name)\n .replace('{version}', pkg.version);\n\n logger.info(` Tag: ${tag}`);\n\n if (!isDryRun) {\n await this.ops.tag(tag, rootPath);\n }\n }\n }\n\n private async pushChanges(context: PublishContext): Promise<void> {\n const { packages, isDryRun, rootPath, logger } = context;\n\n logger.info(' Pushing commits and tags...');\n\n if (!isDryRun) {\n await this.ops.push(rootPath);\n\n const tags = packages.map((pkg) =>\n this.config.tagFormat.replace('{name}', pkg.name).replace('{version}', pkg.version),\n );\n await this.ops.pushTags(tags, rootPath);\n }\n }\n\n private async validateTags(context: Context): Promise<void> {\n const { changedPackages, versions, rootPath, logger } = context;\n if (!versions) return;\n\n const existingTags: string[] = [];\n\n for (const pkg of changedPackages) {\n const version = versions[pkg.name];\n if (!version) continue;\n\n const tag = this.config.tagFormat.replace('{name}', pkg.name).replace('{version}', version);\n\n if (await this.ops.tagExists(tag, rootPath)) {\n existingTags.push(tag);\n }\n }\n\n if (existingTags.length > 0) {\n logger.error(`❌ Git tags already exist: ${existingTags.join(', ')}`);\n throw new Error(\n `Cannot release: git tags already exist (${existingTags.join(', ')}). Delete them first or bump to a new version.`,\n );\n }\n }\n}\n\nexport { defaultGitOperations, type GitOperations } from './operations.js';\n"],"mappings":";;;AAoBA,MAAa,uBAAsC;CACjD,MAAM,IAAI,OAAO,KAAK;AACpB,QAAM,MAAM,OAAO,CAAC,OAAO,MAAM,EAAE,EAAE,KAAK,CAAC;;CAG7C,MAAM,OAAO,SAAS,KAAK;AACzB,QAAM,MAAM,OAAO;GAAC;GAAU;GAAM;GAAQ,EAAE,EAAE,KAAK,CAAC;;CAGxD,MAAM,IAAI,MAAM,KAAK;AACnB,QAAM,MAAM,OAAO,CAAC,OAAO,KAAK,EAAE,EAAE,KAAK,CAAC;;CAI5C,MAAM,KAAK,KAAK,QAAS;AACvB,MAAI,OACF,OAAM,MAAM,OAAO;GAAC;GAAQ;GAAM;GAAU;GAAO,EAAE,EAAE,KAAK,CAAC;MAE7D,OAAM,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC;;CAIzC,MAAM,SAAS,MAAM,KAAK;AACxB,QAAM,MAAM,OAAO;GAAC;GAAQ;GAAU,GAAG;GAAK,EAAE,EAAE,KAAK,CAAC;;CAG1D,MAAM,SAAS,QAAQ,KAAK,SAAS,OAAO;AAE1C,QAAM,MAAM,OADC,SAAS;GAAC;GAAY;GAAM;GAAO,GAAG,CAAC,YAAY,OAAO,EAC9C,EAAE,KAAK,CAAC;;CAGnC,MAAM,iBAAiB,KAAK;EAC1B,MAAM,EAAE,WAAW,MAAM,MAAM,OAAO;GAAC;GAAa;GAAgB;GAAO,EAAE,EAAE,KAAK,CAAC;AACrF,SAAO,OAAO,MAAM;;CAGtB,MAAM,UAAU,MAAM,KAAK;AACzB,MAAI;AACF,SAAM,MAAM,OAAO,CAAC,aAAa,aAAa,OAAO,EAAE,EAAE,KAAK,CAAC;AAC/D,UAAO;UACD;AACN,UAAO;;;CAKX,MAAM,WAAW,KAAK;AACpB,MAAI;GACF,MAAM,EAAE,WAAW,MAAM,MAAM,OAAO;IAAC;IAAY;IAAU;IAAa,EAAE,EAAE,KAAK,CAAC;AACpF,UAAO,OAAO,MAAM,IAAI;UAClB;AACN,UAAO;;;CAIX,MAAM,mBAAmB,KAAK,KAAK;EAEjC,MAAM,EAAE,WAAW,MAAM,MACvB,OACA;GAAC;GAAO;GAAiC;GAH7B,MAAM,GAAG,IAAI,UAAU;GAG2B,EAC9D,EAAE,KAAK,CACR;AAED,MAAI,CAAC,OAAO,MAAM,CAAE,QAAO,EAAE;EAE7B,MAAM,UAMD,EAAE;EACP,MAAM,UAAU,OAAO,MAAM,OAAO;AAEpC,OAAK,MAAM,SAAS,SAAS;GAE3B,MAAM,CAAC,WAAW,GAAG,aADP,MAAM,MAAM,KAAK;GAE/B,MAAM,CAAC,MAAM,SAAS,QAAQ,QAAQ,UAAU,MAAM,IAAI;AAC1D,OAAI,QAAQ,QACV,SAAQ,KAAK;IACX;IACA;IACA,QAAQ,UAAU;IAClB,MAAM,QAAQ;IACd,OAAO,UAAU,QAAQ,MAAM,EAAE,MAAM,CAAC;IACzC,CAAC;;AAIN,SAAO;;CAEV;;;;ACrGD,IAAqB,YAArB,MAAuD;CACrD,OAAO;CAEP,AAAQ;CACR,AAAQ;CAER,YAAY,SAA0B,EAAE,EAAE,KAAqB;AAC7D,OAAK,SAAS;GACZ,eAAe,OAAO,iBAAiB;GACvC,WAAW,OAAO,aAAa;GAC/B,MAAM,OAAO,QAAQ;GACtB;AACD,OAAK,MAAM,OAAO;;CAIpB,MAAM,QAAoE;AACxE,SAAO,MAAM,aAAa,WAAW,KAAK,MAAM,OAAO,YAAqB;AAC1E,SAAM,KAAK,aAAa,QAAQ;IAChC;AAEF,SAAO,MAAM,cAAc,WAAW,KAAK,MAAM,OAAO,YAA4B;AAClF,WAAQ,OAAO,KAAK,2BAA2B;AAC/C,SAAM,KAAK,cAAc,QAAQ;AACjC,WAAQ,OAAO,KAAK,4BAA4B;AAChD,SAAM,KAAK,WAAW,QAAQ;AAE9B,OAAI,KAAK,OAAO,MAAM;AACpB,YAAQ,OAAO,KAAK,2BAA2B;AAC/C,UAAM,KAAK,YAAY,QAAQ;;IAEjC;;CAGJ,MAAc,cAAc,SAAwC;EAClE,MAAM,EAAE,UAAU,UAAU,UAAU,WAAW;AAEjD,MAAI,SAAS,WAAW,EAAG;EAE3B,MAAM,eAAe,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK;EAC/D,MAAM,UAAU,KAAK,OAAO,cAAc,QAAQ,cAAc,aAAa;AAE7E,SAAO,KAAK,sBAAsB,QAAQ,GAAG;AAE7C,MAAI,CAAC,UAAU;AACb,SAAM,KAAK,IAAI,IAAI,KAAK,SAAS;AACjC,SAAM,KAAK,IAAI,OAAO,SAAS,SAAS;;;CAI5C,MAAc,WAAW,SAAwC;EAC/D,MAAM,EAAE,UAAU,UAAU,UAAU,WAAW;AAEjD,OAAK,MAAM,OAAO,UAAU;GAC1B,MAAM,MAAM,KAAK,OAAO,UACrB,QAAQ,UAAU,IAAI,KAAK,CAC3B,QAAQ,aAAa,IAAI,QAAQ;AAEpC,UAAO,KAAK,UAAU,MAAM;AAE5B,OAAI,CAAC,SACH,OAAM,KAAK,IAAI,IAAI,KAAK,SAAS;;;CAKvC,MAAc,YAAY,SAAwC;EAChE,MAAM,EAAE,UAAU,UAAU,UAAU,WAAW;AAEjD,SAAO,KAAK,gCAAgC;AAE5C,MAAI,CAAC,UAAU;AACb,SAAM,KAAK,IAAI,KAAK,SAAS;GAE7B,MAAM,OAAO,SAAS,KAAK,QACzB,KAAK,OAAO,UAAU,QAAQ,UAAU,IAAI,KAAK,CAAC,QAAQ,aAAa,IAAI,QAAQ,CACpF;AACD,SAAM,KAAK,IAAI,SAAS,MAAM,SAAS;;;CAI3C,MAAc,aAAa,SAAiC;EAC1D,MAAM,EAAE,iBAAiB,UAAU,UAAU,WAAW;AACxD,MAAI,CAAC,SAAU;EAEf,MAAM,eAAyB,EAAE;AAEjC,OAAK,MAAM,OAAO,iBAAiB;GACjC,MAAM,UAAU,SAAS,IAAI;AAC7B,OAAI,CAAC,QAAS;GAEd,MAAM,MAAM,KAAK,OAAO,UAAU,QAAQ,UAAU,IAAI,KAAK,CAAC,QAAQ,aAAa,QAAQ;AAE3F,OAAI,MAAM,KAAK,IAAI,UAAU,KAAK,SAAS,CACzC,cAAa,KAAK,IAAI;;AAI1B,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAO,MAAM,6BAA6B,aAAa,KAAK,KAAK,GAAG;AACpE,SAAM,IAAI,MACR,2CAA2C,aAAa,KAAK,KAAK,CAAC,gDACpE"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/operations.ts","../src/git.ts"],"sourcesContent":["import { execa } from 'execa';\n\nexport interface GitOperations {\n add(files: string, cwd: string): Promise<void>;\n commit(message: string, cwd: string): Promise<void>;\n tag(name: string, cwd: string): Promise<void>;\n push(cwd: string, branch?: string): Promise<void>;\n pushTags(tags: string[], cwd: string): Promise<void>;\n checkout(branch: string, cwd: string, create?: boolean): Promise<void>;\n getCurrentBranch(cwd: string): Promise<string>;\n tagExists(name: string, cwd: string): Promise<boolean>;\n getCommitsSinceTag(\n tag: string | null,\n cwd: string,\n ): Promise<\n Array<{ hash: string; message: string; author: string; date: string; files: string[] }>\n >;\n getLastTag(cwd: string): Promise<string | null>;\n}\n\nexport const defaultGitOperations: GitOperations = {\n async add(files, cwd) {\n await execa('git', ['add', files], { cwd });\n },\n\n async commit(message, cwd) {\n await execa('git', ['commit', '-m', message], { cwd });\n },\n\n async tag(name, cwd) {\n await execa('git', ['tag', name], { cwd });\n },\n\n /* c8 ignore start - real git operations */\n async push(cwd, branch?) {\n if (branch) {\n await execa('git', ['push', '-u', 'origin', branch], { cwd });\n } else {\n await execa('git', ['push'], { cwd });\n }\n },\n\n async pushTags(tags, cwd) {\n await execa('git', ['push', 'origin', ...tags], { cwd });\n },\n\n async checkout(branch, cwd, create = false) {\n const args = create ? ['checkout', '-b', branch] : ['checkout', branch];\n await execa('git', args, { cwd });\n },\n\n async getCurrentBranch(cwd) {\n const { stdout } = await execa('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd });\n return stdout.trim();\n },\n\n async tagExists(name, cwd) {\n try {\n await execa('git', ['rev-parse', `refs/tags/${name}`], { cwd });\n return true;\n } catch {\n return false;\n }\n },\n /* c8 ignore stop */\n\n async getLastTag(cwd) {\n try {\n const { stdout } = await execa('git', ['describe', '--tags', '--abbrev=0'], { cwd });\n return stdout.trim() || null;\n } catch {\n return null;\n }\n },\n\n async getCommitsSinceTag(tag, cwd) {\n const range = tag ? `${tag}..HEAD` : 'HEAD';\n const { stdout } = await execa(\n 'git',\n ['log', '--pretty=format:%H|%s|%an|%aI', '--name-only', range],\n { cwd },\n );\n\n if (!stdout.trim()) return [];\n\n const commits: Array<{\n hash: string;\n message: string;\n author: string;\n date: string;\n files: string[];\n }> = [];\n const entries = stdout.split('\\n\\n');\n\n for (const entry of entries) {\n const lines = entry.split('\\n');\n const [firstLine, ...fileLines] = lines;\n const [hash, message, author, date] = firstLine.split('|');\n if (hash && message) {\n commits.push({\n hash,\n message,\n author: author || '',\n date: date || '',\n files: fileLines.filter((f) => f.trim()),\n });\n }\n }\n\n return commits;\n },\n};\n","import type { BonvoyPlugin, Context, PublishContext } from '@bonvoy/core';\n\nimport { defaultGitOperations, type GitOperations } from './operations.js';\n\nexport interface GitPluginConfig {\n commitMessage?: string;\n tagFormat?: string;\n push?: boolean;\n}\n\nexport default class GitPlugin implements BonvoyPlugin {\n name = 'git';\n\n private config: Required<GitPluginConfig>;\n private ops: GitOperations;\n\n constructor(config: GitPluginConfig = {}, ops?: GitOperations) {\n this.config = {\n commitMessage: config.commitMessage ?? 'chore: :bookmark: release',\n tagFormat: config.tagFormat ?? '{name}@{version}',\n push: config.push ?? true,\n };\n this.ops = ops ?? defaultGitOperations;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: Hook types are complex and vary by implementation\n apply(bonvoy: { hooks: { validateRepo: any; beforePublish: any } }): void {\n bonvoy.hooks.validateRepo.tapPromise(this.name, async (context: Context) => {\n await this.validateTags(context);\n });\n\n bonvoy.hooks.beforePublish.tapPromise(this.name, async (context: PublishContext) => {\n context.logger.info('📝 Committing changes...');\n await this.commitChanges(context);\n context.logger.info('🏷️ Creating git tags...');\n await this.createTags(context);\n\n if (this.config.push) {\n context.logger.info('⬆️ Pushing to remote...');\n await this.pushChanges(context);\n }\n });\n }\n\n private async commitChanges(context: PublishContext): Promise<void> {\n const { packages, isDryRun, rootPath, logger } = context;\n\n if (packages.length === 0) return;\n\n const packageList = packages.map((pkg) => `- ${pkg.name}@${pkg.version}`).join('\\n');\n const packageNames = packages.map((pkg) => pkg.name).join(', ');\n const message = this.config.commitMessage\n .replace('{packages}', packageNames)\n .replace('{details}', packageList);\n\n // Append package details as commit body if not already included via {details}\n const fullMessage = message.includes(packageList) ? message : `${message}\\n\\n${packageList}`;\n\n logger.info(` Commit message: \"${fullMessage}\"`);\n\n if (!isDryRun) {\n await this.ops.add('.', rootPath);\n await this.ops.commit(fullMessage, rootPath);\n }\n }\n\n private async createTags(context: PublishContext): Promise<void> {\n const { packages, isDryRun, rootPath, logger } = context;\n\n for (const pkg of packages) {\n const tag = this.config.tagFormat\n .replace('{name}', pkg.name)\n .replace('{version}', pkg.version);\n\n logger.info(` Tag: ${tag}`);\n\n if (!isDryRun) {\n await this.ops.tag(tag, rootPath);\n }\n }\n }\n\n private async pushChanges(context: PublishContext): Promise<void> {\n const { packages, isDryRun, rootPath, logger } = context;\n\n logger.info(' Pushing commits and tags...');\n\n if (!isDryRun) {\n await this.ops.push(rootPath);\n\n const tags = packages.map((pkg) =>\n this.config.tagFormat.replace('{name}', pkg.name).replace('{version}', pkg.version),\n );\n await this.ops.pushTags(tags, rootPath);\n }\n }\n\n private async validateTags(context: Context): Promise<void> {\n const { changedPackages, versions, rootPath, logger } = context;\n if (!versions) return;\n\n const existingTags: string[] = [];\n\n for (const pkg of changedPackages) {\n const version = versions[pkg.name];\n if (!version) continue;\n\n const tag = this.config.tagFormat.replace('{name}', pkg.name).replace('{version}', version);\n\n if (await this.ops.tagExists(tag, rootPath)) {\n existingTags.push(tag);\n }\n }\n\n if (existingTags.length > 0) {\n logger.error(`❌ Git tags already exist: ${existingTags.join(', ')}`);\n throw new Error(\n `Cannot release: git tags already exist (${existingTags.join(', ')}). Delete them first or bump to a new version.`,\n );\n }\n }\n}\n\nexport { defaultGitOperations, type GitOperations } from './operations.js';\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bonvoy/plugin-git",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "🚢 Git operations plugin for bonvoy",
5
5
  "keywords": [
6
6
  "bonvoy",