Create, modify, generate, and deploy websites, web apps, dashboards, SaaS products, internal tools, interactive web pages, Weixin mini program , games on the Baidu Miaoda (秒哒) platform using natural-language instructions.
Install with the open skills CLI (global, non-interactive — available in every Claude Code session):
npx skills add LeoYeAI/openclaw-master-skills --skill "miaoda-app-builder" -g -a claude-code -yOr manually — clone and copy the skill directory (SKILL.md + companion files):
git clone --depth 1 https://github.com/LeoYeAI/openclaw-master-skills /tmp/openclaw-master-skills && cp -r /tmp/openclaw-master-skills/skills/miaoda-app-builder ~/.claude/skills/miaoda-app-builderThis skill is a directory: SKILL.md is the entry point; the files below ship with it.
---
name: miaoda-app-builder
description: Create, modify, generate, and deploy websites, web apps, dashboards, SaaS products, internal tools, interactive web pages, Weixin mini program , games on the Baidu Miaoda (秒哒) platform using natural-language instructions.
metadata: { "openclaw": {"requires": { "bins": ["python3"], "env":["MIAODA_API_KEY"]},"primaryEnv":"MIAODA_API_KEY" } }
---
# Miaoda (秒哒) App Builder
Miaoda (秒哒) is a **chat-driven full-stack application builder**.
Official website: https://www.miaoda.cn
Users describe what they want in natural language and Miaoda generates a **production-ready web product**, including:
- frontend UI
- backend services
- database schema
- integrations
- deployable hosting
Typical outputs include:
- websites
- web applications
- dashboards
- SaaS products
- admin panels
- internal tools
- landing pages
- interactive web pages
- browser games and mini games
This skill enables AI agents to interact with the **Miaoda(秒哒) platform** to create, iterate, generate, and deploy applications.
All platform operations must be executed through the packaged CLI script:
```bash
python scripts/miaoda_api.py <command> [options]
```
Do **not** call platform APIs directly. Always use the CLI commands provided by this skill.
---
# When to Use This Skill
Use this skill whenever the user wants to:
* create a **website**
* create a **webpage**
* build a **web application**
* build a **dashboard**
* create a **SaaS product**
* build an **admin panel**
* build an **internal tool**
* create a **landing page**
* build an **interactive web page**
* create a **browser game**
* create a **mini game**
* generate an **MVP web product**
* modify an existing **Miaoda project**
* publish or deploy a **Miaoda application**
Do **not** use this skill for unrelated programming tasks.
---
# Routing Keywords
Trigger this skill if the request includes concepts such as:
* build a website
* create a webpage
* build a web app
* create a SaaS
* build a dashboard
* create an admin panel
* build an internal tool
* create a landing page
* build a browser game
* create a mini game
* generate a web product
* make a snake game webpage
* build a todo web app
* create a blog site
---
# Example Requests
Examples that should route to this skill:
* "Create a todo list web app"
* "Build a personal blog website"
* "Make a dashboard for sales analytics"
* "Create a SaaS landing page"
* "Build an admin panel"
* "Write a snake game webpage"
* "Create a browser game"
* "Build a mini web game"
* "Modify my Miaoda project"
* "Publish this Miaoda app"
---
# Stateless Execution Model
The CLI script is **stateless**.
It does not store workflow state between calls.
Application workflow state is maintained by the Miaoda platform and must be inferred from:
* `appId`
* `conversationId`
* application detail
* conversation trajectory events
Agents must pass the appropriate identifiers when continuing conversations or modifying applications.
---
# Application Lifecycle Rules
Miaoda applications follow a strict lifecycle.
Agents must follow these rules.
---
## Initial Creation
For a new application:
1. Start with a `chat` request describing the product.
2. The application enters the **PRD refinement stage**.
3. Continue chatting to refine the specification.
4. When the platform indicates **Generate App**, trigger application generation using `generate-app`.
Generation is required **only once** during the initial creation.
---
## Multi-Round Modification
After an application has already been generated:
* **Do not call `generate-app` again.**
* Continue using `chat` with the same `appId` and `conversationId`.
Normal chat messages modify the existing application.
---
## Publishing
Publishing is allowed **after the application has been generated at least once**.
Rules:
* Publishing does **not require another generation step**
* Publishing may happen anytime after the first generation
* Publishing must be followed by **status polling** (or use `--wait` flag)
Typical deployment flow:
```
publish → publish-status polling
```
Or use the `--wait` flag to auto-poll:
```
publish --wait
```
Stop polling when the status becomes:
* `SUCCESS`
* `FAILED`
---
# Application URLs
Miaoda provides two types of URLs during the lifecycle.
---
## Project Preview (Editor / Development)
After the application is created, the project can be accessed at:
```
https://www.miaoda.cn/projects/<app_id>
```
This URL can be shared with the user for:
* viewing the project
* editing the application
* previewing the generated result
The preview URL becomes available once an `appId` is created.
---
## Production Deployment URL
After publishing succeeds, the application is accessible at:
```
https://<app_id>.appmiaoda.com
```
This is the **public production URL** of the deployed application.
Only return this URL after publishing completes successfully.
---
# Standard Workflow
## Create New Application
```
chat → PRD refinement → generate-app → publish
```
---
## Modify Existing Generated Application
```
chat → chat → chat
```
(no additional generation step required)
---
## Deploy Application
```
publish → publish-status polling
```
Or:
```
publish --wait
```
---
# Available Commands
All commands are executed via the CLI script.
**Important**: Always set the `MIAODA_API_KEY` environment variable before running commands.
```bash
export MIAODA_API_KEY="your_api_key_here"
```
---
## list-apps
List all applications belonging to the authenticated user.
**Usage:**
```bash
python scripts/miaoda_api.py list-apps
```
**Example:**
```bash
export MIAODA_API_KEY="sk_xxxxx"
python scripts/miaoda_api.py list-apps
```
**Returns:** JSON array of applications with `appId`, `name`, `type`, etc.
---
## app-detail
Get detailed information about a specific application.
**Usage:**
```bash
python scripts/miaoda_api.py app-detail --app-id <app_id>
```
**Required Parameters:**
- `--app-id APP_ID`: Application ID
**Example:**
```bash
export MIAODA_API_KEY="sk_xxxxx"
python scripts/miaoda_api.py app-detail --app-id app-abc123xyz
```
**Returns:** JSON object with application details, configuration, and status.
---
## chat
Start or continue a conversation to create or modify an application.
**Usage:**
```bash
python scripts/miaoda_api.py chat --text "description" [options]
```
**Required Parameters:**
- `--text TEXT`: The message/instruction to send
**Optional Parameters:**
- `--context-id CONTEXT_ID`: Conversation ID of an existing app.
- `--app-id APP_ID`: Application ID of an existing app.
- `--query-mode QUERY_MODE`: Query mode (default: deep_mode)
- `--input-field-type INPUT_FIELD_TYPE`: Input field type (default: web)
- `--poll-interval SECONDS`: Seconds between trajectory polls (default: 2.0)
- `--fetch-timeout SECONDS`: Per-request timeout for each trajectory fetch (default: 10)
- `--no-stream`: Return raw chat POST response without trajectory polling
- `--prompt-generate`: After polling, interactively ask whether to submit app generation if text was returned
> **⚠️ IMPORTANT — `--app-id` and `--context-id` must always be used together.**
>
> | Intent | `--app-id` | `--context-id` |
> |--------|-----------|----------------|
> | Create a brand-new app | omit | omit |
> | Continue / modify an existing app | required | required (conversationId) |
>
> Passing `--app-id` **without** `--context-id` will **NOT** modify the existing app.
> The platform will silently create a **new** app every time. The CLI will now raise an error in this case to prevent accidental app proliferation.
**Examples:**
**1. Create a new application:**
```bash
export MIAODA_API_KEY="sk_xxxxx"
python scripts/miaoda_api.py chat --text "创建一个待办事项管理应用"
```
Response includes `appId` and `contextId` for subsequent calls.
**2. Continue conversation (refine PRD):**
```bash
python scripts/miaoda_api.py chat \
--text "添加优先级标记功能" \
--app-id app-abc123xyz \
--context-id conv-def456uvw
```
**3. Modify existing generated app:**
```bash
python scripts/miaoda_api.py chat \
--text "把按钮颜色改成蓝色" \
--app-id app-abc123xyz \
--context-id conv-def456uvw
```
**Important Notes:**
- Extract `appId` and `contextId` from the response and save them
- Use these IDs for all subsequent operations on the same app
- The first `chat` creates the app and starts PRD refinement
- After generation, `chat` directly modifies the app (no `generate-app` needed)
---
## trajectory
Poll trajectory events until the task reaches a terminal state.
**Usage:**
```bash
python scripts/miaoda_api.py trajectory --app-id <app_id> [options]
```
**Required Parameters:**
- `--app-id APP_ID`: Application ID
**Optional Parameters:**
- `--last-event-id EVENT_ID`: Start eventId; -1 = all events from beginning (default: -1)
- `--poll-interval SECONDS`: Seconds between polls (default: 2.0)
- `--fetch-timeout SECONDS`: Per-request timeout in seconds (default: 10)
- `--sse`: Use legacy SSE streaming instead of polling
**Example:**
```bash
export MIAODA_API_KEY="sk_xxxxx"
python scripts/miaoda_api.py trajectory --app-id app-abc123xyz
```
**Use Cases:**
- Monitor conversation / generation progress
- Detect when PRD refinement is complete
- Verify generation has completed
---
## fetch-trajectory
Fetch one batch of trajectory events (single request, no polling loop).
**Usage:**
```bash
python scripts/miaoda_api.py fetch-trajectory --app-id <app_id> [options]
```
**Required Parameters:**
- `--app-id APP_ID`: Application ID
**Optional Parameters:**
- `--last-event-id EVENT_ID`: Fetch events after this eventId; -1 = all (default: -1)
- `--fetch-timeout SECONDS`: Request timeout in seconds (default: 10)
**Example:**
```bash
# First call — get all events (note maxEventId from stderr)
python scripts/miaoda_api.py fetch-trajectory --app-id app-abc123xyz
# Subsequent calls — incremental fetch
python scripts/miaoda_api.py fetch-trajectory --app-id app-abc123xyz --last-event-id 345
```
Events are printed to stdout as JSON lines; `{"maxEventId": N, "isTerminal": bool}` is printed to stderr.
---
## generate-app
Submit app-generation confirmation and return immediately with `appId`/`conversationId`.
**Usage:**
```bash
python scripts/miaoda_api.py generate-app --app-id <app_id> --context-id <context_id> [options]
```
**Required Parameters:**
- `--app-id APP_ID`: Application ID
**Optional Parameters:**
- `--context-id CONTEXT_ID`: Conversation ID (default: "")
- `--query-mode QUERY_MODE`: Query mode (default: deep_mode)
- `--watch`: Block and poll trajectory until generation completes (default: return immediately)
- `--poll-interval SECONDS`: Seconds between polls when `--watch` is set (default: 2.0)
- `--fetch-timeout SECONDS`: Per-request timeout in seconds when `--watch` is set (default: 10)
**Example:**
```bash
export MIAODA_API_KEY="sk_xxxxx"
# Submit and return immediately — check status later with fetch-trajectory
python scripts/miaoda_api.py generate-app \
--app-id app-abc123xyz \
--context-id conv-def456uvw
# Submit and block until generation finishes
python scripts/miaoda_api.py generate-app \
--app-id app-abc123xyz \
--context-id conv-def456uvw \
--watch
```
**Important:**
- Only call this **once** during initial creation
- Call when the platform indicates "Generate App" is ready
- Do **not** call again for modifications after the first generation
- After this command, use `chat` to modify the generated app
---
## publish
Trigger deployment to production.
**Usage:**
```bash
python scripts/miaoda_api.py publish --app-id <app_id> [options]
```
**Required Parameters:**
- `--app-id APP_ID`: Application ID to publish
**Optional Parameters:**
- `--env ENV`: Target environment (default: PRODUCE)
- `--wait`: Auto-poll publish status until SUCCESS or FAILED
**Examples:**
**1. Publish and manually check status:**
```bash
export MIAODA_API_KEY="sk_xxxxx"
python scripts/miaoda_api.py publish --app-id app-abc123xyz
```
Returns `releaseId` immediately. Then poll with `publish-status`.
**2. Publish and auto-wait for completion (recommended):**
```bash
export MIAODA_API_KEY="sk_xxxxx"
python scripts/miaoda_api.py publish --app-id app-abc123xyz --wait
```
This polls automatically and exits when deployment succeeds or fails.
**Important:**
- Application must be generated at least once before publishing
- After successful publish, the app is live at: `https://<app_id>.appmiaoda.com`
---
## publish-status
Check the status of a deployment.
**Usage:**
```bash
python scripts/miaoda_api.py publish-status --release-id <release_id>
```
**Required Parameters:**
- `--release-id RELEASE_ID`: Release ID from `publish` command
**Example:**
```bash
export MIAODA_API_KEY="sk_xxxxx"
python scripts/miaoda_api.py publish-status --release-id app_release_record-xyz789abc
```
**Returns:** JSON with status: `PROCESSING`, `RUNNING`, `SUCCESS`, or `FAILED`
**Usage Pattern:**
```bash
# Get release ID from publish
RELEASE_ID=$(python scripts/miaoda_api.py publish --app-id app-abc123xyz | jq -r '.releaseId')
# Poll status
while true; do
STATUS=$(python scripts/miaoda_api.py publish-status --release-id $RELEASE_ID | jq -r '.status')
echo "Status: $STATUS"
if [[ "$STATUS" == "SUCCESS" || "$STATUS" == "FAILED" ]]; then
break
fi
sleep 5
done
```
**Tip:** Use `publish --wait` to avoid manual polling.
---
# Complete Workflow Examples
## Example 1: Create and Deploy a New App
```bash
export MIAODA_API_KEY="sk_xxxxx"
cd ~/.openclaw/skills/miaoda-app-builder
# Step 1: Create app via chat (returns appId + conversationId on first line)
FIRST=$(python scripts/miaoda_api.py chat --text "创建一个简单的计数器应用" | head -1)
APP_ID=$(echo $FIRST | jq -r '.appId')
CONTEXT_ID=$(echo $FIRST | jq -r '.conversationId')
# Step 2: Generate the app (returns immediately; use fetch-trajectory to check progress)
python scripts/miaoda_api.py generate-app \
--app-id $APP_ID \
--context-id $CONTEXT_ID
# Step 3: Poll until generation finishes
python scripts/miaoda_api.py trajectory --app-id $APP_ID
# Step 4: Publish (with auto-wait)
python scripts/miaoda_api.py publish --app-id $APP_ID --wait
# Done! App is live at:
echo "https://$APP_ID.appmiaoda.com"
```
---
## Example 2: Modify an Existing App
```bash
export MIAODA_API_KEY="sk_xxxxx"
cd ~/.openclaw/skills/miaoda-app-builder
APP_ID="app-abc123xyz"
CONTEXT_ID="conv-def456uvw"
# Modify the app (no generate-app needed)
python scripts/miaoda_api.py chat \
--text "把背景颜色改成深色模式" \
--app-id $APP_ID \
--context-id $CONTEXT_ID
# Re-publish
python scripts/miaoda_api.py publish --app-id $APP_ID --wait
```
---
# Command Semantics
## chat
Used to:
* create a new application
* refine PRD specifications
* modify an existing generated application
For a new application, `chat` creates the project and begins the PRD stage.
For an existing application, `chat` performs iterative modifications.
---
## trajectory
Streams conversation progress and system events.
Use this to determine:
* whether PRD generation is ongoing
* whether the app is ready for generation
* whether generation has completed
---
## generate-app
Triggers application generation.
Use only when the platform indicates the app is ready to generate.
Call **once** during initial creation. Do not call again for modifications.
---
## publish
Triggers application deployment.
Use `--wait` flag to auto-poll status (recommended).
---
## publish-status
Polls deployment progress until the release completes.
Not needed if using `publish --wait`.
---
# Error Handling
## IAM AccessKey Validation Failed
**Symptom:**
```
IAM access key validation failed.
```
**Cause:**
The configured `MIAODA_API_KEY` is invalid or missing.
**Resolution:**
1. Go to the Miaoda(秒哒) official website:
https://www.miaoda.cn
2. In the left navigation panel, apply for an available access key.
3. Set the key as the environment variable:
```bash
export MIAODA_API_KEY="sk_xxxxx"
```
4. Or create a `.env` file in the skill directory:
```bash
echo "MIAODA_API_KEY=sk_xxxxx" > ~/.openclaw/skills/miaoda-app-builder/.env
```
---
## NotOpenSSLWarning
**Symptom:**
```
NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+,
currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'
```
**Cause:**
macOS uses LibreSSL by default, but urllib3 v2 recommends OpenSSL.
**Impact:**
This is a **warning only**. API calls still work correctly.
**Resolution (optional):**
If you want to suppress the warning:
```bash
pip3 install 'urllib3<2'
```
Or ignore it - it doesn't affect functionality.
---
# Error Handling Guidance
Agents should handle the following situations:
* generation requested before the platform indicates readiness
* publish requested before generation has completed
* missing `appId` or `conversationId`
* interrupted trajectory stream
* failed deployment status
* incorrect or missing parameter values
If workflow state is unclear, inspect the trajectory or application detail before taking the next action.
**Pro Tips:**
- Always check command `--help` when unsure about parameters
- Use `--wait` flag with `publish` to simplify deployment
- Save `appId` and `contextId` from first `chat` response
- Only call `generate-app` once during initial creation
- After generation, use `chat` directly for modifications
**Application Sharing Rule (IMPORTANT)**
- You must share your application **only using the production deployment URL** (after it has been published). Do not share the editor (development) URL.
Production deployment URL format:
```
https://<app_id>.appmiaoda.com
```
- If the application has **not been published**, you must publish it before sharing with others.
Example publish command:
```
python scripts/miaoda_api.py publish --app-id <app_id> --wait
```
- The project editor URL (`https://www.miaoda.cn/projects/<app_id>`) is **visible only to yourself**. Other users cannot access your editor environment. Never use the editor URL for sharing with others.
Editor URL is for:
- your own development
- preview
- internal editing only
Editor URL must NOT be used for:
- external/public sharing
- distribution to others or end users
You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.
Roleplay the most difficult, tech-resistant user for your product. Browse the app as that persona, find every UX pain point, then filter complaints through a pragmatism layer to separate real problems from noise. Creates actionable tickets from genuine issues only.
Operate the Antigravity CLI (agy): plugins, auth, sandbox.