diff --git a/README.md b/README.md index 3a4446a..d7792f7 100644 --- a/README.md +++ b/README.md @@ -1,241 +1,107 @@ - -

-

- - - Green Pullfrog logo -
- Pullfrog -

-

- Bring your favorite coding agent into GitHub -

-

+# shockbot -
+Self-hosted AI code review for Gitea, powered by Ollama. Tag `@shockbot` in a PR comment to trigger a review, or configure it to auto-review on every PR. -> **🚀 Pullfrog is now generally available!** [Get started →](https://pullfrog.com/console) +Based on [pullfrog](https://github.com/pullfrog/pullfrog) — simplified for self-hosted Gitea + Ollama setups. -
+## Requirements -## What is Pullfrog? +- Gitea instance +- Ollama instance reachable from your Gitea Actions runner +- A Gitea bot account with repo read/write access -Pullfrog is a GitHub bot that brings the full power of your favorite coding agents into GitHub. It's open source and powered by GitHub Actions. +## Setup -- **Tag `@pullfrog`** — Tag `@pullfrog` in a comment anywhere in your repo. It will pull in any relevant context using the action's internal MCP server and perform the appropriate task. -- **Prompt from the web** — Trigger arbitrary tasks from the Pullfrog dashboard -- **Automated triggers** — Configure Pullfrog to trigger agent runs in response to specific events. Each of these triggers can be associated with custom prompt instructions. - - issue created - - issue labeled - - PR created - - PR review created - - PR review requested - - and more... +### 1. Create a bot account -Pullfrog is the bridge between your preferred coding agents and GitHub. Use it for: +Create a Gitea account for the bot (e.g. `shockbot`) and generate an access token with `read:issue`, `write:issue`, `read:pull_request`, `write:pull_request` scopes. -- **🤖 Coding tasks** — Tell `@pullfrog` to implement something and it'll spin up a PR. If CI fails, it'll read the logs and attempt a fix automatically. It'll automatically address any PR reviews too. -- **🔍 PR review** — Coding agents are great at reviewing PRs. Using the "PR created" trigger, you can configure Pullfrog to auto-review new PRs. -- **🤙 Issue management** — Via the "issue created" trigger, Pullfrog can automatically respond to common questions, create implementation plans, and link to related issues/PRs. Or (if you're feeling lucky) you can prompt it to immediately attempt a PR addressing new issues. -- **Literally whatever** — Want to have the agent automatically add docs to all new PRs? Cut a new release with agent-written notes on every commit to `main`? Pullfrog lets you do it. +### 2. Add secrets to your repo - +| Secret | Description | +|--------|-------------| +| `BOT_TOKEN` | Gitea access token for the bot account | +| `OLLAMA_HOST` | URL of your Ollama instance (e.g. `http://192.168.1.10:11434`) | - - -## Standalone Usage - -You can also use `pullfrog/pullfrog` as a step in your own workflows. The action exposes a `result` output that can be consumed by subsequent steps. - -### Example: Auto-generate release notes on new tags - -```yaml -name: Release -on: - push: - tags: ['v*'] permissions: contents: write + pull-requests: write + issues: write jobs: - release: + review: + if: | + (github.event_name == 'pull_request' && !github.event.pull_request.draft) || + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@shockbot')) runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: - fetch-depth: 0 + fetch-depth: 1 - - name: Generate release notes - id: notes - uses: pullfrog/pullfrog@v0 + - name: Run shockbot (PR trigger) + if: github.event_name == 'pull_request' + uses: https://git.shockvpn.com/ShockVPN/shockbot@main with: - prompt: | - Generate release notes for ${{ github.ref_name }}. - Compare commits between this tag and the previous tag. - Format as markdown: summary paragraph, then ### Features, ### Fixes, ### Breaking Changes sections. - Omit empty sections. Be concise. + prompt: "Review this pull request" env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + BOT_TOKEN: ${{ secrets.BOT_TOKEN }} + OLLAMA_HOST: ${{ secrets.OLLAMA_HOST }} + GITEA_URL: https://git.shockvpn.com + GITEA_PR_NUMBER: ${{ github.event.pull_request.number }} + GITEA_PR_TITLE: ${{ github.event.pull_request.title }} - # write to file to avoid shell escaping issues with special characters - - name: Create GitHub release - run: | - notesfile="$RUNNER_TEMP/release-notes-$GITHUB_RUN_ID.md" - printf '%s' "$NOTES" > "$notesfile" - gh release create ${{ github.ref_name }} --title "${{ github.ref_name }}" --notes-file "$notesfile" + - name: Run shockbot (mention trigger) + if: github.event_name == 'issue_comment' + uses: https://git.shockvpn.com/ShockVPN/shockbot@main + with: + prompt: ${{ github.event.comment.body }} env: - GH_TOKEN: ${{ github.token }} - NOTES: ${{ steps.notes.outputs.result }} + BOT_TOKEN: ${{ secrets.BOT_TOKEN }} + OLLAMA_HOST: ${{ secrets.OLLAMA_HOST }} + GITEA_URL: https://git.shockvpn.com + GITEA_PR_NUMBER: ${{ github.event.issue.number }} ``` -### Example: Structured Output with Zod Schema +## Configuration -You can force the agent to return structured JSON output by providing a JSON schema. This allows you to reliably parse and use the agent's response in subsequent workflow steps. +Three values need to be configured — the rest come from the event context (as shown in the workflow example above) or are set automatically by Gitea Actions. -You can define your JSON schema directly or uou can use any validation library that converts to JSON Schema. Here's an example using [Zod](https://zod.dev): +| Secret / env var | Description | +|-----------------|-------------| +| `BOT_TOKEN` | Gitea access token for the bot account | +| `OLLAMA_HOST` | URL of your Ollama instance | +| `GITEA_URL` | URL of your Gitea instance | + +### Model + +Defaults to `qwen3.6:35b`. Override with the `model` input: ```yaml -name: Release Check -on: - pull_request: - types: [closed] - -jobs: - check-release: - if: github.event.pull_request.merged == true - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Install dependencies - run: npm install --no-save --no-package-lock zod @actions/core - - - name: Generate Schema - id: schema - run: | - node -e ' - import { z } from "zod"; - import { setOutput } from "@actions/core"; - const schema = z.object({ - version: z.string().describe("Semantic version number (e.g. 1.0.0)"), - isBreaking: z.boolean().describe("Whether this release contains breaking changes"), - changelog: z.array(z.string()).describe("List of changes in this release"), - }); - setOutput("schema", JSON.stringify(z.toJSONSchema(schema))); - ' - - - name: Analyze PR - id: analysis - uses: pullfrog/pullfrog@v0 - with: - prompt: | - Analyze this PR and determine semantic versioning impact. - Return a JSON object matching the provided schema. - output_schema: ${{ steps.schema.outputs.schema }} - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - - - name: Process Result - run: | - # Parse the JSON result using fromJSON() - echo "Version: ${{ fromJSON(steps.analysis.outputs.result).version }}" - echo "Breaking: ${{ fromJSON(steps.analysis.outputs.result).isBreaking }}" +with: + prompt: "Review this pull request" + model: "llama3.1:70b" ``` + +## Usage + +- **Auto-review on PR open** — the PR trigger fires automatically on new PRs +- **Manual trigger** — comment `@shockbot review` on any PR to trigger a review on demand +- **Custom prompt** — any comment mentioning `@shockbot` is passed as the prompt, so `@shockbot review focusing on security` works + +## License + +MIT. Based on [pullfrog/pullfrog](https://github.com/pullfrog/pullfrog), used under the MIT license.