Releases: gooddata/gooddata-goodchanges
Release v0.21.0
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.21.0gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.21.0
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.21.0 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.21.0/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.21.0] - 2026-05-02
Added
- Top-level
typefield in.goodchangesrc.json("library"or"app"). When set, overrides the automatic library-vs-app inference frompackage.json. Invalid values cause a fatal error at startup.
[0.20.0] - 2026-05-01
Changed
LOG_LEVEL=BASICoutput now goes to stderr instead of stdout. Stdout is reserved for the JSON result, so pipinggoodchanges | jq …works with logging enabled.
[0.19.4] - 2026-04-29
Changed
- Upgrade vendored typescript-go to
56ab4af42157
[0.19.3] - 2026-04-28
Changed
- Upgrade vendored typescript-go to
3499951dbc49
[0.19.2] - 2026-04-24
Fixed
- Bare dynamic
import("pkg")calls (e.g.() => import("pkg")passed to a loader, orconst mod = await import("pkg")used opaquely without property access) are now recorded as side-effect imports, so taint on the target package propagates to the importing file. Previously only the three pattern forms (var+property-access, destructure,.thencallback) produced anImportrecord, leaving bare calls invisible to taint propagation.
[0.19.1] - 2026-04-23
Fixed
- Global
changeDirstaint now enumerates every export from each entrypoint (including recursively viaexport * from "./local") instead of seeding a"*"wildcard. Downstream packages consume exports by exact name, so the wildcard never matched named imports — taint stopped at the first hop and targets transitively dependent on the tainted library were missed.
[0.19.0] - 2026-04-20
Added
IGNORE_APP_RELATIONSHIPenv var. When set, theappfield in target configs is ignored — targets are no longer triggered just because their corresponding app is tainted (only direct changes, lockfile changes, and tainted workspace imports apply).
[0.18.1] - 2026-04-13
Changed
- Upgrade vendored typescript-go to
24753aa4bf38
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo", `ex...
Release v0.20.0
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.20.0gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.20.0
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.20.0 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.20.0/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.20.0] - 2026-05-01
Changed
LOG_LEVEL=BASICoutput now goes to stderr instead of stdout. Stdout is reserved for the JSON result, so pipinggoodchanges | jq …works with logging enabled.
[0.19.4] - 2026-04-29
Changed
- Upgrade vendored typescript-go to
56ab4af42157
[0.19.3] - 2026-04-28
Changed
- Upgrade vendored typescript-go to
3499951dbc49
[0.19.2] - 2026-04-24
Fixed
- Bare dynamic
import("pkg")calls (e.g.() => import("pkg")passed to a loader, orconst mod = await import("pkg")used opaquely without property access) are now recorded as side-effect imports, so taint on the target package propagates to the importing file. Previously only the three pattern forms (var+property-access, destructure,.thencallback) produced anImportrecord, leaving bare calls invisible to taint propagation.
[0.19.1] - 2026-04-23
Fixed
- Global
changeDirstaint now enumerates every export from each entrypoint (including recursively viaexport * from "./local") instead of seeding a"*"wildcard. Downstream packages consume exports by exact name, so the wildcard never matched named imports — taint stopped at the first hop and targets transitively dependent on the tainted library were missed.
[0.19.0] - 2026-04-20
Added
IGNORE_APP_RELATIONSHIPenv var. When set, theappfield in target configs is ignored — targets are no longer triggered just because their corresponding app is tainted (only direct changes, lockfile changes, and tainted workspace imports apply).
[0.18.1] - 2026-04-13
Changed
- Upgrade vendored typescript-go to
24753aa4bf38
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)...
Release v0.19.4
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.19.4gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.19.4
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.19.4 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.19.4/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.19.4] - 2026-04-29
Changed
- Upgrade vendored typescript-go to
56ab4af42157
[0.19.3] - 2026-04-28
Changed
- Upgrade vendored typescript-go to
3499951dbc49
[0.19.2] - 2026-04-24
Fixed
- Bare dynamic
import("pkg")calls (e.g.() => import("pkg")passed to a loader, orconst mod = await import("pkg")used opaquely without property access) are now recorded as side-effect imports, so taint on the target package propagates to the importing file. Previously only the three pattern forms (var+property-access, destructure,.thencallback) produced anImportrecord, leaving bare calls invisible to taint propagation.
[0.19.1] - 2026-04-23
Fixed
- Global
changeDirstaint now enumerates every export from each entrypoint (including recursively viaexport * from "./local") instead of seeding a"*"wildcard. Downstream packages consume exports by exact name, so the wildcard never matched named imports — taint stopped at the first hop and targets transitively dependent on the tainted library were missed.
[0.19.0] - 2026-04-20
Added
IGNORE_APP_RELATIONSHIPenv var. When set, theappfield in target configs is ignored — targets are no longer triggered just because their corresponding app is tainted (only direct changes, lockfile changes, and tainted workspace imports apply).
[0.18.1] - 2026-04-13
Changed
- Upgrade vendored typescript-go to
24753aa4bf38
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)
[0.9.2] - 2026-02-14
Changed
- CSS module imports (
*.module.scss/*.module.css) with named bindings now use granular taint: only symbols that reference the imported binding are tainted, inst...
Release v0.19.3
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.19.3gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.19.3
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.19.3 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.19.3/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.19.3] - 2026-04-28
Changed
- Upgrade vendored typescript-go to
3499951dbc49
[0.19.2] - 2026-04-24
Fixed
- Bare dynamic
import("pkg")calls (e.g.() => import("pkg")passed to a loader, orconst mod = await import("pkg")used opaquely without property access) are now recorded as side-effect imports, so taint on the target package propagates to the importing file. Previously only the three pattern forms (var+property-access, destructure,.thencallback) produced anImportrecord, leaving bare calls invisible to taint propagation.
[0.19.1] - 2026-04-23
Fixed
- Global
changeDirstaint now enumerates every export from each entrypoint (including recursively viaexport * from "./local") instead of seeding a"*"wildcard. Downstream packages consume exports by exact name, so the wildcard never matched named imports — taint stopped at the first hop and targets transitively dependent on the tainted library were missed.
[0.19.0] - 2026-04-20
Added
IGNORE_APP_RELATIONSHIPenv var. When set, theappfield in target configs is ignored — targets are no longer triggered just because their corresponding app is tainted (only direct changes, lockfile changes, and tainted workspace imports apply).
[0.18.1] - 2026-04-13
Changed
- Upgrade vendored typescript-go to
24753aa4bf38
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)
[0.9.2] - 2026-02-14
Changed
- CSS module imports (
*.module.scss/*.module.css) with named bindings now use granular taint: only symbols that reference the imported binding are tainted, instead of all exports in the file
[0.9.1] - 2026-02-14
Fixed
- Changed CSS/SCSS files within a library now taint TS files that relatively import them (e.g. `import "./styles.scss...
Release v0.19.2
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.19.2gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.19.2
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.19.2 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.19.2/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.19.2] - 2026-04-24
Fixed
- Bare dynamic
import("pkg")calls (e.g.() => import("pkg")passed to a loader, orconst mod = await import("pkg")used opaquely without property access) are now recorded as side-effect imports, so taint on the target package propagates to the importing file. Previously only the three pattern forms (var+property-access, destructure,.thencallback) produced anImportrecord, leaving bare calls invisible to taint propagation.
[0.19.1] - 2026-04-23
Fixed
- Global
changeDirstaint now enumerates every export from each entrypoint (including recursively viaexport * from "./local") instead of seeding a"*"wildcard. Downstream packages consume exports by exact name, so the wildcard never matched named imports — taint stopped at the first hop and targets transitively dependent on the tainted library were missed.
[0.19.0] - 2026-04-20
Added
IGNORE_APP_RELATIONSHIPenv var. When set, theappfield in target configs is ignored — targets are no longer triggered just because their corresponding app is tainted (only direct changes, lockfile changes, and tainted workspace imports apply).
[0.18.1] - 2026-04-13
Changed
- Upgrade vendored typescript-go to
24753aa4bf38
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)
[0.9.2] - 2026-02-14
Changed
- CSS module imports (
*.module.scss/*.module.css) with named bindings now use granular taint: only symbols that reference the imported binding are tainted, instead of all exports in the file
[0.9.1] - 2026-02-14
Fixed
- Changed CSS/SCSS files within a library now taint TS files that relatively import them (e.g.
import "./styles.scss"taints all exports of the importing file)
[0.9.0] - 2026-02-14
Changed
- Breaking:
changeDirsentries now use glob patterns instead of directory paths ("glob"field...
Release v0.19.1
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.19.1gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.19.1
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.19.1 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.19.1/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.19.1] - 2026-04-23
Fixed
- Global
changeDirstaint now enumerates every export from each entrypoint (including recursively viaexport * from "./local") instead of seeding a"*"wildcard. Downstream packages consume exports by exact name, so the wildcard never matched named imports — taint stopped at the first hop and targets transitively dependent on the tainted library were missed.
[0.19.0] - 2026-04-20
Added
IGNORE_APP_RELATIONSHIPenv var. When set, theappfield in target configs is ignored — targets are no longer triggered just because their corresponding app is tainted (only direct changes, lockfile changes, and tainted workspace imports apply).
[0.18.1] - 2026-04-13
Changed
- Upgrade vendored typescript-go to
24753aa4bf38
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)
[0.9.2] - 2026-02-14
Changed
- CSS module imports (
*.module.scss/*.module.css) with named bindings now use granular taint: only symbols that reference the imported binding are tainted, instead of all exports in the file
[0.9.1] - 2026-02-14
Fixed
- Changed CSS/SCSS files within a library now taint TS files that relatively import them (e.g.
import "./styles.scss"taints all exports of the importing file)
[0.9.0] - 2026-02-14
Changed
- Breaking:
changeDirsentries now use glob patterns instead of directory paths ("glob"field replaces"path") - Glob matching uses doublestar:
*matches files in current dir,**/*matches all nested files,**/*.stories.tsxmatches specific patterns - Ignores override glob matches: if a file matches a glob but is also in
ignores, it is excluded - Fine-grained changeDirs only match TS/TSX source files
[0.8.0] - 2026-02-14
Changed
- When
TARGETSis set, compute relevant package set (active targets + transitive dependencies) and skip change detec...
Release v0.19.0
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.19.0gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.19.0
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.19.0 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.19.0/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.19.0] - 2026-04-20
Added
IGNORE_APP_RELATIONSHIPenv var. When set, theappfield in target configs is ignored — targets are no longer triggered just because their corresponding app is tainted (only direct changes, lockfile changes, and tainted workspace imports apply).
[0.18.1] - 2026-04-13
Changed
- Upgrade vendored typescript-go to
24753aa4bf38
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)
[0.9.2] - 2026-02-14
Changed
- CSS module imports (
*.module.scss/*.module.css) with named bindings now use granular taint: only symbols that reference the imported binding are tainted, instead of all exports in the file
[0.9.1] - 2026-02-14
Fixed
- Changed CSS/SCSS files within a library now taint TS files that relatively import them (e.g.
import "./styles.scss"taints all exports of the importing file)
[0.9.0] - 2026-02-14
Changed
- Breaking:
changeDirsentries now use glob patterns instead of directory paths ("glob"field replaces"path") - Glob matching uses doublestar:
*matches files in current dir,**/*matches all nested files,**/*.stories.tsxmatches specific patterns - Ignores override glob matches: if a file matches a glob but is also in
ignores, it is excluded - Fine-grained changeDirs only match TS/TSX source files
[0.8.0] - 2026-02-14
Changed
- When
TARGETSis set, compute relevant package set (active targets + transitive dependencies) and skip change detection, library analysis, and transitive dependent walks for irrelevant packages
[0.7.1] - 2026-02-14
Fixed
- Load all
.goodchangesrc.jsonconfigs once at startup instead of re-reading from disk per changed file and again during target detection
[0.7.0] - 2026-02-14
Changed
- Skip expensive target detection (file scanning, taint import checks) for targets excluded by
TARGETSfilter...
Release v0.18.1
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.18.1gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.18.1
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.18.1 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.18.1/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.18.1] - 2026-04-13
Changed
- Upgrade vendored typescript-go to
24753aa4bf38
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)
[0.9.2] - 2026-02-14
Changed
- CSS module imports (
*.module.scss/*.module.css) with named bindings now use granular taint: only symbols that reference the imported binding are tainted, instead of all exports in the file
[0.9.1] - 2026-02-14
Fixed
- Changed CSS/SCSS files within a library now taint TS files that relatively import them (e.g.
import "./styles.scss"taints all exports of the importing file)
[0.9.0] - 2026-02-14
Changed
- Breaking:
changeDirsentries now use glob patterns instead of directory paths ("glob"field replaces"path") - Glob matching uses doublestar:
*matches files in current dir,**/*matches all nested files,**/*.stories.tsxmatches specific patterns - Ignores override glob matches: if a file matches a glob but is also in
ignores, it is excluded - Fine-grained changeDirs only match TS/TSX source files
[0.8.0] - 2026-02-14
Changed
- When
TARGETSis set, compute relevant package set (active targets + transitive dependencies) and skip change detection, library analysis, and transitive dependent walks for irrelevant packages
[0.7.1] - 2026-02-14
Fixed
- Load all
.goodchangesrc.jsonconfigs once at startup instead of re-reading from disk per changed file and again during target detection
[0.7.0] - 2026-02-14
Changed
- Skip expensive target detection (file scanning, taint import checks) for targets excluded by
TARGETSfilter
[0.6.0] - 2026-02-14
Added
- Optional
TARGETSenv var to filter output by target name (comma-delimited, supports*wildcard globs)
[0.5.1] - 2026-02-14
Fixed
- Fix ignore globs not supporting
**patterns (e.g.scenarios/**/*.md) by replacingfilepath.Matchwit...
Release v0.18.0
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.18.0gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.18.0
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.18.0 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.18.0/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.18.0] - 2026-04-10
Added
- Global
changeDirsfield in.goodchangesrc.json(top-level, next toignores). Matching files taint all exports (libraries) and trigger all targets in the package.
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)
[0.9.2] - 2026-02-14
Changed
- CSS module imports (
*.module.scss/*.module.css) with named bindings now use granular taint: only symbols that reference the imported binding are tainted, instead of all exports in the file
[0.9.1] - 2026-02-14
Fixed
- Changed CSS/SCSS files within a library now taint TS files that relatively import them (e.g.
import "./styles.scss"taints all exports of the importing file)
[0.9.0] - 2026-02-14
Changed
- Breaking:
changeDirsentries now use glob patterns instead of directory paths ("glob"field replaces"path") - Glob matching uses doublestar:
*matches files in current dir,**/*matches all nested files,**/*.stories.tsxmatches specific patterns - Ignores override glob matches: if a file matches a glob but is also in
ignores, it is excluded - Fine-grained changeDirs only match TS/TSX source files
[0.8.0] - 2026-02-14
Changed
- When
TARGETSis set, compute relevant package set (active targets + transitive dependencies) and skip change detection, library analysis, and transitive dependent walks for irrelevant packages
[0.7.1] - 2026-02-14
Fixed
- Load all
.goodchangesrc.jsonconfigs once at startup instead of re-reading from disk per changed file and again during target detection
[0.7.0] - 2026-02-14
Changed
- Skip expensive target detection (file scanning, taint import checks) for targets excluded by
TARGETSfilter
[0.6.0] - 2026-02-14
Added
- Optional
TARGETSenv var to filter output by target name (comma-delimited, supports*wildcard globs)
[0.5.1] - 2026-02-14
Fixed
- Fix ignore globs not supporting
**patterns (e.g.scenarios/**/*.md) by replacingfilepath.Matchwithdoublestar.Match
[0.5.0] - 2026-02-13
Added
- Fine-grained virtual target detection:
changeDirsentries can specify"type": "fine-grained"to collect specific affected...
Release v0.17.1
Docker Image
The Docker image for this release has been published to DockerHub:
Repository: gooddata/gooddata-goodchanges
Tags:
gooddata/gooddata-goodchanges:0.17.1gooddata/gooddata-goodchanges:latest
Pull Commands
# Pull specific version
docker pull gooddata/gooddata-goodchanges:0.17.1
# Pull latest
docker pull gooddata/gooddata-goodchanges:latestRun Command
docker run --rm gooddata/gooddata-goodchanges:0.17.1 [command]Standalone Binaries
Download the binary for your platform from the assets below.
| Platform | Architecture | Asset |
|---|---|---|
| Linux | x86_64 | goodchanges-linux-amd64.tar.gz |
| Linux | ARM64 | goodchanges-linux-arm64.tar.gz |
| macOS | Intel | goodchanges-darwin-amd64.tar.gz |
| macOS | Apple Silicon | goodchanges-darwin-arm64.tar.gz |
| Windows | x86_64 | goodchanges-windows-amd64.zip |
| Windows | ARM64 | goodchanges-windows-arm64.zip |
All platforms
goodchanges-darwin-amd64.tar.gzgoodchanges-darwin-amd64.tar.gz.sha256goodchanges-darwin-arm64.tar.gzgoodchanges-darwin-arm64.tar.gz.sha256goodchanges-linux-amd64.tar.gzgoodchanges-linux-amd64.tar.gz.sha256goodchanges-linux-arm64.tar.gzgoodchanges-linux-arm64.tar.gz.sha256goodchanges-windows-amd64.zipgoodchanges-windows-amd64.zip.sha256goodchanges-windows-arm64.zipgoodchanges-windows-arm64.zip.sha256
Install (Linux/macOS)
# Example: download and install linux/amd64
curl -sL https://github.com/gooddata/gooddata-goodchanges/releases/download/v0.17.1/goodchanges-linux-amd64.tar.gz | tar xz
chmod +x goodchanges-linux-amd64
sudo mv goodchanges-linux-amd64 /usr/local/bin/goodchangesChangelog
[0.17.1] - 2026-04-10
Fixed
- Detect runtime side-effect statements (e.g.
console.log()) in entrypoint/barrel files as affecting all exports — previously these were misclassified as "comments/imports only" and seeded zero taint
[0.17.0] - 2026-04-04
Changed
- Breaking: Lockfile dep change detection now parses old and new pnpm-lock.yaml as YAML (gopkg.in/yaml.v3) instead of diffing text lines. Compares resolved versions for direct deps per importer, and BFS-walks the snapshots section to detect transitive dep version changes — a transitive change taints the direct dep that pulled it in.
[0.16.7] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
c0703e66b68b
[0.16.6] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
02bf7c9f25a4
[0.16.5] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7d9b07b896c1
[0.16.4] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df62f5db69a2
[0.16.3] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
65056016dd8a
[0.16.2] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
df56d26717f7
[0.16.1] - 2026-04-04
Changed
- Upgrade vendored typescript-go to
7f8f645fc008
[0.16.0] - 2026-04-04
Changed
- Breaking: Merged
targetandvirtual-targettypes into a unified target definition. Thetypefield is removed. All targets now supportapp,targetName,changeDirs, lockfile detection, and fine-grained mode.targetNamedefaults to the package name when not set.changeDirsdefaults to**/*when not set.
[0.15.3] - 2026-02-23
Fixed
- Add intra-file taint propagation after seeding phase in both
AnalyzeLibraryPackageandFindAffectedFiles, so that symbols referencing other tainted symbols in the same file are also marked as tainted before BFS starts
[0.15.2] - 2026-02-20
Fixed
- Fix
export const/export letdeclarations not being added to the exports list in the TS parser, causing locally declared exported variables (e.g.export const allScenarios = [...]) to be invisible during entrypoint taint checking
[0.15.1] - 2026-02-17
Changed
- Upgrade vendored typescript-go to
daa761e5c641
[0.15.0] - 2026-02-17
Added
- lockfileVersion change detection: when
lockfileVersionchanges in a subspace's pnpm-lock.yaml, all projects in that subspace are treated as having all external deps changed, and all library exports are wildcard-tainted. This propagates transitively through the existing dependency graph and taint analysis. ParseLockfileVersionusing proper YAML parsing (gopkg.in/yaml.v3) to compare old vs new lockfile versions
[0.14.2] - 2026-02-16
Added
- Comprehensive debug logging across all analyzer functions: FindAffectedFiles, FindEntrypoints, CollectEntrypointExports, HasTaintedImports, HasTaintedImportsForGlob, FindCSSTaintedPackages, and import resolution (resolve.go)
[0.14.1] - 2026-02-16
Changed
- Upgrade vendored typescript-go to
7b198ca5c705
[0.14.0] - 2026-02-14
Added
- JSON import taint propagation: changed
.jsonfiles now taint TS/JS files that import them, with symbol-level granularity based on usage of the imported binding
[0.13.0] - 2026-02-14
Added
- Per-target
ignoresfield in target definitions. Per-target ignores are additive with the globalignoresand only apply to the specific target's detection.
[0.12.0] - 2026-02-14
Changed
- Breaking:
.goodchangesrc.jsonnow uses atargetsarray instead of a single top-level target definition. Each entry intargetsis a target object withtype,app,targetName, andchangeDirs. Theignoresfield remains at the top level (shared across all targets).
[0.11.2] - 2026-02-14
Fixed
- Fine-grained detection now seeds taint from changed CSS/SCSS files within the project (with CSS module granularity for
*.module.scss/*.module.css)
[0.11.1] - 2026-02-14
Changed
- Fine-grained detection now uses symbol-level taint propagation matching library analysis: AST diffs identify changed symbols, import graph tracks name mappings, BFS only propagates to importers of actually changed symbols, with intra-file and re-export handling
[0.11.0] - 2026-02-14
Added
-v/--versionflag prints the embedded version from theVERSIONfile
[0.10.0] - 2026-02-14
Added
- Fine-grained
changeDirsentries now support an optionalfilterfield to narrow output results (e.g.{"glob": "src/**/*", "filter": "src/**/*.test.ts", "type": "fine-grained"}analyzes all files but only returns affected test files)
[0.9.5] - 2026-02-14
Changed
- Fine-grained changeDirs now AST-diff changed files against the merge base; whitespace-only or comment-only changes no longer cascade through importers
[0.9.4] - 2026-02-14
Fixed
- Fine-grained BFS propagation now follows re-exports (
export { X } from "./foo",export * from "./foo") so barrel files no longer break the chain
[0.9.3] - 2026-02-14
Fixed
- Fine-grained changeDirs now detect lockfile dependency changes (
pnpm-lock.yamlupgrades taint files importing the affected external dep)
[0.9.2] - 2026-02-14
Changed
- CSS module imports (
*.module.scss/*.module.css) with named bindings now use granular taint: only symbols that reference the imported binding are tainted, instead of all exports in the file
[0.9.1] - 2026-02-14
Fixed
- Changed CSS/SCSS files within a library now taint TS files that relatively import them (e.g.
import "./styles.scss"taints all exports of the importing file)
[0.9.0] - 2026-02-14
Changed
- Breaking:
changeDirsentries now use glob patterns instead of directory paths ("glob"field replaces"path") - Glob matching uses doublestar:
*matches files in current dir,**/*matches all nested files,**/*.stories.tsxmatches specific patterns - Ignores override glob matches: if a file matches a glob but is also in
ignores, it is excluded - Fine-grained changeDirs only match TS/TSX source files
[0.8.0] - 2026-02-14
Changed
- When
TARGETSis set, compute relevant package set (active targets + transitive dependencies) and skip change detection, library analysis, and transitive dependent walks for irrelevant packages
[0.7.1] - 2026-02-14
Fixed
- Load all
.goodchangesrc.jsonconfigs once at startup instead of re-reading from disk per changed file and again during target detection
[0.7.0] - 2026-02-14
Changed
- Skip expensive target detection (file scanning, taint import checks) for targets excluded by
TARGETSfilter
[0.6.0] - 2026-02-14
Added
- Optional
TARGETSenv var to filter output by target name (comma-delimited, supports*wildcard globs)
[0.5.1] - 2026-02-14
Fixed
- Fix ignore globs not supporting
**patterns (e.g.scenarios/**/*.md) by replacingfilepath.Matchwithdoublestar.Match
[0.5.0] - 2026-02-13
Added
- Fine-grained virtual target detection:
changeDirsentries can specify"type": "fine-grained"to collect specific affected files instead of triggering a full run - New
FindAffectedFilesanalyzer function for transitive file-level taint propagation within directories - Output format changed from
[]stringto `[]{"name", "dete...