Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
5b6f633
feat(aidd-refine): add conversation improvement skill
alexsoyes Sep 3, 2026
eb95edf
docs(framework): define implementation agent loop
alexsoyes Sep 4, 2026
1d65a5c
Merge remote-tracking branch 'origin/next' into next
alexsoyes Sep 4, 2026
b7d2bed
ci: reuse next mutation gate on promotion
blafourcade Sep 9, 2026
d98164b
test(ci): lock promotion mutation reuse
blafourcade Sep 9, 2026
7d043bb
docs(ci): record promotion mutation reuse
blafourcade Sep 9, 2026
d32204c
fix(ci): bind promotion proof to cli CI
blafourcade Sep 9, 2026
d73f1d1
ci: explain promotion mutation fallback
blafourcade Sep 9, 2026
7571606
docs(ci): record promotion review
blafourcade Sep 9, 2026
d682fd2
ci: back-merge main into next
aidd-bot[bot] Sep 9, 2026
ebd7fe9
fix(telemetry): opencode reads journal.cjs where the build puts it (#…
blafourcade Sep 10, 2026
dd8808b
fix(ci): prove promotion mutation reuse
blafourcade Sep 10, 2026
9294186
fix(ci): scope promotion read access
blafourcade Sep 10, 2026
5a9d4ee
docs(ci): record strict promotion review
blafourcade Sep 10, 2026
676efbb
ci: reuse validated mutation gates on promotion (#810)
blafourcade Sep 10, 2026
42f572c
fix(cli): an interactive restore that ticks nothing restores nothing …
blafourcade Sep 10, 2026
39d3c85
test(cli): kill the surviving mutants of the telemetry context (#815)
blafourcade Sep 10, 2026
dad8527
refactor(cli): drop the MCP exclusion no command could reach (#816)
blafourcade Sep 10, 2026
4146c2c
fix(cli): telemetry off keeps the person's own commit hook executable…
blafourcade Sep 10, 2026
2a77bb2
test(cli): a real opencode session under smoke:real must write a jour…
blafourcade Sep 10, 2026
780e9ee
test(cli): kill the surviving mutants of the copilot, codex and openc…
blafourcade Sep 10, 2026
c628218
refactor(cli): drop the copilot command handler's frontmatter method …
blafourcade Sep 10, 2026
70f9bca
fix(telemetry): a sink record's day comes from the moment it parses t…
blafourcade Sep 10, 2026
69298b2
fix(telemetry): an empty worktree id in the journal reads as not stat…
blafourcade Sep 10, 2026
8c5f820
fix(cli): run unit and integration tests, and every mutant, in a thro…
blafourcade Sep 10, 2026
5e96fde
fix(cli): leave what a project did not install to whoever installed i…
blafourcade Sep 10, 2026
d37cbe9
test(cli): kill the surviving mutants of the kernel and the runtime (…
blafourcade Sep 10, 2026
679ab68
fix(cli): record only the marketplaces a project actually registered …
blafourcade Sep 11, 2026
468a6fd
refactor(cli): name the MCP launch-command transform after what it do…
blafourcade Sep 11, 2026
b630704
docs(vcs): merging a stacked pull request without closing it (#845)
blafourcade Sep 11, 2026
428af92
test(cli): two projects on one HOME installing the same cursor plugin…
blafourcade Sep 11, 2026
7f1a20d
chore(cli): check a file with Biome the moment an agent writes it (#849)
blafourcade Sep 11, 2026
3d132d9
chore(cli): skip the pre-push suite on a tree that already passed it …
blafourcade Sep 11, 2026
e7c2e6c
test(cli): count a mutant as killed only when a test failed (#844)
blafourcade Sep 11, 2026
705193f
test(cli): a real-binary scenario where the person already has the pl…
blafourcade Sep 11, 2026
8da878f
chore(cli): mutate only the lines a branch changed (#848)
blafourcade Sep 11, 2026
e3b10e9
chore(cli): count a test file that fails to load as a failed test in …
blafourcade Sep 11, 2026
c8e03d0
test(cli): raise the tool-profile mutation floors to the scores they …
blafourcade Sep 11, 2026
596967b
test(cli): a canary mutation scope that fails if Stryker stops counti…
blafourcade Sep 11, 2026
126e88d
fix(cli): install git hooks from the repository root only (#861)
blafourcade Sep 11, 2026
1dd99b9
feat(aidd-refine): add interactive improve report
alexsoyes Sep 12, 2026
cae97dd
style(aidd-refine): apply report palette
alexsoyes Sep 12, 2026
30ff24a
ci(deps): bump the github-actions group with 3 updates (#869)
dependabot[bot] Sep 14, 2026
d9ab6ca
Merge remote-tracking branch 'origin/next' into HEAD
alexsoyes Sep 15, 2026
77c167c
Merge pull request #867 from ai-driven-dev/feat/improve-report
alexsoyes Sep 15, 2026
83b0246
docs(telemetry): the README says what 00-init runs and what OpenCode …
blafourcade Sep 16, 2026
61138e0
fix(cli): protect pre-existing user plugins during project clean (#870)
blafourcade Sep 20, 2026
949642d
fix(telemetry): resolve the repository from the host, not from payloa…
dkp-consult Sep 20, 2026
16c7c65
fix(cli): canonicalize architecture comparison paths on Windows (#880)
kevin-lozada-santos Sep 20, 2026
ffad107
fix(aidd-orchestrator): upgrade checkout action (#878)
nightcityblade Sep 20, 2026
c79565b
fix(cli): pin fast-uri to the patched Ajv-compatible v3 range (#830)
BlandineRdl Sep 20, 2026
552eda1
feat(aidd-vcs): recover from scoped commit hook failures (#743)
alexsoyes Sep 20, 2026
1333e32
fix(cli): check names an anchor that belongs to another project (#886)
blafourcade Sep 21, 2026
822f178
feat(framework): refuse an AI edit that breaks a named architecture r…
blafourcade Sep 21, 2026
1e2b76e
chore(framework): the architecture rules are enforced where every too…
blafourcade Sep 21, 2026
8039dd0
chore(deps-dev): bump the npm-dev-dependencies group with 2 updates (…
dependabot[bot] Sep 21, 2026
ddb5989
ci(deps): bump the github-actions group with 3 updates (#903)
dependabot[bot] Sep 21, 2026
244b84a
chore(deps): bump react and @types/react in /kanban (#901)
dependabot[bot] Sep 21, 2026
ac68bed
chore(deps): bump @inquirer/prompts from 8.7.0 to 8.7.2 in /cli (#902)
dependabot[bot] Sep 21, 2026
af66f77
fix(framework): use translate for dev reload (#904)
blafourcade Sep 22, 2026
758010a
fix(aidd-context): document Codex SessionEnd (#905)
blafourcade Sep 23, 2026
c3a3355
feat(cli): add Kilo Code support (#745)
waewoo Sep 23, 2026
cdca8e8
feat(release): credit contributors in release notes (#915)
blafourcade Sep 24, 2026
ca7828d
feat(aidd-qa): create an implementation-independent QA plugin (#917)
blafourcade Sep 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,15 @@
"metadata": {
"recommended": false
}
},
{
"name": "aidd-qa",
"source": "./plugins/aidd-qa",
"description": "Acceptance QA: validates observable behavior against acceptance criteria and records reviewer evidence. Browser is the only supported interface today.",
"strict": true,
"metadata": {
"recommended": false
}
}
]
}
45 changes: 45 additions & 0 deletions .claude/hooks/check-written-file.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/env node
// PostToolUse hook — checks a file an agent just wrote under `cli/` with the same Biome check
// pre-commit runs, so a broken rule comes back in the same turn instead of at the next gate.
//
// Docs: https://code.claude.com/docs/en/hooks#posttooluse
// stdin : JSON { tool_input: { file_path } }
// exit 2: the Biome report on stderr, which Claude Code hands back to the agent
// exit 0: silence — a clean file, one outside `cli/`, or no Biome installed to ask

const { spawnSync } = require("node:child_process");
const { existsSync, lstatSync, readFileSync } = require("node:fs");
const path = require("node:path");

const CLI = path.resolve(__dirname, "..", "..", "cli");
const WINDOWS = process.platform === "win32";
const BIOME = path.join(CLI, "node_modules", ".bin", WINDOWS ? "biome.cmd" : "biome");
const CHECKED = /\.(ts|mts|cts|js|mjs|cjs|json|jsonc)$/;

function writtenFile() {
try {
return JSON.parse(readFileSync(0, "utf8")).tool_input?.file_path ?? "";
} catch {
return "";
}
}

function main() {
const file = writtenFile();
if (file === "" || !CHECKED.test(file) || !existsSync(file) || lstatSync(file).isSymbolicLink()) {
return 0;
}
const relative = path.relative(CLI, path.resolve(file));
if (relative.startsWith("..") || path.isAbsolute(relative)) return 0;
if (relative.split(path.sep).includes("node_modules") || !existsSync(BIOME)) return 0;
const result = spawnSync(BIOME, ["check", "--write", "--no-errors-on-unmatched", "--diagnostic-level=error", relative], {
cwd: CLI,
encoding: "utf8",
shell: WINDOWS,
});
if (result.status === 0) return 0;
process.stderr.write(`${result.stdout}${result.stderr}`);
return 2;
}

process.exitCode = main();
12 changes: 12 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write|MultiEdit",
"hooks": [
{
"type": "command",
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/check-written-file.js\"",
"timeout": 60
}
]
}
]
},
"enabledPlugins": {
Expand Down
1 change: 1 addition & 0 deletions .github/rulesets/main.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
{
"type": "pull_request",
"parameters": {
"allowed_merge_methods": ["merge"],
"required_approving_review_count": 1,
"dismiss_stale_reviews_on_push": false,
"require_code_owner_review": true,
Expand Down
26 changes: 24 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ jobs:
always() &&
github.event_name == 'push' &&
(needs.commitlint.result == 'success' || needs.commitlint.result == 'skipped')
# contents: read for the credit step's checkout.
permissions:
contents: read
outputs:
release_created: ${{ steps.release.outputs.release_created }}
tag_name: ${{ steps.release.outputs.tag_name }}
Expand All @@ -75,11 +78,12 @@ jobs:
# bypass actor. The App token also re-fires the `push: main` and `release: published`
# workflows a GITHUB_TOKEN merge would not. Guarded on prs_created, since
# releases_created only fires on merge.
# `--merge`: main allows only merge commits. `--body ""`: a PR-title body is parsed as a 2nd commit.
- name: Auto-merge the Release PR
if: ${{ steps.release.outputs.prs_created == 'true' }}
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: gh pr merge "${{ fromJSON(steps.release.outputs.pr).number }}" --squash --admin --repo "${{ github.repository }}"
run: gh pr merge "${{ fromJSON(steps.release.outputs.pr).number }}" --merge --admin --body "" --repo "${{ github.repository }}"

# GitHub marks whichever release is created last as "Latest", and release-please
# creates the umbrella and every plugin release in one unordered run — so a plugin
Expand All @@ -91,6 +95,22 @@ jobs:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: gh release edit "${{ steps.release.outputs.tag_name }}" --latest --repo "${{ github.repository }}"

# Credits commit authors; native `include-commit-authors` is broken (release-please#2761).
# Remove with the script once #2892 ships. continue-on-error: never blocks the publish jobs.
- name: Checkout
if: ${{ steps.release.outputs.releases_created == 'true' }}
continue-on-error: true
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Credit contributors on the created release(s)
if: ${{ steps.release.outputs.releases_created == 'true' }}
continue-on-error: true
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
RELEASE_OUTPUTS: ${{ toJSON(steps.release.outputs) }}
run: node scripts/credit-release-authors.cjs "${{ github.repository }}"

build-and-attach:
name: Build and attach marketplace
needs: [release-please]
Expand Down Expand Up @@ -134,7 +154,7 @@ jobs:
contents: write
strategy:
fail-fast: false
# Four marketplace plus five flat — opencode is flat-only. Mirrors the CLI golden
# Four marketplace plus six flat — opencode and kilo are flat-only. Mirrors the CLI golden
# snapshot matrix.
matrix:
include:
Expand All @@ -147,6 +167,7 @@ jobs:
- { tool: copilot, mode: flat }
- { tool: codex, mode: flat }
- { tool: opencode, mode: flat }
- { tool: kilo, mode: flat }
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

Expand Down Expand Up @@ -211,6 +232,7 @@ jobs:
aidd-refine,
aidd-ui,
aidd-telemetry,
aidd-qa,
]
steps:
- name: Check if this plugin was released
Expand Down
155 changes: 142 additions & 13 deletions .github/workflows/cli-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,20 @@ concurrency:
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

permissions:
actions: read
contents: read

jobs:
changes:
name: cli / changes
permissions:
actions: read
contents: read
pull-requests: read
runs-on: ubuntu-latest
outputs:
relevant: ${{ steps.filter.outputs.relevant }}
trusted_promotion: ${{ steps.promotion.outputs.trusted }}
mutation_scopes: ${{ steps.mutation.outputs.scopes }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand Down Expand Up @@ -81,25 +87,120 @@ jobs:

echo "relevant=$relevant" >> "$GITHUB_OUTPUT"

# A promotion branch is a snapshot of next, not the live next branch. Reuse only proves
# a tree already gated on next: every missing Git or API proof falls back to mutations.
- name: Check whether a promotion snapshot or main merge passed next
id: promotion
env:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
EVENT_NAME: ${{ github.event_name }}
GITHUB_REF: ${{ github.ref }}
CURRENT_SHA: ${{ github.sha }}
BASE_REF: ${{ github.event.pull_request.base.ref }}
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_REF: ${{ github.event.pull_request.head.ref }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }}
run: |
set -euo pipefail
trusted=false
reason="not a reusable promotion snapshot"

has_successful_next_gate() {
local run_ids run_id gate
reason="no successful cli CI push run found for the snapshot SHA"
if run_ids="$(gh api --paginate "/repos/$REPO/actions/workflows/cli-ci.yml/runs?branch=next&event=push&status=completed&head_sha=$HEAD_SHA&per_page=100" \
--jq '.workflow_runs[] | select(.conclusion == "success") | .id' 2>/dev/null)"; then
while IFS= read -r run_id; do
[[ -z "$run_id" ]] && continue
if gate="$(gh api "/repos/$REPO/actions/runs/$run_id/jobs?filter=latest&per_page=100" \
--jq 'any(.jobs[]; .name == "cli / gate" and .conclusion == "success")' 2>/dev/null)"; then
if [[ "$gate" == "true" ]]; then
reason="reusing the successful cli CI gate from next run $run_id"
return 0
fi
reason="cli / gate did not pass in next run $run_id"
else
reason="could not inspect cli CI run $run_id"
fi
done <<< "$run_ids"
else
reason="could not list successful cli CI push runs"
fi
return 1
}

# GitHub tests pull requests at a synthetic merge ref. The source gate may be reused
# only if main is already in the snapshot and that merge ref has the same file tree.
if [[ "$EVENT_NAME" == "pull_request" && "$BASE_REF" == "main" && "$HEAD_REF" =~ ^promote/next-to-main-[0-9]+$ && "$HEAD_REPO" == "$REPO" ]]; then
if ! git merge-base --is-ancestor "$BASE_SHA" "$HEAD_SHA" 2>/dev/null; then
reason="main base is not an ancestor of the promotion snapshot"
elif ! snapshot_tree="$(git rev-parse "$HEAD_SHA^{tree}" 2>/dev/null)" || ! merge_tree="$(git rev-parse "$CURRENT_SHA^{tree}" 2>/dev/null)"; then
reason="could not prove the promotion merge tree"
elif [[ "$merge_tree" != "$snapshot_tree" ]]; then
reason="promotion merge tree differs from the snapshot"
elif has_successful_next_gate; then
trusted=true
fi
# A main push is reusable only for the exact merge of a numbered, same-repository
# promotion PR. Parent two is its source snapshot; neither a squash nor an unrelated
# merge can satisfy this proof.
elif [[ "$EVENT_NAME" == "push" && "$GITHUB_REF" == "refs/heads/main" ]]; then
if ! parents="$(git rev-list --parents -n 1 "$CURRENT_SHA" 2>/dev/null)" || ! read -r merge_sha first_parent snapshot_sha extra_parent <<< "$parents" || [[ "$merge_sha" != "$CURRENT_SHA" || -z "$first_parent" || -z "$snapshot_sha" || -n "${extra_parent:-}" ]]; then
reason="main commit is not a two-parent merge"
elif ! snapshot_tree="$(git rev-parse "$snapshot_sha^{tree}" 2>/dev/null)" || ! main_tree="$(git rev-parse "$CURRENT_SHA^{tree}" 2>/dev/null)"; then
reason="could not read the main merge or snapshot tree"
elif [[ "$main_tree" != "$snapshot_tree" ]]; then
reason="main merge tree differs from the promotion snapshot"
elif ! prs="$(gh api "/repos/$REPO/commits/$CURRENT_SHA/pulls" \
--jq '.[] | select(.base.ref == "main" and (.head.ref | test("^promote/next-to-main-[0-9]+$")) and .merged_at != null) | [.base.repo.full_name, .head.repo.full_name, .head.ref, .head.sha, .merged_at, .merge_commit_sha] | @tsv' 2>/dev/null)"; then
reason="could not inspect pull requests associated with the main commit"
else
matching_prs=0
while IFS=$'\t' read -r base_repo head_repo head_ref pr_head_sha merged_at merge_commit_sha; do
if [[ "$base_repo" == "$REPO" && "$head_repo" == "$REPO" && "$head_ref" =~ ^promote/next-to-main-[0-9]+$ && "$pr_head_sha" == "$snapshot_sha" && -n "$merged_at" && "$merge_commit_sha" == "$CURRENT_SHA" ]]; then
((matching_prs += 1))
fi
done <<< "$prs"

if [[ "$matching_prs" -ne 1 ]]; then
reason="no unique matching promotion pull request proved this main merge"
else
HEAD_SHA="$snapshot_sha"
if has_successful_next_gate; then
trusted=true
fi
fi
fi
fi

echo "promotion mutation reuse: $reason"
echo "trusted=$trusted" >> "$GITHUB_OUTPUT"

- name: Decide which mutation scopes a change can move
id: mutation
run: |
set -euo pipefail
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
BASE="${{ github.event.pull_request.base.sha }}"
HEAD="${{ github.event.pull_request.head.sha }}"
else
BASE="${{ github.event.before }}"
HEAD="${{ github.sha }}"
fi
if [[ -z "$BASE" || "$BASE" =~ ^0+$ ]]; then
changed=""
all=true
if [[ "${{ steps.promotion.outputs.trusted }}" == "true" ]]; then
scopes='[]'
else
changed="$(git diff --name-only "$BASE" "$HEAD")"
all=false
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
BASE="${{ github.event.pull_request.base.sha }}"
HEAD="${{ github.event.pull_request.head.sha }}"
else
BASE="${{ github.event.before }}"
HEAD="${{ github.sha }}"
fi
if [[ -z "$BASE" || "$BASE" =~ ^0+$ ]]; then
changed=""
all=true
else
changed="$(git diff --name-only "$BASE" "$HEAD")"
all=false
fi
scopes="$(ALL="$all" CHANGED="$changed" node cli/scripts/mutation-scopes-to-run.mjs)"
fi
scopes="$(ALL="$all" CHANGED="$changed" node cli/scripts/mutation-scopes-to-run.mjs)"
echo "mutation scopes: $scopes"
echo "scopes=$scopes" >> "$GITHUB_OUTPUT"

Expand Down Expand Up @@ -218,6 +319,32 @@ jobs:
# token and no network. `smoke:full` adds the remote-fetch section on demand.
- run: cd cli && pnpm smoke

cli-kilo-runtime:
name: cli / Kilo runtime smoke
needs: [changes]
if: needs.changes.outputs.relevant == 'true'
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install pnpm
run: corepack enable
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: "22"
- name: Cache pnpm store
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/.local/share/pnpm/store
key: pnpm-${{ runner.os }}-${{ hashFiles('cli/pnpm-lock.yaml') }}
restore-keys: pnpm-${{ runner.os }}-
- run: cd cli && pnpm install --frozen-lockfile
# The test starts Kilo's local server and asks it to load the generated project plugin.
# No model or account is needed for this protocol-level smoke.
- name: Install Kilo Code CLI
run: npm install -g @kilocode/cli@7.7.5
- run: cd cli && pnpm test:e2e:kilo

cli-build:
name: cli / Build & Bundle Budget
needs: [changes]
Expand Down Expand Up @@ -490,6 +617,7 @@ jobs:
- cli-architecture
- cli-coverage
- cli-smoke
- cli-kilo-runtime
- cli-build
- cli-knip
- identifier-join
Expand All @@ -510,6 +638,7 @@ jobs:
"${{ needs.cli-architecture.result }}" \
"${{ needs.cli-coverage.result }}" \
"${{ needs.cli-smoke.result }}" \
"${{ needs.cli-kilo-runtime.result }}" \
"${{ needs.cli-build.result }}" \
"${{ needs.cli-knip.result }}" \
"${{ needs.identifier-join.result }}" \
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@ jobs:
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Initialize CodeQL
uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
uses: github/codeql-action/init@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
with:
languages: ${{ matrix.language }}
queries: security-and-quality

- name: Autobuild
uses: github/codeql-action/autobuild@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
uses: github/codeql-action/autobuild@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
uses: github/codeql-action/analyze@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
with:
category: "/language:${{ matrix.language }}"
3 changes: 2 additions & 1 deletion .github/workflows/promote.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,9 @@ jobs:

# `ci:` on purpose: the type is absent from release-please's changelog-sections,
# so this plumbing commit never surfaces in a changelog, and commitlint accepts it.
# `--body ""`: keeps the PR title out of the merge body, which release-please would re-parse.
gh pr merge "$PR" --repo "$REPO" --merge --auto --delete-branch \
--subject "ci: promote next to main (#${PR})"
--subject "ci: promote next to main (#${PR})" --body ""

# Without a recorded subject GitHub generates one that is not conventional, and
# commitlint lints main's tip on push.
Expand Down
Loading
Loading