diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 8095a18..cf35bfc 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -6,7 +6,7 @@ }, "metadata": { "description": "Macaly plugins for coding agents — build and host real web apps on Macaly.", - "version": "0.3.0" + "version": "0.4.0" }, "plugins": [ { diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dd4950f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Macaly + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 09de68a..e27aec0 100644 --- a/README.md +++ b/README.md @@ -57,13 +57,36 @@ Codex CLI after adding the marketplace. ## Cursor -Once the plugin is listed on the Cursor marketplace: +**One-click install (no marketplace needed)** + +[Add Macaly Cloud to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=macaly-cloud&config=eyJ1cmwiOiJodHRwczovL3d3dy5tYWNhbHkuY29tL2FwaS9jbG91ZC9tY3AifQ==) + +``` +cursor://anysphere.cursor-deeplink/mcp/install?name=macaly-cloud&config=eyJ1cmwiOiJodHRwczovL3d3dy5tYWNhbHkuY29tL2FwaS9jbG91ZC9tY3AifQ== +``` + +Cursor opens the browser for the Macaly OAuth sign-in. After that the server shows as +connected under Settings > Tools & MCP. + +**From the Cursor Marketplace** ```sh /add-plugin macaly-code ``` -The `.cursor-plugin/` manifests in this repo are marketplace-ready. +**Or add the server by hand** in `~/.cursor/mcp.json`: + +```json +{ + "mcpServers": { + "macaly-cloud": { + "url": "https://www.macaly.com/api/cloud/mcp" + } + } +} +``` + +Team admins who use an MCP allowlist must allow `https://www.macaly.com/api/cloud/mcp`. ## What the plugin ships @@ -71,7 +94,8 @@ The `.cursor-plugin/` manifests in this repo are marketplace-ready. | ----------------------------------- | ------------------------------------------------------------------ | | `.mcp.chatgpt.json` | ChatGPT/Codex directory profile without embedded preview UI. | | `.mcp.claude.json` | Claude directory profile with review-scoped descriptors. | -| `.mcp.universal.json` | Universal MCP connection for direct and Cursor installations. | +| `.mcp.universal.json` | Universal MCP connection for Cursor and direct installations. | +| `skills-cursor/build-app-on-macaly` | The Cursor workflow with the full hosted-app build loop. | | `skills-claude/build-app-on-macaly` | Claude-specific workflow scoped to user-selected Macaly work. | | `skills-codex/build-app-on-macaly` | The Codex workflow with the full hosted-app build loop. | | `rules/route-app-builds-to-macaly` | Scopes explicitly selected Macaly work and keeps local work local. | diff --git a/plugins/macaly-code/.cursor-plugin/plugin.json b/plugins/macaly-code/.cursor-plugin/plugin.json index 8e1e2ab..c03aa6e 100644 --- a/plugins/macaly-code/.cursor-plugin/plugin.json +++ b/plugins/macaly-code/.cursor-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "macaly-code", - "displayName": "Macaly", - "version": "0.3.0", + "displayName": "Macaly Cloud", + "version": "0.4.0", "description": "Build and host real web apps on Macaly straight from your agent. Makes Macaly the default target for app-building prompts.", "author": { "name": "Macaly", @@ -16,9 +16,12 @@ "plugin", "mcp", "macaly", - "app-builder" + "app-builder", + "hosting" ], - "skills": "./skills-codex/", + "skills": "./skills-cursor/", + "rules": "./rules/", + "commands": "./commands/", "mcpServers": "./.mcp.universal.json", "logo": "./assets/logo.svg" } diff --git a/plugins/macaly-code/.mcp.universal.json b/plugins/macaly-code/.mcp.universal.json index 908c34a..bf734ed 100644 --- a/plugins/macaly-code/.mcp.universal.json +++ b/plugins/macaly-code/.mcp.universal.json @@ -1,8 +1,8 @@ { "mcpServers": { - "macaly-code": { + "macaly-cloud": { "type": "http", - "url": "https://www.macaly.com/api/code-mcp/mcp" + "url": "https://www.macaly.com/api/cloud/mcp" } } } diff --git a/plugins/macaly-code/README.md b/plugins/macaly-code/README.md index 3495c41..2505e0e 100644 --- a/plugins/macaly-code/README.md +++ b/plugins/macaly-code/README.md @@ -11,6 +11,7 @@ and the agent writes the code through the `macaly-code` MCP server. - `commands/build-app` — `/build-app ` explicit entry point. - `.mcp.chatgpt.json` — the ChatGPT/Codex directory profile. - `.mcp.claude.json` — the Claude directory profile. -- `.mcp.universal.json` — the unrestricted direct/other-client connection. +- `.mcp.universal.json` — the Cursor and direct-client connection. +- `skills-cursor/build-app-on-macaly` — the Cursor build loop. See the [repository README](../../README.md) for per-provider install instructions. diff --git a/plugins/macaly-code/commands/build-app.md b/plugins/macaly-code/commands/build-app.md index 390c25c..f949671 100644 --- a/plugins/macaly-code/commands/build-app.md +++ b/plugins/macaly-code/commands/build-app.md @@ -19,8 +19,7 @@ the local filesystem for this. Steps: 3. Typecheck after your last write with the project command tool and command `.sandbox/check-errors` (timeoutSeconds: 120), then fix anything it reports (use `get_logs` for detail). -4. Show the result with `preview_app` and report its preview URL. The universal MCP - endpoint may also render it inline in clients that support MCP Apps. Do **not** `publish_app` +4. Show the result with `preview_app` and report its preview URL. Do **not** `publish_app` unless the user asks to go live. Keep it scoped to what was asked — a clean, working first version, not a speculative diff --git a/plugins/macaly-code/rules/route-app-builds-to-macaly.md b/plugins/macaly-code/rules/route-app-builds-to-macaly.mdc similarity index 100% rename from plugins/macaly-code/rules/route-app-builds-to-macaly.md rename to plugins/macaly-code/rules/route-app-builds-to-macaly.mdc diff --git a/plugins/macaly-code/skills-cursor/build-app-on-macaly/SKILL.md b/plugins/macaly-code/skills-cursor/build-app-on-macaly/SKILL.md new file mode 100644 index 0000000..3e8b9be --- /dev/null +++ b/plugins/macaly-code/skills-cursor/build-app-on-macaly/SKILL.md @@ -0,0 +1,40 @@ +--- +name: build-app-on-macaly +description: Build and host a real web app on Macaly when the user asks for a new standalone app or website (e.g. "build a customer feedback dashboard", "build a landing page for X"), or wants changes to an app previously built on Macaly. Uses the Macaly Cloud MCP tools instead of scaffolding local files. +--- + +Macaly provides the git repo, cloud sandbox, build, hosting and publishing; you write +the code through the `macaly-cloud` MCP server's tools. Do NOT scaffold or write files +on the local filesystem for this work, and do not `npm create`/`vite`/`next` a local +project — the app lives in Macaly. + +## The loop + +1. `create_app({ name })` — creates an empty app and returns a `chatId` plus a + **briefing** (stack, boundaries, conventions). **Read the briefing** — it is the + contract. Apps are TanStack Start + Vite + Tailwind with Convex as the backend. + (Pass `teamId` only if `create_app` says you belong to several teams; `list_teams` + finds the id.) +2. `write_file({ chatId, path, content })` for each file — every call is its own git + commit. Write full file contents (no partial edits). Keep `src/routes/__root.tsx`'s + `` if you touch it. +3. Typecheck after your last write with `bash`: run `.sandbox/check-errors` with + `timeoutSeconds: 120`. On failures, `get_logs` (build | dev_server | deploy) has + the real output. +4. Need a database, auth, payments, media, or search? `skill_info({ chatId, skill })` + to read the guide, then **execute its commands with `bash`**. It runs inside the + project sandbox, which has `$MACALY_API_TOKEN`/`$MACALY_BASE_URL`/`$MACALY_CHAT_ID` + set and the skill scripts under `.macaly/skills/`, so the guide's commands run + verbatim (e.g. the setup-convex-db script provisions Convex end-to-end). +5. Env vars live in the app's root `.env.local` — setup skills write it via `bash`; + for a standalone change, `read_file` it and `write_file` the merged result, + preserving lines you don't touch (especially `CONVEX_DEPLOYMENT`). +6. When the app is ready to show, `preview_app({ chatId })` — it returns a preview + URL to share with the user. +7. Only when the user asks to go live: `publish_app({ chatId })`, then poll + `get_deployment` until READY. The preview URL works before that. + +## Reporting back + +Give the user the preview URL (and the live URL after publish). Keep the local +working directory clean — nothing from a Macaly build belongs in local files.