@kaikybrofc/omnizap-system 2.1.10 → 2.2.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/.env.example CHANGED
@@ -521,6 +521,13 @@ DEPLOY_PACKAGE_SECONDARY_TOKEN_KEYS=
521
521
  # ==============================
522
522
  # Release (auto commit/push)
523
523
  # ==============================
524
+ # Tipo de bump padrão no npm run release (patch/minor/major...)
525
+ RELEASE_TYPE=patch
526
+ # Opcional: força versão exata (ex: 2.2.0), ignorando RELEASE_TYPE
527
+ RELEASE_FORCE_VERSION=
528
+ # Rollover automático de patch: quando patch >= RELEASE_PATCH_ROLLOVER_AT, vira (major).(minor+1).0
529
+ RELEASE_PATCH_ROLLOVER_ENABLED=1
530
+ RELEASE_PATCH_ROLLOVER_AT=10
524
531
  # Faz commit automatico de alteracoes pendentes antes do release
525
532
  RELEASE_GIT_AUTO_COMMIT=1
526
533
  # Faz push automatico dos commits gerados no release
@@ -535,6 +542,8 @@ RELEASE_GIT_VERSION_COMMIT_PREFIX=chore(release): v
535
542
 
536
543
  # Cria/atualiza GitHub Release (aba Releases) automaticamente no npm run release
537
544
  RELEASE_GITHUB_RELEASE=1
545
+ # Se 1, falha o release caso GitHub Release esteja desativado
546
+ RELEASE_REQUIRE_GITHUB_RELEASE=1
538
547
  RELEASE_GITHUB_REPO=kaikybrofc/omnizap-system
539
548
  RELEASE_GITHUB_TOKEN=
540
549
  RELEASE_GITHUB_TAG_PREFIX=v
@@ -545,3 +554,12 @@ RELEASE_GITHUB_PRERELEASE=
545
554
  RELEASE_GITHUB_DRAFT=0
546
555
  # Opcional: commit/tag alvo (vazio usa HEAD atual)
547
556
  RELEASE_GITHUB_TARGET=
557
+
558
+ # Se 1, exige publish em ambos os registries no release (GitHub Packages + npmjs)
559
+ RELEASE_REQUIRE_DUAL_PUBLISH=1
560
+ # Verificação final: local + registries + GitHub Release na mesma versão
561
+ RELEASE_VERIFY_UNIFIED_VERSION=1
562
+ RELEASE_VERIFY_PRIMARY_REGISTRY=https://npm.pkg.github.com
563
+ RELEASE_VERIFY_SECONDARY_REGISTRY=https://registry.npmjs.org
564
+ RELEASE_VERIFY_PRIMARY_TOKEN_KEYS=DEPLOY_PACKAGE_TOKEN,DEPLOY_GITHUB_TOKEN,GITHUB_TOKEN,GH_TOKEN,NPM_TOKEN,NODE_AUTH_TOKEN
565
+ RELEASE_VERIFY_SECONDARY_TOKEN_KEYS=DEPLOY_PACKAGE_SECONDARY_TOKEN,NPM_TOKEN,NODE_AUTH_TOKEN
package/README.md CHANGED
@@ -132,7 +132,7 @@ Variáveis legadas foram mantidas por compatibilidade (`QUOTE_API_URL`, `WAIFU_A
132
132
  - `npm run pm2:prod`: sobe com PM2 usando `ecosystem.prod.config.cjs`.
133
133
  - `npm run deploy`: deploy automático de `public/` com cache-bust, backup, validação e reload do Nginx.
134
134
  - `npm run deploy:dry-run`: simula o deploy sem publicar/recarregar serviços.
135
- - `npm run release`: bump de versão `patch` + deploy + publish + atualização da aba GitHub Releases.
135
+ - `npm run release`: release completo com versão unificada (npmjs + GitHub Packages + GitHub Release) e verificação final.
136
136
  - `npm run release:minor`: bump `minor` + deploy + publish do package.
137
137
  - `npm run release:major`: bump `major` + deploy + publish do package.
138
138
  - `npm run test`: executa testes Node (`node --test`).
@@ -224,10 +224,14 @@ Comando único de release (patch + deploy + publish):
224
224
  npm run release
225
225
  ```
226
226
 
227
- `npm run release` agora executa publish primário + secundário por padrão (você pode desativar com `DEPLOY_PACKAGE_PUBLISH_SECONDARY=0`).
227
+ `npm run release` executa publish primário + secundário por padrão e valida consistência final de versão.
228
228
 
229
229
  Variáveis do fluxo de release (git):
230
230
 
231
+ - `RELEASE_TYPE` (default: `patch`)
232
+ - `RELEASE_FORCE_VERSION` (opcional) - força versão exata (ex.: `2.2.0`)
233
+ - `RELEASE_PATCH_ROLLOVER_ENABLED` (default: `1`) - rollover automático de patch
234
+ - `RELEASE_PATCH_ROLLOVER_AT` (default: `10`) - quando patch atingir este valor, próximo release vira `major.(minor+1).0`
231
235
  - `RELEASE_GIT_AUTO_COMMIT` (default: `1`) - commit automático se houver alterações pendentes
232
236
  - `RELEASE_GIT_AUTO_PUSH` (default: `1`) - push automático dos commits gerados
233
237
  - `RELEASE_GIT_REMOTE` (default: `origin`)
@@ -236,6 +240,7 @@ Variáveis do fluxo de release (git):
236
240
  - `RELEASE_GIT_COMMIT_VERSION` (default: `1`) - commita alteração da versão após sucesso
237
241
  - `RELEASE_GIT_VERSION_COMMIT_PREFIX` (default: `chore(release): v`)
238
242
  - `RELEASE_GITHUB_RELEASE` (default: `1`) - cria/atualiza GitHub Release na aba Releases
243
+ - `RELEASE_REQUIRE_GITHUB_RELEASE` (default: `1`) - falha se GitHub Release estiver desativado
239
244
  - `RELEASE_GITHUB_REPO` (opcional; ex.: `kaikybrofc/omnizap-system`)
240
245
  - `RELEASE_GITHUB_TOKEN` (opcional; fallback: `DEPLOY_GITHUB_TOKEN`/`GITHUB_TOKEN`/`GH_TOKEN`)
241
246
  - `RELEASE_GITHUB_TAG_PREFIX` (default: `v`) - prefixo da tag (`v2.1.9`)
@@ -244,6 +249,16 @@ Variáveis do fluxo de release (git):
244
249
  - `RELEASE_GITHUB_PRERELEASE` (default: auto) - vazio detecta `-` na versão como prerelease
245
250
  - `RELEASE_GITHUB_DRAFT` (default: `0`)
246
251
  - `RELEASE_GITHUB_TARGET` (opcional; vazio usa `HEAD`)
252
+ - `RELEASE_REQUIRE_DUAL_PUBLISH` (default: `1`) - exige publish em GitHub Packages e npmjs
253
+ - `RELEASE_VERIFY_UNIFIED_VERSION` (default: `1`) - valida versão final em local + registries + GitHub Release
254
+ - `RELEASE_VERIFY_PRIMARY_REGISTRY` (default: `https://npm.pkg.github.com`)
255
+ - `RELEASE_VERIFY_SECONDARY_REGISTRY` (default: `https://registry.npmjs.org`)
256
+ - `RELEASE_VERIFY_PRIMARY_TOKEN_KEYS` / `RELEASE_VERIFY_SECONDARY_TOKEN_KEYS` - ordem de fallback de tokens para verificação
257
+
258
+ Exemplo de rollover automático:
259
+
260
+ - `2.1.9` + `npm run release` -> `2.1.10`
261
+ - `2.1.10` + `npm run release` -> `2.2.0`
247
262
 
248
263
  ## Execução com PM2
249
264
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaikybrofc/omnizap-system",
3
- "version": "2.1.10",
3
+ "version": "2.2.0",
4
4
  "description": "Sistema profissional de automação WhatsApp com tecnologia Baileys",
5
5
  "main": "index.js",
6
6
  "publishConfig": {
@@ -59,8 +59,8 @@ const parseRepoFromRemote = () => {
59
59
  const token = env('RELEASE_GITHUB_TOKEN', 'DEPLOY_GITHUB_TOKEN', 'GITHUB_TOKEN', 'GH_TOKEN');
60
60
  const repository = env('RELEASE_GITHUB_REPO', 'DEPLOY_GITHUB_REPO', 'GITHUB_REPOSITORY') || parseRepoFromRemote();
61
61
 
62
- if (!action || action !== 'upsert') {
63
- console.error('Uso: node scripts/github-release-notify.mjs upsert --tag vX.Y.Z [opções]');
62
+ if (!action || !['upsert', 'get'].includes(action)) {
63
+ console.error('Uso: node scripts/github-release-notify.mjs <upsert|get> --tag vX.Y.Z [opções]');
64
64
  process.exit(1);
65
65
  }
66
66
 
@@ -137,6 +137,15 @@ const run = async () => {
137
137
  failFromResponse(byTag, 'GitHub API');
138
138
  }
139
139
 
140
+ if (action === 'get') {
141
+ if (!existingRelease) {
142
+ throw new Error(`GitHub release não encontrada para tag ${tag}`);
143
+ }
144
+ const url = existingRelease.html_url || '';
145
+ process.stdout.write(`found id=${existingRelease.id} tag=${tag} url=${url}`);
146
+ return;
147
+ }
148
+
140
149
  const commonPayload = {
141
150
  tag_name: tag,
142
151
  target_commitish: target || undefined,
@@ -177,4 +186,3 @@ run().catch((error) => {
177
186
  console.error(error?.message || error);
178
187
  process.exit(1);
179
188
  });
180
-
@@ -3,6 +3,9 @@ set -euo pipefail
3
3
 
4
4
  PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
5
5
  RELEASE_TYPE="${RELEASE_TYPE:-patch}"
6
+ RELEASE_FORCE_VERSION="${RELEASE_FORCE_VERSION:-}"
7
+ RELEASE_PATCH_ROLLOVER_ENABLED="${RELEASE_PATCH_ROLLOVER_ENABLED:-1}"
8
+ RELEASE_PATCH_ROLLOVER_AT="${RELEASE_PATCH_ROLLOVER_AT:-10}"
6
9
  RELEASE_GIT_AUTO_COMMIT="${RELEASE_GIT_AUTO_COMMIT:-1}"
7
10
  RELEASE_GIT_AUTO_PUSH="${RELEASE_GIT_AUTO_PUSH:-1}"
8
11
  RELEASE_GIT_REMOTE="${RELEASE_GIT_REMOTE:-origin}"
@@ -11,12 +14,20 @@ RELEASE_GIT_PRE_COMMIT_MESSAGE="${RELEASE_GIT_PRE_COMMIT_MESSAGE:-chore(release)
11
14
  RELEASE_GIT_COMMIT_VERSION="${RELEASE_GIT_COMMIT_VERSION:-1}"
12
15
  RELEASE_GIT_VERSION_COMMIT_PREFIX="${RELEASE_GIT_VERSION_COMMIT_PREFIX:-chore(release): v}"
13
16
  RELEASE_GITHUB_RELEASE="${RELEASE_GITHUB_RELEASE:-1}"
17
+ RELEASE_REQUIRE_GITHUB_RELEASE="${RELEASE_REQUIRE_GITHUB_RELEASE:-1}"
14
18
  RELEASE_GITHUB_TAG_PREFIX="${RELEASE_GITHUB_TAG_PREFIX:-v}"
15
19
  RELEASE_GITHUB_NAME_PREFIX="${RELEASE_GITHUB_NAME_PREFIX:-v}"
16
20
  RELEASE_GITHUB_GENERATE_NOTES="${RELEASE_GITHUB_GENERATE_NOTES:-1}"
17
21
  RELEASE_GITHUB_PRERELEASE="${RELEASE_GITHUB_PRERELEASE:-}"
18
22
  RELEASE_GITHUB_DRAFT="${RELEASE_GITHUB_DRAFT:-0}"
19
23
  RELEASE_GITHUB_TARGET="${RELEASE_GITHUB_TARGET:-}"
24
+ RELEASE_REQUIRE_DUAL_PUBLISH="${RELEASE_REQUIRE_DUAL_PUBLISH:-1}"
25
+ RELEASE_VERIFY_UNIFIED_VERSION="${RELEASE_VERIFY_UNIFIED_VERSION:-1}"
26
+ RELEASE_VERIFY_PRIMARY_REGISTRY="${RELEASE_VERIFY_PRIMARY_REGISTRY:-${DEPLOY_PACKAGE_REGISTRY:-https://npm.pkg.github.com}}"
27
+ RELEASE_VERIFY_SECONDARY_REGISTRY="${RELEASE_VERIFY_SECONDARY_REGISTRY:-${DEPLOY_PACKAGE_SECONDARY_REGISTRY:-https://registry.npmjs.org}}"
28
+ RELEASE_VERIFY_PRIMARY_TOKEN_KEYS="${RELEASE_VERIFY_PRIMARY_TOKEN_KEYS:-DEPLOY_PACKAGE_TOKEN,DEPLOY_GITHUB_TOKEN,GITHUB_TOKEN,GH_TOKEN,NPM_TOKEN,NODE_AUTH_TOKEN}"
29
+ RELEASE_VERIFY_SECONDARY_TOKEN_KEYS="${RELEASE_VERIFY_SECONDARY_TOKEN_KEYS:-DEPLOY_PACKAGE_SECONDARY_TOKEN,NPM_TOKEN,NODE_AUTH_TOKEN}"
30
+ TMP_NPMRC_FILES=()
20
31
 
21
32
  case "$RELEASE_TYPE" in
22
33
  patch|minor|major|prepatch|preminor|premajor|prerelease)
@@ -32,6 +43,15 @@ log() {
32
43
  printf '[release] %s\n' "$*"
33
44
  }
34
45
 
46
+ cleanup_tmp_npmrcs() {
47
+ for npmrc_tmp in "${TMP_NPMRC_FILES[@]:-}"; do
48
+ if [ -n "$npmrc_tmp" ] && [ -f "$npmrc_tmp" ]; then
49
+ rm -f "$npmrc_tmp"
50
+ fi
51
+ done
52
+ }
53
+ trap cleanup_tmp_npmrcs EXIT
54
+
35
55
  require_cmd() {
36
56
  if ! command -v "$1" >/dev/null 2>&1; then
37
57
  printf '[release] comando ausente: %s\n' "$1" >&2
@@ -39,6 +59,23 @@ require_cmd() {
39
59
  fi
40
60
  }
41
61
 
62
+ to_bool() {
63
+ local value
64
+ value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')"
65
+ case "$value" in
66
+ 1|true|yes|on)
67
+ printf 'true'
68
+ ;;
69
+ *)
70
+ printf 'false'
71
+ ;;
72
+ esac
73
+ }
74
+
75
+ sanitize_npm_output() {
76
+ printf '%s' "$1" | tr -d "\"'[:space:]"
77
+ }
78
+
42
79
  resolve_branch() {
43
80
  if [ -n "$RELEASE_GIT_BRANCH" ]; then
44
81
  printf '%s' "$RELEASE_GIT_BRANCH"
@@ -56,6 +93,130 @@ resolve_branch() {
56
93
  printf '%s' "$branch"
57
94
  }
58
95
 
96
+ resolve_token_from_dotenv() {
97
+ local token_keys="$1"
98
+ if [ -z "$token_keys" ]; then
99
+ return 0
100
+ fi
101
+
102
+ (
103
+ cd "$PROJECT_ROOT" && TOKEN_KEYS="$token_keys" node --input-type=module -e "
104
+ import dotenv from 'dotenv';
105
+ dotenv.config({ path: '.env' });
106
+ const keys = String(process.env.TOKEN_KEYS || '')
107
+ .split(',')
108
+ .map((item) => item.trim())
109
+ .filter(Boolean);
110
+ for (const key of keys) {
111
+ const value = process.env[key];
112
+ if (value && String(value).trim()) {
113
+ process.stdout.write(String(value).trim());
114
+ process.exit(0);
115
+ }
116
+ }
117
+ " 2>/dev/null || true
118
+ )
119
+ }
120
+
121
+ create_npmrc_for_registry() {
122
+ local registry="$1"
123
+ local token="$2"
124
+ local scope_owner="$3"
125
+ local registry_host=""
126
+ registry_host="$(printf '%s' "$registry" | sed -E 's#^https?://##; s#/*$##')"
127
+
128
+ local npmrc_tmp=""
129
+ npmrc_tmp="$(mktemp /tmp/omnizap-release-npmrc.XXXXXX)"
130
+ {
131
+ printf 'registry=%s\n' "$registry"
132
+ if [ -n "$scope_owner" ]; then
133
+ printf '@%s:registry=%s\n' "$scope_owner" "$registry"
134
+ fi
135
+ if [ -n "$token" ]; then
136
+ printf '//%s/:_authToken=%s\n' "$registry_host" "$token"
137
+ printf '//%s:_authToken=%s\n' "$registry_host" "$token"
138
+ fi
139
+ } > "$npmrc_tmp"
140
+ chmod 600 "$npmrc_tmp"
141
+ TMP_NPMRC_FILES+=("$npmrc_tmp")
142
+ printf '%s' "$npmrc_tmp"
143
+ }
144
+
145
+ verify_registry_version() {
146
+ local pkg_name="$1"
147
+ local pkg_version="$2"
148
+ local registry="$3"
149
+ local token_keys="$4"
150
+ local auth_required="$5"
151
+
152
+ local token=""
153
+ token="$(resolve_token_from_dotenv "$token_keys")"
154
+ if [ "$auth_required" = "1" ] && [ -z "$token" ]; then
155
+ printf '[release] Verificação em %s requer token (keys: %s).\n' "$registry" "$token_keys" >&2
156
+ exit 1
157
+ fi
158
+
159
+ local scope_owner=""
160
+ scope_owner="$(printf '%s' "$pkg_name" | sed -nE 's#^@([^/]+)/.*#\1#p')"
161
+ local npmrc_tmp=""
162
+ npmrc_tmp="$(create_npmrc_for_registry "$registry" "$token" "$scope_owner")"
163
+
164
+ local version_raw=""
165
+ if ! version_raw="$(
166
+ cd "$PROJECT_ROOT" &&
167
+ npm_config_userconfig="$npmrc_tmp" npm view "${pkg_name}@${pkg_version}" version --registry "$registry" --userconfig "$npmrc_tmp" 2>/dev/null
168
+ )"; then
169
+ printf '[release] Falha ao validar versão %s em %s.\n' "$pkg_version" "$registry" >&2
170
+ exit 1
171
+ fi
172
+ local version_value=""
173
+ version_value="$(sanitize_npm_output "$version_raw")"
174
+ if [ "$version_value" != "$pkg_version" ]; then
175
+ printf '[release] Versão divergente em %s: esperado=%s encontrado=%s\n' "$registry" "$pkg_version" "${version_value:-vazio}" >&2
176
+ exit 1
177
+ fi
178
+
179
+ local latest_raw=""
180
+ if ! latest_raw="$(
181
+ cd "$PROJECT_ROOT" &&
182
+ npm_config_userconfig="$npmrc_tmp" npm view "$pkg_name" dist-tags.latest --registry "$registry" --userconfig "$npmrc_tmp" 2>/dev/null
183
+ )"; then
184
+ printf '[release] Falha ao validar dist-tag latest em %s.\n' "$registry" >&2
185
+ exit 1
186
+ fi
187
+ local latest_value=""
188
+ latest_value="$(sanitize_npm_output "$latest_raw")"
189
+ if [ "$latest_value" != "$pkg_version" ]; then
190
+ printf '[release] Dist-tag latest divergente em %s: esperado=%s latest=%s\n' "$registry" "$pkg_version" "${latest_value:-vazio}" >&2
191
+ exit 1
192
+ fi
193
+
194
+ log "Verificado em $registry: versão=$pkg_version latest=$latest_value"
195
+ }
196
+
197
+ compute_target_version() {
198
+ local current="$1"
199
+
200
+ if [ -n "$RELEASE_FORCE_VERSION" ]; then
201
+ printf '%s' "$RELEASE_FORCE_VERSION"
202
+ return 0
203
+ fi
204
+
205
+ if [ "$RELEASE_TYPE" = "patch" ] && [ "$RELEASE_PATCH_ROLLOVER_ENABLED" = "1" ]; then
206
+ if [[ "$RELEASE_PATCH_ROLLOVER_AT" =~ ^[0-9]+$ ]] && [[ "$current" =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
207
+ local major="${BASH_REMATCH[1]}"
208
+ local minor="${BASH_REMATCH[2]}"
209
+ local patch="${BASH_REMATCH[3]}"
210
+ if [ "$patch" -ge "$RELEASE_PATCH_ROLLOVER_AT" ]; then
211
+ printf '%s.%s.0' "$major" "$((minor + 1))"
212
+ return 0
213
+ fi
214
+ fi
215
+ fi
216
+
217
+ printf ''
218
+ }
219
+
59
220
  commit_and_push_if_dirty() {
60
221
  local commit_message="$1"
61
222
 
@@ -100,37 +261,48 @@ if ! (cd "$PROJECT_ROOT" && git rev-parse --is-inside-work-tree >/dev/null 2>&1)
100
261
  exit 1
101
262
  fi
102
263
 
103
- to_bool() {
104
- local value
105
- value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')"
106
- case "$value" in
107
- 1|true|yes|on)
108
- printf 'true'
109
- ;;
110
- *)
111
- printf 'false'
112
- ;;
113
- esac
114
- }
264
+ if [ "$RELEASE_REQUIRE_GITHUB_RELEASE" = "1" ] && [ "$RELEASE_GITHUB_RELEASE" != "1" ]; then
265
+ printf '[release] RELEASE_REQUIRE_GITHUB_RELEASE=1 exige RELEASE_GITHUB_RELEASE=1.\n' >&2
266
+ exit 1
267
+ fi
115
268
 
116
269
  commit_and_push_if_dirty "$RELEASE_GIT_PRE_COMMIT_MESSAGE"
117
270
 
118
271
  current_version="$(cd "$PROJECT_ROOT" && npm pkg get version | tr -d '"[:space:]')"
119
272
  log "Versão atual: $current_version"
120
- log "Aplicando bump: $RELEASE_TYPE"
273
+ target_version="$(compute_target_version "$current_version")"
121
274
 
122
- (cd "$PROJECT_ROOT" && npm version "$RELEASE_TYPE" --no-git-tag-version >/dev/null)
275
+ if [ -n "$target_version" ]; then
276
+ if [ "$target_version" = "$current_version" ]; then
277
+ printf '[release] versão alvo igual à versão atual (%s). Verifique regras de bump.\n' "$current_version" >&2
278
+ exit 1
279
+ fi
280
+ log "Aplicando versão alvo: $target_version"
281
+ (cd "$PROJECT_ROOT" && npm version "$target_version" --no-git-tag-version >/dev/null)
282
+ else
283
+ log "Aplicando bump: $RELEASE_TYPE"
284
+ (cd "$PROJECT_ROOT" && npm version "$RELEASE_TYPE" --no-git-tag-version >/dev/null)
285
+ fi
123
286
 
124
287
  new_version="$(cd "$PROJECT_ROOT" && npm pkg get version | tr -d '"[:space:]')"
125
288
  log "Nova versão: $new_version"
126
289
 
127
290
  log "Executando deploy com publish de package"
291
+ deploy_publish_primary="${DEPLOY_PACKAGE_PUBLISH:-1}"
292
+ deploy_publish_secondary="${DEPLOY_PACKAGE_PUBLISH_SECONDARY:-1}"
293
+
294
+ if [ "$RELEASE_REQUIRE_DUAL_PUBLISH" = "1" ]; then
295
+ if [ "$deploy_publish_primary" != "1" ] || [ "$deploy_publish_secondary" != "1" ]; then
296
+ printf '[release] RELEASE_REQUIRE_DUAL_PUBLISH=1 exige DEPLOY_PACKAGE_PUBLISH=1 e DEPLOY_PACKAGE_PUBLISH_SECONDARY=1.\n' >&2
297
+ exit 1
298
+ fi
299
+ fi
128
300
 
129
301
  if ! (
130
302
  cd "$PROJECT_ROOT"
131
303
  DEPLOY_PACKAGE_STEP="${DEPLOY_PACKAGE_STEP:-1}" \
132
- DEPLOY_PACKAGE_PUBLISH="${DEPLOY_PACKAGE_PUBLISH:-1}" \
133
- DEPLOY_PACKAGE_PUBLISH_SECONDARY="${DEPLOY_PACKAGE_PUBLISH_SECONDARY:-1}" \
304
+ DEPLOY_PACKAGE_PUBLISH="$deploy_publish_primary" \
305
+ DEPLOY_PACKAGE_PUBLISH_SECONDARY="$deploy_publish_secondary" \
134
306
  DEPLOY_PACKAGE_SECONDARY_REGISTRY="${DEPLOY_PACKAGE_SECONDARY_REGISTRY:-https://registry.npmjs.org}" \
135
307
  DEPLOY_PACKAGE_SECONDARY_ACCESS="${DEPLOY_PACKAGE_SECONDARY_ACCESS:-public}" \
136
308
  DEPLOY_PACKAGE_INSTALL="${DEPLOY_PACKAGE_INSTALL:-0}" \
@@ -147,13 +319,14 @@ if [ "$RELEASE_GIT_COMMIT_VERSION" = "1" ]; then
147
319
  commit_and_push_if_dirty "${RELEASE_GIT_VERSION_COMMIT_PREFIX}${new_version}"
148
320
  fi
149
321
 
322
+ release_tag="${RELEASE_GITHUB_TAG_PREFIX}${new_version}"
323
+
150
324
  if [ "$RELEASE_GITHUB_RELEASE" = "1" ]; then
151
325
  if [ "$RELEASE_GIT_AUTO_PUSH" != "1" ]; then
152
326
  printf '[release] RELEASE_GITHUB_RELEASE=1 requer RELEASE_GIT_AUTO_PUSH=1 para garantir commit acessível no GitHub.\n' >&2
153
327
  exit 1
154
328
  fi
155
329
 
156
- local_tag="${RELEASE_GITHUB_TAG_PREFIX}${new_version}"
157
330
  local_name="${RELEASE_GITHUB_NAME_PREFIX}${new_version}"
158
331
  local_target="$RELEASE_GITHUB_TARGET"
159
332
  if [ -z "$local_target" ]; then
@@ -176,10 +349,10 @@ if [ "$RELEASE_GITHUB_RELEASE" = "1" ]; then
176
349
  local draft_bool=""
177
350
  draft_bool="$(to_bool "$RELEASE_GITHUB_DRAFT")"
178
351
 
179
- log "Criando/atualizando GitHub Release ($local_tag)"
352
+ log "Criando/atualizando GitHub Release ($release_tag)"
180
353
  release_output="$(
181
354
  cd "$PROJECT_ROOT" && node ./scripts/github-release-notify.mjs upsert \
182
- --tag "$local_tag" \
355
+ --tag "$release_tag" \
183
356
  --target "$local_target" \
184
357
  --name "$local_name" \
185
358
  --generate-notes "$generate_notes_bool" \
@@ -189,4 +362,28 @@ if [ "$RELEASE_GITHUB_RELEASE" = "1" ]; then
189
362
  log "GitHub Release atualizado: $release_output"
190
363
  fi
191
364
 
365
+ if [ "$RELEASE_VERIFY_UNIFIED_VERSION" = "1" ]; then
366
+ pkg_name="$(cd "$PROJECT_ROOT" && npm pkg get name | tr -d '"[:space:]')"
367
+ if [ -z "$pkg_name" ]; then
368
+ printf '[release] Falha ao ler nome do pacote para verificação final.\n' >&2
369
+ exit 1
370
+ fi
371
+
372
+ local_version_now="$(cd "$PROJECT_ROOT" && npm pkg get version | tr -d '"[:space:]')"
373
+ if [ "$local_version_now" != "$new_version" ]; then
374
+ printf '[release] Versão local divergente após release: esperado=%s encontrado=%s\n' "$new_version" "$local_version_now" >&2
375
+ exit 1
376
+ fi
377
+ log "Verificado localmente: versão=$local_version_now"
378
+
379
+ verify_registry_version "$pkg_name" "$new_version" "$RELEASE_VERIFY_PRIMARY_REGISTRY" "$RELEASE_VERIFY_PRIMARY_TOKEN_KEYS" "1"
380
+ verify_registry_version "$pkg_name" "$new_version" "$RELEASE_VERIFY_SECONDARY_REGISTRY" "$RELEASE_VERIFY_SECONDARY_TOKEN_KEYS" "0"
381
+
382
+ gh_release_check="$(
383
+ cd "$PROJECT_ROOT" && node ./scripts/github-release-notify.mjs get --tag "$release_tag"
384
+ )"
385
+ log "Verificado GitHub Release: $gh_release_check"
386
+ log "Verificação final concluída: todas as versões estão em $new_version"
387
+ fi
388
+
192
389
  log "Release concluída: $new_version"