Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package go-passbolt-cli for openSUSE:Factory 
checked in at 2026-09-16 17:42:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/go-passbolt-cli (Old)
 and      /work/SRC/openSUSE:Factory/.go-passbolt-cli.new.383539 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "go-passbolt-cli"

Wed Sep 16 17:42:23 2026 rev:7 rq:1378147 version:0.5.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/go-passbolt-cli/go-passbolt-cli.changes  
2026-07-12 16:22:21.618470729 +0200
+++ 
/work/SRC/openSUSE:Factory/.go-passbolt-cli.new.383539/go-passbolt-cli.changes  
    2026-09-16 17:44:59.265645033 +0200
@@ -1,0 +2,25 @@
+Tue Sep 15 10:55:20 UTC 2026 - Sai Karthik Karra <[email protected]>
+
+- Update to version 0.5.2:
+  * PB-54306 - Prepare CLI and SDK release
+  * PB-53937 - Update changelog
+  * PB-53937 - BumpSDK to v0.8.3
+  * PB-53937 - testenv: sign the metadata private key payload with a timestamp
+  * PB-53915 - Bump SDK to v0.8.2
+  * PB-53915 - Surface custom field functions in SDK
+  * PB-54031 - Add changelog files to SDK and CLI
+  * chore: adapt renovate config
+  * PB-54017 - Fix deprecated function call
+  * PB-54022 - Use go 1.25 syntax
+  * PB-54017 - Update dependencies in SDK and CLI
+  * PB-53686 - Update Go CLI documentation to add minimal supported API version
+  * PB-53929 - Minor upgrade for github.com/moby/go-archive (High)
+  * PB-53919 - Bump go version to 1.26.6
+  * PB-53914 - Remove community disclaimer from go cli
+  * feature/PB-53788_Update-devcontainer-version-in-go-CI
+  * PB-53356 - Minor upgrade for github.com/google/cel-go (Medium)
+  * PB-53335 - Fix crypto/tls CVE-2026-42505 - MEDIUM CVSS3.1
+  * PB-53334 - Minor upgrade for golang.org/x/text (High)
+  * Add renovate.json
+
+-------------------------------------------------------------------

Old:
----
  go-passbolt-cli-0.5.1.tar.xz

New:
----
  go-passbolt-cli-0.5.2.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ go-passbolt-cli.spec ++++++
--- /var/tmp/diff_new_pack.fidSgd/_old  2026-09-16 17:45:04.553865929 +0200
+++ /var/tmp/diff_new_pack.fidSgd/_new  2026-09-16 17:45:04.561866263 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           go-passbolt-cli
-Version:        0.5.1
+Version:        0.5.2
 Release:        0
 Summary:        A CLI tool to interact with Passbolt
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.fidSgd/_old  2026-09-16 17:45:04.656870231 +0200
+++ /var/tmp/diff_new_pack.fidSgd/_new  2026-09-16 17:45:04.668870733 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/passbolt/go-passbolt-cli.git</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v0.5.1</param>
+    <param name="revision">v0.5.2</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="changesgenerate">enable</param>
     <param name="versionrewrite-pattern">v(.*)</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.fidSgd/_old  2026-09-16 17:45:04.735873532 +0200
+++ /var/tmp/diff_new_pack.fidSgd/_new  2026-09-16 17:45:04.749874116 +0200
@@ -3,6 +3,6 @@
                 <param 
name="url">https://github.com/passbolt/go-passbolt-cli</param>
               <param 
name="changesrevision">b11702da24d4e62551b22ec82d1c7003b5849ce4</param></service><service
 name="tar_scm">
                 <param 
name="url">https://github.com/passbolt/go-passbolt-cli.git</param>
-              <param 
name="changesrevision">6efd7c81909bd7f7ca7214994255143fc69a7f3d</param></service></servicedata>
+              <param 
name="changesrevision">5ad2e0f1b19c53aec5e228226f3e708097adf92d</param></service></servicedata>
 (No newline at EOF)
 

++++++ go-passbolt-cli-0.5.1.tar.xz -> go-passbolt-cli-0.5.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/CHANGELOG.md 
new/go-passbolt-cli-0.5.2/CHANGELOG.md
--- old/go-passbolt-cli-0.5.1/CHANGELOG.md      1970-01-01 01:00:00.000000000 
+0100
+++ new/go-passbolt-cli-0.5.2/CHANGELOG.md      2026-08-28 16:52:04.000000000 
+0200
@@ -0,0 +1,31 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
+
+Releases before this file was introduced are documented in the [GitHub 
releases](https://github.com/passbolt/go-passbolt-cli/releases).
+
+## [Unreleased]
+
+## [0.5.2] - 2026-08-28
+### Fixed
+- PB-53937: Sign shared v5 metadata with both the user key and the metadata 
key (Go SDK v0.8.3)
+
+### Security
+- PB-53335: Fix crypto/tls CVE-2026-42505 (Medium)
+- PB-53334: Minor upgrade for golang.org/x/text (High)
+- PB-53929: Minor upgrade for github.com/moby/go-archive (High)
+- PB-53356: Minor upgrade for github.com/google/cel-go (Medium)
+
+### Maintenance
+- PB-53915: Use the SDK custom field helpers in the KeePass export (Go SDK 
v0.8.2)
+- PB-53919: Bump go version to 1.26.6
+- PB-54017: Update dependencies in SDK and CLI
+- PB-54017: Replace a deprecated gokeepasslib call in the KeePass export
+- PB-54022: Use go 1.25 syntax
+- PB-53686: Document the minimum supported Passbolt API version
+- PB-54031: Add changelog files to SDK and CLI
+- PB-53914: Remove the community disclaimer from the README
+- PB-53788: Update devcontainer version in go CI
+- PB-53937: Sign the metadata private key payload with a timestamp when 
bootstrapping the test environment
+- Renovate: Add renovate.json
+- Renovate: Adapt renovate config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/README.md 
new/go-passbolt-cli-0.5.2/README.md
--- old/go-passbolt-cli-0.5.1/README.md 2026-07-02 11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/README.md 2026-08-28 16:52:04.000000000 +0200
@@ -4,7 +4,16 @@
 
 If you want to do something more complicated: [this Go 
module](https://github.com/passbolt/go-passbolt) to interact with Passbolt from 
Go might interest you.
 
-Disclaimer: This project is community driven and not associated with [Passbolt 
SA](https://www.passbolt.com/about).
+# API Compatibility
+
+The Go CLI is designed to work with the latest Passbolt API version, and we 
strongly recommend keeping your API up to date.
+
+> [!IMPORTANT]
+> Compatibility is currently tested with Passbolt API 5.6.1 and later. Older 
versions are unsupported and may not work.
+
+Support for 5.6.1 is not guaranteed indefinitely and the minimum supported API 
version may increase in future releases.
+
+In addition, users should also make sure they are running the latest version 
of the Go CLI. A current client stays compatible with supported older API 
versions, but an older client is not guaranteed to work against a newer API.
 
 # Install
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/go.mod 
new/go-passbolt-cli-0.5.2/go.mod
--- old/go-passbolt-cli-0.5.1/go.mod    2026-07-02 11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/go.mod    2026-08-28 16:52:04.000000000 +0200
@@ -1,28 +1,28 @@
 module github.com/passbolt/go-passbolt-cli
 
-go 1.26.4
+go 1.26.6
 
 require (
        al.essio.dev/pkg/shellescape v1.6.0
        github.com/ProtonMail/gopenpgp/v3 v3.4.1
-       github.com/google/cel-go v0.28.1
+       github.com/google/cel-go v0.31.0
        github.com/google/uuid v1.6.0
-       github.com/passbolt/go-passbolt v0.8.1
+       github.com/passbolt/go-passbolt v0.8.3
        github.com/pterm/pterm v0.12.83
-       github.com/rogpeppe/go-internal v1.15.0
+       github.com/rogpeppe/go-internal v1.16.0
        github.com/spf13/cobra v1.10.2
        github.com/spf13/pflag v1.0.10
        github.com/spf13/viper v1.21.0
-       github.com/testcontainers/testcontainers-go v0.43.0
-       github.com/tobischo/gokeepasslib/v3 v3.6.2
-       golang.org/x/term v0.44.0
+       github.com/testcontainers/testcontainers-go v0.44.0
+       github.com/tobischo/gokeepasslib/v3 v3.7.0
+       golang.org/x/term v0.45.0
 )
 
 require (
        atomicgo.dev/cursor v0.2.0 // indirect
        atomicgo.dev/keyboard v0.2.10 // indirect
        atomicgo.dev/schedule v0.1.0 // indirect
-       cel.dev/expr v0.25.2 // indirect
+       cel.dev/expr v0.25.3 // indirect
        dario.cat/mergo v1.0.2 // indirect
        github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // 
indirect
        github.com/Microsoft/go-winio v0.6.2 // indirect
@@ -31,7 +31,7 @@
        github.com/cenkalti/backoff/v4 v4.3.0 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
        github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
-       github.com/cloudflare/circl v1.6.4 // indirect
+       github.com/cloudflare/circl v1.6.5 // indirect
        github.com/containerd/console v1.0.5 // indirect
        github.com/containerd/errdefs v1.0.0 // indirect
        github.com/containerd/errdefs/pkg v0.3.0 // indirect
@@ -39,67 +39,65 @@
        github.com/containerd/platforms v0.2.1 // indirect
        github.com/cpuguy83/dockercfg v0.3.2 // indirect
        github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
-       github.com/davecgh/go-spew v1.1.1 // indirect
        github.com/distribution/reference v0.6.0 // indirect
-       github.com/docker/go-connections v0.7.0 // indirect
+       github.com/docker/go-connections v0.8.1 // indirect
        github.com/docker/go-units v0.5.0 // indirect
-       github.com/ebitengine/purego v0.10.1 // indirect
+       github.com/ebitengine/purego v0.10.2 // indirect
        github.com/felixge/httpsnoop v1.1.0 // indirect
        github.com/fsnotify/fsnotify v1.10.1 // indirect
-       github.com/go-logr/logr v1.4.3 // indirect
+       github.com/go-logr/logr v1.4.4 // indirect
        github.com/go-logr/stdr v1.2.2 // indirect
        github.com/go-ole/go-ole v1.3.0 // indirect
        github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
        github.com/google/go-querystring v1.2.0 // indirect
        github.com/gookit/color v1.6.1 // indirect
        github.com/inconshreveable/mousetrap v1.1.0 // indirect
-       github.com/klauspost/compress v1.18.6 // indirect
+       github.com/klauspost/compress v1.19.2 // indirect
        github.com/lithammer/fuzzysearch v1.1.8 // indirect
-       github.com/lufia/plan9stats v0.0.0-20260627054121-477a66015f15 // 
indirect
-       github.com/magiconair/properties v1.8.10 // indirect
-       github.com/mattn/go-runewidth v0.0.24 // indirect
+       github.com/lufia/plan9stats v0.0.0-20260802145828-341c2f0c90b5 // 
indirect
+       github.com/magiconair/properties v1.18.11 // indirect
+       github.com/mattn/go-runewidth v0.0.28 // indirect
        github.com/moby/docker-image-spec v1.3.1 // indirect
-       github.com/moby/go-archive v0.2.0 // indirect
+       github.com/moby/go-archive v0.3.3 // indirect
        github.com/moby/moby/api v1.55.0 // indirect
-       github.com/moby/moby/client v0.5.0 // indirect
+       github.com/moby/moby/client v0.5.1 // indirect
        github.com/moby/patternmatcher v0.6.1 // indirect
        github.com/moby/sys/sequential v0.7.0 // indirect
        github.com/moby/sys/user v0.4.1 // indirect
-       github.com/moby/sys/userns v0.1.0 // indirect
+       github.com/moby/sys/userns v0.2.0 // indirect
        github.com/moby/term v0.5.2 // indirect
        github.com/opencontainers/go-digest v1.0.0 // indirect
        github.com/opencontainers/image-spec v1.1.1 // indirect
-       github.com/pelletier/go-toml/v2 v2.4.2 // indirect
-       github.com/pmezard/go-difflib v1.0.0 // indirect
-       github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // 
indirect
+       github.com/pelletier/go-toml/v2 v2.4.3 // indirect
+       github.com/power-devops/perfstat v0.0.0-20260805114148-88456608a4f6 // 
indirect
        github.com/russross/blackfriday/v2 v2.1.0 // indirect
        github.com/sagikazarmark/locafero v0.12.0 // indirect
-       github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
-       github.com/shirou/gopsutil/v4 v4.26.5 // indirect
-       github.com/sirupsen/logrus v1.9.4 // indirect
+       github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 // indirect
+       github.com/shirou/gopsutil/v4 v4.26.7 // indirect
+       github.com/sirupsen/logrus v1.10.0 // indirect
        github.com/spf13/afero v1.15.0 // indirect
        github.com/spf13/cast v1.10.0 // indirect
-       github.com/stretchr/testify v1.11.1 // indirect
+       github.com/stretchr/testify v1.12.0 // indirect
        github.com/subosito/gotenv v1.6.0 // indirect
        github.com/tklauser/go-sysconf v0.4.0 // indirect
        github.com/tklauser/numcpus v0.12.0 // indirect
-       github.com/tobischo/argon2 v0.1.0 // indirect
-       github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
+       github.com/tobischo/argon2 v0.2.0 // indirect
+       github.com/xo/terminfo v1.0.0 // indirect
        github.com/yusufpapurcu/wmi v1.2.4 // indirect
        go.opentelemetry.io/auto/sdk v1.2.1 // indirect
-       go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 
// indirect
-       go.opentelemetry.io/otel v1.44.0 // indirect
-       go.opentelemetry.io/otel/metric v1.44.0 // indirect
-       go.opentelemetry.io/otel/trace v1.44.0 // indirect
-       go.yaml.in/yaml/v3 v3.0.4 // indirect
-       golang.org/x/crypto v0.53.0 // indirect
-       golang.org/x/exp v0.0.0-20260611194520-c48552f49976 // indirect
-       golang.org/x/sys v0.46.0 // indirect
-       golang.org/x/text v0.38.0 // indirect
-       golang.org/x/tools v0.47.0 // indirect
-       google.golang.org/genproto/googleapis/api 
v0.0.0-20260622175928-b703f567277d // indirect
-       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20260622175928-b703f567277d // indirect
-       google.golang.org/protobuf v1.36.11 // indirect
+       go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 
// indirect
+       go.opentelemetry.io/otel v1.45.0 // indirect
+       go.opentelemetry.io/otel/metric v1.45.0 // indirect
+       go.opentelemetry.io/otel/trace v1.45.0 // indirect
+       go.yaml.in/yaml/v3 v3.0.5 // indirect
+       golang.org/x/crypto v0.55.0 // indirect
+       golang.org/x/exp v0.0.0-20260813180055-c1d0aacb2297 // indirect
+       golang.org/x/sys v0.47.0 // indirect
+       golang.org/x/text v0.41.0 // indirect
+       golang.org/x/tools v0.49.0 // indirect
+       google.golang.org/genproto/googleapis/api 
v0.0.0-20260817212433-ac3dfec99bb1 // indirect
+       google.golang.org/genproto/googleapis/rpc 
v0.0.0-20260817212433-ac3dfec99bb1 // indirect
+       google.golang.org/protobuf v1.36.12 // indirect
        gopkg.in/yaml.v3 v3.0.1 // indirect
 )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/go.sum 
new/go-passbolt-cli-0.5.2/go.sum
--- old/go-passbolt-cli-0.5.1/go.sum    2026-07-02 11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/go.sum    2026-08-28 16:52:04.000000000 +0200
@@ -8,8 +8,8 @@
 atomicgo.dev/keyboard v0.2.10/go.mod 
h1:ap/z5ilnhLqYq852m6kPeTq5Z6aESGWu5mzRpJlC6aI=
 atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs=
 atomicgo.dev/schedule v0.1.0/go.mod 
h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU=
-cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs=
-cel.dev/expr v0.25.2/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
+cel.dev/expr v0.25.3 h1:A2jO8jwOugrrovveCWfj0KEZOfqiLgAcwjpHPhzIGw0=
+cel.dev/expr v0.25.3/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
 dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
 dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
 github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 
h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk=
@@ -32,8 +32,8 @@
 github.com/cespare/xxhash/v2 v2.3.0/go.mod 
h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/clipperhouse/uax29/v2 v2.7.0 
h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=
 github.com/clipperhouse/uax29/v2 v2.7.0/go.mod 
h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
-github.com/cloudflare/circl v1.6.4 
h1:pOXuDTCEYyzydgUpQ0CQz3LsinKjiSk6nNP5Lt5K64U=
-github.com/cloudflare/circl v1.6.4/go.mod 
h1:YxarevkLlbaHuWsxG6vmYNWBEsSp4pnp7j+4VljMavY=
+github.com/cloudflare/circl v1.6.5 
h1:O64F26HEqNhznd/hrC5KZXVKYuKM2rx4deZDTc4ihQA=
+github.com/cloudflare/circl v1.6.5/go.mod 
h1:h5LNyxAc5nTue9DS5jT+48en2PSDYt3zdGnz5OstK6c=
 github.com/containerd/console v1.0.5 
h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc=
 github.com/containerd/console v1.0.5/go.mod 
h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
 github.com/containerd/errdefs v1.0.0 
h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
@@ -57,12 +57,12 @@
 github.com/distribution/reference v0.6.0/go.mod 
h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
 github.com/dlclark/regexp2 v1.11.0 
h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
 github.com/dlclark/regexp2 v1.11.0/go.mod 
h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
-github.com/docker/go-connections v0.7.0 
h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c=
-github.com/docker/go-connections v0.7.0/go.mod 
h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q=
+github.com/docker/go-connections v0.8.1 
h1:JibmG5hULs5qXSr/cp/w3Pw5fZuStt4MOHMUExb29/M=
+github.com/docker/go-connections v0.8.1/go.mod 
h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q=
 github.com/docker/go-units v0.5.0 
h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
 github.com/docker/go-units v0.5.0/go.mod 
h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
-github.com/ebitengine/purego v0.10.1 
h1:dewVBCBT2GaMu1SrNTYxQhgQBethzfhiwvZiLGP/qyY=
-github.com/ebitengine/purego v0.10.1/go.mod 
h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
+github.com/ebitengine/purego v0.10.2 
h1:W809HbnvzAxgdm+aOvlSekrM16wGCdT/e76+9tS7gzE=
+github.com/ebitengine/purego v0.10.2/go.mod 
h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
 github.com/felixge/httpsnoop v1.1.0 
h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc=
 github.com/felixge/httpsnoop v1.1.0/go.mod 
h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE=
 github.com/frankban/quicktest v1.14.6 
h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
@@ -70,8 +70,8 @@
 github.com/fsnotify/fsnotify v1.10.1 
h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho=
 github.com/fsnotify/fsnotify v1.10.1/go.mod 
h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo=
 github.com/go-logr/logr v1.2.2/go.mod 
h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
-github.com/go-logr/logr v1.4.3/go.mod 
h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8=
+github.com/go-logr/logr v1.4.4/go.mod 
h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod 
h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-ole/go-ole v1.2.6/go.mod 
h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
@@ -79,8 +79,8 @@
 github.com/go-ole/go-ole v1.3.0/go.mod 
h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
 github.com/go-viper/mapstructure/v2 v2.5.0 
h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=
 github.com/go-viper/mapstructure/v2 v2.5.0/go.mod 
h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
-github.com/google/cel-go v0.28.1 
h1:YWIwi77J4xIsYUwAF/iIuS6haffzIHS8yWI8glSbLWM=
-github.com/google/cel-go v0.28.1/go.mod 
h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8=
+github.com/google/cel-go v0.31.0 
h1:H0bhpFTqOvmHrBGrWKp7ZlhBm5Hh8PYUEXnwxT1LL7A=
+github.com/google/cel-go v0.31.0/go.mod 
h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8=
 github.com/google/go-cmp v0.6.0/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 github.com/google/go-cmp v0.7.0/go.mod 
h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
@@ -96,8 +96,8 @@
 github.com/gookit/color v1.6.1/go.mod 
h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs=
 github.com/inconshreveable/mousetrap v1.1.0 
h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod 
h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/klauspost/compress v1.18.6 
h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao=
-github.com/klauspost/compress v1.18.6/go.mod 
h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
+github.com/klauspost/compress v1.19.2 
h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8=
+github.com/klauspost/compress v1.19.2/go.mod 
h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
 github.com/klauspost/cpuid/v2 v2.3.0 
h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
 github.com/klauspost/cpuid/v2 v2.3.0/go.mod 
h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -106,58 +106,60 @@
 github.com/kr/text v0.2.0/go.mod 
h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/lithammer/fuzzysearch v1.1.8 
h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4=
 github.com/lithammer/fuzzysearch v1.1.8/go.mod 
h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4=
-github.com/lufia/plan9stats v0.0.0-20260627054121-477a66015f15 
h1:YkjVPl/YH5XlJ+/NiwzJtPYXXKRcyjmEUhsDci6YK3c=
-github.com/lufia/plan9stats v0.0.0-20260627054121-477a66015f15/go.mod 
h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg=
-github.com/magiconair/properties v1.8.10 
h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE=
-github.com/magiconair/properties v1.8.10/go.mod 
h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
-github.com/mattn/go-runewidth v0.0.24 
h1:cpokDiIn0MGnhdHwuWnJBITySJ20QyNGnY2kR/ay2DU=
-github.com/mattn/go-runewidth v0.0.24/go.mod 
h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
+github.com/lufia/plan9stats v0.0.0-20260802145828-341c2f0c90b5 
h1:eveIIGn4BGM3qknO74omf6HYr30/exH+eVUTuAgwjZ0=
+github.com/lufia/plan9stats v0.0.0-20260802145828-341c2f0c90b5/go.mod 
h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg=
+github.com/magiconair/properties v1.18.11 
h1:j5ozYZl0zCjG7ahMDH0GWIobOvvUzT0BdAguG0ViKy0=
+github.com/magiconair/properties v1.18.11/go.mod 
h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mattn/go-runewidth v0.0.28 
h1:rPyg2ybwEKPebvpzVWe1gKBkH8EQFkxO4Y0hjBeLaBU=
+github.com/mattn/go-runewidth v0.0.28/go.mod 
h1:3qAiGCV4Koz/yuveO58qUefmUTRm8r0IGEXZ9jeHp/8=
 github.com/moby/docker-image-spec v1.3.1 
h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
 github.com/moby/docker-image-spec v1.3.1/go.mod 
h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
-github.com/moby/go-archive v0.2.0 
h1:zg5QDUM2mi0JIM9fdQZWC7U8+2ZfixfTYoHL7rWUcP8=
-github.com/moby/go-archive v0.2.0/go.mod 
h1:mNeivT14o8xU+5q1YnNrkQVpK+dnNe/K6fHqnTg4qPU=
+github.com/moby/go-archive v0.3.3 
h1:OxxR9paxsluYi+zDUEXTTaIxtkK3viymW+Ka7vRhhME=
+github.com/moby/go-archive v0.3.3/go.mod 
h1:Npdv43fFqlhZW7Xo8fbm3ZMYFvAGNviUPqX21VERbcE=
 github.com/moby/moby/api v1.55.0 
h1:2/sexvQyqIWS8pRSCFddBfpW2qE7vR7FCL+vN8pxwMc=
 github.com/moby/moby/api v1.55.0/go.mod 
h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs=
-github.com/moby/moby/client v0.5.0 
h1:5XhyPk2fuOWf6RlSFa3MkIIgDZkF25xToXW8Q/BH7cc=
-github.com/moby/moby/client v0.5.0/go.mod 
h1:rcVpF8ncl9vo5gaIBdol6CnbEtSj1uxMvEV/UrykF/s=
+github.com/moby/moby/client v0.5.1 
h1:tYNaJno4c0HXz12y5BiqEDy0rVTYkWzI26lGvnTMiJw=
+github.com/moby/moby/client v0.5.1/go.mod 
h1:odLstlZ6uSnfvAgVxMpvgmb8SUdd+siH2T0GBuxVAlM=
 github.com/moby/patternmatcher v0.6.1 
h1:qlhtafmr6kgMIJjKJMDmMWq7WLkKIo23hsrpR3x084U=
 github.com/moby/patternmatcher v0.6.1/go.mod 
h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc=
+github.com/moby/sys/mount v0.3.5 
h1:eS3fsZTjHaBihwjp4/+5Z3jxqLXYsbwxqpVSfFv3M00=
+github.com/moby/sys/mount v0.3.5/go.mod 
h1:WUQDO+/uCiCIkIztx8SrwIDVn2dtMFRBebRhpDFT71M=
+github.com/moby/sys/mountinfo v0.7.2 
h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg=
+github.com/moby/sys/mountinfo v0.7.2/go.mod 
h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4=
 github.com/moby/sys/sequential v0.7.0 
h1:ASQNGNROJSuOO6LL6bPHbKvuZu6NU8P4ldPWk31zj/8=
 github.com/moby/sys/sequential v0.7.0/go.mod 
h1:NfSTAp6V3fw4tmkD62PEcOKeZKquXT8VKCkf7aVR79o=
 github.com/moby/sys/user v0.4.1 h1:RgjRlaDKi/Xmyrz4t8lyzXT6v2ooFeO/7xtchmhVWE0=
 github.com/moby/sys/user v0.4.1/go.mod 
h1:E9QsW5WRe1kUAf7kW8hXKwu1uhsZEAdPLYHYSDudF4Y=
-github.com/moby/sys/userns v0.1.0 
h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
-github.com/moby/sys/userns v0.1.0/go.mod 
h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
+github.com/moby/sys/userns v0.2.0 
h1:nEtDtp7NCV/6dutSklNe8FrENPwFdc4mXnZqC/JWgXM=
+github.com/moby/sys/userns v0.2.0/go.mod 
h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
 github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
 github.com/moby/term v0.5.2/go.mod 
h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
 github.com/opencontainers/go-digest v1.0.0 
h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
 github.com/opencontainers/go-digest v1.0.0/go.mod 
h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
 github.com/opencontainers/image-spec v1.1.1 
h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
 github.com/opencontainers/image-spec v1.1.1/go.mod 
h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
-github.com/passbolt/go-passbolt v0.8.1 
h1:P4l6qhVUrogUMXyVvPtu8ua5AaWnI9gc0PrA1Rer3fU=
-github.com/passbolt/go-passbolt v0.8.1/go.mod 
h1:D9ffZzEwZCVpbw6FLxvknna1tKQC73/R49uWM2OxLNA=
-github.com/pelletier/go-toml/v2 v2.4.2 
h1:M2fKKbmyvI+hGId/D0W64qDBMVhJnNR10O5gIbMc//Q=
-github.com/pelletier/go-toml/v2 v2.4.2/go.mod 
h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
-github.com/pmezard/go-difflib v1.0.0 
h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 
h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
-github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod 
h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
+github.com/passbolt/go-passbolt v0.8.3 
h1:9ybKiVCpojZJ3f+3TKvzbftC+y37prKdOfzf4O6Z9k8=
+github.com/passbolt/go-passbolt v0.8.3/go.mod 
h1:CLRWahnjlIJoFm0nj5Wrpk+Tm8ypaiF2dK6BdE4QHBg=
+github.com/pelletier/go-toml/v2 v2.4.3 
h1:GTRvJQutkOSftxIFD5xw9aepkYNuPWmVJpffdDPYVpY=
+github.com/pelletier/go-toml/v2 v2.4.3/go.mod 
h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
+github.com/power-devops/perfstat v0.0.0-20260805114148-88456608a4f6 
h1:jL3a8soXdzuTCcRnKhOmtcsVOObdDTFf4O2B403HPRU=
+github.com/power-devops/perfstat v0.0.0-20260805114148-88456608a4f6/go.mod 
h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
 github.com/pterm/pterm v0.12.83 h1:ie+YmGmA727VuhxBlyGr74Ks+7McV6kT99IB8EU80aA=
 github.com/pterm/pterm v0.12.83/go.mod 
h1:xlgc6bFWyJIMtmLJvGim+L7jhSReilOlOnodeIYe4Tk=
-github.com/rogpeppe/go-internal v1.15.0 
h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc=
-github.com/rogpeppe/go-internal v1.15.0/go.mod 
h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs=
+github.com/rogpeppe/go-internal v1.16.0 
h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g=
+github.com/rogpeppe/go-internal v1.16.0/go.mod 
h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs=
 github.com/russross/blackfriday/v2 v2.1.0 
h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod 
h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/sagikazarmark/locafero v0.12.0 
h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4=
 github.com/sagikazarmark/locafero v0.12.0/go.mod 
h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI=
-github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 
h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
-github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod 
h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
+github.com/santhosh-tekuri/jsonschema/v6 v6.0.3 
h1:1EYB5IzjZawrrnELUi78f9fPu57HuXjmddZPjrls/28=
+github.com/santhosh-tekuri/jsonschema/v6 v6.0.3/go.mod 
h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
 github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
 github.com/sergi/go-diff v1.4.0/go.mod 
h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
-github.com/shirou/gopsutil/v4 v4.26.5 
h1:RPcBXkpz7kOj9PqGFQOlBPZHsyaPvPVQc098y9RmCNM=
-github.com/shirou/gopsutil/v4 v4.26.5/go.mod 
h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ=
-github.com/sirupsen/logrus v1.9.4 
h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
-github.com/sirupsen/logrus v1.9.4/go.mod 
h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
+github.com/shirou/gopsutil/v4 v4.26.7 
h1:IXzpHz/dkMRYAhKkOXr1HB6SuzWU3eoyyeWe7g3bNZc=
+github.com/shirou/gopsutil/v4 v4.26.7/go.mod 
h1:5O9FjBiXoTDFatIWjZZosqj4pV0DRtLx598xGbBehzM=
+github.com/sirupsen/logrus v1.10.0 
h1:T8MxJJXVZkfcC5zSRMRAg2F8+lxjmUCGGWPzFxO+Msc=
+github.com/sirupsen/logrus v1.10.0/go.mod 
h1:FXZFonkDAnFozmO+5hGAFvB0Yg9/j2SIhA/QuIkP180=
 github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
 github.com/spf13/afero v1.15.0/go.mod 
h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
 github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
@@ -171,47 +173,48 @@
 github.com/spf13/viper v1.21.0/go.mod 
h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
 github.com/stretchr/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4=
 github.com/stretchr/objx v0.5.3/go.mod 
h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0=
-github.com/stretchr/testify v1.11.1 
h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
-github.com/stretchr/testify v1.11.1/go.mod 
h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/stretchr/testify v1.12.0 
h1:K6Mr6jO9JICuend/5xzTM03ydSV3vdNRYAdPSukj8uI=
+github.com/stretchr/testify v1.12.0/go.mod 
h1:bOYBZb5qJ00vPzWfIqBUZPaxK8jWiXc6d3ErP4Ca9Gw=
 github.com/subosito/gotenv v1.6.0 
h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
 github.com/subosito/gotenv v1.6.0/go.mod 
h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
-github.com/testcontainers/testcontainers-go v0.43.0 
h1:oEQx5MW2DGd9z3AeEQfB2lPM0eLs7ztyaGRu75bFo5A=
-github.com/testcontainers/testcontainers-go v0.43.0/go.mod 
h1:+VxkT2NQnKOZPKi6praMuMKYHYyOGXr0XSBSlSMCzFo=
+github.com/testcontainers/testcontainers-go v0.44.0 
h1:/Fwh6HY1mIikhnm9e7HwoxGycx0lzRAE0f5VQpjFxzI=
+github.com/testcontainers/testcontainers-go v0.44.0/go.mod 
h1:IcnwQrYTO86xHXu5bvMaBH7ATlbS3Qn1M1QWW3c66rE=
 github.com/tklauser/go-sysconf v0.4.0 
h1:7H0uAN+7RkwWRaxhYXDLqa5V3LPrJeV8wmD9dRUgPQU=
 github.com/tklauser/go-sysconf v0.4.0/go.mod 
h1:8mTNWyog7H+MpKijp4VmKJAd2bbYQ2zuUwkYRbUArPI=
 github.com/tklauser/numcpus v0.12.0 
h1:NR85qdvHA9pFse3x3weVZ0r0ST8R6l5RHbZrlRaqob4=
 github.com/tklauser/numcpus v0.12.0/go.mod 
h1:ABHeXzJnr/qqwguhClkZKT1/8VABcYrsyUiUGobwWJg=
-github.com/tobischo/argon2 v0.1.0 
h1:mwAx/9DK/4rP0xzNifb/XMAf43dU3eG1B3aeF88qu4Y=
-github.com/tobischo/argon2 v0.1.0/go.mod 
h1:4NLmLFwhWPbT66nRZNgcktV/mibJ6fESoeEp43h9GRw=
-github.com/tobischo/gokeepasslib/v3 v3.6.2 
h1:SJzzllmNe7iZLudLJ3Lzdm3pDb++AJqZlmqG+SR8bVc=
-github.com/tobischo/gokeepasslib/v3 v3.6.2/go.mod 
h1:ga7HFqG0TZSLNao/QOnV2+yngkrf5186saPxSQ1Xp7o=
-github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e 
h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
-github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod 
h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
+github.com/tobischo/argon2 v0.2.0 
h1:qo701fE9AsxHUIfHlO9HxBwMgvsW+ADgddXP5GVYvaA=
+github.com/tobischo/argon2 v0.2.0/go.mod 
h1:CcHsOigH7ztpY+OxaaVC7F4z1RXDU51vXIu/B6gKbho=
+github.com/tobischo/gokeepasslib/v3 v3.7.0 
h1:MZKx72JkkQdElHr4gOQlnLF92B6i+Bv4KwxadUr1WzE=
+github.com/tobischo/gokeepasslib/v3 v3.7.0/go.mod 
h1:Lvv7/e6Eys07pEjQfpx52W9ptuDRiM4Osiz3m897tQg=
+github.com/xo/terminfo v1.0.0 h1:2ZpYzqWzyyytjk3TP6aJVDhkMAkc99/1xKQdA3TDTBY=
+github.com/xo/terminfo v1.0.0/go.mod 
h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
 github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yusufpapurcu/wmi v1.2.4 
h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
 github.com/yusufpapurcu/wmi v1.2.4/go.mod 
h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 go.opentelemetry.io/auto/sdk v1.2.1 
h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
 go.opentelemetry.io/auto/sdk v1.2.1/go.mod 
h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 
h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod 
h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI=
-go.opentelemetry.io/otel v1.44.0 
h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU=
-go.opentelemetry.io/otel v1.44.0/go.mod 
h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc=
-go.opentelemetry.io/otel/metric v1.44.0 
h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc=
-go.opentelemetry.io/otel/metric v1.44.0/go.mod 
h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo=
-go.opentelemetry.io/otel/sdk v1.44.0 
h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58=
-go.opentelemetry.io/otel/sdk v1.44.0/go.mod 
h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0=
-go.opentelemetry.io/otel/sdk/metric v1.44.0 
h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI=
-go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod 
h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA=
-go.opentelemetry.io/otel/trace v1.44.0 
h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk=
-go.opentelemetry.io/otel/trace v1.44.0/go.mod 
h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE=
-go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 
h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0/go.mod 
h1:085m8qbm4hgc8rZWGDEa4vmyyo2c3nPxUslYUKUIU04=
+go.opentelemetry.io/otel v1.45.0 
h1:pdrWmLHofpubmArBv1LgFSv1Z0Ie/ppdZzu+kUN5EeU=
+go.opentelemetry.io/otel v1.45.0/go.mod 
h1:XZxIqPapzEYnhNSScF5DIqXhm/rYi0FzCe2XddAwZfQ=
+go.opentelemetry.io/otel/metric v1.45.0 
h1:7Eg1uH7CJ5cXv9is6tnBe1FI6rj1nwUdbFypRm3br/M=
+go.opentelemetry.io/otel/metric v1.45.0/go.mod 
h1:HAPbm1nd3p1PmFH7v2dR+6BjXxw+Lq4a2+pndMAm08s=
+go.opentelemetry.io/otel/sdk v1.45.0 
h1:4VVSMgQ83dUgW2aoX5f6JgLvHwIvzcuLnF9lUdCSpCw=
+go.opentelemetry.io/otel/sdk v1.45.0/go.mod 
h1:Sr40LgXV7DsKMMJMKOhUWOgMWTfAaqvm2kF0g7ilwuA=
+go.opentelemetry.io/otel/sdk/metric v1.45.0 
h1:oVFszMfyj1Am6s24Vtc7wBb8BKLcwepJjNEYILuiE3o=
+go.opentelemetry.io/otel/sdk/metric v1.45.0/go.mod 
h1:vUWUxDZvu1WVRj8JA8S0AdhsPrZoDpA2DdZauIh4mDA=
+go.opentelemetry.io/otel/trace v1.45.0 
h1:l/mP6Uv7oNO7/TblbhpbgMidxhq1uO/rPsikOyVhxag=
+go.opentelemetry.io/otel/trace v1.45.0/go.mod 
h1:qoJJA2xNMnxRrdISU/kLtfUH2wNeQbiv+jhs/CxI8bc=
 go.yaml.in/yaml/v3 v3.0.4/go.mod 
h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
+go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw=
+go.yaml.in/yaml/v3 v3.0.5/go.mod 
h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod 
h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
-golang.org/x/crypto v0.53.0/go.mod 
h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
-golang.org/x/exp v0.0.0-20260611194520-c48552f49976 
h1:X8Hz2ImujgbmetVuW+w2YkyZChE3cBpZi2P158rTG9M=
-golang.org/x/exp v0.0.0-20260611194520-c48552f49976/go.mod 
h1:vnf4pv9iKZXY58sQE1L86zmNWJ4159e1RkcWiLCkeEY=
+golang.org/x/crypto v0.55.0 h1:+KWHjbgOaAQ66dh/YlkZKHlz9ZUlq61AFirAR9ntP8M=
+golang.org/x/crypto v0.55.0/go.mod 
h1:uq0V9dE/fzQuJtbnL+2EhWOE63vo164FY8xqEnV9xis=
+golang.org/x/exp v0.0.0-20260813180055-c1d0aacb2297 
h1:YXnL44eJ77R+ji4/ooy8UsXIhz+lbi2Qgdlc8iRN0gY=
+golang.org/x/exp v0.0.0-20260813180055-c1d0aacb2297/go.mod 
h1:Mkmymgv+uMpSQ/XxJ/7GpdrdYoqm3u72jEbpCLiJmNk=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -231,33 +234,33 @@
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
-golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=
+golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
-golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
-golang.org/x/term v0.44.0/go.mod 
h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
+golang.org/x/term v0.45.0 h1:NwWyBmoJCbfTHpxrWoZ9C6/VxOf7ic219I8xZZFdrf0=
+golang.org/x/term v0.45.0/go.mod 
h1:9aqxs0blBcrm/n0L9QW0aRVD+ktan8ssZromtqJC43w=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
-golang.org/x/text v0.38.0/go.mod 
h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
+golang.org/x/text v0.41.0 h1:vz/seA0lnX87Othu2f/0L24RcgrXD9/YFTSuGjj3rH8=
+golang.org/x/text v0.41.0/go.mod 
h1:jvf1O8ajNzZqhSrQBPbutR/EB83Cc0CFrezNQIwbb5M=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod 
h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q=
-golang.org/x/tools v0.47.0/go.mod 
h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA=
+golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI=
+golang.org/x/tools v0.49.0/go.mod 
h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/genproto/googleapis/api v0.0.0-20260622175928-b703f567277d 
h1:xr2lwHI91bn3UiXcnyzRMQjp2LRiM8wEHzwUaE0YhTs=
-google.golang.org/genproto/googleapis/api 
v0.0.0-20260622175928-b703f567277d/go.mod 
h1:O0ZOWSrfWfJ+Z5HbwZ+wNtHsg/vk1k2C/w67eww8PfQ=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20260622175928-b703f567277d 
h1:mpAgMyM9vQHxycBlDq50y1VHpfSfVwzXvrQKtYbXuUY=
-google.golang.org/genproto/googleapis/rpc 
v0.0.0-20260622175928-b703f567277d/go.mod 
h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
-google.golang.org/protobuf v1.36.11 
h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
-google.golang.org/protobuf v1.36.11/go.mod 
h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+google.golang.org/genproto/googleapis/api v0.0.0-20260817212433-ac3dfec99bb1 
h1:lrupDmKL3p5kEX1M92oan027eCKcouzjuPbH6YBK+Rs=
+google.golang.org/genproto/googleapis/api 
v0.0.0-20260817212433-ac3dfec99bb1/go.mod 
h1:q/3oV3jAi5vwelxsVAprMBC8BcM2zmNe+IjRGd+9/ks=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20260817212433-ac3dfec99bb1 
h1:utmqiUzZAEINbLmRyAt1QjVkMyLQ+lvIwCpLaB1rZfw=
+google.golang.org/genproto/googleapis/rpc 
v0.0.0-20260817212433-ac3dfec99bb1/go.mod 
h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
+google.golang.org/protobuf v1.36.12 
h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fwxc=
+google.golang.org/protobuf v1.36.12/go.mod 
h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c 
h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod 
h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/internal/cmd/exec.go 
new/go-passbolt-cli-0.5.2/internal/cmd/exec.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/exec.go      2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/exec.go      2026-08-28 
16:52:04.000000000 +0200
@@ -72,13 +72,13 @@
        envVars := os.Environ()
 
        for i, envVar := range envVars {
-               splitIndex := strings.Index(envVar, "=")
-               if splitIndex == -1 {
+               before, after, ok := strings.Cut(envVar, "=")
+               if !ok {
                        continue
                }
 
-               key := envVar[:splitIndex]
-               value := envVar[splitIndex+1:]
+               key := before
+               value := after
 
                if !strings.HasPrefix(value, PassboltPrefix) {
                        continue
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/go-passbolt-cli-0.5.1/internal/cmd/folder/json_test.go 
new/go-passbolt-cli-0.5.2/internal/cmd/folder/json_test.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/folder/json_test.go  2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/folder/json_test.go  2026-08-28 
16:52:04.000000000 +0200
@@ -14,7 +14,7 @@
 // FolderJSONOutput.Personal must emit even when false so that
 // --filter 'personal == false' isn't blocked by omitempty stripping.
 func TestFolderJSONOutput_PersonalAlwaysEmitted(t *testing.T) {
-       out := FolderJSONOutput{ID: ptr("f1"), Name: ptr("shared"), Personal: 
false}
+       out := FolderJSONOutput{ID: new("f1"), Name: new("shared"), Personal: 
false}
        got, err := json.Marshal(out)
        if err != nil {
                t.Fatalf("marshal: %v", err)
@@ -99,7 +99,7 @@
 // appears, id/timestamps omitted. End-to-end output is covered by the
 // integration get-roundtrip scripts.
 func TestFolderGetJSONContract(t *testing.T) {
-       out := FolderJSONOutput{FolderParentID: ptr("p1"), Name: ptr("shared")}
+       out := FolderJSONOutput{FolderParentID: new("p1"), Name: new("shared")}
        m := marshalToMap(t, out)
        assertKeySet(t, m, map[string]bool{"folder_parent_id": true, "name": 
true, "personal": true})
        for _, k := range []string{"id", "created_timestamp", 
"modified_timestamp"} {
@@ -171,8 +171,6 @@
        }
 }
 
-func ptr[T any](v T) *T { return &v }
-
 // captureStdout swaps os.Stdout for a pipe, runs fn, restores stdout, and
 // returns whatever fn wrote.
 func captureStdout(t *testing.T, fn func()) string {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/go-passbolt-cli-0.5.1/internal/cmd/group/json_test.go 
new/go-passbolt-cli-0.5.2/internal/cmd/group/json_test.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/group/json_test.go   2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/group/json_test.go   2026-08-28 
16:52:04.000000000 +0200
@@ -14,7 +14,7 @@
 // GroupJSONOutput's Deleted/UserCount must emit even when false/0 so that
 // --filter 'deleted == false' / 'user_count == 0' isn't blocked by omitempty.
 func TestGroupJSONOutput_ScalarFieldsAlwaysEmitted(t *testing.T) {
-       out := GroupJSONOutput{ID: ptr("g1"), Name: ptr("eng"), Deleted: false, 
UserCount: 0}
+       out := GroupJSONOutput{ID: new("g1"), Name: new("eng"), Deleted: false, 
UserCount: 0}
        got, err := json.Marshal(out)
        if err != nil {
                t.Fatalf("marshal: %v", err)
@@ -92,9 +92,9 @@
 // covered by the integration get-roundtrip scripts.
 func TestGroupGetJSONContract(t *testing.T) {
        out := GroupJSONOutput{
-               Name: ptr("eng"),
+               Name: new("eng"),
                Users: []GroupUserMembershipJSONOutput{
-                       {ID: ptr("u1"), Username: ptr("ada@x"), FirstName: 
ptr("Ada"), LastName: ptr("L"), IsGroupManager: ptr(true)},
+                       {ID: new("u1"), Username: new("ada@x"), FirstName: 
new("Ada"), LastName: new("L"), IsGroupManager: new(true)},
                },
        }
        m := marshalToMap(t, out)
@@ -182,8 +182,6 @@
        }
 }
 
-func ptr[T any](v T) *T { return &v }
-
 // captureStdout swaps os.Stdout for a pipe, runs fn, restores stdout, and
 // returns whatever fn wrote.
 func captureStdout(t *testing.T, fn func()) string {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/internal/cmd/keepass/export.go 
new/go-passbolt-cli-0.5.2/internal/cmd/keepass/export.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/keepass/export.go    2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/keepass/export.go    2026-08-28 
16:52:04.000000000 +0200
@@ -58,7 +58,7 @@
        case "v3":
                kdbxVersion = gokeepasslib.WithDatabaseKDBXVersion3()
        case "v4":
-               kdbxVersion = gokeepasslib.WithDatabaseKDBXVersion4()
+               kdbxVersion = gokeepasslib.WithDatabaseKDBXVersion40()
        default:
                return fmt.Errorf("invalid kdbx-version %q: must be v3 or v4", 
kdbxVersionFlag)
        }
@@ -202,44 +202,20 @@
 
        // Custom fields: each one becomes a protected KDBX field, matching 
what the
        // Passbolt browser extension does in 
resourcesKdbxExporter.setCustomFields.
-       // Field name comes from metadata.custom_fields[].metadata_key, value 
from
-       // secret.custom_fields[].secret_value, correlated by id.
+       // helper.ParseCustomFields correlates the metadata and secret halves 
by id.
        addCustomFields(&entry, metadata, secretFields)
 
        return &entry, nil
 }
 
 func addCustomFields(entry *gokeepasslib.Entry, metadata, secretFields 
map[string]any) {
-       metaList, _ := metadata["custom_fields"].([]any)
-       if len(metaList) == 0 {
-               return
-       }
-       secretList, _ := secretFields["custom_fields"].([]any)
-       valueByID := make(map[string]string, len(secretList))
-       for _, item := range secretList {
-               m, ok := item.(map[string]any)
-               if !ok {
-                       continue
-               }
-               id, _ := m["id"].(string)
-               val, _ := m["secret_value"].(string)
-               if id != "" {
-                       valueByID[id] = val
-               }
-       }
-       for _, item := range metaList {
-               m, ok := item.(map[string]any)
-               if !ok {
-                       continue
-               }
-               id, _ := m["id"].(string)
-               key, _ := m["metadata_key"].(string)
-               if key == "" {
+       for _, cf := range helper.ParseCustomFields(metadata, secretFields) {
+               if cf.Name == "" {
                        continue
                }
                entry.Values = append(entry.Values, gokeepasslib.ValueData{
-                       Key:   key,
-                       Value: gokeepasslib.V{Content: valueByID[id], 
Protected: w.NewBoolWrapper(true)},
+                       Key:   cf.Name,
+                       Value: gokeepasslib.V{Content: cf.Value, Protected: 
w.NewBoolWrapper(true)},
                })
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/go-passbolt-cli-0.5.1/internal/cmd/keepass/export_test.go 
new/go-passbolt-cli-0.5.2/internal/cmd/keepass/export_test.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/keepass/export_test.go       
2026-07-02 11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/keepass/export_test.go       
2026-08-28 16:52:04.000000000 +0200
@@ -4,6 +4,8 @@
        "net/url"
        "strings"
        "testing"
+
+       "github.com/tobischo/gokeepasslib/v3"
 )
 
 // encodeQuery is a copy of url.Values.Encode that uses %20 instead of '+' for
@@ -78,3 +80,70 @@
                t.Errorf("encodeQuery(%v) = %q, want label=foo&bar=baz (current 
behavior)", v, got)
        }
 }
+
+// addCustomFields delegates the metadata/secret merge to
+// helper.ParseCustomFields; these tests cover the KDBX-specific part:
+// ordering, the Protected flag, and dropping fields KeePass cannot key.
+func TestAddCustomFields(t *testing.T) {
+       const idA = "11111111-1111-1111-1111-111111111111"
+       const idB = "22222222-2222-2222-2222-222222222222"
+
+       metadata := map[string]any{
+               "custom_fields": []any{
+                       map[string]any{"id": idA, "metadata_key": "api-key"},
+                       // Cleartext value: the secret half must still carry a 
(empty)
+                       // secret_value, so this used to export as blank.
+                       map[string]any{"id": idB, "metadata_key": "env", 
"metadata_value": "production"},
+               },
+       }
+       secretFields := map[string]any{
+               "custom_fields": []any{
+                       map[string]any{"id": idA, "secret_value": 
"sk-secret-123"},
+                       map[string]any{"id": idB, "secret_value": ""},
+               },
+       }
+
+       entry := gokeepasslib.NewEntry()
+       addCustomFields(&entry, metadata, secretFields)
+
+       want := []struct{ key, value string }{
+               {"api-key", "sk-secret-123"},
+               {"env", "production"},
+       }
+       if len(entry.Values) != len(want) {
+               t.Fatalf("got %d values, want %d: %+v", len(entry.Values), 
len(want), entry.Values)
+       }
+       for i, w := range want {
+               got := entry.Values[i]
+               if got.Key != w.key {
+                       t.Errorf("value %d: key = %q, want %q (order must 
follow the metadata array)", i, got.Key, w.key)
+               }
+               if got.Value.Content != w.value {
+                       t.Errorf("value %d (%s): content = %q, want %q", i, 
w.key, got.Value.Content, w.value)
+               }
+               if !got.Value.Protected.Bool {
+                       t.Errorf("value %d (%s): not protected, want every 
custom field protected", i, w.key)
+               }
+       }
+}
+
+func TestAddCustomFields_SkipsUnnamedAndEmpty(t *testing.T) {
+       const idA = "11111111-1111-1111-1111-111111111111"
+
+       // A field with no name on either side cannot be keyed in KDBX.
+       entry := gokeepasslib.NewEntry()
+       addCustomFields(&entry,
+               map[string]any{"custom_fields": []any{map[string]any{"id": 
idA}}},
+               map[string]any{"custom_fields": []any{map[string]any{"id": idA, 
"secret_value": "v"}}},
+       )
+       if len(entry.Values) != 0 {
+               t.Errorf("unnamed field: got %+v, want no values", entry.Values)
+       }
+
+       // A resource without custom fields must add nothing.
+       entry = gokeepasslib.NewEntry()
+       addCustomFields(&entry, map[string]any{"name": "x"}, 
map[string]any{"password": "p"})
+       if len(entry.Values) != 0 {
+               t.Errorf("no custom fields: got %+v, want no values", 
entry.Values)
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/go-passbolt-cli-0.5.1/internal/cmd/resource/json_test.go 
new/go-passbolt-cli-0.5.2/internal/cmd/resource/json_test.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/resource/json_test.go        
2026-07-02 11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/resource/json_test.go        
2026-08-28 16:52:04.000000000 +0200
@@ -16,8 +16,8 @@
 // Regression guard mirroring the user lifecycle-field test.
 func TestResourceJSONOutput_BoolFieldsAlwaysEmitted(t *testing.T) {
        out := ResourceJSONOutput{
-               ID:      ptr("r1"),
-               Name:    ptr("server"),
+               ID:      new("r1"),
+               Name:    new("server"),
                Deleted: false,
                Expired: false,
        }
@@ -123,12 +123,12 @@
 // the integration get-roundtrip scripts.
 func TestResourceGetJSONContract(t *testing.T) {
        out := ResourceJSONOutput{
-               FolderParentID: ptr("f1"),
-               Name:           ptr("server"),
-               Username:       ptr("admin"),
-               URI:            ptr("https://example.com";),
-               Password:       ptr("secret"),
-               Description:    ptr("d"),
+               FolderParentID: new("f1"),
+               Name:           new("server"),
+               Username:       new("admin"),
+               URI:            new("https://example.com";),
+               Password:       new("secret"),
+               Description:    new("d"),
        }
        m := marshalToMap(t, out)
 
@@ -219,8 +219,6 @@
        }
 }
 
-func ptr[T any](v T) *T { return &v }
-
 // captureStdout swaps os.Stdout for a pipe, runs fn, restores stdout, and
 // returns whatever fn wrote. Used to test functions that print directly.
 func captureStdout(t *testing.T, fn func()) string {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/internal/cmd/resource/list.go 
new/go-passbolt-cli-0.5.2/internal/cmd/resource/list.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/resource/list.go     2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/resource/list.go     2026-08-28 
16:52:04.000000000 +0200
@@ -113,12 +113,9 @@
 
 func decryptResourcesParallel(ctx context.Context, client *api.Client, 
resources []api.Resource, needSecrets bool) ([]decryptedResource, error) {
        // Use parallel decryption with worker pool
-       numWorkers := int(viper.GetUint("workers"))
-
-       // Limit Worker count to Resource count
-       if len(resources) < numWorkers {
-               numWorkers = len(resources)
-       }
+       numWorkers := min(
+               // Limit Worker count to Resource count
+               len(resources), int(viper.GetUint("workers")))
 
        // Filter resources - only require secrets if we're fetching them
        var validResources []api.Resource
@@ -142,9 +139,7 @@
        // Start workers
        var wg sync.WaitGroup
        for w := 0; w < numWorkers; w++ {
-               wg.Add(1)
-               go func() {
-                       defer wg.Done()
+               wg.Go(func() {
                        for idx := range jobs {
                                resource := validResources[idx]
 
@@ -204,7 +199,7 @@
                                        err:            err,
                                }
                        }
-               }()
+               })
        }
 
        // Send jobs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/go-passbolt-cli-0.5.1/internal/cmd/user/filter_test.go 
new/go-passbolt-cli-0.5.2/internal/cmd/user/filter_test.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/user/filter_test.go  2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/user/filter_test.go  2026-08-28 
16:52:04.000000000 +0200
@@ -74,7 +74,7 @@
        const n = 10000
        items := make([]api.User, n)
        wantActive := 0
-       for i := 0; i < n; i++ {
+       for i := range n {
                active := i%2 == 0
                if active {
                        wantActive++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/internal/cmd/user/json_test.go 
new/go-passbolt-cli-0.5.2/internal/cmd/user/json_test.go
--- old/go-passbolt-cli-0.5.1/internal/cmd/user/json_test.go    2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/cmd/user/json_test.go    2026-08-28 
16:52:04.000000000 +0200
@@ -16,8 +16,8 @@
 // omitempty-style stripping. Regression guard.
 func TestUserJSONOutput_LifecycleFieldsAlwaysEmitted(t *testing.T) {
        out := UserJSONOutput{
-               ID:       ptr("u1"),
-               Username: ptr("[email protected]"),
+               ID:       new("u1"),
+               Username: new("[email protected]"),
                Active:   false,
                Deleted:  false,
                Disabled: false,
@@ -117,10 +117,10 @@
 // output is covered by the integration get-roundtrip scripts.
 func TestUserGetJSONContract(t *testing.T) {
        out := UserJSONOutput{
-               Username:  ptr("[email protected]"),
-               FirstName: ptr("Ada"),
-               LastName:  ptr("Lovelace"),
-               Role:      ptr("user"),
+               Username:  new("[email protected]"),
+               FirstName: new("Ada"),
+               LastName:  new("Lovelace"),
+               Role:      new("user"),
        }
        m := marshalToMap(t, out)
        assertKeySet(t, m, map[string]bool{
@@ -205,8 +205,6 @@
        }
 }
 
-func ptr[T any](v T) *T { return &v }
-
 // captureStdout swaps os.Stdout for a pipe, runs fn, restores stdout, and
 // returns whatever fn wrote. Used to test functions that print directly
 // rather than returning an io.Writer-bound result.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/internal/testenv/passbolt.go 
new/go-passbolt-cli-0.5.2/internal/testenv/passbolt.go
--- old/go-passbolt-cli-0.5.1/internal/testenv/passbolt.go      2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/testenv/passbolt.go      2026-08-28 
16:52:04.000000000 +0200
@@ -18,6 +18,7 @@
        "errors"
        "fmt"
        "io"
+       "os"
        "regexp"
        "strings"
        "testing"
@@ -35,10 +36,30 @@
 // versa) is a deliberate, reviewable change. Refresh both together when moving
 // to a new Passbolt release.
 const (
-       mariadbImage  = 
"mariadb:10.11@sha256:8acd4a5561e8897cfc8a99480f25bcecb10b726fa17b1ec7381c6ef36fa00a79"
-       passboltImage = 
"passbolt/passbolt:5.12.0-1-ce@sha256:f4344e1d45159494339ca7184c58e6b76067602e898bee72b53bfa093366c24b"
+       mariadbImage = 
"mariadb:10.11@sha256:8acd4a5561e8897cfc8a99480f25bcecb10b726fa17b1ec7381c6ef36fa00a79"
+
+       // defaultPassboltImage is what every normal run uses.
+       defaultPassboltImage = 
"passbolt/passbolt:5.14.3-1-ce@sha256:9f97ab2a854019737b4fc30a7fdb598f80a547769d4480a76e6f4b6d0bfbd431"
+
+       // PassboltImageEnv names the environment variable that overrides
+       // defaultPassboltImage, so the same suite can be replayed against 
several
+       // Passbolt releases (see scripts/test-matrix.sh). An override is
+       // deliberately tag-only: pinning a digest per version would mean 
tracking
+       // ~15 digests by hand. MariaDB stays pinned either way — it is not the
+       // variable under test.
+       PassboltImageEnv = "PASSBOLT_TEST_IMAGE"
 )
 
+// PassboltImage reports the Passbolt image the next Start will use: the
+// PASSBOLT_TEST_IMAGE override when set and non-blank, otherwise the pinned
+// default.
+func PassboltImage() string {
+       if img := strings.TrimSpace(os.Getenv(PassboltImageEnv)); img != "" {
+               return img
+       }
+       return defaultPassboltImage
+}
+
 // Credentials is everything a test needs to authenticate as a Passbolt user.
 type Credentials struct {
        UserID     string
@@ -114,7 +135,7 @@
 
        pbReq := testcontainers.GenericContainerRequest{
                ContainerRequest: testcontainers.ContainerRequest{
-                       Image:        passboltImage,
+                       Image:        PassboltImage(),
                        Networks:     []string{net.Name},
                        ExposedPorts: []string{"80/tcp"},
                        Env: map[string]string{
@@ -339,12 +360,18 @@
 
        // "passphrase must be Empty for Server Keys" per the SDK's
        // MetadataPrivateKeyData comments.
+       //
+       // Signed must be set: api.Time always marshals (omitempty doesn't 
apply to struct
+       // fields), so leaving it zero-value sends "0001-01-01T00:00:00Z". The 
Go SDK never
+       // validates this field, so that goes unnoticed here, but the browser 
extension's
+       // MetadataPrivateKeyDataEntity does validate it and rejects the record 
outright.
        payload, err := json.Marshal(api.MetadataPrivateKeyData{
                ObjectType:  "PASSBOLT_METADATA_PRIVATE_KEY",
                Domain:      p.BaseURL,
                Fingerprint: fingerprint,
                ArmoredKey:  privateArmored,
                Passphrase:  "",
+               Signed:      api.Time{Time: time.Now()},
        })
        if err != nil {
                return fmt.Errorf("marshal metadata private key data: %w", err)
@@ -379,8 +406,8 @@
 // metadata key's PGP user-id, which Passbolt validates loosely.
 func stripScheme(url string) string {
        for _, sep := range []string{"://"} {
-               if i := strings.Index(url, sep); i >= 0 {
-                       return url[i+len(sep):]
+               if _, after, ok := strings.Cut(url, sep); ok {
+                       return after
                }
        }
        return url
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/internal/util/client.go 
new/go-passbolt-cli-0.5.2/internal/util/client.go
--- old/go-passbolt-cli-0.5.1/internal/util/client.go   2026-07-02 
11:02:51.000000000 +0200
+++ new/go-passbolt-cli-0.5.2/internal/util/client.go   2026-08-28 
16:52:04.000000000 +0200
@@ -131,7 +131,7 @@
                        if challenge.Provider.TOTP == "" {
                                return http.Cookie{}, fmt.Errorf("server 
Provided no TOTP Provider")
                        }
-                       for i := 0; i < 3; i++ {
+                       for range 3 {
                                var code string
                                code, err := ReadPassword("Enter TOTP:")
                                if err != nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/go-passbolt-cli-0.5.1/renovate.json 
new/go-passbolt-cli-0.5.2/renovate.json
--- old/go-passbolt-cli-0.5.1/renovate.json     1970-01-01 01:00:00.000000000 
+0100
+++ new/go-passbolt-cli-0.5.2/renovate.json     2026-08-28 16:52:04.000000000 
+0200
@@ -0,0 +1,6 @@
+{
+  "$schema": "https://docs.renovatebot.com/renovate-schema.json";,
+  "extends": [
+    "local>passbolt/passbolt-ops/renovate"
+  ]
+}
\ No newline at end of file

++++++ vendor.tar.gz ++++++
++++ 83446 lines of diff (skipped)

Reply via email to