Cezar brings order to chaotic GitHub backlogs. Sync issues locally, let Claude analyze them, then triage through a clean interactive CLI. 14 built-in actions cover duplicates, priorities, stale issues, security, labeling, and more. Built for maintainers who'd rather ship than sort.
· ██████╗ ███████╗ ███████╗ █████╗ ██████╗ ·
· ██╔════╝ ██╔════╝ ╚══███╔╝ ██╔══██╗ ██╔══██╗ ·
· ██║ █████╗ ███╔╝ ███████║ ██████╔╝ ·
· ██║ ██╔══╝ ███╔╝ ██╔══██║ ██╔══██╗ ·
· ╚██████╗ ███████╗ ███████╗ ██║ ██║ ██║ ██║ ·
· ╚═════╝ ╚══════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ·
AI-powered GitHub issue management
┌──────────────────────────────────────────────────┐
│ 🗂 Cezar your-org/your-repo │
│ 143 open · 45 closed · synced 2 hours ago │
│ Digested: 143/143 │
└──────────────────────────────────────────────────┘
? What would you like to do?
Triage
❯ 🔍 Find Duplicates 45 unanalyzed
🏷️ Auto-Label Issues 32 unanalyzed
❓ Request Missing Info 18 unanalyzed
🔁 Recurring Questions 12 unanalyzed
🧹 Stale Issue Cleanup 9 stale
✅ Done Detector 5 unchecked
Intelligence
📊 Priority Score 45 unscored
🔒 Security Triage 45 unchecked
Community
🌱 Good First Issues 45 unchecked
👋 Welcome New Contributors 3 pending
🙋 Claim Detector 45 unchecked
🔎 Issue Quality Check 45 unchecked
Release
📋 Release Notes
🗺️ Milestone Planner
- Offline-first — issues live in a local JSON store after the initial fetch. No repeated API calls.
- AI-powered digests — Claude generates compact summaries so analysis works on meaning, not keywords.
- Comment-aware — actions see the full conversation, not just the issue body. No more false positives from ignoring follow-up comments.
- Interactive by default — a guided TUI handles everything: setup, sync, analysis, and review.
- Plugin architecture — every analysis action is a self-contained module. Adding a new one means creating a folder.
- Incremental — sync only fetches what changed. Actions only process unanalyzed issues. New comments automatically trigger re-analysis.
- CI-ready — every action works non-interactively with
--no-interactive,--apply, and--dry-runflags.
- Node.js 20+
- A GitHub token (classic or fine-grained with
reporead access) - An Anthropic API key
git clone https://github.com/comerito/cezar.git
cd cezar
npm install
npm run build
npm link# Set your tokens
cp .env.example .env
# Edit .env with your real tokens
# Launch Cezar
cezarThat's it. On first launch Cezar walks you through a setup wizard — enter your org and repo, and it handles the rest: fetching issues, generating AI digests, and dropping you into the interactive hub.
Welcome! Let's connect to your GitHub repo.
? GitHub owner (org or username): your-org
? Repository name: your-repo
? Include closed issues? No
✔ Fetched 143 issues from your-org/your-repo
143 issues stored
✔ Digested 143/143 issues
Categories: 71 bugs · 38 features · 14 docs · 20 others
Setup complete!
From the hub you can sync with GitHub, run any action, and review results — all without leaving the app.
Cezar ships with 14 analysis actions organized into four groups:
| Action | Description | Powered by |
|---|---|---|
| 🔍 Find Duplicates | Detect issues describing the same problem | Claude AI |
| 🏷️ Auto-Label Issues | Suggest and apply labels based on issue content | Claude AI |
| ❓ Request Missing Info | Detect bug reports missing critical info and draft follow-up comments | Claude AI |
| 🔁 Recurring Questions | Find questions already answered in closed issues | Claude AI |
| 🧹 Stale Issue Cleanup | Review and resolve issues with no recent activity | Claude AI |
| ✅ Done Detector | Find open issues likely resolved by merged PRs | Claude AI |
| Action | Description | Powered by |
|---|---|---|
| 📊 Priority Score | Assign critical/high/medium/low based on impact signals | Claude AI |
| 🔒 Security Triage | Scan issues for potential security implications | Claude AI |
| Action | Description | Powered by |
|---|---|---|
| 🌱 Good First Issues | Tag issues suitable for new contributors with hints | Claude AI |
| 👋 Welcome New Contributors | Post personalized welcome comments to first-time contributors | Claude AI |
| 🙋 Claim Detector | Find issues claimed by contributors in comments | Regex patterns |
| 🔎 Issue Quality Check | Flag spam, vague, and low-quality submissions | Claude AI |
| Action | Description | Powered by |
|---|---|---|
| 📋 Release Notes | Generate structured release notes from closed issues | Claude AI |
| 🗺️ Milestone Planner | Group open issues into logical release milestones | Claude AI |
Every action follows the same interactive review pattern: analyze, present results with a summary, then let you review one-by-one (or bulk-accept/skip). If you stop partway through, unreviewed items are saved for the next run.
Cezar operates in three phases, all driven from the interactive hub:
- Fetch — on setup (or when you choose "Sync with GitHub"), Cezar pulls issues from the GitHub API into a local JSON store.
- Digest & Comments — Claude generates a compact summary for each issue (~80 tokens), including category, affected area, and keywords. Comments are fetched and stored for issues that have them.
- Analyze — actions run against the digests and comments. Results are persisted per-batch, so even if interrupted, partial progress is saved. When new comments arrive on a previously analyzed issue, it's automatically queued for re-analysis.
Most issue managers only look at the title and body. Cezar stores and feeds issue comments into action prompts, which eliminates common false positives:
- missing-info won't flag an issue when the author already provided repro steps in a comment
- duplicates respects maintainer comments clarifying "not a duplicate"
- stale recognizes active comment discussions and avoids suggesting closure
- priority uses comment discussion to gauge urgency and affected user count
- security checks comments for CVE references and severity clarifications
- claim-detector reads stored comments directly instead of making per-issue API calls
Comments are fetched incrementally during sync — only issues with new or changed comments trigger API calls.
Choose "Find Duplicates" from the hub. Cezar sends compact digests and recent comments to Claude in batches — with 200 issues, the full knowledge base fits in ~16k tokens.
Each duplicate group is presented for interactive review:
GROUP 1 of 8 ──────────────────────────────────────────
ORIGINAL #12 Login page crashes on Safari iOS
DUPLICATE #89 App broken on iPhone — can't log in
Confidence: 94%
Reason: Both describe Safari iOS login failure; #89 adds no new info.
? What do you want to do with #89?
❯ Mark as duplicate in store only (no GitHub change)
Mark as duplicate + add 'duplicate' label on GitHub
Skip — not a duplicate
Open both in browser to compare
Stop reviewing (keep decisions so far)
Cezar uses cosmiconfig for configuration. Create any of these files in your project root:
.issuemanagerrc.json.issuemanagerrc.yamlissuemanager.config.js
Example .issuemanagerrc.json:
{
"github": {
"owner": "your-org",
"repo": "your-repo"
},
"llm": {
"model": "claude-sonnet-4-20250514",
"maxTokens": 4096
},
"store": {
"path": ".issue-store"
},
"sync": {
"digestBatchSize": 20,
"duplicateBatchSize": 30,
"minDuplicateConfidence": 0.80,
"includeClosed": false
}
}Cezar automatically loads a .env file from the project root. You can also export GITHUB_TOKEN and ANTHROPIC_API_KEY in your shell — environment variables override config file values.
For automated pipelines, Cezar exposes direct commands that bypass the interactive UI:
cezar init -o <owner> -r <repo> # Bootstrap without the wizard
cezar sync # Incremental fetch
cezar run duplicates --no-interactive # Run any action non-interactively
cezar run priority --apply --format json # Apply results + JSON output
cezar run stale --dry-run # Preview without writingSee cezar --help for the full flag reference.
src/
├── index.ts # CLI entry point (Commander setup)
├── commands/ # init, sync, status, run
├── store/
│ ├── store.model.ts # Zod schemas — all types derive from here
│ └── store.ts # IssueStore class — all data access
├── services/
│ ├── github.service.ts # Octokit wrapper
│ ├── llm.service.ts # Anthropic SDK wrapper
│ └── audit.ts # Audit comment formatting
├── actions/
│ ├── action.interface.ts # Plugin contract
│ ├── registry.ts # Plugin registry singleton
│ ├── duplicates/ # Each action is self-contained:
│ ├── auto-label/ # prompt.ts — LLM prompt template
│ ├── missing-info/ # runner.ts — detection logic
│ ├── recurring-questions/ # interactive.ts — review UI
│ ├── stale/ # index.ts — registers the action
│ ├── done-detector/
│ ├── priority/
│ ├── security/
│ ├── good-first-issue/
│ ├── contributor-welcome/
│ ├── claim-detector/
│ ├── quality/
│ ├── release-notes/
│ └── milestone-planner/
├── ui/
│ ├── hub.ts # Interactive menu
│ ├── setup.ts # First-run setup wizard
│ ├── status.ts # Status box renderer
│ └── components/ # Reusable UI primitives
└── utils/ # Config, hashing, chunking, formatting
Each action is a self-contained folder in src/actions/. To create one:
- Create
src/actions/your-action/withprompt.ts,runner.ts,interactive.ts,index.ts - Add your analysis fields to
src/store/store.model.ts - Add a side-effect import to
src/index.ts
See any existing action folder for the full pattern.