@kaikybrofc/omnizap-system 2.2.0 → 2.2.1

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
@@ -539,6 +539,10 @@ RELEASE_GIT_BRANCH=
539
539
  RELEASE_GIT_PRE_COMMIT_MESSAGE=chore(release): auto-commit before release
540
540
  RELEASE_GIT_COMMIT_VERSION=1
541
541
  RELEASE_GIT_VERSION_COMMIT_PREFIX=chore(release): v
542
+ # Geração automática de tag da versão no git
543
+ RELEASE_GIT_TAG_CREATE=1
544
+ RELEASE_GIT_TAG_PUSH=1
545
+ RELEASE_GIT_TAG_ANNOTATED=1
542
546
 
543
547
  # Cria/atualiza GitHub Release (aba Releases) automaticamente no npm run release
544
548
  RELEASE_GITHUB_RELEASE=1
@@ -549,6 +553,10 @@ RELEASE_GITHUB_TOKEN=
549
553
  RELEASE_GITHUB_TAG_PREFIX=v
550
554
  RELEASE_GITHUB_NAME_PREFIX=v
551
555
  RELEASE_GITHUB_GENERATE_NOTES=1
556
+ # Inclui seção markdown com arquivos alterados no corpo da release
557
+ RELEASE_GITHUB_RELEASE_INCLUDE_CHANGED_FILES=1
558
+ # Limite de arquivos listados no markdown da release
559
+ RELEASE_GITHUB_RELEASE_MAX_FILES=300
552
560
  # Opcional: 1 para prerelease, 0 para release normal, vazio = auto (detecta '-' na versao)
553
561
  RELEASE_GITHUB_PRERELEASE=
554
562
  RELEASE_GITHUB_DRAFT=0
package/README.md CHANGED
@@ -239,6 +239,9 @@ Variáveis do fluxo de release (git):
239
239
  - `RELEASE_GIT_PRE_COMMIT_MESSAGE` (default: `chore(release): auto-commit before release`)
240
240
  - `RELEASE_GIT_COMMIT_VERSION` (default: `1`) - commita alteração da versão após sucesso
241
241
  - `RELEASE_GIT_VERSION_COMMIT_PREFIX` (default: `chore(release): v`)
242
+ - `RELEASE_GIT_TAG_CREATE` (default: `1`) - cria tag `vX.Y.Z` no release
243
+ - `RELEASE_GIT_TAG_PUSH` (default: `1`) - envia a tag para o remoto
244
+ - `RELEASE_GIT_TAG_ANNOTATED` (default: `1`) - usa tag anotada (`git tag -a`)
242
245
  - `RELEASE_GITHUB_RELEASE` (default: `1`) - cria/atualiza GitHub Release na aba Releases
243
246
  - `RELEASE_REQUIRE_GITHUB_RELEASE` (default: `1`) - falha se GitHub Release estiver desativado
244
247
  - `RELEASE_GITHUB_REPO` (opcional; ex.: `kaikybrofc/omnizap-system`)
@@ -246,6 +249,8 @@ Variáveis do fluxo de release (git):
246
249
  - `RELEASE_GITHUB_TAG_PREFIX` (default: `v`) - prefixo da tag (`v2.1.9`)
247
250
  - `RELEASE_GITHUB_NAME_PREFIX` (default: `v`) - prefixo do nome exibido na release
248
251
  - `RELEASE_GITHUB_GENERATE_NOTES` (default: `1`) - usa notas automáticas do GitHub
252
+ - `RELEASE_GITHUB_RELEASE_INCLUDE_CHANGED_FILES` (default: `1`) - adiciona markdown com arquivos alterados no corpo da release
253
+ - `RELEASE_GITHUB_RELEASE_MAX_FILES` (default: `300`) - limite de arquivos listados no markdown
249
254
  - `RELEASE_GITHUB_PRERELEASE` (default: auto) - vazio detecta `-` na versão como prerelease
250
255
  - `RELEASE_GITHUB_DRAFT` (default: `0`)
251
256
  - `RELEASE_GITHUB_TARGET` (opcional; vazio usa `HEAD`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kaikybrofc/omnizap-system",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "Sistema profissional de automação WhatsApp com tecnologia Baileys",
5
5
  "main": "index.js",
6
6
  "publishConfig": {
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { execSync } from 'node:child_process';
4
+ import fs from 'node:fs';
4
5
  import path from 'node:path';
5
6
  import process from 'node:process';
6
7
  import { fileURLToPath } from 'node:url';
@@ -80,11 +81,22 @@ if (!repoOwner || !repoName) {
80
81
  const tag = getArg('--tag');
81
82
  const target = getArg('--target');
82
83
  const name = getArg('--name', tag);
83
- const body = getArg('--body', '');
84
+ const bodyArg = getArg('--body', '');
85
+ const bodyFile = getArg('--body-file', '');
84
86
  const generateNotes = toBool(getArg('--generate-notes', 'true'), true);
85
87
  const prerelease = toBool(getArg('--prerelease', 'false'), false);
86
88
  const draft = toBool(getArg('--draft', 'false'), false);
87
89
 
90
+ let body = bodyArg;
91
+ if (!body && bodyFile) {
92
+ try {
93
+ body = fs.readFileSync(bodyFile, 'utf8');
94
+ } catch (error) {
95
+ console.error(`Falha ao ler --body-file (${bodyFile}): ${error?.message || error}`);
96
+ process.exit(1);
97
+ }
98
+ }
99
+
88
100
  if (!tag) {
89
101
  console.error('Parâmetro obrigatório ausente: --tag');
90
102
  process.exit(1);
@@ -13,6 +13,9 @@ RELEASE_GIT_BRANCH="${RELEASE_GIT_BRANCH:-}"
13
13
  RELEASE_GIT_PRE_COMMIT_MESSAGE="${RELEASE_GIT_PRE_COMMIT_MESSAGE:-chore(release): auto-commit before release}"
14
14
  RELEASE_GIT_COMMIT_VERSION="${RELEASE_GIT_COMMIT_VERSION:-1}"
15
15
  RELEASE_GIT_VERSION_COMMIT_PREFIX="${RELEASE_GIT_VERSION_COMMIT_PREFIX:-chore(release): v}"
16
+ RELEASE_GIT_TAG_CREATE="${RELEASE_GIT_TAG_CREATE:-1}"
17
+ RELEASE_GIT_TAG_PUSH="${RELEASE_GIT_TAG_PUSH:-1}"
18
+ RELEASE_GIT_TAG_ANNOTATED="${RELEASE_GIT_TAG_ANNOTATED:-1}"
16
19
  RELEASE_GITHUB_RELEASE="${RELEASE_GITHUB_RELEASE:-1}"
17
20
  RELEASE_REQUIRE_GITHUB_RELEASE="${RELEASE_REQUIRE_GITHUB_RELEASE:-1}"
18
21
  RELEASE_GITHUB_TAG_PREFIX="${RELEASE_GITHUB_TAG_PREFIX:-v}"
@@ -21,6 +24,8 @@ RELEASE_GITHUB_GENERATE_NOTES="${RELEASE_GITHUB_GENERATE_NOTES:-1}"
21
24
  RELEASE_GITHUB_PRERELEASE="${RELEASE_GITHUB_PRERELEASE:-}"
22
25
  RELEASE_GITHUB_DRAFT="${RELEASE_GITHUB_DRAFT:-0}"
23
26
  RELEASE_GITHUB_TARGET="${RELEASE_GITHUB_TARGET:-}"
27
+ RELEASE_GITHUB_RELEASE_INCLUDE_CHANGED_FILES="${RELEASE_GITHUB_RELEASE_INCLUDE_CHANGED_FILES:-1}"
28
+ RELEASE_GITHUB_RELEASE_MAX_FILES="${RELEASE_GITHUB_RELEASE_MAX_FILES:-300}"
24
29
  RELEASE_REQUIRE_DUAL_PUBLISH="${RELEASE_REQUIRE_DUAL_PUBLISH:-1}"
25
30
  RELEASE_VERIFY_UNIFIED_VERSION="${RELEASE_VERIFY_UNIFIED_VERSION:-1}"
26
31
  RELEASE_VERIFY_PRIMARY_REGISTRY="${RELEASE_VERIFY_PRIMARY_REGISTRY:-${DEPLOY_PACKAGE_REGISTRY:-https://npm.pkg.github.com}}"
@@ -28,6 +33,7 @@ RELEASE_VERIFY_SECONDARY_REGISTRY="${RELEASE_VERIFY_SECONDARY_REGISTRY:-${DEPLOY
28
33
  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
34
  RELEASE_VERIFY_SECONDARY_TOKEN_KEYS="${RELEASE_VERIFY_SECONDARY_TOKEN_KEYS:-DEPLOY_PACKAGE_SECONDARY_TOKEN,NPM_TOKEN,NODE_AUTH_TOKEN}"
30
35
  TMP_NPMRC_FILES=()
36
+ TMP_MISC_FILES=()
31
37
 
32
38
  case "$RELEASE_TYPE" in
33
39
  patch|minor|major|prepatch|preminor|premajor|prerelease)
@@ -43,14 +49,19 @@ log() {
43
49
  printf '[release] %s\n' "$*"
44
50
  }
45
51
 
46
- cleanup_tmp_npmrcs() {
52
+ cleanup_tmp_files() {
47
53
  for npmrc_tmp in "${TMP_NPMRC_FILES[@]:-}"; do
48
54
  if [ -n "$npmrc_tmp" ] && [ -f "$npmrc_tmp" ]; then
49
55
  rm -f "$npmrc_tmp"
50
56
  fi
51
57
  done
58
+ for tmp_file in "${TMP_MISC_FILES[@]:-}"; do
59
+ if [ -n "$tmp_file" ] && [ -f "$tmp_file" ]; then
60
+ rm -f "$tmp_file"
61
+ fi
62
+ done
52
63
  }
53
- trap cleanup_tmp_npmrcs EXIT
64
+ trap cleanup_tmp_files EXIT
54
65
 
55
66
  require_cmd() {
56
67
  if ! command -v "$1" >/dev/null 2>&1; then
@@ -217,6 +228,119 @@ compute_target_version() {
217
228
  printf ''
218
229
  }
219
230
 
231
+ resolve_previous_release_tag() {
232
+ local current_tag="$1"
233
+ (
234
+ cd "$PROJECT_ROOT" &&
235
+ git tag --list "${RELEASE_GITHUB_TAG_PREFIX}[0-9]*" --sort=-version:refname |
236
+ grep -Fvx "$current_tag" |
237
+ head -n 1
238
+ )
239
+ }
240
+
241
+ build_release_body_file() {
242
+ local current_tag="$1"
243
+ local target_ref="$2"
244
+ local body_file=""
245
+ body_file="$(mktemp /tmp/omnizap-release-body.XXXXXX.md)"
246
+ TMP_MISC_FILES+=("$body_file")
247
+
248
+ local previous_tag=""
249
+ previous_tag="$(resolve_previous_release_tag "$current_tag")"
250
+
251
+ local max_files=300
252
+ if [[ "$RELEASE_GITHUB_RELEASE_MAX_FILES" =~ ^[0-9]+$ ]] && [ "$RELEASE_GITHUB_RELEASE_MAX_FILES" -gt 0 ]; then
253
+ max_files="$RELEASE_GITHUB_RELEASE_MAX_FILES"
254
+ fi
255
+
256
+ local -a changed_files=()
257
+ if [ -n "$previous_tag" ]; then
258
+ mapfile -t changed_files < <(
259
+ cd "$PROJECT_ROOT" &&
260
+ git diff --name-only --diff-filter=ACMRTUXB "${previous_tag}..${target_ref}" |
261
+ sed '/^$/d'
262
+ )
263
+ fi
264
+
265
+ {
266
+ printf '## Arquivos alterados\n\n'
267
+ if [ -n "$previous_tag" ]; then
268
+ printf 'Comparação: `%s...%s`\n\n' "$previous_tag" "$current_tag"
269
+ else
270
+ printf 'Release inicial (sem tag anterior para comparação).\n\n'
271
+ fi
272
+
273
+ if [ "${#changed_files[@]}" -eq 0 ]; then
274
+ printf -- '- Nenhum arquivo alterado detectado.\n'
275
+ else
276
+ local total="${#changed_files[@]}"
277
+ local limit="$total"
278
+ if [ "$total" -gt "$max_files" ]; then
279
+ limit="$max_files"
280
+ fi
281
+
282
+ local i=0
283
+ while [ "$i" -lt "$limit" ]; do
284
+ printf -- '- `%s`\n' "${changed_files[$i]}"
285
+ i=$((i + 1))
286
+ done
287
+
288
+ if [ "$total" -gt "$max_files" ]; then
289
+ printf '\n_...e mais %s arquivo(s)._\n' "$((total - max_files))"
290
+ fi
291
+ fi
292
+ } > "$body_file"
293
+
294
+ printf '%s' "$body_file"
295
+ }
296
+
297
+ ensure_release_tag() {
298
+ local tag_name="$1"
299
+ local target_ref="$2"
300
+
301
+ local local_target_sha=""
302
+ local_target_sha="$(cd "$PROJECT_ROOT" && git rev-parse "${target_ref}^{}")"
303
+
304
+ if (cd "$PROJECT_ROOT" && git rev-parse --verify "refs/tags/${tag_name}" >/dev/null 2>&1); then
305
+ local local_tag_sha=""
306
+ local_tag_sha="$(cd "$PROJECT_ROOT" && git rev-parse "${tag_name}^{}")"
307
+ if [ "$local_tag_sha" != "$local_target_sha" ]; then
308
+ printf '[release] Tag %s já existe e aponta para outro commit (%s).\n' "$tag_name" "$local_tag_sha" >&2
309
+ exit 1
310
+ fi
311
+ log "Tag ${tag_name} já existe localmente."
312
+ else
313
+ if [ "$RELEASE_GIT_TAG_CREATE" != "1" ]; then
314
+ printf '[release] Tag %s não existe e RELEASE_GIT_TAG_CREATE=0.\n' "$tag_name" >&2
315
+ exit 1
316
+ fi
317
+ log "Criando tag ${tag_name}"
318
+ if [ "$RELEASE_GIT_TAG_ANNOTATED" = "1" ]; then
319
+ (cd "$PROJECT_ROOT" && git tag -a "$tag_name" -m "Release ${tag_name}" "$target_ref")
320
+ else
321
+ (cd "$PROJECT_ROOT" && git tag "$tag_name" "$target_ref")
322
+ fi
323
+ fi
324
+
325
+ if [ "$RELEASE_GIT_TAG_PUSH" = "1" ]; then
326
+ local remote_sha=""
327
+ remote_sha="$(cd "$PROJECT_ROOT" && git ls-remote --tags "$RELEASE_GIT_REMOTE" "refs/tags/${tag_name}^{}" | awk 'NR==1{print $1}')"
328
+ if [ -z "$remote_sha" ]; then
329
+ remote_sha="$(cd "$PROJECT_ROOT" && git ls-remote --tags "$RELEASE_GIT_REMOTE" "refs/tags/${tag_name}" | awk 'NR==1{print $1}')"
330
+ fi
331
+
332
+ if [ -z "$remote_sha" ]; then
333
+ log "Enviando tag ${tag_name} para ${RELEASE_GIT_REMOTE}"
334
+ (cd "$PROJECT_ROOT" && git push "$RELEASE_GIT_REMOTE" "refs/tags/${tag_name}")
335
+ elif [ "$remote_sha" != "$local_target_sha" ]; then
336
+ printf '[release] Tag remota %s já existe e aponta para outro commit (%s).\n' "$tag_name" "$remote_sha" >&2
337
+ exit 1
338
+ else
339
+ log "Tag ${tag_name} já existe no remoto ${RELEASE_GIT_REMOTE}."
340
+ fi
341
+ fi
342
+ }
343
+
220
344
  commit_and_push_if_dirty() {
221
345
  local commit_message="$1"
222
346
 
@@ -320,6 +444,14 @@ if [ "$RELEASE_GIT_COMMIT_VERSION" = "1" ]; then
320
444
  fi
321
445
 
322
446
  release_tag="${RELEASE_GITHUB_TAG_PREFIX}${new_version}"
447
+ release_target_ref="$(cd "$PROJECT_ROOT" && git rev-parse HEAD)"
448
+
449
+ if [ -n "$(cd "$PROJECT_ROOT" && git status --porcelain --untracked-files=no)" ]; then
450
+ printf '[release] Working tree com alterações rastreadas antes de criar tag/release. Ajuste RELEASE_GIT_COMMIT_VERSION ou commite manualmente.\n' >&2
451
+ exit 1
452
+ fi
453
+
454
+ ensure_release_tag "$release_tag" "$release_target_ref"
323
455
 
324
456
  if [ "$RELEASE_GITHUB_RELEASE" = "1" ]; then
325
457
  if [ "$RELEASE_GIT_AUTO_PUSH" != "1" ]; then
@@ -330,7 +462,7 @@ if [ "$RELEASE_GITHUB_RELEASE" = "1" ]; then
330
462
  local_name="${RELEASE_GITHUB_NAME_PREFIX}${new_version}"
331
463
  local_target="$RELEASE_GITHUB_TARGET"
332
464
  if [ -z "$local_target" ]; then
333
- local_target="$(cd "$PROJECT_ROOT" && git rev-parse HEAD)"
465
+ local_target="$release_target_ref"
334
466
  fi
335
467
 
336
468
  local_prerelease="$RELEASE_GITHUB_PRERELEASE"
@@ -342,23 +474,40 @@ if [ "$RELEASE_GITHUB_RELEASE" = "1" ]; then
342
474
  fi
343
475
  fi
344
476
 
345
- local generate_notes_bool=""
477
+ generate_notes_bool=""
346
478
  generate_notes_bool="$(to_bool "$RELEASE_GITHUB_GENERATE_NOTES")"
347
- local prerelease_bool=""
479
+ prerelease_bool=""
348
480
  prerelease_bool="$(to_bool "$local_prerelease")"
349
- local draft_bool=""
481
+ draft_bool=""
350
482
  draft_bool="$(to_bool "$RELEASE_GITHUB_DRAFT")"
483
+ release_body_file=""
484
+ if [ "$RELEASE_GITHUB_RELEASE_INCLUDE_CHANGED_FILES" = "1" ]; then
485
+ release_body_file="$(build_release_body_file "$release_tag" "$release_target_ref")"
486
+ fi
351
487
 
352
488
  log "Criando/atualizando GitHub Release ($release_tag)"
353
- release_output="$(
354
- cd "$PROJECT_ROOT" && node ./scripts/github-release-notify.mjs upsert \
355
- --tag "$release_tag" \
356
- --target "$local_target" \
357
- --name "$local_name" \
358
- --generate-notes "$generate_notes_bool" \
359
- --prerelease "$prerelease_bool" \
360
- --draft "$draft_bool"
361
- )"
489
+ if [ -n "$release_body_file" ]; then
490
+ release_output="$(
491
+ cd "$PROJECT_ROOT" && node ./scripts/github-release-notify.mjs upsert \
492
+ --tag "$release_tag" \
493
+ --target "$local_target" \
494
+ --name "$local_name" \
495
+ --body-file "$release_body_file" \
496
+ --generate-notes "$generate_notes_bool" \
497
+ --prerelease "$prerelease_bool" \
498
+ --draft "$draft_bool"
499
+ )"
500
+ else
501
+ release_output="$(
502
+ cd "$PROJECT_ROOT" && node ./scripts/github-release-notify.mjs upsert \
503
+ --tag "$release_tag" \
504
+ --target "$local_target" \
505
+ --name "$local_name" \
506
+ --generate-notes "$generate_notes_bool" \
507
+ --prerelease "$prerelease_bool" \
508
+ --draft "$draft_bool"
509
+ )"
510
+ fi
362
511
  log "GitHub Release atualizado: $release_output"
363
512
  fi
364
513
 
@@ -376,6 +525,33 @@ if [ "$RELEASE_VERIFY_UNIFIED_VERSION" = "1" ]; then
376
525
  fi
377
526
  log "Verificado localmente: versão=$local_version_now"
378
527
 
528
+ tag_commit_now="$(cd "$PROJECT_ROOT" && git rev-parse "${release_tag}^{}" 2>/dev/null || true)"
529
+ if [ -z "$tag_commit_now" ]; then
530
+ printf '[release] Tag local ausente: %s\n' "$release_tag" >&2
531
+ exit 1
532
+ fi
533
+ if [ "$tag_commit_now" != "$release_target_ref" ]; then
534
+ printf '[release] Tag local %s aponta para commit divergente (%s).\n' "$release_tag" "$tag_commit_now" >&2
535
+ exit 1
536
+ fi
537
+ log "Verificada tag local: ${release_tag} -> ${tag_commit_now}"
538
+
539
+ if [ "$RELEASE_GIT_TAG_PUSH" = "1" ]; then
540
+ remote_tag_sha="$(cd "$PROJECT_ROOT" && git ls-remote --tags "$RELEASE_GIT_REMOTE" "refs/tags/${release_tag}^{}" | awk 'NR==1{print $1}')"
541
+ if [ -z "$remote_tag_sha" ]; then
542
+ remote_tag_sha="$(cd "$PROJECT_ROOT" && git ls-remote --tags "$RELEASE_GIT_REMOTE" "refs/tags/${release_tag}" | awk 'NR==1{print $1}')"
543
+ fi
544
+ if [ -z "$remote_tag_sha" ]; then
545
+ printf '[release] Tag remota ausente: %s em %s\n' "$release_tag" "$RELEASE_GIT_REMOTE" >&2
546
+ exit 1
547
+ fi
548
+ if [ "$remote_tag_sha" != "$release_target_ref" ]; then
549
+ printf '[release] Tag remota %s divergente (%s).\n' "$release_tag" "$remote_tag_sha" >&2
550
+ exit 1
551
+ fi
552
+ log "Verificada tag remota: ${release_tag} -> ${remote_tag_sha}"
553
+ fi
554
+
379
555
  verify_registry_version "$pkg_name" "$new_version" "$RELEASE_VERIFY_PRIMARY_REGISTRY" "$RELEASE_VERIFY_PRIMARY_TOKEN_KEYS" "1"
380
556
  verify_registry_version "$pkg_name" "$new_version" "$RELEASE_VERIFY_SECONDARY_REGISTRY" "$RELEASE_VERIFY_SECONDARY_TOKEN_KEYS" "0"
381
557