Grounded, explainable Jira story-point estimates — learned from your team’s own resolved tickets.
Estimate Jira tickets from your team’s actual history. The plugin pulls resolved tickets via the Atlassian MCP to build a baseline dataset, then uses it to suggest effort / story-point estimates for new work by comparing it to similar past tickets.
# register the marketplace, then install the plugin
claude plugin marketplace add vslipchenko/ai
claude plugin install estimator@vslipchenkoThen restart Claude Code. The plugin needs the Atlassian
(Jira) MCP connected (run /mcp to check).
Repository: https://github.com/vslipchenko/ai/plugins/estimator.
| Invoke | What it does |
|---|---|
sync |
Build / refresh the history dataset from resolved, estimated Jira tickets. |
estimate |
Suggest story points for a ticket from similar past work, then record the outcome. |
add |
Add specific tickets by key (one or many) to the history. |
find |
Look up stored records by key. |
edit |
Correct fields of, or delete, stored records. |
export / import |
Back up the dataset / load an existing one (merge or replace). |
/estimator:prune |
Scan for and delete broken records (after confirmation). |
/estimator:reset |
Delete the stored dataset. |
Skills (sync, estimate, add,
find, edit, export,
import) respond to natural language; prune and
reset are slash commands.
Run the sync skill to build your estimation baseline —
and re-run it any time to top up new or missing tickets:
Re-running sync lets you refresh
(overwrite) or append (fetch only tickets updated since
the last run, merged in).
Once you have a baseline, ask Claude to estimate a ticket —
e.g. “estimate ABC-7777”, “how many points is this
ticket?” with a Jira link, or just “estimate 7777” (the
project key is taken from your sync config). The
estimate skill:
final; if you skip, the
suggestion is recorded as suggested.history.csv (prompting before
overwriting an existing row), so the dataset grows as you estimate.On the first estimate run, the skill asks (once) for
your preferred point scale (Fibonacci, linear, powers
of two, or a custom scale) and optional min/max limits,
caching them in config.json. Later runs reuse them to keep
suggestions on your scale and within range; the value your team actually
settles on is always recorded as-is. To change them, edit
config.json.
Each row records where its estimate came from in the
estimate_basis column: actual (resolved ticket
from sync), final (your team’s agreed value),
or suggested (the skill’s own suggestion). Estimation
trusts actual over final over
suggested, so the tool never treats its own guesses as
ground truth. When an estimated ticket is later resolved, re-running
sync replaces its row with the real outcome.
Already ran /sync but missing a few tickets? Ask Claude
to “add ABC-7777 to history” (or several keys / bare numbers).
The add skill fetches each ticket from Jira and appends it
as a new record — capturing real story_points,
time_spent, and resolution (so resolved tickets are
recorded as actual, open-but-estimated ones as
final). It only adds tickets that have a key, summary, and
story points, prompts before overriding an existing record, and reports
anything skipped. Field-level edits are handled by the edit skill.
Ask Claude to look up records by key — e.g. “find ABC-7777 in
history”, “show the record for 7777” (bare numbers expand
via your sync project key), or “look up ABC-1,
ABC-2”. The find skill prints each matched record’s
fields and its row number in history.csv
(for manual reference), and lists any keys it couldn’t find.
Need to correct or remove a stored record? Ask Claude to “fix the
story points on ABC-7777”, “edit ABC-1”, or “delete
ABC-2, ABC-3 from history” (bare numbers expand via your
sync project key). The edit skill:
key.estimate (or add) for that.Run /estimator:prune to tidy the dataset. It takes no
arguments and scans all of history.csv:
estimate_basis or missing issue type) so you can repair
them with the edit skill; flagged rows are never
deleted.Already have a history CSV — from /estimator:export,
another machine, or a teammate? Ask Claude to “import my history
from <path>”. The import skill
reads the file and either merges it into your dataset
(dedup by key, imported wins) or replaces it (with
explicit confirmation). It maps columns by their header tokens —
tolerant of reordered columns and legacy 12-column files — derives your
project_keys, and reports what changed. It’s the
counterpart to export, and lets you start from an existing
dataset without running /sync.
The dataset lives in a per-user folder in your home directory:
~/.estimator/ (a normal home dotfolder, like ~/.aws)
├── history.csv the ticket dataset (13 columns; ";"-delimited)
└── config.json run metadata (JQL, field ids, updated watermark,
min_fetch_story_points, last_exported,
estimation_prefs: scale + min/max limits, …)
This is a single global directory per user — built once and reused from any project.
~/.estimator (a normal
folder in your home). Uninstalling the plugin does not
remove it./estimator:reset — it lists the stored files
(history.csv, config.json, and any leftover
temp file), deletes them after you confirm, and removes the
~/.estimator folder if it ends up empty. Or just
rm -rf ~/.estimator.export skill
copies the dataset to a path you choose — a folder
(history.csv, and config.json too if you opt
in) or a *.csv file (history only). Restore later with the
import skill.MIT — see LICENSE.