issue
GitHub自动化处理 Flowplan 各项目的新增 Issue 和 PR,包括分类、可行性评估、协调维护者、代码实现、测试文档及部署发布,并反馈结果。
Trigger Scenarios
Install
npx skills add yannicschuller/flowplan --skill issue -g -y
SKILL.md
Frontmatter
{
"name": "issue",
"description": "Triage and work through new GitHub issues, pull requests and new comments across all Flowplan repositories – ask the maintainer design questions first, judge feasibility and sense, implement with subagents in worktrees, test, document (DE + EN), push, build the beta image, answer the reporter in English, set the status labels and report back in one short German message. Use when the user types \/issue or asks to \"work through the issues like always\"."
}
/issue – Flowplan issues and PRs, the usual way
The maintainer is Yannic Schuller (GitHub yannicschuller). Talk to him in German; write on GitHub in English. Optional argument: issue/PR numbers or a repo name to limit the run (e.g. /issue 112, /issue flowplan-app). Without one, sweep everything.
Repositories
All under yannicschuller. Clone or add (add_repo) any that are missing in the session:
| Repo | What | Checks | Build / deploy |
|---|---|---|---|
flowplan |
Next.js 16 server (read node_modules/next/dist/docs/ before Next APIs, see AGENTS.md) |
npx tsc --noEmit, npm test, relevant npx playwright test … |
docker.yml (dispatch, empty version → :beta), ci.yml, visual.yml |
flowplan-docs |
Docs DE (content/docs/*.md) + EN (content/docs/en/*.md) |
ci.yml |
deploy.yml, docker.yml |
flowplan-app |
Expo app iOS/Android | npm test (imports without .ts) |
build.yml (platform both/ios/android, build number, upload) |
flowplan-desktop |
Desktop app | ci.yml |
release.yml |
flowplan-website |
Website | ci.yml |
docker.yml |
flowplan-admin |
Admin dashboard (CSP style-src 'self': no inline styles) |
npm test, demo DEMO_PORT=4123 npm run -s demo |
– |
flowplan-push |
Push relay | ci.yml |
– |
CasaOS-AppStore |
Fork, branch add-flowplan |
its validator | – |
Use the GitHub MCP tools (mcp__github__*, load via ToolSearch), never gh.
Labels – the state machine
Every issue/PR always carries exactly one status: label plus one type label. When switching, remove the old status: label (pass the full label list). Mirror the labels on PRs that belong to an issue.
- Type:
bug,enhancement,documentation,question(create the label in a repo where it is missing).- Categorise every item that has no type label yet – by what it really is, not the reporter's template: something that worked or is documented and fails →
bug; a new capability or a change of behaviour →enhancement; missing, wrong or unclear docs →documentation; a how-to, setup or configuration question →question. If the reporter picked the wrong one, correct it (e.g. a "bug" that is a feature request →enhancement) and say so in one line in the reply. - Several types in one issue: the main one; the rest goes into the reply or a separate issue only if Yannic wants it.
- Categorise every item that has no type label yet – by what it really is, not the reporter's template: something that worked or is documented and fails →
status: triage– new, not looked at yetstatus: needs maintainer input– waiting for Yannic's decisionstatus: needs reporter info– waiting for the reporter (keep the issue open)status: in progress– being worked onstatus: awaiting approval– done on our side, waiting for Yannic's OK (e.g. a PR to merge)status: done– fixed and answered; close the issue (state_reason: completed)status: wontfix– only with Yannic's explicit OK; close asnot_planned
Step 1 – Collect (all repos, in parallel)
- Open issues and open PRs per repo (
list_issuesstate OPEN,list_pull_requests), sorted by update. - New comments on handled issues: issues updated recently (closed ones too,
orderBy UPDATED_AT) – read the comments and find any whose last comment is not ours (ours end with the Claude Code footer or come fromyannicschuller). A reporter saying "it still happens" reopens the work. - Skip: our own comments, duplicates of things already handled, Dependabot PRs unless asked (list them in the summary).
- Read every new item fully, including screenshots (images in the body) and linked issues. Look at the relevant code before judging.
Step 2 – Judge and ask (before any code)
For each item decide, in a few words:
- Feasibility: how big, which repos, risks (security, data, CSP, migrations, app store builds).
- Sense: does it fit Flowplan (open source, self-hosted, privacy, no tracking, one container with SQLite)? Is it a real bug or a misunderstanding / config question? Duplicate of an existing feature?
- Design decisions that are Yannic's to make.
Then ask Yannic one AskUserQuestion round (max 4 questions, recommended option first with "(Recommended)", each question self-contained with the issue number and the cause you found). Small, clear bugs with an obvious fix need no question – just say you'll fix them. Never ask about wontfix silently: propose it as an option.
Set labels now – the type label (categorise if missing, see Labels) plus the status: being worked → status: in progress; question to Yannic still open → status: needs maintainer input; needs info from reporter → status: needs reporter info and post an English question to the reporter.
Step 3 – Implement
- Independent items → subagents in worktrees (
Agentwithisolation: "worktree", run in background), one per issue or coherent group. Brief each like a peer: the issue, the decided design, the files to look at, the checks to run, "commit, don't push, report branch/hash/files/tests". For a second repo the agent creates its owngit worktreethere. - Small fixes you do yourself in the main checkout meanwhile.
- Don't overstate causes: if a cause is likely but unproven, say so in commit messages and replies.
Step 4 – Merge, test, document
- Merge the agents' branches (merge commit if
mainmoved; never rewrite others' history). Resolve conflicts properly. - Run the checks of every touched repo (table above). Restore
next-env.d.tsafter Next tooling. UI changes: look at them (Playwright screenshot withexecutablePath: '/opt/pw-browsers/chromium'). - Docs in
flowplan-docs, German and English, natural wording, the matching existing page. Then inflowplanrunnpm run help-docsand commit the result. - Visual tests that change on purpose: run
visual.ymlwithupdate=true, then fast-forwardorigin/visual-baselinesinto main.
Commit messages end with the trailers from CLAUDE.md (Co-Authored-By: Yannic Schuller …, Co-Authored-By: Claude …) plus the attribution lines the session's system prompt gives.
Step 5 – Push and build
- Per repo:
git push -q origin HEAD:main, then force-push the session's designated branch (git push -q -f origin HEAD:<session-branch>). Do this in every repo you changed, docs included. - Server changes → dispatch
docker.ymlinflowplanwithout a version (one beta build at the end, not per issue). - App changes → ask Yannic before building. iOS testers:
build.ymlwith upload (TestFlight; raise the build number). Android users only get fixes through the APK on flowplan.org/download, i.e. a new GitHub release viarelease.yml(/app-release) – Google Play is not used. Desktop changes → mention, release only on request. - Wait for CI, Visual and Docker to be green (watch the runs; don't poll with sleep loops – use Monitor or check back). Red → root-cause and fix before answering anyone.
- Never create PRs, merge PRs, or publish releases without Yannic's explicit OK.
Step 6 – Answer and label
For each finished item, an English comment to the reporter:
- thank them (with @mention), what the cause was, what changed (short bullets), how it was tested, link to the docs page (
https://docs.flowplan.org/en/...), "It's in the:betaimage now and will be in the next release." (app: which build/track). - End with the footer, exactly:
---
_Generated by [Claude Code](https://claude.ai/code)_
Then labels → status: done and close (completed). Issues waiting on a device test/app update by the reporter → status: needs reporter info, keep open.
Step 7 – Report to Yannic (one short German message)
- Per item: number, title, one line what was done or why not, status label.
- New comments found and how they were handled.
- Builds/runs and their result; anything he must do himself (set an env var in Coolify, approve a PR, answer a question).
- Open decisions.
Keep it short: no file dumps, no process narration.
Standing rules
- Tokens, passwords and secrets are never written in chat or code; Yannic enters them himself.
- Never
pkill -f; kill only by exact PID. - awesome-selfhosted and similar lists: Yannic submits personally (no LLM submissions).
- The scheduled triage task
trig_01W6FU6RnkGpH9vrXmwJWxLgis disabled on purpose – don't re-enable it.
Version History
- 84c9b3c Current 2026-11-07 08:54


