{"id":18858,"library":"tfx-cli","title":"tfx-cli: Azure DevOps CLI","description":"CLI for managing Azure DevOps Services (formerly VSTS) and Team Foundation Server extensions, builds, and releases. Current stable version 0.23.1 (2025). Infrequent releases, focused on security updates and Azure DevOps API changes. Unlike azure-devops-cli (az devops), this is a standalone Node.js CLI with no Azure CLI dependency, geared towards extension developers who need to publish, install, and manage marketplace extensions without installing the full Azure CLI.","status":"active","version":"0.23.1","language":"javascript","source_language":"en","source_url":"https://github.com/Microsoft/tfs-cli","tags":["javascript"],"install":[{"cmd":"npm install tfx-cli","lang":"bash","label":"npm"},{"cmd":"yarn add tfx-cli","lang":"bash","label":"yarn"},{"cmd":"pnpm add tfx-cli","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Runtime required, engine >=20.0.0","package":"node","optional":false},{"reason":"HTTP client for Azure DevOps REST APIs","package":"azure-devops-node-api","optional":false}],"imports":[{"note":"The CLI is used via global install or npx. No programmatic API import; all usage is CLI. The wrong example uses an incorrect flag.","wrong":"tfx extension install --ids my-extension","symbol":"CLI command","correct":"npx tfx-cli extension install --extension-id my-extension --publisher publisher-name --vsix ./my-extension.vsix"},{"note":"Use --service-url and --token, not --url or --pat. The token is a PAT or System.AccessToken in Azure Pipelines.","wrong":"tfx login --url https://dev.azure.com/{organization} --pat $(System.AccessToken)","symbol":"login","correct":"tfx login --service-url https://dev.azure.com/{organization} --token $(System.AccessToken)"},{"note":"Use --publisher-id and --extension-id; --manifest is for creating VSIX, not installing. For public extensions, omit --vsix.","wrong":"tfx extension install --manifest vss-extension.json","symbol":"extension install","correct":"tfx extension install --publisher-id publisher-name --extension-id extension-id --vsix ./extension.vsix --service-url https://dev.azure.com/{organization}"}],"quickstart":{"code":"npm install -g tfx-cli\n# Login to Azure DevOps\ntfx login --service-url https://dev.azure.com/myorg --token $(echo $AZURE_DEVOPS_PAT)\n# Publish an extension from a manifest\ntfx extension create --manifest vss-extension.json --rev-version\ntfx extension publish --publisher my-publisher --vsix my-extension-1.0.0.vsix --service-url https://dev.azure.com/myorg\n# Install an extension\ntfx extension install --publisher-id my-publisher --extension-id my-extension --vsix my-extension-1.0.0.vsix --service-url https://dev.azure.com/myorg","lang":"javascript","description":"Install tfx-cli globally, log in to Azure DevOps, create a VSIX from a manifest, publish it to the marketplace, and install it to a collection."},"warnings":[{"fix":"Use Azure DevOps web UI to create publisher, then use tfx to manage extensions.","message":"From 0.9.0, publisher creation is removed. API backing removed by Azure DevOps.","severity":"breaking","affected_versions":">=0.9.0"},{"fix":"Update Node to 20 or later.","message":"Engine requirement: Node >= 20.0.0. Older Node versions cause runtime errors.","severity":"gotcha","affected_versions":">=0.23.0"},{"fix":"Replace --manifest with --publisher-id and --extension-id.","message":"Using --manifest with extension install is deprecated. Use --publisher-id and --extension-id.","severity":"deprecated","affected_versions":">=0.7.3"},{"fix":"Create a PAT with at least 'Marketplace (Publish)' scope.","message":"Login token must be a PAT, not a personal access token with wrong scope. Ensure scope includes 'Marketplace (Publish)'.","severity":"gotcha","affected_versions":">=0.7.11"},{"fix":"See correct login command in imports.","message":"tfx login no longer uses --url or --pat; use --service-url and --token.","severity":"gotcha","affected_versions":">=0.7.11"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"Upgrade to tfx-cli@0.7.11 or later.","cause":"Error-handling code missing in tfx login in versions 0.7.10 and earlier.","error":"TypeError: Cannot read property 'success' of undefined"},{"fix":"Remove 'public' from vss-extension.json; use 'public' flag in tfx extension publish command instead.","cause":"Manifest contains a property 'public' which is invalid in later versions.","error":"Error: Manifest validation: 'public' is not allowed"},{"fix":"Ensure the path to vss-extension.json is correct, or check current working directory.","cause":"Missing manifest file specified with --manifest.","error":"Error: Failed to read extension manifest: ENOENT: no such file or directory"}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}