OCaml HTML5 parser/serialiser based on Python's JustHTML

Use natural prose for poe changelog, tag sub-projects per change

Changed changelog generation to output natural sentences instead of
bullet points with emojis. Each change now includes its sub-project
in parentheses, making it clear which part of the monorepo was affected.
Related commits are grouped into single sentences for readability.

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

+15 -25
+10 -19
poe/lib/changelog.ml
··· 161 161 in 162 162 163 163 let prompt = Printf.sprintf 164 - {|You are writing a structured changelog update for a Zulip channel about a monorepo. 164 + {|You are writing a brief 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 changelog update in this format: 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. 177 177 178 - **Sub-projects:** [list the affected sub-projects from above] 179 - 180 - **Changes:** 181 - - [emoji] **Category**: Brief description (@**Author** if they match a channel member) 182 - 183 - Use these categories and emojis: 184 - - ✨ **New Feature**: for new functionality 185 - - 🐛 **Bug Fix**: for bug fixes 186 - - 🔧 **Enhancement**: for improvements to existing features 187 - - 📚 **Documentation**: for docs changes 188 - - 🔨 **Refactoring**: for internal code changes 189 - - ⬆️ **Dependencies**: for dependency updates 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." 190 180 191 181 Guidelines: 192 - 1. Group related commits under a single bullet point when they're part of the same change 193 - 2. Focus on user-visible changes; combine pure refactoring into one line if needed 194 - 3. Keep descriptions concise (one line each) 195 - 4. Only include 3-6 bullet points maximum 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 196 187 197 - Write ONLY the formatted changelog, no preamble.|} commits_text subprojects_text members_text 188 + Write ONLY the changelog text, no preamble.|} commits_text subprojects_text members_text 198 189 in 199 190 200 191 let response = ask_claude ~sw ~proc ~clock prompt in
+5 -6
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 structured 64 + (** [generate ~sw ~proc ~clock ~commits ~members] generates a narrative 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 includes: 69 - - List of affected sub-projects (based on file paths) 70 - - Categorized changes with emojis (New Feature, Bug Fix, Enhancement, etc.) 71 - - @**Name** mentions for authors matching channel members 72 - - Concise descriptions grouped by related changes *) 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. *)