/SKILL.md
Deploy the current project to Ploi Cloud. Detects project type, creates or updates the app via MCP, deploys, monitors, and auto-fixes failures. Supports both git repos and upload-based deployments.
npx skillsauth add ploicloud/skill pc-deployInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Deploy the current project to Ploi Cloud directly from your editor. Scans the project, creates or updates the application via MCP, deploys, monitors, and auto-fixes failures. Works with git repositories and projects without a repo (via source upload).
The Ploi Cloud MCP server must be connected. If not configured, tell the user to run:
claude mcp add --transport http ploi-cloud https://ploi.cloud/mcp
Determine the deployment mode: git or upload.
git rev-parse --git-dir to check if this is a git repogit remote get-url origin to check for a remote URLgit branch --show-current to get the current branchScan local files to determine the project type and requirements.
Type detection (first match wins):
composer.json containing laravel/framework → laravelcomposer.json containing statamic/cms → statamiccomposer.json containing craftcms/cms → craftcmswp-config.php exists → wordpresscomposer.json exists (generic) → phppackage.json exists → nodejsRuntime detection:
composer.json → require.php constraint, pick the highest matching version (8.1, 8.2, 8.3, 8.4)package.json → engines.node, default to 20 if not specifiedext-* keys from composer.json → require, exclude built-in (opcache, pcntl, pdo_mysql, pdo_pgsql, redis, sodium, zip)Service detection from dependencies:
| Dependency | Service type |
|---|---|
| mysql2, @prisma/client with MySQL in schema | mysql |
| pg, postgres, @prisma/client with PostgreSQL | postgresql |
| mongodb, mongoose, mongodb/mongodb | mongodb |
| predis/predis, ext-redis, redis, ioredis | redis |
| php-amqplib/php-amqplib, amqplib | rabbitmq |
Build commands by type:
| Type | Default build command |
|---|---|
| laravel | composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev && npm ci && npm run build |
| statamic | composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev && npm ci && npm run build |
| craftcms | composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev |
| wordpress | (none) |
| php | composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev |
| nodejs | npm ci && npm run build |
Init commands:
php artisan migrate --forcephp craft install/check && php craft migrate/all --no-interactionSecrets:
.env.example if it existsAPP_KEY (auto-generated by Ploi Cloud for Laravel apps)applications_index to list all appssource_type = uploadGit mode:
applications_store — create with name (repo name), type, repository URL, owner, name, branchUpload mode:
applications_store — create with name (directory name), type, and source_type: "upload". Do NOT pass repository fields.Both modes (continue):
2. applications_build-config_update — set build commands and init commands
3. applications_settings_update — set health_check_path (/ for most types, /up for Statamic)
4. applications_php-config_update — set PHP version and extensions (PHP apps only)
5. v1_applications_services_store — create each detected service (memory: 512Mi, volume_size: 5Gi)
6. applications_secrets_store — add required secrets only
7. Go to Phase 4c (upload mode) or Phase 5 (git mode)
Git mode:
applications_repository_update — update repo URL and branch if changedBoth modes (continue):
2. applications_build-config_update — update build commands if needed
3. v1_applications_services_index — check existing services, add any missing via v1_applications_services_store
4. Go to Phase 4c (upload mode) or Phase 5 (git mode)
Skip this phase entirely in git mode.
.dockerignore if it exists.gitignore if it existstar czf /tmp/ploi-source-upload.tar.gz --exclude='.git' --exclude='node_modules' --exclude='.DS_Store' -X <ignore-file> -C <project-dir> .
If no ignore file exists, omit the -X flag. Always exclude .git, node_modules, and .DS_Store.applications_source_upload_url with the application ID to get a signed upload URLcurl -s -X POST -F 'source=@/tmp/ploi-source-upload.tar.gz' '<upload_url>'
Verify the response contains "success": true.rm /tmp/ploi-source-upload.tar.gzapplications_deploy to trigger a deploymentPoll every 15 seconds for up to 10 minutes.
applications_deployments_logs with tail: 100 to check build progressapplications_status to check if the app is livefailed or cancelled → go to Phase 7 (Auto-fix)active → go to Phase 8 (Success)running or app status deploying) → wait 15 seconds and repeatMaximum 5 retry attempts. Diagnose the failure and apply a fix.
Diagnosis:
applications_deployments_logs with tail: 2000)applications_logs)applications_debug_summary)Fix patterns:
| Error | Fix |
|---|---|
| OOMKilled / exit code 137 | applications_resources_update — increase memory (1Gi → 2Gi → 4Gi) |
| Missing PHP extension | applications_php-config_update — add the extension |
| Build failure (composer/npm) | applications_build-config_update — adjust commands |
| Health check failure | applications_settings_update — change health_check_path |
| Missing environment variable | applications_secrets_store — add the variable |
| Database connection error | Check service exists, verify env var injection |
After applying a fix:
applications_deploy to redeployapplications_show to get the auto-assigned domainapplications_debug_summary that pods are healthyAPP_KEY to secrets — Ploi Cloud generates it for Laravel apps1Gi. Use applications_resources_update with the memory_request parameter to change it"5Gi" (Kubernetes quantity format with unit suffix)RUN in the Dockerfile — chain dependent commands with &&${VAR} interpolation in secrets only resolves other user secrets, NOT service-injected varsnpm install -g work finestarting, active, deploying, stopping, stopped, destroying, failed. Use active to confirm the app is livepending, running, success, failed, cancelled. Note that running means the build is in progress, not that the app is liveskip_build (redeploy) — every deployment runs a full build.git, node_modules, and .DS_Store at minimumtools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.