agentsclimarketplace

Daily briefing

Skill mohitkhandelwal242/ai-pm-operator/.claude/skills/daily-briefing

AI operating system for product managers — 19 Claude Code skills that connect to Jira, Confluence, GA4 & the app stores. 7-day free trial.

Install
npx -y skills add mohitkhandelwal242/ai-pm-operator --skill daily-briefing

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

The morning-habit orchestrator — one command produces a single, concise, proactive digest of everything a PM needs to know today: board health, what's newly on your plate, metric movement, and competitor deltas. Degrades gracefully — only runs the sections whose data and credentials exist. Use when asked for '/briefing', 'morning briefing', 'monday briefing', 'daily briefing', '/standup', 'what needs me today', 'catch me up', or as the first thing each morning.

SKILL.md

11.7 KB, as published. Nobody here has run it

Daily Briefing — Product

The first thing you run each morning. One command assembles a single, tight digest of everything that needs a Product Manager's attention today, pulled from whatever sources this install has configured. A CTO or PM should read the whole thing in under 2 minutes.

Iron Law: DEGRADE GRACEFULLY, LEAD WITH THE PUNCHLINE. Never error because a source isn't configured — silently skip any section whose data or credentials are missing. Always open with the synthesized "Top 3 that need you today"; the supporting sections come after.

This is a read-and-summarize orchestrator. It does not auto-publish, comment, transition, email, or notify anyone. Output is console markdown only.


Input

$ARGUMENTS


Step 0: Bootstrap & Source Detection

Read silently:

  1. business.json — company, product, industry, metrics (north_star, key_metrics), competitors, stack. Use this for all context — never assume an industry, metric, or competitor.
  2. team.json — full roster. Find the Product Manager / Project Manager (role contains "Product Manager" or "Project Manager"); store their name, alias, atlassianId, email. This is "you" for the briefing.
  3. .env — to detect which integrations are configured (see detection table below). Do not print secrets.
  4. Parse $ARGUMENTS:
    • --since Nd — look-back window for board + incoming sections (default 2d; Monday default 3d to cover the weekend). Cap at 14d.
    • --no-email — skip the email half of the "Incoming for you" section.

Constants:

  • JIRA_CLI: python3 tools/jira-api.py
  • PROJECT_KEY: ${JIRA_PROJECT_KEY} (a.k.a. ${PROJECT_KEY})

Source detection (decide which sections run)

Probe each source and build an availability map. A source that is absent is skipped silently, not errored.

SectionRuns when
1. Board healthJIRA_URL + JIRA_EMAIL + JIRA_TOKEN + JIRA_PROJECT_KEY are all set
2a. Incoming Jirassame Jira creds as above + PM resolved from team.json
2b. Email actions--no-email NOT passed AND a mail source exists (.claude/skills/outlook-actions/scripts/fetch-mail.js present, or ATLASSIAN/IMAP mail creds set). If none, skip the email half only.
3. Metric pulseGA4_PROPERTY_ID (or GA_PROPERTY_ID) is set in .env
4. Competitor deltas.claude/knowledge/competitor-audit/last-scan.json exists AND has a non-null scan_date
5. Top 3always — synthesized from whatever sections ran

Quick probe (single call, don't fail the run if a grep returns nothing):

echo "== .env keys ==" ; grep -E '^(JIRA_URL|JIRA_EMAIL|JIRA_TOKEN|JIRA_PROJECT_KEY|GA4_PROPERTY_ID|GA_PROPERTY_ID)=' .env 2>/dev/null | sed 's/=.*/=<set>/'
echo "== mail ==" ; ls .claude/skills/outlook-actions/scripts/fetch-mail.js 2>/dev/null
echo "== competitor scan ==" ; ls .claude/knowledge/competitor-audit/last-scan.json 2>/dev/null

Announce up front (one line, before any section), e.g.:

Briefing for {PM name} · {date} · window {Nd} · sections running: Board health, Incoming, Competitor deltas (Metric pulse skipped — GA4 not configured).

This tells the user immediately what's covered and what isn't, so a missing section never reads as a bug.


Step 1: Gather Data (run available sections in parallel)

Run every available source's fetch in parallel — issue the Bash calls in a single message. If a Jira call returns a 401 / "Client must be authenticated", treat Jira as unavailable for this run (surface a one-line note, continue with the rest). Summarize, don't audit — pull just enough to flag what needs attention.

1. Board health (Jira)

Mirror the kinds of checks scrum-master runs, but only to count and surface — do not take any action.

# Blocked / impediment-labeled, still open
python3 tools/jira-api.py search \
  "project = ${PROJECT_KEY} AND statusCategory != Done AND (labels = blocker OR labels = impediment OR labels = blocked)" \
  --fields "summary,status,assignee,priority,updated,labels" --max-results 30

# Stale — open and untouched 10+ days
python3 tools/jira-api.py search \
  "project = ${PROJECT_KEY} AND statusCategory != Done AND updated <= -10d ORDER BY updated ASC" \
  --fields "summary,status,assignee,priority,updated" --max-results 50

# Unassigned and aging (>3d, flow risk)
python3 tools/jira-api.py search \
  "project = ${PROJECT_KEY} AND statusCategory != Done AND assignee IS EMPTY AND created <= -3d ORDER BY created ASC" \
  --fields "summary,status,priority,created" --max-results 30

# High/Highest priority still open (what's at stake)
python3 tools/jira-api.py search \
  "project = ${PROJECT_KEY} AND statusCategory != Done AND priority IN (Highest, High) ORDER BY priority DESC, updated ASC" \
  --fields "summary,status,assignee,priority,updated" --max-results 30

Reduce to counts + the 3–5 sharpest items (e.g. oldest blocker, highest-priority stale issue).

2. Incoming for you

2a. Newly assigned Jiras (assigned to the PM by someone else, in the window):

USER_ID="$(python3 -c 'import json,sys; r=json.load(open("team.json")); pm=next((p for p in r if "Product Manager" in p.get("role","") or "Project Manager" in p.get("role","")), None); print(pm["atlassianId"] if pm else "")')"
python3 tools/jira-api.py search \
  "project = ${PROJECT_KEY} AND assignee = \"$USER_ID\" AND reporter != \"$USER_ID\" AND statusCategory != Done AND created >= -${SINCE_DAYS}d ORDER BY priority DESC, created DESC" \
  --fields "summary,reporter,priority,status,created" --max-results 30

2b. Email action items — only if a mail source exists and --no-email was not passed. Reuse the existing mail fetcher if present (do not hard-require it):

REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
osascript -l JavaScript "$REPO_ROOT/.claude/skills/outlook-actions/scripts/fetch-mail.js" "${SINCE_HOURS:-48}" 2>/dev/null

Classify only the clear action items (addressed to the PM, asking for a decision/reply). If the fetcher is missing or errors, skip the email half silently — never block the briefing on it.

3. Metric pulse (only if GA4 configured)

If GA4_PROPERTY_ID is set, pull a short window for the north_star / key_metrics from business.json and produce a 1–3 line "what moved" note — only genuine anomalies (e.g. ">20% day-over-day swing"), not a full report. If GA4 is not configured, skip entirely. (For the full analysis, point the user at /weekly-metrics.)

4. Competitor deltas (only if last-scan.json exists)

cat .claude/knowledge/competitor-audit/last-scan.json 2>/dev/null

If present and scan_date is non-null, summarize only what is new since that scan: new entrants in discovery.new_competitors_added, fresh news_headlines, notable rating/feature/hiring/pricing changes in competitors. 1–4 bullets, business-agnostic, drawn from business.json competitors. If the file is absent or an empty baseline (scan_date: null), skip — optionally one line: "No competitor scan yet — run /competitor-tracker to seed one."


Step 2: Synthesize "Top 3 that need you today"

From whatever sections ran, distill the three most decision-worthy items for the PM today. Rank by leverage, roughly:

  1. A blocker or high-priority issue stalling delivery.
  2. Something newly on the PM's plate that needs a decision/reply now.
  3. A real metric anomaly or a competitor move with strategic implication.

Each line: the punchline + the concrete artifact (Jira key, sender, metric, competitor) + the suggested next move. If fewer than 3 things genuinely need attention, list fewer — never pad. If nothing does, say so plainly ("Clear runway — no fires; go do focused work.").


Step 3: Render the Briefing (console markdown)

Lead with the Top 3. Keep total length tight — aim for under ~40 lines. Omit any section that didn't run (don't print empty headers).

# ☀️ Daily Briefing — {Product name} · {date}
_{PM name} · window {Nd} · sections: {list}_

## 🎯 Top 3 that need you today
1. **{punchline}** → {artifact} · {suggested move}
2. **{punchline}** → {artifact} · {suggested move}
3. **{punchline}** → {artifact} · {suggested move}

---

## 🩺 Board health
- Blocked: {N} · Stale (10d+): {N} · Unassigned (3d+): {N} · High-pri open: {N}
- Sharpest: ${PROJECT_KEY}-XXXX {summary} — {why it matters} ({assignee or Unassigned})
- ${PROJECT_KEY}-YYYY {summary} — stale {D}d

## 📥 Incoming for you
**New Jiras assigned to you ({N})**
| Key | Pri | Reporter | Created | Summary |
|-----|-----|----------|---------|---------|
| ${PROJECT_KEY}-XXXX | High | {name} | {date} | {summary} |
> If 0: "No new Jiras landed on your plate — clean slate."

**Email actions ({M})**  _(omit block if email source not available or --no-email)_
| Sender | Subject | Suggested action |
|--------|---------|------------------|
| {name} | {subject} | {action} |

## 📈 Metric pulse   _(only if GA4 configured)_
- {north_star} {↑/↓ X%} {window} — {one-line read}.

## 🔭 Competitor deltas   _(only if last-scan.json exists)_
- {Competitor}: {what changed since last scan} → {implication for {Product}}.

End with a single-line footer summarizing what was and wasn't covered, e.g.:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Covered: Board, Incoming, Competitor · Skipped: Metric pulse (GA4 not set)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Step 4: One Optional Follow-up

Offer at most ONE next step, only if clearly useful — otherwise stay silent:

  • High-priority blocker → "Want me to run /scrum-master --focus blockers?"
  • Heavy inbox → "Want the full /incoming walk-through?"
  • Metric anomaly → "Want the full /weekly-metrics report?"

What this skill does NOT do

  • Does NOT error or stop because a source is unconfigured — it skips that section and says so.
  • Does NOT publish to Confluence, post to Slack, send email, or push notifications.
  • Does NOT modify Jira (no comments, transitions, labels, or assignments) — it only reads.
  • Does NOT run the full scrum audit, full GA report, or full competitor scan — those are their own skills; this is the 2-minute summary that points to them.
  • Does NOT assume an industry, metric set, or competitor — everything comes from business.json.

Edge Cases

  • Nothing configured but Jira — that's fine; run Board health + Incoming Jiras, skip the rest, still produce a Top 3 (or "Clear runway").
  • Jira token expired (401) — surface one line ("Atlassian token expired — refresh at https://id.atlassian.com/manage-profile/security/api-tokens and update JIRA_TOKEN in .env"), continue with non-Jira sections.
  • PM not found in team.json — skip the "newly assigned" half, note it once, keep the rest.
  • Empty competitor baseline (scan_date: null) — treat as not-yet-scanned; skip with a one-line nudge.
  • Monday run — widen the default window to 3d to capture weekend activity; you may label the digest "Monday briefing".
  • Everything quiet — short is correct. A 6-line "all clear" briefing is a successful run, not a failure.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.