From 2421956ef8badb9a07b4d1e2ebfe542337b6417c Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Mon, 27 Jul 2026 15:19:51 +0300 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=D0=BE=D0=B4=D0=B8=D0=BD=20=D1=82?= =?UTF-8?q?=D0=B5=D0=B3=20=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B4=D1=83?= =?UTF-8?q?=D0=BA=D1=82-=D1=80=D0=B5=D0=BB=D1=96=D0=B7=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BC=D1=96=D1=81=D1=82=D1=8C=20=D0=B7=D0=BE=D0=BE=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=BA=D1=83=20app@/v/owner-v?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitHub-релізи щоразу показували "What's Changed" від дуже старої бази (v0.4.1 / owner-v0.10.0), бо generate_release_notes: true довіряло автовизначенню GitHub, а воно "залипало" на останньому релізному коміті від людини (усі наступні — від github-actions[bot]). Зводимо build-тригер і changelog-якір в один тег на продукт (app@X.Y.Z, owner@X.Y.Z) і рахуємо previous_tag_name явно, версійним сортом у межах тієї самої продуктової сім'ї — новий спільний composite action generate-scoped-release. Updater-канал app переїхав на app-latest (task-latest лишається постійним legacy-аліасом для вже встановлених білдів). --- .cspell.json | 3 + .../generate-scoped-release/action.yml | 72 +++++++++++++++++++ .github/workflows/changelog-release.yml | 18 ++--- .github/workflows/release-owner.yml | 31 +++----- .github/workflows/release.yml | 57 +++++++-------- app/.changes/260727-1511.md | 5 ++ app/src-tauri/tauri.conf.json | 2 +- bun.lock | 14 ++-- owner/.changes/260727-1512.md | 5 ++ package.json | 2 +- 10 files changed, 135 insertions(+), 74 deletions(-) create mode 100644 .github/actions/generate-scoped-release/action.yml create mode 100644 app/.changes/260727-1511.md create mode 100644 owner/.changes/260727-1512.md diff --git a/.cspell.json b/.cspell.json index 682ac11..4b54db7 100644 --- a/.cspell.json +++ b/.cspell.json @@ -76,6 +76,7 @@ "батчі", "бекендову", "білда", + "білдів", "блокерів", "Бриф", "брифі", @@ -183,7 +184,9 @@ "прокинуті", "пропси", "пропсом", + "пуші", "ранів", + "релізні", "релізній", "рендер", "рендериться", diff --git a/.github/actions/generate-scoped-release/action.yml b/.github/actions/generate-scoped-release/action.yml new file mode 100644 index 0000000..c9fe9a9 --- /dev/null +++ b/.github/actions/generate-scoped-release/action.yml @@ -0,0 +1,72 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-action.json + +name: Generate scoped release +description: >- + Створює або перевикористовує GitHub Release під поточним тегом (context.ref), + з release-notes, порахованими явно від попереднього тега тієї самої + продуктової сім'ї (спільний префікс до "@" — app@/owner@), а не + автовизначенням GitHub. Автовизначення "залипає" на найстарішій базі, коли + релізні коміти йдуть від github-actions[bot]: воно не бачить бот-коміти як + "попередній реліз" і щоразу рахує дельту від останнього людського тега. + +inputs: + release-name-prefix: + description: Префікс людської назви релізу (напр. "task" для app, "owner" для owner) + required: true + +outputs: + release-id: + description: ID створеного/перевикористаного GitHub Release + value: ${{ steps.create-release.outputs.result }} + +runs: + using: composite + steps: + - name: Create or reuse release (scoped release-notes) + id: create-release + uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + with: + result-encoding: string + script: | + const tag = context.ref.replace('refs/tags/', ''); + const params = { owner: context.repo.owner, repo: context.repo.repo }; + // Продуктова сім'я — спільний префікс до "@" (app@0.6.11 → "app@"), + // щоб не переплутати з тегами іншого продукту в тому самому репо. + const prefix = tag.includes('@') ? tag.slice(0, tag.indexOf('@') + 1) : tag; + + let release; + try { + release = (await github.rest.repos.getReleaseByTag({ ...params, tag })).data; + } catch { + const compareVersions = (a, b) => { + const pa = a.split('.').map(Number); + const pb = b.split('.').map(Number); + for (let i = 0; i < 3; i++) { + const diff = (pa[i] || 0) - (pb[i] || 0); + if (diff !== 0) return diff; + } + return 0; + }; + + const allTags = await github.paginate(github.rest.repos.listTags, { ...params, per_page: 100 }); + const previousTag = allTags + .map((t) => t.name) + .filter((name) => name.startsWith(prefix) && name !== tag) + .sort((a, b) => compareVersions(b.slice(prefix.length), a.slice(prefix.length)))[0]; + + const notes = (await github.rest.repos.generateReleaseNotes({ + ...params, + tag_name: tag, + ...(previousTag ? { previous_tag_name: previousTag } : {}), + })).data; + + release = (await github.rest.repos.createRelease({ + ...params, + tag_name: tag, + name: `${{ inputs.release-name-prefix }} ${tag}`, + draft: false, + prerelease: false, + body: notes.body, + })).data; + } + return String(release.id); diff --git a/.github/workflows/changelog-release.yml b/.github/workflows/changelog-release.yml index ddda615..b335c15 100644 --- a/.github/workflows/changelog-release.yml +++ b/.github/workflows/changelog-release.yml @@ -2,9 +2,11 @@ # # Автоматичний реліз із change-файлів: merge у main з {app,owner}/.changes/*.md → # `n-cursor release` (бамп version + CHANGELOG.md + коміт "release: app@X, owner@Y" + -# теги app@X/owner@Y) → теги vX / owner-vX → dispatch release.yml / -# release-owner.yml (DMG-артефакти). Пуш тегів робиться GITHUB_TOKEN-ом і не -# тригерить workflows, тому build-workflow викликається явно через workflow_dispatch. +# теги app@X/owner@Y) → dispatch release.yml / release-owner.yml (--ref app@X / +# owner@Y) на DMG-артефакти. Пуш тегів робиться GITHUB_TOKEN-ом і не тригерить +# workflows, тому build-workflow викликається явно через workflow_dispatch. +# Один тег на продукт-реліз (app@X.Y.Z / owner@X.Y.Z) — він же changelog-якір, +# він же build-тригер; окремі vX/owner-vX теги (стара схема) більше не створюються. name: Changelog Release @@ -83,13 +85,11 @@ jobs: TAGS=() if [ -n "$APP_VER" ]; then git tag "app@$APP_VER" 2>/dev/null || true - git tag "v$APP_VER" - TAGS+=("refs/tags/app@$APP_VER" "refs/tags/v$APP_VER") + TAGS+=("refs/tags/app@$APP_VER") fi if [ -n "$OWNER_VER" ]; then git tag "owner@$OWNER_VER" 2>/dev/null || true - git tag "owner-v$OWNER_VER" - TAGS+=("refs/tags/owner@$OWNER_VER" "refs/tags/owner-v$OWNER_VER") + TAGS+=("refs/tags/owner@$OWNER_VER") fi git push origin HEAD:main "${TAGS[@]}" @@ -98,11 +98,11 @@ jobs: env: GH_TOKEN: ${{ github.token }} VER: ${{ steps.rel.outputs.app }} - run: gh workflow run release.yml --ref "v$VER" + run: gh workflow run release.yml --ref "app@$VER" - name: Dispatch DMG release build (owner) if: steps.rel.outputs.owner env: GH_TOKEN: ${{ github.token }} VER: ${{ steps.rel.outputs.owner }} - run: gh workflow run release-owner.yml --ref "owner-v$VER" + run: gh workflow run release-owner.yml --ref "owner@$VER" diff --git a/.github/workflows/release-owner.yml b/.github/workflows/release-owner.yml index 5bb5706..32d5365 100644 --- a/.github/workflows/release-owner.yml +++ b/.github/workflows/release-owner.yml @@ -1,7 +1,7 @@ # yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json # # Реліз owner-застосунку (воркспейс owner/) — аналог release.yml для app. -# Тег owner-vX.Y.Z → GitHub-реліз "owner owner-vX.Y.Z" + підписаний DMG + +# Тег owner@X.Y.Z → GitHub-реліз "owner owner@X.Y.Z" + підписаний DMG + # updater-артефакти (owner має tauri-plugin-updater, useUpdater()). name: Release Owner @@ -9,6 +9,7 @@ name: Release Owner on: push: tags: + - 'owner@*' - 'owner-v*' workflow_dispatch: {} @@ -23,7 +24,7 @@ jobs: permissions: contents: write outputs: - release_id: ${{ steps.create-release.outputs.result }} + release_id: ${{ steps.create-release.outputs.release-id }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: @@ -31,26 +32,9 @@ jobs: - name: Create or reuse release id: create-release - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: ./.github/actions/generate-scoped-release with: - result-encoding: string - script: | - const tag = context.ref.replace('refs/tags/', ''); - const params = { owner: context.repo.owner, repo: context.repo.repo }; - let release; - try { - release = (await github.rest.repos.getReleaseByTag({ ...params, tag })).data; - } catch { - release = (await github.rest.repos.createRelease({ - ...params, - tag_name: tag, - name: `owner ${tag}`, - draft: false, - prerelease: false, - generate_release_notes: true, - })).data; - } - return String(release.id); + release-name-prefix: owner build-desktop: needs: create-release @@ -95,7 +79,8 @@ jobs: - name: Sync owner version from tag run: | - VER="${GITHUB_REF_NAME#owner-v}" + VER="${GITHUB_REF_NAME#owner@}" + VER="${VER#owner-v}" node -e "const fs=require('fs');const f='owner/src-tauri/tauri.conf.json';const c=JSON.parse(fs.readFileSync(f));c.version=process.argv[1];fs.writeFileSync(f,JSON.stringify(c,null,2)+'\n')" "$VER" echo "tauri.conf.json version → $VER" @@ -125,7 +110,7 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} CHANNEL_TITLE: 'owner auto-update channel (службовий, не для людей)' - CHANNEL_NOTES: 'Стабільний тег для plugins.updater.endpoints у owner/src-tauri/tauri.conf.json. Автоматично пересувається кожним owner-v* релізом на свіжий latest.json. Дистрибутив бери з останнього справжнього owner-vX.Y.Z релізу.' + CHANNEL_NOTES: 'Стабільний тег для plugins.updater.endpoints у owner/src-tauri/tauri.conf.json. Автоматично пересувається кожним owner@* релізом на свіжий latest.json. Дистрибутив бери з останнього справжнього owner@X.Y.Z релізу.' run: | TAG="${GITHUB_REF_NAME}" CHANNEL="owner-latest" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9ac55a2..4a011f7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,7 +5,8 @@ name: Release on: push: tags: - - 'v*' + - app@* + - v* workflow_dispatch: {} @@ -19,7 +20,7 @@ jobs: permissions: contents: write outputs: - release_id: ${{ steps.create-release.outputs.result }} + release_id: ${{ steps.create-release.outputs.release-id }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: @@ -27,26 +28,9 @@ jobs: - name: Create or reuse release id: create-release - uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7.1.0 + uses: ./.github/actions/generate-scoped-release with: - result-encoding: string - script: | - const tag = context.ref.replace('refs/tags/', ''); - const params = { owner: context.repo.owner, repo: context.repo.repo }; - let release; - try { - release = (await github.rest.repos.getReleaseByTag({ ...params, tag })).data; - } catch { - release = (await github.rest.repos.createRelease({ - ...params, - tag_name: tag, - name: `task ${tag}`, - draft: false, - prerelease: false, - generate_release_notes: true, - })).data; - } - return String(release.id); + release-name-prefix: task build-desktop: needs: create-release @@ -91,7 +75,8 @@ jobs: - name: Sync app version from tag run: | - VER="${GITHUB_REF_NAME#v}" + VER="${GITHUB_REF_NAME#app@}" + VER="${VER#v}" node -e "const fs=require('fs');const f='app/src-tauri/tauri.conf.json';const c=JSON.parse(fs.readFileSync(f));c.version=process.argv[1];fs.writeFileSync(f,JSON.stringify(c,null,2)+'\n')" "$VER" echo "tauri.conf.json version → $VER" @@ -120,25 +105,31 @@ jobs: # app і owner ділять один репозиторій, тому GitHub-вбудований # /releases/latest/ неоднозначний між продуктами (див. tauri.mdc release — - # той канон писаний під один продукт на репо). task-latest — стабільний + # той канон писаний під один продукт на репо). app-latest — стабільний # службовий тег, який цей крок пересуває на свіжий latest.json щоразу; # updater застосунку task (tauri.conf.json → plugins.updater.endpoints) - # звертається саме сюди, а не в спільний /latest/. - - name: Publish task-latest updater channel + # звертається саме сюди, а не в спільний /latest/. task-latest лишається + # постійним legacy-аліасом (той самий latest.json) для білдів, зібраних + # до переходу на app-latest — endpoint у них уже вшитий і не змінюється + # без перевстановлення. + - name: Publish app-latest / task-latest updater channels env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} CHANNEL_TITLE: 'task auto-update channel (службовий, не для людей)' - CHANNEL_NOTES: 'Стабільний тег для plugins.updater.endpoints у app/src-tauri/tauri.conf.json. Автоматично пересувається кожним v* релізом на свіжий latest.json. Дистрибутив бери з останнього справжнього vX.Y.Z релізу.' + CHANNEL_NOTES: 'Стабільний тег для plugins.updater.endpoints у + app/src-tauri/tauri.conf.json. Автоматично пересувається кожним + app@* релізом на свіжий latest.json. Дистрибутив бери з останнього + справжнього app@X.Y.Z релізу.' run: | TAG="${GITHUB_REF_NAME}" - CHANNEL="task-latest" gh release download "$TAG" --repo "$GITHUB_REPOSITORY" -p latest.json -D /tmp/updater-channel --clobber - if gh release view "$CHANNEL" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then - gh release upload "$CHANNEL" /tmp/updater-channel/latest.json --repo "$GITHUB_REPOSITORY" --clobber - else - gh release create "$CHANNEL" /tmp/updater-channel/latest.json --repo "$GITHUB_REPOSITORY" --title "$CHANNEL_TITLE" --notes "$CHANNEL_NOTES" --prerelease --target main - fi - + for CHANNEL in app-latest task-latest; do + if gh release view "$CHANNEL" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then + gh release upload "$CHANNEL" /tmp/updater-channel/latest.json --repo "$GITHUB_REPOSITORY" --clobber + else + gh release create "$CHANNEL" /tmp/updater-channel/latest.json --repo "$GITHUB_REPOSITORY" --title "$CHANNEL_TITLE" --notes "$CHANNEL_NOTES" --prerelease --target main + fi + done # APK: вимагає ініціалізованого Android-проєкту (app/src-tauri/gen/android), # якого в task ще немає. Після `bun --cwd=app run tauri android init` і коміту # gen/android додай сюди job build-android (ідентичний до mlmail/myshare). diff --git a/app/.changes/260727-1511.md b/app/.changes/260727-1511.md new file mode 100644 index 0000000..6273a38 --- /dev/null +++ b/app/.changes/260727-1511.md @@ -0,0 +1,5 @@ +--- +bump: minor +section: Changed +--- +Реліз-пайплайн: build-тригер і changelog-якір об'єднано в один тег `app@X.Y.Z` (замість окремого `vX.Y.Z`); GitHub-реліз тепер рахує "What's Changed" явно від попереднього тега тієї самої продуктової сім'ї, а не від автовизначення GitHub (яке "залипало" на дуже старій базі). Updater переїхав на канал `app-latest` (`task-latest` лишається постійним legacy-аліасом для вже встановлених білдів). diff --git a/app/src-tauri/tauri.conf.json b/app/src-tauri/tauri.conf.json index 1f44316..582ae2a 100644 --- a/app/src-tauri/tauri.conf.json +++ b/app/src-tauri/tauri.conf.json @@ -37,7 +37,7 @@ "updater": { "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDRGNjE4NzgyQ0E1NENFNjYKUldSbXpsVEtnb2RoVDBSTUViMXl1SXAzNDJyQ0xJMUNIR0F3THdzaEhpc091NjZsNFIrWlhhdGgK", "endpoints": [ - "https://github.com/nitra/task/releases/download/task-latest/latest.json", + "https://github.com/nitra/task/releases/download/app-latest/latest.json", "https://github.com/nitra/task/releases/latest/download/latest.json" ] } diff --git a/bun.lock b/bun.lock index aa4ce0d..c985be7 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,7 @@ "": { "name": "task", "devDependencies": { - "@7n/rules": "^1.45.0", + "@7n/rules": "^1.49.23", "@7n/rules-ci-github": "^1.9.0", "@7n/rules-lang-js": "^0.12.0", "@7n/rules-lang-rust": "^0.7.0", @@ -19,7 +19,7 @@ }, "app": { "name": "app", - "version": "0.6.6", + "version": "0.6.10", "dependencies": { "@7n/tauri-components": "^0.13.9", "@quasar/extras": "^2.0.2", @@ -51,7 +51,7 @@ }, "owner": { "name": "owner", - "version": "0.13.0", + "version": "0.16.2", "dependencies": { "@7n/tauri-components": "^0.12.0", "@quasar/extras": "^2.0.2", @@ -78,11 +78,11 @@ }, }, "packages": { - "@7n/llm-lib": ["@7n/llm-lib@2.8.2", "", { "optionalDependencies": { "@7n/llm-lib-darwin-arm64": "2.8.2", "@7n/llm-lib-linux-x64": "2.8.2" }, "peerDependencies": { "@earendil-works/pi-ai": "~0.80.10", "@earendil-works/pi-coding-agent": "~0.80.10" }, "optionalPeers": ["@earendil-works/pi-ai", "@earendil-works/pi-coding-agent"], "bin": { "n-llm-chains-report": "bin/chains-report.mjs" } }, "sha512-+b23qrvagPNxa4gHjwMWkbsO+smI2puufk35fTpD8tXULnF7mAgiVkxgwXBX4Rh0a9He1SDbgnythO+h3cjm8A=="], + "@7n/llm-lib": ["@7n/llm-lib@2.10.0", "", { "optionalDependencies": { "@7n/llm-lib-darwin-arm64": "2.9.7", "@7n/llm-lib-linux-x64": "2.9.7" }, "peerDependencies": { "@earendil-works/pi-ai": "~0.80.10", "@earendil-works/pi-coding-agent": "~0.80.10" }, "optionalPeers": ["@earendil-works/pi-ai", "@earendil-works/pi-coding-agent"], "bin": { "n-llm-chains-report": "bin/chains-report.mjs" } }, "sha512-szjqKqWLQYsOH1EzCBvqlLkmW/dTluVR33g3BLS/DRpxcW+R2bIG0K6GR5hFWSi/8Hguzd/gZzd/oIB0geA1vw=="], - "@7n/llm-lib-darwin-arm64": ["@7n/llm-lib-darwin-arm64@2.8.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ThZyd+JGfF0673sV4ZqPhJwbf+NvsE+X9oKAIKeDJOWhN1rWNHJZAY/JhFtXTGV0lz63AnN6AeaGaR1ssM+GXg=="], + "@7n/llm-lib-darwin-arm64": ["@7n/llm-lib-darwin-arm64@2.9.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-J2xneopCQ5mRcMbcOpfGXH+MhC4oy1ax76lB1sQKo5gKzQNTEl36DQPiToi9mYLbt+p8FQwhKTL5KDx/1Yt6Lw=="], - "@7n/llm-lib-linux-x64": ["@7n/llm-lib-linux-x64@2.8.2", "", { "os": "linux", "cpu": "x64" }, "sha512-FAdGa0ej33/63KAAWjSI7yYvJTYKbSbWQRXbs2O3K7kFkZuepWUAnYLWyeKE2enJ5WfQthIrRXAB9g4dcPb59w=="], + "@7n/llm-lib-linux-x64": ["@7n/llm-lib-linux-x64@2.9.7", "", { "os": "linux", "cpu": "x64" }, "sha512-qKwUSXXOfZ8SfshDLdQtmPDB5oX5y//AB5BRNgbkNABvTZ5pA5I9yINJoaKmm2qOvErxkeQMZRmYSTbh845Vvg=="], "@7n/mt": ["@7n/mt@0.5.1", "", { "optionalDependencies": { "@7n/mt-darwin-arm64": "0.5.1", "@7n/mt-linux-x64": "0.5.1" }, "bin": { "mt": "bin/mt.js" } }, "sha512-fIP75AODAX6ri+Geznpph0BJR0kkOWeCarSNJCibLCPH3vnfbEvHC9/MgTk3zg9cYIGEFAHd1gkCEnOekexIdg=="], @@ -90,7 +90,7 @@ "@7n/mt-linux-x64": ["@7n/mt-linux-x64@0.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-c4b1c435vfGZcRKkLnWcoKs8O6KTATFFx6gPGnid4ee+JDqzyhtxb5kzxYkcTQySO8iBHPAtUMEOBCHDrF1UjQ=="], - "@7n/rules": ["@7n/rules@1.45.0", "", { "dependencies": { "@7n/llm-lib": "^2.8.2", "@7n/mt": "^0.5.1", "@zed-industries/agent-client-protocol": "^0.4.5", "ajv": "^8.20.0", "cli-progress": "^3.12.0", "github-actionlint": "^1.7.12", "globby": "^16.0.0", "ignore": "^7.0.5", "markdownlint-cli2": "^0.22.1", "oxc-parser": "^0.137.0", "picomatch": "^4.0.4", "smol-toml": "^1.7.0", "v8r": "^6.1.0", "yaml": "^2.9.0", "zod": "^4.4.3" }, "optionalDependencies": { "@agentclientprotocol/claude-agent-acp": "^0.59.0", "@earendil-works/pi-ai": "0.80.10", "@earendil-works/pi-coding-agent": "0.80.10" }, "bin": { "n-rules": "bin/n-rules.js", "n-cursor": "bin/n-rules.js" } }, "sha512-6B+WAQvu4BwYkVa49n2sa7IxQhntQBrgfSGPsWwwY7+E/ciqOennMfwkBq893uInelF2A5RYNynPGWrGrM0RLQ=="], + "@7n/rules": ["@7n/rules@1.51.0", "", { "dependencies": { "@7n/llm-lib": "2.10.0", "@7n/mt": "^0.5.1", "@zed-industries/agent-client-protocol": "^0.4.5", "ajv": "^8.20.0", "cli-progress": "^3.12.0", "github-actionlint": "^1.7.12", "globby": "^16.0.0", "ignore": "^7.0.5", "markdownlint-cli2": "^0.22.1", "oxc-parser": "^0.137.0", "picomatch": "^4.0.4", "smol-toml": "^1.7.0", "v8r": "^6.1.0", "yaml": "^2.9.0", "zod": "^4.4.3" }, "optionalDependencies": { "@agentclientprotocol/claude-agent-acp": "^0.59.0", "@earendil-works/pi-ai": "0.80.10", "@earendil-works/pi-coding-agent": "0.80.10" }, "bin": { "n-rules": "bin/n-rules.js", "n-cursor": "bin/n-rules.js" } }, "sha512-92Soyq9gI6RYlqLsrFin8AM979I3LtHT5cId1H4r6b7wAZQDmlzkd8q9GWXXvgfGGUP7yG3Polt3r7RUMxxqSA=="], "@7n/rules-ci-github": ["@7n/rules-ci-github@1.9.0", "", { "dependencies": { "yaml": "^2.9.0" }, "peerDependencies": { "@7n/rules": ">=1.2.0" } }, "sha512-X/f2qKb1XT/QDryJXgK2L/vzpJY8lsBLUTazK8p3L9M5pyGYYY3edkRnz9WgavrYi0TXVE6pzhZcOZUagvocYA=="], diff --git a/owner/.changes/260727-1512.md b/owner/.changes/260727-1512.md new file mode 100644 index 0000000..10ac2cd --- /dev/null +++ b/owner/.changes/260727-1512.md @@ -0,0 +1,5 @@ +--- +bump: minor +section: Changed +--- +Реліз-пайплайн: build-тригер і changelog-якір об'єднано в один тег `owner@X.Y.Z` (замість окремого `owner-vX.Y.Z`); GitHub-реліз тепер рахує "What's Changed" явно від попереднього тега тієї самої продуктової сім'ї, а не від автовизначення GitHub (яке "залипало" на дуже старій базі `owner-v0.10.0`). diff --git a/package.json b/package.json index 0ac1d5a..8c86403 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "test": "bun run --bun vitest run" }, "devDependencies": { - "@7n/rules": "^1.45.0", + "@7n/rules": "^1.51.0", "@7n/rules-ci-github": "^1.9.0", "@7n/rules-lang-js": "^0.12.0", "@7n/rules-lang-rust": "^0.7.0",