集成

Engineering manager 1-on-1 meeting brief generator

试用

Generate a 1-on-1 brief from GitHub activity. Fully deterministic pipeline — 5 tool calls, zero sub-agent spawns.

它能做什么

Generate a 1-on-1 brief from GitHub activity. Fully deterministic pipeline — 5 tool calls, zero sub-agent spawns.

技能文档

Overview

PullStar fetches GitHub activity for one engineer (PRs authored, reviews given), runs a deterministic local scoring engine across five dimensions, and prepares an LLM input payload. The agent then performs LLM inference and finalizes the brief.

Quickstart:

run_brief.py --login steipete --pr-insights --days 7
Read llm_input_steipete.json, do the LLM inference, present the brief

Data Flow Summary:

StepWhat runsExternal calls
Ingestrun_brief.pyingest.pyGitHub API
Scorerun_brief.pyscore.pyNone
Preparerun_brief.pyagent_prepare_1on1.pyNone
Agent inferenceAgent calls LLMLLM provider
FinalizeAgent runs agent_finalize_1on1.pyNone

⚠️ Important: Steps 1–3 run locally. Only the LLM inference step (step 4) sends data to your AI provider.


Requirements

  • Python 3.11+
  • Install dependencies: pip install PyGithub python-dotenv requests
  • A GitHub personal access token (see Security section below)

Security & Privacy

Token Scope

OptionWhere to createBest for
Classic PAT (repo scope)https://github.com/settings/tokensCross-user search, org-wide ingestion
Fine-grained PAThttps://github.com/settings/personal-access-tokensYour own repos only

Fine-grained PATs cannot search across arbitrary users. Use a classic PAT for org-wide briefs.

Set GITHUB_ORG to narrow search to one organization.

Token Resolution Order

Secrets are resolved using layered lookup — first match wins:

  1. --github-token CLI flag (override/debug only — never logged)
  2. GITHUB_TOKEN environment variable
  3. ~/.pullstar/credentials (key=value format)
  4. .env in the skill directory

Data Privacy by Mode

Default (no --pr-insights):

  • Only aggregated statistics and scores sent to LLM
  • No raw PR text, comments, or review bodies included

PR Insights (--pr-insights):

  • Bounded raw PR discussion text packaged into the LLM prompt
  • Bounded to 5 PRs, 3 reviews/comments each, 600 char limit per item
  • Review llm_input_{login}.json before inference if you have privacy concerns

Configuration

.env

VariableRequiredDescription
GITHUB_TOKENRecommendedClassic PAT with repo scope. Omit for unauthenticated access (60 req/hr).
GITHUB_ORGNoScope ingestion to one org.

Usage

Standard run

python run_brief.py --login jsmith

With PR insights

python run_brief.py --login jsmith --pr-insights

Common options

python run_brief.py --login jsmith --days 14          # wider lookback (default: 5)
python run_brief.py --login jsmith --max-results 10   # faster on high-activity users (default: 20)
python run_brief.py --login jsmith --api-mode rest    # force REST API (default: graphql)

All options

FlagDefaultDescription
--loginrequiredEngineer GitHub login
--days5Lookback window in days
--pr-insightsoffInclude PR review/comment context in LLM prompt
--max-results20Max search results to iterate (lower = faster)
--api-modegraphqlgraphql or rest
--output-dir.pullstarDirectory for all artifacts
--github-tokenOverride/debug only. Prefer .env.

Agent Flow

run_brief.py runs the deterministic pipeline (ingest → score → prepare) and then prints an explicit instruction block. The agent must complete the final two steps:

============================================================
PIPELINE COMPLETE — AGENT ACTION REQUIRED
============================================================

  1. Read:   .pullstar/llm_input_jsmith.json
  2. Extract the "system" and "user" fields
  3. Call your LLM with those as the system prompt and user message
  4. Write the response to .pullstar/llm_output_jsmith.json
  5. Run:    python scripts/agent_finalize_1on1.py --login jsmith

Agent JSON Contract

Input (from run_brief.py)

File: .pullstar/llm_input_{login}.json

FieldTypeDescription
systemstringSystem prompt with instructions
userstringUser message with engineer data and scores
metadataobjectVersion, timestamps, total score, confidence

Output (from agent)

File: .pullstar/llm_output_{login}.json

{
  "version":        "1.0",
  "engineer_login": "jsmith",
  "brief":          "## Quick Summary\n..."
}

Requirements:

  • Valid JSON
  • brief must be a non-empty markdown string
  • Plain text is also accepted — the full file content will be used as the brief

Brief Output Format

The final brief (output_{login}.json) contains a markdown document with six sections:

SectionContent
Quick Summary2–3 sentences, lead with concrete numbers
Highlights2–4 bullets, one data point each
Areas to Explore2–3 open-ended questions for the 1-on-1
Patterns Worth Noting1–3 factual behavioral observations
Score SummaryMarkdown table — Dimension / Score / Confidence / Signal. Emoji encouraged in Confidence column.
Suggested FocusOne paragraph on the most useful 1-on-1 theme

Example Score Summary table:

DimensionScoreConfidenceSignal
Velocity16/20✅ High10 PRs merged, 3 active weeks
PR Quality14/20✅ HighAvg 320 lines, 2 large PRs flagged
Review Participation8/20⚠️ Medium3 reviews given in window
Collaboration12/20✅ High4 repos, 3 reviewers per PR avg
Consistency10/20🔴 Low1 of 3 weeks inactive

Artifacts

All artifacts are written to .pullstar/ (gitignored, never committed).

FileWritten bySent to AI?
ingest_{login}.jsoningest.py❌ No
score_{login}.jsonscore.py❌ No
llm_input_{login}.jsonagent_prepare_1on1.py✅ Yes
llm_output_{login}.jsonAgent❌ No
output_{login}.jsonagent_finalize_1on1.py❌ No

Troubleshooting

"GitHub rejected the PR search query (422)" Use a classic PAT — fine-grained PATs cannot search across arbitrary users.

"GitHub rate limit hit" Authenticated: 5000 req/hr. Unauthenticated: 60 req/hr. Set GITHUB_TOKEN.

Slow ingestion on high-activity users Use --max-results 10 to cap iteration. Default is 20.

GraphQL errors Use --api-mode rest to fall back to the legacy REST API.


For Agent Developers

Subagent Best Practices (Don't Be a Nervous Parent)

When using sessions_spawn for the LLM inference step:

✅ Do:

  • Spawn once with the task to read llm_input_{login}.json and write llm_output_{login}.json
  • Trust the "auto-announces on completion" behavior — you'll get a completion event
  • Handle the result when the event arrives

❌ Don't:

  • Poll subagents list in a tight loop waiting for completion
  • Spawn multiple subagents for the same task
  • Check status every few seconds — it's wasteful

Why: Subagents are lightweight (no full OpenClaw context, isolated environment), but polling defeats the purpose of push-based completion. The system will tell you when it's done.

Recovery: If a subagent fails, you can always generate the brief directly in the main session — the JSON contract is simple and documented above.


License

MIT — See source repository for full license text.

相关技能

Turn scattered notes, chat logs, meeting fragments, issue updates, or calendar context into a concise daily brief. Use when Codex needs to summarize what hap...

13 次安装

Generate structured weekly work reports from Git commit history and file-change statistics. Use when the user asks for a weekly report, work summary, progress review, or sprint recap based on repository activity, or when they need a Markdown report of what changed in a project over a time range.

Generate structured daily standup notes from a free-form brain dump. Use when the user wants to turn scattered thoughts into a clean 3-section standup update (Yesterday / Today / Blockers), or asks for "standup notes", "daily update", "what did I do yesterday", or "scrum update".

2 次安装

Generate evidence-based project weekly reports from a local code repository. Use when the user asks for a project weekly report, weekly update, status summar...

1 次安装

Generate private meeting briefings from Fulcra calendar data with optional CRM notes and web research.

6 次安装7 星标