Skip to main content

emitter-package-update

Automate updating the emitter package dependencies in eng/emitter-package.json for the Azure SDK for Python repository, then open a PR. Use this skill when the user wants to update @azure-tools/typespec-python (or any other dependency in emitter-package.json) to the latest version, create a PR for an emitter-package version bump, or manage emitter-package.json updates.

Jump to install

Source facts

Repository
Azure/azure-sdk-for-python
Last source activity
July 15, 2026 at 15:21
Detected SKILL.md language
English
Stars
5,587
Forks
3,348

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
2 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
emitter-package-update
description
Automate updating the emitter package dependencies in eng/emitter-package.json for the Azure SDK for Python repository, then open a PR. Use this skill when the user wants to update @azure-tools/typespec-python (or any other dependency in emitter-package.json) to the latest version, create a PR for an emitter-package version bump, or manage emitter-package.json updates.
# Emitter Package Update Update the dependencies in `eng/emitter-package.json` to their latest versions — including `@azure-tools/typespec-python` when a newer release exists — and, if anything changed, open a PR. ## Background The Python emitter ecosystem consists of two packages: - **Branded emitter** (`@azure-tools/typespec-python`): Lives in [Azure/typespec-azure](https://github.com/Azure/typespec-azure/tree/main/packages/typespec-python). This is the emitter used for Azure SDK generation. - **Unbranded emitter** (`@typespec/http-client-python`): Lives in [microsoft/typespec](https://github.com/microsoft/typespec/tree/main/packages/http-client-python). The branded emitter wraps this package. When `eng/emitter-package.json` is updated on `main`, the [TypeSpec Python Regenerate Tests](../../workflows/typespec-python-regenerate.yml) workflow triggers automatically. It regenerates the test code, pushes it to a `regen/typespec-python-main` source branch, and (because GitHub Actions cannot open PRs in this repo) creates/updates a tracking issue with a pre-filled compare link that a maintainer clicks to open the PR against the [`typespec-python-generated-tests`](https://github.com/Azure/azure-sdk-for-python/tree/typespec-python-generated-tests/eng/tools/azure-sdk-tools/emitter/generated) target branch. ## Prerequisites Before running this workflow, verify the following tools are installed: ```bash # Check npm-check-updates npx npm-check-updates --version # Check tsp-client tsp-client --version # Check GitHub CLI gh --version ``` If any tool is missing: - **npm-check-updates**: Install via `npm install -g npm-check-updates` - **tsp-client**: Install via `npm install -g @azure-tools/typespec-client-generator-cli` - **GitHub CLI**: Install from https://cli.github.com/ or via `winget install GitHub.cli` ## Workflow ### 1. Prepare Repository Reset and sync the SDK repo to a clean state. > **Warning:** this discards all uncommitted changes and switches to `main`. Only run it on > a clone/worktree dedicated to this task, never on a branch with work you want to keep. ```bash git reset HEAD && git checkout . && git clean -fd && git checkout origin/main && git pull origin main ``` Record the current `@azure-tools/typespec-python` version from `eng/emitter-package.json` (checking both the `dependencies` and `devDependencies` sections) so you can tell later whether it was bumped. ### 2. Update Dependencies (still on `main`) The goal is to update **every** package across **both** the `dependencies` and `devDependencies` sections of `eng/emitter-package.json` to its latest version — not just `@azure-tools/typespec-python`. Run `npm-check-updates`, which upgrades all entries in both sections by default: ```bash npx npm-check-updates --packageFile eng/emitter-package.json -u ``` > **Restricted-network fallback (e.g. the coding-agent sandbox):** `npm-check-updates` > needs access to the npm registry, which may be firewalled. If it cannot reach the registry, > determine the latest `@azure-tools/typespec-python` version from GitHub instead — the > newest published tag in [Azure/typespec-azure](https://github.com/Azure/typespec-azure/tags) > (cross-checked against `packages/typespec-python/package.json` on `main`) — and edit > `eng/emitter-package.json` by hand to that version. Align the packages listed in `alignment-sources.json` with the versions pinned in each configured source repo package file to ensure consistency between the emitter and its upstream sources. For each source, read `packageJsonUrl`, set every package listed in that source's `packages` array to the version currently pinned there, and do not assume specific version numbers. To add more libraries for alignment later, add their package names to the relevant `packages` array in `alignment-sources.json`. If a specific version was requested, pin `@azure-tools/typespec-python` to that exact version in `eng/emitter-package.json` (overriding what npm-check-updates picked). ### 3. Check for Changes Determine whether anything actually changed: ```bash git diff --quiet -- eng/emitter-package.json ``` **Decision rule:** A PR must be created whenever there is *any* change to `eng/emitter-package.json` — this includes the case where `@azure-tools/typespec-python` itself is unchanged but one or more other dependencies (e.g. `@typespec/*`, `@azure-tools/openai-typespec`) were updated or aligned. Do **not** require a `typespec-python` version bump as a precondition for opening a PR. - If there **is** a diff (exit code `1`), proceed to step 4 and open a PR. - Only if there is **no** diff at all (exit code `0`) — meaning every dependency is already up to date — discard the working-tree changes and stop, as there is nothing to commit: ```bash git checkout -- eng/emitter-package.json ``` ### 4. Create Feature Branch Read the (possibly updated) `@azure-tools/typespec-python` version and compare it with the value recorded in step 1 to choose names: - **If typespec-python was bumped** to `{version}`: - branch: `bump-typespec-python-{version}` - commit / PR title: `bump typespec-python {version}` - PR body: `Bump @azure-tools/typespec-python to version {version}` - **Otherwise** (only other dependencies changed): - branch: `update-emitter-package-dependencies` - commit / PR title: `update emitter-package dependencies` - PR body: `Update emitter-package.json dependencies to their latest aligned versions.` Create the branch, carrying over the working-tree changes: ```bash git checkout -b {branch_name} ``` If a branch with that name already exists locally from a previous run, delete it first (`git branch -D {branch_name}`) — or, if it holds work you want to keep, choose a different name — before re-creating it. ### 5. Regenerate Lock File ```bash tsp-client generate-lock-file ``` This regenerates `eng/emitter-package-lock.json`. > **Restricted-network note:** `tsp-client generate-lock-file` also resolves packages > from the npm registry. If the registry is unreachable, the lock file cannot be > regenerated in the sandbox. In that case commit only the `eng/emitter-package.json` > change (skip the lock file in step 6), and call out in the PR body that > `eng/emitter-package-lock.json` still needs to be regenerated in an environment with > npm-registry access before merge. ### 6. Commit Changes Stage both files when the lock file was regenerated: ```bash git add eng/emitter-package.json eng/emitter-package-lock.json git commit -m "{commit_message}" ``` If the lock file was **not** regenerated (restricted-network case in step 5), stage only the package file instead: ```bash git add eng/emitter-package.json git commit -m "{commit_message}" ``` ### 7. Create Pull Request Push the branch and create the PR: ```bash git push -u origin {branch_name} gh pr create --title "{pr_title}" --body "{pr_body}" ``` ### 8. After Merge Once the PR merges to `main`, the [TypeSpec Python Regenerate Tests](../../workflows/typespec-python-regenerate.yml) workflow triggers automatically because `eng/emitter-package.json` was modified. It will: 1. Build `http-client-python` from `microsoft/typespec@main` and regenerate all test code 2. Commit the regenerated files to the `regen/typespec-python-main` source branch and force-push it 3. Create or update a tracking issue containing a pre-filled "compare" link (GitHub Actions cannot open PRs in this repo) so a maintainer can open the PR against the [`typespec-python-generated-tests`](https://github.com/Azure/azure-sdk-for-python/tree/typespec-python-generated-tests/eng/tools/azure-sdk-tools/emitter/generated) target branch. Merging that PR does **not** auto-close the tracking issue — close it manually. - The tracking issue is assigned to whoever triggered a manual (`workflow_dispatch`) run, or to @iscai-msft and @msyyc for automatic `push`/`schedule` runs. 4. If the workflow fails, a separate failure-notification issue is created (or commented on) and assigned to @iscai-msft and @msyyc
View on GitHub