Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package jfrog-cli for openSUSE:Factory 
checked in at 2026-07-17 01:41:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/jfrog-cli (Old)
 and      /work/SRC/openSUSE:Factory/.jfrog-cli.new.24530 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "jfrog-cli"

Fri Jul 17 01:41:05 2026 rev:47 rq:1366053 version:2.115.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/jfrog-cli/jfrog-cli.changes      2026-07-09 
22:21:01.509486386 +0200
+++ /work/SRC/openSUSE:Factory/.jfrog-cli.new.24530/jfrog-cli.changes   
2026-07-17 01:42:55.452137091 +0200
@@ -1,0 +2,17 @@
+Thu Jul 16 05:23:11 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- Update to version 2.115.0 (2.114.0 does not exist):
+  * New Features
+    - [build-info-go] add ci env check for buid info duration
+      capture #397 (@reshmifrog)
+    - [jfrog-cli] Add OpenAPI spec embed for jf api operation
+      discovery #3595 (@ehl-jf)
+  * Bug Fixes
+    - [build-info-go] RTECO-1401 Fix/Publish Build Info with Build
+      Duration #395 (@reshmifrog)
+    - [jfrog-cli] fix build info build duration issue #3575
+      (@reshmifrog)
+    - [jfrog-cli-artifactory] Updating oras.land/oras-go/v2 version
+      to 2.6.2 #507 (@naveenku-jfrog)
+
+-------------------------------------------------------------------

Old:
----
  jfrog-cli-2.113.0.obscpio

New:
----
  jfrog-cli-2.115.0.obscpio

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

Other differences:
------------------
++++++ jfrog-cli.spec ++++++
--- /var/tmp/diff_new_pack.QHX8Zw/_old  2026-07-17 01:42:56.540173824 +0200
+++ /var/tmp/diff_new_pack.QHX8Zw/_new  2026-07-17 01:42:56.544173959 +0200
@@ -19,7 +19,7 @@
 %define executable_name jf
 
 Name:           jfrog-cli
-Version:        2.113.0
+Version:        2.115.0
 Release:        0
 Summary:        A client that automates access to the JFrog products
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.QHX8Zw/_old  2026-07-17 01:42:56.580175174 +0200
+++ /var/tmp/diff_new_pack.QHX8Zw/_new  2026-07-17 01:42:56.584175310 +0200
@@ -4,7 +4,7 @@
     <param name="scm">git</param>
     <param name="submodules">disable</param>
     <param name="exclude">.git</param>
-    <param name="revision">refs/tags/v2.113.0</param>
+    <param name="revision">refs/tags/v2.115.0</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.QHX8Zw/_old  2026-07-17 01:42:56.612176255 +0200
+++ /var/tmp/diff_new_pack.QHX8Zw/_new  2026-07-17 01:42:56.616176390 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/jfrog/jfrog-cli.git</param>
-              <param 
name="changesrevision">9cd75bda20ff5fe8f9a7dd8f68e58a8c11dc44e5</param></service></servicedata>
+              <param 
name="changesrevision">c338314207387d39d2fd94f8985da7f9f71cba6d</param></service></servicedata>
 (No newline at EOF)
 

++++++ jfrog-cli-2.113.0.obscpio -> jfrog-cli-2.115.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/Makefile 
new/jfrog-cli-2.115.0/Makefile
--- old/jfrog-cli-2.113.0/Makefile      2026-07-08 13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/Makefile      2026-07-15 16:07:43.000000000 +0200
@@ -17,6 +17,8 @@
        @echo "  clean                    - Clean build artifacts"
        @echo "  test                     - Run tests"
        @echo "  build                    - Build the project"
+       @echo "  stub                     - Build jf with the OSS-default stub 
OpenAPI spec bundle"
+       @echo "  full                     - Build jf with the full OpenAPI spec 
bundle (requires docs/api-spec/full/ to be populated)"
 
 # Update all JFrog dependencies
 update-all: update-build-info-go update-client-go update-gofrog update-core 
update-artifactory update-platform-services update-security update-apptrust 
update-evidence
@@ -94,3 +96,12 @@
 build:
        @echo "Building project..."
        @go build ./...
+
+# Build jf with the OSS-default stub OpenAPI spec bundle (docs/api-spec/stub/)
+stub:
+       @./build/build.sh jf
+
+# Build jf with the full OpenAPI spec bundle (docs/api-spec/full/) — used by
+# JFrog's internal release pipeline after it populates docs/api-spec/full/
+full:
+       @JF_BUILD_TAGS=full ./build/build.sh jf
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/build/build.sh 
new/jfrog-cli-2.115.0/build/build.sh
--- old/jfrog-cli-2.113.0/build/build.sh        2026-07-08 13:49:01.000000000 
+0200
+++ new/jfrog-cli-2.115.0/build/build.sh        2026-07-15 16:07:43.000000000 
+0200
@@ -8,5 +8,5 @@
        exe_name="$1"
 fi
 
-CGO_ENABLED=0 go build -o "$exe_name" -ldflags '-w -extldflags "-static"' 
main.go
+CGO_ENABLED=0 go build -o "$exe_name" -tags "${JF_BUILD_TAGS:-}" -ldflags '-w 
-extldflags "-static"' main.go
 echo "The $exe_name executable was successfully created."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/build/docker/full/Dockerfile 
new/jfrog-cli-2.115.0/build/docker/full/Dockerfile
--- old/jfrog-cli-2.113.0/build/docker/full/Dockerfile  2026-07-08 
13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/build/docker/full/Dockerfile  2026-07-15 
16:07:43.000000000 +0200
@@ -1,6 +1,6 @@
 ARG repo_name_21
 # Remove ${repo_name_21} to pull from Docker Hub.
-FROM ${repo_name_21}/jfrog-docker/golang:1.26.3 as builder
+FROM ${repo_name_21}/jfrog-docker/golang:1.26.5 as builder
 ARG image_name=jfrog-cli-full
 ARG cli_executable_name
 WORKDIR /${image_name}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/build/docker/slim/Dockerfile 
new/jfrog-cli-2.115.0/build/docker/slim/Dockerfile
--- old/jfrog-cli-2.113.0/build/docker/slim/Dockerfile  2026-07-08 
13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/build/docker/slim/Dockerfile  2026-07-15 
16:07:43.000000000 +0200
@@ -1,6 +1,6 @@
 ARG repo_name_21
 # Remove ${repo_name_21} to pull from Docker Hub.
-FROM ${repo_name_21}/jfrog-docker/golang:1.26.3-alpine as builder
+FROM ${repo_name_21}/jfrog-docker/golang:1.26.5-alpine as builder
 ARG image_name=jfrog-cli
 ARG cli_executable_name
 WORKDIR /${image_name}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/build/npm/v2/package-lock.json 
new/jfrog-cli-2.115.0/build/npm/v2/package-lock.json
--- old/jfrog-cli-2.113.0/build/npm/v2/package-lock.json        2026-07-08 
13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/build/npm/v2/package-lock.json        2026-07-15 
16:07:43.000000000 +0200
@@ -1,5 +1,5 @@
 {
   "name": "jfrog-cli-v2",
-  "version": "2.113.0",
+  "version": "2.115.0",
   "lockfileVersion": 2
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/build/npm/v2/package.json 
new/jfrog-cli-2.115.0/build/npm/v2/package.json
--- old/jfrog-cli-2.113.0/build/npm/v2/package.json     2026-07-08 
13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/build/npm/v2/package.json     2026-07-15 
16:07:43.000000000 +0200
@@ -1,6 +1,6 @@
 {
   "name": "jfrog-cli-v2",
-  "version": "2.113.0",
+  "version": "2.115.0",
   "description": "🐸 Command-line interface for JFrog Artifactory, Xray, 
Distribution, Pipelines and Mission Control 🐸",
   "homepage": "https://github.com/jfrog/jfrog-cli";,
   "preferGlobal": true,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/build/npm/v2-jf/package-lock.json 
new/jfrog-cli-2.115.0/build/npm/v2-jf/package-lock.json
--- old/jfrog-cli-2.113.0/build/npm/v2-jf/package-lock.json     2026-07-08 
13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/build/npm/v2-jf/package-lock.json     2026-07-15 
16:07:43.000000000 +0200
@@ -1,5 +1,5 @@
 {
   "name": "jfrog-cli-v2-jf",
-  "version": "2.113.0",
+  "version": "2.115.0",
   "lockfileVersion": 1
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/build/npm/v2-jf/package.json 
new/jfrog-cli-2.115.0/build/npm/v2-jf/package.json
--- old/jfrog-cli-2.113.0/build/npm/v2-jf/package.json  2026-07-08 
13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/build/npm/v2-jf/package.json  2026-07-15 
16:07:43.000000000 +0200
@@ -1,6 +1,6 @@
 {
   "name": "jfrog-cli-v2-jf",
-  "version": "2.113.0",
+  "version": "2.115.0",
   "description": "🐸 Command-line interface for JFrog Artifactory, Xray, 
Distribution, Pipelines and Mission Control 🐸",
   "homepage": "https://github.com/jfrog/jfrog-cli";,
   "preferGlobal": true,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/buildinfo_test.go 
new/jfrog-cli-2.115.0/buildinfo_test.go
--- old/jfrog-cli-2.113.0/buildinfo_test.go     2026-07-08 13:49:01.000000000 
+0200
+++ new/jfrog-cli-2.115.0/buildinfo_test.go     2026-07-15 16:07:43.000000000 
+0200
@@ -9,6 +9,7 @@
        "strconv"
        "strings"
        "testing"
+       "time"
 
        "github.com/jfrog/jfrog-cli-artifactory/artifactory/formats"
        clientTestUtils "github.com/jfrog/jfrog-client-go/utils/tests"
@@ -661,6 +662,37 @@
 
        // Cleanup
        inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, 
tests.RtBuildName1, artHttpDetails)
+       cleanArtifactoryTest()
+}
+
+func TestArtifactoryBuildPublishRecordsDuration(t *testing.T) {
+       initArtifactoryTest(t, "")
+       // Use a unique build number to avoid clashing with other tests that 
reuse RtBuildName1.
+       buildNumber := strconv.FormatInt(time.Now().Unix(), 10)
+       inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, 
tests.RtBuildName1, artHttpDetails)
+
+       // First build command - records the build's start time.
+       uploadFiles(t, "upload", "--build-name="+tests.RtBuildName1, 
"--build-number="+buildNumber)
+       // Collect environment, mirroring the reported scenario (upload -> bce 
-> bp).
+       assert.NoError(t, artifactoryCli.WithoutCredentials().Exec("bce", 
tests.RtBuildName1, buildNumber))
+       runRt(t, "bp", tests.RtBuildName1, buildNumber)
+
+       publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, 
tests.RtBuildName1, buildNumber)
+       if err != nil {
+               assert.NoError(t, err)
+               return
+       }
+       if !found {
+               assert.True(t, found, "build info was expected to be found")
+               return
+       }
+       buildInfo := publishedBuildInfo.BuildInfo
+
+       assert.NotEmpty(t, buildInfo.Started, "build info should have a 
'started' timestamp")
+       assert.Greater(t, buildInfo.DurationMillis, int64(0), "build duration 
should not be published as 0")
+
+       // Cleanup
+       inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, 
tests.RtBuildName1, artHttpDetails)
        cleanArtifactoryTest()
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/docs/api-spec/embed_full.go 
new/jfrog-cli-2.115.0/docs/api-spec/embed_full.go
--- old/jfrog-cli-2.113.0/docs/api-spec/embed_full.go   1970-01-01 
01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/embed_full.go   2026-07-15 
16:07:43.000000000 +0200
@@ -0,0 +1,24 @@
+//go:build full
+
+package apispec
+
+import (
+       "embed"
+       "strings"
+)
+
+//go:embed full/*.yaml full/VERSION
+var specFS embed.FS
+
+const rootDir = "full"
+
+// Bundle identifies which OpenAPI spec set is embedded in this binary.
+const Bundle = "full"
+
+func specVersion() string {
+       data, err := specFS.ReadFile(rootDir + "/VERSION")
+       if err != nil {
+               return ""
+       }
+       return strings.TrimSpace(string(data))
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/docs/api-spec/embed_stub.go 
new/jfrog-cli-2.115.0/docs/api-spec/embed_stub.go
--- old/jfrog-cli-2.113.0/docs/api-spec/embed_stub.go   1970-01-01 
01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/embed_stub.go   2026-07-15 
16:07:43.000000000 +0200
@@ -0,0 +1,17 @@
+//go:build !full
+
+package apispec
+
+import "embed"
+
+//go:embed stub/*.yaml
+var specFS embed.FS
+
+const rootDir = "stub"
+
+// Bundle identifies which OpenAPI spec set is embedded in this binary.
+const Bundle = "stub"
+
+func specVersion() string {
+       return ""
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jfrog-cli-2.113.0/docs/api-spec/full/.placeholder.yaml 
new/jfrog-cli-2.115.0/docs/api-spec/full/.placeholder.yaml
--- old/jfrog-cli-2.113.0/docs/api-spec/full/.placeholder.yaml  1970-01-01 
01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/full/.placeholder.yaml  2026-07-15 
16:07:43.000000000 +0200
@@ -0,0 +1,7 @@
+# Placeholder so `-tags full` compiles in an OSS checkout before JFrog's 
internal
+# release job populates this directory with the real rdme-admin reference 
bundle.
+# A go:embed glob errors at compile time if it matches zero files, so this
+# dot-prefixed, zero-operation file keeps full/*.yaml satisfied without being
+# picked up by directory-style embeds (which exclude dot-prefixed names).
+openapi: 3.1.0
+paths: {}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/docs/api-spec/parser.go 
new/jfrog-cli-2.115.0/docs/api-spec/parser.go
--- old/jfrog-cli-2.113.0/docs/api-spec/parser.go       1970-01-01 
01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/parser.go       2026-07-15 
16:07:43.000000000 +0200
@@ -0,0 +1,146 @@
+// Package apispec exposes the operations declared in jfrog-cli's embedded
+// OpenAPI spec bundle (a small "stub" set by default, or the real "full" set
+// in JFrog's internal release build — see docs/api-spec/).
+package apispec
+
+import (
+       "fmt"
+       "sort"
+       "strings"
+       "sync"
+
+       "gopkg.in/yaml.v3"
+)
+
+var httpMethods = map[string]bool{
+       "get": true, "put": true, "post": true, "delete": true,
+       "options": true, "head": true, "patch": true, "trace": true,
+}
+
+// Parameter describes a single OpenAPI operation parameter.
+type Parameter struct {
+       Name        string `yaml:"name"`
+       In          string `yaml:"in"`
+       Required    bool   `yaml:"required"`
+       Description string `yaml:"description"`
+}
+
+// Operation describes a single OpenAPI path+method operation.
+type Operation struct {
+       Method      string
+       Path        string
+       Summary     string
+       Tags        []string
+       OperationId string
+       Parameters  []Parameter
+}
+
+// Metadata describes which spec bundle is embedded in this binary.
+type Metadata struct {
+       SpecBundle  string
+       SpecVersion string
+}
+
+type rawDoc struct {
+       Paths map[string]map[string]yaml.Node `yaml:"paths"`
+}
+
+type rawOperation struct {
+       Summary     string      `yaml:"summary"`
+       OperationId string      `yaml:"operationId"`
+       Tags        []string    `yaml:"tags"`
+       Parameters  []Parameter `yaml:"parameters"`
+}
+
+var (
+       once       sync.Once
+       operations []Operation
+       parseErr   error
+)
+
+// Operations returns every operation across the embedded OpenAPI spec bundle.
+// Parsing happens once per process and the result is cached.
+func Operations() ([]Operation, error) {
+       once.Do(func() {
+               operations, parseErr = parseAll()
+       })
+       return operations, parseErr
+}
+
+// Info reports which spec bundle is embedded and, for full builds, the
+// rdme-admin commit it was fetched from.
+func Info() Metadata {
+       return Metadata{
+               SpecBundle:  Bundle,
+               SpecVersion: specVersion(),
+       }
+}
+
+// isSpecFile reports whether name is a top-level OpenAPI YAML file that should
+// be parsed. Excludes rdme-admin's per-endpoint _order.yaml nav files and any
+// dotfile (including this package's own full/.placeholder.yaml).
+func isSpecFile(name string) bool {
+       return strings.HasSuffix(name, ".yaml") && !strings.HasPrefix(name, 
".") && !strings.HasPrefix(name, "_")
+}
+
+func parseAll() ([]Operation, error) {
+       entries, err := specFS.ReadDir(rootDir)
+       if err != nil {
+               return nil, fmt.Errorf("apispec: reading %s: %w", rootDir, err)
+       }
+
+       var ops []Operation
+       for _, entry := range entries {
+               if entry.IsDir() || !isSpecFile(entry.Name()) {
+                       continue
+               }
+               fileOps, err := parseFile(rootDir + "/" + entry.Name())
+               if err != nil {
+                       return nil, fmt.Errorf("apispec: parsing %s: %w", 
entry.Name(), err)
+               }
+               ops = append(ops, fileOps...)
+       }
+
+       sort.Slice(ops, func(i, j int) bool {
+               if ops[i].Path != ops[j].Path {
+                       return ops[i].Path < ops[j].Path
+               }
+               return ops[i].Method < ops[j].Method
+       })
+       return ops, nil
+}
+
+func parseFile(name string) ([]Operation, error) {
+       data, err := specFS.ReadFile(name)
+       if err != nil {
+               return nil, err
+       }
+
+       var doc rawDoc
+       if err := yaml.Unmarshal(data, &doc); err != nil {
+               return nil, err
+       }
+
+       var ops []Operation
+       for p, methods := range doc.Paths {
+               for method, node := range methods {
+                       lower := strings.ToLower(method)
+                       if !httpMethods[lower] {
+                               continue
+                       }
+                       var op rawOperation
+                       if err := node.Decode(&op); err != nil {
+                               return nil, fmt.Errorf("path %s method %s: %w", 
p, method, err)
+                       }
+                       ops = append(ops, Operation{
+                               Method:      strings.ToUpper(method),
+                               Path:        p,
+                               Summary:     op.Summary,
+                               Tags:        op.Tags,
+                               OperationId: op.OperationId,
+                               Parameters:  op.Parameters,
+                       })
+               }
+       }
+       return ops, nil
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/docs/api-spec/parser_test.go 
new/jfrog-cli-2.115.0/docs/api-spec/parser_test.go
--- old/jfrog-cli-2.113.0/docs/api-spec/parser_test.go  1970-01-01 
01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/parser_test.go  2026-07-15 
16:07:43.000000000 +0200
@@ -0,0 +1,97 @@
+//go:build !full
+
+// These tests assert exact values from the stub fixtures and don't apply to a
+// full build (whose docs/api-spec/full/ content is populated at release time).
+
+package apispec
+
+import (
+       "testing"
+
+       "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
+)
+
+func TestOperations_Stub(t *testing.T) {
+       ops, err := Operations()
+       require.NoError(t, err)
+       require.Len(t, ops, 10, "expected exactly the 10 trimmed real 
operations across the 7 stub files")
+
+       byOperationId := make(map[string]Operation, len(ops))
+       for _, op := range ops {
+               byOperationId[op.OperationId] = op
+       }
+
+       getUserList, ok := byOperationId["getUserList"]
+       require.True(t, ok, "getUserList should be present")
+       assert.Equal(t, "GET", getUserList.Method)
+       assert.Equal(t, "/access/api/v2/users", getUserList.Path)
+       assert.Equal(t, "Get User List", getUserList.Summary)
+       assert.Equal(t, []string{"Users"}, getUserList.Tags)
+       assert.Len(t, getUserList.Parameters, 10)
+
+       createUser, ok := byOperationId["createUser"]
+       require.True(t, ok, "createUser should be present")
+       assert.Equal(t, "POST", createUser.Method)
+       assert.Equal(t, "/access/api/v2/users", createUser.Path)
+
+       deleteWorker, ok := byOperationId["deleteWorker"]
+       require.True(t, ok, "deleteWorker should be present")
+       assert.Equal(t, "DELETE", deleteWorker.Method)
+       assert.Equal(t, "/worker/api/v1/workers/{workerKey}", deleteWorker.Path)
+       require.Len(t, deleteWorker.Parameters, 1)
+       assert.Equal(t, "workerKey", deleteWorker.Parameters[0].Name)
+       assert.Equal(t, "path", deleteWorker.Parameters[0].In)
+       assert.True(t, deleteWorker.Parameters[0].Required)
+
+       ping, ok := byOperationId["artifactoryPing"]
+       require.True(t, ok, "artifactoryPing should be present")
+       assert.Equal(t, []string{"Artifactory System"}, ping.Tags)
+       assert.Empty(t, ping.Parameters)
+}
+
+func TestOperations_SortedByPathThenMethod(t *testing.T) {
+       ops, err := Operations()
+       require.NoError(t, err)
+
+       for i := 1; i < len(ops); i++ {
+               prev, cur := ops[i-1], ops[i]
+               if prev.Path == cur.Path {
+                       assert.LessOrEqual(t, prev.Method, cur.Method, "same 
path %q should be sorted by method", prev.Path)
+                       continue
+               }
+               assert.Less(t, prev.Path, cur.Path, "operations should be 
sorted by path")
+       }
+}
+
+func TestOperations_CachedAcrossCalls(t *testing.T) {
+       first, err := Operations()
+       require.NoError(t, err)
+       second, err := Operations()
+       require.NoError(t, err)
+       assert.Same(t, &first[0], &second[0], "Operations should return the 
same cached backing array on repeat calls")
+}
+
+func TestInfo_Stub(t *testing.T) {
+       info := Info()
+       assert.Equal(t, "stub", info.SpecBundle)
+       assert.Empty(t, info.SpecVersion, "stub builds have no rdme-admin 
version")
+}
+
+func TestIsSpecFile(t *testing.T) {
+       tests := []struct {
+               name string
+               want bool
+       }{
+               {"users-api.yaml", true},
+               {"artifactory-security_openapi.yaml", true},
+               {"_order.yaml", false},
+               {".placeholder.yaml", false},
+               {"VERSION", false},
+               {"ReadMe.md", false},
+               {"notes.txt", false},
+       }
+       for _, tt := range tests {
+               assert.Equal(t, tt.want, isSpecFile(tt.name), "isSpecFile(%q)", 
tt.name)
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jfrog-cli-2.113.0/docs/api-spec/stub/access-tokens-api.yaml 
new/jfrog-cli-2.115.0/docs/api-spec/stub/access-tokens-api.yaml
--- old/jfrog-cli-2.113.0/docs/api-spec/stub/access-tokens-api.yaml     
1970-01-01 01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/stub/access-tokens-api.yaml     
2026-07-15 16:07:43.000000000 +0200
@@ -0,0 +1,106 @@
+# Trimmed excerpt of JFrog's public Platform Access Tokens API reference, kept 
as
+# an OSS test fixture for the jfrog-cli apispec package (JGC-525). Not the full
+# spec — see docs/api-spec/full/ (populated only in JFrog's internal release
+# build).
+openapi: 3.1.0
+info:
+  title: JFrog Platform - Access Tokens API
+  description: >
+    Manage access tokens for the JFrog Platform, including creating, 
refreshing,
+    listing, and revoking tokens.
+
+
+    **Authentication:** Access Tokens as bearer token in authorization header
+    (`Authorization: Bearer <token>`). Basic authentication is also supported
+    for the Create Token API when enabled in the platform configuration.
+
+
+    **Security:** Security requirements vary per operation. See individual
+    operation descriptions for details.
+  version: 1.0.0
+  contact:
+    name: JFrog Support
+servers:
+  - url: https://{jfrog_url}
+tags:
+  - name: Access Tokens
+    description: >-
+      Create, retrieve, refresh, and revoke access tokens for JFrog Platform
+      services.
+security:
+  - BearerAuth: []
+paths:
+  /access/api/v1/tokens:
+    get:
+      tags:
+        - Access Tokens
+      summary: Get Tokens
+      description: >
+        Returns token information based on the authenticated principal and
+        optional filters. Admin users can view all tokens; non-admin users can
+        only view their own tokens.
+
+
+        Reference tokens are supported from Artifactory version 7.133.8.
+
+
+        **Security:** Requires a valid token.
+      operationId: getTokens
+      responses:
+        '200':
+          description: Success
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/TokenListResponse'
+        '401':
+          description: Bad Credentials - Invalid credentials
+        '403':
+          description: Permission Denied - Insufficient permissions
+components:
+  securitySchemes:
+    BasicAuth:
+      type: http
+      scheme: basic
+      description: Basic authentication using username and password
+    BearerAuth:
+      type: http
+      scheme: bearer
+      description: Access Token as bearer token
+  schemas:
+    TokenDetails:
+      type: object
+      properties:
+        token_id:
+          type: string
+        subject:
+          type: string
+        expiry:
+          type: integer
+        issued_at:
+          type: integer
+        issuer:
+          type: string
+        description:
+          type: string
+        refreshable:
+          type: boolean
+        scope:
+          type: string
+        last_used:
+          type: integer
+          description: >
+            The Unix timestamp (in seconds) of when the token was last used.
+            Supported from Artifactory version 7.108.3 and above. Requires
+            `access_token_last_used_enabled: True` and
+            `access_token_last_used_threshold: 900` system properties to be
+            configured.
+    TokenListResponse:
+      type: object
+      properties:
+        tokens:
+          type: array
+          items:
+            $ref: '#/components/schemas/TokenDetails'
+x-readme:
+  explorer-enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jfrog-cli-2.113.0/docs/api-spec/stub/artifactory-system-api.yaml 
new/jfrog-cli-2.115.0/docs/api-spec/stub/artifactory-system-api.yaml
--- old/jfrog-cli-2.113.0/docs/api-spec/stub/artifactory-system-api.yaml        
1970-01-01 01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/stub/artifactory-system-api.yaml        
2026-07-15 16:07:43.000000000 +0200
@@ -0,0 +1,119 @@
+# Trimmed excerpt of JFrog's public Platform Artifactory System API reference,
+# kept as an OSS test fixture for the jfrog-cli apispec package (JGC-525). Not 
the
+# full spec — see docs/api-spec/full/ (populated only in JFrog's internal 
release
+# build).
+openapi: 3.1.0
+info:
+  title: JFrog Platform - Artifactory System API
+  description: >
+    Artifactory system configuration APIs for the JFrog Platform.
+
+
+    **Authentication:**
+
+    - Basic authentication using username and password
+
+    - Access Tokens instead of password for basic authentication
+
+    - Access Tokens as bearer token in authorization header (Authorization:
+    Bearer <token>)
+  version: 1.0.0
+  contact:
+    name: JFrog Support
+servers:
+  - url: https://{jfrog_url}
+    description: JFrog Platform
+    variables:
+      jfrog_url:
+        default: myserver.jfrog.io
+        description: Your JFrog Platform hostname (e.g., mycompany.jfrog.io)
+tags:
+  - name: Artifactory System
+    description: Artifactory system configuration APIs.
+security:
+  - BearerAuth: []
+paths:
+  /artifactory/api/system/ping:
+    get:
+      tags:
+        - Artifactory System
+      summary: Artifactory Ping
+      description: |
+        Get a simple status response about the state of Artifactory.
+
+        **Since:** 2.3.0
+
+        **Security:** Requires a valid user (can be anonymous).
+      operationId: artifactoryPing
+      security: []
+      responses:
+        '200':
+          description: Artifactory is alive and working properly
+          content:
+            text/plain:
+              schema:
+                type: string
+                example: OK
+        '500':
+          description: Internal Server Error
+  /artifactory/api/system/version:
+    get:
+      tags:
+        - Artifactory System
+      summary: Get Artifactory Version
+      description: >
+        Return information about the current Artifactory version, revision, and
+        currently installed Add-ons.
+
+
+        **Since:** 2.2.2
+
+
+        **Security:** Requires a valid user (can be anonymous).
+      operationId: getArtifactoryVersion
+      security: []
+      responses:
+        '200':
+          description: Artifactory version, revision, and list of installed 
add-ons
+          content:
+            application/json:
+              schema:
+                type: object
+                properties:
+                  version:
+                    type: string
+                    description: Artifactory version
+                  revision:
+                    type: string
+                    description: Revision number
+                  addons:
+                    type: array
+                    items:
+                      type: string
+                    description: List of addons
+            application/vnd.org.jfrog.artifactory.system.Version+json:
+              schema:
+                type: object
+                properties:
+                  version:
+                    type: string
+                  revision:
+                    type: string
+                  addons:
+                    type: array
+                    items:
+                      type: string
+        '401':
+          description: Bad Credentials - Invalid credentials
+components:
+  securitySchemes:
+    BasicAuth:
+      type: http
+      scheme: basic
+      description: Basic authentication using username and password
+    BearerAuth:
+      type: http
+      scheme: bearer
+      description: Access Token as bearer token
+x-readme:
+  explorer-enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jfrog-cli-2.113.0/docs/api-spec/stub/global-roles-api.yaml 
new/jfrog-cli-2.115.0/docs/api-spec/stub/global-roles-api.yaml
--- old/jfrog-cli-2.113.0/docs/api-spec/stub/global-roles-api.yaml      
1970-01-01 01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/stub/global-roles-api.yaml      
2026-07-15 16:07:43.000000000 +0200
@@ -0,0 +1,96 @@
+# Trimmed excerpt of JFrog's public Platform Global Roles API reference, kept 
as
+# an OSS test fixture for the jfrog-cli apispec package (JGC-525). Not the full
+# spec — see docs/api-spec/full/ (populated only in JFrog's internal release
+# build).
+openapi: 3.1.0
+info:
+  title: JFrog Platform - Global Roles API
+  description: >
+    Custom global role management APIs for the JFrog Platform.
+
+
+    **Authentication:** Access Tokens as bearer token in authorization header
+    (Authorization: Bearer `<token>`)
+
+
+    **Security:** Unless otherwise specified, all APIs require admin 
privileges.
+  version: 1.0.0
+  contact:
+    name: JFrog Support
+servers:
+  - url: https://{jfrog_url}
+tags:
+  - name: Global Roles
+    description: >-
+      APIs for creating, editing, deleting, and listing global roles in the
+      JFrog Platform.
+security:
+  - BearerAuth: []
+paths:
+  /access/api/v1/roles:
+    get:
+      tags:
+        - Global Roles
+      summary: Get All Global Roles
+      description: |
+        Get all global roles. The response includes predefined roles and custom
+        global roles.
+
+
+        **Security:** Requires admin or Project Admin privileges.
+      operationId: getAllGlobalRoles
+      responses:
+        '200':
+          description: Success
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/GlobalRole'
+        '401':
+          description: Bad Credentials - Invalid credentials
+        '403':
+          description: Permission Denied - Insufficient permissions
+components:
+  securitySchemes:
+    BearerAuth:
+      type: http
+      scheme: bearer
+      description: Access Token as bearer token
+  schemas:
+    GlobalRoleType:
+      type: string
+      description: >-
+        Type for roles returned by this API. ADMIN is the Project Admin role;
+        PREDEFINED is other built-in roles (e.g. Viewer); CUSTOM_GLOBAL is a
+        user-defined global role. On PUT, the value must match the role's
+        current type (the server rejects type changes).
+      enum:
+        - ADMIN
+        - PREDEFINED
+        - CUSTOM_GLOBAL
+    GlobalRole:
+      type: object
+      properties:
+        name:
+          type: string
+          description: Role name
+        description:
+          type: string
+          description: Role description
+        type:
+          $ref: '#/components/schemas/GlobalRoleType'
+        environments:
+          type: array
+          items:
+            type: string
+        actions:
+          type: array
+          description: >-
+            Permission actions as enum constant names (e.g. READ_REPOSITORY,
+            MANAGE_MEMBERS).
+          items:
+            type: string
+x-readme:
+  explorer-enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/docs/api-spec/stub/groups-api.yaml 
new/jfrog-cli-2.115.0/docs/api-spec/stub/groups-api.yaml
--- old/jfrog-cli-2.113.0/docs/api-spec/stub/groups-api.yaml    1970-01-01 
01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/stub/groups-api.yaml    2026-07-15 
16:07:43.000000000 +0200
@@ -0,0 +1,102 @@
+# Trimmed excerpt of JFrog's public Platform Groups API reference, kept as an
+# OSS test fixture for the jfrog-cli apispec package (JGC-525). Not the full 
spec —
+# see docs/api-spec/full/ (populated only in JFrog's internal release build).
+openapi: 3.1.0
+info:
+  title: JFrog Platform - Groups API
+  description: >
+    Group management APIs for the JFrog Platform.
+
+
+    **Authentication:** Access Tokens as bearer token in authorization header
+    (Authorization: Bearer <token>)
+
+
+    **Security:** Unless otherwise specified, all APIs require admin 
privileges.
+
+
+    **Availability:** Artifactory 7.49.3+
+  version: 1.0.0
+  contact:
+    name: JFrog Support
+servers:
+  - url: https://{jfrog_url}
+tags:
+  - name: Groups
+    description: >-
+      APIs for creating, updating, deleting, and managing JFrog Platform groups
+      and group memberships.
+security:
+  - BearerAuth: []
+paths:
+  /access/api/v2/groups/{name}:
+    get:
+      tags:
+        - Groups
+      summary: Get Group Details
+      description: |
+        Returns the group's details based on the group name.
+
+
+        **Security:** Requires admin privileges.
+      operationId: getGroupDetails
+      parameters:
+        - name: name
+          in: path
+          required: true
+          schema:
+            type: string
+          description: The group name
+      responses:
+        '200':
+          description: Success
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/GroupDetails'
+        '400':
+          description: Bad Request - Invalid input
+        '401':
+          description: Bad Credentials - Invalid credentials
+        '403':
+          description: Permission Denied - Insufficient permissions
+        '404':
+          description: Not Found - Group not found
+components:
+  securitySchemes:
+    BearerAuth:
+      type: http
+      scheme: bearer
+      description: Access Token as bearer token
+  schemas:
+    GroupDetails:
+      type: object
+      properties:
+        name:
+          type: string
+          description: The group name
+        description:
+          type: string
+          description: Group description
+        auto_join:
+          type: boolean
+          description: Whether new users auto-join this group
+        admin_privileges:
+          type: boolean
+          description: Whether group has admin privileges
+        realm:
+          type: string
+          description: The authentication realm
+        realm_attributes:
+          type: string
+          description: Realm attributes
+        external_id:
+          type: string
+          description: External ID for SCIM
+        members:
+          type: array
+          items:
+            type: string
+          description: Group members
+x-readme:
+  explorer-enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jfrog-cli-2.113.0/docs/api-spec/stub/permissions-api.yaml 
new/jfrog-cli-2.115.0/docs/api-spec/stub/permissions-api.yaml
--- old/jfrog-cli-2.113.0/docs/api-spec/stub/permissions-api.yaml       
1970-01-01 01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/stub/permissions-api.yaml       
2026-07-15 16:07:43.000000000 +0200
@@ -0,0 +1,104 @@
+# Trimmed excerpt of JFrog's public Platform Permissions API reference, kept 
as an
+# OSS test fixture for the jfrog-cli apispec package (JGC-525). Not the full 
spec —
+# see docs/api-spec/full/ (populated only in JFrog's internal release build).
+openapi: 3.1.0
+info:
+  title: JFrog Platform - Permissions API
+  description: >
+    Permission management APIs for the JFrog Platform.
+
+
+    **Authentication:** Access Tokens as bearer token in authorization header
+    (Authorization: Bearer <token>)
+
+
+    **Security:** Unless otherwise specified, all APIs require admin 
privileges.
+
+
+    **Availability:** Artifactory 7.72.0+
+  version: 1.0.0
+  contact:
+    name: JFrog Support
+servers:
+  - url: https://{jfrog_url}
+tags:
+  - name: Permissions
+    description: >-
+      APIs for creating, updating, deleting, and managing JFrog Platform
+      permission targets and resources.
+security:
+  - BearerAuth: []
+paths:
+  /access/api/v2/permissions:
+    get:
+      tags:
+        - Permissions
+      summary: Get Permissions
+      description: >
+        Get the list of all permissions in the system.
+
+
+
+        **Note:** You can use `cursor` and `limit` attributes independently or
+        together to refine the results. Enter a permission name in `cursor` to
+        list permissions starting from that name. Enter an integer in `limit` 
to
+        define the number of results, between 1 and 99,999 (non-inclusive).
+
+
+
+        **Security:** Requires admin privileges, or a scoped token with
+        `system:permissions:r`.
+
+
+
+        **Availability:** Artifactory 7.72.0+
+      operationId: getPermissions
+      parameters:
+        - name: cursor
+          in: query
+          schema:
+            type: string
+          description: Permission name to start listing from
+        - name: limit
+          in: query
+          schema:
+            type: integer
+            minimum: 1
+            maximum: 99999
+          description: Number of results (between 1 and 99,999, non-inclusive)
+      responses:
+        '200':
+          description: Success
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/PermissionListResponse'
+        '400':
+          description: Bad Request - Invalid input
+        '401':
+          description: Bad Credentials - Invalid credentials
+        '403':
+          description: Permission Denied - Insufficient permissions
+components:
+  securitySchemes:
+    BearerAuth:
+      type: http
+      scheme: bearer
+      description: Access Token as bearer token
+  schemas:
+    PermissionListResponse:
+      type: object
+      properties:
+        permissions:
+          type: array
+          items:
+            type: object
+            properties:
+              name:
+                type: string
+              uri:
+                type: string
+        cursor:
+          type: string
+x-readme:
+  explorer-enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/docs/api-spec/stub/users-api.yaml 
new/jfrog-cli-2.115.0/docs/api-spec/stub/users-api.yaml
--- old/jfrog-cli-2.113.0/docs/api-spec/stub/users-api.yaml     1970-01-01 
01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/stub/users-api.yaml     2026-07-15 
16:07:43.000000000 +0200
@@ -0,0 +1,270 @@
+# Trimmed excerpt of JFrog's public Platform Users API reference, kept as an
+# OSS test fixture for the jfrog-cli apispec package (JGC-525). Not the full 
spec —
+# see docs/api-spec/full/ (populated only in JFrog's internal release build).
+openapi: 3.1.0
+info:
+  title: JFrog Platform - Users API
+  description: >
+    User management APIs for the JFrog Platform.
+
+    **Authentication:** Access Tokens as bearer token in authorization header
+    (Authorization: Bearer <token>)
+
+    **Security:** Unless otherwise specified, all APIs require admin 
privileges.
+
+    **Availability:** Artifactory 7.49.3+
+  version: 1.0.0
+  contact:
+    name: JFrog Support
+servers:
+  - url: https://{jfrog_url}
+tags:
+  - name: Users
+    description: >-
+      APIs for creating, updating, deleting, and managing JFrog Platform users,
+      groups, and passwords.
+security:
+  - BearerAuth: []
+paths:
+  /access/api/v2/users:
+    get:
+      tags:
+        - Users
+      summary: Get User List
+      description: >
+        Returns the list of users.
+
+
+        **Security:** Requires admin privileges, or a scoped token with
+        `system:identities:r`.
+      operationId: getUserList
+      parameters:
+        - name: status
+          in: query
+          schema:
+            type: string
+            enum:
+              - invited
+              - enabled
+              - disabled
+              - locked
+          description: Filter users by status
+        - name: limit
+          in: query
+          schema:
+            type: integer
+            minimum: 1
+            default: 1000
+          description: Number of results to return (minimum 1, default 1000)
+        - name: username
+          in: query
+          schema:
+            type: string
+          description: Filter by username (contains)
+        - name: onlyAdmins
+          in: query
+          schema:
+            type: boolean
+          description: >-
+            Filter to only admin users. Cannot be used with resourceName.
+            Available from Artifactory 7.117.x.
+        - name: cursor
+          in: query
+          schema:
+            type: string
+          description: Pagination cursor - shows results after this cursor
+        - name: role
+          in: query
+          schema:
+            type: string
+          description: >-
+            Filter users by role. When filtering by role, onlyAdmins and
+            username parameters are ignored. Available from Artifactory 
7.117.x.
+        - name: resourceType
+          in: query
+          schema:
+            type: string
+          description: >-
+            Filter by resource type. Required when filtering by repository 
role.
+            Available from Artifactory 7.117.x.
+        - name: resourceName
+          in: query
+          schema:
+            type: string
+          description: >-
+            Filter by repository name. Cannot be used with onlyAdmins. 
Available
+            from Artifactory 7.117.x.
+        - name: projectKey
+          in: query
+          schema:
+            type: string
+          description: >-
+            Filter by project key. Refines search within a specific project
+            context.
+        - name: descendingOrder
+          in: query
+          schema:
+            type: boolean
+          description: Sort results in descending order
+      responses:
+        '200':
+          description: Success
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/UserListResponse'
+        '400':
+          description: Bad Request - Invalid input, object invalid
+        '401':
+          description: Bad Credentials - Invalid credentials
+        '403':
+          description: Permission Denied - Insufficient permissions
+    post:
+      tags:
+        - Users
+      summary: Create User
+      description: >
+        Creates a new Access user.
+
+
+
+        **Note:**
+
+        - When `internal_password_disabled=true`, the 'password' field is not
+        mandatory.
+
+        - The parameter `realm` will be `internal`
+
+
+
+        **Security:** Requires admin privileges.
+      operationId: createUser
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              $ref: '#/components/schemas/UserCreateRequest'
+      responses:
+        '201':
+          description: User created successfully
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/UserDetails'
+        '400':
+          description: Bad Request - Invalid input, object invalid
+        '401':
+          description: Bad Credentials - Invalid credentials
+        '403':
+          description: Permission Denied - Insufficient permissions
+        '409':
+          description: Conflict - User already exists
+components:
+  securitySchemes:
+    BearerAuth:
+      type: http
+      scheme: bearer
+      description: Access Token as bearer token
+  schemas:
+    UserDetails:
+      type: object
+      properties:
+        username:
+          type: string
+          description: The username
+        email:
+          type: string
+          description: The user's email address
+        admin:
+          type: boolean
+          description: Whether the user is an admin
+        effective_admin:
+          type: boolean
+          description: Whether the user is effectively an admin (based on 
groups).
+        profile_updatable:
+          type: boolean
+          description: Whether the user can update their profile
+        disable_ui_access:
+          type: boolean
+          description: Whether UI access is disabled for this user
+        internal_password_disabled:
+          type: boolean
+          description: Whether internal password is disabled
+        last_logged_in:
+          type: string
+          format: date-time
+          description: Last login timestamp
+        realm:
+          type: string
+          description: The authentication realm
+        groups:
+          type: array
+          items:
+            type: string
+          description: Groups the user belongs to
+        status:
+          type: string
+          enum:
+            - invited
+            - enabled
+            - disabled
+            - locked
+          description: User status
+    UserCreateRequest:
+      type: object
+      required:
+        - username
+        - email
+      properties:
+        username:
+          type: string
+          description: The username (required)
+        password:
+          type: string
+          description: The password (not required if 
internal_password_disabled=true)
+        email:
+          type: string
+          description: The user's email address
+        groups:
+          type: array
+          items:
+            type: string
+          description: Groups to add the user to
+        admin:
+          type: boolean
+          default: false
+          description: Whether the user is an admin
+        profile_updatable:
+          type: boolean
+          default: true
+          description: Whether the user can update their profile
+        internal_password_disabled:
+          type: boolean
+          default: false
+          description: Whether internal password is disabled
+        disable_ui_access:
+          type: boolean
+          default: false
+          description: Whether UI access is disabled
+    UserListResponse:
+      type: object
+      properties:
+        users:
+          type: array
+          items:
+            type: object
+            properties:
+              username:
+                type: string
+              uri:
+                type: string
+              realm:
+                type: string
+              status:
+                type: string
+        cursor:
+          type: string
+          description: Pagination cursor
+x-readme:
+  explorer-enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/jfrog-cli-2.113.0/docs/api-spec/stub/workers-api.yaml 
new/jfrog-cli-2.115.0/docs/api-spec/stub/workers-api.yaml
--- old/jfrog-cli-2.113.0/docs/api-spec/stub/workers-api.yaml   1970-01-01 
01:00:00.000000000 +0100
+++ new/jfrog-cli-2.115.0/docs/api-spec/stub/workers-api.yaml   2026-07-15 
16:07:43.000000000 +0200
@@ -0,0 +1,108 @@
+# Trimmed excerpt of JFrog's public Platform Workers API reference, kept as an
+# OSS test fixture for the jfrog-cli apispec package (JGC-525). Not the full 
spec —
+# see docs/api-spec/full/ (populated only in JFrog's internal release build).
+openapi: 3.1.0
+info:
+  title: JFrog Platform - Workers API
+  description: >
+    Worker service management APIs for the JFrog Platform.
+
+
+    **Authentication:** Access Tokens as bearer token in authorization header
+    (Authorization: Bearer `<token>`)
+
+
+    **Security:** Unless otherwise specified, all APIs require Platform Admin
+    privileges.
+  version: 1.0.0
+  contact:
+    name: JFrog Support
+servers:
+  - url: https://{jfrog_url}
+tags:
+  - name: Workers
+    description: Manage worker services, actions, and executions on the JFrog 
Platform.
+security:
+  - BearerAuth: []
+paths:
+  /worker/api/v1/workers:
+    get:
+      tags:
+        - Workers
+      summary: Get Workers
+      description: |
+        Returns a list of all workers.
+
+
+        **Security:** Requires Platform Admin privileges.
+      operationId: getWorkers
+      responses:
+        '200':
+          description: Success
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: '#/components/schemas/Worker'
+        '401':
+          description: Bad Credentials - Invalid credentials
+        '403':
+          description: Permission Denied - Insufficient permissions
+  /worker/api/v1/workers/{workerKey}:
+    delete:
+      tags:
+        - Workers
+      summary: Delete Worker
+      description: |
+        Deletes a worker.
+
+
+        **Security:** Requires Platform Admin privileges.
+      operationId: deleteWorker
+      parameters:
+        - name: workerKey
+          in: path
+          required: true
+          schema:
+            type: string
+          description: The worker key
+      responses:
+        '204':
+          description: Worker deleted
+        '401':
+          description: Bad Credentials - Invalid credentials
+        '403':
+          description: Permission Denied - Insufficient permissions
+        '404':
+          description: Not Found - Worker not found
+components:
+  securitySchemes:
+    BearerAuth:
+      type: http
+      scheme: bearer
+      description: Access Token as bearer token
+  schemas:
+    Worker:
+      type: object
+      properties:
+        key:
+          type: string
+          description: Worker key
+        description:
+          type: string
+          description: Worker description
+        enabled:
+          type: boolean
+          description: Whether the worker is enabled
+        sourceCode:
+          type: string
+          description: Worker source code (TypeScript/JavaScript)
+        action:
+          type: string
+          description: Worker action
+        filterCriteria:
+          type: object
+          description: Filter criteria for the worker
+x-readme:
+  explorer-enabled: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/go.mod new/jfrog-cli-2.115.0/go.mod
--- old/jfrog-cli-2.113.0/go.mod        2026-07-08 13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/go.mod        2026-07-15 16:07:43.000000000 +0200
@@ -1,6 +1,6 @@
 module github.com/jfrog/jfrog-cli
 
-go 1.26.3
+go 1.26.5
 
 replace (
        // Should not be updated to 0.11.0+ due to default spec version change 
(1.6 -> 1.7, https://github.com/CycloneDX/cyclonedx-go/pull/257)
@@ -18,10 +18,10 @@
        github.com/buger/jsonparser v1.2.0
        github.com/gocarina/gocsv v0.0.0-20260607070740-0735908c6461
        github.com/jfrog/archiver/v3 v3.6.3
-       github.com/jfrog/build-info-go v1.13.1-0.20260615080618-42488b58c305
+       github.com/jfrog/build-info-go v1.13.1-0.20260713073853-4f3044bf0940
        github.com/jfrog/gofrog v1.7.6
-       github.com/jfrog/jfrog-cli-application 
v1.0.2-0.20260707110954-b31a04f5ce6c
-       github.com/jfrog/jfrog-cli-artifactory 
v0.8.1-0.20260708065639-7c53c506fbcf
+       github.com/jfrog/jfrog-cli-application 
v1.0.2-0.20260713081138-6df6041db819
+       github.com/jfrog/jfrog-cli-artifactory 
v0.8.1-0.20260714082320-4fd5a71b4b4a
        github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260624085155-5ba797de2616
        github.com/jfrog/jfrog-cli-evidence v0.9.5-0.20260618135203-4d2bdd4ee35f
        github.com/jfrog/jfrog-cli-platform-services 
v1.10.1-0.20260618062042-6053ab368cab
@@ -224,7 +224,7 @@
        golang.org/x/mod v0.36.0 // indirect
        golang.org/x/net v0.56.0 // indirect
        golang.org/x/oauth2 v0.36.0 // indirect
-       golang.org/x/sync v0.21.0 // indirect
+       golang.org/x/sync v0.22.0 // indirect
        golang.org/x/sys v0.46.0 // indirect
        golang.org/x/term v0.44.0 // indirect
        golang.org/x/text v0.38.0 // indirect
@@ -238,11 +238,11 @@
        helm.sh/helm/v3 v3.21.0 // indirect
        k8s.io/client-go v0.36.1 // indirect
        k8s.io/klog/v2 v2.140.0 // indirect
-       oras.land/oras-go/v2 v2.6.0 // indirect
+       oras.land/oras-go/v2 v2.6.2 // indirect
        sigs.k8s.io/yaml v1.6.0 // indirect
 )
 
-// replace github.com/jfrog/jfrog-cli-artifactory => 
github.com/jfrog/jfrog-cli-artifactory main
+// replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go 
v1.13.1-0.20260713063709-f88851cfbd4f
 
 //replace github.com/gfleury/go-bitbucket-v1 => 
github.com/gfleury/go-bitbucket-v1 v0.0.0-20230825095122-9bc1711434ab
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/go.sum new/jfrog-cli-2.115.0/go.sum
--- old/jfrog-cli-2.113.0/go.sum        2026-07-08 13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/go.sum        2026-07-15 16:07:43.000000000 +0200
@@ -394,8 +394,8 @@
 github.com/jellydator/ttlcache/v3 v3.4.0/go.mod 
h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4=
 github.com/jfrog/archiver/v3 v3.6.3 
h1:hkAmPjBw393tPmQ07JknLNWFNZjXdy2xFEnOW9wwOxI=
 github.com/jfrog/archiver/v3 v3.6.3/go.mod 
h1:5V9l+Fte30Y4qe9dUOAd3yNTf8lmtVNuhKNrvI8PMhg=
-github.com/jfrog/build-info-go v1.13.1-0.20260615080618-42488b58c305 
h1:q7/hTPm6ibQf45CztScTgPb8cAmKIeQ9im0ClISsq7Y=
-github.com/jfrog/build-info-go v1.13.1-0.20260615080618-42488b58c305/go.mod 
h1:CYRUCvLKfyARjoJXLWAxce1qNUxTEtbRKAARkV42vpE=
+github.com/jfrog/build-info-go v1.13.1-0.20260713073853-4f3044bf0940 
h1:LthrPDN8YjDKrDNzOWS/w9NLFyeebdnWkmp8vhma0qo=
+github.com/jfrog/build-info-go v1.13.1-0.20260713073853-4f3044bf0940/go.mod 
h1:CYRUCvLKfyARjoJXLWAxce1qNUxTEtbRKAARkV42vpE=
 github.com/jfrog/froggit-go v1.23.0 
h1:HGNIP9ZqoXKXHQONazhCENqIrFLfc8J3aX/F0QelQ2s=
 github.com/jfrog/froggit-go v1.23.0/go.mod 
h1:wRDryqyp3oe+eHgME2mpnEQmO8XBECIPagFwj0nHmdI=
 github.com/jfrog/go-mockhttp v0.3.1 
h1:/wac8v4GMZx62viZmv4wazB5GNKs+GxawuS1u3maJH8=
@@ -404,10 +404,10 @@
 github.com/jfrog/gofrog v1.7.6/go.mod 
h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4=
 github.com/jfrog/jfrog-apps-config v1.0.1 
h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYLipdsOFMY=
 github.com/jfrog/jfrog-apps-config v1.0.1/go.mod 
h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w=
-github.com/jfrog/jfrog-cli-application v1.0.2-0.20260707110954-b31a04f5ce6c 
h1:5LZKsRZpwXolMxYwC9f82swfF7UcXQMUZcnZIl4y+Zw=
-github.com/jfrog/jfrog-cli-application 
v1.0.2-0.20260707110954-b31a04f5ce6c/go.mod 
h1:p8yLtbmCxxQucIbLZKnWu0F+EDtj6NLXbRQCEK/nb6o=
-github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260708065639-7c53c506fbcf 
h1:bj+nN5obLG+O/52ATMT1JzVNBqskeOwliVjEijayPv0=
-github.com/jfrog/jfrog-cli-artifactory 
v0.8.1-0.20260708065639-7c53c506fbcf/go.mod 
h1:VqV0Bed11HoBlugAEGa3RumbwnDVslEf0gKocTzLs9s=
+github.com/jfrog/jfrog-cli-application v1.0.2-0.20260713081138-6df6041db819 
h1:nbhpYN6Sb+oPJWpEHAaNbnwJJ5R2/g/TDnpCKjC/mRA=
+github.com/jfrog/jfrog-cli-application 
v1.0.2-0.20260713081138-6df6041db819/go.mod 
h1:p8yLtbmCxxQucIbLZKnWu0F+EDtj6NLXbRQCEK/nb6o=
+github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260714082320-4fd5a71b4b4a 
h1:dySEIu0wXHrPr3P1ZdXeMhcriWHJrr1N43oPLEi8QhQ=
+github.com/jfrog/jfrog-cli-artifactory 
v0.8.1-0.20260714082320-4fd5a71b4b4a/go.mod 
h1:BJ8x7NhWxJvhG5Bjca2GwWlZN2bxlo+8AnpuRnZ9RMM=
 github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260624085155-5ba797de2616 
h1:bioFXGzf3pF2qnC3LZD1S1saWiHSekL4vdsDSWksj/4=
 github.com/jfrog/jfrog-cli-core/v2 
v2.60.1-0.20260624085155-5ba797de2616/go.mod 
h1:9R90mhbczGXwW5EGlDs7F08ejQU/xdoDhYHMvzBiqgE=
 github.com/jfrog/jfrog-cli-evidence v0.9.5-0.20260618135203-4d2bdd4ee35f 
h1:MV4BATdkEoUYJmdPDvaB9EBb8JQZg28n/K4X7dcmyAY=
@@ -788,8 +788,8 @@
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
-golang.org/x/sync v0.21.0/go.mod 
h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=
+golang.org/x/sync v0.22.0/go.mod 
h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
 golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -885,8 +885,8 @@
 k8s.io/client-go v0.36.1/go.mod h1:s6rAnCtTGYDQnpNjEhSaISV+2O8jwruZ6m3QOYBFbtU=
 k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc=
 k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0=
-oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc=
-oras.land/oras-go/v2 v2.6.0/go.mod 
h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o=
+oras.land/oras-go/v2 v2.6.2 h1:N04RXngAp1LJKTG6ifz3xHPipasEkWr+hFmInja5YKo=
+oras.land/oras-go/v2 v2.6.2/go.mod 
h1:PlTtg4JTDJkDe8yVHpM2wz7/YDc00GVas+i4jAW2TZ4=
 pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=
 pgregory.net/rapid v1.2.0/go.mod 
h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
 sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/jfrog-cli-2.113.0/utils/cliutils/cli_consts.go 
new/jfrog-cli-2.115.0/utils/cliutils/cli_consts.go
--- old/jfrog-cli-2.113.0/utils/cliutils/cli_consts.go  2026-07-08 
13:49:01.000000000 +0200
+++ new/jfrog-cli-2.115.0/utils/cliutils/cli_consts.go  2026-07-15 
16:07:43.000000000 +0200
@@ -4,7 +4,7 @@
 
 const (
        // General CLI constants
-       CliVersion  = "2.113.0"
+       CliVersion  = "2.115.0"
        ClientAgent = "jfrog-cli-go"
 
        // CLI base commands constants:

++++++ jfrog-cli.obsinfo ++++++
--- /var/tmp/diff_new_pack.QHX8Zw/_old  2026-07-17 01:42:58.544241483 +0200
+++ /var/tmp/diff_new_pack.QHX8Zw/_new  2026-07-17 01:42:58.552241753 +0200
@@ -1,5 +1,5 @@
 name: jfrog-cli
-version: 2.113.0
-mtime: 1783511341
-commit: 9cd75bda20ff5fe8f9a7dd8f68e58a8c11dc44e5
+version: 2.115.0
+mtime: 1784124463
+commit: c338314207387d39d2fd94f8985da7f9f71cba6d
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/jfrog-cli/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.jfrog-cli.new.24530/vendor.tar.gz differ: char 26, 
line 1

Reply via email to