Install
openclaw skills install devplaza-toolchain-setup-relUse this skill for DevPlaza SDLC setup workflows — browsing the tenant tool catalog, creating and updating task-tool bindings, validating provider credentials, and confirming pipeline readiness for a product/project. For Team Admin and Company Admin roles.
openclaw skills install devplaza-toolchain-setup-relThis skill guides Team Admins and Company Admins through configuring the SDLC toolchain for a product — selecting tools per stage, providing credentials, validating connections, and verifying the setup is complete.
In scope:
Out of scope:
devplaza-process-guardian skill)Both Team Admin and Company Admin can create and update task-tool bindings. No approval gate applies to SDLC setup (unlike product creation).
GET /api/v1/tenant/customer/:tenantId/status (alias: GET /api/v1/tenant/customer/tenantStatus/:tenantId on 404)..env first for BASE_URL, JWT, AUTH_EMAIL, AUTH_PASSWORD, TENANT_ID, PRODUCT_ID, PROJECT_ID.For most setup requests, follow this sequence:
POST /api/v1/product/task-tools/Users may specify setup intent in either direction. Handle both:
| User input | What to do |
|---|---|
| Stage-first ("set up the Build stage") | List available tools for that stage from the tenant catalog. Ask which tool(s) to use before collecting credentials. |
| Tool-first ("set up GitHub") | Check which stages/tasks this tool can cover. If it maps to only one stage, proceed. If it maps to multiple (e.g. GitHub can be Code/Dev or Build), ask which stage before collecting credentials. |
| Both specified ("set up GitHub for Code stage") | Confirm the combination and proceed directly to credential collection. |
| Ambiguous ("set up my pipeline") | Ask whether the user wants to configure a specific stage or the full SDLC end-to-end, then follow the relevant path. |
Key rule: never collect credentials or create a binding until both stage/task and tool are confirmed. If either is missing or ambiguous, ask one short clarifying question first.
GET /api/v1/tenant/categoriesGET /api/v1/tenant/tasksGET /api/v1/tenant/toolsPresent catalog results as: stage → tasks available → tools available per task.
POST /api/v1/product/task-tools/
Required fields:
tenantId, productId, projectIds (array of project ids — pass current projectId wrapped in array)categoryId, taskId, toolIdcategoryName, taskName, toolNameowner — resolve from auth context (userId from JWT decode or login response)descriptiveName — human-readable label for this binding (e.g. "GitHub — Code stage")toolsConfig — provider credentials object (see per-provider shapes below)Optional:
governanceenvName — inherited from existing Build task-tool if not providedUniqueness: backend enforces no duplicate for same categoryId + taskId + toolId + productId + projectId. If duplicate detected, surface the existing binding and offer update instead.
PUT /api/v1/product/task-tools/:id
Use for updating credentials or descriptive fields on an existing binding. Always validate new credentials against the provider endpoint before calling PUT — use the same validation endpoint as during create. Do not update a binding with unvalidated credentials. For providers with no validation endpoint (Jira, Confluence, Figma, Google Docs, Google Sheets), skip validation and note that credential confirmation is manual.
PUT /api/v1/product/task-tools/tool/:id/status
Use for marking a tool status change.
DELETE /api/v1/product/task-tools/:id
Use when a binding needs to be removed (e.g. replacing one tool with another). Always ask explicit confirmation with binding name + id before deleting. Permanent — cannot be undone.
GET /api/v1/product/task-tools/tenant/:tenantId/product/:productId/projectId/:projectId/allProductIds/:allProductIds
Use after creating bindings to confirm setup is complete. allProductIds must be URL-encoded JSON array (e.g. %5B%22id1%22%5D). Resolve from product context — use the productId as the single-item array if only one product is in scope.
{ link, apiToken }POST /api/v1/product/github/checkConfiguration with { link, apiToken, taskToolId: "" }toolsConfig fields: { link, apiToken } — no further selection needed.POST /api/v1/product/github/branches with { link, apiToken } — returns { isBranches: [...] }. User selects a branch. Then list YML workflow files via POST /api/v1/product/github/get/yml/files with { link, apiToken, branch } — returns { YMLFiles: [...] }. User selects the workflow file. toolsConfig fields: { link, apiToken, WORKFLOW_FILE_NAME: "<selected.yml>" }{ link, apiToken }, optional pipelineTriggerTokenPOST /api/v1/product/gitlab/validate-env with { link, apiToken, pipelineTriggerToken? }GET /api/v1/product/gitlab/branches?link=...&apiToken=.... User selects a branch. Then list YML pipeline files via GET /api/v1/product/gitlab/yml-files?projectId=...&branch=...&apiToken=...&link=.... User selects the pipeline file. toolsConfig fields: { link, apiToken, pipelineTriggerToken?, ymlFile: "<selected.yml>" }toolsConfig fields: { link, apiToken, pipelineTriggerToken? } — no YML selection needed.{ link, apiToken, userName }POST /api/v1/product/task-tools/jenkins/configtoolsConfig fields: { link, apiToken, userName }{ sonarUrl, token }POST /api/v1/product/sonarqube/authentication/validate with { sonarUrl, token }toolsConfig fields: { link: sonarUrl, apiToken: token, componentId }componentId is required for runtime governance checks — collect it during setup.{ channelId, botToken, userToken }POST /api/v1/product/slack/checkconfiguration with { channelId, botToken, userToken }toolsConfig fields: { channelId, botToken, userToken }{ apiKey, appKey, baseUrl }POST /api/v1/product/datadog/validate with { apiKey, appKey, baseUrl }toolsConfig fields: { apiKey, appKey, baseUrl }baseUrl is region-specific (e.g. https://api.us5.datadoghq.com){ link, orgId, apiToken }POST /api/v1/product/testkube/workflows/check/config with { orgId, apiToken, link }POST /api/v1/product/testkube/env/workflows with { link, orgId, envId, apiToken } — returns { envId, workFlows: string[] }. Ask user to confirm envId and select workflow(s). Ask for an environment name label (e.g. "dev", "staging") to key the template.toolsConfig fields: { orgId, apiToken, link, testkubeTemplates: { [envName]: { envId, workFlows: ["wf1", "wf2"] } } }testkubeTemplates is a map keyed by environment label. Each entry has the envId and an array of selected workflow names. Multiple environments can be added to the same binding.{ url, host, username, apiToken }toolsConfig fields: { url, host, username, apiToken }Apply exactly one fallback retry rule:
404 and a known alias path exists, retry once with alias path.| Contract path | Alias path |
|---|---|
GET /api/v1/tenant/customer/:tenantId | GET /api/v1/tenant/customer/tenantId/:tenantId |
GET /api/v1/tenant/customer/:tenantId/status | GET /api/v1/tenant/customer/tenantStatus/:tenantId |
401/403 from DevPlaza endpoints: session or permission issue — ask user to refresh DevPlaza JWT or check role scope.401/403 from provider validation endpoints (GitHub, SonarQube, Slack, Datadog, etc.): credentials invalid — do NOT suggest refreshing DevPlaza JWT. Report as "invalid credentials" and ask user to check the provider token.404: not found — apply alias fallback once if configured.409/422: validation/conflict — list exact missing/invalid fields.5xx/timeout: transient platform issue — suggest retry.Prefer this structure:
Current stateBlocking issues (or None)Next safe actionFor each task-tool binding created or updated, always confirm:
Never print credential values in output. Use [masked] for all token/key fields.
Team Admins can configure governance rules for tools — defining eligibility criteria and thresholds per tool binding.
Endpoints (tenant-mgmt):
POST /api/v1/tenant/governancePUT /api/v1/tenant/governance/:idGET /api/v1/tenant/governance/:idGET /api/v1/tenant/governance (supports page, pageSize, searchTerm)DELETE /api/v1/tenant/governance/:idtoolId — UUID of the tool this governance applies to (resolve from tenant catalog if user provides a tool name)governanceData — JSON object containing the governance thresholds and criteria (structure is flexible — collect from user or apply sensible defaults)When a user wants to set or update governance for a tool:
toolId from the tenant catalog if not already known.governanceData from the user (e.g. pass threshold, coverage percentage, eligibility criteria). If the user wants defaults, use { "eligibilityCriteria": "standard", "isActive": true } and note that they can update later.To check if governance already exists for a tool: GET /api/v1/tenant/governance with searchTerm matching the tool name, or list all and filter by toolId.
Do not delete governance records without explicit user confirmation including the governance id and associated tool name.
After all bindings are confirmed and the setup summary is presented, always close with:
"Setup is complete. To run governance checks and verify integration readiness before your first build or deploy, switch to the Process Guardian skill."
Do not attempt to trigger runs from the toolchain setup skill. That is the guardian skill's responsibility.
A Team Admin may want to replicate an existing project's toolchain setup to a new project under the same product.
When a user requests this (e.g. "set up project X the same as project Y"):
POST /api/v1/product/task-tools/ with the same categoryId, taskId, toolId, toolsConfig, and descriptiveName, but with the target projectId in projectIds.Uniqueness rule still applies: if a binding for the same categoryId + taskId + toolId + productId + projectId already exists on the target project, surface it and skip — do not duplicate.