Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
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
12 changes: 12 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,18 @@
"authentication": "ON_INSTALL"
},
"category": "Coding"
},
{
"name": "base44-sandbox",
"source": {
"source": "local",
"path": "./plugins/base44-sandbox"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Coding"
}
]
}
12 changes: 12 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@
"license": "MIT",
"keywords": ["base44", "full-stack", "sdk", "cli", "deployment"],
"category": "development"
},
{
"name": "base44-sandbox",
"source": "./plugins/base44-sandbox",
"description": "Develop a Base44 app remotely in Base44's cloud sandbox — no local files, no deploy/push. Resource conventions for entities, functions, agents, and connectors, plus SDK and troubleshooting.",
"version": "1.0.0-beta.1",
"author": { "name": "base44" },
"homepage": "https://docs.base44.com",
"repository": "https://github.com/base44/skills",
"license": "MIT",
"keywords": ["base44", "sandbox", "remote-dev", "mcp", "entities", "backend-functions"],
"category": "development"
}
]
}
4 changes: 4 additions & 0 deletions .claude/skills/sync-cli-skill/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,10 @@ After processing all changed commands, update the SKILL.md of each affected skil
- Keep the existing structure and formatting of each skill
- Do NOT change the frontmatter description unless explicitly asked

### Step 6b: Flag base44-sandbox for review

The `skills/base44-sandbox/` skill (the cloud-sandbox flavor) is **hand-authored** and self-contained — it carries its own concise guidelines and links out to `base44-cli`'s references rather than copying them, so this sync does not edit it automatically. If this sync changed the backend-function authoring conventions in `skills/base44-cli/references/functions-create.md` (directory layout, `function.jsonc` shape, Deno entry-point conventions, naming rules), **flag `skills/base44-sandbox/SKILL.md` for manual review** in the summary so its inline guidance can be updated to match.

### Step 7: Update CLI_VERSION and Skill Frontmatter

After successfully updating all changed commands:
Expand Down
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,30 @@ npx skills add base44/skills
npx skills add base44/skills -g
```

### Sandbox flavor (remote dev — no local files)

If you develop your app inside **Base44's cloud sandbox** (the platform auto-builds, auto-commits, and auto-syncs, so you never run deploy/push), install the focused `base44-sandbox` plugin instead of the full set. It bundles `base44-remote-dev`, `base44-sandbox`, `base44-sdk`, and `base44-troubleshooter` — and deliberately excludes the deploy-oriented `base44-cli`.

```bash
# Claude Code
claude plugin install base44-sandbox@base44-skills

# Codex CLI: register the marketplace, then /plugins → "Base44 Sandbox" → Install
codex plugin marketplace add base44/skills

# Other agents (skills CLI)
npx skills add base44/skills --skill base44-remote-dev --skill base44-sandbox --skill base44-sdk --skill base44-troubleshooter
```

## Available Skills

| Skill | Description |
|-------|-------------|
| [`base44-cli`](skills/base44-cli/SKILL.md) | Create and manage Base44 projects using the CLI. Handles resource configuration (entities, backend functions, AI agents), initialization, and deployment. |
| [`base44-sdk`](skills/base44-sdk/SKILL.md) | Build apps using the Base44 JavaScript SDK. Communicate with remote resources like entities, backend functions, and AI agents. |
| [`base44-troubleshooter`](skills/base44-troubleshooter/SKILL.md) | Troubleshoot production issues using backend function logs. Use when investigating app errors or diagnosing production problems. |
| [`base44-remote-dev`](skills/base44-remote-dev/SKILL.md) | Develop a Base44 app remotely from your own coding agent by connecting it to the Base44 sandbox over MCP or the `base44 sandbox` CLI. |
| [`base44-sandbox`](skills/base44-sandbox/SKILL.md) | Author Base44 app code inside the cloud sandbox — no deploy/push; writing a resource file (function, entity, agent) into the sandbox is what ships it. |

## About Agent Skills

Expand Down
14 changes: 14 additions & 0 deletions plugins/base44-sandbox/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "base44-sandbox",
"version": "1.0.0-beta.1",
"description": "Develop a Base44 app remotely in Base44's cloud sandbox; conventions only, no deploy/push.",
"author": {
"name": "base44",
"url": "https://base44.com"
},
"homepage": "https://docs.base44.com",
"repository": "https://github.com/base44/skills",
"license": "MIT",
"keywords": ["base44", "sandbox", "remote-dev", "mcp", "entities", "backend-functions"],
"skills": ["./skills/base44-remote-dev/", "./skills/base44-sandbox/", "./skills/base44-sdk/", "./skills/base44-troubleshooter/"]
}
24 changes: 24 additions & 0 deletions plugins/base44-sandbox/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "base44-sandbox",
"version": "1.0.0-beta.1",
"description": "Develop a Base44 app remotely in Base44's cloud sandbox; conventions only, no deploy/push.",
"author": {
"name": "base44",
"url": "https://base44.com"
},
"homepage": "https://docs.base44.com",
"repository": "https://github.com/base44/skills",
"license": "MIT",
"keywords": ["base44", "sandbox", "remote-dev", "mcp", "entities", "backend-functions"],
"skills": ["./skills/base44-remote-dev/", "./skills/base44-sandbox/", "./skills/base44-sdk/", "./skills/base44-troubleshooter/"],
"interface": {
"displayName": "Base44 Sandbox",
"shortDescription": "Develop Base44 apps remotely in the cloud sandbox from Codex",
"longDescription": "Develop a Base44 app inside Base44's cloud sandbox where the platform auto-builds, auto-commits, and auto-syncs. Includes conventions for entities, functions, agents, and connectors, SDK development, and production troubleshooting — without deploy/push commands.",
"developerName": "base44",
"category": "Coding",
"capabilities": ["Interactive", "Read", "Write"],
"websiteURL": "https://base44.com",
"logo": "./assets/base44-logo.png"
}
}
16 changes: 16 additions & 0 deletions plugins/base44-sandbox/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "base44-sandbox",
"displayName": "Base44 Sandbox",
"version": "1.0.0-beta.1",
"description": "Develop a Base44 app remotely in Base44's cloud sandbox; conventions only, no deploy/push.",
"author": {
"name": "base44",
"url": "https://base44.com"
},
"homepage": "https://docs.base44.com",
"repository": "https://github.com/base44/skills",
"license": "MIT",
"logo": "./assets/base44-logo.png",
"keywords": ["base44", "sandbox", "remote-dev", "mcp", "entities", "backend-functions"],
"skills": ["./skills/base44-remote-dev/", "./skills/base44-sandbox/", "./skills/base44-sdk/", "./skills/base44-troubleshooter/"]
}
1 change: 1 addition & 0 deletions plugins/base44-sandbox/assets
1 change: 1 addition & 0 deletions plugins/base44-sandbox/skills
53 changes: 45 additions & 8 deletions scripts/validate-template.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -217,20 +217,43 @@ async function validateComponentFrontmatter(pluginDir, pluginName) {
}
}

async function main() {
const pluginDir = repoRoot;
async function discoverPluginDirs() {
// Every directory containing a .cursor-plugin/plugin.json is a plugin to validate:
// the repo root plus any bundle under plugins/*/.
const dirs = [];
if (await pathExists(path.join(repoRoot, ".cursor-plugin", "plugin.json"))) {
dirs.push(repoRoot);
}

const pluginsRoot = path.join(repoRoot, "plugins");
if (await pathExists(pluginsRoot)) {
const entries = await fs.readdir(pluginsRoot, { withFileTypes: true });
for (const entry of entries) {
if (!entry.isDirectory()) {
continue;
}
const candidate = path.join(pluginsRoot, entry.name);
if (await pathExists(path.join(candidate, ".cursor-plugin", "plugin.json"))) {
dirs.push(candidate);
}
}
}

return dirs;
}

async function validatePlugin(pluginDir) {
const manifestPath = path.join(pluginDir, ".cursor-plugin", "plugin.json");
const pluginManifest = await readJsonFile(manifestPath, "Plugin manifest");
if (!pluginManifest) {
summarizeAndExit();
return;
}

const pluginName = pluginManifest.name ?? "<unknown>";

if (typeof pluginManifest.name !== "string" || !pluginNamePattern.test(pluginManifest.name)) {
addError(
'"name" in plugin.json must be lowercase and use only alphanumerics, hyphens, and periods.'
`${pluginName}: "name" in plugin.json must be lowercase and use only alphanumerics, hyphens, and periods.`
);
}

Expand All @@ -243,15 +266,29 @@ async function main() {
}

await validateComponentFrontmatter(pluginDir, pluginName);
}

async function main() {
const pluginDirs = await discoverPluginDirs();
if (pluginDirs.length === 0) {
addError("No .cursor-plugin/plugin.json manifest found at the repo root or under plugins/*/.");
summarizeAndExit();
return;
}

for (const pluginDir of pluginDirs) {
await validatePlugin(pluginDir);
}

const hooksPath = path.join(pluginDir, "hooks", "hooks.json");
// hooks/mcp checks apply to the repo root only (shared plugin assets).
const hooksPath = path.join(repoRoot, "hooks", "hooks.json");
if (!(await pathExists(hooksPath))) {
addWarning(`${pluginName}: no hooks/hooks.json file found (only needed when using hooks).`);
addWarning("no hooks/hooks.json file found (only needed when using hooks).");
}

const mcpPath = path.join(pluginDir, "mcp.json");
const mcpPath = path.join(repoRoot, "mcp.json");
if (!(await pathExists(mcpPath))) {
addWarning(`${pluginName}: no mcp.json file found (only needed when using MCP servers).`);
addWarning("no mcp.json file found (only needed when using MCP servers).");
}

summarizeAndExit();
Expand Down
Loading
Loading