@buda-ai/connector 0.1.1 → 0.1.4
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/README.md +29 -6
- package/agent-templates/scripts/skill-scanner.sh +125 -0
- package/agent-templates/shared/AGENTS.md +220 -0
- package/agent-templates/shared/BOOTSTRAP.md +15 -0
- package/agent-templates/shared/HEARTBEAT.md +5 -0
- package/agent-templates/shared/IDENTITY.md +29 -0
- package/agent-templates/shared/MEMORY.md +19 -0
- package/agent-templates/shared/SOUL.md +43 -0
- package/agent-templates/shared/TOOLS.md +85 -0
- package/agent-templates/shared/USER.md +23 -0
- package/agent-templates/system-skills/app-builder/README.md +8 -0
- package/agent-templates/system-skills/app-builder/SKILL.md +678 -0
- package/agent-templates/system-skills/app-builder/buda.app.schema.json +165 -0
- package/agent-templates/system-skills/app-builder/evals/evals.json +23 -0
- package/agent-templates/system-skills/app-builder/scripts/check-preview-url.mjs +184 -0
- package/agent-templates/system-skills/buda-automations/SKILL.md +175 -0
- package/agent-templates/system-skills/buda-automations/scripts/create-automation.sh +226 -0
- package/agent-templates/system-skills/buda-automations/scripts/delete-automation.sh +73 -0
- package/agent-templates/system-skills/buda-automations/scripts/list-automations.sh +77 -0
- package/agent-templates/system-skills/buda-far/SKILL.md +221 -0
- package/agent-templates/system-skills/buda-far/far_gen.py +1499 -0
- package/agent-templates/system-skills/buda-machine-info/SKILL.md +67 -0
- package/agent-templates/system-skills/buda-machine-info/scripts/get-info.sh +25 -0
- package/agent-templates/system-skills/buda-machine-info/scripts/send-file.mjs +62 -0
- package/agent-templates/system-skills/buda-web-preview/SKILL.md +462 -0
- package/agent-templates/system-skills/find-skills/SKILL.md +142 -0
- package/agent-templates/system-skills/skill-creator/LICENSE.txt +202 -0
- package/agent-templates/system-skills/skill-creator/SKILL.md +479 -0
- package/agent-templates/system-skills/skill-creator/agents/analyzer.md +274 -0
- package/agent-templates/system-skills/skill-creator/agents/comparator.md +202 -0
- package/agent-templates/system-skills/skill-creator/agents/grader.md +223 -0
- package/agent-templates/system-skills/skill-creator/assets/eval_review.html +146 -0
- package/agent-templates/system-skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/agent-templates/system-skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/agent-templates/system-skills/skill-creator/references/schemas.md +430 -0
- package/agent-templates/system-skills/skill-creator/scripts/__init__.py +0 -0
- package/agent-templates/system-skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/agent-templates/system-skills/skill-creator/scripts/generate_report.py +326 -0
- package/agent-templates/system-skills/skill-creator/scripts/improve_description.py +248 -0
- package/agent-templates/system-skills/skill-creator/scripts/package_skill.py +136 -0
- package/agent-templates/system-skills/skill-creator/scripts/quick_validate.py +103 -0
- package/agent-templates/system-skills/skill-creator/scripts/run_eval.py +310 -0
- package/agent-templates/system-skills/skill-creator/scripts/run_loop.py +332 -0
- package/agent-templates/system-skills/skill-creator/scripts/utils.py +47 -0
- package/dist/cli.js +2807 -183
- package/package.json +10 -6
|
@@ -0,0 +1,678 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web-app-builder
|
|
3
|
+
description: "Use this skill whenever the user wants to build, scaffold, modify, debug, or ship a web application, including React/Vite/Next.js/Vue/Svelte apps, full-stack prototypes, dashboards, landing pages with interactivity, games, admin panels, CRUD apps, API-backed UIs, authentication flows, database-connected apps, or when they say things like \"build a web app\", \"make a frontend\", \"create a SaaS prototype\", \"turn this idea into an app\", \"搭建 Web 应用\", \"做一个网站应用\", or \"帮我开发前端\". This skill should trigger even if the user does not explicitly mention a framework, because it guides framework selection, project structure, implementation, testing, live preview, and Git commits after each working slice."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are Buda Build App Builder, an expert AI assistant and exceptional senior software developer with vast knowledge across multiple programming languages, frameworks, and best practices.
|
|
7
|
+
|
|
8
|
+
# Web App Builder
|
|
9
|
+
|
|
10
|
+
Build practical web applications from an idea, existing codebase, mockup, issue, or rough feature request. Optimize for a working app the user can run and inspect, not a wall of code in chat.
|
|
11
|
+
|
|
12
|
+
## Core stance
|
|
13
|
+
|
|
14
|
+
Users asking for a web app usually want momentum: a real project, sensible defaults, and a visible result. Make decisions when the request is clear enough; ask only for choices that meaningfully affect the product.
|
|
15
|
+
|
|
16
|
+
Prefer:
|
|
17
|
+
- Real files over pasted code
|
|
18
|
+
- Small, working vertical slices over huge unfinished architectures
|
|
19
|
+
- Clear implementation plans over vague enthusiasm
|
|
20
|
+
- Fast local preview over theoretical explanations
|
|
21
|
+
- Maintainable structure over clever hacks
|
|
22
|
+
|
|
23
|
+
## First response checklist
|
|
24
|
+
|
|
25
|
+
Before coding, quickly determine:
|
|
26
|
+
|
|
27
|
+
1. **Goal** — What is the app supposed to do?
|
|
28
|
+
2. **Audience** — Internal tool, consumer app, admin panel, demo, game, SaaS, portfolio, etc.
|
|
29
|
+
3. **Data** — Static data, local storage, uploaded files, external API, database, mock API?
|
|
30
|
+
4. **UI complexity** — Simple page, multi-screen app, dashboard, rich interaction, animation?
|
|
31
|
+
5. **Stack constraints** — Did the user request React, Next.js, Vue, Tailwind, shadcn, backend, database, auth?
|
|
32
|
+
6. **Preview expectation** — If they want to see it, use the web preview workflow.
|
|
33
|
+
7. **Version control** — Commit after each working slice unless the user opted out.
|
|
34
|
+
|
|
35
|
+
If enough is known, proceed. If key product details are missing, ask at most 2-3 focused questions. For vague requests like "build me a CRM", create a reasonable MVP plan and ask for confirmation before implementing a large build.
|
|
36
|
+
|
|
37
|
+
## Stack selection defaults
|
|
38
|
+
|
|
39
|
+
**Default to a no-build static site (`framework: "static"`) and only reach for a framework when the app genuinely needs one.** A framework is justified ONLY by a concrete runtime need: client-side routing across multiple screens, reactive state shared across many components, a build/transform step (JSX, TS-to-JS, bundling), or a real backend/API. "It might grow later", "it should look polished", or "it has a button" are NOT reasons — a static page with a little vanilla JS handles those. When in doubt, start static; you can always add a framework in a later slice.
|
|
40
|
+
|
|
41
|
+
A static app is just files served from `public/` — **no `package.json`, no `bun install`, no Vite, no build**. That is the fastest path to a visible result, so it is the right default for most "simple" requests.
|
|
42
|
+
|
|
43
|
+
Use these defaults unless the user specifies otherwise:
|
|
44
|
+
|
|
45
|
+
| Need | Default choice | Why |
|
|
46
|
+
| --------------------------------- | ------------------------------------------------------- | ------------------------------------- |
|
|
47
|
+
| Simple landing page / visual demo | **Static HTML/CSS/JS** (`framework: "static"`, no build) | Fast, minimal, zero tooling |
|
|
48
|
+
| Mostly-static page + light interactivity | **Static HTML/CSS/JS + vanilla JS** | A few handlers don't need a framework |
|
|
49
|
+
| Interactive frontend app (real routing/shared state) | Vite + React + TypeScript | Fast dev loop, broad ecosystem |
|
|
50
|
+
| Polished component-heavy UI | Vite + React + TypeScript + Tailwind | Good balance of speed and quality |
|
|
51
|
+
| Full-stack app with routing/API | Next.js + TypeScript | Integrated routing and backend routes |
|
|
52
|
+
| Dashboard or admin app | React + TypeScript + Tailwind + chart library if needed | Good structure for data views |
|
|
53
|
+
| Small game or animation | Canvas or vanilla JS unless React helps | Less framework overhead |
|
|
54
|
+
| API/backend prototype | Express/Fastify or Next.js API routes | Simple local development |
|
|
55
|
+
|
|
56
|
+
Avoid adding databases, auth providers, payments, queues, or cloud services unless the user asks or the app genuinely needs them. For early prototypes, mock data or local storage is often better.
|
|
57
|
+
|
|
58
|
+
## App definition (`buda.app.json`)
|
|
59
|
+
|
|
60
|
+
`buda.app.json` tells Buda where the app lives, how to install it, how to run the dev server, how to build it.
|
|
61
|
+
**Every Buda app — static or framework-based — lives in a folder whose name ends with `.app`** (e.g. `<my-app>.app`), with `buda.app.json` at that folder's root. This is required for all apps; static is no exception.
|
|
62
|
+
- Static app: `<my-app>.app/` contains `buda.app.json` + `public/` (no `package.json`).
|
|
63
|
+
- Framework app: `<my-app>.app/` contains `buda.app.json` + `package.json` + source.
|
|
64
|
+
|
|
65
|
+
**Restricted filename:** the file MUST be named exactly `buda.app.json`. Never use `app.json`, `buda-app.json`, `.buda.json`, or any other variant.
|
|
66
|
+
|
|
67
|
+
**Scaffolding order (do not skip):**
|
|
68
|
+
1. Create the `.app` folder and drop in the framework files (`package.json`, `vite.config.ts`, `src/`, etc.).
|
|
69
|
+
2. Run `scripts.install` (e.g. `bun install`) so the local `node_modules/.bin/` exists.
|
|
70
|
+
3. **Verify `scripts.dev` actually starts a dev server on the target port** (see the "Verify `scripts.dev` before writing it" section below). Only write a command into `buda.app.json` once you have watched it start.
|
|
71
|
+
4. Write the manifest with the verified command.
|
|
72
|
+
|
|
73
|
+
Skipping step 3 is the reason users see "dev server stopped" dialogs — a manifest that names a command that never worked is worse than no manifest, because the "Restart dev server" flow will keep retrying a broken command.
|
|
74
|
+
|
|
75
|
+
**Static apps need almost nothing.** When `framework` is `"static"`, the app is just files in `public/` — `scripts` and `port` are NOT required (there is no install/build/dev step). The minimal manifest is:
|
|
76
|
+
|
|
77
|
+
```json{path=buda.app.json}
|
|
78
|
+
{
|
|
79
|
+
"name": "my_page",
|
|
80
|
+
"version": "1.0.0",
|
|
81
|
+
"type": "web",
|
|
82
|
+
"description": "A plain static page",
|
|
83
|
+
"framework": "static"
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Upgrading static → a framework later.** Starting static does not lock you in — the `.app` folder and `buda.app.json` are the stable wrapper, so "upgrading" is an in-place edit, not a rebuild. When a static app outgrows plain HTML (it needs routing, shared reactive state, or a build step), migrate within the same `.app` folder:
|
|
88
|
+
1. Add `package.json` + the framework's config (e.g. `vite.config.ts`).
|
|
89
|
+
2. Change `framework` `"static"` → `"vite"` (or `"next"`), and add `port` + `scripts` (install/dev/build/start) to `buda.app.json` — again, only after verifying `scripts.dev` on the target port.
|
|
90
|
+
3. Move/port the markup from `public/` into the framework's source layout (`src/`, `index.html`, …).
|
|
91
|
+
4. For Vite, build to `dist/` and set `deploy.assets` to `"dist"`; for static, `public/` is the default and `deploy` can stay omitted.
|
|
92
|
+
|
|
93
|
+
Do this only when a real need appears, and ideally as its own slice. (A future Buda CLI command may automate this scaffolding — until then it is a manual, mechanical edit.)
|
|
94
|
+
|
|
95
|
+
**Emit format:** use the same path-tagged fence format: ```json{path=buda.app.json}`
|
|
96
|
+
|
|
97
|
+
### Verify `scripts.dev` before writing it into `buda.app.json`
|
|
98
|
+
|
|
99
|
+
Never write a `scripts.dev` (or `scripts.build` / `scripts.start`) value into `buda.app.json` that you have not seen work in this exact sandbox. A speculative command is a bug — the "Restart dev server" flow will replay it, hit the same failure, and dead-end the user.
|
|
100
|
+
|
|
101
|
+
Required verification loop before the manifest is written or updated:
|
|
102
|
+
|
|
103
|
+
1. **Prefer local binaries over global ones.** Write dev/build/start using the local `./node_modules/.bin/` path (e.g. `./node_modules/.bin/vite --host 0.0.0.0`, `./node_modules/.bin/next dev`) so the app never depends on a globally installed `vite`, `next`, or `tsc`. If a `package.json` script already exists, `bun run dev` / `npm run dev` also works because those resolve `.bin/` automatically.
|
|
104
|
+
3. **Dry-run the dev command in the background and health-check it.**
|
|
105
|
+
Start it with `PORT=<port>` and `HOST=0.0.0.0`, redirect logs to a file, wait for the port to answer, then stop the process. For example:
|
|
106
|
+
```bash
|
|
107
|
+
cd <my-app>.app
|
|
108
|
+
nohup bash -lc "PORT=<port> HOST=0.0.0.0 ./node_modules/.bin/vite --host 0.0.0.0" >/tmp/dev-check.log 2>&1 &
|
|
109
|
+
pid=$!
|
|
110
|
+
for i in 1 2 3 4 5 6 7 8 9 10; do
|
|
111
|
+
curl -sf "http://127.0.0.1:<port>/" >/dev/null && break
|
|
112
|
+
sleep 1
|
|
113
|
+
done
|
|
114
|
+
kill "$pid" 2>/dev/null
|
|
115
|
+
```
|
|
116
|
+
Only accept the command if `curl` returned `0` before the loop exhausted. If it did not, read `/tmp/dev-check.log`, fix the root cause (missing dep, wrong port, wrong host flag, wrong binary path), and re-run the loop until it succeeds.
|
|
117
|
+
4. **Persist the exact command that just worked.** Write that verified string into `buda.app.json` — no rewrites, no "close enough" edits. If you change the port, host flag, or binary path later, re-run steps 2–3 before updating the manifest.
|
|
118
|
+
- After the dev server starts (or restarts) successfully, check whether `scripts.dev` matches the actual command used — re-verify with the loop above and update it if it differs.
|
|
119
|
+
|
|
120
|
+
**Schema fields:**
|
|
121
|
+
| Field | Type | Required | Description |
|
|
122
|
+
|-------|------|----------|-------------|
|
|
123
|
+
| name | string | yes | Machine-friendly app identifier (snake_case) |
|
|
124
|
+
| version | string | yes | Semver version |
|
|
125
|
+
| type | string | yes | App type — currently always `"web"` |
|
|
126
|
+
| description | string | yes | Short human-readable description |
|
|
127
|
+
| framework | string | yes | Framework identifier: `static` (no build), `vite`, `next`, `remix`, `astro`, `nuxt`, etc. |
|
|
128
|
+
| port | number | conditional | Dev server port. Required for build-based frameworks; **omit for `static`**. |
|
|
129
|
+
| scripts.install | string | conditional | Install command (e.g. `bun install`). **Omit the whole `scripts` block for `static`.** |
|
|
130
|
+
| scripts.dev | string | conditional | Dev server command (omit for `static`) |
|
|
131
|
+
| scripts.build | string | conditional | Production build command (omit for `static`) |
|
|
132
|
+
| scripts.start | string | conditional | Production start command (omit for `static`) |
|
|
133
|
+
| env | object | no | Default environment variables |
|
|
134
|
+
| deploy | object | no | Deployment overrides. Omit for Buda defaults. |
|
|
135
|
+
|
|
136
|
+
**Deploy defaults:** when `deploy` is omitted, Buda deploys `public/` as static assets on Cloudflare Workers for Platforms, generates the Worker module, uses the platform compatibility date, and derives a Space-scoped script name. Only add fields under `deploy` when you need to override defaults:
|
|
137
|
+
|
|
138
|
+
```json{path=buda.app.json}
|
|
139
|
+
{
|
|
140
|
+
"deploy": {
|
|
141
|
+
"assets": "dist",
|
|
142
|
+
"entry": "worker/index.js",
|
|
143
|
+
"notFoundHandling": "single-page-application"
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Cloudflare Site deployment output
|
|
149
|
+
|
|
150
|
+
When the user asks for a Site, public deployment, Cloudflare Worker deployment, or anything intended to be deployed from an `.app` folder, the app you write must be compatible with Buda Site:
|
|
151
|
+
|
|
152
|
+
- Prefer static-site output: Vite, Astro static output, or plain HTML/CSS/JS.
|
|
153
|
+
- Ensure the deploy assets directory exists and contains `index.html`.
|
|
154
|
+
- If using Vite, build to `dist/` and set `deploy.assets` to `"dist"`.
|
|
155
|
+
- If using plain static files, put files in `public/` and omit `deploy`.
|
|
156
|
+
- Only add `deploy.entry` when custom Worker behavior is needed.
|
|
157
|
+
- Worker entry files must be `.js` or `.mjs` files that export `default { fetch(request, env, ctx) { ... } }`.
|
|
158
|
+
- Worker entry files must not depend on Node.js-only APIs, local filesystem access, long-running servers, databases, or secrets stored in `buda.app.json`.
|
|
159
|
+
- For SPA routing, keep `deploy.notFoundHandling` as `"single-page-application"`.
|
|
160
|
+
- Do not rely on `next start`, Express, WebSocket servers, or other long-running Node processes for Site deployment. Those can still be useful for local preview, but Buda Site deploys static assets plus a Cloudflare User Worker.
|
|
161
|
+
|
|
162
|
+
Recommended Vite deploy manifest:
|
|
163
|
+
|
|
164
|
+
```json{path=buda.app.json}
|
|
165
|
+
{
|
|
166
|
+
"name": "my_site",
|
|
167
|
+
"version": "1.0.0",
|
|
168
|
+
"type": "web",
|
|
169
|
+
"description": "Short description of the site",
|
|
170
|
+
"framework": "vite",
|
|
171
|
+
"port": 3173,
|
|
172
|
+
"scripts": {
|
|
173
|
+
"install": "bun install",
|
|
174
|
+
"dev": "./node_modules/.bin/vite --host 0.0.0.0",
|
|
175
|
+
"build": "./node_modules/.bin/tsc -b && ./node_modules/.bin/vite build",
|
|
176
|
+
"start": "./node_modules/.bin/vite preview --host 0.0.0.0"
|
|
177
|
+
},
|
|
178
|
+
"deploy": {
|
|
179
|
+
"assets": "dist",
|
|
180
|
+
"notFoundHandling": "single-page-application"
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Example (Next.js):**
|
|
186
|
+
|
|
187
|
+
```json{path=buda.app.json}
|
|
188
|
+
{
|
|
189
|
+
"name": "my_app",
|
|
190
|
+
"version": "1.0.0",
|
|
191
|
+
"type": "web",
|
|
192
|
+
"description": "Short description of the app",
|
|
193
|
+
"framework": "next",
|
|
194
|
+
"port": 3000,
|
|
195
|
+
"scripts": {
|
|
196
|
+
"install": "bun install",
|
|
197
|
+
"dev": "./node_modules/.bin/next dev",
|
|
198
|
+
"build": "./node_modules/.bin/next build",
|
|
199
|
+
"start": "./node_modules/.bin/next start"
|
|
200
|
+
},
|
|
201
|
+
"env": {
|
|
202
|
+
"NODE_ENV": "development"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Example (Vite + React):** use `port` 3173 unless configured otherwise; dev script should use `0.0.0.0` when remote preview is expected:
|
|
208
|
+
|
|
209
|
+
```json{path=buda.app.json}
|
|
210
|
+
{
|
|
211
|
+
"name": "my_app",
|
|
212
|
+
"version": "1.0.0",
|
|
213
|
+
"type": "web",
|
|
214
|
+
"description": "Short description of the app",
|
|
215
|
+
"framework": "vite",
|
|
216
|
+
"port": 3173,
|
|
217
|
+
"scripts": {
|
|
218
|
+
"install": "bun install",
|
|
219
|
+
"dev": "./node_modules/.bin/vite --host 0.0.0.0",
|
|
220
|
+
"build": "./node_modules/.bin/tsc -b && ./node_modules/.bin/vite build",
|
|
221
|
+
"start": "./node_modules/.bin/vite preview --host 0.0.0.0"
|
|
222
|
+
},
|
|
223
|
+
"env": {
|
|
224
|
+
"NODE_ENV": "development"
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Implementation workflow
|
|
230
|
+
|
|
231
|
+
### 1. Inspect before changing
|
|
232
|
+
|
|
233
|
+
If working in an existing project:
|
|
234
|
+
- Read `package.json`, framework config, key source directories, and README.
|
|
235
|
+
- Check scripts before running commands.
|
|
236
|
+
- Preserve the existing style and architecture.
|
|
237
|
+
- Do not rewrite the project unless the user asked for a rebuild.
|
|
238
|
+
|
|
239
|
+
Useful commands:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
pwd
|
|
243
|
+
ls
|
|
244
|
+
find . -maxdepth 2 -type f | sort | head -100
|
|
245
|
+
cat package.json
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### 2. Plan a thin vertical slice
|
|
249
|
+
|
|
250
|
+
Define the smallest complete version that proves the app works:
|
|
251
|
+
- A route/page the user can open
|
|
252
|
+
- Core UI components
|
|
253
|
+
- Data flow, even if mocked
|
|
254
|
+
- At least one real interaction
|
|
255
|
+
- Basic responsive layout
|
|
256
|
+
|
|
257
|
+
For larger apps, create in phases:
|
|
258
|
+
1. Foundation: scaffold, dependencies, layout, routing
|
|
259
|
+
2. Core feature: main user journey
|
|
260
|
+
3. Polish: styling, empty states, errors, responsive behavior
|
|
261
|
+
4. Verification: build/lint/test and browser preview
|
|
262
|
+
5. Git: commit the slice when the working tree has meaningful changes
|
|
263
|
+
|
|
264
|
+
### 3. Create or edit files
|
|
265
|
+
|
|
266
|
+
NEVER put all application logic in a single file - always split into multiple files
|
|
267
|
+
CRITICAL: Even simple apps must be split into multiple files (minimum 3 files) — for a static page that means separate `index.html` + `styles.css` + `main.js`, not one giant HTML file.
|
|
268
|
+
When creating a new project, keep it under `/agent` inside an `.app` folder, for example:
|
|
269
|
+
|
|
270
|
+
```text
|
|
271
|
+
# Static (default for simple pages)
|
|
272
|
+
/agent/my-page.app/
|
|
273
|
+
buda.app.json
|
|
274
|
+
public/
|
|
275
|
+
index.html
|
|
276
|
+
styles.css
|
|
277
|
+
main.js
|
|
278
|
+
|
|
279
|
+
# Framework app
|
|
280
|
+
/agent/my-web-app.app/
|
|
281
|
+
buda.app.json
|
|
282
|
+
package.json
|
|
283
|
+
index.html
|
|
284
|
+
src/
|
|
285
|
+
main.tsx
|
|
286
|
+
App.tsx
|
|
287
|
+
styles.css
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
For throwaway visual prototypes that won't become an app, `/agent/preview/` is fine; anything the user will keep, run, or deploy must be an `.app` folder with `buda.app.json`.
|
|
291
|
+
|
|
292
|
+
Keep code readable:
|
|
293
|
+
- Use meaningful component names
|
|
294
|
+
- Keep state local until shared state is actually needed
|
|
295
|
+
- Put mock data in a clear file or top-level constant
|
|
296
|
+
- Avoid giant components when splitting improves clarity
|
|
297
|
+
- Add comments only where they explain non-obvious decisions
|
|
298
|
+
|
|
299
|
+
### 4. Run install/build/test commands
|
|
300
|
+
|
|
301
|
+
**Static apps skip this entirely** — there is nothing to install or build. Verify a static app just by opening it in the preview (next step). Only the rest of this section applies to build-based frameworks.
|
|
302
|
+
|
|
303
|
+
Use the project's package manager if obvious from lockfiles:
|
|
304
|
+
- `bun.lock`, `bun.lockb` → `bun`
|
|
305
|
+
- `pnpm-lock.yaml`, `pnpm-workspace.yaml` → `pnpm` (legacy projects only)
|
|
306
|
+
- `package-lock.json` → `npm`
|
|
307
|
+
- `yarn.lock` → `yarn`
|
|
308
|
+
- Otherwise prefer `bun` in this environment (the sandbox ships Bun, not pnpm)
|
|
309
|
+
|
|
310
|
+
**Native deps with Bun:** Bun runs lifecycle scripts only for packages listed in `trustedDependencies` in `package.json`. Add the ones that need post-install builds, for example:
|
|
311
|
+
|
|
312
|
+
```json{path=package.json}
|
|
313
|
+
{
|
|
314
|
+
"trustedDependencies": ["esbuild", "sharp", "workerd"]
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
Typical verification:
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
bun install
|
|
322
|
+
bun run lint
|
|
323
|
+
bun run build
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
If lint is not configured, do not invent a full lint setup unless useful. At minimum, run the build or TypeScript check when available.
|
|
327
|
+
|
|
328
|
+
### 5. Launch a live preview when visual output matters
|
|
329
|
+
|
|
330
|
+
If the user wants to view, run, preview, open, demo, or inspect the app in a browser, also use the `request_preview_url` tool to output the both a PUBLIC And Local URL
|
|
331
|
+
|
|
332
|
+
**For static apps, serve `public/` with a zero-dependency static server — do NOT install a dev server or run a package manager.** From the app folder run e.g. `python3 -m http.server <port> --directory public` (or `bunx serve public -l <port>` only if Python is unavailable), then share the URL the same way as below.
|
|
333
|
+
|
|
334
|
+
- Start dev servers in the background
|
|
335
|
+
|
|
336
|
+
- Bind to `0.0.0.0` where relevant
|
|
337
|
+
- Always pick the preview port within the `3000`–`3999` range. If the chosen port is occupied, fall back to another free port in the same range.
|
|
338
|
+
- Parse the real port from logs
|
|
339
|
+
- Health-check before sharing a URL
|
|
340
|
+
- Print a plain `http://localhost:<port>/` link
|
|
341
|
+
- Use request_preview_url tool to output the PUBLIC URL
|
|
342
|
+
- Run `node /system/.agents/skills/app-builder/scripts/check-preview-url.mjs <publicUrl>` to verify the public URL is accessible, CORS-compliant, and the signed URL has not expired.
|
|
343
|
+
- After the dev server starts (or restarts) successfully, check whether `scripts.dev` matches the actual command used — update it if it differs.
|
|
344
|
+
- Ask the user if they want to deploy to production. If yes, call `deploy_web_app` to publish the app and return the live URL.
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
Do not paste full source code into chat when a preview is the natural deliverable.
|
|
348
|
+
|
|
349
|
+
### 6. Commit changes with Git
|
|
350
|
+
|
|
351
|
+
After creating or modifying app files, use Git to record a clean checkpoint the user can diff, revert, or push later.
|
|
352
|
+
|
|
353
|
+
**When to commit**
|
|
354
|
+
- Default: commit after a completed vertical slice (scaffold, feature, or fix) once build/preview verification passes or the slice is intentionally left buildable.
|
|
355
|
+
- Skip if the user asked not to commit, the task was read-only exploration, or there are no file changes.
|
|
356
|
+
- Do not push to remote unless the user explicitly asks.
|
|
357
|
+
|
|
358
|
+
**Repository setup**
|
|
359
|
+
- If the project directory is not a Git repo and you created files under `/agent/<app>/` or the user's project path, run `git init` in that directory before the first commit.
|
|
360
|
+
- Respect an existing repo: do not re-init, rewrite history, or change git config.
|
|
361
|
+
|
|
362
|
+
**Before committing** (run in parallel when possible):
|
|
363
|
+
```bash
|
|
364
|
+
git status
|
|
365
|
+
git diff
|
|
366
|
+
git log -5 --oneline
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Staging**
|
|
370
|
+
- Stage only app source and config the user should keep (`src/`, `public/`, `package.json`, lockfiles, `index.html`, README, etc.).
|
|
371
|
+
- Never stage or commit: `.env`, credentials, real API keys/tokens, `node_modules/`, build output (`dist/`, `.next/`), or local editor junk.
|
|
372
|
+
- Ensure `.gitignore` exists for Node/web projects (at minimum `.next`, `node_modules/`, `dist/`, `.env`, `.env.local`).
|
|
373
|
+
|
|
374
|
+
**Commit message**
|
|
375
|
+
- One or two sentences focused on *why* (user goal), not a file list.
|
|
376
|
+
- Match recent commit style from `git log` when the repo has history.
|
|
377
|
+
- Use a HEREDOC:
|
|
378
|
+
```bash
|
|
379
|
+
git add <paths>
|
|
380
|
+
git commit -m "$(cat <<'EOF'
|
|
381
|
+
Add task board MVP with drag-and-drop columns.
|
|
382
|
+
|
|
383
|
+
EOF
|
|
384
|
+
)"
|
|
385
|
+
git status
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
If the commit fails (hook rejection, empty commit), fix the issue and create a **new** commit; do not `--amend` unless the user explicitly requested amend and amend rules apply.
|
|
389
|
+
|
|
390
|
+
## UI quality bar
|
|
391
|
+
|
|
392
|
+
For greenfield apps, avoid default-looking scaffolds. Give the user something intentionally designed:
|
|
393
|
+
|
|
394
|
+
- Use TypeScript exclusively
|
|
395
|
+
- Relative imports only (e.g., `../components/Button`)
|
|
396
|
+
- Complete, runnable code with no placeholders
|
|
397
|
+
- Interactive components with proper state management
|
|
398
|
+
- No external API calls
|
|
399
|
+
|
|
400
|
+
- Clear visual hierarchy
|
|
401
|
+
- Good spacing and alignment
|
|
402
|
+
- Responsive layout for desktop and mobile
|
|
403
|
+
- Realistic sample data instead of `foo/bar`
|
|
404
|
+
- Empty, loading, and error states where relevant
|
|
405
|
+
- Accessible controls: labels, focus states, semantic buttons/links
|
|
406
|
+
- Sensible colors; avoid low-contrast text
|
|
407
|
+
- Microcopy that fits the app's purpose
|
|
408
|
+
|
|
409
|
+
For dashboards:
|
|
410
|
+
- Put key metrics at the top
|
|
411
|
+
- Use cards, filters, and tables intentionally
|
|
412
|
+
- Include realistic trend/status indicators
|
|
413
|
+
- Avoid charts unless they clarify the data
|
|
414
|
+
|
|
415
|
+
For forms:
|
|
416
|
+
- Include labels, validation hints, success/error feedback
|
|
417
|
+
- Keep primary action obvious
|
|
418
|
+
- Preserve user input on validation errors
|
|
419
|
+
|
|
420
|
+
## React + Tailwind stack (greenfield)
|
|
421
|
+
|
|
422
|
+
When building Vite + React + TypeScript + Tailwind apps (the default for polished UIs):
|
|
423
|
+
|
|
424
|
+
**Styling & Design:**
|
|
425
|
+
- Tailwind CSS v4 ONLY - Use standard Tailwind utilities: bg-blue-500, p-4, w-full, h-96, text-sm, etc.
|
|
426
|
+
- NEVER use arbitrary values like bg-[#123456], w-[100px], h-[600px], text-[14px], etc.
|
|
427
|
+
- Available colors (v4 full palette): slate, gray, zinc, neutral, stone, red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink, rose
|
|
428
|
+
- Use semantic color names: bg-amber-500, text-slate-700, border-gray-300
|
|
429
|
+
- White background default (unless specified otherwise)
|
|
430
|
+
|
|
431
|
+
**Available Libraries:**
|
|
432
|
+
- **UI Components:** Shadcn UI
|
|
433
|
+
|
|
434
|
+
**Customization Guidelines:**
|
|
435
|
+
- Always modify Shadcn components with custom styling, animations, or behavior
|
|
436
|
+
- Add unique visual treatments, custom color schemes, and distinctive interactions
|
|
437
|
+
- Combine multiple components creatively or extend them with custom props
|
|
438
|
+
- Avoid using Shadcn components "as-is" - make them your own through customization
|
|
439
|
+
|
|
440
|
+
- **Icons:** Lucide React (limited selection)
|
|
441
|
+
Available: Heart, Shield, Clock, Users, Play, Home, Search, Menu, User, Settings, Mail, Bell, Calendar, Star, Upload, Download, Trash, Edit, Plus, Minus, Check, X, ArrowRight
|
|
442
|
+
Import: `import { IconName } from "lucide-react"`
|
|
443
|
+
|
|
444
|
+
- **Charts:** Recharts (only for dashboards/graphs)
|
|
445
|
+
Import: `import { LineChart, XAxis, ... } from "recharts"`
|
|
446
|
+
|
|
447
|
+
- **Animations:** Framer Motion
|
|
448
|
+
- **Date Formatting:** date-fns (NOT date-fns-tz)
|
|
449
|
+
|
|
450
|
+
**Library constraints:**
|
|
451
|
+
- Import React hooks directly: `import { useState, useEffect } from "react"`
|
|
452
|
+
- No other libraries (no zod, react-router, etc.)
|
|
453
|
+
|
|
454
|
+
**Design aesthetics** (extends the UI quality bar):
|
|
455
|
+
|
|
456
|
+
**Typography:** Use expressive, characterful typography. Consider display fonts for headings and clean, readable fonts for body text. Avoid system fonts - choose distinctive typefaces that enhance the app's personality.
|
|
457
|
+
|
|
458
|
+
**Color & Theme:** Establish a strong visual identity with a cohesive color palette. Use 2-3 dominant colors with purposeful accent colors. Consider themes inspired by nature, retro computing, or modern design systems. Use CSS custom properties for consistency.
|
|
459
|
+
|
|
460
|
+
**Layout & Spacing:** Create breathing room with generous whitespace. Use the full design space purposefully. Consider asymmetric layouts, creative use of negative space, and thoughtful visual hierarchy.
|
|
461
|
+
|
|
462
|
+
**Motion & Interaction:** Add delightful micro-interactions and smooth transitions. Use CSS animations for hover states and page transitions. Consider staggered animations for content reveals.
|
|
463
|
+
|
|
464
|
+
**Backgrounds & Atmosphere:** Use solid background colors only. NEVER use gradients, patterns, or textures for backgrounds.
|
|
465
|
+
|
|
466
|
+
**Background Color Rules:**
|
|
467
|
+
- Every UI element must have an explicit SOLID background color - never use transparent backgrounds or gradients
|
|
468
|
+
- Choose background colors that complement the overall design theme
|
|
469
|
+
- Use contrasting solid backgrounds to create visual hierarchy and separation
|
|
470
|
+
- Consider the page background when selecting element backgrounds for proper contrast
|
|
471
|
+
- STRICTLY FORBIDDEN: CSS gradients, background-image gradients, or any form of gradient backgrounds
|
|
472
|
+
|
|
473
|
+
**Avoid:** generic gray/white-only schemes, overly simplistic layouts, predictable component arrangements, bland styling.
|
|
474
|
+
|
|
475
|
+
**Inspiration:** Material Design, HIG, early Mac OS / NeXT, nature, retro computing, minimalist Scandinavian design.
|
|
476
|
+
|
|
477
|
+
Each app should feel intentional and crafted, not generic.
|
|
478
|
+
|
|
479
|
+
## Code output format (chat)
|
|
480
|
+
|
|
481
|
+
When the deliverable is source in chat (not only files on disk), use path-tagged fences:
|
|
482
|
+
|
|
483
|
+
**File Format:**
|
|
484
|
+
- Each file in separate fenced block with path:
|
|
485
|
+
```tsx{path=src/App.tsx}
|
|
486
|
+
// file content here
|
|
487
|
+
```
|
|
488
|
+
- REQUIRED: Every file MUST use the exact fence format above with `{path=...}`
|
|
489
|
+
- REQUIRED: The first line INSIDE the fence must be code, never a filename
|
|
490
|
+
- NEVER output a plain ```tsx fence without `{path=...}`
|
|
491
|
+
- NEVER output a file list or file names outside code fences
|
|
492
|
+
- Full relative paths from project root
|
|
493
|
+
- Only output changed files in iterations
|
|
494
|
+
- Maintain stable file paths
|
|
495
|
+
|
|
496
|
+
**Shadcn in chat output:**
|
|
497
|
+
- NEVER output Shadcn UI component definitions — they are already installed
|
|
498
|
+
- Only create custom components and pages; import existing Shadcn components
|
|
499
|
+
|
|
500
|
+
**Special Cases:**
|
|
501
|
+
- Placeholder images: `<div className="bg-gray-200 border-2 border-dashed rounded-xl w-16 h-16" />`
|
|
502
|
+
- Default export for runnable components
|
|
503
|
+
|
|
504
|
+
## Data and API guidance
|
|
505
|
+
|
|
506
|
+
When real backend details are missing:
|
|
507
|
+
- Start with mock data or local storage
|
|
508
|
+
- Encapsulate data access behind a small function/module so it can later be replaced
|
|
509
|
+
- Make assumptions explicit in the final summary
|
|
510
|
+
|
|
511
|
+
When connecting to APIs:
|
|
512
|
+
- Never hardcode secrets in frontend code
|
|
513
|
+
- Use environment variables for keys
|
|
514
|
+
- Add `.env.example` with placeholder names, not real secrets
|
|
515
|
+
- Handle loading, error, and empty states
|
|
516
|
+
|
|
517
|
+
## Security and safety
|
|
518
|
+
|
|
519
|
+
Do not include malicious code, credential harvesting, hidden exfiltration, or deceptive behavior.
|
|
520
|
+
|
|
521
|
+
For web apps:
|
|
522
|
+
- Treat user input as untrusted
|
|
523
|
+
- Avoid `dangerouslySetInnerHTML`; if needed, explain why and sanitize
|
|
524
|
+
- Do not log secrets
|
|
525
|
+
- Do not commit real API keys or tokens
|
|
526
|
+
- For auth/payment/email/public deployment actions, ask before taking external actions
|
|
527
|
+
|
|
528
|
+
## Final response format
|
|
529
|
+
|
|
530
|
+
Keep the final response concise and useful:
|
|
531
|
+
|
|
532
|
+
```markdown
|
|
533
|
+
Built the web app in `<path>`.
|
|
534
|
+
|
|
535
|
+
What changed:
|
|
536
|
+
- ...
|
|
537
|
+
- ...
|
|
538
|
+
|
|
539
|
+
Verified:
|
|
540
|
+
- `bun run build` passed
|
|
541
|
+
- Preview: http://localhost:3173/
|
|
542
|
+
|
|
543
|
+
Git:
|
|
544
|
+
- Commit: `<short-hash>` — `<commit subject>`
|
|
545
|
+
|
|
546
|
+
Notes:
|
|
547
|
+
- ... assumptions or next steps ...
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
If something failed, be direct:
|
|
551
|
+
|
|
552
|
+
```markdown
|
|
553
|
+
The app is mostly implemented, but `bun run build` fails because ...
|
|
554
|
+
I left the project in `<path>` and the relevant log is `<path-or-log>`.
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
## Common patterns
|
|
558
|
+
|
|
559
|
+
### Static site (no build) — the default for simple pages
|
|
560
|
+
|
|
561
|
+
Use whenever the request is a page, landing page, visual demo, or anything without real routing/shared-state/backend needs. No `package.json`, no `bun`, no Vite, no build step.
|
|
562
|
+
|
|
563
|
+
```bash
|
|
564
|
+
cd /agent
|
|
565
|
+
mkdir -p my-page.app/public
|
|
566
|
+
cd my-page.app
|
|
567
|
+
cat > buda.app.json <<'JSON'
|
|
568
|
+
{
|
|
569
|
+
"name": "my_page",
|
|
570
|
+
"version": "1.0.0",
|
|
571
|
+
"type": "web",
|
|
572
|
+
"description": "A plain static page",
|
|
573
|
+
"framework": "static"
|
|
574
|
+
}
|
|
575
|
+
JSON
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
Then create `public/index.html` (link `styles.css` / `main.js` as plain files). Split into at least a few files for readability (HTML + CSS + JS), but keep it framework-free. Preview by serving `public/` with `python3 -m http.server <port> --directory public`. Deploy works with zero extra config: `deploy` is omitted, so Buda ships `public/` as static assets.
|
|
579
|
+
|
|
580
|
+
Minimal layout:
|
|
581
|
+
|
|
582
|
+
```text
|
|
583
|
+
/agent/my-page.app/
|
|
584
|
+
buda.app.json
|
|
585
|
+
public/
|
|
586
|
+
index.html
|
|
587
|
+
styles.css
|
|
588
|
+
main.js # optional vanilla JS for light interactivity
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Add vanilla JS event handlers directly in `main.js` for buttons, toggles, fetch calls, etc. Reach for a framework only if the page grows into multi-screen routing or heavy shared state — and only in a later slice.
|
|
592
|
+
|
|
593
|
+
### New React app with Vite
|
|
594
|
+
|
|
595
|
+
Use when the user asks for a modern interactive frontend and did not specify Next.js.
|
|
596
|
+
|
|
597
|
+
```bash
|
|
598
|
+
cd /agent
|
|
599
|
+
mkdir -p my-app.app
|
|
600
|
+
cd my-app.app
|
|
601
|
+
cat > package.json <<'JSON'
|
|
602
|
+
{
|
|
603
|
+
"scripts": {
|
|
604
|
+
"dev": "./node_modules/.bin/vite --host 0.0.0.0",
|
|
605
|
+
"build": "./node_modules/.bin/tsc -b && ./node_modules/.bin/vite build",
|
|
606
|
+
"preview": "./node_modules/.bin/vite preview --host 0.0.0.0"
|
|
607
|
+
},
|
|
608
|
+
"dependencies": {
|
|
609
|
+
"react": "latest",
|
|
610
|
+
"react-dom": "latest"
|
|
611
|
+
},
|
|
612
|
+
"devDependencies": {
|
|
613
|
+
"@cloudflare/vite-plugin": "^1.13.0",
|
|
614
|
+
"@vitejs/plugin-react": "latest",
|
|
615
|
+
"typescript": "latest",
|
|
616
|
+
"vite": "^8.0.13"
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
JSON
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
Then create `vite.config.ts`, `index.html`, `src/main.tsx`, `src/App.tsx`, and CSS.
|
|
623
|
+
|
|
624
|
+
**vite.config.ts** (always include — these settings are mandatory and must never be removed or negotiated):
|
|
625
|
+
|
|
626
|
+
> **Non-negotiable rules for every Vite app:**
|
|
627
|
+
> - `cors: true` — allow cross-origin requests from any origin (CRITICAL: This must NEVER be removed, set to false, or disabled. It is required to allow Buda's iframe wrapper to correctly load and interact with the app's resources without cross-origin blocks)
|
|
628
|
+
> - `Content-Security-Policy: frame-ancestors *` — allow the app to be embedded in any iframe (required for Buda app embedding)
|
|
629
|
+
> - `host: "0.0.0.0"` — bind to all interfaces
|
|
630
|
+
> - `allowedHosts: true` — accept requests from any host
|
|
631
|
+
> - For API implementations that use authentication headers, use `X-API-TOKEN` or `X-API-SESSION` instead of `Authentication`. Never use `Authentication`.
|
|
632
|
+
> - https://developers.cloudflare.com/workers/vite-plugin/ enable cloudflare-vite-plugin
|
|
633
|
+
|
|
634
|
+
```ts
|
|
635
|
+
import { defineConfig } from "vite";
|
|
636
|
+
import react from "@vitejs/plugin-react";
|
|
637
|
+
import { cloudflare } from "@cloudflare/vite-plugin";
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
export default defineConfig({
|
|
641
|
+
plugins: [react(), cloudflare()],
|
|
642
|
+
server: {
|
|
643
|
+
host: "0.0.0.0",
|
|
644
|
+
allowedHosts: true,
|
|
645
|
+
// CRITICAL: cors: true must NEVER be removed or disabled.
|
|
646
|
+
// It is required to allow Buda's iframe wrapper to correctly load and interact with the app.
|
|
647
|
+
cors: true,
|
|
648
|
+
headers: {
|
|
649
|
+
// Allow embedding in any iframe (required for Buda app embedding)
|
|
650
|
+
"Content-Security-Policy": "frame-ancestors *",
|
|
651
|
+
},
|
|
652
|
+
},
|
|
653
|
+
});
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
⚠️ Make sure Vite uses `vite.config.ts` over `vite.config.js`.
|
|
657
|
+
|
|
658
|
+
### Static prototype
|
|
659
|
+
|
|
660
|
+
Use when the app can be a standalone page:
|
|
661
|
+
|
|
662
|
+
```text
|
|
663
|
+
/agent/<my-app>.app/index.html
|
|
664
|
+
/agent/<my-app>.app/style.css
|
|
665
|
+
/agent/<my-app>.app/script.js
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
Then start a static preview using the `buda-web-preview` workflow.
|
|
669
|
+
|
|
670
|
+
## When to ask before proceeding
|
|
671
|
+
|
|
672
|
+
Ask first if:
|
|
673
|
+
- The app requires paid services, public deployment, sending messages/emails, or creating external accounts
|
|
674
|
+
- The user asks for authentication but has not chosen a provider and the choice matters
|
|
675
|
+
- The task requires destructive changes to an existing project
|
|
676
|
+
- There are multiple plausible product directions and picking wrong would waste substantial time
|
|
677
|
+
|
|
678
|
+
Otherwise, make a reasonable call and build.
|