project-tracking
Manages a GitHub Project board + Issues as the source of truth for product backlog, tasks, stories, and bugs. Provides five flows: bootstrap (/track-init), plan an epic with hierarchy (/plan-epic), migrate flat boards to a hierarchy (/plan-migrate), track ad-hoc work (/track), and query (/backlog). Uses gh CLI for project operations and MCP tools for issue creation. Trigger: /track-init, /plan-epic <description>, /plan-migrate, /track <description>, /backlog, "qué tenemos pendiente?", "what's pending?", "acordate que hay que...", "remember to...", or when SDD generates tasks via sdd-tasks.
What this skill does
**Triggers**: `/track-init`, `/plan-epic <description>`, `/plan-migrate`, `/track <description>`, `/backlog`, "qué tenemos pendiente?", "what's pending?", "acordate que hay que...", "remember to...", "vamos a planear", "armemos la épica", bug found during implementation, SDD tasks generated by `sdd-tasks`.
---
## Hierarchy model — Epic / Story / Task / Bug
This skill enforces a three-level hierarchy (plus Bug as an orthogonal type)
modeled with **GitHub Issue Types** (native) and **sub-issues** (native).
Labels are kept for backwards compatibility but Issue Types are authoritative.
| Level | GitHub Issue Type | Lifetime | Sub-issues of | Has sub-issues |
|-------|------------------|----------|---------------|----------------|
| Epic | `Epic` | Weeks | none | Stories |
| Story | `Feature` | Days | Epic | Tasks |
| Task | `Task` | Hours | Story (or Epic for hotfixes) | none |
| Bug | `Bug` | Hours–Days | Epic (Stability) or Story it breaks | none |
**Rules of thumb**:
- One Task = one Claude session. If it does not fit, it is a Story disguised as a Task. Split it.
- A Story without sub-issues is allowed only when its acceptance criteria already serve as the task list (truly small).
- An Epic without sub-issues is a smell — likely it is actually a Story.
- A Bug can be standalone (no parent) when it does not belong to a planned epic.
### Issue Types vs labels
The skill writes BOTH the Issue Type (when the org has Issue Types enabled)
AND the equivalent legacy label (`type/epic`, `type/feature`, `type/task`,
`type/bug`). This lets old views, filters, and the existing `/track` flow
keep working while the new hierarchy is adopted incrementally.
Detection of Issue Type availability is done once per session via the
`Issue-Type detection` block in `COMMANDS.md`. If the response is empty or the field
is unsupported, fall back to label-only mode and warn the user once per session:
> "Issue Types are not enabled on this org. Falling back to labels — `type/epic`,
> `type/feature`, `type/task`, `type/bug`. To enable native types, go to
> Org settings → Issue Types."
> **All literal `gh` / GraphQL command blocks live in [`COMMANDS.md`](./COMMANDS.md)**,
> referenced below by step ID (e.g. `[track-init §1]`). This file holds the decision
> logic; `COMMANDS.md` holds the exact invocations.
## Process
### Pre-flight: Detect Repo and Config
Before any flow, resolve owner/repo (run `Pre-flight — detect repo` in `COMMANDS.md`).
Then search engram for the project config:
- `mem_search` with query `tracking/{repo-name}/config`
- If found, call `mem_get_observation` to get project number and field IDs
- If NOT found and the flow requires project operations → warn user to run `/track-init` first
---
### Flow 1: Bootstrap — `/track-init`
Run once per repo. Idempotent — safe to run again.
#### Step 0 — Detect token capabilities
Run `[track-init §0]`. On failure, **classify the cause** using the table there —
never assume every failure is the token. Distinct causes route to distinct actions:
gh-not-authenticated (`§0-auth`), fine-grained PAT (`§0-manual`), missing `project`
scope (`gh auth refresh -s project`), a transient GitHub/network error (stop and
retry later, do NOT touch the token), or — when REST works but Projects/GraphQL
returns `FORBIDDEN` — a misconfigured token env var (`§0-token-env`: wrong token
type, or the right token under a name `gh` never reads).
**Most common (your case): fine-grained PATs do NOT support Projects V2 on personal
accounts** (only orgs). `[track-init §0-manual]` offers two exits: **fix the token**
(Classic PAT + `gh auth`, recommended — unblocks automatic creation for every repo)
or **create the board manually** (fast fallback). Recommend the token fix. If the user
fixes the token, re-run Step 0 then go to Step 1. If they create it manually, capture
the project number and skip to Step 2 (labels).
#### Step 1 — Create GitHub Project board (automatic path)
Only if Step 0 confirms Projects V2 support: run `[track-init §1]` (creates the
project + the Status / Priority / Type single-select fields).
#### Step 2 — Create labels
Run `[track-init §2]` (type / priority / status labels). Idempotent — a label that
already exists makes `gh label create` fail; catch and continue.
#### Step 3 — Capture field and option IDs
Whether the board was created automatically (Step 1) or manually (Step 0), run
`[track-init §3]` to capture `status_field_id`, `priority_field_id`, `type_field_id`
and the option IDs for each value. Required by `gh project item-edit`.
#### Step 4 — Save config to engram
Call `mem_save` with:
- **title**: "Bootstrap project-tracking config for {repo-name}"
- **type**: config
- **topic_key**: `tracking/{repo-name}/config`
- **content**: project_number, owner, repo, all field IDs and option IDs as a structured map
Confirm to user: "Board linked. Project #{project_number} for {owner}/{repo}. Config saved to engram."
---
### Flow 2: Plan Epic — `/plan-epic <description>`
Used to plan a large feature or initiative end-to-end: one Epic, its Stories,
and the Tasks of each Story. **Nothing is written to GitHub until the user
confirms explicitly.**
Run `/track-init` first if no engram config exists for this repo.
#### Step 1 — Read templates
Load the body templates from this skill directory:
- `templates/epic.md`
- `templates/story.md`
- `templates/task.md`
These are the contract — every issue created in this flow follows them.
#### Step 2 — Detect Issue Type support
Run `Issue-Type detection` (`COMMANDS.md`). Cache the result for the session.
Decide: native Issue Types mode OR label-fallback mode.
#### Step 3 — Propose the hierarchy as Markdown in chat
Produce a single chat message structured as:
```
# Epic: {Title}
Type: Epic | Priority: {P0..P3}
[Epic body following templates/epic.md]
---
## Story 1: {Title}
Type: Feature | Priority: {P0..P3} | Parent: Epic above
[Story body following templates/story.md]
### Task 1.1: {Title}
Type: Task | Parent: Story 1
[Task body following templates/task.md]
### Task 1.2: {Title}
...
---
## Story 2: {Title}
...
```
Show the full proposal in ONE message. Do not call any GitHub API yet.
#### Step 4 — Wait for confirmation
End the proposal message with EXACTLY this prompt:
```
Review the plan above. Reply:
- "dale" / "go" / "create" → I create all N issues + sub-issue links
- "edit <X>" / "no <X>" → tell me what to change, I revise the plan
- "abort" → drop the plan, nothing is created
```
If the user replies anything other than a confirmation keyword, treat it as
edit instructions and produce a revised proposal. Re-prompt. Never create
issues without an explicit confirmation keyword from this list.
#### Step 5 — Execute creation in order
Create issues in the order: Epic → Story 1 → Task 1.1 → Task 1.2 → Story 2 → ...
For each issue:
1. Call `mcp__github__create_issue` with title, body, labels, and Issue Type (when supported).
2. Capture the returned issue number.
3. If the issue has a parent in the proposal, link as sub-issue with `[sub-issue link]`.
4. Add the issue to the Project board (`[track §3]`).
5. Set Project fields (`[track §4]`): Status=Backlog, Priority=as proposed, Type=as proposed.
#### Step 6 — Report back
Print a single summary block:
```
## Created
Epic #N: {title}
├── Story #N+1: {title}
│ ├── Task #N+2: {title}
│ ├── Task #N+3: {title}
│ └── Task #N+4: {title}
└── Story #N+5: {title}
├── Task #N+6: {title}
└── Task #N+7: {title}
Total: 1 epic, 2 stories, 5 tasks. All added to project board as Backlog.
```
Save an engram observation:
- `mem_save` with **type: architecture**, **topic_key: `tracking/{repo}/epic-{N}`**,
content: epic title, child story+task numbers, source of the plan
(user request, SDD spec ref, etc.).
---
### Flow 3: Plan Migrate — `/plan-migrate`
Used when an existing repo has Related in Ads & Marketing
ads
IncludedMulti-platform paid advertising audit and optimization skill. Analyzes Google, Meta, YouTube, LinkedIn, TikTok, Microsoft, and Apple Ads. 250+ checks with scoring, parallel agents, industry templates, and AI creative generation.
banana
IncludedAI image generation Creative Director powered by Google Gemini Nano Banana models. Use this skill for ANY request involving image creation, editing, visual asset production, or creative direction. Triggers on: generate an image, create a photo, edit this picture, design a logo, make a banner, visual for my anything, and all /banana commands. Handles text-to-image, image editing, multi-turn creative sessions, batch workflows, and brand presets.
rpg-migration-analyzer
IncludedAnalyzes legacy RPG (Report Program Generator) programs from AS/400 and IBM i systems for migration to modern Java applications. Extracts business logic from RPG III/IV/ILE source code, identifies data structures (D-specs), file operations (F-specs), program dependencies (CALLB/CALLP), and converts RPG constructs to Java equivalents. Generates migration reports, complexity estimates, and Java implementation strategies with POJO classes, JPA entities, and service methods. Use when modernizing AS/400 or IBM i legacy systems, analyzing RPG source files (.rpg, .rpgle, .RPGLE), converting RPG to Java, mapping data specifications to Java classes, planning legacy system migration, or when user mentions RPG analysis, Report Program Generator, RPG III/IV/ILE, AS/400 modernization, IBM i migration, packed decimal conversion, or mainframe application rewrite.
brand-library-architect
IncludedBuild a complete brand library for a product — visual asset render pipeline, brand documentation set (BRAND, COPY, MANIFESTO, BIOS, FAQ, GLOSSARY, TONE, PRICING), open-source convention files (README, CONTRIBUTING, SECURITY, CODE_OF_CONDUCT), and a self-contained press kit. This skill should be used when the user asks to "build a brand library / brand kit / press kit / brand assets" for a product, "set up a brand library workflow," "create a positioning manifesto plus visual identity," or any combination of brand documentation + visual asset pipeline. Apply phase-by-phase or run end-to-end. Templates are product-agnostic and use {{TOKEN}} placeholders the skill prompts the user to fill.
writing-tech-post
IncludedAuthors engineering blog posts end-to-end: launch deep-dives, incident postmortems, architecture migrations, performance case studies, tutorials, AI/agent system writeups, security disclosures, and research-to-product translations. Picks the correct archetype, plans the abstraction ladder, enforces an evidence cadence (diagrams, benchmarks, profiles, traces, code, ablations), tunes voice against publisher house styles (Datadog, Vercel, GitHub, AWS, Meta, Cloudflare, Jane Street), and runs a pre-publish gate for narrative momentum and disclosure ethics. Use when drafting a new engineering post, restructuring a draft that feels flat, deciding which evidence form belongs where, validating that depth and product context are balanced, or preparing a postmortem, migration, or performance narrative for external publication. Do not use for API reference documentation, README authoring, marketing copy, release notes, generic SEO content, ghost-written executive thought leadership, or non-engineering long-form essays.
blog-google
IncludedGoogle API integration for blog performance: PageSpeed Insights, CrUX Core Web Vitals with 25-week history, Search Console performance, URL Inspection, Indexing API, GA4 organic traffic, NLP entity analysis for E-E-A-T, YouTube video search for embedding, and Google Ads Keyword Planner. Progressive feature availability based on credential tier (API key, OAuth/service account, GA4, Ads). Shares config with claude-seo at ~/.config/claude-seo/google-api.json. Use when user says "google data", "page speed", "core web vitals", "search console", "indexation", "GA4", "keyword research", "nlp entities", "blog performance", "youtube search", "google api setup".