New Feature·Pushed May 1, 2026·L
Gitpulse now runs gitsky's full PR-analysis pipeline on commits
Gitpulse just got significantly smarter. A commit to the repository lifts the entire PR-analysis pipeline from sister project gitsky — adding structured category scoring, editorial headlines, technical descriptions, and support for both OpenAI and Anthropic API protocols.
Gitpulse can now produce far richer output when analyzing commits. The analysis pipeline from sister project gitsky has been lifted wholesale into gitpulse, bringing 12 standardized PR categories (feature, bugfix, refactor, and more), each scored by relative importance. Every analyzed commit now gets a TechCrunch-style headline, a standfirst hook, a full story, a digest sentence for email, and a technical description suitable for engineering leads and PMs.
The system prompt and per-section user instructions came over verbatim from gitsky, meaning the writing style guidance (passive voice, no AI-speak, concrete benefits over mechanisms) now applies to commit analysis too. Code references in the output are post-processed into a custom [[code]] tagging format. The site components were updated to surface the new fields — category badges on story cards, collapsible technical descriptions on story detail pages, and category scores displayed alongside each classification.
Two AI protocols are now supported. The default is 'openai' using ChatOpenAI, but 'anthropic' switches to ChatAnthropic for Claude or MiniMax's Anthropic-compatible endpoint. When the model name starts with "minimax", the system strips min/max constraints from the JSON schema (MiniMax rejects those in tool-calling) and forces functionCalling mode to bypass the model's reasoning prefix that would otherwise break JSON-mode parsing.
The temperature default was lowered from 0.7 to 0, matching gitsky's production setting for more deterministic output.
Technical description
This commit lifts the PR-analysis pipeline from gitsky into gitpulse, enabling structured AI analysis of commits with categories, scores, and editorial output.
**Core changes — AI layer**
The [[code ref=4]]createSummarizer[[/code]] function in [[code]]action/src/llm.ts[[/code]] now speaks two protocols. Setting [[code]]protocol: 'openai'[[/code]] (the default) uses [[code]]ChatOpenAI[[/code]] with an optional [[code]]baseURL[[/code]] for OpenRouter, Groq, Together, and similar. Setting [[code]]protocol: 'anthropic'[[/code]] switches to [[code]]ChatAnthropic[[/code]] with [[code]]anthropicApiUrl[[/code]] — this works for Claude directly or for MiniMax via its Anthropic-compatible endpoint. When the model name starts with "minimax", [[code]]stripJsonSchemaConstraints[[/code]] is called to remove min/max constraints from the tool-calling schema, and [[code]]method[[/code]] is forced to [[code]]'functionCalling'[[/code]] — necessary because MiniMax's [[code)]][[/code]] reasoning prefix poisons JSON-mode parsing.
The full system prompt (TechCrunch journalist persona, writing style rules) and per-section user instructions were copied verbatim from [[code]]gitsky/src/services/pr-analysis/nodes/changes.ts[[/code]]. The [[code ref=1]]PR_CATEGORIES[[/code]] map (12 keys with display names) and [[code ref=2]]ChangesNodeOutputSchema[[/code]] (categories, headline, standfirst, story, digestSentence, codeReferences, hasFactCheckIssues, factCheckIssues, technicalDescription, imageDirection) were likewise lifted from gitsky.
**Context building**
[[code ref=5]]fetchFileChanges[[/code]] in [[code]]action/src/commit-context.ts[[/code]] runs three git commands per commit: [[code]]--numstat[[/code]] for additions/deletions, [[code]]--name-status[[/code]] for file statuses, and [[code]]git show[[/code]] per file for the diff patch. Patches are truncated at 10 KB per file and 50 KB total to keep prompt sizes manageable. [[code]]formatCommitAsPRContext[[/code]] then formats the commit into the same shape gitsky uses for PR data, so the existing prompt instructions work without modification.
**Story building**
[[code ref=8]]buildStoryFromCommit[[/code]] in [[code]]action/src/render.ts[[/code]] now takes the full [[code]]ChangesNodeOutput[[/code]] and maps every field onto the [[code ref=7]]Story[[/code]] type. [[code ref=9]]fetchFileChanges[[/code]] is called in the main loop per commit, and the resulting category is logged after each successful run.
**Site rendering**
[[code]]site/src/lib/stories.ts[[/code]] adds [[code ref=11]]primaryCategory[[/code]] helpers and display-name lookups. [[code ref=12]]StoryCard[[/code]] shows a category badge and commit/PR ref in the byline. The story detail page at [[code]]site/src/app/stories/[id]/page.tsx[[/code]] renders the category, story body, technical description (collapsed behind a toggle by default), and all category scores.
**Workflow updates**
[[code ref=10]]ai-protocol[[/code]] is a new workflow input on [[code]].github/workflows/analyze.yml[[/code]]. [[code]]ai-temperature[[/code]] default dropped from 0.7 to 0. [[code]].github/workflows/self-deploy.yml[[/code]] now explicitly sets protocol=openai, base-url=https://api.minimax.io/v1, model=MiniMax-M2.7, temperature=0.
**Files at a Glance**
- [[code]]action/src/categories.ts[[/code]] — 12 PR category keys and display names
- [[code]]action/src/schemas.ts[[/code]] — ChangesNodeOutput Zod schema
- [[code]]action/src/strip-schema.ts[[/code]] — removes min/max from JSON schemas for MiniMax compatibility
- [[code]]action/src/commit-context.ts[[/code]] — fetches file diffs and formats commit as PR context
- [[code]]action/src/llm.ts[[/code]] — dual-protocol LLM wrapper, full prompt text
- [[code]]action/src/config.ts[[/code]] — protocol field added to RuntimeConfig
- [[code]]action/src/types.ts[[/code]] — Story and CommitRecord types extended
- [[code]]action/src/render.ts[[/code]] — buildStoryFromCommit updated for full output mapping
- [[code]]action/src/index.ts[[/code]] — calls fetchFileChanges, logs category
- [[code]].github/workflows/analyze.yml[[/code]] — new ai-protocol input, temperature default 0
- [[code]].github/workflows/self-deploy.yml[[/code]] — explicit protocol/base-url/model/temperature
- [[code]]site/src/lib/stories.ts[[/code]] — primaryCategory helper and category display names
- [[code]]site/src/components/StoryCard.tsx[[/code]] — category badge and ref in byline
- [[code]]site/src/app/stories/[id]/page.tsx[[/code]] — full story with technical description and category scores
Categories
- New Feature (65%) — Gitpulse now produces structured AI analysis with categories, scores, headlines, standfirsts, and technical descriptions — a significant enrichment of the output format
- Maintenance (25%) — Code was lifted verbatim from gitsky (PR_CATEGORIES, ChangesNodeOutputSchema, stripJsonSchemaConstraints, prompts); this is deliberate reuse across projects
- Configuration (10%) — analyze.yml gained a new ai-protocol input; ai-temperature default changed from 0.7 to 0; self-deploy.yml updated to pass explicit protocol and temperature values