Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 27 additions & 30 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,18 @@ post it on the board first, where others can vote on it.

## 1. Prerequisites

Follow the [Serverpod installation guide](https://docs.serverpod.dev/installation) to install
Install Flutter, Serverpod, and a frontier coding agent such as Codex, Claude Code, Antigravity,
or Cursor. The [Serverpod installation guide](https://docs.serverpod.dev/installation) covers
Flutter, Dart and what Serverpod needs on your machine. You also need:

- **Flutter** 3.47.5 (stable) or newer. The version CI uses is pinned in
`.github/workflows/tests.yml`.
- **An AI coding agent.** [Claude Code](https://claude.com/claude-code) is recommended; any agent
that reads `AGENTS.md` and can use MCP servers works.
- **A frontier coding agent** that reads `AGENTS.md` and can use MCP servers.
- Git and a GitHub account.

## 2. Install the Serverpod CLI
## 2. Get the right version of Serverpod

Use Dart's install command to make sure that you are using the right version of Serverpod:

```bash
dart install serverpod_cli 4.1.0-rc.1
Expand All @@ -50,7 +52,8 @@ page). The fork is your own copy: you push your changes to it and open the pull

## 4. Clone the repository

Clone your fork (replace `<you>` with your GitHub username) and get the packages:
Clone your fork to your local machine (replace `<you>` with your GitHub username) and get the
code:

```bash
git clone https://github.com/<you>/wonky.git
Expand All @@ -69,38 +72,32 @@ Its values are development defaults that work as they are (they are not secrets;
elsewhere). AI keys are optional: without them, the in-app assistant asks each user for their own
key, and the board skips its AI checks.

## 6. Run Wonky Work

```bash
serverpod start
```

Run it in `wonky_server`. It starts the development database, the server, applies migrations, watches for changes and hot
reloads. The apps are started on demand from its UI, or by your agent through the `serverpod` MCP
server. The repository configures it, together with the `dart` MCP server and the Flutter and
Serverpod skills, for Claude Code (`.mcp.json`, `.claude/`), Codex (`.codex/`, `.agents/`), Cursor
(`.cursor/`) and Antigravity (`.agents/`).
The apps run at http://localhost:8082/drive/ (and `/write/`, `/sheets/`, `/slides/`) once built,
or on their own dev ports when started from `serverpod start`.

Sign up with any email: in development the verification code is printed in the server log.
## 6. Pick a task

## 7. Build the task

1. On the task page, press **Claim this task**. Note your claim code (for example `7Q4F-K2M9`).
2. Create a branch in your fork.
1. Claim a task under [Up for grabs](https://wonky.work/improvements/tasks): on the task page,
press **Claim this task**. Note your claim code (for example `7Q4F-K2M9`).
2. Start your agent with the `wonky` folder (the repository root) as its working directory.
3. Copy the task's prompt (**Copy prompt**) and give it to your agent. The prompt points the agent
at `AGENTS.md` and the specs, which are the source of truth.
at `AGENTS.md` and the specs, which are the source of truth. Let the agent do its job.
4. Review what the agent did, run the app, and check the acceptance criteria yourself.
5. Run the checklist from `AGENTS.md`: `dart analyze`, `dart format`, and the tests of the
packages you changed.

You don't need to start the server yourself: the agent starts it, together with the development
database, through the `serverpod` MCP server, and starts the apps the same way. The repository
configures it, together with the `dart` MCP server and the Flutter and Serverpod skills, for
Claude Code (`.mcp.json`, `.claude/`), Codex (`.codex/`, `.agents/`), Cursor (`.cursor/`) and
Antigravity (`.agents/`). To watch it or start an app by hand, run `serverpod start` in
`wonky_server`; it attaches to the running server. Sign up with any email: in development the
verification code is printed in the server log.

You can **release** a claim at any time if you can't finish. Two active claims per person at a
time.

## 8. Open the pull request
## 7. Open a pull request

Open it against `main`. The description must contain exactly one of each line:
Your agent will help you open a pull request towards
[serverpod/wonky](https://github.com/serverpod/wonky/pulls), from a branch in your fork against
`main`. Before it does, it runs the checklist from `AGENTS.md`: `dart analyze`, `dart format`, and
the tests of the packages you changed. The description must contain exactly one of each line:

```
Wonky-Task: T-12
Expand All @@ -116,7 +113,7 @@ Add a short summary of how each acceptance criterion is met (the PR template has
advisory; maintainers make the call.
- The normal CI (analyze, format, tests) must pass.

## 9. Sign the CLA and follow up
## 8. Sign the CLA and follow up

If you haven't signed the Serverpod Contributor License Agreement (CLA) yet, sign it on GitHub:
the CLA Assistant bot comments on your pull request, and you reply with the line from
Expand Down
48 changes: 29 additions & 19 deletions packages/wonky_app/lib/l10n/wonky_app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -2805,19 +2805,30 @@
"boardAddPosts": "Add issues…",
"boardFieldPostNumbers": "Issue numbers",
"boardHowToBuild": "How to build it",
"boardStepSetupNumber": "1.",
"@boardStepSetupNumber": {
"description": "The number of the first step of How to build it, before the link boardStepSetupLink."
"boardStepSetup": "1. Read the {guide} and set up your development environment",
"@boardStepSetup": {
"description": "Step 1 of How to build it. {guide} is the link boardStepSetupLink to the How to contribute page.",
"placeholders": {
"guide": {
"type": "String"
}
}
},
"boardStepSetupLink": "Set up your development environment",
"boardStepSetupLink": "contribution guide",
"@boardStepSetupLink": {
"description": "Step 1 of How to build it: a link to the How to contribute page."
"description": "The link in boardStepSetup: opens the How to contribute page."
},
"boardInstallTools": "Install Flutter, Dart and the Serverpod CLI:",
"boardInstallGuide": "Serverpod installation guide",
"boardStepPrompt": "2. Give your coding agent the prompt",
"boardStepPr": "3. Open a pull request",
"boardStepPromptLocked": "2. Give your coding agent the prompt (claim the task to get the prompt).",
"boardStepClaim": "2. Claim the task to get a prompt",
"@boardStepClaim": {
"description": "Step 2 of How to build it for everyone but the claimant and admins, while the task is up for grabs."
},
"boardStepPaste": "3. Paste the prompt into your AI agent using a frontier model",
"@boardStepPaste": {
"description": "Step 3 of How to build it for everyone but the claimant and admins, while the task is up for grabs."
},
"boardPrRules": "One task per pull request, against main. Put these two lines in its description:",
"boardPullRequest": "Pull request",
"boardPrNumber": "Pull request #{number}",
Expand Down Expand Up @@ -2846,24 +2857,23 @@
"boardContributeTitle": "How to contribute",
"boardContributeIntro": "Anyone can build a task that is up for grabs. Claim it, let a coding agent do the work with the task's prompt, and open a pull request.",
"boardContribStep1Title": "Get the tools",
"boardContribStep1": "Install Flutter, Dart and the Serverpod CLI, and an AI coding agent that reads AGENTS.md, such as Claude Code.",
"boardContribStep2Title": "Install or update the Serverpod CLI",
"boardContribStep2": "It runs the server and the apps. The same command updates an installed CLI to this version. Add Dart's install directory to your PATH if serverpod is not found.",
"boardContribStep1": "Install Flutter, Serverpod, and a frontier coding agent such as Codex, Claude Code, Antigravity, or Cursor.",
"boardContribStep2Title": "Get the right version of Serverpod",
"boardContribStep2": "Use Dart's install command to make sure that we are using the right version of Serverpod.",
"boardContribStep3Title": "Fork the repository",
"boardContribStep3": "Create your own copy of the repository on GitHub. You push your changes to your fork and open the pull request from there.",
"boardContribForkLink": "Fork on GitHub",
"boardContribStep4Title": "Clone the repository",
"boardContribStep4": "Clone your fork to your machine (replace <you> with your GitHub username) and get the packages.",
"boardContribStep4": "Clone your fork to your local machine (replace <you> with your GitHub username) and get the code.",
"boardContribStep5Title": "Configure the server",
"boardContribStep5": "Create your passwords file in wonky_server. Its development values work as they are; AI keys are optional.",
"boardContribStep6Title": "Start the server",
"boardContribStep6": "Run it in wonky_server: it starts the development database, applies the migrations and hot reloads. Start an app from its UI or let your agent do it through the serverpod MCP server (.mcp.json is in the repository). Sign up with any email; in development the code is in the server log.",
"boardContribStep7Title": "Pick a task",
"boardContribStep7": "Claim a task under Up for grabs, paste its prompt into your agent and review the result.",
"boardContribStep8Title": "Open a pull request",
"boardContribStep8": "One task per pull request. The description contains the Wonky-Task and Wonky-Claim lines from the task page. Pull requests without a valid task are closed after 7 days.",
"boardContribStep9Title": "Sign the CLA and follow up",
"boardContribStep9": "If you haven't signed the Serverpod contributor license agreement (CLA) yet, sign it on GitHub: the CLA Assistant bot asks for it on your pull request, and you reply with the line below. You sign it once. Then check back once your pull request has been reviewed, and fix any issues the review points out.",
"boardContribStep6Title": "Pick a task",
"boardContribStep6": "Claim a task under Up for grabs, make sure you have wonky as the agent's working directory, let the agent do its job and review the result.",
"boardContribStep7Title": "Open a pull request",
"boardContribStep7": "Your agent will help you open a pull request towards Wonky's repository.",
"boardContribPullRequests": "View pull requests",
"boardContribStep8Title": "Sign the CLA and follow up",
"boardContribStep8": "If you haven't signed the Serverpod contributor license agreement (CLA) yet, sign it on GitHub: the CLA Assistant bot asks for it on your pull request, and you reply with the line below. You sign it once. Then check back once your pull request has been reviewed, and fix any issues the review points out.",
"boardContribLicense": "Contributions are accepted under the repository's BSD-3-Clause license.",
"boardContribSecurity": "Found a security issue? Email {email}. Never post it on the board or in a pull request.",
"@boardContribSecurity": {
Expand Down
31 changes: 15 additions & 16 deletions packages/wonky_app/lib/l10n/wonky_app_en_XA.arb
Original file line number Diff line number Diff line change
Expand Up @@ -1184,13 +1184,13 @@
"boardAddPosts": "[Åðð îššûéš… one]",
"boardFieldPostNumbers": "[Κšûé ñûɱƀéŕš one t]",
"boardHowToBuild": "[Ĥöŵ ţö ƀûîļð îţ one t]",
"boardStepSetupNumber": "[1. o]",
"boardStepSetupLink": "[Šéţ ûþ ýöûŕ ðéṽéļöþɱéñţ éñṽîŕöñɱéñţ one two thr]",
"boardInstallTools": "[Îñšţåļļ Ƒļûţţéŕ, Ðåŕţ åñð ţĥé Šéŕṽéŕþöð ÇĻÎ: one two three]",
"boardStepSetup": "[1. Ŕéåð ţĥé {guide} åñð šéţ ûþ ýöûŕ ðéṽéļöþɱéñţ éñṽîŕöñɱéñţ one two three fo]",
"boardStepSetupLink": "[çöñţŕîƀûţîöñ ĝûîðé one tw]",
"boardInstallGuide": "[Šéŕṽéŕþöð îñšţåļļåţîöñ ĝûîðé one two th]",
"boardStepPrompt": "[2. Ĝîṽé ýöûŕ çöðîñĝ åĝéñţ ţĥé þŕöɱþţ one two thr]",
"boardStepPr": "[3. Öþéñ å þûļļ ŕéǫûéšţ one two]",
"boardStepPromptLocked": "[2. Ĝîṽé ýöûŕ çöðîñĝ åĝéñţ ţĥé þŕöɱþţ (çļåîɱ ţĥé ţåšķ ţö ĝéţ ţĥé þŕöɱþţ). one two three four fi]",
"boardStepClaim": "[2. Çļåîɱ ţĥé ţåšķ ţö ĝéţ å þŕöɱþţ one two th]",
"boardStepPaste": "[3. Þåšţé ţĥé þŕöɱþţ îñţö ýöûŕ ÅÎ åĝéñţ ûšîñĝ å ƒŕöñţîéŕ ɱöðéļ one two three four]",
"boardPrRules": "[Öñé ţåšķ þéŕ þûļļ ŕéǫûéšţ, åĝåîñšţ ɱåîñ. Þûţ ţĥéšé ţŵö ļîñéš îñ îţš ðéšçŕîþţîöñ: one two three four five]",
"boardPullRequest": "[Þûļļ ŕéǫûéšţ one]",
"boardPrNumber": "[Þûļļ ŕéǫûéšţ #{number} one t]",
Expand All @@ -1202,24 +1202,23 @@
"boardContributeTitle": "[Ĥöŵ ţö çöñţŕîƀûţé one tw]",
"boardContributeIntro": "[Åñýöñé çåñ ƀûîļð å ţåšķ ţĥåţ îš ûþ ƒöŕ ĝŕåƀš. Çļåîɱ îţ, ļéţ å çöðîñĝ åĝéñţ ðö ţĥé ŵöŕķ ŵîţĥ ţĥé ţåšķ'š þŕöɱþţ, åñð öþéñ å þûļļ ŕéǫûéšţ. one two three four five six seven eigh]",
"boardContribStep1Title": "[Ĝéţ ţĥé ţööļš one]",
"boardContribStep1": "[Îñšţåļļ Ƒļûţţéŕ, Ðåŕţ åñð ţĥé Šéŕṽéŕþöð ÇĻÎ, åñð åñ ÅÎ çöðîñĝ åĝéñţ ţĥåţ ŕéåðš ÅĜÉÑŢŠ.ɱð, šûçĥ åš Çļåûðé Çöðé. one two three four five six seven]",
"boardContribStep2Title": "[Îñšţåļļ öŕ ûþðåţé ţĥé Šéŕṽéŕþöð ÇĻÎ one two thr]",
"boardContribStep2": "[Îţ ŕûñš ţĥé šéŕṽéŕ åñð ţĥé åþþš. Ţĥé šåɱé çöɱɱåñð ûþðåţéš åñ îñšţåļļéð ÇĻÎ ţö ţĥîš ṽéŕšîöñ. Åðð Ðåŕţ'š îñšţåļļ ðîŕéçţöŕý ţö ýöûŕ ÞÅŢĤ îƒ šéŕṽéŕþöð îš ñöţ ƒöûñð. one two three four five six seven eight nine te]",
"boardContribStep1": "[Îñšţåļļ Ƒļûţţéŕ, Šéŕṽéŕþöð, åñð å ƒŕöñţîéŕ çöðîñĝ åĝéñţ šûçĥ åš Çöðéẋ, Çļåûðé Çöðé, Åñţîĝŕåṽîţý, öŕ Çûŕšöŕ. one two three four five six seven]",
"boardContribStep2Title": "[Ĝéţ ţĥé ŕîĝĥţ ṽéŕšîöñ öƒ Šéŕṽéŕþöð one two thr]",
"boardContribStep2": "[Ûšé Ðåŕţ'š îñšţåļļ çöɱɱåñð ţö ɱåķé šûŕé ţĥåţ ŵé åŕé ûšîñĝ ţĥé ŕîĝĥţ ṽéŕšîöñ öƒ Šéŕṽéŕþöð. one two three four five si]",
"boardContribStep3Title": "[Ƒöŕķ ţĥé ŕéþöšîţöŕý one tw]",
"boardContribStep3": "[Çŕéåţé ýöûŕ öŵñ çöþý öƒ ţĥé ŕéþöšîţöŕý öñ ĜîţĤûƀ. Ýöû þûšĥ ýöûŕ çĥåñĝéš ţö ýöûŕ ƒöŕķ åñð öþéñ ţĥé þûļļ ŕéǫûéšţ ƒŕöɱ ţĥéŕé. one two three four five six seven e]",
"boardContribForkLink": "[Ƒöŕķ öñ ĜîţĤûƀ one t]",
"boardContribStep4Title": "[Çļöñé ţĥé ŕéþöšîţöŕý one two]",
"boardContribStep4": "[Çļöñé ýöûŕ ƒöŕķ ţö ýöûŕ ɱåçĥîñé (ŕéþļåçé <ýöû> ŵîţĥ ýöûŕ ĜîţĤûƀ ûšéŕñåɱé) åñð ĝéţ ţĥé þåçķåĝéš. one two three four five six]",
"boardContribStep4": "[Çļöñé ýöûŕ ƒöŕķ ţö ýöûŕ ļöçåļ ɱåçĥîñé (ŕéþļåçé <ýöû> ŵîţĥ ýöûŕ ĜîţĤûƀ ûšéŕñåɱé) åñð ĝéţ ţĥé çöðé. one two three four five six s]",
"boardContribStep5Title": "[Çöñƒîĝûŕé ţĥé šéŕṽéŕ one two]",
"boardContribStep5": "[Çŕéåţé ýöûŕ þåššŵöŕðš ƒîļé îñ ŵöñķý_šéŕṽéŕ. Îţš ðéṽéļöþɱéñţ ṽåļûéš ŵöŕķ åš ţĥéý åŕé; ÅÎ ķéýš åŕé öþţîöñåļ. one two three four five six seve]",
"boardContribStep6Title": "[Šţåŕţ ţĥé šéŕṽéŕ one t]",
"boardContribStep6": "[Ŕûñ îţ îñ ŵöñķý_šéŕṽéŕ: îţ šţåŕţš ţĥé ðéṽéļöþɱéñţ ðåţåƀåšé, åþþļîéš ţĥé ɱîĝŕåţîöñš åñð ĥöţ ŕéļöåðš. Šţåŕţ åñ åþþ ƒŕöɱ îţš ÛÎ öŕ ļéţ ýöûŕ åĝéñţ ðö îţ ţĥŕöûĝĥ ţĥé šéŕṽéŕþöð ṀÇÞ šéŕṽéŕ (.ɱçþ.ĵšöñ îš îñ ţĥé ŕéþöšîţöŕý). Šîĝñ ûþ ŵîţĥ åñý éɱåîļ; îñ ðéṽéļöþɱéñţ ţĥé çöðé îš îñ ţĥé šéŕṽéŕ ļöĝ. one two three four five six seven eight nine ten one two three four five six seven]",
"boardContribStep7Title": "[Þîçķ å ţåšķ one]",
"boardContribStep7": "[Çļåîɱ å ţåšķ ûñðéŕ Ûþ ƒöŕ ĝŕåƀš, þåšţé îţš þŕöɱþţ îñţö ýöûŕ åĝéñţ åñð ŕéṽîéŵ ţĥé ŕéšûļţ. one two three four five si]",
"boardContribStep8Title": "[Öþéñ å þûļļ ŕéǫûéšţ one tw]",
"boardContribStep8": "[Öñé ţåšķ þéŕ þûļļ ŕéǫûéšţ. Ţĥé ðéšçŕîþţîöñ çöñţåîñš ţĥé Ŵöñķý-Ţåšķ åñð Ŵöñķý-Çļåîɱ ļîñéš ƒŕöɱ ţĥé ţåšķ þåĝé. Þûļļ ŕéǫûéšţš ŵîţĥöûţ å ṽåļîð ţåšķ åŕé çļöšéð åƒţéŕ 7 ðåýš. one two three four five six seven eight nine ten o]",
"boardContribStep9Title": "[Šîĝñ ţĥé ÇĻÅ åñð ƒöļļöŵ ûþ one two]",
"boardContribStep9": "[΃ ýöû ĥåṽéñ'ţ šîĝñéð ţĥé Šéŕṽéŕþöð çöñţŕîƀûţöŕ ļîçéñšé åĝŕééɱéñţ (ÇĻÅ) ýéţ, šîĝñ îţ öñ ĜîţĤûƀ: ţĥé ÇĻÅ Åššîšţåñţ ƀöţ åšķš ƒöŕ îţ öñ ýöûŕ þûļļ ŕéǫûéšţ, åñð ýöû ŕéþļý ŵîţĥ ţĥé ļîñé ƀéļöŵ. Ýöû šîĝñ îţ öñçé. Ţĥéñ çĥéçķ ƀåçķ öñçé ýöûŕ þûļļ ŕéǫûéšţ ĥåš ƀééñ ŕéṽîéŵéð, åñð ƒîẋ åñý îššûéš ţĥé ŕéṽîéŵ þöîñţš öûţ. one two three four five six seven eight nine ten one two three four five six seven eight]",
"boardContribStep6Title": "[Þîçķ å ţåšķ one]",
"boardContribStep6": "[Çļåîɱ å ţåšķ ûñðéŕ Ûþ ƒöŕ ĝŕåƀš, ɱåķé šûŕé ýöû ĥåṽé ŵöñķý åš ţĥé åĝéñţ'š ŵöŕķîñĝ ðîŕéçţöŕý, ļéţ ţĥé åĝéñţ ðö îţš ĵöƀ åñð ŕéṽîéŵ ţĥé ŕéšûļţ. one two three four five six seven eight]",
"boardContribStep7Title": "[Öþéñ å þûļļ ŕéǫûéšţ one tw]",
"boardContribStep7": "[Ýöûŕ åĝéñţ ŵîļļ ĥéļþ ýöû öþéñ å þûļļ ŕéǫûéšţ ţöŵåŕðš Ŵöñķý'š ŕéþöšîţöŕý. one two three four fiv]",
"boardContribPullRequests": "[Ṽîéŵ þûļļ ŕéǫûéšţš one tw]",
"boardContribStep8Title": "[Šîĝñ ţĥé ÇĻÅ åñð ƒöļļöŵ ûþ one two]",
"boardContribStep8": "[΃ ýöû ĥåṽéñ'ţ šîĝñéð ţĥé Šéŕṽéŕþöð çöñţŕîƀûţöŕ ļîçéñšé åĝŕééɱéñţ (ÇĻÅ) ýéţ, šîĝñ îţ öñ ĜîţĤûƀ: ţĥé ÇĻÅ Åššîšţåñţ ƀöţ åšķš ƒöŕ îţ öñ ýöûŕ þûļļ ŕéǫûéšţ, åñð ýöû ŕéþļý ŵîţĥ ţĥé ļîñé ƀéļöŵ. Ýöû šîĝñ îţ öñçé. Ţĥéñ çĥéçķ ƀåçķ öñçé ýöûŕ þûļļ ŕéǫûéšţ ĥåš ƀééñ ŕéṽîéŵéð, åñð ƒîẋ åñý îššûéš ţĥé ŕéṽîéŵ þöîñţš öûţ. one two three four five six seven eight nine ten one two three four five six seven eight]",
"boardContribLicense": "[Çöñţŕîƀûţîöñš åŕé åççéþţéð ûñðéŕ ţĥé ŕéþöšîţöŕý'š ƁŠÐ-3-Çļåûšé ļîçéñšé. one two three four five]",
"boardContribSecurity": "[Ƒöûñð å šéçûŕîţý îššûé? Éɱåîļ {email}. Ñéṽéŕ þöšţ îţ öñ ţĥé ƀöåŕð öŕ îñ å þûļļ ŕéǫûéšţ. one two three four five]",
"boardContributeGuide": "[Ƒûļļ ĝûîðé öñ ĜîţĤûƀ one tw]",
Expand Down
2 changes: 1 addition & 1 deletion packages/wonky_app/lib/src/board/pages/board_chrome.dart
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ class BoardTopActions extends StatelessWidget {
if (showContribute)
(
'board.howToContribute',
LucideIcons.gitPullRequest,
LucideIcons.wrench,
l.boardContributeLink,
() => boardOpenContribute(s),
),
Expand Down
Loading
Loading