From centy
This skill should be used when the user asks to "compact issues", "consolidate issues", "merge issues into an epic", "roll up related issues", or wants to group completed issues under a feature item and soft-delete the ones that are done.
How this skill is triggered — by the user, by Claude, or both
Slash command
/centy:compactThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Consolidate a set of related issues that share a feature domain into a single feature item (epic), then soft-delete the issues that have already been completed. Use this skill whenever the user asks to compact, consolidate, merge, or roll up a group of related issues.
Consolidate a set of related issues that share a feature domain into a single feature item (epic), then soft-delete the issues that have already been completed. Use this skill whenever the user asks to compact, consolidate, merge, or roll up a group of related issues.
When called with no arguments, the skill discovers which issues to compact on its own — it never asks the user to provide a list.
Ensure the daemon is running and the project is initialized. Resolve project_path from the current working directory or ask the user if ambiguous.
Launch a sub-agent whose sole job is to research and synthesize — it must not write anything. Hand it:
project_pathSub-agent prompt template:
You are performing the research phase of a "compact" workflow.
Do NOT create, update, or delete any items — read only.
project_path: <project_path>
Issues to research: <id or display number list, or "discover" if none given>
Steps:
0. DISCOVER ISSUES (only when "Issues to research" is "discover")
List ALL issues in the project (item_type: "issues").
From that full list, select candidates for compacting:
- Prefer issues that are "closed", "done", or "resolved" — these are prime
candidates to be rolled up and soft-deleted.
- Also include any open/in-progress issues that clearly belong to the same
feature domain as the closed ones.
- Exclude issues that already have a parent link to an existing feature item
(they were already compacted).
- Group the candidates into one or more feature clusters based on subject
matter. Each cluster will become one report. If there are multiple distinct
clusters, return a separate REPORT block for each.
- If no candidates are found, return a single report with
issues: [] and a warning explaining why.
1. READ EVERY ISSUE
Fetch the full content and existing links for each issue in the cluster.
If a display number was given instead of a UUID, resolve it to a UUID first.
Classify each issue:
- Done → status is "closed", "done", or "resolved"
- Active → status is "open", "in-progress", or any other non-terminal status
2. INFER THE FEATURE DOMAIN
From the collected issues, synthesize:
- feature_name Short, precise title (≤ 80 chars)
- feature_summary 2–4 sentences: what the feature does, why it exists
- done_items Bullet list of completed work (from Done issues)
- pending_items Bullet list of remaining work (from Active issues)
- implementation_notes Cross-cutting design decisions, constraints, gotchas
- tags Deduplicated union of all tags across every issue
- highest_priority Numerically highest priority value seen across all issues
3. DISCOVER THE FEATURE ITEM TYPE
List the available item types for this project.
Pick the first available type from: epics → features → stories → issues.
feature_type will always be set — there is always an "issues" fallback.
4. CHECK FOR AN EXISTING FEATURE ITEM
a. Search for a feature item whose title matches key terms from feature_name.
b. Inspect the links from step 1 — follow any "child" or "parent" link to find
a candidate feature item and read its content.
Decision:
- If a candidate's domain clearly matches → set existing_feature_id to its ID
and existing_feature_title to its title
- If a candidate exists but domain clearly differs → set existing_feature_id
to null and note the mismatch as a warning
- If no candidate found → set existing_feature_id to null
Return one REPORT block per feature cluster. Each block must contain ALL of the
following fields — no fields omitted:
REPORT:
feature_type: <"epics" | "features" | "stories" | "issues">
feature_name: <string>
feature_summary: <string>
done_items: [<string>, …]
pending_items: [<string>, …]
implementation_notes: <string>
tags: [<string>, …]
highest_priority: <int>
existing_feature_id: <UUID | null>
existing_feature_title: <string | null>
issues:
- id: <UUID>
display_number: <N>
title: <string>
classification: <"done" | "active">
already_linked_to_feature: <bool>
warnings: [<string>, …] # not-found issues, domain mismatches, etc.
Wait for the agent to return its report(s) before continuing.
Run steps 5–8 independently for every REPORT block the sub-agent returned.
Use the report to build the feature body using the template below, then:
existing_feature_id is set — update that item with the synthesized content, and refine the title only if it clearly improves on the existing one.existing_feature_id is null — create a new item of feature_type.Set status to "in-progress" if any Active issues remain, or "closed" if all issues are Done.
Feature body template:
## Overview
<feature_summary>
## Done
- <done_items…>
## Pending
- <pending_items…>
## Implementation notes
<implementation_notes>
Omit ## Done if done_items is empty. Omit ## Pending if pending_items is empty.
For each Active issue that isn't already linked to the feature item, create a "child" link from the feature item to the issue.
For each Done issue, soft-delete it (force: false). This sets deleted_at without removing the file — the issue is hidden from normal queries but remains recoverable. Never soft-delete Active issues.
Feature item: #<display_number> — <title> [created | updated]
Linked (active): #N1 <title>, #N2 <title>, …
Soft-deleted (done): #N3 <title>, #N4 <title>, …
If multiple clusters were processed, print one block per cluster. Surface any warnings the agent returned.
| Situation | Handling |
|---|---|
| No input given | Auto-discover all issues eligible for compact in the project (step 0) |
| No eligible issues found | Report to user and stop — nothing to do |
| All issues are already closed | Feature status → "closed"; soft-delete all |
| All issues are open | Feature status → "in-progress"; link all, delete none |
| An issue is not found | Agent records a warning; skip it, continue with the rest |
| Issue already linked to a different feature item | Note the conflict; link to the new feature anyway unless user says otherwise |
feature_type is null | Cannot happen — "issues" is always the final fallback |
| Multiple distinct feature clusters discovered | Run steps 5–8 once per cluster |
| User provides mixed project paths | Group issues by project; run the full workflow per project |
npx claudepluginhub centy-io/centy-daemon --plugin centyRefines existing board items: re-prioritizes, reclassifies, re-scopes, archives stale items, decomposes oversized issues, merges duplicates, and refreshes dependencies.
Clusters GitHub issue backlogs by root cause into plan-master issues, redirects children, and bundles architectural-fix PRs that close clusters atomically. Use for triage, consolidation, deduplication, or roadmap planning.
Syncs session work into GitHub issues and queries track status across repos. Two modes: write (end-of-session sync with issue updates, epics, labels, Project placement) and read (status lookup).