Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
8714186
feat(edge-ic): add morning skill — config setup and frontmatter
lucaconsalvi Jun 19, 2026
6516a9d
fix(edge-ic): morning skill — concrete JIRA inference, fix sections d…
lucaconsalvi Jun 19, 2026
4127a29
feat(edge-ic): morning skill — add data gathering steps 2-7
lucaconsalvi Jun 19, 2026
bfdf03c
fix(edge-ic): morning skill — clarify parallel execution and config r…
lucaconsalvi Jun 19, 2026
50cfeaf
feat(edge-ic): morning skill — output rendering, deduplication, and f…
lucaconsalvi Jun 19, 2026
6bd6cb1
feat(edge-ic): morning skill — edge cases and gotchas
lucaconsalvi Jun 19, 2026
9b8cc8d
fix(edge-ic): morning skill — address final review findings
lucaconsalvi Jun 19, 2026
2084704
fix(edge-ic): morning skill — use QA Contact field, fix sprint query …
lucaconsalvi Jun 19, 2026
a5edb3e
style(edge-ic): morning skill — block pixel title, » section markers,…
lucaconsalvi Jun 22, 2026
e401d0c
fix(edge-ic): morning skill — address CodeRabbit review findings
lucaconsalvi Jun 22, 2026
cb82771
style(edge-ic): morning skill — fix block pixel glyphs J, L, Q, X
lucaconsalvi Jun 22, 2026
b574aa9
fix(edge-ic): suppress stdout in date capability probes (>/dev/null 2…
lucaconsalvi Jun 22, 2026
c46a851
fix(edge-ic): fix markdownlint errors (MD031/MD032/MD038/MD040)
lucaconsalvi Jun 22, 2026
b50d7f8
fix(edge-ic): morning skill — progress bar uses story points, open PR…
lucaconsalvi Jun 22, 2026
6a700cd
perf(edge-ic): morning skill — parallel data gathering, drop CI dashb…
lucaconsalvi Jun 22, 2026
f2b703d
fix(edge-ic): morning skill — filter open PRs older than 200 days, re…
lucaconsalvi Jun 22, 2026
c5d5c77
feat(edge-ic): morning skill — include unassigned QA tasks, split QA …
lucaconsalvi Jun 25, 2026
2e0bb36
chore: bump edge-ic to 1.3.0, sync lvms marketplace version to 1.2.0
lucaconsalvi Jun 25, 2026
c31a7bb
fix(edge-ic): morning skill — filter QA tasks to OCPBUGS/OCPEDGE proj…
lucaconsalvi Jun 25, 2026
c0af3a1
perf(edge-ic): morning skill — batch GraphQL, combine gh searches, si…
lucaconsalvi Jun 25, 2026
a303c4d
perf(edge-ic): morning skill — split QA queries, require qa_component…
lucaconsalvi Jun 25, 2026
6c1ab71
fix(edge-ic): morning skill — fix markdownlint MD032 blank lines arou…
lucaconsalvi Jun 25, 2026
a95ae9e
fix(edge-ic): remove unrelated LVMS changes from morning skill PR
lucaconsalvi Jun 25, 2026
fb31cc6
fix: remove LVMS run-integration-tests skill from morning PR
lucaconsalvi Jun 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"name": "edge-ic",
"source": "./plugins/edge-ic",
"description": "Individual contributor workflow automation for TODO management, status reporting, and Jira updates",
"version": "1.2.0"
"version": "1.3.0"
},
{
"name": "edge-ocp-ci",
Expand Down
2 changes: 1 addition & 1 deletion plugins/edge-ic/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "edge-ic",
"description": "Individual contributor workflow automation for TODO management, status reporting, and Jira updates",
"version": "1.2.0",
"version": "1.3.0",
"author": { "name": "jaypoulz" },
"homepage": "https://github.com/openshift-eng/edge-tooling",
"license": "Apache-2.0",
Expand Down
66 changes: 66 additions & 0 deletions plugins/edge-ic/references/MORNING_CONFIG_FORMAT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Morning Config Format

Configuration for the `edge-ic:morning` skill, stored at `$HOME/.config/edge-ic/morning.yaml`.

## Structure

```yaml
title: "Morning Edge" # text rendered as block pixel title banner

daily_notes:
enabled: true
path: "$HOME/.daily/{YYYY}/{MM}/{YYYY-MM-DD}.md"
format: auto # auto | todo | freeform

jira:
username: "user@example.com"
qa_statuses: ["ON_QA"]
qa_components: [] # empty = all components; e.g. ["Two Node Fencing", "LVMS"]
board_ids: ["11479"]

github:
username: "ghuser"

rhel_verification:
enabled: false
project: "RHEL"
summary_filter: "[TNF]"
component: "resource-agents"

sections:
qa_tasks: true
sprint_backlog: true
carry_over: true
open_prs: true
review_queue: true
rhel_queue: false
quarterly_reminders: true
```

## Fields

| Field | Required | Default | Purpose |
|-------|----------|---------|---------|
| `title` | no | `Morning Edge` | Text rendered as block pixel title banner (▀▄█). Multi-word titles stack vertically. |
| `daily_notes.enabled` | yes | `true` | Whether to check daily notes for carry-over |
| `daily_notes.path` | if enabled | `$HOME/.daily/{YYYY}/{MM}/{YYYY-MM-DD}.md` | Path template with date placeholders |
| `daily_notes.format` | no | `auto` | `auto` detects format; `todo` for checkbox-based; `freeform` for keyword-based |
| `jira.username` | yes | inferred from MCP config | JIRA email for assignee queries |
| `jira.qa_statuses` | no | `["ON_QA"]` | Statuses that mean "ready for QA" in the QA Contact section |
| `jira.qa_components` | no | `[]` (all) | Filter QA tasks to specific components (e.g., `["Two Node Fencing", "LVMS"]`) |
| `jira.board_ids` | yes | auto-discovered | List of agile board IDs for sprint queries (e.g., `["11479", "12345"]`) |
| `github.username` | yes | inferred from git/gh | GitHub username for PR matching |
| `rhel_verification.enabled` | no | `false` | Whether to check RHEL verification queue |
| `rhel_verification.project` | if enabled | `RHEL` | JIRA project key |
| `rhel_verification.summary_filter` | if enabled | `[TNF]` | Summary search string |
| `rhel_verification.component` | if enabled | `resource-agents` | Component filter |
| `sections.*` | no | `true` (except `rhel_queue`: `false` when RHEL verification is disabled) | Toggle individual sections on/off. Available: `qa_tasks`, `sprint_backlog`, `carry_over`, `open_prs`, `review_queue`, `rhel_queue`, `quarterly_reminders` |

## Date Placeholders

In `daily_notes.path`, these are replaced at runtime:

- `{YYYY}` — 4-digit year
- `{MM}` — 2-digit month (zero-padded)
- `{DD}` — 2-digit day (zero-padded)
- `{YYYY-MM-DD}` — full ISO date
173 changes: 173 additions & 0 deletions plugins/edge-ic/references/MORNING_OUTPUT_FORMAT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
# Morning Briefing Output Format

Reference template for the `edge-ic:morning` skill output.

All panels use rounded box-drawing characters (`╭╮╰╯│─`). The header panel contains the sprint info and summary line. Each data section gets its own panel. Empty sections are omitted entirely — no empty box.

## Title Banner

The output begins with the configured title rendered in block pixel characters (▀ ▄ █), centered above the panels. Default title: `Morning Edge`

```text
█▄ ▄█ █▀▀█ █▀▀▄ █▄ █ █ █▄ █ █▀▀▀
█ ▀ █ █ █ █▄▄▀ █ ▀█ █ █ ▀█ █ ▀█
▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀▀▀
█▀▀▀ █▀▀▄ █▀▀▀ █▀▀▀
█▀▀ █ █ █ ▀█ █▀▀
▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀
```

### Title Construction Rules

- **Font**: block pixel using `▀ ▄ █` — each letter is 3 rows tall, 3-5 columns wide
- **Layout**: two-word titles stack vertically, left-aligned at the same indent; single-word titles use one block
- **Centering**: indent so the longer word is centered relative to the 60-char panel width
- **Long titles (> 45 chars rendered)**: fall back to spaced capital letters (`M O R N I N G E D G E`)
- **Blank line** after the title, before the header panel

### Block Pixel Character Map

Each letter is 3 rows tall. Most are 4 columns wide; M and W are 5; I is 1; T is 3. Letters separated by 1 space.

```text
A:█▀▀█ B:█▀▀▄ C:█▀▀▀ D:█▀▀▄ E:█▀▀▀ F:█▀▀▀ G:█▀▀▀
█▀▀█ █▀▀▄ █ █ █ █▀▀ █▀▀ █ ▀█
▀ ▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀ ▀▀▀▀

H:█ █ I:█ J: ▀█ K:█ ▄▀ L:█ M:█▄ ▄█ N:█▄ █
█▀▀█ █ █ █▀▄ █ █ ▀ █ █ ▀█
▀ ▀ ▀ ▀▄▄▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ ▀

O:█▀▀█ P:█▀▀▄ Q:█▀▀█ R:█▀▀▄ S:█▀▀▀ T:▀█▀ U:█ █
█ █ █▀▀ █ █ █▄▄▀ ▀▀▀█ █ █ █
▀▀▀▀ ▀ ▀▀▀▄ ▀ ▀ ▀▀▀▀ ▀ ▀▀▀▀

V:█ █ W:█ █ X:▀▄ ▄▀ Y:█ █ Z:▀▀▀█
▀▄▄▀ █ █ █ ▀█▀ ▀▄▄▀ ▄▀▀
▀▀ ▀▀ ▀▀ ▄▀ ▀▄ ▀▀ ▀▀▀▀
```

## Template

```text
█▄ ▄█ █▀▀█ █▀▀▄ █▄ █ █ █▄ █ █▀▀▀
█ ▀ █ █ █ █▄▄▀ █ ▀█ █ █ ▀█ █ ▀█
▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀▀▀
█▀▀▀ █▀▀▄ █▀▀▀ █▀▀▀
█▀▀ █ █ █ ▀█ █▀▀
▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀

╭──────────────────────────────────────────────────────────╮
│ ☀ Morning Briefing — {month} {day}, {year} │
│ │
│ **{sprint_name}** — {days_remaining} of {total_days} days remaining
│ **Story Points:** {completed} / {total} ({pct}%) │
│ {progress_bar} │
│ │
│ > {summary_line} │
╰──────────────────────────────────────────────────────────╯

╭─ » QA Ready ─────────────────────────────────────────────╮
│ **{KEY}** {summary} ({requester_note}) │
│ **{KEY}** {summary} {link} │
╰──────────────────────────────────────────────────────────╯

╭─ » Sprint Backlog ───────────────────────────────────────╮
│ {Status}: │
│ **{KEY}** {summary} [{sp} SP] {link} │
╰──────────────────────────────────────────────────────────╯

╭─ » Carry-over from Yesterday ────────────────────────────╮
│ - {item_text} │
╰──────────────────────────────────────────────────────────╯

╭─ » Your Open PRs ────────────────────────────────────────╮
│ **{repo}#{number}** "{title}" │
│ open {days} · idle {days} · {n} unresolved · missing: {labels}
╰──────────────────────────────────────────────────────────╯

╭─ » PRs Awaiting Your Review ─────────────────────────────╮
│ **{repo}#{number}** "{title}" open {days} │
│ {link} │
╰──────────────────────────────────────────────────────────╯

╭─ » RHEL Verification Queue ──────────────────────────────╮
│ {count} RHEL tickets awaiting verification │
│ **{KEY}** {summary} │
│ → Run /two-node:create-rhel-stories to create stories │
╰──────────────────────────────────────────────────────────╯

╭─ » Reminders ────────────────────────────────────────────╮
│ ⚠ **{sprint_name}** ends in {days} days — prepare next │
│ ⚠ Quarter ends in {days_left} days ({quarter_end_date}) │
│ → Complete Quarterly Connection in Workday │
│ → Submit RewardZone points: https://rewardzone.redhat.com/
╰──────────────────────────────────────────────────────────╯
```

## Panel Construction

All borders target **60 visual columns** wide (outer `╭`/`╰` to outer `╮`/`╯`).

- **All borders**: **60 raw chars** (`╭` + 58×`─` + `╮`). Section markers use `»` (narrow, 1 visual column) so all borders are uniformly 60 raw = 60 visual
- **Content lines**: left `│` + 2-space indent; right `│` aligned at column 60 where content fits; long summaries wrap to a continuation line; bare URLs may extend past the border for usability
- **Corners**: `╭` top-left, `╮` top-right, `╰` bottom-left, `╯` bottom-right
- **Section title**: embedded in top border: `╭─ » {title} ─...─╮`

## Section Markers

All sections use `»` as a prefix in the top border. The `⚠` symbol is reserved for warning content inside panels (reminders, error notes) — not used as a section marker.

## Progress Bar

Represents **story points completion** (`points_completed / points_total`). Do NOT use sprint days elapsed. 10 colored squares wide with bracket borders `▐...▌`, gradient fill from red to green:

- Positions 1-3: 🟥 (red)
- Positions 4-5: 🟠 (orange)
- Positions 6-7: 🟡 (yellow)
- Positions 8-10: 🟢 (green)
- Unfilled positions use `░` (U+2591)
- Append `{percentage}%` after the closing bracket

Examples:

- 0%: `▐░░░░░░░░░░▌ 0%`
- 20%: `▐🟥🟥░░░░░░░░▌ 20%`
- 50%: `▐🟥🟥🟥🟠🟠░░░░░▌ 50%`
- 80%: `▐🟥🟥🟥🟠🟠🟡🟡🟢░░▌ 80%`
- 100%: `▐🟥🟥🟥🟠🟠🟡🟡🟢🟢🟢▌ 100%`

## Rules

- **Empty sections**: omit the entire panel (no empty box)
- **All sections empty**: show only the header panel with "Nothing on your plate — enjoy the quiet morning"
- **Summary line**: count items per non-empty section, join with ` · `. Prefix with `>`
- **Ticket keys**: always **bold** (`**KEY**`)
- **Sprint name**: always **bold** in header and reminders
- **Links**: plain URLs, not markdown — terminal-friendly
- **Requester note**: if a QA request was found in comments, show `(requested by @{author} in comment)`, otherwise show the JIRA link
- **Sprint urgency**: last 3 days → reminder in Reminders panel; last day → use 🔴 prefix instead of ⚠

## Summary Line Labels

| Section | Label format |
|---------|-------------|
| QA Ready | `{n} QA task(s) ready` |
| Sprint Backlog | `{n} sprint item(s)` |
| Carry-over | `{n} carry-over(s)` |
| Open PRs | `{n} open PR(s)` |
| Review Queue | `{n} PR(s) to review` |
| RHEL Queue | `{n} RHEL ticket(s)` |
| Quarterly | `⚠ quarterly reminder` (no count) |
| Sprint Urgency | `⚠ sprint ending soon` (no count) |

## Error Notes

Errors go in their own panel at the bottom (uses `⚠` instead of `»`):

```text
╭─ ⚠ Notes ────────────────────────────────────────────────╮
│ ⚠ Could not reach JIRA — QA tasks, sprint, RHEL skipped │
│ ⚠ Could not fetch PR dashboard — open PRs skipped │
╰──────────────────────────────────────────────────────────╯
```
Loading