{
  "schemaVersion": "1.0",
  "item": {
    "slug": "pmctl",
    "name": "pmctl",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/wbingli/pmctl",
    "canonicalUrl": "https://clawhub.ai/wbingli/pmctl",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/pmctl",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=pmctl",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/pmctl"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/pmctl",
    "agentPageUrl": "https://openagent3.xyz/skills/pmctl/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pmctl/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pmctl/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "pmctl — Postman CLI for API Discovery",
        "body": "pmctl wraps the Postman API to let you browse collections, inspect requests, and resolve environment variables from the terminal. Use it to discover endpoints, construct curl commands, and understand APIs without opening the Postman GUI.\n\nInstall: pip install pmctl\nSource: github.com/wbingli/pmctl"
      },
      {
        "title": "Setup",
        "body": "# Add a profile with your Postman API key\npmctl profile add <name> --api-key \"PMAK-...\" --default\n\n# Set a default workspace (scopes list commands)\npmctl profile set-workspace <workspace-id>\n\n# Verify\npmctl profile whoami\n\nGet an API key at https://go.postman.co/settings/me/api-keys"
      },
      {
        "title": "Profiles",
        "body": "pmctl profile list                          # List profiles\npmctl profile add <name> -k \"PMAK-...\" -d  # Add (--default)\npmctl profile switch <name>                 # Switch default\npmctl profile set-workspace <id>            # Set default workspace\npmctl profile remove <name>                 # Remove\npmctl profile whoami                        # Current user info"
      },
      {
        "title": "Collections",
        "body": "pmctl collections list                      # List (scoped to default workspace)\npmctl collections list --all                # All workspaces\npmctl collections show <UID>                # Tree view of all requests"
      },
      {
        "title": "Requests",
        "body": "# List all requests in a collection (flat table: method, name, path, URL)\npmctl requests list -c \"Collection Name\"\npmctl requests list -c <collection-uid>\n\n# Fuzzy search (characters matched in order, e.g. \"getCmp\" matches \"get Campaign\")\npmctl requests list -c \"My API\" --search \"getUser\"\n\n# Show request details (headers, body, query params, path variables)\npmctl requests show \"request name\" -c \"Collection Name\"\n\n-c / --collection accepts a collection name (case-insensitive) or UID.\nrequests show uses case-insensitive substring match — use short terms.\nrequests list --search uses fuzzy matching (characters in order)."
      },
      {
        "title": "Environments",
        "body": "pmctl environments list                     # List environments\npmctl environments show <name-or-id>       # Show variables\npmctl environments show <name> --full       # Full values (no truncation)"
      },
      {
        "title": "Workspaces",
        "body": "pmctl workspaces list                       # List accessible workspaces\npmctl workspaces list --search \"keyword\"    # Filter by name"
      },
      {
        "title": "Global Options",
        "body": "--json — Machine-readable JSON output (works as global flag or per-subcommand)\n--profile <name> / -p — Use a specific profile instead of default"
      },
      {
        "title": "Workflow: Resolve a Full API URL",
        "body": "Postman requests use {{variable}} placeholders. Resolve them via environments:\n\n# 1. Get the request (shows URL like {{base-url}}/v1/users/:userId)\npmctl requests show \"get User\" -c \"My API\" --json\n\n# 2. Resolve the variable for a specific environment\npmctl environments show \"Production\" --json | jq -r '.values[] | select(.key == \"base-url\") | .value'\n\n# 3. Combine: replace {{base-url}} with resolved value, :userId with actual ID"
      },
      {
        "title": "Workflow: Construct a curl Command",
        "body": "# Get full request details as JSON\nREQ=$(pmctl requests show \"create User\" -c \"My API\" --json)\n\n# Extract method, URL, headers, body\necho \"$REQ\" | jq '.[0].request | {method, url: .url.raw, headers: .header, body: .body.raw}'\n\n# Get environment base URL\nBASE=$(pmctl environments show \"QA\" --json | jq -r '.values[] | select(.key == \"base-url\") | .value')"
      },
      {
        "title": "Workflow: Discover All Endpoints for a Topic",
        "body": "# Fuzzy search across a collection\npmctl requests list -c \"My API\" --search \"user\"\n\n# Or browse the full tree\npmctl collections show <uid>"
      },
      {
        "title": "Tips",
        "body": "--json output is pipeable to jq for scripting\nenvironments show --json returns unmasked secrets — useful for scripting\nCollection names are matched case-insensitively; prefer names over UIDs for readability\nMultiple profiles let you manage separate Postman accounts (personal, work, etc.)"
      }
    ],
    "body": "pmctl — Postman CLI for API Discovery\n\npmctl wraps the Postman API to let you browse collections, inspect requests, and resolve environment variables from the terminal. Use it to discover endpoints, construct curl commands, and understand APIs without opening the Postman GUI.\n\nInstall: pip install pmctl Source: github.com/wbingli/pmctl\n\nSetup\n# Add a profile with your Postman API key\npmctl profile add <name> --api-key \"PMAK-...\" --default\n\n# Set a default workspace (scopes list commands)\npmctl profile set-workspace <workspace-id>\n\n# Verify\npmctl profile whoami\n\n\nGet an API key at https://go.postman.co/settings/me/api-keys\n\nCommands\nProfiles\npmctl profile list                          # List profiles\npmctl profile add <name> -k \"PMAK-...\" -d  # Add (--default)\npmctl profile switch <name>                 # Switch default\npmctl profile set-workspace <id>            # Set default workspace\npmctl profile remove <name>                 # Remove\npmctl profile whoami                        # Current user info\n\nCollections\npmctl collections list                      # List (scoped to default workspace)\npmctl collections list --all                # All workspaces\npmctl collections show <UID>                # Tree view of all requests\n\nRequests\n# List all requests in a collection (flat table: method, name, path, URL)\npmctl requests list -c \"Collection Name\"\npmctl requests list -c <collection-uid>\n\n# Fuzzy search (characters matched in order, e.g. \"getCmp\" matches \"get Campaign\")\npmctl requests list -c \"My API\" --search \"getUser\"\n\n# Show request details (headers, body, query params, path variables)\npmctl requests show \"request name\" -c \"Collection Name\"\n\n\n-c / --collection accepts a collection name (case-insensitive) or UID. requests show uses case-insensitive substring match — use short terms. requests list --search uses fuzzy matching (characters in order).\n\nEnvironments\npmctl environments list                     # List environments\npmctl environments show <name-or-id>       # Show variables\npmctl environments show <name> --full       # Full values (no truncation)\n\nWorkspaces\npmctl workspaces list                       # List accessible workspaces\npmctl workspaces list --search \"keyword\"    # Filter by name\n\nGlobal Options\n--json — Machine-readable JSON output (works as global flag or per-subcommand)\n--profile <name> / -p — Use a specific profile instead of default\nWorkflow: Resolve a Full API URL\n\nPostman requests use {{variable}} placeholders. Resolve them via environments:\n\n# 1. Get the request (shows URL like {{base-url}}/v1/users/:userId)\npmctl requests show \"get User\" -c \"My API\" --json\n\n# 2. Resolve the variable for a specific environment\npmctl environments show \"Production\" --json | jq -r '.values[] | select(.key == \"base-url\") | .value'\n\n# 3. Combine: replace {{base-url}} with resolved value, :userId with actual ID\n\nWorkflow: Construct a curl Command\n# Get full request details as JSON\nREQ=$(pmctl requests show \"create User\" -c \"My API\" --json)\n\n# Extract method, URL, headers, body\necho \"$REQ\" | jq '.[0].request | {method, url: .url.raw, headers: .header, body: .body.raw}'\n\n# Get environment base URL\nBASE=$(pmctl environments show \"QA\" --json | jq -r '.values[] | select(.key == \"base-url\") | .value')\n\nWorkflow: Discover All Endpoints for a Topic\n# Fuzzy search across a collection\npmctl requests list -c \"My API\" --search \"user\"\n\n# Or browse the full tree\npmctl collections show <uid>\n\nTips\n--json output is pipeable to jq for scripting\nenvironments show --json returns unmasked secrets — useful for scripting\nCollection names are matched case-insensitively; prefer names over UIDs for readability\nMultiple profiles let you manage separate Postman accounts (personal, work, etc.)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/wbingli/pmctl",
    "publisherUrl": "https://clawhub.ai/wbingli/pmctl",
    "owner": "wbingli",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/pmctl",
    "downloadUrl": "https://openagent3.xyz/downloads/pmctl",
    "agentUrl": "https://openagent3.xyz/skills/pmctl/agent",
    "manifestUrl": "https://openagent3.xyz/skills/pmctl/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/pmctl/agent.md"
  }
}