pullfrog 0.0.1 → 0.0.195-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +247 -0
- package/dist/cli.mjs +153651 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/internal.d.ts +1 -0
- package/dist/internal.js +1 -0
- package/package.json +91 -20
- package/index.d.ts +0 -1
- package/index.js +0 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pullfrog, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
<!-- test preview system -->
|
|
2
|
+
<p align="center">
|
|
3
|
+
<h1 align="center">
|
|
4
|
+
<picture>
|
|
5
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://pullfrog.com/frog-white-200px.png">
|
|
6
|
+
<img src="https://pullfrog.com/frog-green-200px.png" width="25px" align="center" alt="Green Pullfrog logo" />
|
|
7
|
+
</picture><br />
|
|
8
|
+
Pullfrog
|
|
9
|
+
</h1>
|
|
10
|
+
<p align="center">
|
|
11
|
+
Bring your favorite coding agent into GitHub
|
|
12
|
+
</p>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<br/>
|
|
16
|
+
|
|
17
|
+
> **🚀 Pullfrog is in beta!** We're onboarding users in waves. [Get on the waitlist →](https://pullfrog.com/join-waitlist)
|
|
18
|
+
|
|
19
|
+
<br/>
|
|
20
|
+
|
|
21
|
+
## What is Pullfrog?
|
|
22
|
+
|
|
23
|
+
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.
|
|
24
|
+
|
|
25
|
+
- **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.
|
|
26
|
+
- **Prompt from the web** — Trigger arbitrary tasks from the Pullfrog dashboard
|
|
27
|
+
- **Automated triggers** — Configure Pullfrog to trigger agent runs in response to specific events. Each of these triggers can be associated with custom prompt instructions.
|
|
28
|
+
- issue created
|
|
29
|
+
- issue labeled
|
|
30
|
+
- PR created
|
|
31
|
+
- PR review created
|
|
32
|
+
- PR review requested
|
|
33
|
+
- and more...
|
|
34
|
+
|
|
35
|
+
Pullfrog is the bridge between your preferred coding agents and GitHub. Use it for:
|
|
36
|
+
|
|
37
|
+
- **🤖 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.
|
|
38
|
+
- **🔍 PR review** — Coding agents are great at reviewing PRs. Using the "PR created" trigger, you can configure Pullfrog to auto-review new PRs.
|
|
39
|
+
- **🤙 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.
|
|
40
|
+
- **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.
|
|
41
|
+
|
|
42
|
+
<!-- Features
|
|
43
|
+
- **Agent-agnostic** — Switch between agents with the click of a radio button.
|
|
44
|
+
- ** -->
|
|
45
|
+
|
|
46
|
+
<!--
|
|
47
|
+
## Get started
|
|
48
|
+
|
|
49
|
+
Install the Pullfrog GitHub App on your personal or organization account. During installation you can choose to limit access to a specific repo or repos. After installation, you'll be redirected to the Pullfrog dashboard where you'll see an onboarding flow. This flow will create your `pullfrog.yml` workflow and prompt you to set up API keys. Once you finish those steps (2 minutes) you're ready to rock.
|
|
50
|
+
|
|
51
|
+
[Add to GitHub ➜](https://github.com/apps/pullfrog/installations/new)
|
|
52
|
+
|
|
53
|
+
<details>
|
|
54
|
+
<summary><strong>Manual setup instructions</strong></summary>
|
|
55
|
+
|
|
56
|
+
You can also use the `pullfrog/pullfrog` Action without a GitHub App installation. This is more time-consuming to set up, and it places limitations on the actions your Agent will be capable of performing.
|
|
57
|
+
|
|
58
|
+
To manually set up the Pullfrog action, you need to set up two workflow files in your repository: `pullfrog.yml` (the execution logic) and `triggers.yml` (the event triggers).
|
|
59
|
+
|
|
60
|
+
#### 1. Create `pullfrog.yml`
|
|
61
|
+
|
|
62
|
+
Create a file at `.github/workflows/pullfrog.yml`. This is a reusable workflow that runs the Pullfrog action.
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
# PULLFROG ACTION — DO NOT EDIT EXCEPT WHERE INDICATED
|
|
66
|
+
name: Pullfrog
|
|
67
|
+
on:
|
|
68
|
+
workflow_dispatch:
|
|
69
|
+
inputs:
|
|
70
|
+
prompt:
|
|
71
|
+
type: string
|
|
72
|
+
description: 'Agent prompt'
|
|
73
|
+
|
|
74
|
+
permissions:
|
|
75
|
+
id-token: write
|
|
76
|
+
contents: write
|
|
77
|
+
pull-requests: write
|
|
78
|
+
issues: write
|
|
79
|
+
actions: read
|
|
80
|
+
checks: read
|
|
81
|
+
|
|
82
|
+
jobs:
|
|
83
|
+
pullfrog:
|
|
84
|
+
runs-on: ubuntu-latest
|
|
85
|
+
steps:
|
|
86
|
+
- name: Checkout code
|
|
87
|
+
uses: actions/checkout@v6
|
|
88
|
+
with:
|
|
89
|
+
fetch-depth: 1
|
|
90
|
+
- name: Run agent
|
|
91
|
+
uses: pullfrog/pullfrog@v0
|
|
92
|
+
with:
|
|
93
|
+
prompt: ${{ inputs.prompt }}
|
|
94
|
+
env:
|
|
95
|
+
# add API keys for the LLM provider(s) you want to use
|
|
96
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
97
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
98
|
+
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
|
|
99
|
+
XAI_API_KEY: ${{ secrets.XAI_API_KEY }}
|
|
100
|
+
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
|
|
101
|
+
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
|
|
102
|
+
MOONSHOT_API_KEY: ${{ secrets.MOONSHOT_API_KEY }}
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### 2. Create `triggers.yml`
|
|
107
|
+
|
|
108
|
+
Create a file at `.github/workflows/triggers.yml`. This workflow listens for GitHub events and calls the `pullfrog.yml` workflow with the event data.
|
|
109
|
+
|
|
110
|
+
```yaml
|
|
111
|
+
name: Agent Triggers
|
|
112
|
+
|
|
113
|
+
on:
|
|
114
|
+
issue_comment:
|
|
115
|
+
types: [created]
|
|
116
|
+
pull_request_review_comment:
|
|
117
|
+
types: [created]
|
|
118
|
+
issues:
|
|
119
|
+
types: [opened, assigned]
|
|
120
|
+
pull_request_review:
|
|
121
|
+
types: [submitted]
|
|
122
|
+
# add other triggers as needed
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
jobs:
|
|
126
|
+
pullfrog:
|
|
127
|
+
|
|
128
|
+
# trigger conditions (e.g. only run if @pullfrog is mentioned)
|
|
129
|
+
if: contains(github.event.comment.body, '@pullfrog') || contains(github.event.issue.body, '@pullfrog')
|
|
130
|
+
|
|
131
|
+
permissions:
|
|
132
|
+
id-token: write
|
|
133
|
+
contents: write
|
|
134
|
+
issues: write
|
|
135
|
+
pull-requests: write
|
|
136
|
+
actions: read
|
|
137
|
+
checks: read
|
|
138
|
+
uses: ./.github/workflows/pullfrog.yml
|
|
139
|
+
with:
|
|
140
|
+
# pass the full event payload as the prompt
|
|
141
|
+
prompt: ${{ toJSON(github.event) }}
|
|
142
|
+
secrets: inherit
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
</details>
|
|
146
|
+
-->
|
|
147
|
+
|
|
148
|
+
## Standalone Usage
|
|
149
|
+
|
|
150
|
+
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.
|
|
151
|
+
|
|
152
|
+
### Example: Auto-generate release notes on new tags
|
|
153
|
+
|
|
154
|
+
```yaml
|
|
155
|
+
name: Release
|
|
156
|
+
on:
|
|
157
|
+
push:
|
|
158
|
+
tags: ['v*']
|
|
159
|
+
|
|
160
|
+
permissions:
|
|
161
|
+
contents: write
|
|
162
|
+
|
|
163
|
+
jobs:
|
|
164
|
+
release:
|
|
165
|
+
runs-on: ubuntu-latest
|
|
166
|
+
steps:
|
|
167
|
+
- name: Checkout
|
|
168
|
+
uses: actions/checkout@v4
|
|
169
|
+
with:
|
|
170
|
+
fetch-depth: 0
|
|
171
|
+
|
|
172
|
+
- name: Generate release notes
|
|
173
|
+
id: notes
|
|
174
|
+
uses: pullfrog/pullfrog@v0
|
|
175
|
+
with:
|
|
176
|
+
prompt: |
|
|
177
|
+
Generate release notes for ${{ github.ref_name }}.
|
|
178
|
+
Compare commits between this tag and the previous tag.
|
|
179
|
+
Format as markdown: summary paragraph, then ### Features, ### Fixes, ### Breaking Changes sections.
|
|
180
|
+
Omit empty sections. Be concise.
|
|
181
|
+
env:
|
|
182
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
183
|
+
|
|
184
|
+
# write to file to avoid shell escaping issues with special characters
|
|
185
|
+
- name: Create GitHub release
|
|
186
|
+
run: |
|
|
187
|
+
notesfile="$RUNNER_TEMP/release-notes-$GITHUB_RUN_ID.md"
|
|
188
|
+
printf '%s' "$NOTES" > "$notesfile"
|
|
189
|
+
gh release create ${{ github.ref_name }} --title "${{ github.ref_name }}" --notes-file "$notesfile"
|
|
190
|
+
env:
|
|
191
|
+
GH_TOKEN: ${{ github.token }}
|
|
192
|
+
NOTES: ${{ steps.notes.outputs.result }}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Example: Structured Output with Zod Schema
|
|
196
|
+
|
|
197
|
+
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.
|
|
198
|
+
|
|
199
|
+
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):
|
|
200
|
+
|
|
201
|
+
```yaml
|
|
202
|
+
name: Release Check
|
|
203
|
+
on:
|
|
204
|
+
pull_request:
|
|
205
|
+
types: [closed]
|
|
206
|
+
|
|
207
|
+
jobs:
|
|
208
|
+
check-release:
|
|
209
|
+
if: github.event.pull_request.merged == true
|
|
210
|
+
runs-on: ubuntu-latest
|
|
211
|
+
steps:
|
|
212
|
+
- uses: actions/checkout@v4
|
|
213
|
+
|
|
214
|
+
- name: Install dependencies
|
|
215
|
+
run: npm install --no-save --no-package-lock zod @actions/core
|
|
216
|
+
|
|
217
|
+
- name: Generate Schema
|
|
218
|
+
id: schema
|
|
219
|
+
run: |
|
|
220
|
+
node -e '
|
|
221
|
+
import { z } from "zod";
|
|
222
|
+
import { setOutput } from "@actions/core";
|
|
223
|
+
const schema = z.object({
|
|
224
|
+
version: z.string().describe("Semantic version number (e.g. 1.0.0)"),
|
|
225
|
+
isBreaking: z.boolean().describe("Whether this release contains breaking changes"),
|
|
226
|
+
changelog: z.array(z.string()).describe("List of changes in this release"),
|
|
227
|
+
});
|
|
228
|
+
setOutput("schema", JSON.stringify(z.toJSONSchema(schema)));
|
|
229
|
+
'
|
|
230
|
+
|
|
231
|
+
- name: Analyze PR
|
|
232
|
+
id: analysis
|
|
233
|
+
uses: pullfrog/pullfrog@v0
|
|
234
|
+
with:
|
|
235
|
+
prompt: |
|
|
236
|
+
Analyze this PR and determine semantic versioning impact.
|
|
237
|
+
Return a JSON object matching the provided schema.
|
|
238
|
+
output_schema: ${{ steps.schema.outputs.schema }}
|
|
239
|
+
env:
|
|
240
|
+
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
241
|
+
|
|
242
|
+
- name: Process Result
|
|
243
|
+
run: |
|
|
244
|
+
# Parse the JSON result using fromJSON()
|
|
245
|
+
echo "Version: ${{ fromJSON(steps.analysis.outputs.result).version }}"
|
|
246
|
+
echo "Breaking: ${{ fromJSON(steps.analysis.outputs.result).isBreaking }}"
|
|
247
|
+
```
|