Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@
sections with at least one bullet each: `Release highlights:`, `Release details:`, and
`Verification:`. Highlights state user outcomes, details group the meaningful work by product
area, and verification names the gates actually run. Never reduce a release to a generic subject
line or raw commit list.
line or raw commit list. Keep commit body lines within Commitlint's 100-character limit. When a
release bullet wraps, indent every continuation line by at least two spaces; the release notes
generator joins those lines into one complete public bullet.

## Code conventions

Expand Down
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ Every commit promoted to `main` that can trigger semantic-release must include t
sections with at least one bullet each: `Release highlights:`, `Release details:`, and
`Verification:`. Highlights state user outcomes, details group meaningful work by product area,
and verification names the gates actually run. Never reduce a release to a generic subject line or
raw commit list.
raw commit list. Keep commit body lines within Commitlint's 100-character limit. When a release
bullet wraps, indent every continuation line by at least two spaces; the release notes generator
joins those lines into one complete public bullet.

## Boundaries

Expand Down
11 changes: 10 additions & 1 deletion scripts/semantic-release-notes.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,16 @@ function parseSections(message) {
activeSection = SECTION_LABELS[label]
continue
}
if (activeSection && /^-\s+\S/u.test(line)) sections[activeSection].push(line.trim())
if (!activeSection) continue
if (/^-\s+\S/u.test(line)) {
sections[activeSection].push(line.trim())
continue
}
if (/^\s{2,}\S/u.test(line)) {
const entries = sections[activeSection]
const entryIndex = entries.length - 1
if (entryIndex >= 0) entries[entryIndex] = `${entries[entryIndex]} ${line.trim()}`
}
}

return Object.values(sections).every((entries) => entries.length > 0) ? sections : null
Expand Down
14 changes: 12 additions & 2 deletions scripts/semantic-release-smoke.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,13 @@ Release highlights:
- make the public documentation easier to scan without losing technical depth

Release details:
- **Documentation:** shorten every README and link advanced behavior to focused guides
- **Documentation:** shorten every README and link advanced behavior to
focused guides without losing the complete public context
- **Landing:** replace the repeated hero copy with one clear product statement

Verification:
- pass the complete pnpm validate release gate`,
- pass the complete pnpm validate release gate and preserve wrapped
verification evidence`,
},
],
lastRelease: { gitTag: "v0.0.0" },
Expand All @@ -65,6 +67,14 @@ for (const expectedHeading of [
}
assert.match(generatedNotes, /Documentation/u)
assert.match(generatedNotes, /Landing/u)
assert.match(
generatedNotes,
/link advanced behavior to focused guides without losing the complete public context/u,
)
assert.match(
generatedNotes,
/pass the complete pnpm validate release gate and preserve wrapped verification evidence/u,
)
assert.throws(
() => verifyRelease({}, { commits: [{ message: "fix(core): terse release" }] }),
/Release commits must contain/u,
Expand Down