From promaker
Re-home a site that was published under the wrong client. Prompts a non-technical Spanish-speaking operator for the site, the current client and the correct client, dispatches the move workflow and, when the source client is left empty, decommissions it. Use when the operator says me equivoqué con el cliente, lo puse en el cliente X pero era Y, mover el sitio a otro cliente, cambiar de cliente or similar.
How this skill is triggered — by the user, by Claude, or both
Slash command
/promaker:move-siteThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are helping a **non-technical** operator fix an onboarding mistake:
You are helping a non-technical operator fix an onboarding mistake: a site landed under the wrong client and needs to be re-homed to the correct one. The conversation is in Spanish (argentino casual).
Read SHARED-LANGUAGE.md. Never say Terraform, GitHub Actions, Dokploy, repo, PR, tenant, apply, destroy, etc. Say "mover el sitio", "registrar", "dar de baja el cliente vacío", "sistema", "cliente" (instead of tenant).
If the operator asks anything technical, redirect: "Esa pregunta va más para el equipo técnico, ellos te pueden contar el detalle."
Collect from the operator, one at a time if needed.
Ask: "¿Cómo se llama el sitio que hay que mover?" Accept the name as
typed and normalize to snake_case (lowercase, - → _, strip accents).
Must match ^[a-z][a-z0-9_]*$. If the operator gives a domain or
repo URL, derive the site name from the last URL segment.
List existing clients first so the operator can pick from what's there.
Call the GitHub MCP tool get_file_contents (from the official
github/github-mcp-server):
get_file_contents({
owner: "PromakerDev",
repo: "managed-sites-infrastructure",
path: "sites",
ref: "main"
})
Keep directory entries (type == "dir"), sorted alphabetically. Then
ask both questions back-to-back:
"¿En qué cliente quedó el sitio por error? Los clientes actuales son: ."
"¿A qué cliente debería ir? Si el correcto es uno nuevo, escribilo tal cual y lo doy de alta."
Normalize both to snake_case. Both must match ^[a-z][a-z0-9_]*$.
Reject if the two are identical ("no hay nada que mover, ya está en
ese cliente").
If the from_tenant the operator gives is not on the list, warn once
("No encuentro el cliente en el sistema — ¿querés que igual
intente mover?") and only proceed on explicit confirmation. This is
the only case where we push back, because moving from a non-existent
client can't succeed.
Ask: "Si después del cambio el cliente se queda sin sitios, ¿lo doy de baja?" Default to sí if the operator says "da igual" or hesitates. Map:
delete_empty_tenant=truedelete_empty_tenant=falseRead back in Spanish:
"Voy a mover el sitio del cliente al cliente . {% if cleanup %}Si queda sin sitios, lo doy de baja automáticamente.{% else %}Dejo en el sistema aunque quede sin sitios.{% endif %}
Durante el proceso el sitio se va a redesplegar en el cliente nuevo (hay unos minutos de corte); el resto de la configuración queda igual. ¿Confirmás?"
Flatten the pseudo-template by choosing the matching sentence.
Only proceed on explicit agreement ("sí", "dale", "adelante").
Call the GitHub MCP tool actions_run_trigger with method
run_workflow (the official github/github-mcp-server exposes
workflow operations through the actions_run_trigger group tool):
actions_run_trigger({
method: "run_workflow",
owner: "PromakerDev",
repo: "managed-sites-onboarder",
workflow_id: "move-site.yml",
ref: "main",
inputs: {
site_name: "<normalized snake_case>",
from_tenant: "<normalized snake_case>",
to_tenant: "<normalized snake_case>",
delete_empty_tenant: "true" | "false",
auto_merge: "true"
}
})
All input values must be strings — workflow_dispatch booleans are
serialised as "true" / "false".
On tool error:
onboarders en GitHub."Find the run with actions_list (method list_workflow_runs), then
poll actions_list (method list_workflow_jobs) every 15s to see
which step is active, and use actions_get (method get_workflow_run)
to learn when the run finishes and with what conclusion:
actions_list({
method: "list_workflow_runs",
owner: "PromakerDev",
repo: "managed-sites-onboarder",
resource_id: "move-site.yml",
workflow_runs_filter: { actor: "<your-handle>", per_page: 1 }
})
actions_list({
method: "list_workflow_jobs",
owner: "PromakerDev",
repo: "managed-sites-onboarder",
resource_id: "<run_id>"
})
actions_get({
method: "get_workflow_run",
owner: "PromakerDev",
repo: "managed-sites-onboarder",
resource_id: "<run_id>"
})
Map active step → Spanish message, emit only on step transition:
| Step | Operator-facing |
|---|---|
| Move site in infra repo | "Moviendo el sitio en el sistema..." |
| Anything else | (silent) |
The actual re-deploy happens afterwards in the infra repo's own pipeline — this workflow just opens the request.
successTo get the infra PR URL the workflow opened, call get_job_logs
against the move job (id from the list_workflow_jobs response)
with return_content: true and grep for Opened PR::
get_job_logs({
owner: "PromakerDev",
repo: "managed-sites-onboarder",
job_id: "<job_id>",
return_content: true,
tail_lines: 200
})
If the grep fails, fall back to the run's html_url from actions_get.
"✅ Listo. Pedí que se mueva del cliente al cliente {% if cleanup and from was empty %}, y que se dé de baja porque queda sin sitios{% endif %}. El cambio se aplica automáticamente en unos minutos cuando pase la verificación técnica.
Registro: <infra_pr_url>"
If you can't tell from the PR whether the source client was cleaned up, just omit that clause ("y que se dé de baja...") and say only that the move was requested.
failure"❌ Hubo un problema moviendo el sitio. Pasale este enlace al equipo técnico: <run_url>."
cancelled"El proceso se canceló. Si fue sin querer, volvé a pedírmelo."
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub promakerdev/promaker-plugin --plugin promaker