100 lines
3.1 KiB
Go
100 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// buildPrompt renders the instructions handed to the `claude -p` session.
|
|
// It establishes Klaus's identity, summarizes the event, and states the
|
|
// rules of engagement (comment vs. open a PR).
|
|
func buildPrompt(job Job, workDir string) string {
|
|
ev := job.Event
|
|
tr := job.Trigger
|
|
|
|
var what string
|
|
switch {
|
|
case tr.IsPR:
|
|
what = fmt.Sprintf("pull request #%d", tr.Number)
|
|
case tr.Number != 0:
|
|
what = fmt.Sprintf("issue #%d", tr.Number)
|
|
default:
|
|
what = "this event"
|
|
}
|
|
|
|
branchNote := ""
|
|
if tr.IsPR && tr.BranchHint != "" {
|
|
branchNote = fmt.Sprintf(
|
|
"\n- The PR head branch `%s` has been checked out for you (instead of the default branch).",
|
|
tr.BranchHint,
|
|
)
|
|
}
|
|
|
|
var b strings.Builder
|
|
fmt.Fprintf(&b, `You are Klaus, a Gitea automation user (account name: "Klaus"). A webhook just woke you up.
|
|
|
|
# Context
|
|
|
|
- Repository: %s (default branch: %s)
|
|
- Event: %s / action=%s
|
|
- Triggered by: @%s
|
|
- Why you woke: %s on %s
|
|
- Source link: %s
|
|
|
|
## Triggering content
|
|
|
|
`+"```"+`
|
|
%s
|
|
`+"```"+`
|
|
|
|
# Working environment
|
|
|
|
- The repository is cloned at your current working directory (`+"`%s`"+`).%s
|
|
- Your SSH key is configured on Gitea: plain `+"`git push origin <branch>`"+` works.
|
|
- The `+"`gitea`"+` MCP server is connected. Prefer its `+"`mcp__gitea__*`"+` tools over curl/REST for all Gitea API interactions (reading issues, posting comments, opening PRs, etc.).
|
|
- You may run shell commands, edit files, read code — whatever the task needs.
|
|
|
|
# How to respond
|
|
|
|
1. Read the triggering content carefully and decide what is actually being asked.
|
|
2. If it's a question, clarification, review, or anything that does NOT require code changes:
|
|
- Post a comment on the originating %s using the gitea MCP.
|
|
- Keep it concise and helpful. Sign off as Klaus.
|
|
3. If it requires code changes:
|
|
a. Create a branch off the current HEAD named `+"`klaus/<short-kebab-slug>`"+`.
|
|
b. Make the changes locally. Run the project's tests/build if they exist and are quick.
|
|
c. Commit with a clear message. If git complains about identity, use:
|
|
`+"`git -c user.name=Klaus -c user.email=klaus@bot.local commit ...`"+`
|
|
d. Push: `+"`git push -u origin <branch>`"+`.
|
|
e. Open a pull request via the gitea MCP targeting `+"`%s`"+`. Reference the originating issue/comment in the PR body (e.g. "Closes #%d" if it resolves the issue).
|
|
f. Post a short comment on the originating %s linking to the new PR.
|
|
|
|
# Constraints
|
|
|
|
- Do not act on anything beyond what the triggering content actually asked for.
|
|
- Never push to the default branch directly.
|
|
- Do not write "@Klaus" anywhere in comments or PR descriptions — it would cause a feedback loop.
|
|
- If the request is ambiguous or out of scope, post a comment asking for clarification rather than guessing.
|
|
- Be terse. Engineers reading this don't need preamble.
|
|
|
|
Now respond to the event.
|
|
`,
|
|
ev.Repository.FullName,
|
|
ev.Repository.DefaultBranch,
|
|
job.EventType,
|
|
ev.Action,
|
|
ev.Sender.Name(),
|
|
tr.Reason,
|
|
what,
|
|
tr.HTMLURL,
|
|
strings.TrimSpace(tr.Body),
|
|
workDir,
|
|
branchNote,
|
|
what,
|
|
ev.Repository.DefaultBranch,
|
|
tr.Number,
|
|
what,
|
|
)
|
|
return b.String()
|
|
}
|