import commentary from './commentary.ts'
import getSeries from './series.ts'
import { listCommentaries } from './storage.ts'
/**
* Attach short labels to unusually large countable swings already in storage.
* Safe to re-run: existing SHAs keep their current commentary.
*
* @returns Newly written highlights
*
* @example
* import seedHighlights from 'kody:@kentcdodds/lineage/seed-highlights'
*
* const seeded = await seedHighlights()
*/
export default async function seedHighlights() {
const existing = new Set((await listCommentaries()).map((item) => item.sha))
const series = await getSeries({ mode: 'net' })
if (series.points.length === 0) {
return { ok: true, seeded: [], reason: 'no-commits' }
}
const ranked = [...series.points].sort(
(left, right) => Math.abs(right.net) - Math.abs(left.net),
)
const first = series.points[0]
const last = series.points[series.points.length - 1]
const biggestUp = ranked.find((point) => point.net > 0)
const biggestDown = ranked.find((point) => point.net < 0)
const candidates = [
first && {
sha: first.sha,
label: 'First counted commit',
narrative:
'The earliest stored main commit. Cumulative countable lines start here after generated files, lockfiles, and vendor output are excluded.',
},
biggestUp &&
biggestUp.sha !== first.sha && {
sha: biggestUp.sha,
label: 'Largest countable rise',
narrative: `${biggestUp.message} added a net ${biggestUp.net} countable lines after generated-file filters.`,
},
biggestDown && {
sha: biggestDown.sha,
label: 'Largest countable drop',
narrative: `${biggestDown.message} removed a net ${Math.abs(biggestDown.net)} countable lines — usually a deletion or extraction, not a generated-file swing.`,
},
last &&
last.sha !== first.sha && {
sha: last.sha,
label: 'Latest counted commit',
narrative:
'Newest ingested main commit. Future pushes to main should fill the next point automatically via the GitHub webhook.',
},
].filter(Boolean) as Array<{ sha: string; label: string; narrative: string }>
const seeded = []
for (const item of candidates) {
if (existing.has(item.sha)) continue
await commentary(item)
seeded.push(item)
existing.add(item.sha)
}
return { ok: true, seeded }
}