OCaml HTML5 parser/serialiser based on Python's JustHTML

Change poe changelog to bullet points with project and change type

Updated changelog format to use bullet points with:
- Project name in bold at the start
- One or two sentence description
- Change type in italics at the end (new feature, bug fix, enhancement, etc.)

Example output:
- **ocaml-zulip**: Fixed encoding bug in channel lookups. *bug fix*
- **poe**: Updated to use Opus 4.5 model. *enhancement*

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

+20 -15
+16 -10
poe/lib/changelog.ml
··· 161 161 in 162 162 163 163 let prompt = Printf.sprintf 164 - {|You are writing a brief changelog update for a Zulip channel about a monorepo. 164 + {|You are writing a changelog update for a Zulip channel about a monorepo. 165 165 166 166 Git commits: 167 167 ··· 173 173 174 174 %s 175 175 176 - Write a concise changelog as natural prose (not bullet points). For each change or group of related changes, mention the relevant sub-project in parentheses. Use @**Name** mentions when authors match channel members. 176 + Write a bullet-point changelog. Each bullet should have the project name first in bold, then a brief description of the change, and the change type in italics at the end. 177 177 178 - Example style: 179 - "Added new model types for Opus 4.5 and 4.1 (ocaml-claudeio) and updated poe to use the latest model. Fixed an encoding bug in channel name lookups (ocaml-zulip) that affected names with spaces." 178 + Format: 179 + - **project-name**: Description of the change. *change type* 180 + 181 + Example: 182 + - **ocaml-claudeio**: Added model types for Opus 4.5 and 4.1. *new feature* 183 + - **ocaml-zulip**: Fixed encoding bug in channel name lookups that affected names with spaces. *bug fix* 184 + - **poe**: Updated to use the latest Opus model for changelog generation. *enhancement* 180 185 181 186 Guidelines: 182 - 1. Group related commits into single sentences 183 - 2. Tag each change with its sub-project in parentheses 184 - 3. Keep it brief - 2-4 sentences total 185 - 4. Focus on user-visible changes; mention internal refactoring only briefly if at all 186 - 5. No bullet points, no emojis - just clear, natural sentences 187 + 1. One bullet per logical change (group related commits) 188 + 2. Project name in bold at the start 189 + 3. One or two sentences describing the change 190 + 4. Change type in italics at the end: *new feature*, *bug fix*, *enhancement*, *refactoring*, etc. 191 + 5. Use @**Name** mentions when authors match channel members 192 + 6. No emojis 187 193 188 - Write ONLY the changelog text, no preamble.|} commits_text subprojects_text members_text 194 + Write ONLY the bullet points, no preamble or header.|} commits_text subprojects_text members_text 189 195 in 190 196 191 197 let response = ask_claude ~sw ~proc ~clock prompt in
+4 -5
poe/lib/changelog.mli
··· 61 61 commits:commit list -> 62 62 members:channel_member list -> 63 63 string option 64 - (** [generate ~sw ~proc ~clock ~commits ~members] generates a narrative 64 + (** [generate ~sw ~proc ~clock ~commits ~members] generates a bullet-point 65 65 changelog using Claude. Returns [None] if commits is empty, or 66 66 [Some changelog] with the generated text. 67 67 68 - The changelog is written as natural prose (not bullet points), with each 69 - change tagged by its sub-project in parentheses. Related changes are 70 - grouped into sentences, and @**Name** mentions are used for authors 71 - matching channel members. *) 68 + Each bullet has the project name in bold, a description of the change, 69 + and the change type in italics (e.g. "new feature", "bug fix"). 70 + Zulip @-mentions are used for authors matching channel members. *)