All notable changes to the APIOps CLI are documented in this file.
The format is inspired by Keep a Changelog. This project uses Semantic Versioning with alpha pre-release tags.
- Operation-filtered specifications - apply the
operationsAPI sub-filter to extracted OpenAPI/Swagger specifications, removing excluded operations and empty paths while preserving shared definitions and scalar precision (#296) - Version flag -
apiops -vnow prints the CLI version, alongside-Vand--version(#298) - Identity setup prompts - generated Copilot identity setup prompts ask for one value per question instead of combined
NAME=templates (#300)
- Identity setup guidance - README describes the generated Copilot prompt file and manual setup guide for workflow identity setup (#299)
- Filtering guide - document how operation filters apply to extracted specifications and their known limitations (#296)
- Cross-service publishing - strip source-service ARM IDs from PUT and PATCH payloads when publishing extracted resources to another APIM service (#285)
- Diagnostic logger references - rebuild logger IDs against the target service, including workspace paths and environment-mapped names (#285)
- WSDL re-import - remove external XSD import locations when their namespaces are available in inline schemas, allowing re-import without resolving those external URLs (#285)
- WSDL schema publishing - skip importer-generated XSD schemas for WSDL imports, while preserving standalone schemas (#272)
- Gateway dry runs - prevent crashes when displaying gateway API association descriptors (#272)
- Subscription owners - normalize subscription owner IDs to relative
/userspaths when publishing across services (#279) - Portal-created schemas - recognize 13-digit timestamp schema IDs and skip re-publishing only when the imported specification recreates structurally equivalent components (#280)
- Sovereign-cloud publishing - respect the selected cloud endpoint during publish pre-flight checks (#281)
- Multi-environment publishing - publish multiple environment-affixed API revisions to a shared APIM instance, with warnings when generated names exceed APIM limits
- Filtered publishing parity - apply resource filters consistently during publish operations
- Gateway API reconciliation - reconcile managed API assignments for gateways during publishing
- Revision-aware environment mapping - preserve revision identity across mapped names, operation reconciliation, authentication overrides, and delete filtering
- API round-trip reliability - preserve SOAP APIs and gateway associations while retrying pessimistic-concurrency conflicts and safely handling concurrent deletes
- Publishing order and cleanup - publish APIs before products, use desired API manifests for unmatched-resource deletion, and skip missing or in-use associations instead of aborting
- Publish validation - reject explicitly empty environment resource scopes before planning deletes, and classify DELETE failures by HTTP status and structured error code
- Dependency security - apply npm audit fixes and update
fast-urito 3.1.7
- Filtered-resource publishing guide - document publishing behavior and examples for resource filters
- Transitive dependency coverage - add extraction and publishing tests for transitive dependencies
1.0.0 — 2026-08-27
- npm package moved to the Microsoft-owned scope — install
@azure-tools/apiops-cliinstead of@peterhauge/apiops-cli; generated repositories, pipelines, documentation, and tarball names now use the new package name (#239)
- Azure API Center backup and restore — new
apiops apic extractandapiops apic publishcommands round-trip API Center resources and API definition specifications (#232) - Filter exclusions — filter entries can use a leading
!to exclude exact names or wildcard patterns, including inside API and workspace sub-filters (#222) - Stale artifact cleanup —
apiops extract --remove-stalesafely reconciles managed artifacts after a fully successful extraction, with generated pipelines opting into cleanup (#246)
- Service-level policy filtering — extraction now honors the
policiesfilter for the service policy and documents the supported nested filter syntax (#221) - Operation schema links and dynamic authorization policies — publishing preserves schema-bound OpenAPI request and response representations, while extraction no longer redacts dynamic
Authorizationpolicy expressions as secrets (#239) - HTTP 200 asynchronous updates — trusted ARM async-operation responses are polled to completion even when the initial APIM response is HTTP 200 (#243)
- GitHub secret preservation — identity setup inventories existing repository and environment secrets and requires an explicit reuse, rename, or overwrite decision (#244)
- Azure DevOps pipeline samples — pipeline examples now live under
samples/pipelines/azure-devops(#241) - Filter documentation alignment — README and filter guides now cover wildcard exclusions, the singleton policy key, and supported nested API filter syntax (#242)
- API Center command reference — README and command documentation now describe
apiops apicdiscovery, flags, defaults, examples, authentication, and output behavior (#247)
0.4.0-alpha.2 — 2026-07-02
- Publish no longer aborts on auto-generated logger-credential named values — the pre-flight secret-redaction scan added in v0.4.0-alpha.0 was incorrectly flagging APIM-managed logger credential named values (which legitimately contain
*** REDACTED ***markers from the service).apiops publishnow ignores those auto-generated named values so publishes proceed without manual intervention (#220)
- Added missing
--artifact-dirflag to theapiops initREADME table — the flag was already implemented but wasn't documented in the README options reference (#217) - Polished the environment-overrides and filter guides plus the shipped Copilot prompt templates — added a fallback paragraph pointing users who skipped
apiops initto the prompt source files on GitHub, and cleaned up formatting inapiops-configure-filter.prompt.mdandapiops-configure-overrides.prompt.md(follow-up to #183) (#196)
0.4.0-alpha.0 — 2026-07-01
apiops initoutput filenames renamed — identity setup guides and Copilot prompts are now emitted asAPIOPS-PIPELINE-IDENTITY-SETUP.md/APIOPS-WORKFLOW-IDENTITY-SETUP.mdandapiops-setup-pipeline-identity.prompt.md/apiops-setup-workflow-identity.prompt.md. Generated pipeline files are now namedrun-apiops-extractor.yml/run-apiops-publisher.yml. Users who re-runapiops initafter upgrading will see the new files alongside any previously generated ones; delete the old files if you no longer want them tracked (#200)
- Secret redaction in policy XML —
apiops extractnow redacts inline secrets (including literal bearer tokens inAuthorizationheaders) from extracted policy files while preserving named-value references.apiops publishperforms a pre-flight scan of all artifacts and aborts (including in dry-run mode) if any*** REDACTED ***markers remain, preventing accidental secret exposure (#199) - JSON schemas and Copilot prompts for filter/override configuration — new
schemas/extractor-config.schema.jsonandschemas/override-config.schema.jsonprovide IDE autocompletion forconfiguration.extractor.yamlandconfiguration.{env}.yamlvia theyaml-language-server$schemadirective.apiops initnow also lays downapiops-configure-filter.prompt.mdandapiops-configure-overrides.prompt.mdto conversationally guide users through building these files. Schemas are auto-generated from the TypeScript types on every build so they stay in sync (#183) - Dry-run validation gate in generated publish pipelines — GitHub Actions and Azure DevOps publish templates emitted by
apiops initnow runapiops publish --dry-runbefore every real publish step. If the dry-run fails (connectivity, invalid resources, permission errors), the pipeline halts before touching APIM, preventing partial-failure states (#182) - Identity setup guides rewritten for UI workflows — the manual identity setup guides emitted by
apiops initnow walk users through the Azure portal, Azure DevOps, and GitHub web UIs with step-by-step instructions and links to official docs, while the companion.prompt.mdfiles remain the CLI/scripted path for Copilot-driven setup (#200)
- Removed stale
mcpServerInformation.jsonreferences — follow-up to #173, which moved MCP server configuration intoapiInformation.json. Documentation (docs/reference/artifact-format.md,docs/reference/resource-types.md) and theall-resource-typesintegration test manifest now match the post-#173 artifact layout (#205)
0.3.0-alpha.0 — 2026-06-25
- Removed unimplemented CLI options —
--spec-format(extract command) and--otel(global) have been removed from the CLI, docs, and specs. Both were documented but never implemented, so no functional behavior changes for users who weren't relying on them (#165)
- Wildcard pattern matching in filter configuration — all name-based filter fields (
apis,backends,namedValues, etc.) now accept glob-style patterns with*and?. Exact names still work alongside patterns (#160) - Workspace sub-resource filtering — nested workspace filters are now applied at runtime (previously documented but not implemented). Wildcard patterns in the
workspaceslist trigger discovery-then-filter instead of being used as literal names. Addsschemasfield onWorkspaceSubFilter(#160) - Token substitution validation in generated GitHub Actions publish workflow —
apiops initnow adds a validation step between token substitution and publish that greps for unresolved `{#[...]#}` tokens and fails the job with a clear list of unmapped names. Mirrors the existing Azure DevOps behavior (#158) - MCP publish from embedded API metadata — MCP configuration is now read/written exclusively from
apiInformation.json; the redundantmcpServerInformation.jsonsidecar is no longer produced or consumed. Legacy sidecars are ignored. Tool operation references are rewritten from source to target ARM IDs before override application so overrides still win (#173) - Association scope tracking for round-trip correctness — extract/publish now records and reconstructs whether each linked resource (e.g. workspace product → built-in group) is service-scoped or workspace-scoped, producing correct ARM paths in both directions. Backward-compatible with legacy artifact files that only contain
name. 409 "link already exists" responses are treated as idempotent successes (#175)
- Resource group log masking preserves meaningful segments —
Protect-ResourceGroupNamenow detects resource group names ending with a long numeric suffix (>=6 digits, typical of GitHubrun_idvalues) and preserves the last dash-separated segment before the number. Output goes fromrg-...1553476torg-...src-27781553476, making source vs target groups distinguishable in logs (#168) - Override config template no longer hardcodes a secret — the generated
configuration.override.yamlfromapiops initnow uses a `{#[DB_Connection_String]#}` token placeholder for the connection-string example (aligned with the pipeline substitution format) and drops the confusing "APIOps Toolkit" reference comment (#164)
- Incremental publish behavior documented — clarified that changes to override files alone don't trigger incremental publish; only API/policy/etc. artifact changes do (#159)
- Environment overrides guide improvements — expanded examples and clarifications in
docs/guides/environment-overrides.md(#166) - All-types round-trip test imports Petstore Swagger — the all-resource-types integration test now imports the canonical Petstore Swagger spec in both V2 and V3 forms, exercising a broader surface (#171)
0.2.1-alpha.0 — 2026-06-12
- Token substitution in publish pipelines — `{#[TOKEN_NAME]#}` placeholders are now resolved during publish, matching APIOps Toolkit behavior (#127)
- Named value reference resolution — logger credentials now correctly resolve
{{displayName}}refs across environments; auto-generated named values are published when an override is provided (#145) - Redacted secret guard — secret named values with
*** REDACTED ***placeholder are skipped during publish with a clear warning (#145) - Schema ref stripping extended — removes stale
schemaId/typeNamefromqueryParameters,headers,templateParameters, and response headers during operation PATCH (#145) - Workspace ARM paths — use workspace-specific ARM paths for association resources (tag links, product links) (#136)
- Comprehensive environment override documentation — added examples for all resource types, auto-generated named value walkthrough, and gotchas for secrets and loggers (#145)
- Override config template — added logger
credentials.instrumentationKeyexample (#145)
0.2.0-alpha.0 — 2026-06-10
- A2A (Agent-to-Agent) API support — full extract/publish round-trip for A2A protocol APIs (#89)
- ApiOperation as first-class resource — operations are persisted individually with PATCH reconciliation for drift-free round-trips (#104)
- Async LRO polling — long-running APIM operations are polled to completion; OpenAPI specs are sanitized before import (#112)
- Workspace support on V2 SKUs — workspace-scoped resources (APIs, products, backends, named values, tags) are extracted and published with correct ARM paths (#128, #129)
- Integration test split into 7 phases — deploy, extract, validate, override, publish, compare, teardown — each runnable independently (#92)
- Override & filter config alignment — fully aligned with APIOps Toolkit array-based format (#102, #115)
- Schema ref stripping — removes stale
schemaId/typeNamefrom operation representations during post-import PATCH reconciliation (#111) - Windows cmd.exe quoting — fixed stdin and argument quoting issues in
Invoke-MaskedProcess(#110)
- Extract filter documentation — documented full filter surface and explicit exclude-all semantics (#103)
- Hardened teardown — Phase 7 handles APIM delete/purge races and soft-delete conflicts (#122)
- Package-build test README — added single-test run command for quick iteration (#87)
0.1.7-alpha.0 — 2026-06-01
- Workspace-scoped resource refactor — uses
workspaceSupportedflag to determine which resource types are available in workspace containers (#84)
- Premium SKU round-trip fixes — resolved test failures specific to Premium tier (#80)
- Workspace unit test fixes — corrected test failures introduced by workspace refactor (#93)
- Air-gapped setup walkthroughs — step-by-step guides for GitHub Actions and Azure DevOps in disconnected environments (#77)
- APIOps terminology update — replaced "APIOps v1/v2" with "APIOps Toolkit/CLI" across all docs (#94)
- API version docs correction — fixed default API version in documentation (#81)
- Integration test skill notes — added AADSTS700016 and UI access troubleshooting (#83)
0.1.6-alpha.0 — 2026-05-21
- MCP server support — extract and publish MCP server configurations (#36, #51)
- Publish
--commit-idflag — CLI-over-env precedence for commit tracking (#47) - Reusable integration test workflow —
workflow_callsupport for CI reuse (#42)
- AzDO publish pipeline flag — corrected
--overrides(was--override) in Azure DevOps template (#75) - Empty override file handling — gracefully handles empty or missing override files (#33)
- User-facing documentation — added getting started guides, architecture diagram, and agent charters (#69, #56)
- Open-source readiness — copyright headers, sensitivity audit, accuracy policies (#78)
- Security hardening — added SecurityExpert to Squad team (#70)
0.1.5-alpha.1 — 2026-05-07
- Azure DevOps
init— interactive Copilot prompt with managed identity / WIF support (#31) - Public npm registry support — install directly from
@azure-tools/apiops-clion npmjs.com (#28)
- Empty override file — fixed crash when override file exists but is empty (#33)
- Dependency bump — updated
uuidand@azure/msal-node(#26)
- Auth documentation — clarified OIDC vs client-secret auth paths (#27)
- Azure DevOps manual setup — updated instructions for
apiops init --ci azure-devops(#30)
0.1.4-alpha.1 — 2026-04-29
- User-Agent header — all REST API calls now include a
User-Agentheader for tracing (#21) - Optional
--cli-packageparameter — enables using apiops from the public npm registry without specifying a local package path (#20)