From 57b472aa115b50680fa3a0375ca3c5ad038a8e92 Mon Sep 17 00:00:00 2001 From: Alex Kantor Date: Fri, 11 Sep 2026 20:18:13 +0100 Subject: [PATCH 1/8] feat(sbom): add kosli attest sbom Reports a software bill of materials as its own attestation type, using the reader added in #1165. The file is uploaded as it is, so the checksum recorded against it is the checksum of the file the customer supplied and they can verify it by hand. That is why only one file is allowed: the CLI tars and gzips two or more attachments, which would compress the SBOM and break that checksum. --sbom-file and --attachments are mutually exclusive for the same reason. Size is checked before the file is read. The reader loads the whole file in one go, so checking afterwards would pull a large file into memory before the friendlier error could be produced. The ceiling leaves room under the API's 10MB request limit, because the JSON payload is counted alongside the file. The format and the file checksum are recorded twice on purpose: inside attestation_data, where the server's schema can enforce them, and as annotations, which is where a reader sees them on the trail page. Both come from the same read of the same file, so they cannot disagree. A caller passing either annotation key gets an error rather than having their value silently replaced. The URL slug is the attestation family rather than the type. The server tells system types apart by type_name in the body. --- cmd/kosli/attest.go | 1 + cmd/kosli/attestSbom.go | 260 +++++++++++++ cmd/kosli/attestSbom_test.go | 115 ++++++ cmd/kosli/root.go | 1 + cmd/kosli/testdata/sbom/compressed.json.gz | Bin 0 -> 7931 bytes cmd/kosli/testdata/sbom/cyclonedx.json | 199 ++++++++++ cmd/kosli/testdata/sbom/not-an-sbom.json | 1 + cmd/kosli/testdata/sbom/spdx.json | 408 +++++++++++++++++++++ 8 files changed, 985 insertions(+) create mode 100644 cmd/kosli/attestSbom.go create mode 100644 cmd/kosli/attestSbom_test.go create mode 100644 cmd/kosli/testdata/sbom/compressed.json.gz create mode 100644 cmd/kosli/testdata/sbom/cyclonedx.json create mode 100644 cmd/kosli/testdata/sbom/not-an-sbom.json create mode 100644 cmd/kosli/testdata/sbom/spdx.json diff --git a/cmd/kosli/attest.go b/cmd/kosli/attest.go index 1632455bf..90af8ba9f 100644 --- a/cmd/kosli/attest.go +++ b/cmd/kosli/attest.go @@ -25,6 +25,7 @@ func newAttestCmd(out io.Writer) *cobra.Command { newAttestPRCmd(out), newAttestSonarCmd(out), newAttestCustomCmd(out), + newAttestSbomCmd(out), newAttestOverrideCmd(out), newAttestDecisionCmd(out), ) diff --git a/cmd/kosli/attestSbom.go b/cmd/kosli/attestSbom.go new file mode 100644 index 000000000..2352e41dc --- /dev/null +++ b/cmd/kosli/attestSbom.go @@ -0,0 +1,260 @@ +package main + +import ( + "fmt" + "io" + "net/http" + "net/url" + "os" + + "github.com/kosli-dev/cli/internal/digest" + "github.com/kosli-dev/cli/internal/requests" + "github.com/kosli-dev/cli/internal/sbom" + "github.com/spf13/cobra" +) + +// The API rejects a request body over 10MB, and the JSON payload is counted +// alongside the file, so this leaves room for it rather than sitting on the +// limit. Lifting the ceiling needs direct-to-S3 upload, tracked separately. +const maxSbomFileBytes = 9 * 1024 * 1024 + +// Both are also carried inside attestation_data, where the server's schema can +// enforce them. These are the copy a reader sees on the trail page. +const ( + sbomFormatAnnotation = "sbom_format" + sbomSha256Annotation = "sbom_sha256" +) + +type SbomAttestationData struct { + Format string `json:"format"` + OriginalFingerprint string `json:"original_fingerprint"` + Document *sbom.Document `json:"document"` +} + +type SbomAttestationPayload struct { + *CommonAttestationPayload + TypeName string `json:"type_name"` + AttestationData SbomAttestationData `json:"attestation_data"` +} + +type attestSbomOptions struct { + *CommonAttestationOptions + sbomFilePath string + payload SbomAttestationPayload +} + +const attestSbomShortDesc = `Report a software bill of materials to an artifact or a trail in a Kosli flow. ` + +const attestSbomLongDesc = attestSbomShortDesc + ` +The SBOM file is given with the ^--sbom-file^ flag. CycloneDX (JSON and XML) and +SPDX (JSON and tag-value) are supported. + +The file is uploaded as it is, so the recorded checksum is the checksum of the +file you supplied and you can verify it by hand. It must be a single file: it is +not compressed, and an already-compressed file is rejected, because the format +and the summary below are read from it. + +Kosli reads the format, the creation time, the tools that produced it, the +subject it describes and how many packages it lists. Nothing is checked against +the artifact; the SBOM is recorded as reported. + +The format and the file checksum are also added as the ^sbom_format^ and +^sbom_sha256^ annotations. +` + attestationBindingDesc + ` + +` + kosliIgnoreDesc + ` + +` + commitDescription + +const attestSbomExample = ` +# report an SBOM about a pre-built docker artifact (kosli finds the fingerprint): +kosli attest sbom yourDockerImageName \ + --artifact-type docker \ + --name yourAttestationName \ + --sbom-file yourSbomPath \ + --flow yourFlowName \ + --trail yourTrailName \ + --api-token yourAPIToken \ + --org yourOrgName + +# report an SBOM about a trail: +kosli attest sbom \ + --name yourAttestationName \ + --sbom-file yourSbomPath \ + --flow yourFlowName \ + --trail yourTrailName \ + --api-token yourAPIToken \ + --org yourOrgName +` + +func newAttestSbomCmd(out io.Writer) *cobra.Command { + o := &attestSbomOptions{ + CommonAttestationOptions: &CommonAttestationOptions{ + fingerprintOptions: &fingerprintOptions{}, + }, + payload: SbomAttestationPayload{ + CommonAttestationPayload: &CommonAttestationPayload{}, + }, + } + cmd := &cobra.Command{ + // Args: cobra.MaximumNArgs(1), // See CustomMaximumNArgs() below + Use: "sbom [IMAGE-NAME | FILE-PATH | DIR-PATH]", + Short: attestSbomShortDesc, + Long: attestSbomLongDesc, + Example: attestSbomExample, + Annotations: map[string]string{betaCLIAnnotation: ""}, + PreRunE: func(cmd *cobra.Command, args []string) error { + err := CustomMaximumNArgs(1, args) + if err != nil { + return err + } + + err = RequireGlobalFlags(global, []string{"Org", "ApiToken"}) + if err != nil { + return ErrorBeforePrintingUsage(cmd, err.Error()) + } + + err = MuXRequiredFlags(cmd, []string{"fingerprint", "artifact-type"}, false) + if err != nil { + return err + } + + // One file per SBOM attestation. Two or more attachments are tarred + // and gzipped before upload, which would compress the SBOM and break + // the checksum recorded against it. + err = MuXRequiredFlags(cmd, []string{"sbom-file", "attachments"}, false) + if err != nil { + return err + } + + err = ValidateSliceValues(o.redactedCommitInfo, allowedCommitRedactionValues) + if err != nil { + return fmt.Errorf("%s for --redact-commit-info", err.Error()) + } + + err = ValidateAttestationArtifactArg(args, o.fingerprintOptions.artifactType, o.payload.ArtifactFingerprint) + if err != nil { + return ErrorBeforePrintingUsage(cmd, err.Error()) + } + + return ValidateRegistryFlags(cmd, o.fingerprintOptions) + }, + + RunE: func(cmd *cobra.Command, args []string) error { + o.repoURLExplicit = cmd.Flags().Changed("repo-url") + o.repoNameExplicit = cmd.Flags().Changed("repository") + return o.run(args) + }, + } + + ci := WhichCI() + addAttestationFlags(cmd, o.CommonAttestationOptions, o.payload.CommonAttestationPayload, ci) + cmd.Flags().StringVar(&o.sbomFilePath, "sbom-file", "", attestationSbomFileFlag) + + err := RequireFlags(cmd, []string{"flow", "trail", "name", "sbom-file"}) + if err != nil { + logger.Error("failed to configure required flags: %v", err) + } + + return cmd +} + +func (o *attestSbomOptions) run(args []string) error { + // The slug is the attestation family, not the type. The server tells them + // apart by type_name in the body. + url, err := url.JoinPath(global.Host, "api/v2/attestations", global.Org, o.flowName, "trail", o.trailName, "system") + if err != nil { + return err + } + + err = o.CommonAttestationOptions.run(args, o.payload.CommonAttestationPayload) + if err != nil { + return err + } + + o.payload.TypeName = "sbom" + err = o.loadSbom() + if err != nil { + return err + } + o.attachments = append(o.attachments, o.sbomFilePath) + + form, cleanupNeeded, evidencePath, err := prepareAttestationForm(o.payload, o.attachments) + if err != nil { + return err + } + // if we created a tar package, remove it after uploading it + if cleanupNeeded { + defer func() { + if err := os.Remove(evidencePath); err != nil { + logger.Warn("failed to remove evidence file: %v", err) + } + }() + } + + reqParams := &requests.RequestParams{ + Method: http.MethodPost, + URL: url, + Form: form, + DryRun: global.DryRun, + Token: global.ApiToken, + } + _, err = kosliClient.Do(reqParams) + if err == nil && !global.DryRun { + logger.Info("sbom attestation '%s' is reported to trail: %s", o.payload.AttestationName, o.trailName) + } + return wrapAttestationError(err) +} + +// loadSbom checks the size before reading, because reading happens in one go +// and a large file would otherwise be pulled into memory before the friendlier +// error could be produced. +func (o *attestSbomOptions) loadSbom() error { + info, err := os.Stat(o.sbomFilePath) + if err != nil { + return fmt.Errorf("failed to read SBOM file [%s]: %s", o.sbomFilePath, err) + } + if info.Size() > maxSbomFileBytes { + return fmt.Errorf( + "SBOM file [%s] is %d bytes, above the %d byte limit for an SBOM attestation", + o.sbomFilePath, info.Size(), maxSbomFileBytes, + ) + } + + fingerprint, err := digest.FileSha256(o.sbomFilePath, logger) + if err != nil { + return fmt.Errorf("failed to fingerprint SBOM file [%s]: %s", o.sbomFilePath, err) + } + + data, err := sbom.ProcessSBOMFile(o.sbomFilePath) + if err != nil { + return fmt.Errorf("failed to parse SBOM file [%s]: %s", o.sbomFilePath, err) + } + + o.payload.AttestationData = SbomAttestationData{ + Format: data.Format, + OriginalFingerprint: fingerprint, + Document: data.Document, + } + return o.annotate(data.Format, fingerprint) +} + +// annotate refuses to overwrite a value the caller supplied, rather than +// silently replacing it: the two keys are derived from the file and a caller +// setting them is asking for something this command cannot honour. +func (o *attestSbomOptions) annotate(format, fingerprint string) error { + if o.payload.Annotations == nil { + o.payload.Annotations = map[string]string{} + } + for _, reserved := range []string{sbomFormatAnnotation, sbomSha256Annotation} { + if _, taken := o.payload.Annotations[reserved]; taken { + return fmt.Errorf( + "annotation key '%s' is set by this command from the SBOM file and cannot be provided with --annotate", + reserved, + ) + } + } + o.payload.Annotations[sbomFormatAnnotation] = format + o.payload.Annotations[sbomSha256Annotation] = fingerprint + return nil +} diff --git a/cmd/kosli/attestSbom_test.go b/cmd/kosli/attestSbom_test.go new file mode 100644 index 000000000..26095bf80 --- /dev/null +++ b/cmd/kosli/attestSbom_test.go @@ -0,0 +1,115 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/suite" +) + +type AttestSbomCommandTestSuite struct { + flowName string + trailName string + suite.Suite + defaultKosliArguments string +} + +func (suite *AttestSbomCommandTestSuite) SetupTest() { + suite.flowName = "attest-sbom" + suite.trailName = "test-123" + global = &GlobalOpts{ + ApiToken: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ImNkNzg4OTg5In0.e8i_lA_QrEhFncb05Xw6E_tkCHU9QfcY4OLTVUCHffY", + Org: "docs-cmd-test-user", + Host: "http://localhost:8001", + } + suite.defaultKosliArguments = fmt.Sprintf( + " --flow %s --trail %s --repo-root ../.. --host %s --org %s --api-token %s", + suite.flowName, suite.trailName, global.Host, global.Org, global.ApiToken, + ) + CreateFlowWithTemplate(suite.flowName, "testdata/valid_template.yml", suite.T()) + BeginTrail(suite.trailName, suite.flowName, "", suite.T()) +} + +// oversizeSbom writes a file past the size ceiling outside the repo, so a +// ten megabyte fixture is not committed. +func (suite *AttestSbomCommandTestSuite) oversizeSbom() (string, int64) { + path := filepath.Join(suite.T().TempDir(), "oversize.json") + padding := strings.Repeat("x", maxSbomFileBytes+1) + body := fmt.Sprintf( + `{"bomFormat":"CycloneDX","specVersion":"1.6","version":1,"pad":"%s"}`, padding, + ) + if err := os.WriteFile(path, []byte(body), 0644); err != nil { + suite.T().Fatal(err) + } + info, err := os.Stat(path) + if err != nil { + suite.T().Fatal(err) + } + return path, info.Size() +} + +func (suite *AttestSbomCommandTestSuite) TestAttestSbomCmd() { + tests := []cmdTestCase{ + { + name: "reports a CycloneDX SBOM against a trail", + cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/cyclonedx.json %s", suite.defaultKosliArguments), + golden: "sbom attestation 'cli' is reported to trail: test-123\n", + }, + { + name: "reports an SPDX SBOM against a trail", + cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/spdx.json %s", suite.defaultKosliArguments), + golden: "sbom attestation 'cli' is reported to trail: test-123\n", + }, + { + wantError: true, + name: "fails when --sbom-file is missing", + cmd: fmt.Sprintf("attest sbom --name cli %s", suite.defaultKosliArguments), + golden: "Error: required flag(s) \"sbom-file\" not set\n", + }, + { + wantError: true, + name: "fails when --attachments is used as well, because two attachments would be compressed", + cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/cyclonedx.json --attachments testdata/sbom/spdx.json %s", suite.defaultKosliArguments), + golden: "Error: only one of --sbom-file, --attachments is allowed\n", + }, + { + wantError: true, + name: "fails when the file is not an SBOM", + cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/not-an-sbom.json %s", suite.defaultKosliArguments), + golden: "Error: failed to parse SBOM file [testdata/sbom/not-an-sbom.json]: not a CycloneDX SBOM: bomFormat is \"\", expected \"CycloneDX\"\n", + }, + { + wantError: true, + name: "fails when the file is compressed, because the format is read from it", + cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/compressed.json.gz %s", suite.defaultKosliArguments), + golden: "Error: failed to parse SBOM file [testdata/sbom/compressed.json.gz]: the file is gzip compressed; supply the uncompressed SBOM\n", + }, + { + wantError: true, + name: "fails when a reserved annotation key is supplied", + cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/cyclonedx.json --annotate sbom_format=mine %s", suite.defaultKosliArguments), + golden: "Error: annotation key 'sbom_format' is set by this command from the SBOM file and cannot be provided with --annotate\n", + }, + } + runTestCmd(suite.T(), tests) +} + +func (suite *AttestSbomCommandTestSuite) TestAttestSbomRejectsAnOversizeFileBeforeUploading() { + path, size := suite.oversizeSbom() + + runTestCmd(suite.T(), []cmdTestCase{ + { + wantError: true, + name: "fails locally with the actual size rather than a bare 413 from the server", + cmd: fmt.Sprintf("attest sbom --name cli --sbom-file %s %s", path, suite.defaultKosliArguments), + golden: fmt.Sprintf("Error: SBOM file [%s] is %d bytes, above the %d byte limit for an SBOM attestation\n", path, size, maxSbomFileBytes), + }, + }) +} + +func TestAttestSbomCommandTestSuite(t *testing.T) { + suite.Run(t, new(AttestSbomCommandTestSuite)) +} diff --git a/cmd/kosli/root.go b/cmd/kosli/root.go index 9eda56102..706cd3fb2 100644 --- a/cmd/kosli/root.go +++ b/cmd/kosli/root.go @@ -292,6 +292,7 @@ Paths the list already matches stay excluded whatever is later added there, so k newComplianceStatusFlag = "The new compliance status to set on the attestation." originalAttestationTypeFlag = "The original attestation type being overridden (e.g. generic, snyk, junit, sonar, jira, pull_request, custom)." attestationDecisionControlFlag = "The control identifier being evaluated (e.g. RCTL-043)." + attestationSbomFileFlag = "The path to the SBOM file. CycloneDX (JSON, XML) and SPDX (JSON, tag-value) are supported." excludeScalingFlag = "[optional] Exclude scaling events for snapshots. Snapshots with scaling changes will not result in new environment records." includeScalingFlag = "[optional] Include scaling events for snapshots. Snapshots with scaling changes will result in new environment records." includedEnvironments = "[optional] Comma separated list of environments to include in logical environment" diff --git a/cmd/kosli/testdata/sbom/compressed.json.gz b/cmd/kosli/testdata/sbom/compressed.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..f4943e11cc330cdd7fa3814c074221c3ba7aec1b GIT binary patch literal 7931 zcmVGs1>E&Hmppa<6!Uj z&fbA9{so`mn|&AuyS)=9ID;Z7(xX&)l+~#s{SJRr{Z~o)U6N=tyn4HhcG=DFg}03p z*ve*)-~Jo__Dl9VyXleyIJ%Q0QRq2)T+nag1$s`}8OmM&SG1>|wVgEG_WsfhxN? zXu;K$nqI9|<*L6>oQmS=HQiBaa%~|!6vp`Tx1XL~(W;*=z^PRhHC3&unj`B@uyAGg z7-)K><^>B)_xxI=B6(F^Q-X!GkW^pNeZ5vuY8B7*VV$Lg37`J>rTpz5=|a#dkD(WQ zqVME=dklTD+2Zzc9eSX^AMeZ3_Q1lU8wH{2_WNY_`?qhw8SFF)zJk#e*Zzm_>CgM7 z1^0aA_kUnlxTZfw1?7a6d*>e-aOLt$K_kFld=Hna zy|9djAa+7j-NTMw^Yuj6{8Ln!aDB1@(7@~KlJux)+M}$hixAC;FLXezs6tMsVJj+%QFuDHkDL^6eZ)WdruM zK6nCN;X1pZS}Fc6z|iZnUUALS(vOXcr$k5hO$rB-%BdGNA~zl$?M`&CuTtpG$MMT_ z8TOv*zc$~_Q&+JiUuj?LS+urIO>*XAt=C=c-RERyncC)c(r-`0-qMZRdwVK{BXhX7 zCyj>JZR{L#xbizN7yK^H`(si$zr3}=-qSY!J{rC`9fQVj=f)21J6ZF-*}ut zaZ4ILuT@LwFU0wSj=Xa>1HBioB)|JqeYxmYztcY09oTbsaB$|s<4dex?2DdwO8q#P zuGQi7>G(439S3hu=ix-ZTFNSN&DJ644%fZ63a%4meLi^Cq~a-SactFBy@P)p99*@( zdAasZgXh-KY{`R}GThpxym~RCgQt#Hpp&Q-* z;W{=)_;h>)IlVUZySDne{Kr2YZgBO_0FyT9-)-{ZvD#vu=Qd=C~R*!A-FO%i`|U_sxqd;TeZmA*>3 zG}1^Hh3>oap2z-&lK8zQtUQsHQ8n{KhT5|%;^IcU@bhoP27Ztx!7XdKNN zxq2n2tJ-4WtF=YNtNOrw9lxS3DsH9jNQ(2frYlo&al%DKuRHa{Lh*e`ss)PfDH1Sr zEvUGX?C6dp*J_%lE*7d2IE$(-RRagefa_^BU3P2k-&%+!D) zTGgr4m4zS3j;82!y(R^fisEUiTvK#e)&sSs>vFwbas9=@aVrZ@QPr&lfh;dP&xdUU zf$vCFwc)tSWcC9DCfMvgvmk!OZSp`A z>)|PJyjAe12tLApzr%Gz$rSib5;ogiH$7_AkYa7!sMAq5b7|qst%a{#k zlbQYl*4CJ=N6T?5ni}nXe-s(?eRH|Rb(~+qM$0yBh~|;xnEJuHRKDjj=x1_)h}|7s=yk^^HwmKu-n%q_!Hkv=xq(Tg<1}Jd1tvHjMzDs9J;#VXmMwLRa@%Ed zAp2@I*1)_ZFOHCrl3cC%U}<-Z*fF&Teh-65V``g2KK9cY=l5b=ww2}b$E0zzfh{_n z=-TUykCqB75*WeDa+~X6oyrth#NEBTxoSg$HEf*jXz8jxFdJaHu!oEZciOVwSsme; zs%^r4H|uPC_&(}&hDWa(T^!Tj`pw4CSG35Zb+x4)t1Y43V1 z;{fbW3MRmml-0`ZoR+R>tXvv%w)9PnWaTOrpTGU)BeTB%%je7snPLz3`n2Ubg>}KT zUdXTML=otUuW@*U??6wdT@M*C%0$sXFZ#~y7%)y>16>~B-jx^A{A-jEGBy|VlIt`Z zXXz_o56yJ^bU&5lI7Y@uGC2A3{>fE`xDHW|ksU|C$V>Lp>}P8NJ(B*w9=6V8&1BF; zxf_=kvZ;P#sUy-M$UObLgL#jz#ueHotzneOhF`;M5bpyPegFmvEE(3`r1f2Wz>It^ zxW`q*Wr}vn*9W>lSuIO)-}u1TXCPnLe{+@Kx|yx@!6u^{8Zc4BWZ^J+w1jP@~F zet({w`gAR>Nk`pqSrh?F z%2tVYcYg&uuw8Wq41a~=g{G;?Uf4@|-Qm_U&oGu8Stj@{{AKcneRRQInavDr)5rg( zSwXgLd%nVbf?UXUPlzdi2Um_G8;~Weh1nnK%K>bdcA_`f$JH*bZwfNFSPHDMV}qYc zcm2le_F@09=NQLi*V$-~9eL%jHS7Va5|oie_NQH6a{mF@4tKuEWNd8=uxsrIx`qr` zPH3HIUtP$uH)9oILWKVZ8-HW|G)6pJLuMzFO@UuHqVHtap1ALVFU257+!x12Sl7;; z4-U=Dww}VN(*F;{NAL;2-TwYoCz_VY1Z=`L&kTn;Hu$N8@`3o%K42CvUKv#~QBF+JeeD;w<5n%gVKJg=n}*j0>QG3?c3_-4&VOY|Ag_nX@_)_AXDGJFG@l86JrcYdcX?lW8Wcd!ewDDW1bvI6r(BLmb%y zCK4_fzzrPEWe5+tK42zbVKGLa?MSe;#4=ClOA25W!-yu{3wF(Y+Pj>9JD^_mONJv1 z3)2{UgEKh}^drP6;D8W!PQ-_-3Ccp>F>FBn^%EQL3fJMYwUZwLhk|{wcmn*cLp+Sd zM%mlI{J<-7KZJO5gQ=(Gn8^rzO95HWQ5PV~R8PQDN4Y(5U1dB1)(vqpar4-B1^x%I zs2!sH*qiZ!GtF&=eRox7jznbH*L2mC5 zD=;39r4%DlJ0V}9xXJd-_msHBJs~He&%hH;!5rnVl2YCw*x`lZJ7G!nK138wAycPFhGkK$59l?*T0bFC7vdE{%=8^CDCgc>|{>oDJjK8YU z738tc^ApNR_8`}ltrYSRv^(In$n~scYTE*4r*Raojc@flWBP%-19HbJ=b>y}5c6QK zijcF-d0c{AbtH0FLAJO06XFr(2UidD<|BVr5c_1n#y!QTEHN$Qu{22#n{nX6W?0(S}ZqnOwd2saV7i+13^wVJV>-Ro?9X&5-&kM;Io|K(rcA+ z*jyK7T_JaZcyMoRjV;B!*off&5GRHakK2eTqE1m)nXC{8!1m8R@oSVX;uCPS4#i=- zUj=*LX1s;4ahJvd#DXs694sGt7G)~r9m^Ta!#Qf^j~JWW`9R?A<0Qjx#S-fUXbU30 zi;#yEWq_E7xsieUWqD9{Kv;*lSFh7r0^fpt84}7}@F|Q@JG+agW|(VgAWJz4I>5z& ztN1bd?gi$9{A7di9&B6#Jwv`H11Bspf@d)n)&cb9qP9O*7@|%%Y>4W$vEZ%C%%GBeXBf*Z<#6p0FcO9HmC!q~@h zLSA#EoDFkwTnFGM*b&4V;G4P4@cQD>j%}*7fqbtJXECOx|0a-A0!JI|I42bGmEsM| z6(ddxSRimppZHR0FM_?V*r_*hgag_p=cp7YZ6#FXMSAd&p0sH>b&KNcY#EBBrNY4Re3+p+3xuwWVx)Sko2b z2Fx85Yy;L}XMCg$oDfgYQ_h^$tgzN4a-CLQ8&La4PaW)muR_i(F-{G91=fi*DAE<> zncy>Sr>(*|6TgXd)HCoNpLhw^OTPDlY+HoTrep;C(~nw{RcY z6<`_S##3SZH$g8j=31~du!jxiPHDZ8@?eaeVB_L-`T0U_hpaZ8a%sX1p%zih4>Jyh za$svuc|sTED8m|Ht~_R}^4c!sf4GiGT4y{X?rl<@L_8boTjnUmSPAT7Vw)na6K~x>W}xL(l`RKS^Z?@`XIi*uQWtLH7fW zqW_D$&^2|iK|ABn$dB3jKCESAH4L%F!ew3X5m-Z%+M!J~dR@)9f@kV|v9 z$>=wblVaRsdr~nsq^^uNXWmHARz$sJxn({c{rw<@uGo3VIz68##IYZYUkkONRS4LC z`&+tmjTAeI2MCMAEx;%tPz9H z*qJP8{2IlJr>#&28zjAUbo3zyfw)6;4#=+(%ms5US*(HbIstOzyZLzWypiWQY!2~E zjOu?_#};!}`0m8{2KpWN?-=VYpd)5urLk9#r;3;axgXXN(I;39_`~&!dCyZ(_l3Nt zi*+Z=`!e~ba$ZAhpj;Dq2$LDbixihG#Ggub#cGOoee#ZOMoF&~#YH?#>oK^;7Un>& zMk{(APY}C|3d{-l{5fL$1TYGC8`>)7&?VWG&nH=anby@m#*NIzkk6*E-RAaFnj@{1 zN5t1+V+A-#^)k|Ve%?bhTk)(kt@ZNUQnJVoN@vgvn^5jNHm9;+GC*EQywA-1gXP8f z*gOYEP6qld*}z%}#10YXfPY!Iw(B;Jry#rOTAxj3 z!#2jEpv&>1kZFe7tj30eiLz_zto2NOBi=)kpI~?A?{* zljXA(+vf?m3-BS}0kM(hyjdOYV?9{+a0Bb_5MPO3Gut6P&|kk`ZinZTg1@^c1IRIu zqgwOE$p$=v_&sydIuLTSZV8ujjQKH@$NiBsOLa!vH?1++Y;0bmq`VMw`YWpgYr9}l ztOKyIxxF@dt$oAKiCZZLnjKP1x8`fAuhM5a`}dJ!N@7j8B%2&VbN~9V?us_fVsC+) z?C5-6(Kem}wlFH%4m+b6EZG^}7&{%;zA5GP@Z66jz+$P0g(Yw7bSz z>hJ8_DUSiXo*HNSyu%a4vqRrE{jjT5tLD-Lr~99*sR9 z9&mYz`G{dpH#K*$H;C&nJ3B1aIQV(&kk?Lt*IkA4l2Tr(VGYJ`A*Y7Cj{BEU@hHcM zB&r#yh`Te+Z~K6iFo#%w228j)`(fuyhtxjUIC;*>_03}Tob`g0>WO*Ix#66fpVQdI z+GTpiguWyLZ|6Nj|E(Gk#RKdI;WksW^~|2prV8Wc_|^jdW|+o17!sn8#F~0D)C#5+w>)VmR ze}=sFUteauMic6t5OBT$u}r4(8NV$u=J&j$;!!Wk3?fLKxWtE+W2z7m` z37bMcTA|*WmZywBJVE#w-&Nakw;{Y7;TG}J> zo>lsU3iViY&MUu=$AW*Ta4oNWkRPl4g!R&$3TGY}p0eB~+v9f@8>lvWzXpf(fh-P# zy+@c^-`F1Hz(=Yvgiqnf7%V5oAndjJjhPfp1E$&;$|srbAeOyhEMs$vn1lUJAJy(se_9@p0}DDNoxpYA zBN5hFHLS}L@4GZ2pK&6>hP3a~jq8}R(YZX;8P&cfo-GvmcDh)r9D$z*Jrb7&0BdmXLiQH>@sE?vAxHB)7$fU@~^yymGwyAnJCtQt`KXfpR?4bh**O?0BMf_adpH- z*6V@1cf5i)y5YSvypB%iJ)i^PBH%9(w`-JNUQ18=2=Dh0@w4ptD31p$j&R=8h8S|D z9_2!OEZ1e5tDoz)6!yWm^7%-(hUfZ{2SB~8=p(sqNd`N#IaqIkwHNd+&}sa^ zSx}D6qyvmqln-L>8TAdM@gMVH;L4e7asQm>tbr?F-$cf5egMB7nL|3GBmK648*T7B z40C#{hXYUHoE_I+!iKrip&b2Es?Fc@KK-qpBry-fz5q2n2h?Ni*)8{tSk&X}Q_T#1 z=lG2|4BHpj^BeD#zWRXMU{mNXS)9W2W$aakeDXm1DxS5ZeR^PPZ9%4e#H_3@3o+zH zA=hIxVDKiK;Z@vE8UqF@J|5%89FnXjXc5Uci__r<&~h58At zbRVMvCeqWej2E8x`5&GI$~@j;9TQ_ocDA_t=zJFQx|BN?`ze`REz!5c+`U`!vrf^^ zT+z?Cua4=tAHCCSkAV}(Q}9jTa*gMyq_uzx_Tk?tJLhRMX6;5BpARyhx629Wp7{^O z#k5bT!Jju0@f!7^k-c;a{V+J@3~Rc`q0<`TXpS~osG|{%2du`B_U>X0X@#<5y_+`Z z@qF}^0!DNOSSZY3xup10%K z0&oFcM!U5zKgC#%wMwyH8g&BsgoidY7slps1M6F!igk!~h4a$ulMQl^7gd+PS-w# z`8B=d2id(?zaTCnGykF50@qQNvtv9!onlVL-V`AEg;2+)H4E_*;uM_)VQeg)AqjrJ z@`ZCWz}mvw3oP#E{H+LCJ;uA}13Y7yM#J{Yw09WrF^s>%%YTATXHWT)4VTVvn#FpV zuqTvb`P#q8tN%xGY9W`dkbGu}5tV9yk?7lyi$<1$_C7!v9coH*qOAIYckk5Au##Gm)ip7KAPPG22*$oK2^efceYVEEfhuh|+-TKMGe*Zp}f zj``;&4;&|a_@8^)J_-DA`5qLXK7MdEUa;F2-;Yy%Zuyf(^|O_H_P{>B=;O!s`2~OV z@IJrn_7VP%UXk>Fb`#nE|HyB{8RPKgwM(Tv9@wMgwW?aL$Ti=s`kKB_y^1RPY9KF^ zs_c1HwI*v?wO;Z3`){er3^v-bck+DOZ@>Llhs<7Cbo2Cj>HTbS{ZW=bd_UVA5#I=3 ze8)u`{1erKj`s1(zyv|xd&kMmJDG0YRB`78Ai@G$?A02jw}9Mz8Q9%7f&BK_1)D$s zilUv|zAog(PD)F}H%TSi_x+crL2LZ+D?|#f!(w-Q@ER<-_S08k33C2>D|~%w{^g<& zWxsy#PPIEqzw>@AVcOeQY-K0_)^+phwcI{0H}-NA--U?qoV{O#H2B~LNwD#QjTZ)Y l-mvnw-mb!i+WpuR-#GK>%{Om-`Qw*A{}VG#Co$wv000S}45|PC literal 0 HcmV?d00001 diff --git a/cmd/kosli/testdata/sbom/cyclonedx.json b/cmd/kosli/testdata/sbom/cyclonedx.json new file mode 100644 index 000000000..b7ab41b97 --- /dev/null +++ b/cmd/kosli/testdata/sbom/cyclonedx.json @@ -0,0 +1,199 @@ +{ + "bomFormat": "CycloneDX", + "specVersion": "1.6", + "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", + "version": 1, + "metadata": { + "timestamp": "2020-04-13T20:20:39+00:00", + "tools": { + "components": [ + { + "type": "application", + "group": "Awesome Vendor", + "name": "Awesome Tool", + "version": "9.1.2", + "hashes": [ + { + "alg": "SHA-1", + "content": "25ed8e31b995bb927966616df2a42b979a2717f0" + }, + { + "alg": "SHA-256", + "content": "a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df" + } + ] + } + ], + "services": [ + { + "provider": { + "name": "Acme Org", + "url": [ + "https://example.com" + ] + }, + "group": "com.example", + "name": "Acme Signing Server", + "description": "Signs artifacts", + "endpoints": [ + "https://example.com/sign", + "https://example.com/verify", + "https://example.com/tsa" + ] + } + ] + }, + "authors": [ + { + "name": "Samantha Wright", + "email": "samantha.wright@example.com", + "phone": "800-555-1212" + } + ], + "component": { + "type": "application", + "author": "Acme Super Heros", + "name": "Acme Application", + "version": "9.1.1", + "data": [], + "swid": { + "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1", + "name": "Acme Application", + "version": "9.1.1", + "text": { + "contentType": "text/xml", + "encoding": "base64", + "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==" + } + } + }, + "manufacture": { + "name": "Acme, Inc.", + "url": [ + "https://example.com" + ], + "contact": [ + { + "name": "Acme Professional Services", + "email": "professional.services@example.com" + } + ] + }, + "supplier": { + "name": "Acme, Inc.", + "url": [ + "https://example.com" + ], + "contact": [ + { + "name": "Acme Distribution", + "email": "distribution@example.com" + } + ] + } + }, + "components": [ + { + "bom-ref": "pkg:npm/acme/component@1.0.0", + "type": "library", + "publisher": "Acme Inc", + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14", + "hashes": [ + { + "alg": "MD5", + "content": "3942447fac867ae5cdb3229b658f4d48" + }, + { + "alg": "SHA-1", + "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" + }, + { + "alg": "SHA-256", + "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" + }, + { + "alg": "SHA-512", + "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" + } + ], + "licenses": [ + { + "license": { + "id": "Apache-2.0", + "text": { + "contentType": "text/plain", + "encoding": "base64", + "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=" + }, + "url": "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } + ], + "purl": "pkg:npm/acme/component@1.0.0", + "pedigree": { + "ancestors": [ + { + "type": "library", + "publisher": "Acme Inc", + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14" + }, + { + "type": "library", + "publisher": "Acme Inc", + "group": "com.acme", + "name": "tomcat-catalina", + "version": "9.0.14" + } + ], + "commits": [ + { + "uid": "7638417db6d59f3c431d3e1f261cc637155684cd", + "url": "https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd", + "author": { + "timestamp": "2018-11-13T20:20:39+00:00", + "name": "me", + "email": "me@acme.org" + } + } + ] + } + }, + { + "type": "library", + "supplier": { + "name": "Example, Inc.", + "url": [ + "https://example.com", + "https://example.net" + ], + "contact": [ + { + "name": "Example Support AMER Distribution", + "email": "support@example.com", + "phone": "800-555-1212" + }, + { + "name": "Example Support APAC", + "email": "support@apac.example.com" + } + ] + }, + "author": "Example Super Heros", + "group": "org.example", + "name": "mylibrary", + "version": "1.0.0" + } + ], + "dependencies": [ + { + "ref": "pkg:npm/acme/component@1.0.0", + "dependsOn": [ + "pkg:npm/acme/component@1.0.0" + ] + } + ] +} \ No newline at end of file diff --git a/cmd/kosli/testdata/sbom/not-an-sbom.json b/cmd/kosli/testdata/sbom/not-an-sbom.json new file mode 100644 index 000000000..38ff1c8e5 --- /dev/null +++ b/cmd/kosli/testdata/sbom/not-an-sbom.json @@ -0,0 +1 @@ +{"hello":"world"} diff --git a/cmd/kosli/testdata/sbom/spdx.json b/cmd/kosli/testdata/sbom/spdx.json new file mode 100644 index 000000000..def7ad8e7 --- /dev/null +++ b/cmd/kosli/testdata/sbom/spdx.json @@ -0,0 +1,408 @@ +{ + "spdxVersion": "SPDX-2.3", + "dataLicense": "CC0-1.0", + "SPDXID": "SPDXRef-DOCUMENT", + "name": "SPDX-Tools-v2.0", + "documentNamespace": "http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301", + "externalDocumentRefs": [ + { + "externalDocumentId": "DocumentRef-spdx-tool-1.2", + "spdxDocument": "http://spdx.org/spdxdocs/spdx-tools-v1.2-3F2504E0-4F89-41D3-9A0C-0305E82C3301", + "checksum": { + "algorithm": "SHA1", + "checksumValue": "d6a770ba38583ed4bb4525bd96e50461655d2759" + } + } + ], + "comment": "This document was created using SPDX 2.0 using licenses from the web site.", + "creationInfo": { + "licenseListVersion": "3.9", + "creators": [ + "Tool: LicenseFind-1.0", + "Organization: ExampleCodeInspect ()", + "Person: Jane Doe ()" + ], + "created": "2010-01-29T18:30:22Z", + "comment": "This package has been shipped in source and binary form.\nThe binaries were created with gcc 4.5.1 and expect to link to\ncompatible system run time libraries." + }, + "packages": [ + { + "name": "glibc", + "SPDXID": "SPDXRef-Package", + "versionInfo": "2.11.1", + "packageFileName": "glibc-2.11.1.tar.gz", + "supplier": "Person: Jane Doe (jane.doe@example.com)", + "originator": "Organization: ExampleCodeInspect (contact@example.com)", + "downloadLocation": "http://ftp.gnu.org/gnu/glibc/glibc-ports-2.15.tar.gz", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "d6a770ba38583ed4bb4525bd96e50461655d2758", + "packageVerificationCodeExcludedFiles": [ + "./package.spdx" + ] + }, + "checksums": [ + { + "algorithm": "MD5", + "checksumValue": "624c1abb3664f4b35547e7c73864ad24" + }, + { + "algorithm": "SHA1", + "checksumValue": "85ed0817af83a24ad8da68c2b5094de69833983c" + }, + { + "algorithm": "SHA256", + "checksumValue": "11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd" + } + ], + "homepage": "http://ftp.gnu.org/gnu/glibc", + "sourceInfo": "uses glibc-2_11-branch from git://sourceware.org/git/glibc.git.", + "licenseConcluded": "(LGPL-2.0-only OR LicenseRef-3)", + "licenseInfoFromFiles": [ + "GPL-2.0-only", + "LicenseRef-2", + "LicenseRef-1" + ], + "licenseDeclared": "(LGPL-2.0-only AND LicenseRef-3)", + "licenseComments": "The license for this project changed with the release of version x.y. The version of the project included here post-dates the license change.", + "copyrightText": "Copyright 2008-2010 John Smith", + "summary": "GNU C library.", + "description": "The GNU C Library defines functions that are specified by the ISO C standard, as well as additional features specific to POSIX and other derivatives of the Unix operating system, and extensions specific to GNU systems.", + "externalRefs": [ + { + "referenceCategory": "SECURITY", + "referenceType": "cpe23Type", + "referenceLocator": "cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*" + }, + { + "referenceCategory": "OTHER", + "referenceType": "http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#LocationRef-acmeforge", + "referenceLocator": "acmecorp/acmenator/4.1.3-alpha", + "comment": "This is the external ref for Acme" + } + ], + "attributionTexts": [ + "The GNU C Library is free software. See the file COPYING.LIB for copying conditions, and LICENSES for notices about a few contributions that require these additional notices to be distributed. License copyright years may be listed using range notation, e.g., 1996-2015, indicating that every year in the range, inclusive, is a copyrightable year that would otherwise be listed individually." + ], + "annotations": [ + { + "annotator": "Person: Package Commenter", + "annotationDate": "2011-01-29T18:30:22Z", + "annotationType": "OTHER", + "comment": "Package level annotation" + } + ] + }, + { + "name": "Apache Commons Lang", + "SPDXID": "SPDXRef-fromDoap-1", + "downloadLocation": "NOASSERTION", + "filesAnalyzed": false, + "homepage": "http://commons.apache.org/proper/commons-lang/", + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION" + }, + { + "name": "Jena", + "SPDXID": "SPDXRef-fromDoap-0", + "versionInfo": "3.12.0", + "downloadLocation": "https://search.maven.org/remotecontent?filepath=org/apache/jena/apache-jena/3.12.0/apache-jena-3.12.0.tar.gz", + "homepage": "http://www.openjena.org/", + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "copyrightText": "NOASSERTION", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:maven/org.apache.jena/apache-jena@3.12.0" + } + ] + }, + { + "name": "Saxon", + "SPDXID": "SPDXRef-Saxon", + "versionInfo": "8.8", + "packageFileName": "saxonB-8.8.zip", + "downloadLocation": "https://sourceforge.net/projects/saxon/files/Saxon-B/8.8.0.7/saxonb8-8-0-7j.zip/download", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "85ed0817af83a24ad8da68c2b5094de69833983c" + } + ], + "homepage": "http://saxon.sourceforge.net/", + "licenseConcluded": "MPL-1.0", + "licenseDeclared": "MPL-1.0", + "licenseComments": "Other versions available for a commercial license", + "copyrightText": "Copyright Saxonica Ltd", + "description": "The Saxon package is a collection of tools for processing XML documents." + }, + { + "name": "centos", + "SPDXID": "SPDXRef-CentOS-7", + "versionInfo": "centos7.9.2009", + "packageFileName": "saxonB-8.8.zip", + "downloadLocation": "NOASSERTION", + "homepage": "https://www.centos.org/", + "copyrightText": "NOASSERTION", + "description": "The CentOS container used to run the application.", + "primaryPackagePurpose": "CONTAINER", + "releaseDate": "2021-10-15T02:38:00Z", + "builtDate": "2021-09-15T02:38:00Z", + "validUntilDate": "2022-10-15T02:38:00Z" + } + ], + "files": [ + { + "fileName": "./src/org/spdx/parser/DOAPProject.java", + "SPDXID": "SPDXRef-DoapSource", + "fileTypes": [ + "SOURCE" + ], + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12" + } + ], + "licenseConcluded": "Apache-2.0", + "licenseInfoInFiles": [ + "Apache-2.0" + ], + "copyrightText": "Copyright 2010, 2011 Source Auditor Inc.", + "fileContributors": [ + "Protecode Inc.", + "SPDX Technical Team Members", + "Open Logic Inc.", + "Source Auditor Inc.", + "Black Duck Software In.c" + ] + }, + { + "fileName": "./lib-source/commons-lang3-3.1-sources.jar", + "SPDXID": "SPDXRef-CommonsLangSrc", + "fileTypes": [ + "ARCHIVE" + ], + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c2b4e1c67a2d28fced849ee1bb76e7391b93f125" + } + ], + "licenseConcluded": "Apache-2.0", + "licenseInfoInFiles": [ + "Apache-2.0" + ], + "copyrightText": "Copyright 2001-2011 The Apache Software Foundation", + "comment": "This file is used by Jena", + "noticeText": "Apache Commons Lang\nCopyright 2001-2011 The Apache Software Foundation\n\nThis product includes software developed by\nThe Apache Software Foundation (http://www.apache.org/).\n\nThis product includes software from the Spring Framework,\nunder the Apache License 2.0 (see: StringUtils.containsWhitespace())", + "fileContributors": [ + "Apache Software Foundation" + ] + }, + { + "fileName": "./lib-source/jena-2.6.3-sources.jar", + "SPDXID": "SPDXRef-JenaLib", + "fileTypes": [ + "ARCHIVE" + ], + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "3ab4e1c67a2d28fced849ee1bb76e7391b93f125" + } + ], + "licenseConcluded": "LicenseRef-1", + "licenseInfoInFiles": [ + "LicenseRef-1" + ], + "licenseComments": "This license is used by Jena", + "copyrightText": "(c) Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP", + "comment": "This file belongs to Jena", + "fileContributors": [ + "Apache Software Foundation", + "Hewlett Packard Inc." + ] + }, + { + "fileName": "./package/foo.c", + "SPDXID": "SPDXRef-File", + "fileTypes": [ + "SOURCE" + ], + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "d6a770ba38583ed4bb4525bd96e50461655d2758" + }, + { + "algorithm": "MD5", + "checksumValue": "624c1abb3664f4b35547e7c73864ad24" + } + ], + "licenseConcluded": "(LGPL-2.0-only OR LicenseRef-2)", + "licenseInfoInFiles": [ + "GPL-2.0-only", + "LicenseRef-2" + ], + "licenseComments": "The concluded license was taken from the package level that the file was included in.", + "copyrightText": "Copyright 2008-2010 John Smith", + "comment": "The concluded license was taken from the package level that the file was included in.\nThis information was found in the COPYING.txt file in the xyz directory.", + "noticeText": "Copyright (c) 2001 Aaron Lehmann aaroni@vitelus.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED �AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", + "fileContributors": [ + "The Regents of the University of California", + "Modified by Paul Mundt lethal@linux-sh.org", + "IBM Corporation" + ], + "annotations": [ + { + "annotator": "Person: File Commenter", + "annotationDate": "2011-01-29T18:30:22Z", + "annotationType": "OTHER", + "comment": "File level annotation" + } + ] + } + ], + "hasExtractedLicensingInfos": [ + { + "licenseId": "LicenseRef-1", + "extractedText": "/*\n * (c) Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/" + }, + { + "licenseId": "LicenseRef-2", + "extractedText": "This package includes the GRDDL parser developed by Hewlett Packard under the following license:\n� Copyright 2007 Hewlett-Packard Development Company, LP\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. \nThe name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. \nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + }, + { + "licenseId": "LicenseRef-4", + "extractedText": "/*\n * (c) Copyright 2009 University of Bristol\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/" + }, + { + "licenseId": "LicenseRef-Beerware-4.2", + "extractedText": "\"THE BEER-WARE LICENSE\" (Revision 42):\nphk@FreeBSD.ORG wrote this file. As long as you retain this notice you\ncan do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp", + "name": "Beer-Ware License (Version 42)", + "seeAlsos": [ + "http://people.freebsd.org/~phk/" + ], + "comment": "The beerware license has a couple of other standard variants." + }, + { + "licenseId": "LicenseRef-3", + "extractedText": "The CyberNeko Software License, Version 1.0\n\n \n(C) Copyright 2002-2005, Andy Clark. All rights reserved.\n \nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer. \n\n2. Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in\n the documentation and/or other materials provided with the\n distribution.\n\n3. The end-user documentation included with the redistribution,\n if any, must include the following acknowledgment: \n \"This product includes software developed by Andy Clark.\"\n Alternately, this acknowledgment may appear in the software itself,\n if and wherever such third-party acknowledgments normally appear.\n\n4. The names \"CyberNeko\" and \"NekoHTML\" must not be used to endorse\n or promote products derived from this software without prior \n written permission. For written permission, please contact \n andyc@cyberneko.net.\n\n5. Products derived from this software may not be called \"CyberNeko\",\n nor may \"CyberNeko\" appear in their name, without prior written\n permission of the author.\n\nTHIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED\nWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS\nBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, \nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \nOF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR \nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \nWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \nOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, \nEVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", + "name": "CyberNeko License", + "seeAlsos": [ + "http://people.apache.org/~andyc/neko/LICENSE", + "http://justasample.url.com" + ], + "comment": "This is tye CyperNeko License" + } + ], + "relationships": [ + { + "spdxElementId": "SPDXRef-DOCUMENT", + "relatedSpdxElement": "SPDXRef-Package", + "relationshipType": "CONTAINS", + "comment": "A relationship comment" + }, + { + "spdxElementId": "SPDXRef-DOCUMENT", + "relatedSpdxElement": "DocumentRef-spdx-tool-1.2:SPDXRef-ToolsElement", + "relationshipType": "COPY_OF" + }, + { + "spdxElementId": "SPDXRef-DOCUMENT", + "relatedSpdxElement": "SPDXRef-File", + "relationshipType": "DESCRIBES" + }, + { + "spdxElementId": "SPDXRef-DOCUMENT", + "relatedSpdxElement": "SPDXRef-Package", + "relationshipType": "DESCRIBES" + }, + { + "spdxElementId": "SPDXRef-Package", + "relatedSpdxElement": "SPDXRef-JenaLib", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package", + "relatedSpdxElement": "SPDXRef-Saxon", + "relationshipType": "DYNAMIC_LINK" + }, + { + "spdxElementId": "SPDXRef-CommonsLangSrc", + "relatedSpdxElement": "NOASSERTION", + "relationshipType": "GENERATED_FROM" + }, + { + "spdxElementId": "SPDXRef-JenaLib", + "relatedSpdxElement": "SPDXRef-Package", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-File", + "relatedSpdxElement": "SPDXRef-fromDoap-0", + "relationshipType": "GENERATED_FROM" + } + ], + "annotations": [ + { + "annotator": "Person: Jane Doe ()", + "annotationDate": "2010-01-29T18:30:22Z", + "annotationType": "OTHER", + "comment": "Document level annotation" + }, + { + "annotator": "Person: Joe Reviewer", + "annotationDate": "2010-02-10T00:00:00Z", + "annotationType": "REVIEW", + "comment": "This is just an example. Some of the non-standard licenses look like they are actually BSD 3 clause licenses" + }, + { + "annotator": "Person: Suzanne Reviewer", + "annotationDate": "2011-03-13T00:00:00Z", + "annotationType": "REVIEW", + "comment": "Another example reviewer." + } + ], + "snippets": [ + { + "SPDXID": "SPDXRef-Snippet", + "snippetFromFile": "SPDXRef-DoapSource", + "ranges": [ + { + "startPointer": { + "offset": 310, + "reference": "SPDXRef-DoapSource" + }, + "endPointer": { + "offset": 420, + "reference": "SPDXRef-DoapSource" + } + }, + { + "startPointer": { + "lineNumber": 5, + "reference": "SPDXRef-DoapSource" + }, + "endPointer": { + "lineNumber": 23, + "reference": "SPDXRef-DoapSource" + } + } + ], + "licenseConcluded": "GPL-2.0-only", + "licenseInfoInSnippets": [ + "GPL-2.0-only" + ], + "licenseComments": "The concluded license was taken from package xyz, from which the snippet was copied into the current file. The concluded license information was found in the COPYING.txt file in package xyz.", + "copyrightText": "Copyright 2008-2010 John Smith", + "comment": "This snippet was identified as significant and highlighted in this Apache-2.0 file, when a commercial scanner identified it as being derived from file foo.c in package xyz which is licensed under GPL-2.0.", + "name": "from linux kernel" + } + ] +} \ No newline at end of file From c5880a949476e970bae30346e732329fb8b2f321 Mon Sep 17 00:00:00 2001 From: Alex Kantor Date: Fri, 11 Sep 2026 20:32:54 +0100 Subject: [PATCH 2/8] fix(sbom): verify the payload without a server, and read the file once Addresses the automated review. The flag audit had no entry for this command, so a third test was failing for a reason unrelated to the server sequencing. Regenerated. The interesting half of this slice is now tested. Three dry-run cases assert the URL, the type name, the parsed format, the fingerprint, the package count and both annotations. They need a server for the flow and trail, but not one that knows the sbom type, so they stay green until the server side ships. Only the round trip is blocked now. The file was read twice, once to fingerprint and once to parse, so the recorded fingerprint could describe different bytes from the recorded summary. internal/sbom gains a bytes entry point and the command reads once. A path that is not a regular file is refused: a directory or a pipe reports size zero, walked past the size guard and was then read unbounded. The reserved annotation check moves to PreRunE. It needs nothing from the file, and a typo should not cost a repository walk and a pass over nine megabytes first. Test fixtures were byte-identical copies of ones in internal/sbom, and the gzip case duplicated an assertion made there. Dropped, and the two that remain are minimal documents. The oversize file is now made with truncate rather than by building nine megabytes of string. Every error golden here was wrong: errors from this command carry a "[kosli attest sbom flow= trail=]" prefix that I had not accounted for. All six were corrected against the command's actual output. --- cmd/kosli/attestSbom.go | 42 +- cmd/kosli/attestSbom_test.go | 94 ++-- .../testdata/empty-flag-audit-coverage.json | 27 ++ cmd/kosli/testdata/sbom/compressed.json.gz | Bin 7931 -> 0 bytes cmd/kosli/testdata/sbom/cyclonedx.json | 197 +-------- cmd/kosli/testdata/sbom/spdx.json | 408 +----------------- internal/sbom/sbom.go | 7 + 7 files changed, 134 insertions(+), 641 deletions(-) delete mode 100644 cmd/kosli/testdata/sbom/compressed.json.gz diff --git a/cmd/kosli/attestSbom.go b/cmd/kosli/attestSbom.go index 2352e41dc..607b548f2 100644 --- a/cmd/kosli/attestSbom.go +++ b/cmd/kosli/attestSbom.go @@ -1,13 +1,13 @@ package main import ( + "crypto/sha256" "fmt" "io" "net/http" "net/url" "os" - "github.com/kosli-dev/cli/internal/digest" "github.com/kosli-dev/cli/internal/requests" "github.com/kosli-dev/cli/internal/sbom" "github.com/spf13/cobra" @@ -94,6 +94,7 @@ func newAttestSbomCmd(out io.Writer) *cobra.Command { }, payload: SbomAttestationPayload{ CommonAttestationPayload: &CommonAttestationPayload{}, + TypeName: "sbom", }, } cmd := &cobra.Command{ @@ -127,6 +128,11 @@ func newAttestSbomCmd(out io.Writer) *cobra.Command { return err } + err = o.rejectReservedAnnotations() + if err != nil { + return err + } + err = ValidateSliceValues(o.redactedCommitInfo, allowedCommitRedactionValues) if err != nil { return fmt.Errorf("%s for --redact-commit-info", err.Error()) @@ -172,7 +178,6 @@ func (o *attestSbomOptions) run(args []string) error { return err } - o.payload.TypeName = "sbom" err = o.loadSbom() if err != nil { return err @@ -214,6 +219,11 @@ func (o *attestSbomOptions) loadSbom() error { if err != nil { return fmt.Errorf("failed to read SBOM file [%s]: %s", o.sbomFilePath, err) } + // A directory or a pipe reports size 0 and would walk past the size check, + // then be read unbounded. + if !info.Mode().IsRegular() { + return fmt.Errorf("SBOM file [%s] is not a regular file", o.sbomFilePath) + } if info.Size() > maxSbomFileBytes { return fmt.Errorf( "SBOM file [%s] is %d bytes, above the %d byte limit for an SBOM attestation", @@ -221,12 +231,15 @@ func (o *attestSbomOptions) loadSbom() error { ) } - fingerprint, err := digest.FileSha256(o.sbomFilePath, logger) + // One read for both, so the recorded fingerprint always describes the bytes + // the recorded summary was taken from. + content, err := os.ReadFile(o.sbomFilePath) if err != nil { - return fmt.Errorf("failed to fingerprint SBOM file [%s]: %s", o.sbomFilePath, err) + return fmt.Errorf("failed to read SBOM file [%s]: %s", o.sbomFilePath, err) } + fingerprint := fmt.Sprintf("%x", sha256.Sum256(content)) - data, err := sbom.ProcessSBOMFile(o.sbomFilePath) + data, err := sbom.ProcessSBOM(content) if err != nil { return fmt.Errorf("failed to parse SBOM file [%s]: %s", o.sbomFilePath, err) } @@ -239,21 +252,24 @@ func (o *attestSbomOptions) loadSbom() error { return o.annotate(data.Format, fingerprint) } -// annotate refuses to overwrite a value the caller supplied, rather than -// silently replacing it: the two keys are derived from the file and a caller -// setting them is asking for something this command cannot honour. -func (o *attestSbomOptions) annotate(format, fingerprint string) error { - if o.payload.Annotations == nil { - o.payload.Annotations = map[string]string{} - } +// rejectReservedAnnotations runs in PreRunE: it needs nothing from the file, so +// a typo should not cost a repository walk and a pass over nine megabytes first. +func (o *attestSbomOptions) rejectReservedAnnotations() error { for _, reserved := range []string{sbomFormatAnnotation, sbomSha256Annotation} { - if _, taken := o.payload.Annotations[reserved]; taken { + if _, taken := o.annotations[reserved]; taken { return fmt.Errorf( "annotation key '%s' is set by this command from the SBOM file and cannot be provided with --annotate", reserved, ) } } + return nil +} + +func (o *attestSbomOptions) annotate(format, fingerprint string) error { + if o.payload.Annotations == nil { + o.payload.Annotations = map[string]string{} + } o.payload.Annotations[sbomFormatAnnotation] = format o.payload.Annotations[sbomSha256Annotation] = fingerprint return nil diff --git a/cmd/kosli/attestSbom_test.go b/cmd/kosli/attestSbom_test.go index 26095bf80..aec616228 100644 --- a/cmd/kosli/attestSbom_test.go +++ b/cmd/kosli/attestSbom_test.go @@ -4,7 +4,6 @@ import ( "fmt" "os" "path/filepath" - "strings" "testing" "github.com/stretchr/testify/suite" @@ -33,79 +32,100 @@ func (suite *AttestSbomCommandTestSuite) SetupTest() { BeginTrail(suite.trailName, suite.flowName, "", suite.T()) } -// oversizeSbom writes a file past the size ceiling outside the repo, so a -// ten megabyte fixture is not committed. +// oversizeSbom makes a file past the size ceiling without allocating it. The +// guard only stats the file, so the content is never read. func (suite *AttestSbomCommandTestSuite) oversizeSbom() (string, int64) { path := filepath.Join(suite.T().TempDir(), "oversize.json") - padding := strings.Repeat("x", maxSbomFileBytes+1) - body := fmt.Sprintf( - `{"bomFormat":"CycloneDX","specVersion":"1.6","version":1,"pad":"%s"}`, padding, - ) - if err := os.WriteFile(path, []byte(body), 0644); err != nil { + size := int64(maxSbomFileBytes + 1) + if err := os.WriteFile(path, nil, 0644); err != nil { suite.T().Fatal(err) } - info, err := os.Stat(path) - if err != nil { + if err := os.Truncate(path, size); err != nil { suite.T().Fatal(err) } - return path, info.Size() + return path, size } -func (suite *AttestSbomCommandTestSuite) TestAttestSbomCmd() { - tests := []cmdTestCase{ +// The dry-run cases are what prove the payload this command builds. They need a +// server for the flow and trail in SetupTest, but not one that knows the sbom +// type, so they stay green while the server side is unreleased. +func (suite *AttestSbomCommandTestSuite) TestAttestSbomBuildsTheRightRequest() { + runTestCmd(suite.T(), []cmdTestCase{ { - name: "reports a CycloneDX SBOM against a trail", - cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/cyclonedx.json %s", suite.defaultKosliArguments), - golden: "sbom attestation 'cli' is reported to trail: test-123\n", + name: "posts to the system endpoint with type_name sbom and the CycloneDX summary", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --dry-run %s", suite.defaultKosliArguments), + goldenRegex: `(?s)trail/test-123/system.*"type_name": "sbom".*"format": "cyclonedx-1\.6".*"original_fingerprint": "[a-f0-9]{64}".*"package_count": 1`, + }, + { + name: "records the format and the file checksum as annotations", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --dry-run %s", suite.defaultKosliArguments), + goldenRegex: `(?s)"sbom_format": "cyclonedx-1\.6".*"sbom_sha256": "[a-f0-9]{64}"`, }, { - name: "reports an SPDX SBOM against a trail", - cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/spdx.json %s", suite.defaultKosliArguments), - golden: "sbom attestation 'cli' is reported to trail: test-123\n", + name: "reads SPDX as well, and reports the version the file declares", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/spdx.json --dry-run %s", suite.defaultKosliArguments), + goldenRegex: `(?s)"type_name": "sbom".*"format": "spdx-2\.3"`, }, + }) +} + +func (suite *AttestSbomCommandTestSuite) TestAttestSbomRejectsBadInput() { + tests := []cmdTestCase{ { wantError: true, name: "fails when --sbom-file is missing", - cmd: fmt.Sprintf("attest sbom --name cli %s", suite.defaultKosliArguments), - golden: "Error: required flag(s) \"sbom-file\" not set\n", + cmd: fmt.Sprintf("attest sbom --name my-sbom %s", suite.defaultKosliArguments), + golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] required flag(s) \"sbom-file\" not set\n", }, { wantError: true, - name: "fails when --attachments is used as well, because two attachments would be compressed", - cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/cyclonedx.json --attachments testdata/sbom/spdx.json %s", suite.defaultKosliArguments), - golden: "Error: only one of --sbom-file, --attachments is allowed\n", + name: "fails when --attachments is used too, because two attachments would be compressed", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --attachments testdata/sbom/spdx.json %s", suite.defaultKosliArguments), + golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] only one of --sbom-file, --attachments is allowed\n", }, { wantError: true, - name: "fails when the file is not an SBOM", - cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/not-an-sbom.json %s", suite.defaultKosliArguments), - golden: "Error: failed to parse SBOM file [testdata/sbom/not-an-sbom.json]: not a CycloneDX SBOM: bomFormat is \"\", expected \"CycloneDX\"\n", + name: "fails when the file is not an SBOM, naming the file", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/not-an-sbom.json --dry-run %s", suite.defaultKosliArguments), + golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] failed to parse SBOM file [testdata/sbom/not-an-sbom.json]: not a CycloneDX SBOM: bomFormat is \"\", expected \"CycloneDX\"\n", }, { wantError: true, - name: "fails when the file is compressed, because the format is read from it", - cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/compressed.json.gz %s", suite.defaultKosliArguments), - golden: "Error: failed to parse SBOM file [testdata/sbom/compressed.json.gz]: the file is gzip compressed; supply the uncompressed SBOM\n", + name: "fails when a reserved annotation key is supplied", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --annotate sbom_format=mine --dry-run %s", suite.defaultKosliArguments), + golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] annotation key 'sbom_format' is set by this command from the SBOM file and cannot be provided with --annotate\n", }, { wantError: true, - name: "fails when a reserved annotation key is supplied", - cmd: fmt.Sprintf("attest sbom --name cli --sbom-file testdata/sbom/cyclonedx.json --annotate sbom_format=mine %s", suite.defaultKosliArguments), - golden: "Error: annotation key 'sbom_format' is set by this command from the SBOM file and cannot be provided with --annotate\n", + name: "fails when the path is a directory rather than a file", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom --dry-run %s", suite.defaultKosliArguments), + golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] SBOM file [testdata/sbom] is not a regular file\n", }, } runTestCmd(suite.T(), tests) } -func (suite *AttestSbomCommandTestSuite) TestAttestSbomRejectsAnOversizeFileBeforeUploading() { +func (suite *AttestSbomCommandTestSuite) TestAttestSbomRejectsAnOversizeFileBeforeReadingIt() { path, size := suite.oversizeSbom() runTestCmd(suite.T(), []cmdTestCase{ { wantError: true, - name: "fails locally with the actual size rather than a bare 413 from the server", - cmd: fmt.Sprintf("attest sbom --name cli --sbom-file %s %s", path, suite.defaultKosliArguments), - golden: fmt.Sprintf("Error: SBOM file [%s] is %d bytes, above the %d byte limit for an SBOM attestation\n", path, size, maxSbomFileBytes), + name: "fails locally with the actual size, rather than a bare 413 from the server", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file %s --dry-run %s", path, suite.defaultKosliArguments), + golden: fmt.Sprintf("Error: [kosli attest sbom flow=attest-sbom trail=test-123] SBOM file [%s] is %d bytes, above the %d byte limit for an SBOM attestation\n", path, size, maxSbomFileBytes), + }, + }) +} + +// Reporting to a real server needs one that knows the sbom type, which arrives +// with kosli-dev/server#6863. +func (suite *AttestSbomCommandTestSuite) TestAttestSbomRoundTrip() { + runTestCmd(suite.T(), []cmdTestCase{ + { + name: "reports a CycloneDX SBOM against a trail", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json %s", suite.defaultKosliArguments), + golden: "sbom attestation 'my-sbom' is reported to trail: test-123\n", }, }) } diff --git a/cmd/kosli/testdata/empty-flag-audit-coverage.json b/cmd/kosli/testdata/empty-flag-audit-coverage.json index 84b07a7b5..58ec70e8e 100644 --- a/cmd/kosli/testdata/empty-flag-audit-coverage.json +++ b/cmd/kosli/testdata/empty-flag-audit-coverage.json @@ -406,6 +406,33 @@ "trail": "string", "user-data": "string" }, + "attest sbom": { + "annotate": "stringToString", + "artifact-type": "string", + "attachments": "stringSlice", + "commit": "string", + "description": "string", + "dry-run": "bool", + "exclude": "stringSlice", + "external-fingerprint": "stringToString", + "external-url": "stringToString", + "fingerprint": "string", + "flow": "string", + "name": "string", + "origin-url": "string", + "redact-commit-info": "stringSlice", + "registry-password": "string", + "registry-provider": "string", + "registry-username": "string", + "repo-id": "string", + "repo-provider": "string", + "repo-root": "string", + "repo-url": "string", + "repository": "string", + "sbom-file": "string", + "trail": "string", + "user-data": "string" + }, "attest snyk": { "annotate": "stringToString", "artifact-type": "string", diff --git a/cmd/kosli/testdata/sbom/compressed.json.gz b/cmd/kosli/testdata/sbom/compressed.json.gz deleted file mode 100644 index f4943e11cc330cdd7fa3814c074221c3ba7aec1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7931 zcmVGs1>E&Hmppa<6!Uj z&fbA9{so`mn|&AuyS)=9ID;Z7(xX&)l+~#s{SJRr{Z~o)U6N=tyn4HhcG=DFg}03p z*ve*)-~Jo__Dl9VyXleyIJ%Q0QRq2)T+nag1$s`}8OmM&SG1>|wVgEG_WsfhxN? zXu;K$nqI9|<*L6>oQmS=HQiBaa%~|!6vp`Tx1XL~(W;*=z^PRhHC3&unj`B@uyAGg z7-)K><^>B)_xxI=B6(F^Q-X!GkW^pNeZ5vuY8B7*VV$Lg37`J>rTpz5=|a#dkD(WQ zqVME=dklTD+2Zzc9eSX^AMeZ3_Q1lU8wH{2_WNY_`?qhw8SFF)zJk#e*Zzm_>CgM7 z1^0aA_kUnlxTZfw1?7a6d*>e-aOLt$K_kFld=Hna zy|9djAa+7j-NTMw^Yuj6{8Ln!aDB1@(7@~KlJux)+M}$hixAC;FLXezs6tMsVJj+%QFuDHkDL^6eZ)WdruM zK6nCN;X1pZS}Fc6z|iZnUUALS(vOXcr$k5hO$rB-%BdGNA~zl$?M`&CuTtpG$MMT_ z8TOv*zc$~_Q&+JiUuj?LS+urIO>*XAt=C=c-RERyncC)c(r-`0-qMZRdwVK{BXhX7 zCyj>JZR{L#xbizN7yK^H`(si$zr3}=-qSY!J{rC`9fQVj=f)21J6ZF-*}ut zaZ4ILuT@LwFU0wSj=Xa>1HBioB)|JqeYxmYztcY09oTbsaB$|s<4dex?2DdwO8q#P zuGQi7>G(439S3hu=ix-ZTFNSN&DJ644%fZ63a%4meLi^Cq~a-SactFBy@P)p99*@( zdAasZgXh-KY{`R}GThpxym~RCgQt#Hpp&Q-* z;W{=)_;h>)IlVUZySDne{Kr2YZgBO_0FyT9-)-{ZvD#vu=Qd=C~R*!A-FO%i`|U_sxqd;TeZmA*>3 zG}1^Hh3>oap2z-&lK8zQtUQsHQ8n{KhT5|%;^IcU@bhoP27Ztx!7XdKNN zxq2n2tJ-4WtF=YNtNOrw9lxS3DsH9jNQ(2frYlo&al%DKuRHa{Lh*e`ss)PfDH1Sr zEvUGX?C6dp*J_%lE*7d2IE$(-RRagefa_^BU3P2k-&%+!D) zTGgr4m4zS3j;82!y(R^fisEUiTvK#e)&sSs>vFwbas9=@aVrZ@QPr&lfh;dP&xdUU zf$vCFwc)tSWcC9DCfMvgvmk!OZSp`A z>)|PJyjAe12tLApzr%Gz$rSib5;ogiH$7_AkYa7!sMAq5b7|qst%a{#k zlbQYl*4CJ=N6T?5ni}nXe-s(?eRH|Rb(~+qM$0yBh~|;xnEJuHRKDjj=x1_)h}|7s=yk^^HwmKu-n%q_!Hkv=xq(Tg<1}Jd1tvHjMzDs9J;#VXmMwLRa@%Ed zAp2@I*1)_ZFOHCrl3cC%U}<-Z*fF&Teh-65V``g2KK9cY=l5b=ww2}b$E0zzfh{_n z=-TUykCqB75*WeDa+~X6oyrth#NEBTxoSg$HEf*jXz8jxFdJaHu!oEZciOVwSsme; zs%^r4H|uPC_&(}&hDWa(T^!Tj`pw4CSG35Zb+x4)t1Y43V1 z;{fbW3MRmml-0`ZoR+R>tXvv%w)9PnWaTOrpTGU)BeTB%%je7snPLz3`n2Ubg>}KT zUdXTML=otUuW@*U??6wdT@M*C%0$sXFZ#~y7%)y>16>~B-jx^A{A-jEGBy|VlIt`Z zXXz_o56yJ^bU&5lI7Y@uGC2A3{>fE`xDHW|ksU|C$V>Lp>}P8NJ(B*w9=6V8&1BF; zxf_=kvZ;P#sUy-M$UObLgL#jz#ueHotzneOhF`;M5bpyPegFmvEE(3`r1f2Wz>It^ zxW`q*Wr}vn*9W>lSuIO)-}u1TXCPnLe{+@Kx|yx@!6u^{8Zc4BWZ^J+w1jP@~F zet({w`gAR>Nk`pqSrh?F z%2tVYcYg&uuw8Wq41a~=g{G;?Uf4@|-Qm_U&oGu8Stj@{{AKcneRRQInavDr)5rg( zSwXgLd%nVbf?UXUPlzdi2Um_G8;~Weh1nnK%K>bdcA_`f$JH*bZwfNFSPHDMV}qYc zcm2le_F@09=NQLi*V$-~9eL%jHS7Va5|oie_NQH6a{mF@4tKuEWNd8=uxsrIx`qr` zPH3HIUtP$uH)9oILWKVZ8-HW|G)6pJLuMzFO@UuHqVHtap1ALVFU257+!x12Sl7;; z4-U=Dww}VN(*F;{NAL;2-TwYoCz_VY1Z=`L&kTn;Hu$N8@`3o%K42CvUKv#~QBF+JeeD;w<5n%gVKJg=n}*j0>QG3?c3_-4&VOY|Ag_nX@_)_AXDGJFG@l86JrcYdcX?lW8Wcd!ewDDW1bvI6r(BLmb%y zCK4_fzzrPEWe5+tK42zbVKGLa?MSe;#4=ClOA25W!-yu{3wF(Y+Pj>9JD^_mONJv1 z3)2{UgEKh}^drP6;D8W!PQ-_-3Ccp>F>FBn^%EQL3fJMYwUZwLhk|{wcmn*cLp+Sd zM%mlI{J<-7KZJO5gQ=(Gn8^rzO95HWQ5PV~R8PQDN4Y(5U1dB1)(vqpar4-B1^x%I zs2!sH*qiZ!GtF&=eRox7jznbH*L2mC5 zD=;39r4%DlJ0V}9xXJd-_msHBJs~He&%hH;!5rnVl2YCw*x`lZJ7G!nK138wAycPFhGkK$59l?*T0bFC7vdE{%=8^CDCgc>|{>oDJjK8YU z738tc^ApNR_8`}ltrYSRv^(In$n~scYTE*4r*Raojc@flWBP%-19HbJ=b>y}5c6QK zijcF-d0c{AbtH0FLAJO06XFr(2UidD<|BVr5c_1n#y!QTEHN$Qu{22#n{nX6W?0(S}ZqnOwd2saV7i+13^wVJV>-Ro?9X&5-&kM;Io|K(rcA+ z*jyK7T_JaZcyMoRjV;B!*off&5GRHakK2eTqE1m)nXC{8!1m8R@oSVX;uCPS4#i=- zUj=*LX1s;4ahJvd#DXs694sGt7G)~r9m^Ta!#Qf^j~JWW`9R?A<0Qjx#S-fUXbU30 zi;#yEWq_E7xsieUWqD9{Kv;*lSFh7r0^fpt84}7}@F|Q@JG+agW|(VgAWJz4I>5z& ztN1bd?gi$9{A7di9&B6#Jwv`H11Bspf@d)n)&cb9qP9O*7@|%%Y>4W$vEZ%C%%GBeXBf*Z<#6p0FcO9HmC!q~@h zLSA#EoDFkwTnFGM*b&4V;G4P4@cQD>j%}*7fqbtJXECOx|0a-A0!JI|I42bGmEsM| z6(ddxSRimppZHR0FM_?V*r_*hgag_p=cp7YZ6#FXMSAd&p0sH>b&KNcY#EBBrNY4Re3+p+3xuwWVx)Sko2b z2Fx85Yy;L}XMCg$oDfgYQ_h^$tgzN4a-CLQ8&La4PaW)muR_i(F-{G91=fi*DAE<> zncy>Sr>(*|6TgXd)HCoNpLhw^OTPDlY+HoTrep;C(~nw{RcY z6<`_S##3SZH$g8j=31~du!jxiPHDZ8@?eaeVB_L-`T0U_hpaZ8a%sX1p%zih4>Jyh za$svuc|sTED8m|Ht~_R}^4c!sf4GiGT4y{X?rl<@L_8boTjnUmSPAT7Vw)na6K~x>W}xL(l`RKS^Z?@`XIi*uQWtLH7fW zqW_D$&^2|iK|ABn$dB3jKCESAH4L%F!ew3X5m-Z%+M!J~dR@)9f@kV|v9 z$>=wblVaRsdr~nsq^^uNXWmHARz$sJxn({c{rw<@uGo3VIz68##IYZYUkkONRS4LC z`&+tmjTAeI2MCMAEx;%tPz9H z*qJP8{2IlJr>#&28zjAUbo3zyfw)6;4#=+(%ms5US*(HbIstOzyZLzWypiWQY!2~E zjOu?_#};!}`0m8{2KpWN?-=VYpd)5urLk9#r;3;axgXXN(I;39_`~&!dCyZ(_l3Nt zi*+Z=`!e~ba$ZAhpj;Dq2$LDbixihG#Ggub#cGOoee#ZOMoF&~#YH?#>oK^;7Un>& zMk{(APY}C|3d{-l{5fL$1TYGC8`>)7&?VWG&nH=anby@m#*NIzkk6*E-RAaFnj@{1 zN5t1+V+A-#^)k|Ve%?bhTk)(kt@ZNUQnJVoN@vgvn^5jNHm9;+GC*EQywA-1gXP8f z*gOYEP6qld*}z%}#10YXfPY!Iw(B;Jry#rOTAxj3 z!#2jEpv&>1kZFe7tj30eiLz_zto2NOBi=)kpI~?A?{* zljXA(+vf?m3-BS}0kM(hyjdOYV?9{+a0Bb_5MPO3Gut6P&|kk`ZinZTg1@^c1IRIu zqgwOE$p$=v_&sydIuLTSZV8ujjQKH@$NiBsOLa!vH?1++Y;0bmq`VMw`YWpgYr9}l ztOKyIxxF@dt$oAKiCZZLnjKP1x8`fAuhM5a`}dJ!N@7j8B%2&VbN~9V?us_fVsC+) z?C5-6(Kem}wlFH%4m+b6EZG^}7&{%;zA5GP@Z66jz+$P0g(Yw7bSz z>hJ8_DUSiXo*HNSyu%a4vqRrE{jjT5tLD-Lr~99*sR9 z9&mYz`G{dpH#K*$H;C&nJ3B1aIQV(&kk?Lt*IkA4l2Tr(VGYJ`A*Y7Cj{BEU@hHcM zB&r#yh`Te+Z~K6iFo#%w228j)`(fuyhtxjUIC;*>_03}Tob`g0>WO*Ix#66fpVQdI z+GTpiguWyLZ|6Nj|E(Gk#RKdI;WksW^~|2prV8Wc_|^jdW|+o17!sn8#F~0D)C#5+w>)VmR ze}=sFUteauMic6t5OBT$u}r4(8NV$u=J&j$;!!Wk3?fLKxWtE+W2z7m` z37bMcTA|*WmZywBJVE#w-&Nakw;{Y7;TG}J> zo>lsU3iViY&MUu=$AW*Ta4oNWkRPl4g!R&$3TGY}p0eB~+v9f@8>lvWzXpf(fh-P# zy+@c^-`F1Hz(=Yvgiqnf7%V5oAndjJjhPfp1E$&;$|srbAeOyhEMs$vn1lUJAJy(se_9@p0}DDNoxpYA zBN5hFHLS}L@4GZ2pK&6>hP3a~jq8}R(YZX;8P&cfo-GvmcDh)r9D$z*Jrb7&0BdmXLiQH>@sE?vAxHB)7$fU@~^yymGwyAnJCtQt`KXfpR?4bh**O?0BMf_adpH- z*6V@1cf5i)y5YSvypB%iJ)i^PBH%9(w`-JNUQ18=2=Dh0@w4ptD31p$j&R=8h8S|D z9_2!OEZ1e5tDoz)6!yWm^7%-(hUfZ{2SB~8=p(sqNd`N#IaqIkwHNd+&}sa^ zSx}D6qyvmqln-L>8TAdM@gMVH;L4e7asQm>tbr?F-$cf5egMB7nL|3GBmK648*T7B z40C#{hXYUHoE_I+!iKrip&b2Es?Fc@KK-qpBry-fz5q2n2h?Ni*)8{tSk&X}Q_T#1 z=lG2|4BHpj^BeD#zWRXMU{mNXS)9W2W$aakeDXm1DxS5ZeR^PPZ9%4e#H_3@3o+zH zA=hIxVDKiK;Z@vE8UqF@J|5%89FnXjXc5Uci__r<&~h58At zbRVMvCeqWej2E8x`5&GI$~@j;9TQ_ocDA_t=zJFQx|BN?`ze`REz!5c+`U`!vrf^^ zT+z?Cua4=tAHCCSkAV}(Q}9jTa*gMyq_uzx_Tk?tJLhRMX6;5BpARyhx629Wp7{^O z#k5bT!Jju0@f!7^k-c;a{V+J@3~Rc`q0<`TXpS~osG|{%2du`B_U>X0X@#<5y_+`Z z@qF}^0!DNOSSZY3xup10%K z0&oFcM!U5zKgC#%wMwyH8g&BsgoidY7slps1M6F!igk!~h4a$ulMQl^7gd+PS-w# z`8B=d2id(?zaTCnGykF50@qQNvtv9!onlVL-V`AEg;2+)H4E_*;uM_)VQeg)AqjrJ z@`ZCWz}mvw3oP#E{H+LCJ;uA}13Y7yM#J{Yw09WrF^s>%%YTATXHWT)4VTVvn#FpV zuqTvb`P#q8tN%xGY9W`dkbGu}5tV9yk?7lyi$<1$_C7!v9coH*qOAIYckk5Au##Gm)ip7KAPPG22*$oK2^efceYVEEfhuh|+-TKMGe*Zp}f zj``;&4;&|a_@8^)J_-DA`5qLXK7MdEUa;F2-;Yy%Zuyf(^|O_H_P{>B=;O!s`2~OV z@IJrn_7VP%UXk>Fb`#nE|HyB{8RPKgwM(Tv9@wMgwW?aL$Ti=s`kKB_y^1RPY9KF^ zs_c1HwI*v?wO;Z3`){er3^v-bck+DOZ@>Llhs<7Cbo2Cj>HTbS{ZW=bd_UVA5#I=3 ze8)u`{1erKj`s1(zyv|xd&kMmJDG0YRB`78Ai@G$?A02jw}9Mz8Q9%7f&BK_1)D$s zilUv|zAog(PD)F}H%TSi_x+crL2LZ+D?|#f!(w-Q@ER<-_S08k33C2>D|~%w{^g<& zWxsy#PPIEqzw>@AVcOeQY-K0_)^+phwcI{0H}-NA--U?qoV{O#H2B~LNwD#QjTZ)Y l-mvnw-mb!i+WpuR-#GK>%{Om-`Qw*A{}VG#Co$wv000S}45|PC diff --git a/cmd/kosli/testdata/sbom/cyclonedx.json b/cmd/kosli/testdata/sbom/cyclonedx.json index b7ab41b97..641cdbaac 100644 --- a/cmd/kosli/testdata/sbom/cyclonedx.json +++ b/cmd/kosli/testdata/sbom/cyclonedx.json @@ -1,199 +1,14 @@ { "bomFormat": "CycloneDX", "specVersion": "1.6", - "serialNumber": "urn:uuid:3e671687-395b-41f5-a30f-a58921a69b79", "version": 1, "metadata": { - "timestamp": "2020-04-13T20:20:39+00:00", - "tools": { - "components": [ - { - "type": "application", - "group": "Awesome Vendor", - "name": "Awesome Tool", - "version": "9.1.2", - "hashes": [ - { - "alg": "SHA-1", - "content": "25ed8e31b995bb927966616df2a42b979a2717f0" - }, - { - "alg": "SHA-256", - "content": "a74f733635a19aefb1f73e5947cef59cd7440c6952ef0f03d09d974274cbd6df" - } - ] - } - ], - "services": [ - { - "provider": { - "name": "Acme Org", - "url": [ - "https://example.com" - ] - }, - "group": "com.example", - "name": "Acme Signing Server", - "description": "Signs artifacts", - "endpoints": [ - "https://example.com/sign", - "https://example.com/verify", - "https://example.com/tsa" - ] - } - ] - }, - "authors": [ - { - "name": "Samantha Wright", - "email": "samantha.wright@example.com", - "phone": "800-555-1212" - } - ], - "component": { - "type": "application", - "author": "Acme Super Heros", - "name": "Acme Application", - "version": "9.1.1", - "data": [], - "swid": { - "tagId": "swidgen-242eb18a-503e-ca37-393b-cf156ef09691_9.1.1", - "name": "Acme Application", - "version": "9.1.1", - "text": { - "contentType": "text/xml", - "encoding": "base64", - "content": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxTb2Z0d2FyZUlkZW50aXR5IHhtbDpsYW5nPSJFTiIgbmFtZT0iQWNtZSBBcHBsaWNhdGlvbiIgdmVyc2lvbj0iOS4xLjEiIAogdmVyc2lvblNjaGVtZT0ibXVsdGlwYXJ0bnVtZXJpYyIgCiB0YWdJZD0ic3dpZGdlbi1iNTk1MWFjOS00MmMwLWYzODItM2YxZS1iYzdhMmE0NDk3Y2JfOS4xLjEiIAogeG1sbnM9Imh0dHA6Ly9zdGFuZGFyZHMuaXNvLm9yZy9pc28vMTk3NzAvLTIvMjAxNS9zY2hlbWEueHNkIj4gCiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3N0YW5kYXJkcy5pc28ub3JnL2lzby8xOTc3MC8tMi8yMDE1LWN1cnJlbnQvc2NoZW1hLnhzZCBzY2hlbWEueHNkIiA+CiAgPE1ldGEgZ2VuZXJhdG9yPSJTV0lEIFRhZyBPbmxpbmUgR2VuZXJhdG9yIHYwLjEiIC8+IAogIDxFbnRpdHkgbmFtZT0iQWNtZSwgSW5jLiIgcmVnaWQ9ImV4YW1wbGUuY29tIiByb2xlPSJ0YWdDcmVhdG9yIiAvPiAKPC9Tb2Z0d2FyZUlkZW50aXR5Pg==" - } - } - }, - "manufacture": { - "name": "Acme, Inc.", - "url": [ - "https://example.com" - ], - "contact": [ - { - "name": "Acme Professional Services", - "email": "professional.services@example.com" - } - ] - }, - "supplier": { - "name": "Acme, Inc.", - "url": [ - "https://example.com" - ], - "contact": [ - { - "name": "Acme Distribution", - "email": "distribution@example.com" - } - ] - } + "timestamp": "2026-09-11T10:00:00Z", + "tools": { "components": [{ "type": "application", "name": "syft", "version": "1.50.0" }] }, + "component": { "type": "application", "name": "app", "version": "1.2.3" } }, "components": [ - { - "bom-ref": "pkg:npm/acme/component@1.0.0", - "type": "library", - "publisher": "Acme Inc", - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14", - "hashes": [ - { - "alg": "MD5", - "content": "3942447fac867ae5cdb3229b658f4d48" - }, - { - "alg": "SHA-1", - "content": "e6b1000b94e835ffd37f4c6dcbdad43f4b48a02a" - }, - { - "alg": "SHA-256", - "content": "f498a8ff2dd007e29c2074f5e4b01a9a01775c3ff3aeaf6906ea503bc5791b7b" - }, - { - "alg": "SHA-512", - "content": "e8f33e424f3f4ed6db76a482fde1a5298970e442c531729119e37991884bdffab4f9426b7ee11fccd074eeda0634d71697d6f88a460dce0ac8d627a29f7d1282" - } - ], - "licenses": [ - { - "license": { - "id": "Apache-2.0", - "text": { - "contentType": "text/plain", - "encoding": "base64", - "content": "CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4=" - }, - "url": "https://www.apache.org/licenses/LICENSE-2.0.txt" - } - } - ], - "purl": "pkg:npm/acme/component@1.0.0", - "pedigree": { - "ancestors": [ - { - "type": "library", - "publisher": "Acme Inc", - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14" - }, - { - "type": "library", - "publisher": "Acme Inc", - "group": "com.acme", - "name": "tomcat-catalina", - "version": "9.0.14" - } - ], - "commits": [ - { - "uid": "7638417db6d59f3c431d3e1f261cc637155684cd", - "url": "https://location/to/7638417db6d59f3c431d3e1f261cc637155684cd", - "author": { - "timestamp": "2018-11-13T20:20:39+00:00", - "name": "me", - "email": "me@acme.org" - } - } - ] - } - }, - { - "type": "library", - "supplier": { - "name": "Example, Inc.", - "url": [ - "https://example.com", - "https://example.net" - ], - "contact": [ - { - "name": "Example Support AMER Distribution", - "email": "support@example.com", - "phone": "800-555-1212" - }, - { - "name": "Example Support APAC", - "email": "support@apac.example.com" - } - ] - }, - "author": "Example Super Heros", - "group": "org.example", - "name": "mylibrary", - "version": "1.0.0" - } - ], - "dependencies": [ - { - "ref": "pkg:npm/acme/component@1.0.0", - "dependsOn": [ - "pkg:npm/acme/component@1.0.0" - ] - } + { "type": "library", "name": "openssl", "version": "3.0.2" }, + { "type": "file", "name": "/etc/hosts" } ] -} \ No newline at end of file +} diff --git a/cmd/kosli/testdata/sbom/spdx.json b/cmd/kosli/testdata/sbom/spdx.json index def7ad8e7..7cbb81fc1 100644 --- a/cmd/kosli/testdata/sbom/spdx.json +++ b/cmd/kosli/testdata/sbom/spdx.json @@ -2,407 +2,15 @@ "spdxVersion": "SPDX-2.3", "dataLicense": "CC0-1.0", "SPDXID": "SPDXRef-DOCUMENT", - "name": "SPDX-Tools-v2.0", - "documentNamespace": "http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301", - "externalDocumentRefs": [ - { - "externalDocumentId": "DocumentRef-spdx-tool-1.2", - "spdxDocument": "http://spdx.org/spdxdocs/spdx-tools-v1.2-3F2504E0-4F89-41D3-9A0C-0305E82C3301", - "checksum": { - "algorithm": "SHA1", - "checksumValue": "d6a770ba38583ed4bb4525bd96e50461655d2759" - } - } - ], - "comment": "This document was created using SPDX 2.0 using licenses from the web site.", - "creationInfo": { - "licenseListVersion": "3.9", - "creators": [ - "Tool: LicenseFind-1.0", - "Organization: ExampleCodeInspect ()", - "Person: Jane Doe ()" - ], - "created": "2010-01-29T18:30:22Z", - "comment": "This package has been shipped in source and binary form.\nThe binaries were created with gcc 4.5.1 and expect to link to\ncompatible system run time libraries." - }, + "name": "minimal", + "documentNamespace": "https://example.com/minimal", + "creationInfo": { "created": "2026-09-11T10:00:00Z", "creators": ["Tool: syft-1.50.0"] }, "packages": [ - { - "name": "glibc", - "SPDXID": "SPDXRef-Package", - "versionInfo": "2.11.1", - "packageFileName": "glibc-2.11.1.tar.gz", - "supplier": "Person: Jane Doe (jane.doe@example.com)", - "originator": "Organization: ExampleCodeInspect (contact@example.com)", - "downloadLocation": "http://ftp.gnu.org/gnu/glibc/glibc-ports-2.15.tar.gz", - "filesAnalyzed": true, - "packageVerificationCode": { - "packageVerificationCodeValue": "d6a770ba38583ed4bb4525bd96e50461655d2758", - "packageVerificationCodeExcludedFiles": [ - "./package.spdx" - ] - }, - "checksums": [ - { - "algorithm": "MD5", - "checksumValue": "624c1abb3664f4b35547e7c73864ad24" - }, - { - "algorithm": "SHA1", - "checksumValue": "85ed0817af83a24ad8da68c2b5094de69833983c" - }, - { - "algorithm": "SHA256", - "checksumValue": "11b6d3ee554eedf79299905a98f9b9a04e498210b59f15094c916c91d150efcd" - } - ], - "homepage": "http://ftp.gnu.org/gnu/glibc", - "sourceInfo": "uses glibc-2_11-branch from git://sourceware.org/git/glibc.git.", - "licenseConcluded": "(LGPL-2.0-only OR LicenseRef-3)", - "licenseInfoFromFiles": [ - "GPL-2.0-only", - "LicenseRef-2", - "LicenseRef-1" - ], - "licenseDeclared": "(LGPL-2.0-only AND LicenseRef-3)", - "licenseComments": "The license for this project changed with the release of version x.y. The version of the project included here post-dates the license change.", - "copyrightText": "Copyright 2008-2010 John Smith", - "summary": "GNU C library.", - "description": "The GNU C Library defines functions that are specified by the ISO C standard, as well as additional features specific to POSIX and other derivatives of the Unix operating system, and extensions specific to GNU systems.", - "externalRefs": [ - { - "referenceCategory": "SECURITY", - "referenceType": "cpe23Type", - "referenceLocator": "cpe:2.3:a:pivotal_software:spring_framework:4.1.0:*:*:*:*:*:*:*" - }, - { - "referenceCategory": "OTHER", - "referenceType": "http://spdx.org/spdxdocs/spdx-example-444504E0-4F89-41D3-9A0C-0305E82C3301#LocationRef-acmeforge", - "referenceLocator": "acmecorp/acmenator/4.1.3-alpha", - "comment": "This is the external ref for Acme" - } - ], - "attributionTexts": [ - "The GNU C Library is free software. See the file COPYING.LIB for copying conditions, and LICENSES for notices about a few contributions that require these additional notices to be distributed. License copyright years may be listed using range notation, e.g., 1996-2015, indicating that every year in the range, inclusive, is a copyrightable year that would otherwise be listed individually." - ], - "annotations": [ - { - "annotator": "Person: Package Commenter", - "annotationDate": "2011-01-29T18:30:22Z", - "annotationType": "OTHER", - "comment": "Package level annotation" - } - ] - }, - { - "name": "Apache Commons Lang", - "SPDXID": "SPDXRef-fromDoap-1", - "downloadLocation": "NOASSERTION", - "filesAnalyzed": false, - "homepage": "http://commons.apache.org/proper/commons-lang/", - "licenseConcluded": "NOASSERTION", - "licenseDeclared": "NOASSERTION", - "copyrightText": "NOASSERTION" - }, - { - "name": "Jena", - "SPDXID": "SPDXRef-fromDoap-0", - "versionInfo": "3.12.0", - "downloadLocation": "https://search.maven.org/remotecontent?filepath=org/apache/jena/apache-jena/3.12.0/apache-jena-3.12.0.tar.gz", - "homepage": "http://www.openjena.org/", - "licenseConcluded": "NOASSERTION", - "licenseDeclared": "NOASSERTION", - "copyrightText": "NOASSERTION", - "externalRefs": [ - { - "referenceCategory": "PACKAGE-MANAGER", - "referenceType": "purl", - "referenceLocator": "pkg:maven/org.apache.jena/apache-jena@3.12.0" - } - ] - }, - { - "name": "Saxon", - "SPDXID": "SPDXRef-Saxon", - "versionInfo": "8.8", - "packageFileName": "saxonB-8.8.zip", - "downloadLocation": "https://sourceforge.net/projects/saxon/files/Saxon-B/8.8.0.7/saxonb8-8-0-7j.zip/download", - "filesAnalyzed": false, - "checksums": [ - { - "algorithm": "SHA1", - "checksumValue": "85ed0817af83a24ad8da68c2b5094de69833983c" - } - ], - "homepage": "http://saxon.sourceforge.net/", - "licenseConcluded": "MPL-1.0", - "licenseDeclared": "MPL-1.0", - "licenseComments": "Other versions available for a commercial license", - "copyrightText": "Copyright Saxonica Ltd", - "description": "The Saxon package is a collection of tools for processing XML documents." - }, - { - "name": "centos", - "SPDXID": "SPDXRef-CentOS-7", - "versionInfo": "centos7.9.2009", - "packageFileName": "saxonB-8.8.zip", - "downloadLocation": "NOASSERTION", - "homepage": "https://www.centos.org/", - "copyrightText": "NOASSERTION", - "description": "The CentOS container used to run the application.", - "primaryPackagePurpose": "CONTAINER", - "releaseDate": "2021-10-15T02:38:00Z", - "builtDate": "2021-09-15T02:38:00Z", - "validUntilDate": "2022-10-15T02:38:00Z" - } - ], - "files": [ - { - "fileName": "./src/org/spdx/parser/DOAPProject.java", - "SPDXID": "SPDXRef-DoapSource", - "fileTypes": [ - "SOURCE" - ], - "checksums": [ - { - "algorithm": "SHA1", - "checksumValue": "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12" - } - ], - "licenseConcluded": "Apache-2.0", - "licenseInfoInFiles": [ - "Apache-2.0" - ], - "copyrightText": "Copyright 2010, 2011 Source Auditor Inc.", - "fileContributors": [ - "Protecode Inc.", - "SPDX Technical Team Members", - "Open Logic Inc.", - "Source Auditor Inc.", - "Black Duck Software In.c" - ] - }, - { - "fileName": "./lib-source/commons-lang3-3.1-sources.jar", - "SPDXID": "SPDXRef-CommonsLangSrc", - "fileTypes": [ - "ARCHIVE" - ], - "checksums": [ - { - "algorithm": "SHA1", - "checksumValue": "c2b4e1c67a2d28fced849ee1bb76e7391b93f125" - } - ], - "licenseConcluded": "Apache-2.0", - "licenseInfoInFiles": [ - "Apache-2.0" - ], - "copyrightText": "Copyright 2001-2011 The Apache Software Foundation", - "comment": "This file is used by Jena", - "noticeText": "Apache Commons Lang\nCopyright 2001-2011 The Apache Software Foundation\n\nThis product includes software developed by\nThe Apache Software Foundation (http://www.apache.org/).\n\nThis product includes software from the Spring Framework,\nunder the Apache License 2.0 (see: StringUtils.containsWhitespace())", - "fileContributors": [ - "Apache Software Foundation" - ] - }, - { - "fileName": "./lib-source/jena-2.6.3-sources.jar", - "SPDXID": "SPDXRef-JenaLib", - "fileTypes": [ - "ARCHIVE" - ], - "checksums": [ - { - "algorithm": "SHA1", - "checksumValue": "3ab4e1c67a2d28fced849ee1bb76e7391b93f125" - } - ], - "licenseConcluded": "LicenseRef-1", - "licenseInfoInFiles": [ - "LicenseRef-1" - ], - "licenseComments": "This license is used by Jena", - "copyrightText": "(c) Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP", - "comment": "This file belongs to Jena", - "fileContributors": [ - "Apache Software Foundation", - "Hewlett Packard Inc." - ] - }, - { - "fileName": "./package/foo.c", - "SPDXID": "SPDXRef-File", - "fileTypes": [ - "SOURCE" - ], - "checksums": [ - { - "algorithm": "SHA1", - "checksumValue": "d6a770ba38583ed4bb4525bd96e50461655d2758" - }, - { - "algorithm": "MD5", - "checksumValue": "624c1abb3664f4b35547e7c73864ad24" - } - ], - "licenseConcluded": "(LGPL-2.0-only OR LicenseRef-2)", - "licenseInfoInFiles": [ - "GPL-2.0-only", - "LicenseRef-2" - ], - "licenseComments": "The concluded license was taken from the package level that the file was included in.", - "copyrightText": "Copyright 2008-2010 John Smith", - "comment": "The concluded license was taken from the package level that the file was included in.\nThis information was found in the COPYING.txt file in the xyz directory.", - "noticeText": "Copyright (c) 2001 Aaron Lehmann aaroni@vitelus.com\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED �AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "fileContributors": [ - "The Regents of the University of California", - "Modified by Paul Mundt lethal@linux-sh.org", - "IBM Corporation" - ], - "annotations": [ - { - "annotator": "Person: File Commenter", - "annotationDate": "2011-01-29T18:30:22Z", - "annotationType": "OTHER", - "comment": "File level annotation" - } - ] - } - ], - "hasExtractedLicensingInfos": [ - { - "licenseId": "LicenseRef-1", - "extractedText": "/*\n * (c) Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/" - }, - { - "licenseId": "LicenseRef-2", - "extractedText": "This package includes the GRDDL parser developed by Hewlett Packard under the following license:\n� Copyright 2007 Hewlett-Packard Development Company, LP\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: \n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \nRedistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. \nThe name of the author may not be used to endorse or promote products derived from this software without specific prior written permission. \nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." - }, - { - "licenseId": "LicenseRef-4", - "extractedText": "/*\n * (c) Copyright 2009 University of Bristol\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/" - }, - { - "licenseId": "LicenseRef-Beerware-4.2", - "extractedText": "\"THE BEER-WARE LICENSE\" (Revision 42):\nphk@FreeBSD.ORG wrote this file. As long as you retain this notice you\ncan do whatever you want with this stuff. If we meet some day, and you think this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp", - "name": "Beer-Ware License (Version 42)", - "seeAlsos": [ - "http://people.freebsd.org/~phk/" - ], - "comment": "The beerware license has a couple of other standard variants." - }, - { - "licenseId": "LicenseRef-3", - "extractedText": "The CyberNeko Software License, Version 1.0\n\n \n(C) Copyright 2002-2005, Andy Clark. All rights reserved.\n \nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer. \n\n2. Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in\n the documentation and/or other materials provided with the\n distribution.\n\n3. The end-user documentation included with the redistribution,\n if any, must include the following acknowledgment: \n \"This product includes software developed by Andy Clark.\"\n Alternately, this acknowledgment may appear in the software itself,\n if and wherever such third-party acknowledgments normally appear.\n\n4. The names \"CyberNeko\" and \"NekoHTML\" must not be used to endorse\n or promote products derived from this software without prior \n written permission. For written permission, please contact \n andyc@cyberneko.net.\n\n5. Products derived from this software may not be called \"CyberNeko\",\n nor may \"CyberNeko\" appear in their name, without prior written\n permission of the author.\n\nTHIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED\nWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS\nBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, \nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \nOF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR \nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \nWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \nOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, \nEVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.", - "name": "CyberNeko License", - "seeAlsos": [ - "http://people.apache.org/~andyc/neko/LICENSE", - "http://justasample.url.com" - ], - "comment": "This is tye CyperNeko License" - } + { "SPDXID": "SPDXRef-Package-app", "name": "app", "versionInfo": "1.2.3", + "downloadLocation": "NOASSERTION", "filesAnalyzed": false } ], "relationships": [ - { - "spdxElementId": "SPDXRef-DOCUMENT", - "relatedSpdxElement": "SPDXRef-Package", - "relationshipType": "CONTAINS", - "comment": "A relationship comment" - }, - { - "spdxElementId": "SPDXRef-DOCUMENT", - "relatedSpdxElement": "DocumentRef-spdx-tool-1.2:SPDXRef-ToolsElement", - "relationshipType": "COPY_OF" - }, - { - "spdxElementId": "SPDXRef-DOCUMENT", - "relatedSpdxElement": "SPDXRef-File", - "relationshipType": "DESCRIBES" - }, - { - "spdxElementId": "SPDXRef-DOCUMENT", - "relatedSpdxElement": "SPDXRef-Package", - "relationshipType": "DESCRIBES" - }, - { - "spdxElementId": "SPDXRef-Package", - "relatedSpdxElement": "SPDXRef-JenaLib", - "relationshipType": "CONTAINS" - }, - { - "spdxElementId": "SPDXRef-Package", - "relatedSpdxElement": "SPDXRef-Saxon", - "relationshipType": "DYNAMIC_LINK" - }, - { - "spdxElementId": "SPDXRef-CommonsLangSrc", - "relatedSpdxElement": "NOASSERTION", - "relationshipType": "GENERATED_FROM" - }, - { - "spdxElementId": "SPDXRef-JenaLib", - "relatedSpdxElement": "SPDXRef-Package", - "relationshipType": "CONTAINS" - }, - { - "spdxElementId": "SPDXRef-File", - "relatedSpdxElement": "SPDXRef-fromDoap-0", - "relationshipType": "GENERATED_FROM" - } - ], - "annotations": [ - { - "annotator": "Person: Jane Doe ()", - "annotationDate": "2010-01-29T18:30:22Z", - "annotationType": "OTHER", - "comment": "Document level annotation" - }, - { - "annotator": "Person: Joe Reviewer", - "annotationDate": "2010-02-10T00:00:00Z", - "annotationType": "REVIEW", - "comment": "This is just an example. Some of the non-standard licenses look like they are actually BSD 3 clause licenses" - }, - { - "annotator": "Person: Suzanne Reviewer", - "annotationDate": "2011-03-13T00:00:00Z", - "annotationType": "REVIEW", - "comment": "Another example reviewer." - } - ], - "snippets": [ - { - "SPDXID": "SPDXRef-Snippet", - "snippetFromFile": "SPDXRef-DoapSource", - "ranges": [ - { - "startPointer": { - "offset": 310, - "reference": "SPDXRef-DoapSource" - }, - "endPointer": { - "offset": 420, - "reference": "SPDXRef-DoapSource" - } - }, - { - "startPointer": { - "lineNumber": 5, - "reference": "SPDXRef-DoapSource" - }, - "endPointer": { - "lineNumber": 23, - "reference": "SPDXRef-DoapSource" - } - } - ], - "licenseConcluded": "GPL-2.0-only", - "licenseInfoInSnippets": [ - "GPL-2.0-only" - ], - "licenseComments": "The concluded license was taken from package xyz, from which the snippet was copied into the current file. The concluded license information was found in the COPYING.txt file in package xyz.", - "copyrightText": "Copyright 2008-2010 John Smith", - "comment": "This snippet was identified as significant and highlighted in this Apache-2.0 file, when a commercial scanner identified it as being derived from file foo.c in package xyz which is licensed under GPL-2.0.", - "name": "from linux kernel" - } + { "spdxElementId": "SPDXRef-DOCUMENT", "relatedSpdxElement": "SPDXRef-Package-app", + "relationshipType": "DESCRIBES" } ] -} \ No newline at end of file +} diff --git a/internal/sbom/sbom.go b/internal/sbom/sbom.go index 10fbd7df6..2bb810ace 100644 --- a/internal/sbom/sbom.go +++ b/internal/sbom/sbom.go @@ -75,6 +75,13 @@ func ProcessSBOMFile(file string) (*SBOMData, error) { if err != nil { return nil, err } + return ProcessSBOM(content) +} + +// ProcessSBOM is ProcessSBOMFile for content already in memory, so a caller +// that must also fingerprint the file can do both from one read rather than +// risk the two describing different bytes. +func ProcessSBOM(content []byte) (*SBOMData, error) { return processSBOM(content) } From 6df0f6888eeb67f2581db9837f09f5d7ef923685 Mon Sep 17 00:00:00 2001 From: Alex Kantor Date: Fri, 11 Sep 2026 20:51:49 +0100 Subject: [PATCH 3/8] fix(attest-sbom): correct the error goldens and bound the file read The six error goldens carried a "[kosli attest sbom flow=... trail=...]" prefix that the test harness never produces. The prefix comes from enrichError, which is only called from innerMain; the suite calls root.ExecuteC() directly, so the output is the bare message. The prefix was added last round after checking against the built binary, which does go through innerMain -- the wrong execution path to verify against. The size guard stat'd the path and then opened it again to read, so the bound it promised did not hold for a file still being written or a symlink repointed between the two calls. It is now one handle: stat it for IsRegular, then read through an io.LimitReader capped one byte past the limit and reject on the length actually read. The size rule lives in one place and the error message names the limit rather than an observed size that may already be stale. Also: - annotate no longer returns an error it cannot produce, now that the reserved-key rejection runs in PreRunE. - processSBOM is renamed ProcessSBOM, removing a pass-through with one caller. - attestSbomLongDesc names --attachments as unusable here, which the one-file rule implied but never said. - A file of exactly the limit is now tested from the accepting side, so the comparison is pinned as > rather than >=. Co-Authored-By: Claude Opus 5 --- cmd/kosli/attestSbom.go | 48 ++++++++++++++++++++++-------------- cmd/kosli/attestSbom_test.go | 40 ++++++++++++++++++------------ internal/sbom/sbom.go | 4 --- 3 files changed, 54 insertions(+), 38 deletions(-) diff --git a/cmd/kosli/attestSbom.go b/cmd/kosli/attestSbom.go index 607b548f2..0223fed51 100644 --- a/cmd/kosli/attestSbom.go +++ b/cmd/kosli/attestSbom.go @@ -58,6 +58,9 @@ Kosli reads the format, the creation time, the tools that produced it, the subject it describes and how many packages it lists. Nothing is checked against the artifact; the SBOM is recorded as reported. +^--attachments^ cannot be used with this command, for the same reason: a second +attachment would trigger compression. + The format and the file checksum are also added as the ^sbom_format^ and ^sbom_sha256^ annotations. ` + attestationBindingDesc + ` @@ -211,32 +214,39 @@ func (o *attestSbomOptions) run(args []string) error { return wrapAttestationError(err) } -// loadSbom checks the size before reading, because reading happens in one go -// and a large file would otherwise be pulled into memory before the friendlier -// error could be produced. func (o *attestSbomOptions) loadSbom() error { - info, err := os.Stat(o.sbomFilePath) + file, err := os.Open(o.sbomFilePath) if err != nil { return fmt.Errorf("failed to read SBOM file [%s]: %s", o.sbomFilePath, err) } - // A directory or a pipe reports size 0 and would walk past the size check, - // then be read unbounded. + defer func() { _ = file.Close() }() + + // Stat the open handle rather than the path, so the bytes measured are the + // bytes about to be read: a file still being written, or a symlink + // repointed in between, would otherwise walk past a stat on the path. + info, err := file.Stat() + if err != nil { + return fmt.Errorf("failed to read SBOM file [%s]: %s", o.sbomFilePath, err) + } + // Reading a directory fails with a message about file descriptors, and a + // fifo blocks until something writes to it. Neither is worth reaching. if !info.Mode().IsRegular() { return fmt.Errorf("SBOM file [%s] is not a regular file", o.sbomFilePath) } - if info.Size() > maxSbomFileBytes { - return fmt.Errorf( - "SBOM file [%s] is %d bytes, above the %d byte limit for an SBOM attestation", - o.sbomFilePath, info.Size(), maxSbomFileBytes, - ) - } - // One read for both, so the recorded fingerprint always describes the bytes - // the recorded summary was taken from. - content, err := os.ReadFile(o.sbomFilePath) + // the recorded summary was taken from. Reading one byte past the limit is + // what makes the limit a bound on memory rather than a claim about a size + // measured earlier: a file a build is still writing grows after the stat. + content, err := io.ReadAll(io.LimitReader(file, maxSbomFileBytes+1)) if err != nil { return fmt.Errorf("failed to read SBOM file [%s]: %s", o.sbomFilePath, err) } + if int64(len(content)) > maxSbomFileBytes { + return fmt.Errorf( + "SBOM file [%s] is above the %d byte limit for an SBOM attestation", + o.sbomFilePath, maxSbomFileBytes, + ) + } fingerprint := fmt.Sprintf("%x", sha256.Sum256(content)) data, err := sbom.ProcessSBOM(content) @@ -249,7 +259,8 @@ func (o *attestSbomOptions) loadSbom() error { OriginalFingerprint: fingerprint, Document: data.Document, } - return o.annotate(data.Format, fingerprint) + o.annotate(data.Format, fingerprint) + return nil } // rejectReservedAnnotations runs in PreRunE: it needs nothing from the file, so @@ -266,11 +277,12 @@ func (o *attestSbomOptions) rejectReservedAnnotations() error { return nil } -func (o *attestSbomOptions) annotate(format, fingerprint string) error { +// annotate records what the file said about itself where a reader sees it on +// the trail page. The same two values are carried inside attestation_data. +func (o *attestSbomOptions) annotate(format, fingerprint string) { if o.payload.Annotations == nil { o.payload.Annotations = map[string]string{} } o.payload.Annotations[sbomFormatAnnotation] = format o.payload.Annotations[sbomSha256Annotation] = fingerprint - return nil } diff --git a/cmd/kosli/attestSbom_test.go b/cmd/kosli/attestSbom_test.go index aec616228..b3482b702 100644 --- a/cmd/kosli/attestSbom_test.go +++ b/cmd/kosli/attestSbom_test.go @@ -32,18 +32,17 @@ func (suite *AttestSbomCommandTestSuite) SetupTest() { BeginTrail(suite.trailName, suite.flowName, "", suite.T()) } -// oversizeSbom makes a file past the size ceiling without allocating it. The -// guard only stats the file, so the content is never read. -func (suite *AttestSbomCommandTestSuite) oversizeSbom() (string, int64) { - path := filepath.Join(suite.T().TempDir(), "oversize.json") - size := int64(maxSbomFileBytes + 1) +// sizedSbom makes a file of the given size without allocating it: the bytes it +// reads back are zeros the filesystem never stored. +func (suite *AttestSbomCommandTestSuite) sizedSbom(name string, size int64) string { + path := filepath.Join(suite.T().TempDir(), name) if err := os.WriteFile(path, nil, 0644); err != nil { suite.T().Fatal(err) } if err := os.Truncate(path, size); err != nil { suite.T().Fatal(err) } - return path, size + return path } // The dry-run cases are what prove the payload this command builds. They need a @@ -75,45 +74,54 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomRejectsBadInput() { wantError: true, name: "fails when --sbom-file is missing", cmd: fmt.Sprintf("attest sbom --name my-sbom %s", suite.defaultKosliArguments), - golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] required flag(s) \"sbom-file\" not set\n", + golden: "Error: required flag(s) \"sbom-file\" not set\n", }, { wantError: true, name: "fails when --attachments is used too, because two attachments would be compressed", cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --attachments testdata/sbom/spdx.json %s", suite.defaultKosliArguments), - golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] only one of --sbom-file, --attachments is allowed\n", + golden: "Error: only one of --sbom-file, --attachments is allowed\n", }, { wantError: true, name: "fails when the file is not an SBOM, naming the file", cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/not-an-sbom.json --dry-run %s", suite.defaultKosliArguments), - golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] failed to parse SBOM file [testdata/sbom/not-an-sbom.json]: not a CycloneDX SBOM: bomFormat is \"\", expected \"CycloneDX\"\n", + golden: "Error: failed to parse SBOM file [testdata/sbom/not-an-sbom.json]: not a CycloneDX SBOM: bomFormat is \"\", expected \"CycloneDX\"\n", }, { wantError: true, name: "fails when a reserved annotation key is supplied", cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --annotate sbom_format=mine --dry-run %s", suite.defaultKosliArguments), - golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] annotation key 'sbom_format' is set by this command from the SBOM file and cannot be provided with --annotate\n", + golden: "Error: annotation key 'sbom_format' is set by this command from the SBOM file and cannot be provided with --annotate\n", }, { wantError: true, name: "fails when the path is a directory rather than a file", cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom --dry-run %s", suite.defaultKosliArguments), - golden: "Error: [kosli attest sbom flow=attest-sbom trail=test-123] SBOM file [testdata/sbom] is not a regular file\n", + golden: "Error: SBOM file [testdata/sbom] is not a regular file\n", }, } runTestCmd(suite.T(), tests) } -func (suite *AttestSbomCommandTestSuite) TestAttestSbomRejectsAnOversizeFileBeforeReadingIt() { - path, size := suite.oversizeSbom() +func (suite *AttestSbomCommandTestSuite) TestAttestSbomSizeLimit() { + over := suite.sizedSbom("oversize.json", maxSbomFileBytes+1) + atLimit := suite.sizedSbom("at-limit.json", maxSbomFileBytes) runTestCmd(suite.T(), []cmdTestCase{ { wantError: true, - name: "fails locally with the actual size, rather than a bare 413 from the server", - cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file %s --dry-run %s", path, suite.defaultKosliArguments), - golden: fmt.Sprintf("Error: [kosli attest sbom flow=attest-sbom trail=test-123] SBOM file [%s] is %d bytes, above the %d byte limit for an SBOM attestation\n", path, size, maxSbomFileBytes), + name: "fails locally on an oversize file, rather than with a bare 413 from the server", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file %s --dry-run %s", over, suite.defaultKosliArguments), + golden: fmt.Sprintf("Error: SBOM file [%s] is above the %d byte limit for an SBOM attestation\n", over, maxSbomFileBytes), + }, + { + // Reaching the parser is the point: it proves the limit is the + // largest accepted size and not the smallest rejected one. + wantError: true, + name: "a file of exactly the limit gets past the size guard", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file %s --dry-run %s", atLimit, suite.defaultKosliArguments), + goldenRegex: `failed to parse SBOM file`, }, }) } diff --git a/internal/sbom/sbom.go b/internal/sbom/sbom.go index 2bb810ace..3941b1c9e 100644 --- a/internal/sbom/sbom.go +++ b/internal/sbom/sbom.go @@ -82,10 +82,6 @@ func ProcessSBOMFile(file string) (*SBOMData, error) { // that must also fingerprint the file can do both from one read rather than // risk the two describing different bytes. func ProcessSBOM(content []byte) (*SBOMData, error) { - return processSBOM(content) -} - -func processSBOM(content []byte) (*SBOMData, error) { if bytes.HasPrefix(content, gzipMagic) { return nil, fmt.Errorf("the file is gzip compressed; supply the uncompressed SBOM") } From 161db6072e479381766a6f690b5c26994be395da Mon Sep 17 00:00:00 2001 From: Alex Kantor Date: Fri, 11 Sep 2026 20:57:06 +0100 Subject: [PATCH 4/8] test(attest-sbom): skip the round-trip until staging knows the type The suite runs against the current staging server image, which has no sbom system attestation type, so the POST comes back "System attestation type 'sbom' does not exist" and the job is red for a reason no change in this repo can fix. The skip states the condition instead. This is the only test that exercises the command against a real server, so un-skipping it is a precondition for merging, not optional cleanup. Co-Authored-By: Claude Opus 5 --- cmd/kosli/attestSbom_test.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cmd/kosli/attestSbom_test.go b/cmd/kosli/attestSbom_test.go index b3482b702..a9ac5232d 100644 --- a/cmd/kosli/attestSbom_test.go +++ b/cmd/kosli/attestSbom_test.go @@ -126,9 +126,13 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomSizeLimit() { }) } -// Reporting to a real server needs one that knows the sbom type, which arrives -// with kosli-dev/server#6863. func (suite *AttestSbomCommandTestSuite) TestAttestSbomRoundTrip() { + // The suite runs against the current staging server image, which does not + // yet carry the sbom system attestation type, so the POST comes back + // "System attestation type 'sbom' does not exist". Un-skip once staging has + // it; this is the only test that proves the command end to end. + suite.T().Skip("staging server does not yet know the sbom attestation type") + runTestCmd(suite.T(), []cmdTestCase{ { name: "reports a CycloneDX SBOM against a trail", From 786b89e866910b4953e81cf45a03007cd4f20793 Mon Sep 17 00:00:00 2001 From: Alex Kantor Date: Fri, 11 Sep 2026 21:16:24 +0100 Subject: [PATCH 5/8] fix(attest-sbom): assert the checksum the command promises The goldens matched the fingerprint against [a-f0-9]{64}, which is true of the digest of anything: the tarred bundle, the payload, a copy with the BOM stripped. The command's whole promise is that the recorded checksum is the checksum of the file the customer supplied, and a test on the shape of a hash cannot check that. Both goldens now pin the fixture's real digest. Hashing different bytes turns them red; under the old regex it did not. Nothing tested the reason the command refuses a second attachment. One attachment is uploaded as it is; two are tarred and gzipped while sbom_sha256 still describes the uncompressed original, and nothing downstream fails. The dry-run goldens cannot see it because a multipart request logs only its JSON fields. There is now a direct test, which also asserts that two attachments ARE packaged, so it cannot pass by packaging having stopped altogether. Also: - Five error cases carried --dry-run that did nothing: each fails before the request is built. It was not only noise. --dry-run is the mode where those command lines exit 0 for a real user, so wantError held only because the harness skips innerMain. - A directory now says so, rather than reporting the generic not-a-regular-file message a user then has to interpret. It is the case reached by accident, when tab-completion stops a path short. - The skip on the round-trip test names the server change it waits on, so it is greppable and shows up in go test -v output. Co-Authored-By: Claude Opus 5 --- cmd/kosli/attestSbom.go | 8 +++++-- cmd/kosli/attestSbom_test.go | 41 ++++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/cmd/kosli/attestSbom.go b/cmd/kosli/attestSbom.go index 0223fed51..959df3ecb 100644 --- a/cmd/kosli/attestSbom.go +++ b/cmd/kosli/attestSbom.go @@ -228,8 +228,12 @@ func (o *attestSbomOptions) loadSbom() error { if err != nil { return fmt.Errorf("failed to read SBOM file [%s]: %s", o.sbomFilePath, err) } - // Reading a directory fails with a message about file descriptors, and a - // fifo blocks until something writes to it. Neither is worth reaching. + // A directory is what a user hits when tab-completion stops a path short, + // so it gets its own advice. Reading one fails with a message about file + // descriptors, and a fifo blocks until something writes to it. + if info.IsDir() { + return fmt.Errorf("SBOM file [%s] is a directory; supply the SBOM file itself", o.sbomFilePath) + } if !info.Mode().IsRegular() { return fmt.Errorf("SBOM file [%s] is not a regular file", o.sbomFilePath) } diff --git a/cmd/kosli/attestSbom_test.go b/cmd/kosli/attestSbom_test.go index a9ac5232d..125cb80d5 100644 --- a/cmd/kosli/attestSbom_test.go +++ b/cmd/kosli/attestSbom_test.go @@ -6,6 +6,7 @@ import ( "path/filepath" "testing" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" ) @@ -53,12 +54,12 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomBuildsTheRightRequest() { { name: "posts to the system endpoint with type_name sbom and the CycloneDX summary", cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --dry-run %s", suite.defaultKosliArguments), - goldenRegex: `(?s)trail/test-123/system.*"type_name": "sbom".*"format": "cyclonedx-1\.6".*"original_fingerprint": "[a-f0-9]{64}".*"package_count": 1`, + goldenRegex: `(?s)trail/test-123/system.*"type_name": "sbom".*"format": "cyclonedx-1\.6".*"original_fingerprint": "db09ef115d88e48a5ef553b21a88ccdc15b3df700e0b7c3736e2ef1024d26d9c".*"package_count": 1`, }, { name: "records the format and the file checksum as annotations", cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --dry-run %s", suite.defaultKosliArguments), - goldenRegex: `(?s)"sbom_format": "cyclonedx-1\.6".*"sbom_sha256": "[a-f0-9]{64}"`, + goldenRegex: `(?s)"sbom_format": "cyclonedx-1\.6".*"sbom_sha256": "db09ef115d88e48a5ef553b21a88ccdc15b3df700e0b7c3736e2ef1024d26d9c"`, }, { name: "reads SPDX as well, and reports the version the file declares", @@ -85,20 +86,20 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomRejectsBadInput() { { wantError: true, name: "fails when the file is not an SBOM, naming the file", - cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/not-an-sbom.json --dry-run %s", suite.defaultKosliArguments), + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/not-an-sbom.json %s", suite.defaultKosliArguments), golden: "Error: failed to parse SBOM file [testdata/sbom/not-an-sbom.json]: not a CycloneDX SBOM: bomFormat is \"\", expected \"CycloneDX\"\n", }, { wantError: true, name: "fails when a reserved annotation key is supplied", - cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --annotate sbom_format=mine --dry-run %s", suite.defaultKosliArguments), + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --annotate sbom_format=mine %s", suite.defaultKosliArguments), golden: "Error: annotation key 'sbom_format' is set by this command from the SBOM file and cannot be provided with --annotate\n", }, { wantError: true, name: "fails when the path is a directory rather than a file", - cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom --dry-run %s", suite.defaultKosliArguments), - golden: "Error: SBOM file [testdata/sbom] is not a regular file\n", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom %s", suite.defaultKosliArguments), + golden: "Error: SBOM file [testdata/sbom] is a directory; supply the SBOM file itself\n", }, } runTestCmd(suite.T(), tests) @@ -112,7 +113,7 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomSizeLimit() { { wantError: true, name: "fails locally on an oversize file, rather than with a bare 413 from the server", - cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file %s --dry-run %s", over, suite.defaultKosliArguments), + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file %s %s", over, suite.defaultKosliArguments), golden: fmt.Sprintf("Error: SBOM file [%s] is above the %d byte limit for an SBOM attestation\n", over, maxSbomFileBytes), }, { @@ -120,7 +121,7 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomSizeLimit() { // largest accepted size and not the smallest rejected one. wantError: true, name: "a file of exactly the limit gets past the size guard", - cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file %s --dry-run %s", atLimit, suite.defaultKosliArguments), + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file %s %s", atLimit, suite.defaultKosliArguments), goldenRegex: `failed to parse SBOM file`, }, }) @@ -131,7 +132,7 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomRoundTrip() { // yet carry the sbom system attestation type, so the POST comes back // "System attestation type 'sbom' does not exist". Un-skip once staging has // it; this is the only test that proves the command end to end. - suite.T().Skip("staging server does not yet know the sbom attestation type") + suite.T().Skip("staging server does not yet know the sbom attestation type (kosli-dev/server#6863)") runTestCmd(suite.T(), []cmdTestCase{ { @@ -142,6 +143,28 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomRoundTrip() { }) } +// The recorded checksum is only verifiable by hand while the file goes up as +// the customer supplied it. Two or more attachments are tarred and gzipped, and +// nothing downstream fails when that happens -- sbom_sha256 simply stops +// describing what was uploaded. The dry-run goldens cannot see this: a multipart +// request logs only its JSON fields. +func (suite *AttestSbomCommandTestSuite) TestSbomIsUploadedUncompressed() { + sbom := "testdata/sbom/cyclonedx.json" + + path, cleanupNeeded, err := getPathOfEvidenceFileToUpload([]string{sbom}) + require.NoError(suite.T(), err) + require.Equal(suite.T(), sbom, path, "the SBOM itself must be uploaded, not a repackaged copy") + require.False(suite.T(), cleanupNeeded, "a tarred SBOM no longer matches the checksum recorded for it") + + // Without this, the assertions above would still pass if packaging stopped + // happening at all, which would say nothing about the one-file case. + packed, cleanupNeeded, err := getPathOfEvidenceFileToUpload([]string{sbom, "testdata/sbom/spdx.json"}) + require.NoError(suite.T(), err) + require.True(suite.T(), cleanupNeeded, "two attachments are expected to be packaged") + require.NotEqual(suite.T(), sbom, packed) + suite.T().Cleanup(func() { _ = os.Remove(packed) }) +} + func TestAttestSbomCommandTestSuite(t *testing.T) { suite.Run(t, new(AttestSbomCommandTestSuite)) } From cf4dbea40d5646ae80f92ff64970a6b2ca25d0f8 Mon Sep 17 00:00:00 2001 From: Alex Kantor Date: Sat, 12 Sep 2026 16:45:55 +0100 Subject: [PATCH 6/8] fix(attest-sbom): restore the gzip test and cover the annotation merge The gzip fixture and the test that used it were deleted while reworking this file two rounds ago. internal/sbom still tests that a gzipped file is refused, but nothing tested that the command reports it, which is the message a user actually sees. Both are back, along with a case for more than one attachment: the existing test passed a single --attachments, so the repeated form was never exercised. Nothing asserted that a caller's own --annotate keys survive alongside the two derived from the file. Replacing the merge in annotate with a fresh map assignment passed every test in the file while silently dropping them. Two cases now cover it, kept separate because map key order in the payload is not stable. spec.json had no attest sbom entry while the coverage file did, so audit.py refused to run at all. Rather than write the entry by hand, bootstrap.py now knows the fixture for --sbom-file, so regenerating produces it. The entry records baseline_ok true because it was generated against a server carrying the sbom type, which is the state at merge. Also: - annotate says it must run after CommonAttestationOptions.run, which assigns Annotations wholesale. The nil guard made the order look optional. - The size comment no longer implies the 10MB limit is accounted for. --user-data rides in the same body and can pass the ceiling on its own. - The help text names gzip, which is what the parser detects. A zip is refused by the generic unrecognised-file message. - TestSbomIsUploadedUncompressed moved out of the suite, so it no longer needs a server to assert local logic, and registers its cleanup before the assertions that can abort. Co-Authored-By: Claude Opus 5 --- cmd/kosli/attestSbom.go | 14 +- cmd/kosli/attestSbom_test.go | 46 +- cmd/kosli/testdata/sbom/compressed.json.gz | Bin 0 -> 7931 bytes hack/empty-flag-audit/bootstrap.py | 1 + hack/empty-flag-audit/results.tsv | 25 + hack/empty-flag-audit/spec.json | 9408 ++++++++++---------- 6 files changed, 4827 insertions(+), 4667 deletions(-) create mode 100644 cmd/kosli/testdata/sbom/compressed.json.gz diff --git a/cmd/kosli/attestSbom.go b/cmd/kosli/attestSbom.go index 959df3ecb..62056985b 100644 --- a/cmd/kosli/attestSbom.go +++ b/cmd/kosli/attestSbom.go @@ -15,7 +15,10 @@ import ( // The API rejects a request body over 10MB, and the JSON payload is counted // alongside the file, so this leaves room for it rather than sitting on the -// limit. Lifting the ceiling needs direct-to-S3 upload, tracked separately. +// limit. The margin is a guess at a small payload, not a bound: --user-data +// embeds an arbitrary JSON file in the same body and can push the total past +// 10MB on its own. Lifting the ceiling needs direct-to-S3 upload, tracked +// separately. const maxSbomFileBytes = 9 * 1024 * 1024 // Both are also carried inside attestation_data, where the server's schema can @@ -51,8 +54,8 @@ SPDX (JSON and tag-value) are supported. The file is uploaded as it is, so the recorded checksum is the checksum of the file you supplied and you can verify it by hand. It must be a single file: it is -not compressed, and an already-compressed file is rejected, because the format -and the summary below are read from it. +not compressed, and a gzipped file is rejected, because the format and the +summary below are read from it. Kosli reads the format, the creation time, the tools that produced it, the subject it describes and how many packages it lists. Nothing is checked against @@ -283,6 +286,11 @@ func (o *attestSbomOptions) rejectReservedAnnotations() error { // annotate records what the file said about itself where a reader sees it on // the trail page. The same two values are carried inside attestation_data. +// +// It must run after CommonAttestationOptions.run, which assigns +// payload.Annotations wholesale from the --annotate flag. Called before that, +// both keys are silently discarded. The nil guard below reads as though the +// order does not matter; it does. func (o *attestSbomOptions) annotate(format, fingerprint string) { if o.payload.Annotations == nil { o.payload.Annotations = map[string]string{} diff --git a/cmd/kosli/attestSbom_test.go b/cmd/kosli/attestSbom_test.go index 125cb80d5..43a306e9c 100644 --- a/cmd/kosli/attestSbom_test.go +++ b/cmd/kosli/attestSbom_test.go @@ -61,6 +61,16 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomBuildsTheRightRequest() { cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --dry-run %s", suite.defaultKosliArguments), goldenRegex: `(?s)"sbom_format": "cyclonedx-1\.6".*"sbom_sha256": "db09ef115d88e48a5ef553b21a88ccdc15b3df700e0b7c3736e2ef1024d26d9c"`, }, + { + name: "keeps the caller's own annotations alongside the two it derives", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --annotate team=platform --dry-run %s", suite.defaultKosliArguments), + goldenRegex: `"team": "platform"`, + }, + { + name: "still derives its own annotations when the caller supplies one", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --annotate team=platform --dry-run %s", suite.defaultKosliArguments), + goldenRegex: `"sbom_format": "cyclonedx-1\.6"`, + }, { name: "reads SPDX as well, and reports the version the file declares", cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/spdx.json --dry-run %s", suite.defaultKosliArguments), @@ -83,6 +93,20 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomRejectsBadInput() { cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --attachments testdata/sbom/spdx.json %s", suite.defaultKosliArguments), golden: "Error: only one of --sbom-file, --attachments is allowed\n", }, + { + // Restored after being dropped in review: the command wraps the + // parser's message, and only this exercises that wrapping. + wantError: true, + name: "fails when the file is gzipped, because the format is read from it", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/compressed.json.gz %s", suite.defaultKosliArguments), + golden: "Error: failed to parse SBOM file [testdata/sbom/compressed.json.gz]: the file is gzip compressed; supply the uncompressed SBOM\n", + }, + { + wantError: true, + name: "fails when more than one attachment is given, not just one", + cmd: fmt.Sprintf("attest sbom --name my-sbom --sbom-file testdata/sbom/cyclonedx.json --attachments testdata/sbom/spdx.json --attachments testdata/sbom/not-an-sbom.json %s", suite.defaultKosliArguments), + golden: "Error: only one of --sbom-file, --attachments is allowed\n", + }, { wantError: true, name: "fails when the file is not an SBOM, naming the file", @@ -148,21 +172,27 @@ func (suite *AttestSbomCommandTestSuite) TestAttestSbomRoundTrip() { // nothing downstream fails when that happens -- sbom_sha256 simply stops // describing what was uploaded. The dry-run goldens cannot see this: a multipart // request logs only its JSON fields. -func (suite *AttestSbomCommandTestSuite) TestSbomIsUploadedUncompressed() { +// +// Outside the suite on purpose. It asserts pure local logic, so it should still +// report when no server is running, which is when you most want to know the +// invariant holds. +func TestSbomIsUploadedUncompressed(t *testing.T) { sbom := "testdata/sbom/cyclonedx.json" path, cleanupNeeded, err := getPathOfEvidenceFileToUpload([]string{sbom}) - require.NoError(suite.T(), err) - require.Equal(suite.T(), sbom, path, "the SBOM itself must be uploaded, not a repackaged copy") - require.False(suite.T(), cleanupNeeded, "a tarred SBOM no longer matches the checksum recorded for it") + require.NoError(t, err) + require.Equal(t, sbom, path, "the SBOM itself must be uploaded, not a repackaged copy") + require.False(t, cleanupNeeded, "a tarred SBOM no longer matches the checksum recorded for it") // Without this, the assertions above would still pass if packaging stopped // happening at all, which would say nothing about the one-file case. packed, cleanupNeeded, err := getPathOfEvidenceFileToUpload([]string{sbom, "testdata/sbom/spdx.json"}) - require.NoError(suite.T(), err) - require.True(suite.T(), cleanupNeeded, "two attachments are expected to be packaged") - require.NotEqual(suite.T(), sbom, packed) - suite.T().Cleanup(func() { _ = os.Remove(packed) }) + // Registered before the assertions, so a failure between here and the end + // still removes the tar. + t.Cleanup(func() { _ = os.Remove(packed) }) + require.NoError(t, err) + require.True(t, cleanupNeeded, "two attachments are expected to be packaged") + require.NotEqual(t, sbom, packed) } func TestAttestSbomCommandTestSuite(t *testing.T) { diff --git a/cmd/kosli/testdata/sbom/compressed.json.gz b/cmd/kosli/testdata/sbom/compressed.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..f4943e11cc330cdd7fa3814c074221c3ba7aec1b GIT binary patch literal 7931 zcmVGs1>E&Hmppa<6!Uj z&fbA9{so`mn|&AuyS)=9ID;Z7(xX&)l+~#s{SJRr{Z~o)U6N=tyn4HhcG=DFg}03p z*ve*)-~Jo__Dl9VyXleyIJ%Q0QRq2)T+nag1$s`}8OmM&SG1>|wVgEG_WsfhxN? zXu;K$nqI9|<*L6>oQmS=HQiBaa%~|!6vp`Tx1XL~(W;*=z^PRhHC3&unj`B@uyAGg z7-)K><^>B)_xxI=B6(F^Q-X!GkW^pNeZ5vuY8B7*VV$Lg37`J>rTpz5=|a#dkD(WQ zqVME=dklTD+2Zzc9eSX^AMeZ3_Q1lU8wH{2_WNY_`?qhw8SFF)zJk#e*Zzm_>CgM7 z1^0aA_kUnlxTZfw1?7a6d*>e-aOLt$K_kFld=Hna zy|9djAa+7j-NTMw^Yuj6{8Ln!aDB1@(7@~KlJux)+M}$hixAC;FLXezs6tMsVJj+%QFuDHkDL^6eZ)WdruM zK6nCN;X1pZS}Fc6z|iZnUUALS(vOXcr$k5hO$rB-%BdGNA~zl$?M`&CuTtpG$MMT_ z8TOv*zc$~_Q&+JiUuj?LS+urIO>*XAt=C=c-RERyncC)c(r-`0-qMZRdwVK{BXhX7 zCyj>JZR{L#xbizN7yK^H`(si$zr3}=-qSY!J{rC`9fQVj=f)21J6ZF-*}ut zaZ4ILuT@LwFU0wSj=Xa>1HBioB)|JqeYxmYztcY09oTbsaB$|s<4dex?2DdwO8q#P zuGQi7>G(439S3hu=ix-ZTFNSN&DJ644%fZ63a%4meLi^Cq~a-SactFBy@P)p99*@( zdAasZgXh-KY{`R}GThpxym~RCgQt#Hpp&Q-* z;W{=)_;h>)IlVUZySDne{Kr2YZgBO_0FyT9-)-{ZvD#vu=Qd=C~R*!A-FO%i`|U_sxqd;TeZmA*>3 zG}1^Hh3>oap2z-&lK8zQtUQsHQ8n{KhT5|%;^IcU@bhoP27Ztx!7XdKNN zxq2n2tJ-4WtF=YNtNOrw9lxS3DsH9jNQ(2frYlo&al%DKuRHa{Lh*e`ss)PfDH1Sr zEvUGX?C6dp*J_%lE*7d2IE$(-RRagefa_^BU3P2k-&%+!D) zTGgr4m4zS3j;82!y(R^fisEUiTvK#e)&sSs>vFwbas9=@aVrZ@QPr&lfh;dP&xdUU zf$vCFwc)tSWcC9DCfMvgvmk!OZSp`A z>)|PJyjAe12tLApzr%Gz$rSib5;ogiH$7_AkYa7!sMAq5b7|qst%a{#k zlbQYl*4CJ=N6T?5ni}nXe-s(?eRH|Rb(~+qM$0yBh~|;xnEJuHRKDjj=x1_)h}|7s=yk^^HwmKu-n%q_!Hkv=xq(Tg<1}Jd1tvHjMzDs9J;#VXmMwLRa@%Ed zAp2@I*1)_ZFOHCrl3cC%U}<-Z*fF&Teh-65V``g2KK9cY=l5b=ww2}b$E0zzfh{_n z=-TUykCqB75*WeDa+~X6oyrth#NEBTxoSg$HEf*jXz8jxFdJaHu!oEZciOVwSsme; zs%^r4H|uPC_&(}&hDWa(T^!Tj`pw4CSG35Zb+x4)t1Y43V1 z;{fbW3MRmml-0`ZoR+R>tXvv%w)9PnWaTOrpTGU)BeTB%%je7snPLz3`n2Ubg>}KT zUdXTML=otUuW@*U??6wdT@M*C%0$sXFZ#~y7%)y>16>~B-jx^A{A-jEGBy|VlIt`Z zXXz_o56yJ^bU&5lI7Y@uGC2A3{>fE`xDHW|ksU|C$V>Lp>}P8NJ(B*w9=6V8&1BF; zxf_=kvZ;P#sUy-M$UObLgL#jz#ueHotzneOhF`;M5bpyPegFmvEE(3`r1f2Wz>It^ zxW`q*Wr}vn*9W>lSuIO)-}u1TXCPnLe{+@Kx|yx@!6u^{8Zc4BWZ^J+w1jP@~F zet({w`gAR>Nk`pqSrh?F z%2tVYcYg&uuw8Wq41a~=g{G;?Uf4@|-Qm_U&oGu8Stj@{{AKcneRRQInavDr)5rg( zSwXgLd%nVbf?UXUPlzdi2Um_G8;~Weh1nnK%K>bdcA_`f$JH*bZwfNFSPHDMV}qYc zcm2le_F@09=NQLi*V$-~9eL%jHS7Va5|oie_NQH6a{mF@4tKuEWNd8=uxsrIx`qr` zPH3HIUtP$uH)9oILWKVZ8-HW|G)6pJLuMzFO@UuHqVHtap1ALVFU257+!x12Sl7;; z4-U=Dww}VN(*F;{NAL;2-TwYoCz_VY1Z=`L&kTn;Hu$N8@`3o%K42CvUKv#~QBF+JeeD;w<5n%gVKJg=n}*j0>QG3?c3_-4&VOY|Ag_nX@_)_AXDGJFG@l86JrcYdcX?lW8Wcd!ewDDW1bvI6r(BLmb%y zCK4_fzzrPEWe5+tK42zbVKGLa?MSe;#4=ClOA25W!-yu{3wF(Y+Pj>9JD^_mONJv1 z3)2{UgEKh}^drP6;D8W!PQ-_-3Ccp>F>FBn^%EQL3fJMYwUZwLhk|{wcmn*cLp+Sd zM%mlI{J<-7KZJO5gQ=(Gn8^rzO95HWQ5PV~R8PQDN4Y(5U1dB1)(vqpar4-B1^x%I zs2!sH*qiZ!GtF&=eRox7jznbH*L2mC5 zD=;39r4%DlJ0V}9xXJd-_msHBJs~He&%hH;!5rnVl2YCw*x`lZJ7G!nK138wAycPFhGkK$59l?*T0bFC7vdE{%=8^CDCgc>|{>oDJjK8YU z738tc^ApNR_8`}ltrYSRv^(In$n~scYTE*4r*Raojc@flWBP%-19HbJ=b>y}5c6QK zijcF-d0c{AbtH0FLAJO06XFr(2UidD<|BVr5c_1n#y!QTEHN$Qu{22#n{nX6W?0(S}ZqnOwd2saV7i+13^wVJV>-Ro?9X&5-&kM;Io|K(rcA+ z*jyK7T_JaZcyMoRjV;B!*off&5GRHakK2eTqE1m)nXC{8!1m8R@oSVX;uCPS4#i=- zUj=*LX1s;4ahJvd#DXs694sGt7G)~r9m^Ta!#Qf^j~JWW`9R?A<0Qjx#S-fUXbU30 zi;#yEWq_E7xsieUWqD9{Kv;*lSFh7r0^fpt84}7}@F|Q@JG+agW|(VgAWJz4I>5z& ztN1bd?gi$9{A7di9&B6#Jwv`H11Bspf@d)n)&cb9qP9O*7@|%%Y>4W$vEZ%C%%GBeXBf*Z<#6p0FcO9HmC!q~@h zLSA#EoDFkwTnFGM*b&4V;G4P4@cQD>j%}*7fqbtJXECOx|0a-A0!JI|I42bGmEsM| z6(ddxSRimppZHR0FM_?V*r_*hgag_p=cp7YZ6#FXMSAd&p0sH>b&KNcY#EBBrNY4Re3+p+3xuwWVx)Sko2b z2Fx85Yy;L}XMCg$oDfgYQ_h^$tgzN4a-CLQ8&La4PaW)muR_i(F-{G91=fi*DAE<> zncy>Sr>(*|6TgXd)HCoNpLhw^OTPDlY+HoTrep;C(~nw{RcY z6<`_S##3SZH$g8j=31~du!jxiPHDZ8@?eaeVB_L-`T0U_hpaZ8a%sX1p%zih4>Jyh za$svuc|sTED8m|Ht~_R}^4c!sf4GiGT4y{X?rl<@L_8boTjnUmSPAT7Vw)na6K~x>W}xL(l`RKS^Z?@`XIi*uQWtLH7fW zqW_D$&^2|iK|ABn$dB3jKCESAH4L%F!ew3X5m-Z%+M!J~dR@)9f@kV|v9 z$>=wblVaRsdr~nsq^^uNXWmHARz$sJxn({c{rw<@uGo3VIz68##IYZYUkkONRS4LC z`&+tmjTAeI2MCMAEx;%tPz9H z*qJP8{2IlJr>#&28zjAUbo3zyfw)6;4#=+(%ms5US*(HbIstOzyZLzWypiWQY!2~E zjOu?_#};!}`0m8{2KpWN?-=VYpd)5urLk9#r;3;axgXXN(I;39_`~&!dCyZ(_l3Nt zi*+Z=`!e~ba$ZAhpj;Dq2$LDbixihG#Ggub#cGOoee#ZOMoF&~#YH?#>oK^;7Un>& zMk{(APY}C|3d{-l{5fL$1TYGC8`>)7&?VWG&nH=anby@m#*NIzkk6*E-RAaFnj@{1 zN5t1+V+A-#^)k|Ve%?bhTk)(kt@ZNUQnJVoN@vgvn^5jNHm9;+GC*EQywA-1gXP8f z*gOYEP6qld*}z%}#10YXfPY!Iw(B;Jry#rOTAxj3 z!#2jEpv&>1kZFe7tj30eiLz_zto2NOBi=)kpI~?A?{* zljXA(+vf?m3-BS}0kM(hyjdOYV?9{+a0Bb_5MPO3Gut6P&|kk`ZinZTg1@^c1IRIu zqgwOE$p$=v_&sydIuLTSZV8ujjQKH@$NiBsOLa!vH?1++Y;0bmq`VMw`YWpgYr9}l ztOKyIxxF@dt$oAKiCZZLnjKP1x8`fAuhM5a`}dJ!N@7j8B%2&VbN~9V?us_fVsC+) z?C5-6(Kem}wlFH%4m+b6EZG^}7&{%;zA5GP@Z66jz+$P0g(Yw7bSz z>hJ8_DUSiXo*HNSyu%a4vqRrE{jjT5tLD-Lr~99*sR9 z9&mYz`G{dpH#K*$H;C&nJ3B1aIQV(&kk?Lt*IkA4l2Tr(VGYJ`A*Y7Cj{BEU@hHcM zB&r#yh`Te+Z~K6iFo#%w228j)`(fuyhtxjUIC;*>_03}Tob`g0>WO*Ix#66fpVQdI z+GTpiguWyLZ|6Nj|E(Gk#RKdI;WksW^~|2prV8Wc_|^jdW|+o17!sn8#F~0D)C#5+w>)VmR ze}=sFUteauMic6t5OBT$u}r4(8NV$u=J&j$;!!Wk3?fLKxWtE+W2z7m` z37bMcTA|*WmZywBJVE#w-&Nakw;{Y7;TG}J> zo>lsU3iViY&MUu=$AW*Ta4oNWkRPl4g!R&$3TGY}p0eB~+v9f@8>lvWzXpf(fh-P# zy+@c^-`F1Hz(=Yvgiqnf7%V5oAndjJjhPfp1E$&;$|srbAeOyhEMs$vn1lUJAJy(se_9@p0}DDNoxpYA zBN5hFHLS}L@4GZ2pK&6>hP3a~jq8}R(YZX;8P&cfo-GvmcDh)r9D$z*Jrb7&0BdmXLiQH>@sE?vAxHB)7$fU@~^yymGwyAnJCtQt`KXfpR?4bh**O?0BMf_adpH- z*6V@1cf5i)y5YSvypB%iJ)i^PBH%9(w`-JNUQ18=2=Dh0@w4ptD31p$j&R=8h8S|D z9_2!OEZ1e5tDoz)6!yWm^7%-(hUfZ{2SB~8=p(sqNd`N#IaqIkwHNd+&}sa^ zSx}D6qyvmqln-L>8TAdM@gMVH;L4e7asQm>tbr?F-$cf5egMB7nL|3GBmK648*T7B z40C#{hXYUHoE_I+!iKrip&b2Es?Fc@KK-qpBry-fz5q2n2h?Ni*)8{tSk&X}Q_T#1 z=lG2|4BHpj^BeD#zWRXMU{mNXS)9W2W$aakeDXm1DxS5ZeR^PPZ9%4e#H_3@3o+zH zA=hIxVDKiK;Z@vE8UqF@J|5%89FnXjXc5Uci__r<&~h58At zbRVMvCeqWej2E8x`5&GI$~@j;9TQ_ocDA_t=zJFQx|BN?`ze`REz!5c+`U`!vrf^^ zT+z?Cua4=tAHCCSkAV}(Q}9jTa*gMyq_uzx_Tk?tJLhRMX6;5BpARyhx629Wp7{^O z#k5bT!Jju0@f!7^k-c;a{V+J@3~Rc`q0<`TXpS~osG|{%2du`B_U>X0X@#<5y_+`Z z@qF}^0!DNOSSZY3xup10%K z0&oFcM!U5zKgC#%wMwyH8g&BsgoidY7slps1M6F!igk!~h4a$ulMQl^7gd+PS-w# z`8B=d2id(?zaTCnGykF50@qQNvtv9!onlVL-V`AEg;2+)H4E_*;uM_)VQeg)AqjrJ z@`ZCWz}mvw3oP#E{H+LCJ;uA}13Y7yM#J{Yw09WrF^s>%%YTATXHWT)4VTVvn#FpV zuqTvb`P#q8tN%xGY9W`dkbGu}5tV9yk?7lyi$<1$_C7!v9coH*qOAIYckk5Au##Gm)ip7KAPPG22*$oK2^efceYVEEfhuh|+-TKMGe*Zp}f zj``;&4;&|a_@8^)J_-DA`5qLXK7MdEUa;F2-;Yy%Zuyf(^|O_H_P{>B=;O!s`2~OV z@IJrn_7VP%UXk>Fb`#nE|HyB{8RPKgwM(Tv9@wMgwW?aL$Ti=s`kKB_y^1RPY9KF^ zs_c1HwI*v?wO;Z3`){er3^v-bck+DOZ@>Llhs<7Cbo2Cj>HTbS{ZW=bd_UVA5#I=3 ze8)u`{1erKj`s1(zyv|xd&kMmJDG0YRB`78Ai@G$?A02jw}9Mz8Q9%7f&BK_1)D$s zilUv|zAog(PD)F}H%TSi_x+crL2LZ+D?|#f!(w-Q@ER<-_S08k33C2>D|~%w{^g<& zWxsy#PPIEqzw>@AVcOeQY-K0_)^+phwcI{0H}-NA--U?qoV{O#H2B~LNwD#QjTZ)Y l-mvnw-mb!i+WpuR-#GK>%{Om-`Qw*A{}VG#Co$wv000S}45|PC literal 0 HcmV?d00001 diff --git a/hack/empty-flag-audit/bootstrap.py b/hack/empty-flag-audit/bootstrap.py index a3eac760a..d7c8924ec 100755 --- a/hack/empty-flag-audit/bootstrap.py +++ b/hack/empty-flag-audit/bootstrap.py @@ -154,6 +154,7 @@ "paths-file": "hack/empty-flag-audit/paths.yml", "template-file": "cmd/kosli/testdata/valid_template.yml", "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", + "sbom-file": "cmd/kosli/testdata/sbom/cyclonedx.json", "user-data": ARTIFACT_PATH, "input-file": ARTIFACT_PATH, "attestation-data": ARTIFACT_PATH, diff --git a/hack/empty-flag-audit/results.tsv b/hack/empty-flag-audit/results.tsv index e17e38f52..233baddc0 100644 --- a/hack/empty-flag-audit/results.tsv +++ b/hack/empty-flag-audit/results.tsv @@ -358,6 +358,31 @@ attest pullrequest gitlab --repo-url 1 1 1 cli differs differs 0.3 Error: [kosl attest pullrequest gitlab --repository 1 1 1 cli differs differs 0.3 Error: [kosli attest pullrequest gitlab flow=probe-attest-pullrequest-gitlab-repository-fl trail=probe-attest-pullrequest-gitlab-repository-tr] flag '--reposito attest pullrequest gitlab --trail 1 1 1 cli differs differs 0.3 Error: [kosli attest pullrequest gitlab flow=probe-attest-pullrequest-gitlab-trail-fl] flag '--trail' was given an empty value attest pullrequest gitlab --user-data 1 1 1 cli differs differs 0.3 Error: [kosli attest pullrequest gitlab flow=probe-attest-pullrequest-gitlab-user-data-fl trail=probe-attest-pullrequest-gitlab-user-data-tr] flag '--user-data' +attest sbom --annotate 1 0 0 cli differs differs 0.5 Error: [kosli attest sbom flow=probe-attest-sbom-annotate-fl trail=probe-attest-sbom-annotate-tr] flag '--annotate' was given an empty value +attest sbom --artifact-type 1 0 1 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-artifact-type-fl trail=probe-attest-sbom-artifact-type-tr] flag '--artifact-type' was given an empty value +attest sbom --attachments 1 0 1 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-attachments-fl trail=probe-attest-sbom-attachments-tr] flag '--attachments' was given an empty value +attest sbom --commit 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-commit-fl trail=probe-attest-sbom-commit-tr] flag '--commit' was given an empty value +attest sbom --description 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-description-fl trail=probe-attest-sbom-description-tr] flag '--description' was given an empty value +attest sbom --dry-run 1 0 0 cli differs differs 0.4 Error: flag '--dry-run' was given an empty value +attest sbom --exclude 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-exclude-fl trail=probe-attest-sbom-exclude-tr] flag '--exclude' was given an empty value +attest sbom --external-fingerprint 1 0 1 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-external-fingerprint-fl trail=probe-attest-sbom-external-fingerprint-tr] flag '--external-fingerprint' was give +attest sbom --external-url 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-external-url-fl trail=probe-attest-sbom-external-url-tr] flag '--external-url' was given an empty value +attest sbom --fingerprint 1 0 1 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-fingerprint-fl trail=probe-attest-sbom-fingerprint-tr] flag '--fingerprint' was given an empty value +attest sbom --flow 1 1 0 cli differs differs 0.4 Error: [kosli attest sbom trail=probe-attest-sbom-flow-tr] flag '--flow' was given an empty value +attest sbom --name 1 1 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-name-fl trail=probe-attest-sbom-name-tr] flag '--name' was given an empty value +attest sbom --origin-url 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-origin-url-fl trail=probe-attest-sbom-origin-url-tr] flag '--origin-url' was given an empty value +attest sbom --redact-commit-info 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-redact-commit-info-fl trail=probe-attest-sbom-redact-commit-info-tr] flag '--redact-commit-info' was given an e +attest sbom --registry-password 1 0 1 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-registry-password-fl trail=probe-attest-sbom-registry-password-tr] flag '--registry-password' was given an empt +attest sbom --registry-provider 1 0 0 cli differs differs 0.5 Error: [kosli attest sbom flow=probe-attest-sbom-registry-provider-fl trail=probe-attest-sbom-registry-provider-tr] flag '--registry-provider' was given an empt +attest sbom --registry-username 1 0 1 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-registry-username-fl trail=probe-attest-sbom-registry-username-tr] flag '--registry-username' was given an empt +attest sbom --repo-id 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-repo-id-fl trail=probe-attest-sbom-repo-id-tr] flag '--repo-id' was given an empty value +attest sbom --repo-provider 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-repo-provider-fl trail=probe-attest-sbom-repo-provider-tr] flag '--repo-provider' was given an empty value +attest sbom --repo-root 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-repo-root-fl trail=probe-attest-sbom-repo-root-tr] flag '--repo-root' was given an empty value +attest sbom --repo-url 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-repo-url-fl trail=probe-attest-sbom-repo-url-tr] flag '--repo-url' was given an empty value +attest sbom --repository 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-repository-fl trail=probe-attest-sbom-repository-tr] flag '--repository' was given an empty value +attest sbom --sbom-file 1 1 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-sbom-file-fl trail=probe-attest-sbom-sbom-file-tr] flag '--sbom-file' was given an empty value +attest sbom --trail 1 1 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-trail-fl] flag '--trail' was given an empty value +attest sbom --user-data 1 0 0 cli differs differs 0.4 Error: [kosli attest sbom flow=probe-attest-sbom-user-data-fl trail=probe-attest-sbom-user-data-tr] flag '--user-data' was given an empty value attest snyk --annotate 1 1 1 cli differs differs 0.3 Error: [kosli attest snyk flow=probe-attest-snyk-annotate-fl trail=probe-attest-snyk-annotate-tr] flag '--annotate' was given an empty value attest snyk --artifact-type 1 1 1 cli differs differs 0.3 Error: [kosli attest snyk flow=probe-attest-snyk-artifact-type-fl trail=probe-attest-snyk-artifact-type-tr] flag '--artifact-type' was given an empty value attest snyk --attachments 1 1 1 cli differs differs 0.4 Error: [kosli attest snyk flow=probe-attest-snyk-attachments-fl trail=probe-attest-snyk-attachments-tr] flag '--attachments' was given an empty value diff --git a/hack/empty-flag-audit/spec.json b/hack/empty-flag-audit/spec.json index 10b844ad4..f19c1e445 100644 --- a/hack/empty-flag-audit/spec.json +++ b/hack/empty-flag-audit/spec.json @@ -1,4680 +1,4776 @@ { - "attest generic": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ngeneric attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "compliant", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "compliant": "true", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "allow artifact": { - "args": [ - "{name}" - ], - "flags": { - "fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "environment": "{env}", - "reason": "probe" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "artifact aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa was allow listed in environment: {env}", - "flags_to_test": [ - "artifact-type", - "dry-run", - "environment", - "exclude", - "fingerprint", - "reason", - "registry-password", - "registry-provider", - "registry-username" - ], - "flag_values": { - "artifact-type": "file", - "dry-run": "true", - "environment": "{env}", - "exclude": "probe-exclude", - "fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "reason": "probe", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - } - ], - "verify": [] + "attest generic": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "trail": "{trail}" }, - "archive control": { - "args": [ - "{control}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "control {control} was archived", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}" - ] - } - ], - "verify": [ - [ - "get", - "control", - "{control}", - "--output", - "json" - ] - ] - }, - "archive environment": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "environment {env} was archived", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "archive flow": { - "args": [ - "{flow}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "flow {flow} was archived", - "flags_to_test": [ - "api-token", - "config-file", - "debug", - "dry-run", - "host", - "http-proxy", - "max-api-retries", - "org", - "quiet" - ], - "flag_values": { - "api-token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ImNkNzg4OTg5In0.e8i_lA_QrEhFncb05Xw6E_tkCHU9QfcY4OLTVUCHffY", - "config-file": "probe-config-file", - "debug": "true", - "dry-run": "true", - "host": "http://localhost:8001", - "http-proxy": "probe-http-proxy", - "max-api-retries": "3", - "org": "docs-cmd-test-user-shared", - "quiet": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [ - [ - "get", - "flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "assert artifact": { - "args": [ - "cmd/kosli/testdata/person-schema.json" - ], - "flags": { - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "COMPLIANT\nFlow: {flow}\n Trail: {trail}\n Attestation-name type status compliant \n See more details at http://localhost/docs-cmd-test-user-shared/flows/{flow}/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "artifact-type", - "dry-run", - "environment", - "exclude", - "fingerprint", - "flow", - "output", - "policy", - "registry-password", - "registry-provider", - "registry-username" - ], - "flag_values": { - "artifact-type": "file", - "dry-run": "true", - "environment": "{env}", - "exclude": "probe-exclude", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "output": "json", - "policy": "{policy}", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username" - }, - "setup": [ - { - "argv": [ - "create", - "policy", - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml", - "--type", - "env" - ] - }, - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - }, - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com" - ] - } - ], - "verify": [] + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ngeneric attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "compliant", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "compliant": "true", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" }, - "assert snapshot": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 1, - "baseline_output": "Error: [kosli assert snapshot] NON-COMPLIANT", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] - }, - "assert status": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "OK", - "flags_to_test": [], - "flag_values": {}, - "setup": [], - "verify": [] - }, - "attest artifact": { - "args": [ - "cmd/kosli/testdata/person-schema.json" - ], - "flags": { - "build-url": "http://example.com", - "commit-url": "http://example.com", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nartifact cmd/kosli/testdata/person-schema.json was attested with fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "annotate", - "artifact-type", - "build-url", - "commit", - "commit-url", - "display-name", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "build-url": "http://example.com", - "commit": "HEAD", - "commit-url": "http://example.com", - "display-name": "probe-display-name", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest custom": { - "args": [], - "flags": { - "attestation-data": "cmd/kosli/testdata/person-schema.json", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "trail": "{trail}", - "type": "{name}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ncustom:{name} attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "attestation-data", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "type", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "attestation-data": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "type": "{name}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "attestation-type", - "{name}", - "--schema", - "cmd/kosli/testdata/person-schema.json" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "attest decision": { - "args": [], - "flags": { - "compliant": "true", - "control": "{control}", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ndecision attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "compliant", - "control", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "compliant": "true", - "control": "{control}", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "attest jira": { - "args": [], - "flags": { - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "jira-base-url": "probe-jira-base-url", - "jira-pat": "probe-jira-pat", - "name": "{name}", - "trail": "{trail}" - }, - "baseline_ok": false, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\njira attestation '{name}' is reported to trail: {trail}", - "needs": "jira", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "ignore-branch-match", - "jira-api-token", - "jira-base-url", - "jira-issue-fields", - "jira-pat", - "jira-project-key", - "jira-secondary-source", - "jira-trailer", - "jira-username", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "ignore-branch-match": "true", - "jira-api-token": "probe-jira-api-token", - "jira-base-url": "probe-jira-base-url", - "jira-issue-fields": "probe-jira-issue-fields", - "jira-pat": "probe-jira-pat", - "jira-project-key": "probe-jira-project-key", - "jira-secondary-source": "probe-jira-secondary-source", - "jira-trailer": "Jira", - "jira-username": "probe-jira-username", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest junit": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "results-dir": "cmd/kosli/testdata/junit", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\njunit attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "results-dir", - "trail", - "upload-results", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "results-dir": "cmd/kosli/testdata/junit", - "trail": "{trail}", - "upload-results": "true", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "attest snyk": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest snyk flow=probe-attest-snyk-baseline-fl trail=probe-attest-snyk-baseline-tr] failed to parse Snyk sarif results file [cmd/kosli/testdata/snyk_scan_example.json]: invalid sarif file", - "needs": "snyk", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "scan-results", - "trail", - "upload-results", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", - "trail": "{trail}", - "upload-results": "true", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest sonar": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "sonar-api-token": "probe-sonar-api-token", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest sonar flow=probe-attest-sonar-baseline-fl trail=probe-attest-sonar-baseline-tr] open .scannerwork/report-task.txt: no such file or directory. Check your working directory is set correctly. Alternatively provide the project key and either revision or pull-request ID for the scan to attest", - "needs": "sonarqube", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "max-wait", - "name", - "origin-url", - "pull-request", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "sonar-api-token", - "sonar-branch", - "sonar-ce-task-url", - "sonar-project-key", - "sonar-revision", - "sonar-server-url", - "sonar-working-dir", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "max-wait": "probe-max-wait", - "name": "{name}", - "origin-url": "http://example.com", - "pull-request": "probe-pull-request", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "sonar-api-token": "probe-sonar-api-token", - "sonar-branch": "probe-sonar-branch", - "sonar-ce-task-url": "probe-sonar-ce-task-url", - "sonar-project-key": "probe-sonar-project-key", - "sonar-revision": "probe-sonar-revision", - "sonar-server-url": "probe-sonar-server-url", - "sonar-working-dir": "probe-sonar-working-dir", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "begin trail": { - "args": [ - "{trail}" - ], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ntrail '{trail}' was begun", - "flags_to_test": [ - "commit", - "description", - "dry-run", - "external-fingerprint", - "external-url", - "flow", - "origin-url", - "redact-commit-info", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "template-file", - "user-data" - ], - "flag_values": { - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "template-file": "cmd/kosli/testdata/valid_template.yml", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "config": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "default config file [/var/folders/21/v4jj5l055w393p67z831r5hr0000gn/T/kosli-audit-home-pktxkdvq/.kosli.yml] updated successfully.", - "flags_to_test": [ - "set", - "unset" - ], - "flag_values": { - "set": "probe=set", - "unset": "probe-unset" - }, - "setup": [], - "verify": [] - }, - "create api-key": { - "args": [], - "flags": { - "description": "probe-description", - "service-account": "{account}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "ID: {uuid}\nKey: {secret}\nDescription: probe-description\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A", - "flags_to_test": [ - "description", - "dry-run", - "expires-at", - "output", - "service-account" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "expires-at": "4102444800", - "output": "json", - "service-account": "{account}" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "allow artifact": { + "args": [ + "{name}" + ], + "flags": { + "fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "environment": "{env}", + "reason": "probe" }, - "create control": { - "args": [ - "{control}" - ], - "flags": { - "name": "{name}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "control {control} was created", - "flags_to_test": [ - "description", - "dry-run", - "name" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "name": "{name}" - }, - "setup": [], - "verify": [ - [ - "get", - "control", - "{control}", - "--output", - "json" - ] - ] - }, - "create environment": { - "args": [ - "{env}" - ], - "flags": { - "type": "K8S" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "environment {env} was created", - "flags_to_test": [ - "description", - "dry-run", - "exclude-scaling", - "include-scaling", - "included-environments", - "require-provenance", - "type" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "exclude-scaling": "true", - "include-scaling": "true", - "included-environments": "{env}", - "require-provenance": "true", - "type": "K8S" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "create flow": { - "args": [ - "{flow}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] creating a flow without --template-file or --use-empty-template uses a deprecated API endpoint and will stop working in a future release; please provide a template\nflow '{flow}' was created", - "flags_to_test": [ - "description", - "dry-run", - "template", - "template-file", - "use-empty-template", - "visibility" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "template": "probe-template", - "template-file": "cmd/kosli/testdata/valid_template.yml", - "use-empty-template": "true", - "visibility": "public" - }, - "setup": [], - "verify": [ - [ - "get", - "flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "create policy": { - "args": [ - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "policy '{policy}' was created", - "flags_to_test": [ - "comment", - "description", - "dry-run", - "type" - ], - "flag_values": { - "comment": "probe-comment", - "description": "probe-description", - "dry-run": "true", - "type": "env" - }, - "setup": [], - "verify": [ - [ - "get", - "policy", - "{policy}", - "--output", - "json" - ] - ] - }, - "create service-account": { - "args": [ - "{account}" - ], - "flags": { - "privilege": "reader" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "service account {account} was created", - "flags_to_test": [ - "description", - "dry-run", - "privilege" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "privilege": "reader" - }, - "setup": [], - "verify": [ - [ - "get", - "service-account", - "{account}", - "--output", - "json" - ] - ] - }, - "delete api-key": { - "args": [ - "{apikey}" - ], - "flags": { - "service-account": "{account}", - "assume-yes": "true" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "API key {apikey} for service account {account} was deleted!", - "flags_to_test": [ - "assume-yes", - "dry-run", - "service-account", - "yes" - ], - "flag_values": { - "assume-yes": "true", - "dry-run": "true", - "service-account": "{account}", - "yes": "true" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - }, - { - "argv": [ - "create", - "api-key", - "--service-account", - "{account}", - "--description", - "probe" - ], - "capture": [ - "apikey", - "ID:\\s+(\\S+)" - ] - } - ], - "verify": [] + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "artifact aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa was allow listed in environment: {env}", + "flags_to_test": [ + "artifact-type", + "dry-run", + "environment", + "exclude", + "fingerprint", + "reason", + "registry-password", + "registry-provider", + "registry-username" + ], + "flag_values": { + "artifact-type": "file", + "dry-run": "true", + "environment": "{env}", + "exclude": "probe-exclude", + "fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "reason": "probe", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username" }, - "diff snapshots": { - "args": [ - "{env}", - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "", - "flags_to_test": [ - "output", - "show-unchanged" - ], - "flag_values": { - "output": "json", - "show-unchanged": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] - }, - "disable beta": { - "args": [], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli disable beta] Not Found", - "needs": "a server that implements it", - "flags_to_test": [], - "flag_values": {}, - "setup": [], - "verify": [] - }, - "enable beta": { - "args": [], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli enable beta] Not Found", - "needs": "a server that implements it", - "flags_to_test": [], - "flag_values": {}, - "setup": [], - "verify": [] - }, - "evaluate input": { - "args": [], - "flags": { - "input-file": "cmd/kosli/testdata/person-schema.json", - "policy": "cmd/kosli/testdata/policies/allow-all.rego" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "RESULT: ALLOWED", - "flags_to_test": [ - "assert", - "attestations", - "flow", - "input-file", - "no-assert", - "output", - "params", - "policy", - "show-input" - ], - "flag_values": { - "assert": "true", - "attestations": "probe-attestations", - "flow": "{flow}", - "input-file": "cmd/kosli/testdata/person-schema.json", - "no-assert": "true", - "output": "json", - "params": "{}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego", - "show-input": "true" - }, - "setup": [], - "verify": [] - }, - "evaluate trail": { - "args": [ - "{trail}" - ], - "flags": { - "flow": "{flow}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "RESULT: ALLOWED", - "flags_to_test": [ - "assert", - "attestations", - "flow", - "no-assert", - "output", - "params", - "policy", - "show-input" - ], - "flag_values": { - "assert": "true", - "attestations": "probe-attestations", - "flow": "{flow}", - "no-assert": "true", - "output": "json", - "params": "{}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego", - "show-input": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + } + ], + "verify": [] + }, + "archive control": { + "args": [ + "{control}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "control {control} was archived", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" }, - "evaluate trails": { - "args": [ - "{trail}" - ], - "flags": { - "flow": "{flow}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "RESULT: ALLOWED", - "flags_to_test": [ - "assert", - "attestations", - "flow", - "no-assert", - "output", - "params", - "policy", - "show-input" - ], - "flag_values": { - "assert": "true", - "attestations": "probe-attestations", - "flow": "{flow}", - "no-assert": "true", - "output": "json", - "params": "{}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego", - "show-input": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}" + ] + } + ], + "verify": [ + [ + "get", + "control", + "{control}", + "--output", + "json" + ] + ] + }, + "archive environment": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "environment {env} was archived", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" }, - "fingerprint": { - "args": [ - "cmd/kosli/testdata/person-schema.json" - ], - "flags": { - "artifact-type": "file" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "artifact-type", - "e", - "exclude", - "registry-password", - "registry-provider", - "registry-username" - ], - "flag_values": { - "artifact-type": "file", - "e": "probe-e", - "exclude": "probe-exclude", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username" - }, - "setup": [], - "verify": [] - }, - "get api-key": { - "args": [ - "{apikey}" - ], - "flags": { - "service-account": "{account}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "ID: {apikey}\nDescription: probe\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A\nLast Used: N/A", - "flags_to_test": [ - "output", - "service-account" - ], - "flag_values": { - "output": "json", - "service-account": "{account}" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - }, - { - "argv": [ - "create", - "api-key", - "--service-account", - "{account}", - "--description", - "probe" - ], - "capture": [ - "apikey", - "ID:\\s+(\\S+)" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "archive flow": { + "args": [ + "{flow}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "flow {flow} was archived", + "flags_to_test": [ + "api-token", + "config-file", + "debug", + "dry-run", + "host", + "http-proxy", + "max-api-retries", + "org", + "quiet" + ], + "flag_values": { + "api-token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ImNkNzg4OTg5In0.e8i_lA_QrEhFncb05Xw6E_tkCHU9QfcY4OLTVUCHffY", + "config-file": "probe-config-file", + "debug": "true", + "dry-run": "true", + "host": "http://localhost:8001", + "http-proxy": "probe-http-proxy", + "max-api-retries": "3", + "org": "docs-cmd-test-user-shared", + "quiet": "true" }, - "get artifact": { - "args": [ - "{flow}@1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: cmd/kosli/testdata/person-schema.json\nFlow: {flow}\nTrail: {trail}\nName in template: probe-artifact\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCreated on: {timestamp} \u2022 {ago}\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/{flow}/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01?artifact_id={uuid}\nState: COMPLIANT\nHistory:\n probe-artifact reported {timestamp}", - "flags_to_test": [ - "output", - "trail" - ], - "flag_values": { - "output": "json", - "trail": "{trail}" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [ + [ + "get", + "flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "assert artifact": { + "args": [ + "cmd/kosli/testdata/person-schema.json" + ], + "flags": { + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" }, - "get attestation": { - "args": [ - "probe-attestation" - ], - "flags": { - "flow": "{flow}", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: probe-attestation\nType: generic\nCompliance: true\nCreated at: {timestamp} \u2022 {ago}\nAttestation URL: http://localhost/docs-cmd-test-user-shared/flows/{flow}/trails/{trail}?attestation_id={uuid}", - "flags_to_test": [ - "attestation-id", - "fingerprint", - "flow", - "output", - "trail" - ], - "flag_values": { - "attestation-id": "probe-attestation-id", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "output": "json", - "trail": "{trail}" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com" - ] - }, - { - "argv": [ - "attest", - "generic", - "--name", - "probe-attestation", - "--flow", - "{flow}", - "--trail", - "{trail}" - ] - }, - { - "argv": [ - "attest", - "generic", - "--name", - "probe-on-artifact", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" - ] - } - ], - "verify": [], - "args_for_flag": { - "attestation-id": [], - "fingerprint": [ - "probe-on-artifact" - ] - }, - "flags_for_flag": { - "fingerprint": { - "flow": "{flow}" - } - } - }, - "get control": { - "args": [ - "{control}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Identifier: {control}\nName: {control}\nVersion: 1\nArchived: false\nCreated by: docs-cmd-test-user\nCreated at: {timestamp} \u2022 {ago}", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}" - ] - } - ], - "verify": [] - }, - "get default-org": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Default user organization: docs-cmd-test-user-shared", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [], - "verify": [] - }, - "get environment": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {env}\nType: K8S\nDescription: \nState: N/A\nLast Reported At: N/A\nTags: None\nPolicies: []", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [] + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "COMPLIANT\nFlow: {flow}\n Trail: {trail}\n Attestation-name type status compliant \n See more details at http://localhost/docs-cmd-test-user-shared/flows/{flow}/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "artifact-type", + "dry-run", + "environment", + "exclude", + "fingerprint", + "flow", + "output", + "policy", + "registry-password", + "registry-provider", + "registry-username" + ], + "flag_values": { + "artifact-type": "file", + "dry-run": "true", + "environment": "{env}", + "exclude": "probe-exclude", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "output": "json", + "policy": "{policy}", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username" }, - "get flow": { - "args": [ - "{flow}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {flow}\nDescription: \nVisibility: private\nTemplate: \n version: 1\nLast Deployment At: N/A\nTags: None", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "policy", + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml", + "--type", + "env" + ] + }, + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + }, + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com" + ] + } + ], + "verify": [] + }, + "assert snapshot": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 1, + "baseline_output": "Error: [kosli assert snapshot] NON-COMPLIANT", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" }, - "get policy": { - "args": [ - "{policy}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {policy}\nDescription: \nCreated At: {timestamp} \u2022 {ago}\nVersions: 1\nAttached to environments: []\nPolicy content:\n _schema: https://kosli.com/schemas/policy/environment/v1\n \n artifacts:\n provenance:\n required: true\n \n trail-compliance:\n required: true", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "policy", - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] + }, + "assert status": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "OK", + "flags_to_test": [], + "flag_values": {}, + "setup": [], + "verify": [] + }, + "attest artifact": { + "args": [ + "cmd/kosli/testdata/person-schema.json" + ], + "flags": { + "build-url": "http://example.com", + "commit-url": "http://example.com", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "trail": "{trail}" }, - "get repo": { - "args": [ - "{name}" - ], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli get repo] Repo 'probe-get-repo-baseline-nm' not found", - "needs": "a connected git provider", - "flags_to_test": [ - "output", - "provider", - "repo-id" - ], - "flag_values": { - "output": "json", - "provider": "github", - "repo-id": "probe-repo-id" - }, - "setup": [], - "verify": [] - }, - "get service-account": { - "args": [ - "{account}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {account}\nDescription: N/A\nPrivilege: reader\nCreated At: {timestamp} \u2022 {ago}", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [] + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nartifact cmd/kosli/testdata/person-schema.json was attested with fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "annotate", + "artifact-type", + "build-url", + "commit", + "commit-url", + "display-name", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "build-url": "http://example.com", + "commit": "HEAD", + "commit-url": "http://example.com", + "display-name": "probe-display-name", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}" }, - "get snapshot": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "COMMIT ARTIFACT FLOW COMPLIANCE RUNNING_SINCE REPLICAS\nN/A Name: probe-artifact N/A NON-COMPLIANT {ago} 1\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest custom": { + "args": [], + "flags": { + "attestation-data": "cmd/kosli/testdata/person-schema.json", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "trail": "{trail}", + "type": "{name}" }, - "get trail": { - "args": [ - "{trail}" - ], - "flags": { - "flow": "{flow}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {trail}\nDescription: \nCompliance: COMPLIANT\nLast modified at: {timestamp} \u2022 {ago}\nEvents:\n\n TIME DESCRIPTION GIT-COMMIT COMPLIANCE\n {timestamp} trail started", - "flags_to_test": [ - "flow", - "output" - ], - "flag_values": { - "flow": "{flow}", - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "list api-keys": { - "args": [], - "flags": { - "service-account": "{account}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "ID DESCRIPTION CREATED EXPIRES LAST USED\n{apikey} probe {timestamp} \u2022 {ago} N/A N/A", - "flags_to_test": [ - "output", - "service-account" - ], - "flag_values": { - "output": "json", - "service-account": "{account}" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - }, - { - "argv": [ - "create", - "api-key", - "--service-account", - "{account}", - "--description", - "probe" - ], - "capture": [ - "apikey", - "ID:\\s+(\\S+)" - ] - } - ], - "verify": [] - }, - "list artifacts": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "COMMIT ARTIFACT STATE CREATED_AT\n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "flow", - "output", - "page", - "page-limit", - "repo" - ], - "flag_values": { - "flow": "{flow}", - "output": "json", - "page": "1", - "page-limit": "5", - "repo": "probe-repo" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "list controls": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "IDENTIFIER NAME DESCRIPTION CREATED AT\nprobe-create-control-baseline-co probe-create-control-baseline-nm {timestamp}\nprobe-get-control-baseline-co probe-get-control-baseline-co {timestamp}\n{control} {control} {timestamp}\n\nShowing page 1 of 1, total 3 controls", - "flags_to_test": [ - "archived", - "output", - "page", - "page-limit", - "search", - "sort-direction", - "tag" - ], - "flag_values": { - "archived": "true", - "output": "json", - "page": "1", - "page-limit": "5", - "search": "probe-search", - "sort-direction": "asc", - "tag": "probe-tag" - }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}" - ] - } - ], - "verify": [] - }, - "list environments": { - "args": [], - "flags": { - "page-limit": "5" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME TYPE LAST REPORT LAST MODIFIED TAGS POLICIES\nprobe-allow-artifact-baseline-en server {timestamp} []\nprobe-assert-snapshot-baseline-en server {timestamp} {timestamp} []\nprobe-create-environment-baseline-en K8S {timestamp} []\nprobe-diff-snapshots-baseline-en server {timestamp} {timestamp} []\nprobe-get-environment-baseline-en K8S {timestamp} []\n\nShowing page 1 of 2, total 9 items", - "flags_to_test": [ - "name", - "output", - "page", - "page-limit", - "sort", - "sort-direction", - "space-id", - "tag", - "type" - ], - "flag_values": { - "name": "{name}", - "output": "json", - "page": "1", - "page-limit": "5", - "sort": "name", - "sort-direction": "asc", - "space-id": "probe-space-id", - "tag": "probe-tag", - "type": "K8S" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [] - }, - "list flows": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION VISIBILITY TAGS\nprobe-allow-artifact-baseline-fl private \nprobe-archive-attestation-type-baseline-fl private \nprobe-assert-artifact-baseline-fl private \nprobe-attest-artifact-baseline-fl private \nprobe-attest-custom-baseline-fl private \nprobe-attest-decision-baseline-fl private \nprobe-attest-generic-baseline-fl private \nprobe-attest-jira-baseline-fl private \nprobe-attest-junit-baseline-fl private \nprobe-attest-override-baseline-fl private \nprobe-attest-pullrequest-azure-baseline-fl private \nprobe-attest-pullrequest-bitbucket-baseline-fl private \nprobe-attest-pullrequest-github-baseline-fl private \nprobe-attest-pullrequest-gitlab-baseline-fl private \nprobe-attest-snyk-baseline-fl private \nprobe-attest-sonar-baseline-fl private \nprobe-begin-trail-baseline-fl private \nprobe-create-attestation-type-baseline-fl private \nprobe-create-flow-baseline-fl private \nprobe-evaluate-trail-baseline-fl private \nprobe-evaluate-trails-baseline-fl private \nprobe-get-artifact-baseline-fl private \nprobe-get-attestation-baseline-fl private \nprobe-get-attestation-type-baseline-fl private \nprobe-get-flow-baseline-fl private \nprobe-get-trail-baseline-fl private \nprobe-list-artifacts-baseline-fl private \nprobe-list-attestation-types-baseline-fl private \n{flow} private", - "flags_to_test": [ - "ignore-case", - "name", - "output", - "page", - "page-limit" - ], - "flag_values": { - "ignore-case": "true", - "name": "{name}", - "output": "json", - "page": "1", - "page-limit": "5" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [] - }, - "list policies": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION CREATED AT LAST VERSION USED BY ENVS\nprobe-attach-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-create-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-detach-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-get-policy-baseline-po {timestamp} \u2022 {ago} 1 []", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [], - "verify": [] - }, - "list repos": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "No repos were found.", - "flags_to_test": [ - "name", - "output", - "page", - "page-limit", - "provider", - "repo-id", - "search", - "sort-direction", - "tag" - ], - "flag_values": { - "name": "{name}", - "output": "json", - "page": "1", - "page-limit": "5", - "provider": "github", - "repo-id": "probe-repo-id", - "search": "probe-search", - "sort-direction": "asc", - "tag": "probe-tag" - }, - "setup": [], - "verify": [] - }, - "list service-accounts": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION PRIVILEGE CREATED\nprobe-create-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-create-service-account-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-delete-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-get-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-get-service-account-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-list-api-keys-baseline-sa N/A reader {timestamp} \u2022 {ago}\n{account} N/A reader {timestamp} \u2022 {ago}", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [] + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ncustom:{name} attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "attestation-data", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "type", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "attestation-data": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "type": "{name}", + "user-data": "cmd/kosli/testdata/person-schema.json" }, - "list snapshots": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "SNAPSHOT FROM TO DURATION COMPLIANT\n1 {timestamp} now about a second false", - "flags_to_test": [ - "interval", - "output", - "page", - "page-limit", - "reverse" - ], - "flag_values": { - "interval": "1", - "output": "json", - "page": "1", - "page-limit": "5", - "reverse": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] - }, - "list trails": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION COMPLIANCE\n{trail} COMPLIANT\nprobe-list-attestation-types-baseline-tr COMPLIANT\nprobe-list-artifacts-baseline-tr COMPLIANT\nprobe-get-trail-baseline-tr COMPLIANT\nprobe-get-attestation-type-baseline-tr COMPLIANT\nprobe-get-attestation-baseline-tr COMPLIANT\nprobe-get-artifact-baseline-tr COMPLIANT\nprobe-evaluate-trails-baseline-tr COMPLIANT\nprobe-evaluate-trail-baseline-tr COMPLIANT\nprobe-create-attestation-type-baseline-tr COMPLIANT\nprobe-begin-trail-baseline-tr COMPLIANT\nprobe-attest-sonar-baseline-tr COMPLIANT\nprobe-attest-snyk-baseline-tr COMPLIANT\nprobe-attest-pullrequest-gitlab-baseline-tr COMPLIANT\nprobe-attest-pullrequest-github-baseline-tr COMPLIANT\nprobe-attest-pullrequest-bitbucket-baseline-tr COMPLIANT\nprobe-attest-pullrequest-azure-baseline-tr COMPLIANT\nprobe-attest-override-baseline-tr COMPLIANT\nprobe-attest-junit-baseline-tr COMPLIANT\nprobe-attest-jira-baseline-tr NON-COMPLIANT\n\nShowing page 1 of 2, total 27 items", - "flags_to_test": [ - "fingerprint", - "flow", - "flow-tag", - "output", - "page", - "page-limit" - ], - "flag_values": { - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "flow-tag": "probe=flow-tag", - "output": "json", - "page": "1", - "page-limit": "5" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "attestation-type", + "{name}", + "--schema", + "cmd/kosli/testdata/person-schema.json" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "attest decision": { + "args": [], + "flags": { + "compliant": "true", + "control": "{control}", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "trail": "{trail}" }, - "rename flow": { - "args": [ - "{flow}", - "{name}-1" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "flow {flow} was renamed to {name}-1", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [ - [ - "get", - "flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "rotate api-key": { - "args": [ - "{apikey}" - ], - "flags": { - "service-account": "{account}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "ID: {apikey}\nKey: {secret}\nDescription: probe\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A\nOld Key Valid Until: {timestamp} \u2022 in one day", - "flags_to_test": [ - "dry-run", - "expires-at", - "grace-period-hours", - "output", - "service-account" - ], - "flag_values": { - "dry-run": "true", - "expires-at": "4102444800", - "grace-period-hours": "24", - "output": "json", - "service-account": "{account}" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - }, - { - "argv": [ - "create", - "api-key", - "--service-account", - "{account}", - "--description", - "probe" - ], - "capture": [ - "apikey", - "ID:\\s+(\\S+)" - ] - } - ], - "verify": [] + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ndecision attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "compliant", + "control", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "compliant": "true", + "control": "{control}", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" }, - "search": { - "args": [ - "{digest}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Search result resolved to artifact with fingerprint 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-assert-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-assert-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-attest-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-attest-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-get-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-get-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-get-attestation-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-get-attestation-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "{digest}", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "attest jira": { + "args": [], + "flags": { + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "jira-base-url": "probe-jira-base-url", + "jira-pat": "probe-jira-pat", + "name": "{name}", + "trail": "{trail}" }, - "snapshot azure": { - "args": [ - "{env}" - ], - "flags": { - "azure-client-id": "probe-azure-client-id", - "azure-client-secret": "probe-azure-client-secret", - "azure-resource-group-name": "probe-azure-resource-group-name", - "azure-subscription-id": "probe-azure-subscription-id", - "azure-tenant-id": "probe-azure-tenant-id" - }, - "baseline_ok": false, - "error": "Error: [kosli snapshot azure] ClientSecretCredential authentication failed. ", - "needs": "azure", - "flags_to_test": [ - "azure-client-id", - "azure-client-secret", - "azure-resource-group-name", - "azure-subscription-id", - "azure-tenant-id", - "digests-source", - "dry-run", - "zip" - ], - "flag_values": { - "azure-client-id": "probe-azure-client-id", - "azure-client-secret": "probe-azure-client-secret", - "azure-resource-group-name": "probe-azure-resource-group-name", - "azure-subscription-id": "probe-azure-subscription-id", - "azure-tenant-id": "probe-azure-tenant-id", - "digests-source": "logs", - "dry-run": "true", - "zip": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot cloud-run": { - "args": [ - "{env}" - ], - "flags": { - "project": "probe-project", - "region": "probe-region" - }, - "baseline_ok": false, - "error": "Error: [kosli snapshot cloud-run] GCP client setup failed: credentials: could not find default credentials. See https://cloud.google.com/docs/authentication/external/set-up-adc for more information", - "needs": "google cloud", - "flags_to_test": [ - "dry-run", - "exclude", - "exclude-regex", - "include", - "include-regex", - "project", - "region", - "resolve-names" - ], - "flag_values": { - "dry-run": "true", - "exclude": "probe-exclude", - "exclude-regex": "probe-exclude-regex", - "include": "probe-include", - "include-regex": "probe-include-regex", - "project": "probe-project", - "region": "probe-region", - "resolve-names": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot docker": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[15] containers were reported to environment {env}", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "docker" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot ecs": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli snapshot ecs] failed to filter ECS clusters: operation error ECS: ListClusters, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded", - "needs": "aws", - "flags_to_test": [ - "aws-key-id", - "aws-region", - "aws-secret-key", - "cluster", - "clusters", - "clusters-regex", - "dry-run", - "exclude", - "exclude-regex", - "exclude-services", - "exclude-services-regex", - "service-name", - "services", - "services-regex" - ], - "flag_values": { - "aws-key-id": "probe-aws-key-id", - "aws-region": "probe-aws-region", - "aws-secret-key": "probe-aws-secret-key", - "cluster": "probe-cluster", - "clusters": "probe-clusters", - "clusters-regex": "probe-clusters-regex", - "dry-run": "true", - "exclude": "probe-exclude", - "exclude-regex": "probe-exclude-regex", - "exclude-services": "probe-exclude-services", - "exclude-services-regex": "probe-exclude-services-regex", - "service-name": "probe-service-name", - "services": "probe-services", - "services-regex": "probe-services-regex" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot k8s": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli snapshot k8s] could not build config from inside the cluster: unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined", - "needs": "kubernetes", - "flags_to_test": [ - "config-file", - "dry-run", - "exclude-namespaces", - "exclude-namespaces-regex", - "kubeconfig", - "namespaces", - "namespaces-regex" - ], - "flag_values": { - "config-file": "probe-config-file", - "dry-run": "true", - "exclude-namespaces": "probe-exclude-namespaces", - "exclude-namespaces-regex": "probe-exclude-namespaces-regex", - "kubeconfig": "probe-kubeconfig", - "namespaces": "probe-namespaces", - "namespaces-regex": "probe-namespaces-regex" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot lambda": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli snapshot lambda] operation error Lambda: ListFunctions, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded", - "needs": "aws", - "flags_to_test": [ - "aws-key-id", - "aws-region", - "aws-secret-key", - "dry-run", - "exclude", - "exclude-regex", - "function-name", - "function-names", - "function-names-regex", - "function-version" - ], - "flag_values": { - "aws-key-id": "probe-aws-key-id", - "aws-region": "probe-aws-region", - "aws-secret-key": "probe-aws-secret-key", - "dry-run": "true", - "exclude": "probe-exclude", - "exclude-regex": "probe-exclude-regex", - "function-name": "probe-function-name", - "function-names": "probe-function-names", - "function-names-regex": "probe-function-names-regex", - "function-version": "probe-function-version" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot path": { - "args": [ - "{env}" - ], - "flags": { - "name": "{name}", - "path": "cmd/kosli/testdata/person-schema.json" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[1] artifacts were reported to environment {env}", - "flags_to_test": [ - "dry-run", - "exclude", - "name", - "path", - "watch" - ], - "flag_values": { - "dry-run": "true", - "exclude": "probe-exclude", - "name": "{name}", - "path": "cmd/kosli/testdata/person-schema.json", - "watch": "false" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot paths": { - "args": [ - "{env}" - ], - "flags": { - "paths-file": "hack/empty-flag-audit/paths.yml" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[1] artifacts were reported to environment {env}", - "flags_to_test": [ - "dry-run", - "paths-file", - "watch" - ], - "flag_values": { - "dry-run": "true", - "paths-file": "hack/empty-flag-audit/paths.yml", - "watch": "false" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot s3": { - "args": [ - "{env}" - ], - "flags": { - "bucket": "probe-bucket" - }, - "baseline_ok": false, - "error": "Error: [kosli snapshot s3] operation error S3: ListObjectsV2, resolve auth scheme: resolve endpoint: endpoint rule error, Invalid region: region was not a valid DNS name.", - "needs": "aws", - "flags_to_test": [ - "aws-key-id", - "aws-region", - "aws-secret-key", - "bucket", - "dry-run", - "exclude", - "exclude-regex", - "include", - "include-regex" - ], - "flag_values": { - "aws-key-id": "probe-aws-key-id", - "aws-region": "probe-aws-region", - "aws-secret-key": "probe-aws-secret-key", - "bucket": "probe-bucket", - "dry-run": "true", - "exclude": "probe-exclude", - "exclude-regex": "probe-exclude-regex", - "include": "probe-include", - "include-regex": "probe-include-regex" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "status": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "OK", - "flags_to_test": [ - "assert" - ], - "flag_values": { - "assert": "true" - }, - "setup": [], - "verify": [] - }, - "tag": { - "args": [ - "flow", - "{flow}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "No tags were applied for flow '{flow}'", - "flags_to_test": [ - "dry-run", - "provider", - "repo-id", - "set", - "unset" - ], - "flag_values": { - "dry-run": "true", - "provider": "github", - "repo-id": "probe-repo-id", - "set": "probe=set", - "unset": "probe-unset" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [] + "baseline_ok": false, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\njira attestation '{name}' is reported to trail: {trail}", + "needs": "jira", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "ignore-branch-match", + "jira-api-token", + "jira-base-url", + "jira-issue-fields", + "jira-pat", + "jira-project-key", + "jira-secondary-source", + "jira-trailer", + "jira-username", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "ignore-branch-match": "true", + "jira-api-token": "probe-jira-api-token", + "jira-base-url": "probe-jira-base-url", + "jira-issue-fields": "probe-jira-issue-fields", + "jira-pat": "probe-jira-pat", + "jira-project-key": "probe-jira-project-key", + "jira-secondary-source": "probe-jira-secondary-source", + "jira-trailer": "Jira", + "jira-username": "probe-jira-username", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" }, - "unarchive control": { - "args": [ - "{control}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "control {control} was unarchived", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}" - ] - } - ], - "verify": [ - [ - "get", - "control", - "{control}", - "--output", - "json" - ] - ] - }, - "update control": { - "args": [ - "{control}" - ], - "flags": { - "name": "{name}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "control {control} was updated", - "flags_to_test": [ - "description", - "dry-run", - "link", - "name" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "link": "probe=http://example.com", - "name": "{name}" - }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}", - "--description", - "probe-description-to-clear" - ] - } - ], - "verify": [ - [ - "get", - "control", - "{control}", - "--output", - "json" - ] - ] - }, - "update default-org": { - "args": [ - "docs-cmd-test-user-shared" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "default organization is set to: docs-cmd-test-user-shared", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [], - "verify": [] - }, - "version": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "version.BuildInfo{Version:\"dev\", GitCommit:\"\", GitTreeState:\"\", GoVersion:\"go1.26.5\"}", - "flags_to_test": [ - "short" - ], - "flag_values": { - "short": "true" - }, - "setup": [], - "verify": [] - }, - "attest override": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "new-compliance-status": "true", - "original-attestation-type": "generic", - "reason": "probe", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nattestation '{name}' has been overridden in trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "new-compliance-status", - "origin-url", - "original-attestation-type", - "reason", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "new-compliance-status": "true", - "origin-url": "http://example.com", - "original-attestation-type": "generic", - "reason": "probe", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "generic", - "--name", - "{name}", - "--flow", - "{flow}", - "--trail", - "{trail}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "archive attestation-type": { - "args": [ - "{name}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Custom attestation type {name} was archived", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "attestation-type", - "{name}", - "--schema", - "cmd/kosli/testdata/person-schema.json" - ] - } - ], - "verify": [] - }, - "assert pullrequest azure": { - "args": [], - "flags": { - "azure-org-url": "probe-azure-org-url", - "azure-token": "probe-azure-token", - "project": "probe-project", - "repository": "probe-repository" - }, - "baseline_ok": false, - "error": "Error: [kosli assert pullrequest azure] Options \"probe-azure-org-url/_apis\": unsupported protocol scheme \"\"", - "needs": "azure devops", - "flags_to_test": [ - "azure-org-url", - "azure-token", - "commit", - "dry-run", - "project", - "repository" - ], - "flag_values": { - "azure-org-url": "probe-azure-org-url", - "azure-token": "probe-azure-token", - "commit": "HEAD", - "dry-run": "true", - "project": "probe-project", - "repository": "probe-repository" - }, - "setup": [], - "verify": [] - }, - "assert pullrequest bitbucket": { - "args": [], - "flags": { - "bitbucket-username": "probe-bitbucket-username", - "bitbucket-password": "probe-bitbucket-password", - "bitbucket-workspace": "probe-bitbucket-workspace", - "repository": "probe-repository" - }, - "baseline_ok": false, - "error": "Error: [kosli assert pullrequest bitbucket] unexpected end of JSON input", - "needs": "bitbucket", - "flags_to_test": [ - "bitbucket-access-token", - "bitbucket-password", - "bitbucket-username", - "bitbucket-workspace", - "commit", - "dry-run", - "repository" - ], - "flag_values": { - "bitbucket-access-token": "probe-bitbucket-access-token", - "bitbucket-password": "probe-bitbucket-password", - "bitbucket-username": "probe-bitbucket-username", - "bitbucket-workspace": "probe-bitbucket-workspace", - "commit": "HEAD", - "dry-run": "true", - "repository": "probe-repository" - }, - "setup": [], - "verify": [] - }, - "assert pullrequest github": { - "args": [], - "flags": { - "github-org": "probe-github-org", - "github-token": "probe-github-token", - "repository": "probe-repository" - }, - "baseline_ok": false, - "error": "Error: [kosli assert pullrequest github] non-200 OK status code: 401 Unauthorized body: \"{\\r\\n \\\"message\\\": \\\"Bad credentials\\\",\\r\\n \\\"documentation_url\\\": \\\"https://docs.github.com/rest\\\",\\r\\n \\\"status\\\": \\\"401\\\"\\r\\n}\"", - "needs": "github", - "flags_to_test": [ - "commit", - "dry-run", - "github-base-url", - "github-org", - "github-token", - "repository" - ], - "flag_values": { - "commit": "HEAD", - "dry-run": "true", - "github-base-url": "probe-github-base-url", - "github-org": "probe-github-org", - "github-token": "probe-github-token", - "repository": "probe-repository" - }, - "setup": [], - "verify": [] - }, - "assert pullrequest gitlab": { - "args": [], - "flags": { - "gitlab-base-url": "http://localhost:8001", - "gitlab-org": "probe-gitlab-org", - "gitlab-token": "probe-gitlab-token", - "repository": "probe-repository" - }, - "baseline_ok": false, - "error": "Error: [kosli assert pullrequest gitlab] failed to list merge requests for commit HEAD: GET https://gitlab.com/api/v4/projects/probe-gitlab-org%!F(MISSING)probe-repository/repository/commits/HEAD/merge_requests: 401 {message: 401 Unauthorized}", - "needs": "gitlab", - "flags_to_test": [ - "commit", - "dry-run", - "gitlab-base-url", - "gitlab-org", - "gitlab-token", - "repository" - ], - "flag_values": { - "commit": "HEAD", - "dry-run": "true", - "gitlab-base-url": "http://localhost:8001", - "gitlab-org": "probe-gitlab-org", - "gitlab-token": "probe-gitlab-token", - "repository": "probe-repository" - }, - "setup": [], - "verify": [] - }, - "attach-policy": { - "args": [ - "{policy}" - ], - "flags": { - "environment": "{env}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "policy '{policy}' is attached to environments: [{env}]", - "flags_to_test": [ - "dry-run", - "environment" - ], - "flag_values": { - "dry-run": "true", - "environment": "{env}" - }, - "setup": [ - { - "argv": [ - "create", - "policy", - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml" - ] - } - ], - "verify": [ - [ - "get", - "policy", - "{policy}", - "--output", - "json" - ] - ] - }, - "attest pullrequest azure": { - "args": [], - "flags": { - "azure-org-url": "probe-azure-org-url", - "azure-token": "probe-azure-token", - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "project": "probe-project", - "repository": "probe-repository", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest pullrequest azure flow=probe-attest-pullrequest-azure-baseline-fl trail=probe-attest-pullrequest-azure-baseline-tr] Options \"probe-azure-org-url/_apis\": unsupported protocol scheme \"\"", - "needs": "azure devops", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "azure-org-url", - "azure-token", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "project", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "azure-org-url": "probe-azure-org-url", - "azure-token": "probe-azure-token", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "project": "probe-project", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest pullrequest bitbucket": { - "args": [], - "flags": { - "bitbucket-password": "probe-bitbucket-password", - "bitbucket-username": "probe-bitbucket-username", - "bitbucket-workspace": "probe-bitbucket-workspace", - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "repository": "probe-repository", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest pullrequest bitbucket flow=probe-attest-pullrequest-bitbucket-baseline-fl trail=probe-attest-pullrequest-bitbucket-baseline-tr] unexpected end of JSON input", - "needs": "bitbucket", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "bitbucket-access-token", - "bitbucket-password", - "bitbucket-username", - "bitbucket-workspace", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "bitbucket-access-token": "probe-bitbucket-access-token", - "bitbucket-password": "probe-bitbucket-password", - "bitbucket-username": "probe-bitbucket-username", - "bitbucket-workspace": "probe-bitbucket-workspace", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest pullrequest github": { - "args": [], - "flags": { - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "github-org": "probe-github-org", - "github-token": "probe-github-token", - "name": "{name}", - "repository": "probe-repository", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest pullrequest github flow=probe-attest-pullrequest-github-baseline-fl trail=probe-attest-pullrequest-github-baseline-tr] non-200 OK status code: 401 Unauthorized body: \"{\\r\\n \\\"message\\\": \\\"Bad credentials\\\",\\r\\n \\\"documentation_url\\\": \\\"https://docs.github.com/rest\\\",\\r\\n \\\"status\\\": \\\"401\\\"\\r\\n}\"", - "needs": "github", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "github-base-url", - "github-org", - "github-token", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "github-base-url": "probe-github-base-url", - "github-org": "probe-github-org", - "github-token": "probe-github-token", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest pullrequest gitlab": { - "args": [], - "flags": { - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "gitlab-base-url": "http://localhost:8001", - "gitlab-org": "probe-gitlab-org", - "gitlab-token": "probe-gitlab-token", - "name": "{name}", - "repository": "probe-repository", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest pullrequest gitlab flow=probe-attest-pullrequest-gitlab-baseline-fl trail=probe-attest-pullrequest-gitlab-baseline-tr] failed to list merge requests for commit 1ade42f39dd06d36aa603b9524a1b3eeaba9b796: GET https://gitlab.com/api/v4/projects/probe-gitlab-org%!F(MISSING)probe-repository/repository/commits/1ade42f39dd06d36aa603b9524a1b3eeaba9b796/merge_requests: 401 {message: 401 Unauthorized}", - "needs": "gitlab", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "gitlab-base-url", - "gitlab-org", - "gitlab-token", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "gitlab-base-url": "http://localhost:8001", - "gitlab-org": "probe-gitlab-org", - "gitlab-token": "probe-gitlab-token", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "create attestation-type": { - "args": [ - "{name}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "attestation-type {name} was created", - "flags_to_test": [ - "description", - "dry-run", - "jq", - "schema", - "summary", - "summary-json" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "jq": ".age >= 18", - "schema": "cmd/kosli/testdata/person-schema.json", - "summary": "Critical=.critical_count", - "summary-json": "[{\"name\":\"Critical\",\"expression\":\".critical_count\"}]" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest junit": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "results-dir": "cmd/kosli/testdata/junit", + "trail": "{trail}" }, - "delete service-account": { - "args": [ - "{account}" - ], - "flags": { - "assume-yes": "true" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "service account {account} was deleted!", - "flags_to_test": [ - "assume-yes", - "dry-run", - "yes" - ], - "flag_values": { - "assume-yes": "true", - "dry-run": "true", - "yes": "true" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [ - [ - "get", - "service-account", - "{account}", - "--output", - "json" - ] - ] - }, - "detach-policy": { - "args": [ - "{policy}" - ], - "flags": { - "environment": "{env}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "policy '{policy}' is detached from environments: [{env}]", - "flags_to_test": [ - "dry-run", - "environment" - ], - "flag_values": { - "dry-run": "true", - "environment": "{env}" - }, - "setup": [ - { - "argv": [ - "create", - "policy", - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml" - ] - } - ], - "verify": [ - [ - "get", - "policy", - "{policy}", - "--output", - "json" - ] - ] - }, - "get attestation-type": { - "args": [ - "{name}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {name}\nOrganization: docs-cmd-test-user-shared\nArchived: false\nCreated By: docs-cmd-test-user\nCreated at: {timestamp} \u2022 {ago}\nLast modified at: {timestamp} \u2022 {ago}\nVersions: \n Version: 1\n Timestamp: {timestamp} \u2022 {ago}\n Created By: docs-cmd-test-user\n Type schema: {\"additionalProperties\":true,\"properties\":{\"age\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"}},\"type\":\"object\"}\n Evaluator: \n Content Type: default", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "attestation-type", - "{name}", - "--schema", - "cmd/kosli/testdata/person-schema.json" - ] - } - ], - "verify": [] - }, - "join environment": { - "args": [], - "flags": { - "logical": "{logical}", - "physical": "{env}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "environment '{env}' was joined to '{logical}'", - "flags_to_test": [ - "dry-run", - "logical", - "physical" - ], - "flag_values": { - "dry-run": "true", - "logical": "{logical}", - "physical": "{env}" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - }, - { - "argv": [ - "create", - "environment", - "{seed}", - "--type", - "K8S" - ] - }, - { - "argv": [ - "create", - "environment", - "{logical}", - "--type", - "logical", - "--included-environments", - "{seed}" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "list attestation-types": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION LATEST VERSION\n{name} 1\nprobe-get-attestation-type-baseline-nm 1\nprobe-create-attestation-type-baseline-nm 1\nprobe-attest-custom-baseline-nm 1", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "attestation-type", - "{name}", - "--schema", - "cmd/kosli/testdata/person-schema.json" - ] - } - ], - "verify": [] + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\njunit attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "results-dir", + "trail", + "upload-results", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "results-dir": "cmd/kosli/testdata/junit", + "trail": "{trail}", + "upload-results": "true", + "user-data": "cmd/kosli/testdata/person-schema.json" }, - "log environment": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "SNAPSHOT EVENT FLOW\n#1 Artifact: probe-artifact \n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n Description: 1 instance started running (from 0 to 1) \n Reported at: {timestamp}", - "flags_to_test": [ - "end", - "end-ts", - "interval", - "output", - "page", - "page-limit", - "repo", - "reverse", - "start", - "start-ts" - ], - "flag_values": { - "end": "1", - "end-ts": "4102444800", - "interval": "1", - "output": "json", - "page": "1", - "page-limit": "5", - "repo": "probe-repo", - "reverse": "true", - "start": "1", - "start-ts": "1" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "attest snyk": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", + "trail": "{trail}" }, - "rename environment": { - "args": [ - "{env}", - "{name}-1" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "environment {env} was renamed to {name}-1", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "update service-account": { - "args": [ - "{account}" - ], - "flags": { - "description": "probe-description" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "service account {account} was updated", - "flags_to_test": [ - "description", - "dry-run", - "privilege" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "privilege": "reader" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [ - [ - "get", - "service-account", - "{account}", - "--output", - "json" - ] - ] - }, - "report artifact": { - "args": [ - "cmd/kosli/testdata/person-schema.json" - ], - "flags": { - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "build-url": "http://example.com", - "commit-url": "http://example.com", - "flow": "{flow}", - "git-commit": "HEAD" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Command \"artifact\" is deprecated, see kosli attest commands\nartifact cmd/kosli/testdata/person-schema.json was reported with fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "artifact-type", - "build-url", - "commit-url", - "dry-run", - "exclude", - "fingerprint", - "flow", - "git-commit", - "name", - "registry-password", - "registry-provider", - "registry-username", - "repo-root" - ], - "flag_values": { - "artifact-type": "file", - "build-url": "http://example.com", - "commit-url": "http://example.com", - "dry-run": "true", - "exclude": "probe-exclude", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "git-commit": "HEAD", - "name": "{name}", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-root": "." - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] + "baseline_ok": false, + "error": "Error: [kosli attest snyk flow=probe-attest-snyk-baseline-fl trail=probe-attest-snyk-baseline-tr] failed to parse Snyk sarif results file [cmd/kosli/testdata/snyk_scan_example.json]: invalid sarif file", + "needs": "snyk", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "scan-results", + "trail", + "upload-results", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", + "trail": "{trail}", + "upload-results": "true", + "user-data": "cmd/kosli/testdata/person-schema.json" }, - "snapshot server": { - "args": [ - "{env}" - ], - "flags": { - "paths": "." - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Command \"server\" is deprecated, use 'kosli snapshot paths' instead\n[1] artifacts were reported to environment {env}", - "flags_to_test": [ - "dry-run", - "e", - "exclude", - "paths" - ], - "flag_values": { - "dry-run": "true", - "e": "probe-e", - "exclude": "probe-exclude", - "paths": "." - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "completion": { - "args": [ - "bash" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "# bash completion for kosli -*- shell-script -*-\n\n__kosli_debug()\n{\n if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then\n echo \"$*\" >> \"${BASH_COMP_DEBUG_FILE}\"\n fi\n}\n\n# Homebrew on Macs have version 1.3 of bash-completion which doesn't include\n# _init_completion. This is a very minimal version of that function.\n__kosli_init_completion()\n{\n COMPREPLY=()\n _get_comp_words_by_ref \"$@\" cur prev words cword\n}\n\n__kosli_index_of_word()\n{\n local w word=$1\n shift\n index=0\n for w in \"$@\"; do\n [[ $w = \"$word\" ]] && return\n index=$((index+1))\n done\n index=-1\n}\n\n__kosli_contains_word()\n{\n local w word=$1; shift\n for w in \"$@\"; do\n [[ $w = \"$word\" ]] && return\n done\n return 1\n}\n\n__kosli_handle_go_custom_completion()\n{\n __kosli_debug \"${FUNCNAME[0]}: cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}\"\n\n local shellCompDirectiveError=1\n local shellCompDirectiveNoSpace=2\n local shellCompDirectiveNoFileComp=4\n local shellCompDirectiveFilterFileExt=8\n local shellCompDirectiveFilterDirs=16\n\n local out requestComp lastParam lastChar comp directive args\n\n # Prepare the command to request completions for the program.\n # Calling ${words[0]} instead of directly kosli allows handling aliases\n args=(\"${words[@]:1}\")\n # Disable ActiveHelp which is not supported for bash completion v1\n requestComp=\"KOSLI_ACTIVE_HELP=0 ${words[0]} __completeNoDesc ${args[*]}\"\n\n lastParam=${words[$((${#words[@]}-1))]}\n lastChar=${lastParam:$((${#lastParam}-1)):1}\n __kosli_debug \"${FUNCNAME[0]}: lastParam ${lastParam}, lastChar ${lastChar}\"\n\n if [ -z \"${cur}\" ] && [ \"${lastChar}\" != \"=\" ]; then\n # If the last parameter is complete (there is a space following it)\n # We add an extra empty parameter so we can indicate this to the go method.\n __kosli_debug \"${FUNCNAME[0]}: Adding extra empty parameter\"\n requestComp=\"${requestComp} \\\"\\\"\"\n fi\n\n __kosli_debug \"${FUNCNAME[0]}: calling ${requestComp}\"\n # Use eval to handle any environment variables and such\n out=$(eval \"${requestComp}\" 2>/dev/null)\n\n # Extract the directive integer at the very end of the output following a colon (:)\n directive=${out##*:}\n # Remove the directive\n out=${out%:*}\n if [ \"${directive}\" = \"${out}\" ]; then\n # There is not directive specified\n directive=0\n fi\n __kosli_debug \"${FUNCNAME[0]}: the completion directive is: ${directive}\"\n __kosli_debug \"${FUNCNAME[0]}: the completions are: ${out}\"\n\n if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then\n # Error code. No completion.\n __kosli_debug \"${FUNCNAME[0]}: received error from custom completion go code\"\n return\n else\n if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n __kosli_debug \"${FUNCNAME[0]}: activating no space\"\n compopt -o nospace\n fi\n fi\n if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n __kosli_debug \"${FUNCNAME[0]}: activating no file completion\"\n compopt +o default\n fi\n fi\n fi\n\n if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then\n # File extension filtering\n local fullFilter filter filteringCmd\n # Do not use quotes around the $out variable or else newline\n # characters will be kept.\n for filter in ${out}; do\n fullFilter+=\"$filter|\"\n done\n\n filteringCmd=\"_filedir $fullFilter\"\n __kosli_debug \"File filtering command: $filteringCmd\"\n $filteringCmd\n elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then\n # File completion for directories only\n local subdir\n # Use printf to strip any trailing newline\n subdir=$(printf \"%s\" \"${out}\")\n if [ -n \"$subdir\" ]; then\n __kosli_debug \"Listing directories in $subdir\"\n __kosli_handle_subdirs_in_dir_flag \"$subdir\"\n else\n __kosli_debug \"Listing directories in .\"\n _filedir -d\n fi\n else\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${out}\" -- \"$cur\")\n fi\n}\n\n__kosli_handle_reply()\n{\n __kosli_debug \"${FUNCNAME[0]}\"\n local comp\n case $cur in\n -*)\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n compopt -o nospace\n fi\n local allflags\n if [ ${#must_have_one_flag[@]} -ne 0 ]; then\n allflags=(\"${must_have_one_flag[@]}\")\n else\n allflags=(\"${flags[*]} ${two_word_flags[*]}\")\n fi\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${allflags[*]}\" -- \"$cur\")\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n [[ \"${COMPREPLY[0]}\" == *= ]] || compopt +o nospace\n fi\n\n # complete after --flag=abc\n if [[ $cur == *=* ]]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n compopt +o nospace\n fi\n\n local index flag\n flag=\"${cur%=*}\"\n __kosli_index_of_word \"${flag}\" \"${flags_with_completion[@]}\"\n COMPREPLY=()\n if [[ ${index} -ge 0 ]]; then\n PREFIX=\"\"\n cur=\"${cur#*=}\"\n ${flags_completion[${index}]}\n if [ -n \"${ZSH_VERSION:-}\" ]; then\n # zsh completion needs --flag= prefix\n eval \"COMPREPLY=( \\\"\\${COMPREPLY[@]/#/${flag}=}\\\" )\"\n fi\n fi\n fi\n\n if [[ -z \"${flag_parsing_disabled}\" ]]; then\n # If flag parsing is enabled, we have completed the flags and can return.\n # If flag parsing is disabled, we may not know all (or any) of the flags, so we fallthrough\n # to possibly call handle_go_custom_completion.\n return 0;\n fi\n ;;\n esac\n\n # check if we are handling a flag with special work handling\n local index\n __kosli_index_of_word \"${prev}\" \"${flags_with_completion[@]}\"\n if [[ ${index} -ge 0 ]]; then\n ${flags_completion[${index}]}\n return\n fi\n\n # we are parsing a flag and don't have a special handler, no completion\n if [[ ${cur} != \"${words[cword]}\" ]]; then\n return\n fi\n\n local completions\n completions=(\"${commands[@]}\")\n if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then\n completions+=(\"${must_have_one_noun[@]}\")\n elif [[ -n \"${has_completion_function}\" ]]; then\n # if a go completion function is provided, defer to that function\n __kosli_handle_go_custom_completion\n fi\n if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then\n completions+=(\"${must_have_one_flag[@]}\")\n fi\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${completions[*]}\" -- \"$cur\")\n\n if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${noun_aliases[*]}\" -- \"$cur\")\n fi\n\n if [[ ${#COMPREPLY[@]} -eq 0 ]]; then\n if declare -F __kosli_custom_func >/dev/null; then\n # try command name qualified custom func\n __kosli_custom_func\n else\n # otherwise fall back to unqualified for compatibility\n declare -F __custom_func >/dev/null && __custom_func\n fi\n fi\n\n # available in bash-completion >= 2, not always present on macOS\n if declare -F __ltrim_colon_completions >/dev/null; then\n __ltrim_colon_completions \"$cur\"\n fi\n\n # If there is only 1 completion and it is a flag with an = it will be completed\n # but we don't want a space after the =\n if [[ \"${#COMPREPLY[@]}\" -eq \"1\" ]] && [[ $(type -t compopt) = \"builtin\" ]] && [[ \"${COMPREPLY[0]}\" == --*= ]]; then\n compopt -o nospace\n fi\n}\n\n# The arguments should be in the form \"ext1|ext2|extn\"\n__kosli_handle_filename_extension_flag()\n{\n local ext=\"$1\"\n _filedir \"@(${ext})\"\n}\n\n__kosli_handle_subdirs_in_dir_flag()\n{\n local dir=\"$1\"\n pushd \"${dir}\" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return\n}\n\n__kosli_handle_flag()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n # if a command required a flag, and we found it, unset must_have_one_flag()\n local flagname=${words[c]}\n local flagvalue=\"\"\n # if the word contained an =\n if [[ ${words[c]} == *\"=\"* ]]; then\n flagvalue=${flagname#*=} # take in as flagvalue after the =\n flagname=${flagname%=*} # strip everything after the =\n flagname=\"${flagname}=\" # but put the = back\n fi\n __kosli_debug \"${FUNCNAME[0]}: looking for ${flagname}\"\n if __kosli_contains_word \"${flagname}\" \"${must_have_one_flag[@]}\"; then\n must_have_one_flag=()\n fi\n\n # if you set a flag which only applies to this command, don't show subcommands\n if __kosli_contains_word \"${flagname}\" \"${local_nonpersistent_flags[@]}\"; then\n commands=()\n fi\n\n # keep flag value with flagname as flaghash\n # flaghash variable is an associative array which is only supported in bash > 3.\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n if [ -n \"${flagvalue}\" ] ; then\n flaghash[${flagname}]=${flagvalue}\n elif [ -n \"${words[ $((c+1)) ]}\" ] ; then\n flaghash[${flagname}]=${words[ $((c+1)) ]}\n else\n flaghash[${flagname}]=\"true\" # pad \"true\" for bool flag\n fi\n fi\n\n # skip the argument to a two word flag\n if [[ ${words[c]} != *\"=\"* ]] && __kosli_contains_word \"${words[c]}\" \"${two_word_flags[@]}\"; then\n __kosli_debug \"${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument\"\n c=$((c+1))\n # if we are looking for a flags value, don't show commands\n if [[ $c -eq $cword ]]; then\n commands=()\n fi\n fi\n\n c=$((c+1))\n\n}\n\n__kosli_handle_noun()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n if __kosli_contains_word \"${words[c]}\" \"${must_have_one_noun[@]}\"; then\n must_have_one_noun=()\n elif __kosli_contains_word \"${words[c]}\" \"${noun_aliases[@]}\"; then\n must_have_one_noun=()\n fi\n\n nouns+=(\"${words[c]}\")\n c=$((c+1))\n}\n\n__kosli_handle_command()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n local next_command\n if [[ -n ${last_command} ]]; then\n next_command=\"_${last_command}_${words[c]//:/__}\"\n else\n if [[ $c -eq 0 ]]; then\n next_command=\"_kosli_root_command\"\n else\n next_command=\"_${words[c]//:/__}\"\n fi\n fi\n c=$((c+1))\n __kosli_debug \"${FUNCNAME[0]}: looking for ${next_command}\"\n declare -F \"$next_command\" >/dev/null && $next_command\n}\n\n__kosli_handle_word()\n{\n if [[ $c -ge $cword ]]; then\n __kosli_handle_reply\n return\n fi\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n if [[ \"${words[c]}\" == -* ]]; then\n __kosli_handle_flag\n elif __kosli_contains_word \"${words[c]}\" \"${commands[@]}\"; then\n __kosli_handle_command\n elif [[ $c -eq 0 ]]; then\n __kosli_handle_command\n elif __kosli_contains_word \"${words[c]}\" \"${command_aliases[@]}\"; then\n # aliashash variable is an associative array which is only supported in bash > 3.\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n words[c]=${aliashash[${words[c]}]}\n __kosli_handle_command\n else\n __kosli_handle_noun\n fi\n else\n __kosli_handle_noun\n fi\n __kosli_handle_word\n}\n\n_kosli_allow_artifact()\n{\n last_command=\"kosli_allow_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--reason=\")\n two_word_flags+=(\"--reason\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_flag+=(\"--reason=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_allow()\n{\n last_command=\"kosli_allow\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_attestation-type()\n{\n last_command=\"kosli_archive_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_control()\n{\n last_command=\"kosli_archive_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_environment()\n{\n last_command=\"kosli_archive_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_flow()\n{\n last_command=\"kosli_archive_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive()\n{\n last_command=\"kosli_archive\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"environment\")\n commands+=(\"flow\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_artifact()\n{\n last_command=\"kosli_assert_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_azure()\n{\n last_command=\"kosli_assert_pullrequest_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--azure-org-url=\")\n two_word_flags+=(\"--azure-org-url\")\n flags+=(\"--azure-token=\")\n two_word_flags+=(\"--azure-token\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-org-url=\")\n must_have_one_flag+=(\"--azure-token=\")\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_bitbucket()\n{\n last_command=\"kosli_assert_pullrequest_bitbucket\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--bitbucket-access-token=\")\n two_word_flags+=(\"--bitbucket-access-token\")\n flags+=(\"--bitbucket-password=\")\n two_word_flags+=(\"--bitbucket-password\")\n flags+=(\"--bitbucket-username=\")\n two_word_flags+=(\"--bitbucket-username\")\n flags+=(\"--bitbucket-workspace=\")\n two_word_flags+=(\"--bitbucket-workspace\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bitbucket-workspace=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_github()\n{\n last_command=\"kosli_assert_pullrequest_github\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--github-base-url=\")\n two_word_flags+=(\"--github-base-url\")\n flags+=(\"--github-org=\")\n two_word_flags+=(\"--github-org\")\n flags+=(\"--github-token=\")\n two_word_flags+=(\"--github-token\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--github-org=\")\n must_have_one_flag+=(\"--github-token=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_gitlab()\n{\n last_command=\"kosli_assert_pullrequest_gitlab\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--gitlab-base-url=\")\n two_word_flags+=(\"--gitlab-base-url\")\n flags+=(\"--gitlab-org=\")\n two_word_flags+=(\"--gitlab-org\")\n flags+=(\"--gitlab-token=\")\n two_word_flags+=(\"--gitlab-token\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--gitlab-org=\")\n must_have_one_flag+=(\"--gitlab-token=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest()\n{\n last_command=\"kosli_assert_pullrequest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"az\")\n aliashash[\"az\"]=\"azure\"\n fi\n commands+=(\"bitbucket\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"bb\")\n aliashash[\"bb\"]=\"bitbucket\"\n fi\n commands+=(\"github\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gh\")\n aliashash[\"gh\"]=\"github\"\n fi\n commands+=(\"gitlab\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gl\")\n aliashash[\"gl\"]=\"gitlab\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_snapshot()\n{\n last_command=\"kosli_assert_snapshot\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_status()\n{\n last_command=\"kosli_assert_status\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert()\n{\n last_command=\"kosli_assert\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n commands+=(\"pullrequest\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"merge_request\")\n aliashash[\"merge_request\"]=\"pullrequest\"\n command_aliases+=(\"mergerequest\")\n aliashash[\"mergerequest\"]=\"pullrequest\"\n command_aliases+=(\"mr\")\n aliashash[\"mr\"]=\"pullrequest\"\n command_aliases+=(\"pr\")\n aliashash[\"pr\"]=\"pullrequest\"\n command_aliases+=(\"pull_request\")\n aliashash[\"pull_request\"]=\"pullrequest\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"status\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attach-policy()\n{\n last_command=\"kosli_attach-policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_artifact()\n{\n last_command=\"kosli_attest_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--build-url=\")\n two_word_flags+=(\"--build-url\")\n two_word_flags+=(\"-b\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--commit-url=\")\n two_word_flags+=(\"--commit-url\")\n two_word_flags+=(\"-u\")\n flags+=(\"--display-name=\")\n two_word_flags+=(\"--display-name\")\n two_word_flags+=(\"-N\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--build-url=\")\n must_have_one_flag+=(\"-b\")\n must_have_one_flag+=(\"--commit-url=\")\n must_have_one_flag+=(\"-u\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_custom()\n{\n last_command=\"kosli_attest_custom\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--attestation-data=\")\n two_word_flags+=(\"--attestation-data\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--attestation-data=\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_flag+=(\"--type=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_decision()\n{\n last_command=\"kosli_attest_decision\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--compliant\")\n flags+=(\"-C\")\n flags+=(\"--control=\")\n two_word_flags+=(\"--control\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--control=\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_generic()\n{\n last_command=\"kosli_attest_generic\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--compliant\")\n flags+=(\"-C\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_jira()\n{\n last_command=\"kosli_attest_jira\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--ignore-branch-match\")\n flags+=(\"--jira-api-token=\")\n two_word_flags+=(\"--jira-api-token\")\n flags+=(\"--jira-base-url=\")\n two_word_flags+=(\"--jira-base-url\")\n flags+=(\"--jira-issue-fields=\")\n two_word_flags+=(\"--jira-issue-fields\")\n flags+=(\"--jira-pat=\")\n two_word_flags+=(\"--jira-pat\")\n flags+=(\"--jira-project-key=\")\n two_word_flags+=(\"--jira-project-key\")\n flags+=(\"--jira-secondary-source=\")\n two_word_flags+=(\"--jira-secondary-source\")\n flags+=(\"--jira-username=\")\n two_word_flags+=(\"--jira-username\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--jira-base-url=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_junit()\n{\n last_command=\"kosli_attest_junit\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--results-dir=\")\n two_word_flags+=(\"--results-dir\")\n two_word_flags+=(\"-R\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--upload-results\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_azure()\n{\n last_command=\"kosli_attest_pullrequest_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--azure-org-url=\")\n two_word_flags+=(\"--azure-org-url\")\n flags+=(\"--azure-token=\")\n two_word_flags+=(\"--azure-token\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-org-url=\")\n must_have_one_flag+=(\"--azure-token=\")\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_bitbucket()\n{\n last_command=\"kosli_attest_pullrequest_bitbucket\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--bitbucket-access-token=\")\n two_word_flags+=(\"--bitbucket-access-token\")\n flags+=(\"--bitbucket-password=\")\n two_word_flags+=(\"--bitbucket-password\")\n flags+=(\"--bitbucket-username=\")\n two_word_flags+=(\"--bitbucket-username\")\n flags+=(\"--bitbucket-workspace=\")\n two_word_flags+=(\"--bitbucket-workspace\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bitbucket-workspace=\")\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_github()\n{\n last_command=\"kosli_attest_pullrequest_github\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--github-base-url=\")\n two_word_flags+=(\"--github-base-url\")\n flags+=(\"--github-org=\")\n two_word_flags+=(\"--github-org\")\n flags+=(\"--github-token=\")\n two_word_flags+=(\"--github-token\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--github-org=\")\n must_have_one_flag+=(\"--github-token=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_gitlab()\n{\n last_command=\"kosli_attest_pullrequest_gitlab\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--gitlab-base-url=\")\n two_word_flags+=(\"--gitlab-base-url\")\n flags+=(\"--gitlab-org=\")\n two_word_flags+=(\"--gitlab-org\")\n flags+=(\"--gitlab-token=\")\n two_word_flags+=(\"--gitlab-token\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--gitlab-org=\")\n must_have_one_flag+=(\"--gitlab-token=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest()\n{\n last_command=\"kosli_attest_pullrequest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"az\")\n aliashash[\"az\"]=\"azure\"\n fi\n commands+=(\"bitbucket\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"bb\")\n aliashash[\"bb\"]=\"bitbucket\"\n fi\n commands+=(\"github\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gh\")\n aliashash[\"gh\"]=\"github\"\n fi\n commands+=(\"gitlab\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gl\")\n aliashash[\"gl\"]=\"gitlab\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_snyk()\n{\n last_command=\"kosli_attest_snyk\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--scan-results=\")\n two_word_flags+=(\"--scan-results\")\n two_word_flags+=(\"-R\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--upload-results\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--scan-results=\")\n must_have_one_flag+=(\"-R\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_sonar()\n{\n last_command=\"kosli_attest_sonar\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--max-wait=\")\n two_word_flags+=(\"--max-wait\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--pull-request=\")\n two_word_flags+=(\"--pull-request\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--sonar-api-token=\")\n two_word_flags+=(\"--sonar-api-token\")\n flags+=(\"--sonar-ce-task-url=\")\n two_word_flags+=(\"--sonar-ce-task-url\")\n flags+=(\"--sonar-project-key=\")\n two_word_flags+=(\"--sonar-project-key\")\n flags+=(\"--sonar-revision=\")\n two_word_flags+=(\"--sonar-revision\")\n flags+=(\"--sonar-server-url=\")\n two_word_flags+=(\"--sonar-server-url\")\n flags+=(\"--sonar-working-dir=\")\n two_word_flags+=(\"--sonar-working-dir\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--sonar-api-token=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest()\n{\n last_command=\"kosli_attest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n commands+=(\"custom\")\n commands+=(\"decision\")\n commands+=(\"generic\")\n commands+=(\"jira\")\n commands+=(\"junit\")\n commands+=(\"pullrequest\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"merge_request\")\n aliashash[\"merge_request\"]=\"pullrequest\"\n command_aliases+=(\"mergerequest\")\n aliashash[\"mergerequest\"]=\"pullrequest\"\n command_aliases+=(\"mr\")\n aliashash[\"mr\"]=\"pullrequest\"\n command_aliases+=(\"pr\")\n aliashash[\"pr\"]=\"pullrequest\"\n command_aliases+=(\"pull_request\")\n aliashash[\"pull_request\"]=\"pullrequest\"\n fi\n commands+=(\"snyk\")\n commands+=(\"sonar\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_begin_trail()\n{\n last_command=\"kosli_begin_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--template-file=\")\n two_word_flags+=(\"--template-file\")\n two_word_flags+=(\"-f\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_begin()\n{\n last_command=\"kosli_begin\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"trail\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_completion()\n{\n last_command=\"kosli_completion\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--help\")\n flags+=(\"-h\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n must_have_one_noun+=(\"bash\")\n must_have_one_noun+=(\"fish\")\n must_have_one_noun+=(\"powershell\")\n must_have_one_noun+=(\"zsh\")\n noun_aliases=()\n}\n\n_kosli_config()\n{\n last_command=\"kosli_config\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--set=\")\n two_word_flags+=(\"--set\")\n flags+=(\"--unset=\")\n two_word_flags+=(\"--unset\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_api-key()\n{\n last_command=\"kosli_create_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--expires-at=\")\n two_word_flags+=(\"--expires-at\")\n two_word_flags+=(\"-e\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--description=\")\n must_have_one_flag+=(\"-d\")\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_attestation-type()\n{\n last_command=\"kosli_create_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--jq=\")\n two_word_flags+=(\"--jq\")\n flags+=(\"--schema=\")\n two_word_flags+=(\"--schema\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_control()\n{\n last_command=\"kosli_create_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_environment()\n{\n last_command=\"kosli_create_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--included-environments=\")\n two_word_flags+=(\"--included-environments\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--type=\")\n must_have_one_flag+=(\"-t\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_flow()\n{\n last_command=\"kosli_create_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--template=\")\n two_word_flags+=(\"--template\")\n two_word_flags+=(\"-t\")\n flags+=(\"--template-file=\")\n two_word_flags+=(\"--template-file\")\n two_word_flags+=(\"-f\")\n flags+=(\"--use-empty-template\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_policy()\n{\n last_command=\"kosli_create_policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--comment=\")\n two_word_flags+=(\"--comment\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_service-account()\n{\n last_command=\"kosli_create_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--privilege=\")\n two_word_flags+=(\"--privilege\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--privilege=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create()\n{\n last_command=\"kosli_create\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n commands+=(\"policy\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete_api-key()\n{\n last_command=\"kosli_delete_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assume-yes\")\n flags+=(\"-y\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete_service-account()\n{\n last_command=\"kosli_delete_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assume-yes\")\n flags+=(\"-y\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete()\n{\n last_command=\"kosli_delete\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_detach-policy()\n{\n last_command=\"kosli_detach-policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_diff_snapshots()\n{\n last_command=\"kosli_diff_snapshots\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--show-unchanged\")\n flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_diff()\n{\n last_command=\"kosli_diff\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"snapshots\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_disable_beta()\n{\n last_command=\"kosli_disable_beta\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_disable()\n{\n last_command=\"kosli_disable\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"beta\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"experimental\")\n aliashash[\"experimental\"]=\"beta\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_enable_beta()\n{\n last_command=\"kosli_enable_beta\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_enable()\n{\n last_command=\"kosli_enable\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"beta\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"experimental\")\n aliashash[\"experimental\"]=\"beta\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_input()\n{\n last_command=\"kosli_evaluate_input\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--input-file=\")\n two_word_flags+=(\"--input-file\")\n two_word_flags+=(\"-i\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_trail()\n{\n last_command=\"kosli_evaluate_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--attestations=\")\n two_word_flags+=(\"--attestations\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_trails()\n{\n last_command=\"kosli_evaluate_trails\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--attestations=\")\n two_word_flags+=(\"--attestations\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate()\n{\n last_command=\"kosli_evaluate\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"input\")\n commands+=(\"trail\")\n commands+=(\"trails\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_fingerprint()\n{\n last_command=\"kosli_fingerprint\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--artifact-type=\")\n must_have_one_flag+=(\"-t\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_api-key()\n{\n last_command=\"kosli_get_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_artifact()\n{\n last_command=\"kosli_get_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_attestation()\n{\n last_command=\"kosli_get_attestation\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--attestation-id=\")\n two_word_flags+=(\"--attestation-id\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_attestation-type()\n{\n last_command=\"kosli_get_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_control()\n{\n last_command=\"kosli_get_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_default-org()\n{\n last_command=\"kosli_get_default-org\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_environment()\n{\n last_command=\"kosli_get_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_flow()\n{\n last_command=\"kosli_get_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_policy()\n{\n last_command=\"kosli_get_policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_repo()\n{\n last_command=\"kosli_get_repo\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_service-account()\n{\n last_command=\"kosli_get_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_snapshot()\n{\n last_command=\"kosli_get_snapshot\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_trail()\n{\n last_command=\"kosli_get_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get()\n{\n last_command=\"kosli_get\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"artifact\")\n commands+=(\"attestation\")\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"default-org\")\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n commands+=(\"policy\")\n commands+=(\"repo\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"trail\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_help()\n{\n last_command=\"kosli_help\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n has_completion_function=1\n noun_aliases=()\n}\n\n_kosli_join_environment()\n{\n last_command=\"kosli_join_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--logical=\")\n two_word_flags+=(\"--logical\")\n flags+=(\"--physical=\")\n two_word_flags+=(\"--physical\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--logical=\")\n must_have_one_flag+=(\"--physical=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_join()\n{\n last_command=\"kosli_join\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_api-keys()\n{\n last_command=\"kosli_list_api-keys\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_artifacts()\n{\n last_command=\"kosli_list_artifacts\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--repo=\")\n two_word_flags+=(\"--repo\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_attestation-types()\n{\n last_command=\"kosli_list_attestation-types\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_controls()\n{\n last_command=\"kosli_list_controls\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--archived\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--search=\")\n two_word_flags+=(\"--search\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_environments()\n{\n last_command=\"kosli_list_environments\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--sort=\")\n two_word_flags+=(\"--sort\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--space-id=\")\n two_word_flags+=(\"--space-id\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_flows()\n{\n last_command=\"kosli_list_flows\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--ignore-case\")\n flags+=(\"-i\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-N\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_policies()\n{\n last_command=\"kosli_list_policies\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_repos()\n{\n last_command=\"kosli_list_repos\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--search=\")\n two_word_flags+=(\"--search\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_service-accounts()\n{\n last_command=\"kosli_list_service-accounts\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_snapshots()\n{\n last_command=\"kosli_list_snapshots\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--interval=\")\n two_word_flags+=(\"--interval\")\n two_word_flags+=(\"-i\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--reverse\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_trails()\n{\n last_command=\"kosli_list_trails\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--flow-tag=\")\n two_word_flags+=(\"--flow-tag\")\n two_word_flags+=(\"-t\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list()\n{\n last_command=\"kosli_list\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-keys\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-keys\"\n command_aliases+=(\"aks\")\n aliashash[\"aks\"]=\"api-keys\"\n command_aliases+=(\"api-key\")\n aliashash[\"api-key\"]=\"api-keys\"\n fi\n commands+=(\"artifacts\")\n commands+=(\"attestation-types\")\n commands+=(\"controls\")\n commands+=(\"environments\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environments\"\n command_aliases+=(\"envs\")\n aliashash[\"envs\"]=\"environments\"\n fi\n commands+=(\"flows\")\n commands+=(\"policies\")\n commands+=(\"repos\")\n commands+=(\"service-accounts\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-accounts\"\n command_aliases+=(\"sas\")\n aliashash[\"sas\"]=\"service-accounts\"\n command_aliases+=(\"service-account\")\n aliashash[\"service-account\"]=\"service-accounts\"\n fi\n commands+=(\"snapshots\")\n commands+=(\"trails\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_log_environment()\n{\n last_command=\"kosli_log_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--end=\")\n two_word_flags+=(\"--end\")\n flags+=(\"--end-ts=\")\n two_word_flags+=(\"--end-ts\")\n flags+=(\"--interval=\")\n two_word_flags+=(\"--interval\")\n two_word_flags+=(\"-i\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--repo=\")\n two_word_flags+=(\"--repo\")\n flags+=(\"--reverse\")\n flags+=(\"--start=\")\n two_word_flags+=(\"--start\")\n flags+=(\"--start-ts=\")\n two_word_flags+=(\"--start-ts\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_log()\n{\n last_command=\"kosli_log\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename_environment()\n{\n last_command=\"kosli_rename_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename_flow()\n{\n last_command=\"kosli_rename_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename()\n{\n last_command=\"kosli_rename\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rotate_api-key()\n{\n last_command=\"kosli_rotate_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--expires-at=\")\n two_word_flags+=(\"--expires-at\")\n two_word_flags+=(\"-e\")\n flags+=(\"--grace-period-hours=\")\n two_word_flags+=(\"--grace-period-hours\")\n two_word_flags+=(\"-g\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rotate()\n{\n last_command=\"kosli_rotate\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_search()\n{\n last_command=\"kosli_search\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_azure()\n{\n last_command=\"kosli_snapshot_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--azure-client-id=\")\n two_word_flags+=(\"--azure-client-id\")\n flags+=(\"--azure-client-secret=\")\n two_word_flags+=(\"--azure-client-secret\")\n flags+=(\"--azure-resource-group-name=\")\n two_word_flags+=(\"--azure-resource-group-name\")\n flags+=(\"--azure-subscription-id=\")\n two_word_flags+=(\"--azure-subscription-id\")\n flags+=(\"--azure-tenant-id=\")\n two_word_flags+=(\"--azure-tenant-id\")\n flags+=(\"--digests-source=\")\n two_word_flags+=(\"--digests-source\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--zip\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-client-id=\")\n must_have_one_flag+=(\"--azure-client-secret=\")\n must_have_one_flag+=(\"--azure-resource-group-name=\")\n must_have_one_flag+=(\"--azure-subscription-id=\")\n must_have_one_flag+=(\"--azure-tenant-id=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_cloud-run()\n{\n last_command=\"kosli_snapshot_cloud-run\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--include=\")\n two_word_flags+=(\"--include\")\n flags+=(\"--include-regex=\")\n two_word_flags+=(\"--include-regex\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--region=\")\n two_word_flags+=(\"--region\")\n flags+=(\"--resolve-names\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--region=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_docker()\n{\n last_command=\"kosli_snapshot_docker\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_ecs()\n{\n last_command=\"kosli_snapshot_ecs\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--clusters=\")\n two_word_flags+=(\"--clusters\")\n flags+=(\"--clusters-regex=\")\n two_word_flags+=(\"--clusters-regex\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--exclude-services=\")\n two_word_flags+=(\"--exclude-services\")\n flags+=(\"--exclude-services-regex=\")\n two_word_flags+=(\"--exclude-services-regex\")\n flags+=(\"--services=\")\n two_word_flags+=(\"--services\")\n flags+=(\"--services-regex=\")\n two_word_flags+=(\"--services-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_k8s()\n{\n last_command=\"kosli_snapshot_k8s\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude-namespaces=\")\n two_word_flags+=(\"--exclude-namespaces\")\n two_word_flags+=(\"-x\")\n flags+=(\"--exclude-namespaces-regex=\")\n two_word_flags+=(\"--exclude-namespaces-regex\")\n flags+=(\"--kubeconfig=\")\n two_word_flags+=(\"--kubeconfig\")\n two_word_flags+=(\"-k\")\n flags+=(\"--namespaces=\")\n two_word_flags+=(\"--namespaces\")\n two_word_flags+=(\"-n\")\n flags+=(\"--namespaces-regex=\")\n two_word_flags+=(\"--namespaces-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_lambda()\n{\n last_command=\"kosli_snapshot_lambda\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--function-names=\")\n two_word_flags+=(\"--function-names\")\n flags+=(\"--function-names-regex=\")\n two_word_flags+=(\"--function-names-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_path()\n{\n last_command=\"kosli_snapshot_path\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--path=\")\n two_word_flags+=(\"--path\")\n flags+=(\"--watch\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"--path=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_paths()\n{\n last_command=\"kosli_snapshot_paths\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--paths-file=\")\n two_word_flags+=(\"--paths-file\")\n flags+=(\"--watch\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--paths-file=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_s3()\n{\n last_command=\"kosli_snapshot_s3\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--bucket=\")\n two_word_flags+=(\"--bucket\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--include=\")\n two_word_flags+=(\"--include\")\n two_word_flags+=(\"-i\")\n flags+=(\"--include-regex=\")\n two_word_flags+=(\"--include-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bucket=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot()\n{\n last_command=\"kosli_snapshot\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n commands+=(\"cloud-run\")\n commands+=(\"docker\")\n commands+=(\"ecs\")\n commands+=(\"k8s\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"kubernetes\")\n aliashash[\"kubernetes\"]=\"k8s\"\n fi\n commands+=(\"lambda\")\n commands+=(\"path\")\n commands+=(\"paths\")\n commands+=(\"s3\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"S3\")\n aliashash[\"S3\"]=\"s3\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_status()\n{\n last_command=\"kosli_status\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_tag()\n{\n last_command=\"kosli_tag\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--set=\")\n two_word_flags+=(\"--set\")\n two_word_flags+=(\"-s\")\n flags+=(\"--unset=\")\n two_word_flags+=(\"--unset\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_unarchive_control()\n{\n last_command=\"kosli_unarchive_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_unarchive()\n{\n last_command=\"kosli_unarchive\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"control\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_control()\n{\n last_command=\"kosli_update_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--link=\")\n two_word_flags+=(\"--link\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_default-org()\n{\n last_command=\"kosli_update_default-org\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_service-account()\n{\n last_command=\"kosli_update_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--privilege=\")\n two_word_flags+=(\"--privilege\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update()\n{\n last_command=\"kosli_update\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"control\")\n commands+=(\"default-org\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_version()\n{\n last_command=\"kosli_version\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--short\")\n flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_root_command()\n{\n last_command=\"kosli\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"allow\")\n commands+=(\"archive\")\n commands+=(\"assert\")\n commands+=(\"attach-policy\")\n commands+=(\"attest\")\n commands+=(\"begin\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"init\")\n aliashash[\"init\"]=\"begin\"\n command_aliases+=(\"start\")\n aliashash[\"start\"]=\"begin\"\n fi\n commands+=(\"completion\")\n commands+=(\"config\")\n commands+=(\"create\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"c\")\n aliashash[\"c\"]=\"create\"\n command_aliases+=(\"cr\")\n aliashash[\"cr\"]=\"create\"\n fi\n commands+=(\"delete\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"d\")\n aliashash[\"d\"]=\"delete\"\n command_aliases+=(\"de\")\n aliashash[\"de\"]=\"delete\"\n command_aliases+=(\"remove\")\n aliashash[\"remove\"]=\"delete\"\n command_aliases+=(\"rm\")\n aliashash[\"rm\"]=\"delete\"\n fi\n commands+=(\"detach-policy\")\n commands+=(\"diff\")\n commands+=(\"disable\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"dis\")\n aliashash[\"dis\"]=\"disable\"\n fi\n commands+=(\"enable\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"en\")\n aliashash[\"en\"]=\"enable\"\n fi\n commands+=(\"evaluate\")\n commands+=(\"fingerprint\")\n commands+=(\"get\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"g\")\n aliashash[\"g\"]=\"get\"\n fi\n commands+=(\"help\")\n commands+=(\"join\")\n commands+=(\"list\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"l\")\n aliashash[\"l\"]=\"list\"\n command_aliases+=(\"ls\")\n aliashash[\"ls\"]=\"list\"\n fi\n commands+=(\"log\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"lo\")\n aliashash[\"lo\"]=\"log\"\n fi\n commands+=(\"rename\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"re\")\n aliashash[\"re\"]=\"rename\"\n fi\n commands+=(\"rotate\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ro\")\n aliashash[\"ro\"]=\"rotate\"\n fi\n commands+=(\"search\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"se\")\n aliashash[\"se\"]=\"search\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"status\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"st\")\n aliashash[\"st\"]=\"status\"\n fi\n commands+=(\"tag\")\n commands+=(\"unarchive\")\n commands+=(\"update\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"u\")\n aliashash[\"u\"]=\"update\"\n command_aliases+=(\"up\")\n aliashash[\"up\"]=\"update\"\n fi\n commands+=(\"version\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ver\")\n aliashash[\"ver\"]=\"version\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n__start_kosli()\n{\n local cur prev words cword split\n declare -A flaghash 2>/dev/null || :\n declare -A aliashash 2>/dev/null || :\n if declare -F _init_completion >/dev/null 2>&1; then\n _init_completion -s || return\n else\n __kosli_init_completion -n \"=\" || return\n fi\n\n local c=0\n local flag_parsing_disabled=\n local flags=()\n local two_word_flags=()\n local local_nonpersistent_flags=()\n local flags_with_completion=()\n local flags_completion=()\n local commands=(\"kosli\")\n local command_aliases=()\n local must_have_one_flag=()\n local must_have_one_noun=()\n local has_completion_function=\"\"\n local last_command=\"\"\n local nouns=()\n local noun_aliases=()\n\n __kosli_handle_word\n}\n\nif [[ $(type -t compopt) = \"builtin\" ]]; then\n complete -o default -F __start_kosli kosli\nelse\n complete -o default -o nospace -F __start_kosli kosli\nfi\n\n# ex: ts=4 sw=4 et filetype=sh", - "flags_to_test": [], - "flag_values": {}, - "setup": [], - "verify": [] + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest sonar": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "sonar-api-token": "probe-sonar-api-token", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest sonar flow=probe-attest-sonar-baseline-fl trail=probe-attest-sonar-baseline-tr] open .scannerwork/report-task.txt: no such file or directory. Check your working directory is set correctly. Alternatively provide the project key and either revision or pull-request ID for the scan to attest", + "needs": "sonarqube", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "max-wait", + "name", + "origin-url", + "pull-request", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "sonar-api-token", + "sonar-branch", + "sonar-ce-task-url", + "sonar-project-key", + "sonar-revision", + "sonar-server-url", + "sonar-working-dir", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "max-wait": "probe-max-wait", + "name": "{name}", + "origin-url": "http://example.com", + "pull-request": "probe-pull-request", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "sonar-api-token": "probe-sonar-api-token", + "sonar-branch": "probe-sonar-branch", + "sonar-ce-task-url": "probe-sonar-ce-task-url", + "sonar-project-key": "probe-sonar-project-key", + "sonar-revision": "probe-sonar-revision", + "sonar-server-url": "probe-sonar-server-url", + "sonar-working-dir": "probe-sonar-working-dir", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "begin trail": { + "args": [ + "{trail}" + ], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ntrail '{trail}' was begun", + "flags_to_test": [ + "commit", + "description", + "dry-run", + "external-fingerprint", + "external-url", + "flow", + "origin-url", + "redact-commit-info", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "template-file", + "user-data" + ], + "flag_values": { + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "template-file": "cmd/kosli/testdata/valid_template.yml", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "config": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "default config file [/var/folders/21/v4jj5l055w393p67z831r5hr0000gn/T/kosli-audit-home-pktxkdvq/.kosli.yml] updated successfully.", + "flags_to_test": [ + "set", + "unset" + ], + "flag_values": { + "set": "probe=set", + "unset": "probe-unset" + }, + "setup": [], + "verify": [] + }, + "create api-key": { + "args": [], + "flags": { + "description": "probe-description", + "service-account": "{account}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "ID: {uuid}\nKey: {secret}\nDescription: probe-description\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A", + "flags_to_test": [ + "description", + "dry-run", + "expires-at", + "output", + "service-account" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "expires-at": "4102444800", + "output": "json", + "service-account": "{account}" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [] + }, + "create control": { + "args": [ + "{control}" + ], + "flags": { + "name": "{name}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "control {control} was created", + "flags_to_test": [ + "description", + "dry-run", + "name" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "name": "{name}" + }, + "setup": [], + "verify": [ + [ + "get", + "control", + "{control}", + "--output", + "json" + ] + ] + }, + "create environment": { + "args": [ + "{env}" + ], + "flags": { + "type": "K8S" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "environment {env} was created", + "flags_to_test": [ + "description", + "dry-run", + "exclude-scaling", + "include-scaling", + "included-environments", + "require-provenance", + "type" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "exclude-scaling": "true", + "include-scaling": "true", + "included-environments": "{env}", + "require-provenance": "true", + "type": "K8S" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "create flow": { + "args": [ + "{flow}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] creating a flow without --template-file or --use-empty-template uses a deprecated API endpoint and will stop working in a future release; please provide a template\nflow '{flow}' was created", + "flags_to_test": [ + "description", + "dry-run", + "template", + "template-file", + "use-empty-template", + "visibility" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "template": "probe-template", + "template-file": "cmd/kosli/testdata/valid_template.yml", + "use-empty-template": "true", + "visibility": "public" + }, + "setup": [], + "verify": [ + [ + "get", + "flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "create policy": { + "args": [ + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "policy '{policy}' was created", + "flags_to_test": [ + "comment", + "description", + "dry-run", + "type" + ], + "flag_values": { + "comment": "probe-comment", + "description": "probe-description", + "dry-run": "true", + "type": "env" + }, + "setup": [], + "verify": [ + [ + "get", + "policy", + "{policy}", + "--output", + "json" + ] + ] + }, + "create service-account": { + "args": [ + "{account}" + ], + "flags": { + "privilege": "reader" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "service account {account} was created", + "flags_to_test": [ + "description", + "dry-run", + "privilege" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "privilege": "reader" + }, + "setup": [], + "verify": [ + [ + "get", + "service-account", + "{account}", + "--output", + "json" + ] + ] + }, + "delete api-key": { + "args": [ + "{apikey}" + ], + "flags": { + "service-account": "{account}", + "assume-yes": "true" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "API key {apikey} for service account {account} was deleted!", + "flags_to_test": [ + "assume-yes", + "dry-run", + "service-account", + "yes" + ], + "flag_values": { + "assume-yes": "true", + "dry-run": "true", + "service-account": "{account}", + "yes": "true" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + }, + { + "argv": [ + "create", + "api-key", + "--service-account", + "{account}", + "--description", + "probe" + ], + "capture": [ + "apikey", + "ID:\\s+(\\S+)" + ] + } + ], + "verify": [] + }, + "diff snapshots": { + "args": [ + "{env}", + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "", + "flags_to_test": [ + "output", + "show-unchanged" + ], + "flag_values": { + "output": "json", + "show-unchanged": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] + }, + "disable beta": { + "args": [], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli disable beta] Not Found", + "needs": "a server that implements it", + "flags_to_test": [], + "flag_values": {}, + "setup": [], + "verify": [] + }, + "enable beta": { + "args": [], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli enable beta] Not Found", + "needs": "a server that implements it", + "flags_to_test": [], + "flag_values": {}, + "setup": [], + "verify": [] + }, + "evaluate input": { + "args": [], + "flags": { + "input-file": "cmd/kosli/testdata/person-schema.json", + "policy": "cmd/kosli/testdata/policies/allow-all.rego" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "RESULT: ALLOWED", + "flags_to_test": [ + "assert", + "attestations", + "flow", + "input-file", + "no-assert", + "output", + "params", + "policy", + "show-input" + ], + "flag_values": { + "assert": "true", + "attestations": "probe-attestations", + "flow": "{flow}", + "input-file": "cmd/kosli/testdata/person-schema.json", + "no-assert": "true", + "output": "json", + "params": "{}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego", + "show-input": "true" + }, + "setup": [], + "verify": [] + }, + "evaluate trail": { + "args": [ + "{trail}" + ], + "flags": { + "flow": "{flow}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "RESULT: ALLOWED", + "flags_to_test": [ + "assert", + "attestations", + "flow", + "no-assert", + "output", + "params", + "policy", + "show-input" + ], + "flag_values": { + "assert": "true", + "attestations": "probe-attestations", + "flow": "{flow}", + "no-assert": "true", + "output": "json", + "params": "{}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego", + "show-input": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "evaluate trails": { + "args": [ + "{trail}" + ], + "flags": { + "flow": "{flow}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "RESULT: ALLOWED", + "flags_to_test": [ + "assert", + "attestations", + "flow", + "no-assert", + "output", + "params", + "policy", + "show-input" + ], + "flag_values": { + "assert": "true", + "attestations": "probe-attestations", + "flow": "{flow}", + "no-assert": "true", + "output": "json", + "params": "{}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego", + "show-input": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "fingerprint": { + "args": [ + "cmd/kosli/testdata/person-schema.json" + ], + "flags": { + "artifact-type": "file" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "artifact-type", + "e", + "exclude", + "registry-password", + "registry-provider", + "registry-username" + ], + "flag_values": { + "artifact-type": "file", + "e": "probe-e", + "exclude": "probe-exclude", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username" + }, + "setup": [], + "verify": [] + }, + "get api-key": { + "args": [ + "{apikey}" + ], + "flags": { + "service-account": "{account}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "ID: {apikey}\nDescription: probe\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A\nLast Used: N/A", + "flags_to_test": [ + "output", + "service-account" + ], + "flag_values": { + "output": "json", + "service-account": "{account}" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + }, + { + "argv": [ + "create", + "api-key", + "--service-account", + "{account}", + "--description", + "probe" + ], + "capture": [ + "apikey", + "ID:\\s+(\\S+)" + ] + } + ], + "verify": [] + }, + "get artifact": { + "args": [ + "{flow}@1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: cmd/kosli/testdata/person-schema.json\nFlow: {flow}\nTrail: {trail}\nName in template: probe-artifact\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCreated on: {timestamp} \u2022 {ago}\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/{flow}/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01?artifact_id={uuid}\nState: COMPLIANT\nHistory:\n probe-artifact reported {timestamp}", + "flags_to_test": [ + "output", + "trail" + ], + "flag_values": { + "output": "json", + "trail": "{trail}" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com" + ] + } + ], + "verify": [] + }, + "get attestation": { + "args": [ + "probe-attestation" + ], + "flags": { + "flow": "{flow}", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: probe-attestation\nType: generic\nCompliance: true\nCreated at: {timestamp} \u2022 {ago}\nAttestation URL: http://localhost/docs-cmd-test-user-shared/flows/{flow}/trails/{trail}?attestation_id={uuid}", + "flags_to_test": [ + "attestation-id", + "fingerprint", + "flow", + "output", + "trail" + ], + "flag_values": { + "attestation-id": "probe-attestation-id", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "output": "json", + "trail": "{trail}" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com" + ] + }, + { + "argv": [ + "attest", + "generic", + "--name", + "probe-attestation", + "--flow", + "{flow}", + "--trail", + "{trail}" + ] + }, + { + "argv": [ + "attest", + "generic", + "--name", + "probe-on-artifact", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" + ] + } + ], + "verify": [], + "args_for_flag": { + "attestation-id": [], + "fingerprint": [ + "probe-on-artifact" + ] + }, + "flags_for_flag": { + "fingerprint": { + "flow": "{flow}" + } + } + }, + "get control": { + "args": [ + "{control}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Identifier: {control}\nName: {control}\nVersion: 1\nArchived: false\nCreated by: docs-cmd-test-user\nCreated at: {timestamp} \u2022 {ago}", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}" + ] + } + ], + "verify": [] + }, + "get default-org": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Default user organization: docs-cmd-test-user-shared", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [], + "verify": [] + }, + "get environment": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {env}\nType: K8S\nDescription: \nState: N/A\nLast Reported At: N/A\nTags: None\nPolicies: []", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [] + }, + "get flow": { + "args": [ + "{flow}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {flow}\nDescription: \nVisibility: private\nTemplate: \n version: 1\nLast Deployment At: N/A\nTags: None", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [] + }, + "get policy": { + "args": [ + "{policy}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {policy}\nDescription: \nCreated At: {timestamp} \u2022 {ago}\nVersions: 1\nAttached to environments: []\nPolicy content:\n _schema: https://kosli.com/schemas/policy/environment/v1\n \n artifacts:\n provenance:\n required: true\n \n trail-compliance:\n required: true", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "policy", + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml" + ] + } + ], + "verify": [] + }, + "get repo": { + "args": [ + "{name}" + ], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli get repo] Repo 'probe-get-repo-baseline-nm' not found", + "needs": "a connected git provider", + "flags_to_test": [ + "output", + "provider", + "repo-id" + ], + "flag_values": { + "output": "json", + "provider": "github", + "repo-id": "probe-repo-id" + }, + "setup": [], + "verify": [] + }, + "get service-account": { + "args": [ + "{account}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {account}\nDescription: N/A\nPrivilege: reader\nCreated At: {timestamp} \u2022 {ago}", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [] + }, + "get snapshot": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "COMMIT ARTIFACT FLOW COMPLIANCE RUNNING_SINCE REPLICAS\nN/A Name: probe-artifact N/A NON-COMPLIANT {ago} 1\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] + }, + "get trail": { + "args": [ + "{trail}" + ], + "flags": { + "flow": "{flow}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {trail}\nDescription: \nCompliance: COMPLIANT\nLast modified at: {timestamp} \u2022 {ago}\nEvents:\n\n TIME DESCRIPTION GIT-COMMIT COMPLIANCE\n {timestamp} trail started", + "flags_to_test": [ + "flow", + "output" + ], + "flag_values": { + "flow": "{flow}", + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "list api-keys": { + "args": [], + "flags": { + "service-account": "{account}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "ID DESCRIPTION CREATED EXPIRES LAST USED\n{apikey} probe {timestamp} \u2022 {ago} N/A N/A", + "flags_to_test": [ + "output", + "service-account" + ], + "flag_values": { + "output": "json", + "service-account": "{account}" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + }, + { + "argv": [ + "create", + "api-key", + "--service-account", + "{account}", + "--description", + "probe" + ], + "capture": [ + "apikey", + "ID:\\s+(\\S+)" + ] + } + ], + "verify": [] + }, + "list artifacts": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "COMMIT ARTIFACT STATE CREATED_AT\n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "flow", + "output", + "page", + "page-limit", + "repo" + ], + "flag_values": { + "flow": "{flow}", + "output": "json", + "page": "1", + "page-limit": "5", + "repo": "probe-repo" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "list controls": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "IDENTIFIER NAME DESCRIPTION CREATED AT\nprobe-create-control-baseline-co probe-create-control-baseline-nm {timestamp}\nprobe-get-control-baseline-co probe-get-control-baseline-co {timestamp}\n{control} {control} {timestamp}\n\nShowing page 1 of 1, total 3 controls", + "flags_to_test": [ + "archived", + "output", + "page", + "page-limit", + "search", + "sort-direction", + "tag" + ], + "flag_values": { + "archived": "true", + "output": "json", + "page": "1", + "page-limit": "5", + "search": "probe-search", + "sort-direction": "asc", + "tag": "probe-tag" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}" + ] + } + ], + "verify": [] + }, + "list environments": { + "args": [], + "flags": { + "page-limit": "5" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME TYPE LAST REPORT LAST MODIFIED TAGS POLICIES\nprobe-allow-artifact-baseline-en server {timestamp} []\nprobe-assert-snapshot-baseline-en server {timestamp} {timestamp} []\nprobe-create-environment-baseline-en K8S {timestamp} []\nprobe-diff-snapshots-baseline-en server {timestamp} {timestamp} []\nprobe-get-environment-baseline-en K8S {timestamp} []\n\nShowing page 1 of 2, total 9 items", + "flags_to_test": [ + "name", + "output", + "page", + "page-limit", + "sort", + "sort-direction", + "space-id", + "tag", + "type" + ], + "flag_values": { + "name": "{name}", + "output": "json", + "page": "1", + "page-limit": "5", + "sort": "name", + "sort-direction": "asc", + "space-id": "probe-space-id", + "tag": "probe-tag", + "type": "K8S" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [] + }, + "list flows": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION VISIBILITY TAGS\nprobe-allow-artifact-baseline-fl private \nprobe-archive-attestation-type-baseline-fl private \nprobe-assert-artifact-baseline-fl private \nprobe-attest-artifact-baseline-fl private \nprobe-attest-custom-baseline-fl private \nprobe-attest-decision-baseline-fl private \nprobe-attest-generic-baseline-fl private \nprobe-attest-jira-baseline-fl private \nprobe-attest-junit-baseline-fl private \nprobe-attest-override-baseline-fl private \nprobe-attest-pullrequest-azure-baseline-fl private \nprobe-attest-pullrequest-bitbucket-baseline-fl private \nprobe-attest-pullrequest-github-baseline-fl private \nprobe-attest-pullrequest-gitlab-baseline-fl private \nprobe-attest-snyk-baseline-fl private \nprobe-attest-sonar-baseline-fl private \nprobe-begin-trail-baseline-fl private \nprobe-create-attestation-type-baseline-fl private \nprobe-create-flow-baseline-fl private \nprobe-evaluate-trail-baseline-fl private \nprobe-evaluate-trails-baseline-fl private \nprobe-get-artifact-baseline-fl private \nprobe-get-attestation-baseline-fl private \nprobe-get-attestation-type-baseline-fl private \nprobe-get-flow-baseline-fl private \nprobe-get-trail-baseline-fl private \nprobe-list-artifacts-baseline-fl private \nprobe-list-attestation-types-baseline-fl private \n{flow} private", + "flags_to_test": [ + "ignore-case", + "name", + "output", + "page", + "page-limit" + ], + "flag_values": { + "ignore-case": "true", + "name": "{name}", + "output": "json", + "page": "1", + "page-limit": "5" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [] + }, + "list policies": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION CREATED AT LAST VERSION USED BY ENVS\nprobe-attach-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-create-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-detach-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-get-policy-baseline-po {timestamp} \u2022 {ago} 1 []", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [], + "verify": [] + }, + "list repos": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "No repos were found.", + "flags_to_test": [ + "name", + "output", + "page", + "page-limit", + "provider", + "repo-id", + "search", + "sort-direction", + "tag" + ], + "flag_values": { + "name": "{name}", + "output": "json", + "page": "1", + "page-limit": "5", + "provider": "github", + "repo-id": "probe-repo-id", + "search": "probe-search", + "sort-direction": "asc", + "tag": "probe-tag" + }, + "setup": [], + "verify": [] + }, + "list service-accounts": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION PRIVILEGE CREATED\nprobe-create-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-create-service-account-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-delete-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-get-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-get-service-account-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-list-api-keys-baseline-sa N/A reader {timestamp} \u2022 {ago}\n{account} N/A reader {timestamp} \u2022 {ago}", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [] + }, + "list snapshots": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "SNAPSHOT FROM TO DURATION COMPLIANT\n1 {timestamp} now about a second false", + "flags_to_test": [ + "interval", + "output", + "page", + "page-limit", + "reverse" + ], + "flag_values": { + "interval": "1", + "output": "json", + "page": "1", + "page-limit": "5", + "reverse": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] + }, + "list trails": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION COMPLIANCE\n{trail} COMPLIANT\nprobe-list-attestation-types-baseline-tr COMPLIANT\nprobe-list-artifacts-baseline-tr COMPLIANT\nprobe-get-trail-baseline-tr COMPLIANT\nprobe-get-attestation-type-baseline-tr COMPLIANT\nprobe-get-attestation-baseline-tr COMPLIANT\nprobe-get-artifact-baseline-tr COMPLIANT\nprobe-evaluate-trails-baseline-tr COMPLIANT\nprobe-evaluate-trail-baseline-tr COMPLIANT\nprobe-create-attestation-type-baseline-tr COMPLIANT\nprobe-begin-trail-baseline-tr COMPLIANT\nprobe-attest-sonar-baseline-tr COMPLIANT\nprobe-attest-snyk-baseline-tr COMPLIANT\nprobe-attest-pullrequest-gitlab-baseline-tr COMPLIANT\nprobe-attest-pullrequest-github-baseline-tr COMPLIANT\nprobe-attest-pullrequest-bitbucket-baseline-tr COMPLIANT\nprobe-attest-pullrequest-azure-baseline-tr COMPLIANT\nprobe-attest-override-baseline-tr COMPLIANT\nprobe-attest-junit-baseline-tr COMPLIANT\nprobe-attest-jira-baseline-tr NON-COMPLIANT\n\nShowing page 1 of 2, total 27 items", + "flags_to_test": [ + "fingerprint", + "flow", + "flow-tag", + "output", + "page", + "page-limit" + ], + "flag_values": { + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "flow-tag": "probe=flow-tag", + "output": "json", + "page": "1", + "page-limit": "5" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "rename flow": { + "args": [ + "{flow}", + "{name}-1" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "flow {flow} was renamed to {name}-1", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [ + [ + "get", + "flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "rotate api-key": { + "args": [ + "{apikey}" + ], + "flags": { + "service-account": "{account}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "ID: {apikey}\nKey: {secret}\nDescription: probe\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A\nOld Key Valid Until: {timestamp} \u2022 in one day", + "flags_to_test": [ + "dry-run", + "expires-at", + "grace-period-hours", + "output", + "service-account" + ], + "flag_values": { + "dry-run": "true", + "expires-at": "4102444800", + "grace-period-hours": "24", + "output": "json", + "service-account": "{account}" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + }, + { + "argv": [ + "create", + "api-key", + "--service-account", + "{account}", + "--description", + "probe" + ], + "capture": [ + "apikey", + "ID:\\s+(\\S+)" + ] + } + ], + "verify": [] + }, + "search": { + "args": [ + "{digest}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Search result resolved to artifact with fingerprint 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-assert-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-assert-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-attest-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-attest-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-get-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-get-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-get-attestation-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-get-attestation-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "{digest}", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [] + }, + "snapshot azure": { + "args": [ + "{env}" + ], + "flags": { + "azure-client-id": "probe-azure-client-id", + "azure-client-secret": "probe-azure-client-secret", + "azure-resource-group-name": "probe-azure-resource-group-name", + "azure-subscription-id": "probe-azure-subscription-id", + "azure-tenant-id": "probe-azure-tenant-id" + }, + "baseline_ok": false, + "error": "Error: [kosli snapshot azure] ClientSecretCredential authentication failed. ", + "needs": "azure", + "flags_to_test": [ + "azure-client-id", + "azure-client-secret", + "azure-resource-group-name", + "azure-subscription-id", + "azure-tenant-id", + "digests-source", + "dry-run", + "zip" + ], + "flag_values": { + "azure-client-id": "probe-azure-client-id", + "azure-client-secret": "probe-azure-client-secret", + "azure-resource-group-name": "probe-azure-resource-group-name", + "azure-subscription-id": "probe-azure-subscription-id", + "azure-tenant-id": "probe-azure-tenant-id", + "digests-source": "logs", + "dry-run": "true", + "zip": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot cloud-run": { + "args": [ + "{env}" + ], + "flags": { + "project": "probe-project", + "region": "probe-region" + }, + "baseline_ok": false, + "error": "Error: [kosli snapshot cloud-run] GCP client setup failed: credentials: could not find default credentials. See https://cloud.google.com/docs/authentication/external/set-up-adc for more information", + "needs": "google cloud", + "flags_to_test": [ + "dry-run", + "exclude", + "exclude-regex", + "include", + "include-regex", + "project", + "region", + "resolve-names" + ], + "flag_values": { + "dry-run": "true", + "exclude": "probe-exclude", + "exclude-regex": "probe-exclude-regex", + "include": "probe-include", + "include-regex": "probe-include-regex", + "project": "probe-project", + "region": "probe-region", + "resolve-names": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot docker": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[15] containers were reported to environment {env}", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "docker" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot ecs": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli snapshot ecs] failed to filter ECS clusters: operation error ECS: ListClusters, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded", + "needs": "aws", + "flags_to_test": [ + "aws-key-id", + "aws-region", + "aws-secret-key", + "cluster", + "clusters", + "clusters-regex", + "dry-run", + "exclude", + "exclude-regex", + "exclude-services", + "exclude-services-regex", + "service-name", + "services", + "services-regex" + ], + "flag_values": { + "aws-key-id": "probe-aws-key-id", + "aws-region": "probe-aws-region", + "aws-secret-key": "probe-aws-secret-key", + "cluster": "probe-cluster", + "clusters": "probe-clusters", + "clusters-regex": "probe-clusters-regex", + "dry-run": "true", + "exclude": "probe-exclude", + "exclude-regex": "probe-exclude-regex", + "exclude-services": "probe-exclude-services", + "exclude-services-regex": "probe-exclude-services-regex", + "service-name": "probe-service-name", + "services": "probe-services", + "services-regex": "probe-services-regex" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot k8s": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli snapshot k8s] could not build config from inside the cluster: unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined", + "needs": "kubernetes", + "flags_to_test": [ + "config-file", + "dry-run", + "exclude-namespaces", + "exclude-namespaces-regex", + "kubeconfig", + "namespaces", + "namespaces-regex" + ], + "flag_values": { + "config-file": "probe-config-file", + "dry-run": "true", + "exclude-namespaces": "probe-exclude-namespaces", + "exclude-namespaces-regex": "probe-exclude-namespaces-regex", + "kubeconfig": "probe-kubeconfig", + "namespaces": "probe-namespaces", + "namespaces-regex": "probe-namespaces-regex" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot lambda": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli snapshot lambda] operation error Lambda: ListFunctions, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded", + "needs": "aws", + "flags_to_test": [ + "aws-key-id", + "aws-region", + "aws-secret-key", + "dry-run", + "exclude", + "exclude-regex", + "function-name", + "function-names", + "function-names-regex", + "function-version" + ], + "flag_values": { + "aws-key-id": "probe-aws-key-id", + "aws-region": "probe-aws-region", + "aws-secret-key": "probe-aws-secret-key", + "dry-run": "true", + "exclude": "probe-exclude", + "exclude-regex": "probe-exclude-regex", + "function-name": "probe-function-name", + "function-names": "probe-function-names", + "function-names-regex": "probe-function-names-regex", + "function-version": "probe-function-version" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot path": { + "args": [ + "{env}" + ], + "flags": { + "name": "{name}", + "path": "cmd/kosli/testdata/person-schema.json" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[1] artifacts were reported to environment {env}", + "flags_to_test": [ + "dry-run", + "exclude", + "name", + "path", + "watch" + ], + "flag_values": { + "dry-run": "true", + "exclude": "probe-exclude", + "name": "{name}", + "path": "cmd/kosli/testdata/person-schema.json", + "watch": "false" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot paths": { + "args": [ + "{env}" + ], + "flags": { + "paths-file": "hack/empty-flag-audit/paths.yml" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[1] artifacts were reported to environment {env}", + "flags_to_test": [ + "dry-run", + "paths-file", + "watch" + ], + "flag_values": { + "dry-run": "true", + "paths-file": "hack/empty-flag-audit/paths.yml", + "watch": "false" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot s3": { + "args": [ + "{env}" + ], + "flags": { + "bucket": "probe-bucket" + }, + "baseline_ok": false, + "error": "Error: [kosli snapshot s3] operation error S3: ListObjectsV2, resolve auth scheme: resolve endpoint: endpoint rule error, Invalid region: region was not a valid DNS name.", + "needs": "aws", + "flags_to_test": [ + "aws-key-id", + "aws-region", + "aws-secret-key", + "bucket", + "dry-run", + "exclude", + "exclude-regex", + "include", + "include-regex" + ], + "flag_values": { + "aws-key-id": "probe-aws-key-id", + "aws-region": "probe-aws-region", + "aws-secret-key": "probe-aws-secret-key", + "bucket": "probe-bucket", + "dry-run": "true", + "exclude": "probe-exclude", + "exclude-regex": "probe-exclude-regex", + "include": "probe-include", + "include-regex": "probe-include-regex" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "status": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "OK", + "flags_to_test": [ + "assert" + ], + "flag_values": { + "assert": "true" + }, + "setup": [], + "verify": [] + }, + "tag": { + "args": [ + "flow", + "{flow}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "No tags were applied for flow '{flow}'", + "flags_to_test": [ + "dry-run", + "provider", + "repo-id", + "set", + "unset" + ], + "flag_values": { + "dry-run": "true", + "provider": "github", + "repo-id": "probe-repo-id", + "set": "probe=set", + "unset": "probe-unset" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [] + }, + "unarchive control": { + "args": [ + "{control}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "control {control} was unarchived", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}" + ] + } + ], + "verify": [ + [ + "get", + "control", + "{control}", + "--output", + "json" + ] + ] + }, + "update control": { + "args": [ + "{control}" + ], + "flags": { + "name": "{name}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "control {control} was updated", + "flags_to_test": [ + "description", + "dry-run", + "link", + "name" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "link": "probe=http://example.com", + "name": "{name}" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}", + "--description", + "probe-description-to-clear" + ] + } + ], + "verify": [ + [ + "get", + "control", + "{control}", + "--output", + "json" + ] + ] + }, + "update default-org": { + "args": [ + "docs-cmd-test-user-shared" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "default organization is set to: docs-cmd-test-user-shared", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [], + "verify": [] + }, + "version": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "version.BuildInfo{Version:\"dev\", GitCommit:\"\", GitTreeState:\"\", GoVersion:\"go1.26.5\"}", + "flags_to_test": [ + "short" + ], + "flag_values": { + "short": "true" + }, + "setup": [], + "verify": [] + }, + "attest override": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "new-compliance-status": "true", + "original-attestation-type": "generic", + "reason": "probe", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nattestation '{name}' has been overridden in trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "new-compliance-status", + "origin-url", + "original-attestation-type", + "reason", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "new-compliance-status": "true", + "origin-url": "http://example.com", + "original-attestation-type": "generic", + "reason": "probe", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "generic", + "--name", + "{name}", + "--flow", + "{flow}", + "--trail", + "{trail}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] } -} + }, + "archive attestation-type": { + "args": [ + "{name}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Custom attestation type {name} was archived", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "attestation-type", + "{name}", + "--schema", + "cmd/kosli/testdata/person-schema.json" + ] + } + ], + "verify": [] + }, + "assert pullrequest azure": { + "args": [], + "flags": { + "azure-org-url": "probe-azure-org-url", + "azure-token": "probe-azure-token", + "project": "probe-project", + "repository": "probe-repository" + }, + "baseline_ok": false, + "error": "Error: [kosli assert pullrequest azure] Options \"probe-azure-org-url/_apis\": unsupported protocol scheme \"\"", + "needs": "azure devops", + "flags_to_test": [ + "azure-org-url", + "azure-token", + "commit", + "dry-run", + "project", + "repository" + ], + "flag_values": { + "azure-org-url": "probe-azure-org-url", + "azure-token": "probe-azure-token", + "commit": "HEAD", + "dry-run": "true", + "project": "probe-project", + "repository": "probe-repository" + }, + "setup": [], + "verify": [] + }, + "assert pullrequest bitbucket": { + "args": [], + "flags": { + "bitbucket-username": "probe-bitbucket-username", + "bitbucket-password": "probe-bitbucket-password", + "bitbucket-workspace": "probe-bitbucket-workspace", + "repository": "probe-repository" + }, + "baseline_ok": false, + "error": "Error: [kosli assert pullrequest bitbucket] unexpected end of JSON input", + "needs": "bitbucket", + "flags_to_test": [ + "bitbucket-access-token", + "bitbucket-password", + "bitbucket-username", + "bitbucket-workspace", + "commit", + "dry-run", + "repository" + ], + "flag_values": { + "bitbucket-access-token": "probe-bitbucket-access-token", + "bitbucket-password": "probe-bitbucket-password", + "bitbucket-username": "probe-bitbucket-username", + "bitbucket-workspace": "probe-bitbucket-workspace", + "commit": "HEAD", + "dry-run": "true", + "repository": "probe-repository" + }, + "setup": [], + "verify": [] + }, + "assert pullrequest github": { + "args": [], + "flags": { + "github-org": "probe-github-org", + "github-token": "probe-github-token", + "repository": "probe-repository" + }, + "baseline_ok": false, + "error": "Error: [kosli assert pullrequest github] non-200 OK status code: 401 Unauthorized body: \"{\\r\\n \\\"message\\\": \\\"Bad credentials\\\",\\r\\n \\\"documentation_url\\\": \\\"https://docs.github.com/rest\\\",\\r\\n \\\"status\\\": \\\"401\\\"\\r\\n}\"", + "needs": "github", + "flags_to_test": [ + "commit", + "dry-run", + "github-base-url", + "github-org", + "github-token", + "repository" + ], + "flag_values": { + "commit": "HEAD", + "dry-run": "true", + "github-base-url": "probe-github-base-url", + "github-org": "probe-github-org", + "github-token": "probe-github-token", + "repository": "probe-repository" + }, + "setup": [], + "verify": [] + }, + "assert pullrequest gitlab": { + "args": [], + "flags": { + "gitlab-base-url": "http://localhost:8001", + "gitlab-org": "probe-gitlab-org", + "gitlab-token": "probe-gitlab-token", + "repository": "probe-repository" + }, + "baseline_ok": false, + "error": "Error: [kosli assert pullrequest gitlab] failed to list merge requests for commit HEAD: GET https://gitlab.com/api/v4/projects/probe-gitlab-org%!F(MISSING)probe-repository/repository/commits/HEAD/merge_requests: 401 {message: 401 Unauthorized}", + "needs": "gitlab", + "flags_to_test": [ + "commit", + "dry-run", + "gitlab-base-url", + "gitlab-org", + "gitlab-token", + "repository" + ], + "flag_values": { + "commit": "HEAD", + "dry-run": "true", + "gitlab-base-url": "http://localhost:8001", + "gitlab-org": "probe-gitlab-org", + "gitlab-token": "probe-gitlab-token", + "repository": "probe-repository" + }, + "setup": [], + "verify": [] + }, + "attach-policy": { + "args": [ + "{policy}" + ], + "flags": { + "environment": "{env}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "policy '{policy}' is attached to environments: [{env}]", + "flags_to_test": [ + "dry-run", + "environment" + ], + "flag_values": { + "dry-run": "true", + "environment": "{env}" + }, + "setup": [ + { + "argv": [ + "create", + "policy", + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml" + ] + } + ], + "verify": [ + [ + "get", + "policy", + "{policy}", + "--output", + "json" + ] + ] + }, + "attest pullrequest azure": { + "args": [], + "flags": { + "azure-org-url": "probe-azure-org-url", + "azure-token": "probe-azure-token", + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "project": "probe-project", + "repository": "probe-repository", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest pullrequest azure flow=probe-attest-pullrequest-azure-baseline-fl trail=probe-attest-pullrequest-azure-baseline-tr] Options \"probe-azure-org-url/_apis\": unsupported protocol scheme \"\"", + "needs": "azure devops", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "azure-org-url", + "azure-token", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "project", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "azure-org-url": "probe-azure-org-url", + "azure-token": "probe-azure-token", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "project": "probe-project", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest pullrequest bitbucket": { + "args": [], + "flags": { + "bitbucket-password": "probe-bitbucket-password", + "bitbucket-username": "probe-bitbucket-username", + "bitbucket-workspace": "probe-bitbucket-workspace", + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "repository": "probe-repository", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest pullrequest bitbucket flow=probe-attest-pullrequest-bitbucket-baseline-fl trail=probe-attest-pullrequest-bitbucket-baseline-tr] unexpected end of JSON input", + "needs": "bitbucket", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "bitbucket-access-token", + "bitbucket-password", + "bitbucket-username", + "bitbucket-workspace", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "bitbucket-access-token": "probe-bitbucket-access-token", + "bitbucket-password": "probe-bitbucket-password", + "bitbucket-username": "probe-bitbucket-username", + "bitbucket-workspace": "probe-bitbucket-workspace", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest pullrequest github": { + "args": [], + "flags": { + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "github-org": "probe-github-org", + "github-token": "probe-github-token", + "name": "{name}", + "repository": "probe-repository", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest pullrequest github flow=probe-attest-pullrequest-github-baseline-fl trail=probe-attest-pullrequest-github-baseline-tr] non-200 OK status code: 401 Unauthorized body: \"{\\r\\n \\\"message\\\": \\\"Bad credentials\\\",\\r\\n \\\"documentation_url\\\": \\\"https://docs.github.com/rest\\\",\\r\\n \\\"status\\\": \\\"401\\\"\\r\\n}\"", + "needs": "github", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "github-base-url", + "github-org", + "github-token", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "github-base-url": "probe-github-base-url", + "github-org": "probe-github-org", + "github-token": "probe-github-token", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest pullrequest gitlab": { + "args": [], + "flags": { + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "gitlab-base-url": "http://localhost:8001", + "gitlab-org": "probe-gitlab-org", + "gitlab-token": "probe-gitlab-token", + "name": "{name}", + "repository": "probe-repository", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest pullrequest gitlab flow=probe-attest-pullrequest-gitlab-baseline-fl trail=probe-attest-pullrequest-gitlab-baseline-tr] failed to list merge requests for commit 1ade42f39dd06d36aa603b9524a1b3eeaba9b796: GET https://gitlab.com/api/v4/projects/probe-gitlab-org%!F(MISSING)probe-repository/repository/commits/1ade42f39dd06d36aa603b9524a1b3eeaba9b796/merge_requests: 401 {message: 401 Unauthorized}", + "needs": "gitlab", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "gitlab-base-url", + "gitlab-org", + "gitlab-token", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "gitlab-base-url": "http://localhost:8001", + "gitlab-org": "probe-gitlab-org", + "gitlab-token": "probe-gitlab-token", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "create attestation-type": { + "args": [ + "{name}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "attestation-type {name} was created", + "flags_to_test": [ + "description", + "dry-run", + "jq", + "schema", + "summary", + "summary-json" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "jq": ".age >= 18", + "schema": "cmd/kosli/testdata/person-schema.json", + "summary": "Critical=.critical_count", + "summary-json": "[{\"name\":\"Critical\",\"expression\":\".critical_count\"}]" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "delete service-account": { + "args": [ + "{account}" + ], + "flags": { + "assume-yes": "true" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "service account {account} was deleted!", + "flags_to_test": [ + "assume-yes", + "dry-run", + "yes" + ], + "flag_values": { + "assume-yes": "true", + "dry-run": "true", + "yes": "true" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [ + [ + "get", + "service-account", + "{account}", + "--output", + "json" + ] + ] + }, + "detach-policy": { + "args": [ + "{policy}" + ], + "flags": { + "environment": "{env}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "policy '{policy}' is detached from environments: [{env}]", + "flags_to_test": [ + "dry-run", + "environment" + ], + "flag_values": { + "dry-run": "true", + "environment": "{env}" + }, + "setup": [ + { + "argv": [ + "create", + "policy", + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml" + ] + } + ], + "verify": [ + [ + "get", + "policy", + "{policy}", + "--output", + "json" + ] + ] + }, + "get attestation-type": { + "args": [ + "{name}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {name}\nOrganization: docs-cmd-test-user-shared\nArchived: false\nCreated By: docs-cmd-test-user\nCreated at: {timestamp} \u2022 {ago}\nLast modified at: {timestamp} \u2022 {ago}\nVersions: \n Version: 1\n Timestamp: {timestamp} \u2022 {ago}\n Created By: docs-cmd-test-user\n Type schema: {\"additionalProperties\":true,\"properties\":{\"age\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"}},\"type\":\"object\"}\n Evaluator: \n Content Type: default", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "attestation-type", + "{name}", + "--schema", + "cmd/kosli/testdata/person-schema.json" + ] + } + ], + "verify": [] + }, + "join environment": { + "args": [], + "flags": { + "logical": "{logical}", + "physical": "{env}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "environment '{env}' was joined to '{logical}'", + "flags_to_test": [ + "dry-run", + "logical", + "physical" + ], + "flag_values": { + "dry-run": "true", + "logical": "{logical}", + "physical": "{env}" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + }, + { + "argv": [ + "create", + "environment", + "{seed}", + "--type", + "K8S" + ] + }, + { + "argv": [ + "create", + "environment", + "{logical}", + "--type", + "logical", + "--included-environments", + "{seed}" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "list attestation-types": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION LATEST VERSION\n{name} 1\nprobe-get-attestation-type-baseline-nm 1\nprobe-create-attestation-type-baseline-nm 1\nprobe-attest-custom-baseline-nm 1", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "attestation-type", + "{name}", + "--schema", + "cmd/kosli/testdata/person-schema.json" + ] + } + ], + "verify": [] + }, + "log environment": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "SNAPSHOT EVENT FLOW\n#1 Artifact: probe-artifact \n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n Description: 1 instance started running (from 0 to 1) \n Reported at: {timestamp}", + "flags_to_test": [ + "end", + "end-ts", + "interval", + "output", + "page", + "page-limit", + "repo", + "reverse", + "start", + "start-ts" + ], + "flag_values": { + "end": "1", + "end-ts": "4102444800", + "interval": "1", + "output": "json", + "page": "1", + "page-limit": "5", + "repo": "probe-repo", + "reverse": "true", + "start": "1", + "start-ts": "1" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] + }, + "rename environment": { + "args": [ + "{env}", + "{name}-1" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "environment {env} was renamed to {name}-1", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "update service-account": { + "args": [ + "{account}" + ], + "flags": { + "description": "probe-description" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "service account {account} was updated", + "flags_to_test": [ + "description", + "dry-run", + "privilege" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "privilege": "reader" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [ + [ + "get", + "service-account", + "{account}", + "--output", + "json" + ] + ] + }, + "report artifact": { + "args": [ + "cmd/kosli/testdata/person-schema.json" + ], + "flags": { + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "build-url": "http://example.com", + "commit-url": "http://example.com", + "flow": "{flow}", + "git-commit": "HEAD" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Command \"artifact\" is deprecated, see kosli attest commands\nartifact cmd/kosli/testdata/person-schema.json was reported with fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "artifact-type", + "build-url", + "commit-url", + "dry-run", + "exclude", + "fingerprint", + "flow", + "git-commit", + "name", + "registry-password", + "registry-provider", + "registry-username", + "repo-root" + ], + "flag_values": { + "artifact-type": "file", + "build-url": "http://example.com", + "commit-url": "http://example.com", + "dry-run": "true", + "exclude": "probe-exclude", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "git-commit": "HEAD", + "name": "{name}", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-root": "." + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "snapshot server": { + "args": [ + "{env}" + ], + "flags": { + "paths": "." + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Command \"server\" is deprecated, use 'kosli snapshot paths' instead\n[1] artifacts were reported to environment {env}", + "flags_to_test": [ + "dry-run", + "e", + "exclude", + "paths" + ], + "flag_values": { + "dry-run": "true", + "e": "probe-e", + "exclude": "probe-exclude", + "paths": "." + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "completion": { + "args": [ + "bash" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "# bash completion for kosli -*- shell-script -*-\n\n__kosli_debug()\n{\n if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then\n echo \"$*\" >> \"${BASH_COMP_DEBUG_FILE}\"\n fi\n}\n\n# Homebrew on Macs have version 1.3 of bash-completion which doesn't include\n# _init_completion. This is a very minimal version of that function.\n__kosli_init_completion()\n{\n COMPREPLY=()\n _get_comp_words_by_ref \"$@\" cur prev words cword\n}\n\n__kosli_index_of_word()\n{\n local w word=$1\n shift\n index=0\n for w in \"$@\"; do\n [[ $w = \"$word\" ]] && return\n index=$((index+1))\n done\n index=-1\n}\n\n__kosli_contains_word()\n{\n local w word=$1; shift\n for w in \"$@\"; do\n [[ $w = \"$word\" ]] && return\n done\n return 1\n}\n\n__kosli_handle_go_custom_completion()\n{\n __kosli_debug \"${FUNCNAME[0]}: cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}\"\n\n local shellCompDirectiveError=1\n local shellCompDirectiveNoSpace=2\n local shellCompDirectiveNoFileComp=4\n local shellCompDirectiveFilterFileExt=8\n local shellCompDirectiveFilterDirs=16\n\n local out requestComp lastParam lastChar comp directive args\n\n # Prepare the command to request completions for the program.\n # Calling ${words[0]} instead of directly kosli allows handling aliases\n args=(\"${words[@]:1}\")\n # Disable ActiveHelp which is not supported for bash completion v1\n requestComp=\"KOSLI_ACTIVE_HELP=0 ${words[0]} __completeNoDesc ${args[*]}\"\n\n lastParam=${words[$((${#words[@]}-1))]}\n lastChar=${lastParam:$((${#lastParam}-1)):1}\n __kosli_debug \"${FUNCNAME[0]}: lastParam ${lastParam}, lastChar ${lastChar}\"\n\n if [ -z \"${cur}\" ] && [ \"${lastChar}\" != \"=\" ]; then\n # If the last parameter is complete (there is a space following it)\n # We add an extra empty parameter so we can indicate this to the go method.\n __kosli_debug \"${FUNCNAME[0]}: Adding extra empty parameter\"\n requestComp=\"${requestComp} \\\"\\\"\"\n fi\n\n __kosli_debug \"${FUNCNAME[0]}: calling ${requestComp}\"\n # Use eval to handle any environment variables and such\n out=$(eval \"${requestComp}\" 2>/dev/null)\n\n # Extract the directive integer at the very end of the output following a colon (:)\n directive=${out##*:}\n # Remove the directive\n out=${out%:*}\n if [ \"${directive}\" = \"${out}\" ]; then\n # There is not directive specified\n directive=0\n fi\n __kosli_debug \"${FUNCNAME[0]}: the completion directive is: ${directive}\"\n __kosli_debug \"${FUNCNAME[0]}: the completions are: ${out}\"\n\n if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then\n # Error code. No completion.\n __kosli_debug \"${FUNCNAME[0]}: received error from custom completion go code\"\n return\n else\n if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n __kosli_debug \"${FUNCNAME[0]}: activating no space\"\n compopt -o nospace\n fi\n fi\n if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n __kosli_debug \"${FUNCNAME[0]}: activating no file completion\"\n compopt +o default\n fi\n fi\n fi\n\n if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then\n # File extension filtering\n local fullFilter filter filteringCmd\n # Do not use quotes around the $out variable or else newline\n # characters will be kept.\n for filter in ${out}; do\n fullFilter+=\"$filter|\"\n done\n\n filteringCmd=\"_filedir $fullFilter\"\n __kosli_debug \"File filtering command: $filteringCmd\"\n $filteringCmd\n elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then\n # File completion for directories only\n local subdir\n # Use printf to strip any trailing newline\n subdir=$(printf \"%s\" \"${out}\")\n if [ -n \"$subdir\" ]; then\n __kosli_debug \"Listing directories in $subdir\"\n __kosli_handle_subdirs_in_dir_flag \"$subdir\"\n else\n __kosli_debug \"Listing directories in .\"\n _filedir -d\n fi\n else\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${out}\" -- \"$cur\")\n fi\n}\n\n__kosli_handle_reply()\n{\n __kosli_debug \"${FUNCNAME[0]}\"\n local comp\n case $cur in\n -*)\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n compopt -o nospace\n fi\n local allflags\n if [ ${#must_have_one_flag[@]} -ne 0 ]; then\n allflags=(\"${must_have_one_flag[@]}\")\n else\n allflags=(\"${flags[*]} ${two_word_flags[*]}\")\n fi\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${allflags[*]}\" -- \"$cur\")\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n [[ \"${COMPREPLY[0]}\" == *= ]] || compopt +o nospace\n fi\n\n # complete after --flag=abc\n if [[ $cur == *=* ]]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n compopt +o nospace\n fi\n\n local index flag\n flag=\"${cur%=*}\"\n __kosli_index_of_word \"${flag}\" \"${flags_with_completion[@]}\"\n COMPREPLY=()\n if [[ ${index} -ge 0 ]]; then\n PREFIX=\"\"\n cur=\"${cur#*=}\"\n ${flags_completion[${index}]}\n if [ -n \"${ZSH_VERSION:-}\" ]; then\n # zsh completion needs --flag= prefix\n eval \"COMPREPLY=( \\\"\\${COMPREPLY[@]/#/${flag}=}\\\" )\"\n fi\n fi\n fi\n\n if [[ -z \"${flag_parsing_disabled}\" ]]; then\n # If flag parsing is enabled, we have completed the flags and can return.\n # If flag parsing is disabled, we may not know all (or any) of the flags, so we fallthrough\n # to possibly call handle_go_custom_completion.\n return 0;\n fi\n ;;\n esac\n\n # check if we are handling a flag with special work handling\n local index\n __kosli_index_of_word \"${prev}\" \"${flags_with_completion[@]}\"\n if [[ ${index} -ge 0 ]]; then\n ${flags_completion[${index}]}\n return\n fi\n\n # we are parsing a flag and don't have a special handler, no completion\n if [[ ${cur} != \"${words[cword]}\" ]]; then\n return\n fi\n\n local completions\n completions=(\"${commands[@]}\")\n if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then\n completions+=(\"${must_have_one_noun[@]}\")\n elif [[ -n \"${has_completion_function}\" ]]; then\n # if a go completion function is provided, defer to that function\n __kosli_handle_go_custom_completion\n fi\n if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then\n completions+=(\"${must_have_one_flag[@]}\")\n fi\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${completions[*]}\" -- \"$cur\")\n\n if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${noun_aliases[*]}\" -- \"$cur\")\n fi\n\n if [[ ${#COMPREPLY[@]} -eq 0 ]]; then\n if declare -F __kosli_custom_func >/dev/null; then\n # try command name qualified custom func\n __kosli_custom_func\n else\n # otherwise fall back to unqualified for compatibility\n declare -F __custom_func >/dev/null && __custom_func\n fi\n fi\n\n # available in bash-completion >= 2, not always present on macOS\n if declare -F __ltrim_colon_completions >/dev/null; then\n __ltrim_colon_completions \"$cur\"\n fi\n\n # If there is only 1 completion and it is a flag with an = it will be completed\n # but we don't want a space after the =\n if [[ \"${#COMPREPLY[@]}\" -eq \"1\" ]] && [[ $(type -t compopt) = \"builtin\" ]] && [[ \"${COMPREPLY[0]}\" == --*= ]]; then\n compopt -o nospace\n fi\n}\n\n# The arguments should be in the form \"ext1|ext2|extn\"\n__kosli_handle_filename_extension_flag()\n{\n local ext=\"$1\"\n _filedir \"@(${ext})\"\n}\n\n__kosli_handle_subdirs_in_dir_flag()\n{\n local dir=\"$1\"\n pushd \"${dir}\" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return\n}\n\n__kosli_handle_flag()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n # if a command required a flag, and we found it, unset must_have_one_flag()\n local flagname=${words[c]}\n local flagvalue=\"\"\n # if the word contained an =\n if [[ ${words[c]} == *\"=\"* ]]; then\n flagvalue=${flagname#*=} # take in as flagvalue after the =\n flagname=${flagname%=*} # strip everything after the =\n flagname=\"${flagname}=\" # but put the = back\n fi\n __kosli_debug \"${FUNCNAME[0]}: looking for ${flagname}\"\n if __kosli_contains_word \"${flagname}\" \"${must_have_one_flag[@]}\"; then\n must_have_one_flag=()\n fi\n\n # if you set a flag which only applies to this command, don't show subcommands\n if __kosli_contains_word \"${flagname}\" \"${local_nonpersistent_flags[@]}\"; then\n commands=()\n fi\n\n # keep flag value with flagname as flaghash\n # flaghash variable is an associative array which is only supported in bash > 3.\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n if [ -n \"${flagvalue}\" ] ; then\n flaghash[${flagname}]=${flagvalue}\n elif [ -n \"${words[ $((c+1)) ]}\" ] ; then\n flaghash[${flagname}]=${words[ $((c+1)) ]}\n else\n flaghash[${flagname}]=\"true\" # pad \"true\" for bool flag\n fi\n fi\n\n # skip the argument to a two word flag\n if [[ ${words[c]} != *\"=\"* ]] && __kosli_contains_word \"${words[c]}\" \"${two_word_flags[@]}\"; then\n __kosli_debug \"${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument\"\n c=$((c+1))\n # if we are looking for a flags value, don't show commands\n if [[ $c -eq $cword ]]; then\n commands=()\n fi\n fi\n\n c=$((c+1))\n\n}\n\n__kosli_handle_noun()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n if __kosli_contains_word \"${words[c]}\" \"${must_have_one_noun[@]}\"; then\n must_have_one_noun=()\n elif __kosli_contains_word \"${words[c]}\" \"${noun_aliases[@]}\"; then\n must_have_one_noun=()\n fi\n\n nouns+=(\"${words[c]}\")\n c=$((c+1))\n}\n\n__kosli_handle_command()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n local next_command\n if [[ -n ${last_command} ]]; then\n next_command=\"_${last_command}_${words[c]//:/__}\"\n else\n if [[ $c -eq 0 ]]; then\n next_command=\"_kosli_root_command\"\n else\n next_command=\"_${words[c]//:/__}\"\n fi\n fi\n c=$((c+1))\n __kosli_debug \"${FUNCNAME[0]}: looking for ${next_command}\"\n declare -F \"$next_command\" >/dev/null && $next_command\n}\n\n__kosli_handle_word()\n{\n if [[ $c -ge $cword ]]; then\n __kosli_handle_reply\n return\n fi\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n if [[ \"${words[c]}\" == -* ]]; then\n __kosli_handle_flag\n elif __kosli_contains_word \"${words[c]}\" \"${commands[@]}\"; then\n __kosli_handle_command\n elif [[ $c -eq 0 ]]; then\n __kosli_handle_command\n elif __kosli_contains_word \"${words[c]}\" \"${command_aliases[@]}\"; then\n # aliashash variable is an associative array which is only supported in bash > 3.\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n words[c]=${aliashash[${words[c]}]}\n __kosli_handle_command\n else\n __kosli_handle_noun\n fi\n else\n __kosli_handle_noun\n fi\n __kosli_handle_word\n}\n\n_kosli_allow_artifact()\n{\n last_command=\"kosli_allow_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--reason=\")\n two_word_flags+=(\"--reason\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_flag+=(\"--reason=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_allow()\n{\n last_command=\"kosli_allow\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_attestation-type()\n{\n last_command=\"kosli_archive_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_control()\n{\n last_command=\"kosli_archive_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_environment()\n{\n last_command=\"kosli_archive_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_flow()\n{\n last_command=\"kosli_archive_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive()\n{\n last_command=\"kosli_archive\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"environment\")\n commands+=(\"flow\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_artifact()\n{\n last_command=\"kosli_assert_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_azure()\n{\n last_command=\"kosli_assert_pullrequest_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--azure-org-url=\")\n two_word_flags+=(\"--azure-org-url\")\n flags+=(\"--azure-token=\")\n two_word_flags+=(\"--azure-token\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-org-url=\")\n must_have_one_flag+=(\"--azure-token=\")\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_bitbucket()\n{\n last_command=\"kosli_assert_pullrequest_bitbucket\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--bitbucket-access-token=\")\n two_word_flags+=(\"--bitbucket-access-token\")\n flags+=(\"--bitbucket-password=\")\n two_word_flags+=(\"--bitbucket-password\")\n flags+=(\"--bitbucket-username=\")\n two_word_flags+=(\"--bitbucket-username\")\n flags+=(\"--bitbucket-workspace=\")\n two_word_flags+=(\"--bitbucket-workspace\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bitbucket-workspace=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_github()\n{\n last_command=\"kosli_assert_pullrequest_github\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--github-base-url=\")\n two_word_flags+=(\"--github-base-url\")\n flags+=(\"--github-org=\")\n two_word_flags+=(\"--github-org\")\n flags+=(\"--github-token=\")\n two_word_flags+=(\"--github-token\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--github-org=\")\n must_have_one_flag+=(\"--github-token=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_gitlab()\n{\n last_command=\"kosli_assert_pullrequest_gitlab\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--gitlab-base-url=\")\n two_word_flags+=(\"--gitlab-base-url\")\n flags+=(\"--gitlab-org=\")\n two_word_flags+=(\"--gitlab-org\")\n flags+=(\"--gitlab-token=\")\n two_word_flags+=(\"--gitlab-token\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--gitlab-org=\")\n must_have_one_flag+=(\"--gitlab-token=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest()\n{\n last_command=\"kosli_assert_pullrequest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"az\")\n aliashash[\"az\"]=\"azure\"\n fi\n commands+=(\"bitbucket\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"bb\")\n aliashash[\"bb\"]=\"bitbucket\"\n fi\n commands+=(\"github\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gh\")\n aliashash[\"gh\"]=\"github\"\n fi\n commands+=(\"gitlab\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gl\")\n aliashash[\"gl\"]=\"gitlab\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_snapshot()\n{\n last_command=\"kosli_assert_snapshot\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_status()\n{\n last_command=\"kosli_assert_status\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert()\n{\n last_command=\"kosli_assert\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n commands+=(\"pullrequest\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"merge_request\")\n aliashash[\"merge_request\"]=\"pullrequest\"\n command_aliases+=(\"mergerequest\")\n aliashash[\"mergerequest\"]=\"pullrequest\"\n command_aliases+=(\"mr\")\n aliashash[\"mr\"]=\"pullrequest\"\n command_aliases+=(\"pr\")\n aliashash[\"pr\"]=\"pullrequest\"\n command_aliases+=(\"pull_request\")\n aliashash[\"pull_request\"]=\"pullrequest\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"status\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attach-policy()\n{\n last_command=\"kosli_attach-policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_artifact()\n{\n last_command=\"kosli_attest_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--build-url=\")\n two_word_flags+=(\"--build-url\")\n two_word_flags+=(\"-b\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--commit-url=\")\n two_word_flags+=(\"--commit-url\")\n two_word_flags+=(\"-u\")\n flags+=(\"--display-name=\")\n two_word_flags+=(\"--display-name\")\n two_word_flags+=(\"-N\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--build-url=\")\n must_have_one_flag+=(\"-b\")\n must_have_one_flag+=(\"--commit-url=\")\n must_have_one_flag+=(\"-u\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_custom()\n{\n last_command=\"kosli_attest_custom\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--attestation-data=\")\n two_word_flags+=(\"--attestation-data\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--attestation-data=\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_flag+=(\"--type=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_decision()\n{\n last_command=\"kosli_attest_decision\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--compliant\")\n flags+=(\"-C\")\n flags+=(\"--control=\")\n two_word_flags+=(\"--control\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--control=\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_generic()\n{\n last_command=\"kosli_attest_generic\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--compliant\")\n flags+=(\"-C\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_jira()\n{\n last_command=\"kosli_attest_jira\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--ignore-branch-match\")\n flags+=(\"--jira-api-token=\")\n two_word_flags+=(\"--jira-api-token\")\n flags+=(\"--jira-base-url=\")\n two_word_flags+=(\"--jira-base-url\")\n flags+=(\"--jira-issue-fields=\")\n two_word_flags+=(\"--jira-issue-fields\")\n flags+=(\"--jira-pat=\")\n two_word_flags+=(\"--jira-pat\")\n flags+=(\"--jira-project-key=\")\n two_word_flags+=(\"--jira-project-key\")\n flags+=(\"--jira-secondary-source=\")\n two_word_flags+=(\"--jira-secondary-source\")\n flags+=(\"--jira-username=\")\n two_word_flags+=(\"--jira-username\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--jira-base-url=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_junit()\n{\n last_command=\"kosli_attest_junit\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--results-dir=\")\n two_word_flags+=(\"--results-dir\")\n two_word_flags+=(\"-R\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--upload-results\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_azure()\n{\n last_command=\"kosli_attest_pullrequest_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--azure-org-url=\")\n two_word_flags+=(\"--azure-org-url\")\n flags+=(\"--azure-token=\")\n two_word_flags+=(\"--azure-token\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-org-url=\")\n must_have_one_flag+=(\"--azure-token=\")\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_bitbucket()\n{\n last_command=\"kosli_attest_pullrequest_bitbucket\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--bitbucket-access-token=\")\n two_word_flags+=(\"--bitbucket-access-token\")\n flags+=(\"--bitbucket-password=\")\n two_word_flags+=(\"--bitbucket-password\")\n flags+=(\"--bitbucket-username=\")\n two_word_flags+=(\"--bitbucket-username\")\n flags+=(\"--bitbucket-workspace=\")\n two_word_flags+=(\"--bitbucket-workspace\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bitbucket-workspace=\")\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_github()\n{\n last_command=\"kosli_attest_pullrequest_github\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--github-base-url=\")\n two_word_flags+=(\"--github-base-url\")\n flags+=(\"--github-org=\")\n two_word_flags+=(\"--github-org\")\n flags+=(\"--github-token=\")\n two_word_flags+=(\"--github-token\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--github-org=\")\n must_have_one_flag+=(\"--github-token=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_gitlab()\n{\n last_command=\"kosli_attest_pullrequest_gitlab\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--gitlab-base-url=\")\n two_word_flags+=(\"--gitlab-base-url\")\n flags+=(\"--gitlab-org=\")\n two_word_flags+=(\"--gitlab-org\")\n flags+=(\"--gitlab-token=\")\n two_word_flags+=(\"--gitlab-token\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--gitlab-org=\")\n must_have_one_flag+=(\"--gitlab-token=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest()\n{\n last_command=\"kosli_attest_pullrequest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"az\")\n aliashash[\"az\"]=\"azure\"\n fi\n commands+=(\"bitbucket\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"bb\")\n aliashash[\"bb\"]=\"bitbucket\"\n fi\n commands+=(\"github\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gh\")\n aliashash[\"gh\"]=\"github\"\n fi\n commands+=(\"gitlab\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gl\")\n aliashash[\"gl\"]=\"gitlab\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_snyk()\n{\n last_command=\"kosli_attest_snyk\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--scan-results=\")\n two_word_flags+=(\"--scan-results\")\n two_word_flags+=(\"-R\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--upload-results\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--scan-results=\")\n must_have_one_flag+=(\"-R\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_sonar()\n{\n last_command=\"kosli_attest_sonar\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--max-wait=\")\n two_word_flags+=(\"--max-wait\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--pull-request=\")\n two_word_flags+=(\"--pull-request\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--sonar-api-token=\")\n two_word_flags+=(\"--sonar-api-token\")\n flags+=(\"--sonar-ce-task-url=\")\n two_word_flags+=(\"--sonar-ce-task-url\")\n flags+=(\"--sonar-project-key=\")\n two_word_flags+=(\"--sonar-project-key\")\n flags+=(\"--sonar-revision=\")\n two_word_flags+=(\"--sonar-revision\")\n flags+=(\"--sonar-server-url=\")\n two_word_flags+=(\"--sonar-server-url\")\n flags+=(\"--sonar-working-dir=\")\n two_word_flags+=(\"--sonar-working-dir\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--sonar-api-token=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest()\n{\n last_command=\"kosli_attest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n commands+=(\"custom\")\n commands+=(\"decision\")\n commands+=(\"generic\")\n commands+=(\"jira\")\n commands+=(\"junit\")\n commands+=(\"pullrequest\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"merge_request\")\n aliashash[\"merge_request\"]=\"pullrequest\"\n command_aliases+=(\"mergerequest\")\n aliashash[\"mergerequest\"]=\"pullrequest\"\n command_aliases+=(\"mr\")\n aliashash[\"mr\"]=\"pullrequest\"\n command_aliases+=(\"pr\")\n aliashash[\"pr\"]=\"pullrequest\"\n command_aliases+=(\"pull_request\")\n aliashash[\"pull_request\"]=\"pullrequest\"\n fi\n commands+=(\"snyk\")\n commands+=(\"sonar\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_begin_trail()\n{\n last_command=\"kosli_begin_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--template-file=\")\n two_word_flags+=(\"--template-file\")\n two_word_flags+=(\"-f\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_begin()\n{\n last_command=\"kosli_begin\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"trail\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_completion()\n{\n last_command=\"kosli_completion\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--help\")\n flags+=(\"-h\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n must_have_one_noun+=(\"bash\")\n must_have_one_noun+=(\"fish\")\n must_have_one_noun+=(\"powershell\")\n must_have_one_noun+=(\"zsh\")\n noun_aliases=()\n}\n\n_kosli_config()\n{\n last_command=\"kosli_config\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--set=\")\n two_word_flags+=(\"--set\")\n flags+=(\"--unset=\")\n two_word_flags+=(\"--unset\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_api-key()\n{\n last_command=\"kosli_create_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--expires-at=\")\n two_word_flags+=(\"--expires-at\")\n two_word_flags+=(\"-e\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--description=\")\n must_have_one_flag+=(\"-d\")\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_attestation-type()\n{\n last_command=\"kosli_create_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--jq=\")\n two_word_flags+=(\"--jq\")\n flags+=(\"--schema=\")\n two_word_flags+=(\"--schema\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_control()\n{\n last_command=\"kosli_create_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_environment()\n{\n last_command=\"kosli_create_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--included-environments=\")\n two_word_flags+=(\"--included-environments\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--type=\")\n must_have_one_flag+=(\"-t\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_flow()\n{\n last_command=\"kosli_create_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--template=\")\n two_word_flags+=(\"--template\")\n two_word_flags+=(\"-t\")\n flags+=(\"--template-file=\")\n two_word_flags+=(\"--template-file\")\n two_word_flags+=(\"-f\")\n flags+=(\"--use-empty-template\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_policy()\n{\n last_command=\"kosli_create_policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--comment=\")\n two_word_flags+=(\"--comment\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_service-account()\n{\n last_command=\"kosli_create_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--privilege=\")\n two_word_flags+=(\"--privilege\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--privilege=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create()\n{\n last_command=\"kosli_create\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n commands+=(\"policy\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete_api-key()\n{\n last_command=\"kosli_delete_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assume-yes\")\n flags+=(\"-y\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete_service-account()\n{\n last_command=\"kosli_delete_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assume-yes\")\n flags+=(\"-y\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete()\n{\n last_command=\"kosli_delete\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_detach-policy()\n{\n last_command=\"kosli_detach-policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_diff_snapshots()\n{\n last_command=\"kosli_diff_snapshots\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--show-unchanged\")\n flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_diff()\n{\n last_command=\"kosli_diff\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"snapshots\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_disable_beta()\n{\n last_command=\"kosli_disable_beta\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_disable()\n{\n last_command=\"kosli_disable\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"beta\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"experimental\")\n aliashash[\"experimental\"]=\"beta\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_enable_beta()\n{\n last_command=\"kosli_enable_beta\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_enable()\n{\n last_command=\"kosli_enable\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"beta\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"experimental\")\n aliashash[\"experimental\"]=\"beta\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_input()\n{\n last_command=\"kosli_evaluate_input\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--input-file=\")\n two_word_flags+=(\"--input-file\")\n two_word_flags+=(\"-i\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_trail()\n{\n last_command=\"kosli_evaluate_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--attestations=\")\n two_word_flags+=(\"--attestations\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_trails()\n{\n last_command=\"kosli_evaluate_trails\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--attestations=\")\n two_word_flags+=(\"--attestations\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate()\n{\n last_command=\"kosli_evaluate\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"input\")\n commands+=(\"trail\")\n commands+=(\"trails\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_fingerprint()\n{\n last_command=\"kosli_fingerprint\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--artifact-type=\")\n must_have_one_flag+=(\"-t\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_api-key()\n{\n last_command=\"kosli_get_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_artifact()\n{\n last_command=\"kosli_get_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_attestation()\n{\n last_command=\"kosli_get_attestation\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--attestation-id=\")\n two_word_flags+=(\"--attestation-id\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_attestation-type()\n{\n last_command=\"kosli_get_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_control()\n{\n last_command=\"kosli_get_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_default-org()\n{\n last_command=\"kosli_get_default-org\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_environment()\n{\n last_command=\"kosli_get_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_flow()\n{\n last_command=\"kosli_get_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_policy()\n{\n last_command=\"kosli_get_policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_repo()\n{\n last_command=\"kosli_get_repo\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_service-account()\n{\n last_command=\"kosli_get_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_snapshot()\n{\n last_command=\"kosli_get_snapshot\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_trail()\n{\n last_command=\"kosli_get_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get()\n{\n last_command=\"kosli_get\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"artifact\")\n commands+=(\"attestation\")\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"default-org\")\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n commands+=(\"policy\")\n commands+=(\"repo\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"trail\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_help()\n{\n last_command=\"kosli_help\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n has_completion_function=1\n noun_aliases=()\n}\n\n_kosli_join_environment()\n{\n last_command=\"kosli_join_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--logical=\")\n two_word_flags+=(\"--logical\")\n flags+=(\"--physical=\")\n two_word_flags+=(\"--physical\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--logical=\")\n must_have_one_flag+=(\"--physical=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_join()\n{\n last_command=\"kosli_join\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_api-keys()\n{\n last_command=\"kosli_list_api-keys\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_artifacts()\n{\n last_command=\"kosli_list_artifacts\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--repo=\")\n two_word_flags+=(\"--repo\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_attestation-types()\n{\n last_command=\"kosli_list_attestation-types\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_controls()\n{\n last_command=\"kosli_list_controls\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--archived\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--search=\")\n two_word_flags+=(\"--search\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_environments()\n{\n last_command=\"kosli_list_environments\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--sort=\")\n two_word_flags+=(\"--sort\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--space-id=\")\n two_word_flags+=(\"--space-id\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_flows()\n{\n last_command=\"kosli_list_flows\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--ignore-case\")\n flags+=(\"-i\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-N\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_policies()\n{\n last_command=\"kosli_list_policies\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_repos()\n{\n last_command=\"kosli_list_repos\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--search=\")\n two_word_flags+=(\"--search\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_service-accounts()\n{\n last_command=\"kosli_list_service-accounts\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_snapshots()\n{\n last_command=\"kosli_list_snapshots\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--interval=\")\n two_word_flags+=(\"--interval\")\n two_word_flags+=(\"-i\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--reverse\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_trails()\n{\n last_command=\"kosli_list_trails\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--flow-tag=\")\n two_word_flags+=(\"--flow-tag\")\n two_word_flags+=(\"-t\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list()\n{\n last_command=\"kosli_list\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-keys\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-keys\"\n command_aliases+=(\"aks\")\n aliashash[\"aks\"]=\"api-keys\"\n command_aliases+=(\"api-key\")\n aliashash[\"api-key\"]=\"api-keys\"\n fi\n commands+=(\"artifacts\")\n commands+=(\"attestation-types\")\n commands+=(\"controls\")\n commands+=(\"environments\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environments\"\n command_aliases+=(\"envs\")\n aliashash[\"envs\"]=\"environments\"\n fi\n commands+=(\"flows\")\n commands+=(\"policies\")\n commands+=(\"repos\")\n commands+=(\"service-accounts\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-accounts\"\n command_aliases+=(\"sas\")\n aliashash[\"sas\"]=\"service-accounts\"\n command_aliases+=(\"service-account\")\n aliashash[\"service-account\"]=\"service-accounts\"\n fi\n commands+=(\"snapshots\")\n commands+=(\"trails\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_log_environment()\n{\n last_command=\"kosli_log_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--end=\")\n two_word_flags+=(\"--end\")\n flags+=(\"--end-ts=\")\n two_word_flags+=(\"--end-ts\")\n flags+=(\"--interval=\")\n two_word_flags+=(\"--interval\")\n two_word_flags+=(\"-i\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--repo=\")\n two_word_flags+=(\"--repo\")\n flags+=(\"--reverse\")\n flags+=(\"--start=\")\n two_word_flags+=(\"--start\")\n flags+=(\"--start-ts=\")\n two_word_flags+=(\"--start-ts\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_log()\n{\n last_command=\"kosli_log\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename_environment()\n{\n last_command=\"kosli_rename_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename_flow()\n{\n last_command=\"kosli_rename_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename()\n{\n last_command=\"kosli_rename\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rotate_api-key()\n{\n last_command=\"kosli_rotate_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--expires-at=\")\n two_word_flags+=(\"--expires-at\")\n two_word_flags+=(\"-e\")\n flags+=(\"--grace-period-hours=\")\n two_word_flags+=(\"--grace-period-hours\")\n two_word_flags+=(\"-g\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rotate()\n{\n last_command=\"kosli_rotate\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_search()\n{\n last_command=\"kosli_search\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_azure()\n{\n last_command=\"kosli_snapshot_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--azure-client-id=\")\n two_word_flags+=(\"--azure-client-id\")\n flags+=(\"--azure-client-secret=\")\n two_word_flags+=(\"--azure-client-secret\")\n flags+=(\"--azure-resource-group-name=\")\n two_word_flags+=(\"--azure-resource-group-name\")\n flags+=(\"--azure-subscription-id=\")\n two_word_flags+=(\"--azure-subscription-id\")\n flags+=(\"--azure-tenant-id=\")\n two_word_flags+=(\"--azure-tenant-id\")\n flags+=(\"--digests-source=\")\n two_word_flags+=(\"--digests-source\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--zip\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-client-id=\")\n must_have_one_flag+=(\"--azure-client-secret=\")\n must_have_one_flag+=(\"--azure-resource-group-name=\")\n must_have_one_flag+=(\"--azure-subscription-id=\")\n must_have_one_flag+=(\"--azure-tenant-id=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_cloud-run()\n{\n last_command=\"kosli_snapshot_cloud-run\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--include=\")\n two_word_flags+=(\"--include\")\n flags+=(\"--include-regex=\")\n two_word_flags+=(\"--include-regex\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--region=\")\n two_word_flags+=(\"--region\")\n flags+=(\"--resolve-names\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--region=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_docker()\n{\n last_command=\"kosli_snapshot_docker\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_ecs()\n{\n last_command=\"kosli_snapshot_ecs\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--clusters=\")\n two_word_flags+=(\"--clusters\")\n flags+=(\"--clusters-regex=\")\n two_word_flags+=(\"--clusters-regex\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--exclude-services=\")\n two_word_flags+=(\"--exclude-services\")\n flags+=(\"--exclude-services-regex=\")\n two_word_flags+=(\"--exclude-services-regex\")\n flags+=(\"--services=\")\n two_word_flags+=(\"--services\")\n flags+=(\"--services-regex=\")\n two_word_flags+=(\"--services-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_k8s()\n{\n last_command=\"kosli_snapshot_k8s\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude-namespaces=\")\n two_word_flags+=(\"--exclude-namespaces\")\n two_word_flags+=(\"-x\")\n flags+=(\"--exclude-namespaces-regex=\")\n two_word_flags+=(\"--exclude-namespaces-regex\")\n flags+=(\"--kubeconfig=\")\n two_word_flags+=(\"--kubeconfig\")\n two_word_flags+=(\"-k\")\n flags+=(\"--namespaces=\")\n two_word_flags+=(\"--namespaces\")\n two_word_flags+=(\"-n\")\n flags+=(\"--namespaces-regex=\")\n two_word_flags+=(\"--namespaces-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_lambda()\n{\n last_command=\"kosli_snapshot_lambda\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--function-names=\")\n two_word_flags+=(\"--function-names\")\n flags+=(\"--function-names-regex=\")\n two_word_flags+=(\"--function-names-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_path()\n{\n last_command=\"kosli_snapshot_path\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--path=\")\n two_word_flags+=(\"--path\")\n flags+=(\"--watch\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"--path=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_paths()\n{\n last_command=\"kosli_snapshot_paths\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--paths-file=\")\n two_word_flags+=(\"--paths-file\")\n flags+=(\"--watch\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--paths-file=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_s3()\n{\n last_command=\"kosli_snapshot_s3\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--bucket=\")\n two_word_flags+=(\"--bucket\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--include=\")\n two_word_flags+=(\"--include\")\n two_word_flags+=(\"-i\")\n flags+=(\"--include-regex=\")\n two_word_flags+=(\"--include-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bucket=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot()\n{\n last_command=\"kosli_snapshot\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n commands+=(\"cloud-run\")\n commands+=(\"docker\")\n commands+=(\"ecs\")\n commands+=(\"k8s\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"kubernetes\")\n aliashash[\"kubernetes\"]=\"k8s\"\n fi\n commands+=(\"lambda\")\n commands+=(\"path\")\n commands+=(\"paths\")\n commands+=(\"s3\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"S3\")\n aliashash[\"S3\"]=\"s3\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_status()\n{\n last_command=\"kosli_status\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_tag()\n{\n last_command=\"kosli_tag\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--set=\")\n two_word_flags+=(\"--set\")\n two_word_flags+=(\"-s\")\n flags+=(\"--unset=\")\n two_word_flags+=(\"--unset\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_unarchive_control()\n{\n last_command=\"kosli_unarchive_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_unarchive()\n{\n last_command=\"kosli_unarchive\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"control\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_control()\n{\n last_command=\"kosli_update_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--link=\")\n two_word_flags+=(\"--link\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_default-org()\n{\n last_command=\"kosli_update_default-org\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_service-account()\n{\n last_command=\"kosli_update_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--privilege=\")\n two_word_flags+=(\"--privilege\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update()\n{\n last_command=\"kosli_update\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"control\")\n commands+=(\"default-org\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_version()\n{\n last_command=\"kosli_version\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--short\")\n flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_root_command()\n{\n last_command=\"kosli\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"allow\")\n commands+=(\"archive\")\n commands+=(\"assert\")\n commands+=(\"attach-policy\")\n commands+=(\"attest\")\n commands+=(\"begin\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"init\")\n aliashash[\"init\"]=\"begin\"\n command_aliases+=(\"start\")\n aliashash[\"start\"]=\"begin\"\n fi\n commands+=(\"completion\")\n commands+=(\"config\")\n commands+=(\"create\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"c\")\n aliashash[\"c\"]=\"create\"\n command_aliases+=(\"cr\")\n aliashash[\"cr\"]=\"create\"\n fi\n commands+=(\"delete\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"d\")\n aliashash[\"d\"]=\"delete\"\n command_aliases+=(\"de\")\n aliashash[\"de\"]=\"delete\"\n command_aliases+=(\"remove\")\n aliashash[\"remove\"]=\"delete\"\n command_aliases+=(\"rm\")\n aliashash[\"rm\"]=\"delete\"\n fi\n commands+=(\"detach-policy\")\n commands+=(\"diff\")\n commands+=(\"disable\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"dis\")\n aliashash[\"dis\"]=\"disable\"\n fi\n commands+=(\"enable\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"en\")\n aliashash[\"en\"]=\"enable\"\n fi\n commands+=(\"evaluate\")\n commands+=(\"fingerprint\")\n commands+=(\"get\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"g\")\n aliashash[\"g\"]=\"get\"\n fi\n commands+=(\"help\")\n commands+=(\"join\")\n commands+=(\"list\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"l\")\n aliashash[\"l\"]=\"list\"\n command_aliases+=(\"ls\")\n aliashash[\"ls\"]=\"list\"\n fi\n commands+=(\"log\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"lo\")\n aliashash[\"lo\"]=\"log\"\n fi\n commands+=(\"rename\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"re\")\n aliashash[\"re\"]=\"rename\"\n fi\n commands+=(\"rotate\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ro\")\n aliashash[\"ro\"]=\"rotate\"\n fi\n commands+=(\"search\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"se\")\n aliashash[\"se\"]=\"search\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"status\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"st\")\n aliashash[\"st\"]=\"status\"\n fi\n commands+=(\"tag\")\n commands+=(\"unarchive\")\n commands+=(\"update\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"u\")\n aliashash[\"u\"]=\"update\"\n command_aliases+=(\"up\")\n aliashash[\"up\"]=\"update\"\n fi\n commands+=(\"version\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ver\")\n aliashash[\"ver\"]=\"version\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n__start_kosli()\n{\n local cur prev words cword split\n declare -A flaghash 2>/dev/null || :\n declare -A aliashash 2>/dev/null || :\n if declare -F _init_completion >/dev/null 2>&1; then\n _init_completion -s || return\n else\n __kosli_init_completion -n \"=\" || return\n fi\n\n local c=0\n local flag_parsing_disabled=\n local flags=()\n local two_word_flags=()\n local local_nonpersistent_flags=()\n local flags_with_completion=()\n local flags_completion=()\n local commands=(\"kosli\")\n local command_aliases=()\n local must_have_one_flag=()\n local must_have_one_noun=()\n local has_completion_function=\"\"\n local last_command=\"\"\n local nouns=()\n local noun_aliases=()\n\n __kosli_handle_word\n}\n\nif [[ $(type -t compopt) = \"builtin\" ]]; then\n complete -o default -F __start_kosli kosli\nelse\n complete -o default -o nospace -F __start_kosli kosli\nfi\n\n# ex: ts=4 sw=4 et filetype=sh", + "flags_to_test": [], + "flag_values": {}, + "setup": [], + "verify": [] + }, + "attest sbom": { + "args": [], + "flags": { + "flow": "{flow}", + "name": "{name}", + "sbom-file": "cmd/kosli/testdata/sbom/cyclonedx.json", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nsbom attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "sbom-file", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "sbom-file": "cmd/kosli/testdata/sbom/cyclonedx.json", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + } +} \ No newline at end of file From 765b13c000a3ace495e08310f848f1e5ca56532e Mon Sep 17 00:00:00 2001 From: Alex Kantor Date: Sat, 12 Sep 2026 17:01:56 +0100 Subject: [PATCH 7/8] fix(attest-sbom): stop annotate writing into the map it is checked against payload.Annotations and the --annotate flag map are the same map, because processAnnotations returns its argument. Writing the two derived keys into it put them where rejectReservedAnnotations reads, so running one command object twice refused the second run with "annotation key 'sbom_format' cannot be provided with --annotate" for a key nobody supplied. Building a new map decouples them. Reproduced both ways before and after the change. The short description ended with one trailing space where most siblings have two. Long is Short plus the rest of the text, and two trailing spaces are markdown's hard line break, so with one the first sentence merged into the next paragraph wherever the help is rendered as markdown. Regenerating spec.json rewrote all 4680 lines. Not reordering: every existing entry is identical in content and key order. bootstrap.py writes indent=1 and no trailing newline, while the committed file is indent=2 with one, so every regeneration reformatted the whole file and buried the entry that changed. It now writes what is already committed, and the diff against main is 96 added lines with none removed. ProcessSBOMFile has no caller left outside this package's tests, and it reads a whole file with no ceiling next to a command that caps its reads. Its doc comment now says so. Kept rather than deleted: ten tests call it, including one for a missing file, which is the read path ProcessSBOM cannot cover. Co-Authored-By: Claude Opus 5 --- cmd/kosli/attestSbom.go | 20 +- hack/empty-flag-audit/bootstrap.py | 4 +- hack/empty-flag-audit/spec.json | 9502 ++++++++++++++-------------- internal/sbom/sbom.go | 3 + 4 files changed, 4770 insertions(+), 4759 deletions(-) diff --git a/cmd/kosli/attestSbom.go b/cmd/kosli/attestSbom.go index 62056985b..35406a7b5 100644 --- a/cmd/kosli/attestSbom.go +++ b/cmd/kosli/attestSbom.go @@ -46,7 +46,7 @@ type attestSbomOptions struct { payload SbomAttestationPayload } -const attestSbomShortDesc = `Report a software bill of materials to an artifact or a trail in a Kosli flow. ` +const attestSbomShortDesc = `Report a software bill of materials to an artifact or a trail in a Kosli flow. ` const attestSbomLongDesc = attestSbomShortDesc + ` The SBOM file is given with the ^--sbom-file^ flag. CycloneDX (JSON and XML) and @@ -289,12 +289,18 @@ func (o *attestSbomOptions) rejectReservedAnnotations() error { // // It must run after CommonAttestationOptions.run, which assigns // payload.Annotations wholesale from the --annotate flag. Called before that, -// both keys are silently discarded. The nil guard below reads as though the -// order does not matter; it does. +// both keys are discarded. +// +// It builds a new map rather than writing into that one. The two are the same +// map -- processAnnotations returns its argument -- so writing would put these +// keys into the --annotate map that rejectReservedAnnotations reads, and a +// second run of the same options would be refused for a key nobody supplied. func (o *attestSbomOptions) annotate(format, fingerprint string) { - if o.payload.Annotations == nil { - o.payload.Annotations = map[string]string{} + merged := make(map[string]string, len(o.payload.Annotations)+2) + for key, value := range o.payload.Annotations { + merged[key] = value } - o.payload.Annotations[sbomFormatAnnotation] = format - o.payload.Annotations[sbomSha256Annotation] = fingerprint + merged[sbomFormatAnnotation] = format + merged[sbomSha256Annotation] = fingerprint + o.payload.Annotations = merged } diff --git a/hack/empty-flag-audit/bootstrap.py b/hack/empty-flag-audit/bootstrap.py index d7c8924ec..8f1e16051 100755 --- a/hack/empty-flag-audit/bootstrap.py +++ b/hack/empty-flag-audit/bootstrap.py @@ -568,7 +568,9 @@ def main(): state = "ok " if entry["baseline_ok"] else ("needs" if reason else "FAIL") print(f"{state} {command}" + ("" if entry["baseline_ok"] else f" {entry.get('error','')[:90]}")) - SPEC.write_text(json.dumps(spec, indent=1)) + # indent=2 matches the committed file. At indent=1 every regeneration + # reindents all 4680 lines and buries the one entry that changed. + SPEC.write_text(json.dumps(spec, indent=2) + "\n") print(f"\nwrote {SPEC}") diff --git a/hack/empty-flag-audit/spec.json b/hack/empty-flag-audit/spec.json index f19c1e445..c865d4903 100644 --- a/hack/empty-flag-audit/spec.json +++ b/hack/empty-flag-audit/spec.json @@ -1,4776 +1,4776 @@ { - "attest generic": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ngeneric attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "compliant", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "compliant": "true", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "allow artifact": { - "args": [ - "{name}" - ], - "flags": { - "fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "environment": "{env}", - "reason": "probe" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "artifact aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa was allow listed in environment: {env}", - "flags_to_test": [ - "artifact-type", - "dry-run", - "environment", - "exclude", - "fingerprint", - "reason", - "registry-password", - "registry-provider", - "registry-username" - ], - "flag_values": { - "artifact-type": "file", - "dry-run": "true", - "environment": "{env}", - "exclude": "probe-exclude", - "fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "reason": "probe", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - } - ], - "verify": [] - }, - "archive control": { - "args": [ - "{control}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "control {control} was archived", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}" - ] - } - ], - "verify": [ - [ - "get", - "control", - "{control}", - "--output", - "json" - ] - ] - }, - "archive environment": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "environment {env} was archived", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "archive flow": { - "args": [ - "{flow}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "flow {flow} was archived", - "flags_to_test": [ - "api-token", - "config-file", - "debug", - "dry-run", - "host", - "http-proxy", - "max-api-retries", - "org", - "quiet" - ], - "flag_values": { - "api-token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ImNkNzg4OTg5In0.e8i_lA_QrEhFncb05Xw6E_tkCHU9QfcY4OLTVUCHffY", - "config-file": "probe-config-file", - "debug": "true", - "dry-run": "true", - "host": "http://localhost:8001", - "http-proxy": "probe-http-proxy", - "max-api-retries": "3", - "org": "docs-cmd-test-user-shared", - "quiet": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [ - [ - "get", - "flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "assert artifact": { - "args": [ - "cmd/kosli/testdata/person-schema.json" - ], - "flags": { - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "COMPLIANT\nFlow: {flow}\n Trail: {trail}\n Attestation-name type status compliant \n See more details at http://localhost/docs-cmd-test-user-shared/flows/{flow}/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "artifact-type", - "dry-run", - "environment", - "exclude", - "fingerprint", - "flow", - "output", - "policy", - "registry-password", - "registry-provider", - "registry-username" - ], - "flag_values": { - "artifact-type": "file", - "dry-run": "true", - "environment": "{env}", - "exclude": "probe-exclude", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "output": "json", - "policy": "{policy}", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username" - }, - "setup": [ - { - "argv": [ - "create", - "policy", - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml", - "--type", - "env" - ] - }, - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - }, - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com" - ] - } - ], - "verify": [] - }, - "assert snapshot": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 1, - "baseline_output": "Error: [kosli assert snapshot] NON-COMPLIANT", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] - }, - "assert status": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "OK", - "flags_to_test": [], - "flag_values": {}, - "setup": [], - "verify": [] - }, - "attest artifact": { - "args": [ - "cmd/kosli/testdata/person-schema.json" - ], - "flags": { - "build-url": "http://example.com", - "commit-url": "http://example.com", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nartifact cmd/kosli/testdata/person-schema.json was attested with fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "annotate", - "artifact-type", - "build-url", - "commit", - "commit-url", - "display-name", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "build-url": "http://example.com", - "commit": "HEAD", - "commit-url": "http://example.com", - "display-name": "probe-display-name", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest custom": { - "args": [], - "flags": { - "attestation-data": "cmd/kosli/testdata/person-schema.json", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "trail": "{trail}", - "type": "{name}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ncustom:{name} attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "attestation-data", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "type", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "attestation-data": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "type": "{name}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "attestation-type", - "{name}", - "--schema", - "cmd/kosli/testdata/person-schema.json" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "attest decision": { - "args": [], - "flags": { - "compliant": "true", - "control": "{control}", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ndecision attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "compliant", - "control", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "compliant": "true", - "control": "{control}", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "attest jira": { - "args": [], - "flags": { - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "jira-base-url": "probe-jira-base-url", - "jira-pat": "probe-jira-pat", - "name": "{name}", - "trail": "{trail}" - }, - "baseline_ok": false, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\njira attestation '{name}' is reported to trail: {trail}", - "needs": "jira", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "ignore-branch-match", - "jira-api-token", - "jira-base-url", - "jira-issue-fields", - "jira-pat", - "jira-project-key", - "jira-secondary-source", - "jira-trailer", - "jira-username", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "ignore-branch-match": "true", - "jira-api-token": "probe-jira-api-token", - "jira-base-url": "probe-jira-base-url", - "jira-issue-fields": "probe-jira-issue-fields", - "jira-pat": "probe-jira-pat", - "jira-project-key": "probe-jira-project-key", - "jira-secondary-source": "probe-jira-secondary-source", - "jira-trailer": "Jira", - "jira-username": "probe-jira-username", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest junit": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "results-dir": "cmd/kosli/testdata/junit", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\njunit attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "results-dir", - "trail", - "upload-results", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "results-dir": "cmd/kosli/testdata/junit", - "trail": "{trail}", - "upload-results": "true", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] - } - }, - "attest snyk": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest snyk flow=probe-attest-snyk-baseline-fl trail=probe-attest-snyk-baseline-tr] failed to parse Snyk sarif results file [cmd/kosli/testdata/snyk_scan_example.json]: invalid sarif file", - "needs": "snyk", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "scan-results", - "trail", - "upload-results", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", - "trail": "{trail}", - "upload-results": "true", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest sonar": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "sonar-api-token": "probe-sonar-api-token", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest sonar flow=probe-attest-sonar-baseline-fl trail=probe-attest-sonar-baseline-tr] open .scannerwork/report-task.txt: no such file or directory. Check your working directory is set correctly. Alternatively provide the project key and either revision or pull-request ID for the scan to attest", - "needs": "sonarqube", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "max-wait", - "name", - "origin-url", - "pull-request", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "sonar-api-token", - "sonar-branch", - "sonar-ce-task-url", - "sonar-project-key", - "sonar-revision", - "sonar-server-url", - "sonar-working-dir", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "max-wait": "probe-max-wait", - "name": "{name}", - "origin-url": "http://example.com", - "pull-request": "probe-pull-request", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "sonar-api-token": "probe-sonar-api-token", - "sonar-branch": "probe-sonar-branch", - "sonar-ce-task-url": "probe-sonar-ce-task-url", - "sonar-project-key": "probe-sonar-project-key", - "sonar-revision": "probe-sonar-revision", - "sonar-server-url": "probe-sonar-server-url", - "sonar-working-dir": "probe-sonar-working-dir", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "begin trail": { - "args": [ - "{trail}" - ], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ntrail '{trail}' was begun", - "flags_to_test": [ - "commit", - "description", - "dry-run", - "external-fingerprint", - "external-url", - "flow", - "origin-url", - "redact-commit-info", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "template-file", - "user-data" - ], - "flag_values": { - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "template-file": "cmd/kosli/testdata/valid_template.yml", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "config": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "default config file [/var/folders/21/v4jj5l055w393p67z831r5hr0000gn/T/kosli-audit-home-pktxkdvq/.kosli.yml] updated successfully.", - "flags_to_test": [ - "set", - "unset" - ], - "flag_values": { - "set": "probe=set", - "unset": "probe-unset" - }, - "setup": [], - "verify": [] - }, - "create api-key": { - "args": [], - "flags": { - "description": "probe-description", - "service-account": "{account}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "ID: {uuid}\nKey: {secret}\nDescription: probe-description\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A", - "flags_to_test": [ - "description", - "dry-run", - "expires-at", - "output", - "service-account" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "expires-at": "4102444800", - "output": "json", - "service-account": "{account}" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [] - }, - "create control": { - "args": [ - "{control}" - ], - "flags": { - "name": "{name}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "control {control} was created", - "flags_to_test": [ - "description", - "dry-run", - "name" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "name": "{name}" - }, - "setup": [], - "verify": [ - [ - "get", - "control", - "{control}", - "--output", - "json" - ] - ] - }, - "create environment": { - "args": [ - "{env}" - ], - "flags": { - "type": "K8S" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "environment {env} was created", - "flags_to_test": [ - "description", - "dry-run", - "exclude-scaling", - "include-scaling", - "included-environments", - "require-provenance", - "type" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "exclude-scaling": "true", - "include-scaling": "true", - "included-environments": "{env}", - "require-provenance": "true", - "type": "K8S" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "create flow": { - "args": [ - "{flow}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] creating a flow without --template-file or --use-empty-template uses a deprecated API endpoint and will stop working in a future release; please provide a template\nflow '{flow}' was created", - "flags_to_test": [ - "description", - "dry-run", - "template", - "template-file", - "use-empty-template", - "visibility" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "template": "probe-template", - "template-file": "cmd/kosli/testdata/valid_template.yml", - "use-empty-template": "true", - "visibility": "public" - }, - "setup": [], - "verify": [ - [ - "get", - "flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "create policy": { - "args": [ - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "policy '{policy}' was created", - "flags_to_test": [ - "comment", - "description", - "dry-run", - "type" - ], - "flag_values": { - "comment": "probe-comment", - "description": "probe-description", - "dry-run": "true", - "type": "env" - }, - "setup": [], - "verify": [ - [ - "get", - "policy", - "{policy}", - "--output", - "json" - ] - ] - }, - "create service-account": { - "args": [ - "{account}" - ], - "flags": { - "privilege": "reader" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "service account {account} was created", - "flags_to_test": [ - "description", - "dry-run", - "privilege" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "privilege": "reader" - }, - "setup": [], - "verify": [ - [ - "get", - "service-account", - "{account}", - "--output", - "json" - ] - ] - }, - "delete api-key": { - "args": [ - "{apikey}" - ], - "flags": { - "service-account": "{account}", - "assume-yes": "true" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "API key {apikey} for service account {account} was deleted!", - "flags_to_test": [ - "assume-yes", - "dry-run", - "service-account", - "yes" - ], - "flag_values": { - "assume-yes": "true", - "dry-run": "true", - "service-account": "{account}", - "yes": "true" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - }, - { - "argv": [ - "create", - "api-key", - "--service-account", - "{account}", - "--description", - "probe" - ], - "capture": [ - "apikey", - "ID:\\s+(\\S+)" - ] - } - ], - "verify": [] - }, - "diff snapshots": { - "args": [ - "{env}", - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "", - "flags_to_test": [ - "output", - "show-unchanged" - ], - "flag_values": { - "output": "json", - "show-unchanged": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] - }, - "disable beta": { - "args": [], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli disable beta] Not Found", - "needs": "a server that implements it", - "flags_to_test": [], - "flag_values": {}, - "setup": [], - "verify": [] - }, - "enable beta": { - "args": [], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli enable beta] Not Found", - "needs": "a server that implements it", - "flags_to_test": [], - "flag_values": {}, - "setup": [], - "verify": [] - }, - "evaluate input": { - "args": [], - "flags": { - "input-file": "cmd/kosli/testdata/person-schema.json", - "policy": "cmd/kosli/testdata/policies/allow-all.rego" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "RESULT: ALLOWED", - "flags_to_test": [ - "assert", - "attestations", - "flow", - "input-file", - "no-assert", - "output", - "params", - "policy", - "show-input" - ], - "flag_values": { - "assert": "true", - "attestations": "probe-attestations", - "flow": "{flow}", - "input-file": "cmd/kosli/testdata/person-schema.json", - "no-assert": "true", - "output": "json", - "params": "{}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego", - "show-input": "true" - }, - "setup": [], - "verify": [] - }, - "evaluate trail": { - "args": [ - "{trail}" - ], - "flags": { - "flow": "{flow}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "RESULT: ALLOWED", - "flags_to_test": [ - "assert", - "attestations", - "flow", - "no-assert", - "output", - "params", - "policy", - "show-input" - ], - "flag_values": { - "assert": "true", - "attestations": "probe-attestations", - "flow": "{flow}", - "no-assert": "true", - "output": "json", - "params": "{}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego", - "show-input": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "evaluate trails": { - "args": [ - "{trail}" - ], - "flags": { - "flow": "{flow}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "RESULT: ALLOWED", - "flags_to_test": [ - "assert", - "attestations", - "flow", - "no-assert", - "output", - "params", - "policy", - "show-input" - ], - "flag_values": { - "assert": "true", - "attestations": "probe-attestations", - "flow": "{flow}", - "no-assert": "true", - "output": "json", - "params": "{}", - "policy": "cmd/kosli/testdata/policies/allow-all.rego", - "show-input": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "fingerprint": { - "args": [ - "cmd/kosli/testdata/person-schema.json" - ], - "flags": { - "artifact-type": "file" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "artifact-type", - "e", - "exclude", - "registry-password", - "registry-provider", - "registry-username" - ], - "flag_values": { - "artifact-type": "file", - "e": "probe-e", - "exclude": "probe-exclude", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username" - }, - "setup": [], - "verify": [] - }, - "get api-key": { - "args": [ - "{apikey}" - ], - "flags": { - "service-account": "{account}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "ID: {apikey}\nDescription: probe\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A\nLast Used: N/A", - "flags_to_test": [ - "output", - "service-account" - ], - "flag_values": { - "output": "json", - "service-account": "{account}" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - }, - { - "argv": [ - "create", - "api-key", - "--service-account", - "{account}", - "--description", - "probe" - ], - "capture": [ - "apikey", - "ID:\\s+(\\S+)" - ] - } - ], - "verify": [] - }, - "get artifact": { - "args": [ - "{flow}@1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: cmd/kosli/testdata/person-schema.json\nFlow: {flow}\nTrail: {trail}\nName in template: probe-artifact\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCreated on: {timestamp} \u2022 {ago}\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/{flow}/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01?artifact_id={uuid}\nState: COMPLIANT\nHistory:\n probe-artifact reported {timestamp}", - "flags_to_test": [ - "output", - "trail" - ], - "flag_values": { - "output": "json", - "trail": "{trail}" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com" - ] - } - ], - "verify": [] - }, - "get attestation": { - "args": [ - "probe-attestation" - ], - "flags": { - "flow": "{flow}", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: probe-attestation\nType: generic\nCompliance: true\nCreated at: {timestamp} \u2022 {ago}\nAttestation URL: http://localhost/docs-cmd-test-user-shared/flows/{flow}/trails/{trail}?attestation_id={uuid}", - "flags_to_test": [ - "attestation-id", - "fingerprint", - "flow", - "output", - "trail" - ], - "flag_values": { - "attestation-id": "probe-attestation-id", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "output": "json", - "trail": "{trail}" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com" - ] - }, - { - "argv": [ - "attest", - "generic", - "--name", - "probe-attestation", - "--flow", - "{flow}", - "--trail", - "{trail}" - ] - }, - { - "argv": [ - "attest", - "generic", - "--name", - "probe-on-artifact", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" - ] - } - ], - "verify": [], - "args_for_flag": { - "attestation-id": [], - "fingerprint": [ - "probe-on-artifact" - ] - }, - "flags_for_flag": { - "fingerprint": { - "flow": "{flow}" - } - } - }, - "get control": { - "args": [ - "{control}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Identifier: {control}\nName: {control}\nVersion: 1\nArchived: false\nCreated by: docs-cmd-test-user\nCreated at: {timestamp} \u2022 {ago}", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}" - ] - } - ], - "verify": [] - }, - "get default-org": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Default user organization: docs-cmd-test-user-shared", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [], - "verify": [] - }, - "get environment": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {env}\nType: K8S\nDescription: \nState: N/A\nLast Reported At: N/A\nTags: None\nPolicies: []", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [] - }, - "get flow": { - "args": [ - "{flow}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {flow}\nDescription: \nVisibility: private\nTemplate: \n version: 1\nLast Deployment At: N/A\nTags: None", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [] - }, - "get policy": { - "args": [ - "{policy}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {policy}\nDescription: \nCreated At: {timestamp} \u2022 {ago}\nVersions: 1\nAttached to environments: []\nPolicy content:\n _schema: https://kosli.com/schemas/policy/environment/v1\n \n artifacts:\n provenance:\n required: true\n \n trail-compliance:\n required: true", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "policy", - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml" - ] - } - ], - "verify": [] - }, - "get repo": { - "args": [ - "{name}" - ], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli get repo] Repo 'probe-get-repo-baseline-nm' not found", - "needs": "a connected git provider", - "flags_to_test": [ - "output", - "provider", - "repo-id" - ], - "flag_values": { - "output": "json", - "provider": "github", - "repo-id": "probe-repo-id" - }, - "setup": [], - "verify": [] - }, - "get service-account": { - "args": [ - "{account}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {account}\nDescription: N/A\nPrivilege: reader\nCreated At: {timestamp} \u2022 {ago}", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [] - }, - "get snapshot": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "COMMIT ARTIFACT FLOW COMPLIANCE RUNNING_SINCE REPLICAS\nN/A Name: probe-artifact N/A NON-COMPLIANT {ago} 1\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] - }, - "get trail": { - "args": [ - "{trail}" - ], - "flags": { - "flow": "{flow}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {trail}\nDescription: \nCompliance: COMPLIANT\nLast modified at: {timestamp} \u2022 {ago}\nEvents:\n\n TIME DESCRIPTION GIT-COMMIT COMPLIANCE\n {timestamp} trail started", - "flags_to_test": [ - "flow", - "output" - ], - "flag_values": { - "flow": "{flow}", - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "list api-keys": { - "args": [], - "flags": { - "service-account": "{account}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "ID DESCRIPTION CREATED EXPIRES LAST USED\n{apikey} probe {timestamp} \u2022 {ago} N/A N/A", - "flags_to_test": [ - "output", - "service-account" - ], - "flag_values": { - "output": "json", - "service-account": "{account}" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - }, - { - "argv": [ - "create", - "api-key", - "--service-account", - "{account}", - "--description", - "probe" - ], - "capture": [ - "apikey", - "ID:\\s+(\\S+)" - ] - } - ], - "verify": [] - }, - "list artifacts": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "COMMIT ARTIFACT STATE CREATED_AT\n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "flow", - "output", - "page", - "page-limit", - "repo" - ], - "flag_values": { - "flow": "{flow}", - "output": "json", - "page": "1", - "page-limit": "5", - "repo": "probe-repo" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "list controls": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "IDENTIFIER NAME DESCRIPTION CREATED AT\nprobe-create-control-baseline-co probe-create-control-baseline-nm {timestamp}\nprobe-get-control-baseline-co probe-get-control-baseline-co {timestamp}\n{control} {control} {timestamp}\n\nShowing page 1 of 1, total 3 controls", - "flags_to_test": [ - "archived", - "output", - "page", - "page-limit", - "search", - "sort-direction", - "tag" - ], - "flag_values": { - "archived": "true", - "output": "json", - "page": "1", - "page-limit": "5", - "search": "probe-search", - "sort-direction": "asc", - "tag": "probe-tag" - }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}" - ] - } - ], - "verify": [] - }, - "list environments": { - "args": [], - "flags": { - "page-limit": "5" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME TYPE LAST REPORT LAST MODIFIED TAGS POLICIES\nprobe-allow-artifact-baseline-en server {timestamp} []\nprobe-assert-snapshot-baseline-en server {timestamp} {timestamp} []\nprobe-create-environment-baseline-en K8S {timestamp} []\nprobe-diff-snapshots-baseline-en server {timestamp} {timestamp} []\nprobe-get-environment-baseline-en K8S {timestamp} []\n\nShowing page 1 of 2, total 9 items", - "flags_to_test": [ - "name", - "output", - "page", - "page-limit", - "sort", - "sort-direction", - "space-id", - "tag", - "type" - ], - "flag_values": { - "name": "{name}", - "output": "json", - "page": "1", - "page-limit": "5", - "sort": "name", - "sort-direction": "asc", - "space-id": "probe-space-id", - "tag": "probe-tag", - "type": "K8S" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [] - }, - "list flows": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION VISIBILITY TAGS\nprobe-allow-artifact-baseline-fl private \nprobe-archive-attestation-type-baseline-fl private \nprobe-assert-artifact-baseline-fl private \nprobe-attest-artifact-baseline-fl private \nprobe-attest-custom-baseline-fl private \nprobe-attest-decision-baseline-fl private \nprobe-attest-generic-baseline-fl private \nprobe-attest-jira-baseline-fl private \nprobe-attest-junit-baseline-fl private \nprobe-attest-override-baseline-fl private \nprobe-attest-pullrequest-azure-baseline-fl private \nprobe-attest-pullrequest-bitbucket-baseline-fl private \nprobe-attest-pullrequest-github-baseline-fl private \nprobe-attest-pullrequest-gitlab-baseline-fl private \nprobe-attest-snyk-baseline-fl private \nprobe-attest-sonar-baseline-fl private \nprobe-begin-trail-baseline-fl private \nprobe-create-attestation-type-baseline-fl private \nprobe-create-flow-baseline-fl private \nprobe-evaluate-trail-baseline-fl private \nprobe-evaluate-trails-baseline-fl private \nprobe-get-artifact-baseline-fl private \nprobe-get-attestation-baseline-fl private \nprobe-get-attestation-type-baseline-fl private \nprobe-get-flow-baseline-fl private \nprobe-get-trail-baseline-fl private \nprobe-list-artifacts-baseline-fl private \nprobe-list-attestation-types-baseline-fl private \n{flow} private", - "flags_to_test": [ - "ignore-case", - "name", - "output", - "page", - "page-limit" - ], - "flag_values": { - "ignore-case": "true", - "name": "{name}", - "output": "json", - "page": "1", - "page-limit": "5" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [] - }, - "list policies": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION CREATED AT LAST VERSION USED BY ENVS\nprobe-attach-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-create-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-detach-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-get-policy-baseline-po {timestamp} \u2022 {ago} 1 []", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [], - "verify": [] - }, - "list repos": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "No repos were found.", - "flags_to_test": [ - "name", - "output", - "page", - "page-limit", - "provider", - "repo-id", - "search", - "sort-direction", - "tag" - ], - "flag_values": { - "name": "{name}", - "output": "json", - "page": "1", - "page-limit": "5", - "provider": "github", - "repo-id": "probe-repo-id", - "search": "probe-search", - "sort-direction": "asc", - "tag": "probe-tag" - }, - "setup": [], - "verify": [] - }, - "list service-accounts": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION PRIVILEGE CREATED\nprobe-create-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-create-service-account-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-delete-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-get-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-get-service-account-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-list-api-keys-baseline-sa N/A reader {timestamp} \u2022 {ago}\n{account} N/A reader {timestamp} \u2022 {ago}", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [] - }, - "list snapshots": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "SNAPSHOT FROM TO DURATION COMPLIANT\n1 {timestamp} now about a second false", - "flags_to_test": [ - "interval", - "output", - "page", - "page-limit", - "reverse" - ], - "flag_values": { - "interval": "1", - "output": "json", - "page": "1", - "page-limit": "5", - "reverse": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] - }, - "list trails": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION COMPLIANCE\n{trail} COMPLIANT\nprobe-list-attestation-types-baseline-tr COMPLIANT\nprobe-list-artifacts-baseline-tr COMPLIANT\nprobe-get-trail-baseline-tr COMPLIANT\nprobe-get-attestation-type-baseline-tr COMPLIANT\nprobe-get-attestation-baseline-tr COMPLIANT\nprobe-get-artifact-baseline-tr COMPLIANT\nprobe-evaluate-trails-baseline-tr COMPLIANT\nprobe-evaluate-trail-baseline-tr COMPLIANT\nprobe-create-attestation-type-baseline-tr COMPLIANT\nprobe-begin-trail-baseline-tr COMPLIANT\nprobe-attest-sonar-baseline-tr COMPLIANT\nprobe-attest-snyk-baseline-tr COMPLIANT\nprobe-attest-pullrequest-gitlab-baseline-tr COMPLIANT\nprobe-attest-pullrequest-github-baseline-tr COMPLIANT\nprobe-attest-pullrequest-bitbucket-baseline-tr COMPLIANT\nprobe-attest-pullrequest-azure-baseline-tr COMPLIANT\nprobe-attest-override-baseline-tr COMPLIANT\nprobe-attest-junit-baseline-tr COMPLIANT\nprobe-attest-jira-baseline-tr NON-COMPLIANT\n\nShowing page 1 of 2, total 27 items", - "flags_to_test": [ - "fingerprint", - "flow", - "flow-tag", - "output", - "page", - "page-limit" - ], - "flag_values": { - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "flow-tag": "probe=flow-tag", - "output": "json", - "page": "1", - "page-limit": "5" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "rename flow": { - "args": [ - "{flow}", - "{name}-1" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "flow {flow} was renamed to {name}-1", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [ - [ - "get", - "flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "rotate api-key": { - "args": [ - "{apikey}" - ], - "flags": { - "service-account": "{account}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "ID: {apikey}\nKey: {secret}\nDescription: probe\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A\nOld Key Valid Until: {timestamp} \u2022 in one day", - "flags_to_test": [ - "dry-run", - "expires-at", - "grace-period-hours", - "output", - "service-account" - ], - "flag_values": { - "dry-run": "true", - "expires-at": "4102444800", - "grace-period-hours": "24", - "output": "json", - "service-account": "{account}" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - }, - { - "argv": [ - "create", - "api-key", - "--service-account", - "{account}", - "--description", - "probe" - ], - "capture": [ - "apikey", - "ID:\\s+(\\S+)" - ] - } - ], - "verify": [] - }, - "search": { - "args": [ - "{digest}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Search result resolved to artifact with fingerprint 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-assert-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-assert-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-attest-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-attest-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-get-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-get-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-get-attestation-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-get-attestation-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "{digest}", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" - ] - } - ], - "verify": [] - }, - "snapshot azure": { - "args": [ - "{env}" - ], - "flags": { - "azure-client-id": "probe-azure-client-id", - "azure-client-secret": "probe-azure-client-secret", - "azure-resource-group-name": "probe-azure-resource-group-name", - "azure-subscription-id": "probe-azure-subscription-id", - "azure-tenant-id": "probe-azure-tenant-id" - }, - "baseline_ok": false, - "error": "Error: [kosli snapshot azure] ClientSecretCredential authentication failed. ", - "needs": "azure", - "flags_to_test": [ - "azure-client-id", - "azure-client-secret", - "azure-resource-group-name", - "azure-subscription-id", - "azure-tenant-id", - "digests-source", - "dry-run", - "zip" - ], - "flag_values": { - "azure-client-id": "probe-azure-client-id", - "azure-client-secret": "probe-azure-client-secret", - "azure-resource-group-name": "probe-azure-resource-group-name", - "azure-subscription-id": "probe-azure-subscription-id", - "azure-tenant-id": "probe-azure-tenant-id", - "digests-source": "logs", - "dry-run": "true", - "zip": "true" + "attest generic": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ngeneric attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "compliant", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "compliant": "true", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "allow artifact": { + "args": [ + "{name}" + ], + "flags": { + "fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "environment": "{env}", + "reason": "probe" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "artifact aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa was allow listed in environment: {env}", + "flags_to_test": [ + "artifact-type", + "dry-run", + "environment", + "exclude", + "fingerprint", + "reason", + "registry-password", + "registry-provider", + "registry-username" + ], + "flag_values": { + "artifact-type": "file", + "dry-run": "true", + "environment": "{env}", + "exclude": "probe-exclude", + "fingerprint": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "reason": "probe", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot cloud-run": { - "args": [ - "{env}" - ], - "flags": { - "project": "probe-project", - "region": "probe-region" + "archive control": { + "args": [ + "{control}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "control {control} was archived", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}" + ] + } + ], + "verify": [ + [ + "get", + "control", + "{control}", + "--output", + "json" + ] + ] + }, + "archive environment": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "environment {env} was archived", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "archive flow": { + "args": [ + "{flow}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "flow {flow} was archived", + "flags_to_test": [ + "api-token", + "config-file", + "debug", + "dry-run", + "host", + "http-proxy", + "max-api-retries", + "org", + "quiet" + ], + "flag_values": { + "api-token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ImNkNzg4OTg5In0.e8i_lA_QrEhFncb05Xw6E_tkCHU9QfcY4OLTVUCHffY", + "config-file": "probe-config-file", + "debug": "true", + "dry-run": "true", + "host": "http://localhost:8001", + "http-proxy": "probe-http-proxy", + "max-api-retries": "3", + "org": "docs-cmd-test-user-shared", + "quiet": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [ + [ + "get", + "flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "assert artifact": { + "args": [ + "cmd/kosli/testdata/person-schema.json" + ], + "flags": { + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "COMPLIANT\nFlow: {flow}\n Trail: {trail}\n Attestation-name type status compliant \n See more details at http://localhost/docs-cmd-test-user-shared/flows/{flow}/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "artifact-type", + "dry-run", + "environment", + "exclude", + "fingerprint", + "flow", + "output", + "policy", + "registry-password", + "registry-provider", + "registry-username" + ], + "flag_values": { + "artifact-type": "file", + "dry-run": "true", + "environment": "{env}", + "exclude": "probe-exclude", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "output": "json", + "policy": "{policy}", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username" + }, + "setup": [ + { + "argv": [ + "create", + "policy", + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml", + "--type", + "env" + ] + }, + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + }, + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com" + ] + } + ], + "verify": [] }, - "baseline_ok": false, - "error": "Error: [kosli snapshot cloud-run] GCP client setup failed: credentials: could not find default credentials. See https://cloud.google.com/docs/authentication/external/set-up-adc for more information", - "needs": "google cloud", - "flags_to_test": [ - "dry-run", - "exclude", - "exclude-regex", - "include", - "include-regex", - "project", - "region", - "resolve-names" - ], - "flag_values": { - "dry-run": "true", - "exclude": "probe-exclude", - "exclude-regex": "probe-exclude-regex", - "include": "probe-include", - "include-regex": "probe-include-regex", - "project": "probe-project", - "region": "probe-region", - "resolve-names": "true" + "assert snapshot": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 1, + "baseline_output": "Error: [kosli assert snapshot] NON-COMPLIANT", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] + }, + "assert status": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "OK", + "flags_to_test": [], + "flag_values": {}, + "setup": [], + "verify": [] + }, + "attest artifact": { + "args": [ + "cmd/kosli/testdata/person-schema.json" + ], + "flags": { + "build-url": "http://example.com", + "commit-url": "http://example.com", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nartifact cmd/kosli/testdata/person-schema.json was attested with fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "annotate", + "artifact-type", + "build-url", + "commit", + "commit-url", + "display-name", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "build-url": "http://example.com", + "commit": "HEAD", + "commit-url": "http://example.com", + "display-name": "probe-display-name", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest custom": { + "args": [], + "flags": { + "attestation-data": "cmd/kosli/testdata/person-schema.json", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "trail": "{trail}", + "type": "{name}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ncustom:{name} attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "attestation-data", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "type", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "attestation-data": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "type": "{name}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "attestation-type", + "{name}", + "--schema", + "cmd/kosli/testdata/person-schema.json" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "attest decision": { + "args": [], + "flags": { + "compliant": "true", + "control": "{control}", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ndecision attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "compliant", + "control", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "compliant": "true", + "control": "{control}", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "attest jira": { + "args": [], + "flags": { + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "jira-base-url": "probe-jira-base-url", + "jira-pat": "probe-jira-pat", + "name": "{name}", + "trail": "{trail}" + }, + "baseline_ok": false, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\njira attestation '{name}' is reported to trail: {trail}", + "needs": "jira", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "ignore-branch-match", + "jira-api-token", + "jira-base-url", + "jira-issue-fields", + "jira-pat", + "jira-project-key", + "jira-secondary-source", + "jira-trailer", + "jira-username", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "ignore-branch-match": "true", + "jira-api-token": "probe-jira-api-token", + "jira-base-url": "probe-jira-base-url", + "jira-issue-fields": "probe-jira-issue-fields", + "jira-pat": "probe-jira-pat", + "jira-project-key": "probe-jira-project-key", + "jira-secondary-source": "probe-jira-secondary-source", + "jira-trailer": "Jira", + "jira-username": "probe-jira-username", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest junit": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "results-dir": "cmd/kosli/testdata/junit", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\njunit attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "results-dir", + "trail", + "upload-results", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "results-dir": "cmd/kosli/testdata/junit", + "trail": "{trail}", + "upload-results": "true", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "attest snyk": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest snyk flow=probe-attest-snyk-baseline-fl trail=probe-attest-snyk-baseline-tr] failed to parse Snyk sarif results file [cmd/kosli/testdata/snyk_scan_example.json]: invalid sarif file", + "needs": "snyk", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "scan-results", + "trail", + "upload-results", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "scan-results": "cmd/kosli/testdata/snyk_scan_example.json", + "trail": "{trail}", + "upload-results": "true", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest sonar": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "sonar-api-token": "probe-sonar-api-token", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest sonar flow=probe-attest-sonar-baseline-fl trail=probe-attest-sonar-baseline-tr] open .scannerwork/report-task.txt: no such file or directory. Check your working directory is set correctly. Alternatively provide the project key and either revision or pull-request ID for the scan to attest", + "needs": "sonarqube", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "max-wait", + "name", + "origin-url", + "pull-request", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "sonar-api-token", + "sonar-branch", + "sonar-ce-task-url", + "sonar-project-key", + "sonar-revision", + "sonar-server-url", + "sonar-working-dir", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "max-wait": "probe-max-wait", + "name": "{name}", + "origin-url": "http://example.com", + "pull-request": "probe-pull-request", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "sonar-api-token": "probe-sonar-api-token", + "sonar-branch": "probe-sonar-branch", + "sonar-ce-task-url": "probe-sonar-ce-task-url", + "sonar-project-key": "probe-sonar-project-key", + "sonar-revision": "probe-sonar-revision", + "sonar-server-url": "probe-sonar-server-url", + "sonar-working-dir": "probe-sonar-working-dir", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "begin trail": { + "args": [ + "{trail}" + ], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\ntrail '{trail}' was begun", + "flags_to_test": [ + "commit", + "description", + "dry-run", + "external-fingerprint", + "external-url", + "flow", + "origin-url", + "redact-commit-info", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "template-file", + "user-data" + ], + "flag_values": { + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "template-file": "cmd/kosli/testdata/valid_template.yml", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "config": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "default config file [/var/folders/21/v4jj5l055w393p67z831r5hr0000gn/T/kosli-audit-home-pktxkdvq/.kosli.yml] updated successfully.", + "flags_to_test": [ + "set", + "unset" + ], + "flag_values": { + "set": "probe=set", + "unset": "probe-unset" + }, + "setup": [], + "verify": [] + }, + "create api-key": { + "args": [], + "flags": { + "description": "probe-description", + "service-account": "{account}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "ID: {uuid}\nKey: {secret}\nDescription: probe-description\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A", + "flags_to_test": [ + "description", + "dry-run", + "expires-at", + "output", + "service-account" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "expires-at": "4102444800", + "output": "json", + "service-account": "{account}" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot docker": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[15] containers were reported to environment {env}", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" + "create control": { + "args": [ + "{control}" + ], + "flags": { + "name": "{name}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "control {control} was created", + "flags_to_test": [ + "description", + "dry-run", + "name" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "name": "{name}" + }, + "setup": [], + "verify": [ + [ + "get", + "control", + "{control}", + "--output", + "json" + ] + ] + }, + "create environment": { + "args": [ + "{env}" + ], + "flags": { + "type": "K8S" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "environment {env} was created", + "flags_to_test": [ + "description", + "dry-run", + "exclude-scaling", + "include-scaling", + "included-environments", + "require-provenance", + "type" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "exclude-scaling": "true", + "include-scaling": "true", + "included-environments": "{env}", + "require-provenance": "true", + "type": "K8S" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "create flow": { + "args": [ + "{flow}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] creating a flow without --template-file or --use-empty-template uses a deprecated API endpoint and will stop working in a future release; please provide a template\nflow '{flow}' was created", + "flags_to_test": [ + "description", + "dry-run", + "template", + "template-file", + "use-empty-template", + "visibility" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "template": "probe-template", + "template-file": "cmd/kosli/testdata/valid_template.yml", + "use-empty-template": "true", + "visibility": "public" + }, + "setup": [], + "verify": [ + [ + "get", + "flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "create policy": { + "args": [ + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "policy '{policy}' was created", + "flags_to_test": [ + "comment", + "description", + "dry-run", + "type" + ], + "flag_values": { + "comment": "probe-comment", + "description": "probe-description", + "dry-run": "true", + "type": "env" + }, + "setup": [], + "verify": [ + [ + "get", + "policy", + "{policy}", + "--output", + "json" + ] + ] + }, + "create service-account": { + "args": [ + "{account}" + ], + "flags": { + "privilege": "reader" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "service account {account} was created", + "flags_to_test": [ + "description", + "dry-run", + "privilege" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "privilege": "reader" + }, + "setup": [], + "verify": [ + [ + "get", + "service-account", + "{account}", + "--output", + "json" + ] + ] + }, + "delete api-key": { + "args": [ + "{apikey}" + ], + "flags": { + "service-account": "{account}", + "assume-yes": "true" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "API key {apikey} for service account {account} was deleted!", + "flags_to_test": [ + "assume-yes", + "dry-run", + "service-account", + "yes" + ], + "flag_values": { + "assume-yes": "true", + "dry-run": "true", + "service-account": "{account}", + "yes": "true" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + }, + { + "argv": [ + "create", + "api-key", + "--service-account", + "{account}", + "--description", + "probe" + ], + "capture": [ + "apikey", + "ID:\\s+(\\S+)" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "docker" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot ecs": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli snapshot ecs] failed to filter ECS clusters: operation error ECS: ListClusters, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded", - "needs": "aws", - "flags_to_test": [ - "aws-key-id", - "aws-region", - "aws-secret-key", - "cluster", - "clusters", - "clusters-regex", - "dry-run", - "exclude", - "exclude-regex", - "exclude-services", - "exclude-services-regex", - "service-name", - "services", - "services-regex" - ], - "flag_values": { - "aws-key-id": "probe-aws-key-id", - "aws-region": "probe-aws-region", - "aws-secret-key": "probe-aws-secret-key", - "cluster": "probe-cluster", - "clusters": "probe-clusters", - "clusters-regex": "probe-clusters-regex", - "dry-run": "true", - "exclude": "probe-exclude", - "exclude-regex": "probe-exclude-regex", - "exclude-services": "probe-exclude-services", - "exclude-services-regex": "probe-exclude-services-regex", - "service-name": "probe-service-name", - "services": "probe-services", - "services-regex": "probe-services-regex" + "diff snapshots": { + "args": [ + "{env}", + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "", + "flags_to_test": [ + "output", + "show-unchanged" + ], + "flag_values": { + "output": "json", + "show-unchanged": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] + }, + "disable beta": { + "args": [], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli disable beta] Not Found", + "needs": "a server that implements it", + "flags_to_test": [], + "flag_values": {}, + "setup": [], + "verify": [] + }, + "enable beta": { + "args": [], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli enable beta] Not Found", + "needs": "a server that implements it", + "flags_to_test": [], + "flag_values": {}, + "setup": [], + "verify": [] + }, + "evaluate input": { + "args": [], + "flags": { + "input-file": "cmd/kosli/testdata/person-schema.json", + "policy": "cmd/kosli/testdata/policies/allow-all.rego" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "RESULT: ALLOWED", + "flags_to_test": [ + "assert", + "attestations", + "flow", + "input-file", + "no-assert", + "output", + "params", + "policy", + "show-input" + ], + "flag_values": { + "assert": "true", + "attestations": "probe-attestations", + "flow": "{flow}", + "input-file": "cmd/kosli/testdata/person-schema.json", + "no-assert": "true", + "output": "json", + "params": "{}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego", + "show-input": "true" + }, + "setup": [], + "verify": [] + }, + "evaluate trail": { + "args": [ + "{trail}" + ], + "flags": { + "flow": "{flow}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "RESULT: ALLOWED", + "flags_to_test": [ + "assert", + "attestations", + "flow", + "no-assert", + "output", + "params", + "policy", + "show-input" + ], + "flag_values": { + "assert": "true", + "attestations": "probe-attestations", + "flow": "{flow}", + "no-assert": "true", + "output": "json", + "params": "{}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego", + "show-input": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot k8s": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli snapshot k8s] could not build config from inside the cluster: unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined", - "needs": "kubernetes", - "flags_to_test": [ - "config-file", - "dry-run", - "exclude-namespaces", - "exclude-namespaces-regex", - "kubeconfig", - "namespaces", - "namespaces-regex" - ], - "flag_values": { - "config-file": "probe-config-file", - "dry-run": "true", - "exclude-namespaces": "probe-exclude-namespaces", - "exclude-namespaces-regex": "probe-exclude-namespaces-regex", - "kubeconfig": "probe-kubeconfig", - "namespaces": "probe-namespaces", - "namespaces-regex": "probe-namespaces-regex" + "evaluate trails": { + "args": [ + "{trail}" + ], + "flags": { + "flow": "{flow}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "RESULT: ALLOWED", + "flags_to_test": [ + "assert", + "attestations", + "flow", + "no-assert", + "output", + "params", + "policy", + "show-input" + ], + "flag_values": { + "assert": "true", + "attestations": "probe-attestations", + "flow": "{flow}", + "no-assert": "true", + "output": "json", + "params": "{}", + "policy": "cmd/kosli/testdata/policies/allow-all.rego", + "show-input": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot lambda": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": false, - "error": "Error: [kosli snapshot lambda] operation error Lambda: ListFunctions, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded", - "needs": "aws", - "flags_to_test": [ - "aws-key-id", - "aws-region", - "aws-secret-key", - "dry-run", - "exclude", - "exclude-regex", - "function-name", - "function-names", - "function-names-regex", - "function-version" - ], - "flag_values": { - "aws-key-id": "probe-aws-key-id", - "aws-region": "probe-aws-region", - "aws-secret-key": "probe-aws-secret-key", - "dry-run": "true", - "exclude": "probe-exclude", - "exclude-regex": "probe-exclude-regex", - "function-name": "probe-function-name", - "function-names": "probe-function-names", - "function-names-regex": "probe-function-names-regex", - "function-version": "probe-function-version" + "fingerprint": { + "args": [ + "cmd/kosli/testdata/person-schema.json" + ], + "flags": { + "artifact-type": "file" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "artifact-type", + "e", + "exclude", + "registry-password", + "registry-provider", + "registry-username" + ], + "flag_values": { + "artifact-type": "file", + "e": "probe-e", + "exclude": "probe-exclude", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username" + }, + "setup": [], + "verify": [] + }, + "get api-key": { + "args": [ + "{apikey}" + ], + "flags": { + "service-account": "{account}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "ID: {apikey}\nDescription: probe\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A\nLast Used: N/A", + "flags_to_test": [ + "output", + "service-account" + ], + "flag_values": { + "output": "json", + "service-account": "{account}" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + }, + { + "argv": [ + "create", + "api-key", + "--service-account", + "{account}", + "--description", + "probe" + ], + "capture": [ + "apikey", + "ID:\\s+(\\S+)" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot path": { - "args": [ - "{env}" - ], - "flags": { - "name": "{name}", - "path": "cmd/kosli/testdata/person-schema.json" + "get artifact": { + "args": [ + "{flow}@1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: cmd/kosli/testdata/person-schema.json\nFlow: {flow}\nTrail: {trail}\nName in template: probe-artifact\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCreated on: {timestamp} \u2022 {ago}\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/{flow}/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01?artifact_id={uuid}\nState: COMPLIANT\nHistory:\n probe-artifact reported {timestamp}", + "flags_to_test": [ + "output", + "trail" + ], + "flag_values": { + "output": "json", + "trail": "{trail}" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com" + ] + } + ], + "verify": [] }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[1] artifacts were reported to environment {env}", - "flags_to_test": [ - "dry-run", - "exclude", - "name", - "path", - "watch" - ], - "flag_values": { - "dry-run": "true", - "exclude": "probe-exclude", - "name": "{name}", - "path": "cmd/kosli/testdata/person-schema.json", - "watch": "false" + "get attestation": { + "args": [ + "probe-attestation" + ], + "flags": { + "flow": "{flow}", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: probe-attestation\nType: generic\nCompliance: true\nCreated at: {timestamp} \u2022 {ago}\nAttestation URL: http://localhost/docs-cmd-test-user-shared/flows/{flow}/trails/{trail}?attestation_id={uuid}", + "flags_to_test": [ + "attestation-id", + "fingerprint", + "flow", + "output", + "trail" + ], + "flag_values": { + "attestation-id": "probe-attestation-id", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "output": "json", + "trail": "{trail}" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com" + ] + }, + { + "argv": [ + "attest", + "generic", + "--name", + "probe-attestation", + "--flow", + "{flow}", + "--trail", + "{trail}" + ] + }, + { + "argv": [ + "attest", + "generic", + "--name", + "probe-on-artifact", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01" + ] + } + ], + "verify": [], + "args_for_flag": { + "attestation-id": [], + "fingerprint": [ + "probe-on-artifact" + ] + }, + "flags_for_flag": { + "fingerprint": { + "flow": "{flow}" + } + } + }, + "get control": { + "args": [ + "{control}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Identifier: {control}\nName: {control}\nVersion: 1\nArchived: false\nCreated by: docs-cmd-test-user\nCreated at: {timestamp} \u2022 {ago}", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}" + ] + } + ], + "verify": [] + }, + "get default-org": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Default user organization: docs-cmd-test-user-shared", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [], + "verify": [] + }, + "get environment": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {env}\nType: K8S\nDescription: \nState: N/A\nLast Reported At: N/A\nTags: None\nPolicies: []", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot paths": { - "args": [ - "{env}" - ], - "flags": { - "paths-file": "hack/empty-flag-audit/paths.yml" + "get flow": { + "args": [ + "{flow}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {flow}\nDescription: \nVisibility: private\nTemplate: \n version: 1\nLast Deployment At: N/A\nTags: None", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [] }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[1] artifacts were reported to environment {env}", - "flags_to_test": [ - "dry-run", - "paths-file", - "watch" - ], - "flag_values": { - "dry-run": "true", - "paths-file": "hack/empty-flag-audit/paths.yml", - "watch": "false" + "get policy": { + "args": [ + "{policy}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {policy}\nDescription: \nCreated At: {timestamp} \u2022 {ago}\nVersions: 1\nAttached to environments: []\nPolicy content:\n _schema: https://kosli.com/schemas/policy/environment/v1\n \n artifacts:\n provenance:\n required: true\n \n trail-compliance:\n required: true", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "policy", + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "snapshot s3": { - "args": [ - "{env}" - ], - "flags": { - "bucket": "probe-bucket" + "get repo": { + "args": [ + "{name}" + ], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli get repo] Repo 'probe-get-repo-baseline-nm' not found", + "needs": "a connected git provider", + "flags_to_test": [ + "output", + "provider", + "repo-id" + ], + "flag_values": { + "output": "json", + "provider": "github", + "repo-id": "probe-repo-id" + }, + "setup": [], + "verify": [] + }, + "get service-account": { + "args": [ + "{account}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {account}\nDescription: N/A\nPrivilege: reader\nCreated At: {timestamp} \u2022 {ago}", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [] }, - "baseline_ok": false, - "error": "Error: [kosli snapshot s3] operation error S3: ListObjectsV2, resolve auth scheme: resolve endpoint: endpoint rule error, Invalid region: region was not a valid DNS name.", - "needs": "aws", - "flags_to_test": [ - "aws-key-id", - "aws-region", - "aws-secret-key", - "bucket", - "dry-run", - "exclude", - "exclude-regex", - "include", - "include-regex" - ], - "flag_values": { - "aws-key-id": "probe-aws-key-id", - "aws-region": "probe-aws-region", - "aws-secret-key": "probe-aws-secret-key", - "bucket": "probe-bucket", - "dry-run": "true", - "exclude": "probe-exclude", - "exclude-regex": "probe-exclude-regex", - "include": "probe-include", - "include-regex": "probe-include-regex" + "get snapshot": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "COMMIT ARTIFACT FLOW COMPLIANCE RUNNING_SINCE REPLICAS\nN/A Name: probe-artifact N/A NON-COMPLIANT {ago} 1\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "status": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "OK", - "flags_to_test": [ - "assert" - ], - "flag_values": { - "assert": "true" + "get trail": { + "args": [ + "{trail}" + ], + "flags": { + "flow": "{flow}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {trail}\nDescription: \nCompliance: COMPLIANT\nLast modified at: {timestamp} \u2022 {ago}\nEvents:\n\n TIME DESCRIPTION GIT-COMMIT COMPLIANCE\n {timestamp} trail started", + "flags_to_test": [ + "flow", + "output" + ], + "flag_values": { + "flow": "{flow}", + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "list api-keys": { + "args": [], + "flags": { + "service-account": "{account}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "ID DESCRIPTION CREATED EXPIRES LAST USED\n{apikey} probe {timestamp} \u2022 {ago} N/A N/A", + "flags_to_test": [ + "output", + "service-account" + ], + "flag_values": { + "output": "json", + "service-account": "{account}" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + }, + { + "argv": [ + "create", + "api-key", + "--service-account", + "{account}", + "--description", + "probe" + ], + "capture": [ + "apikey", + "ID:\\s+(\\S+)" + ] + } + ], + "verify": [] + }, + "list artifacts": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "COMMIT ARTIFACT STATE CREATED_AT\n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n \n1ade42f Name: cmd/kosli/testdata/person-schema.json COMPLIANT {timestamp}\n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "flow", + "output", + "page", + "page-limit", + "repo" + ], + "flag_values": { + "flow": "{flow}", + "output": "json", + "page": "1", + "page-limit": "5", + "repo": "probe-repo" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] + }, + "list controls": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "IDENTIFIER NAME DESCRIPTION CREATED AT\nprobe-create-control-baseline-co probe-create-control-baseline-nm {timestamp}\nprobe-get-control-baseline-co probe-get-control-baseline-co {timestamp}\n{control} {control} {timestamp}\n\nShowing page 1 of 1, total 3 controls", + "flags_to_test": [ + "archived", + "output", + "page", + "page-limit", + "search", + "sort-direction", + "tag" + ], + "flag_values": { + "archived": "true", + "output": "json", + "page": "1", + "page-limit": "5", + "search": "probe-search", + "sort-direction": "asc", + "tag": "probe-tag" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}" + ] + } + ], + "verify": [] + }, + "list environments": { + "args": [], + "flags": { + "page-limit": "5" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME TYPE LAST REPORT LAST MODIFIED TAGS POLICIES\nprobe-allow-artifact-baseline-en server {timestamp} []\nprobe-assert-snapshot-baseline-en server {timestamp} {timestamp} []\nprobe-create-environment-baseline-en K8S {timestamp} []\nprobe-diff-snapshots-baseline-en server {timestamp} {timestamp} []\nprobe-get-environment-baseline-en K8S {timestamp} []\n\nShowing page 1 of 2, total 9 items", + "flags_to_test": [ + "name", + "output", + "page", + "page-limit", + "sort", + "sort-direction", + "space-id", + "tag", + "type" + ], + "flag_values": { + "name": "{name}", + "output": "json", + "page": "1", + "page-limit": "5", + "sort": "name", + "sort-direction": "asc", + "space-id": "probe-space-id", + "tag": "probe-tag", + "type": "K8S" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [] + }, + "list flows": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION VISIBILITY TAGS\nprobe-allow-artifact-baseline-fl private \nprobe-archive-attestation-type-baseline-fl private \nprobe-assert-artifact-baseline-fl private \nprobe-attest-artifact-baseline-fl private \nprobe-attest-custom-baseline-fl private \nprobe-attest-decision-baseline-fl private \nprobe-attest-generic-baseline-fl private \nprobe-attest-jira-baseline-fl private \nprobe-attest-junit-baseline-fl private \nprobe-attest-override-baseline-fl private \nprobe-attest-pullrequest-azure-baseline-fl private \nprobe-attest-pullrequest-bitbucket-baseline-fl private \nprobe-attest-pullrequest-github-baseline-fl private \nprobe-attest-pullrequest-gitlab-baseline-fl private \nprobe-attest-snyk-baseline-fl private \nprobe-attest-sonar-baseline-fl private \nprobe-begin-trail-baseline-fl private \nprobe-create-attestation-type-baseline-fl private \nprobe-create-flow-baseline-fl private \nprobe-evaluate-trail-baseline-fl private \nprobe-evaluate-trails-baseline-fl private \nprobe-get-artifact-baseline-fl private \nprobe-get-attestation-baseline-fl private \nprobe-get-attestation-type-baseline-fl private \nprobe-get-flow-baseline-fl private \nprobe-get-trail-baseline-fl private \nprobe-list-artifacts-baseline-fl private \nprobe-list-attestation-types-baseline-fl private \n{flow} private", + "flags_to_test": [ + "ignore-case", + "name", + "output", + "page", + "page-limit" + ], + "flag_values": { + "ignore-case": "true", + "name": "{name}", + "output": "json", + "page": "1", + "page-limit": "5" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [] + }, + "list policies": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION CREATED AT LAST VERSION USED BY ENVS\nprobe-attach-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-create-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-detach-policy-baseline-po {timestamp} \u2022 {ago} 1 []\nprobe-get-policy-baseline-po {timestamp} \u2022 {ago} 1 []", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [], + "verify": [] + }, + "list repos": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "No repos were found.", + "flags_to_test": [ + "name", + "output", + "page", + "page-limit", + "provider", + "repo-id", + "search", + "sort-direction", + "tag" + ], + "flag_values": { + "name": "{name}", + "output": "json", + "page": "1", + "page-limit": "5", + "provider": "github", + "repo-id": "probe-repo-id", + "search": "probe-search", + "sort-direction": "asc", + "tag": "probe-tag" + }, + "setup": [], + "verify": [] + }, + "list service-accounts": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION PRIVILEGE CREATED\nprobe-create-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-create-service-account-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-delete-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-get-api-key-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-get-service-account-baseline-sa N/A reader {timestamp} \u2022 {ago}\nprobe-list-api-keys-baseline-sa N/A reader {timestamp} \u2022 {ago}\n{account} N/A reader {timestamp} \u2022 {ago}", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [] }, - "setup": [], - "verify": [] - }, - "tag": { - "args": [ - "flow", - "{flow}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "No tags were applied for flow '{flow}'", - "flags_to_test": [ - "dry-run", - "provider", - "repo-id", - "set", - "unset" - ], - "flag_values": { - "dry-run": "true", - "provider": "github", - "repo-id": "probe-repo-id", - "set": "probe=set", - "unset": "probe-unset" + "list snapshots": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "SNAPSHOT FROM TO DURATION COMPLIANT\n1 {timestamp} now about a second false", + "flags_to_test": [ + "interval", + "output", + "page", + "page-limit", + "reverse" + ], + "flag_values": { + "interval": "1", + "output": "json", + "page": "1", + "page-limit": "5", + "reverse": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] + }, + "list trails": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION COMPLIANCE\n{trail} COMPLIANT\nprobe-list-attestation-types-baseline-tr COMPLIANT\nprobe-list-artifacts-baseline-tr COMPLIANT\nprobe-get-trail-baseline-tr COMPLIANT\nprobe-get-attestation-type-baseline-tr COMPLIANT\nprobe-get-attestation-baseline-tr COMPLIANT\nprobe-get-artifact-baseline-tr COMPLIANT\nprobe-evaluate-trails-baseline-tr COMPLIANT\nprobe-evaluate-trail-baseline-tr COMPLIANT\nprobe-create-attestation-type-baseline-tr COMPLIANT\nprobe-begin-trail-baseline-tr COMPLIANT\nprobe-attest-sonar-baseline-tr COMPLIANT\nprobe-attest-snyk-baseline-tr COMPLIANT\nprobe-attest-pullrequest-gitlab-baseline-tr COMPLIANT\nprobe-attest-pullrequest-github-baseline-tr COMPLIANT\nprobe-attest-pullrequest-bitbucket-baseline-tr COMPLIANT\nprobe-attest-pullrequest-azure-baseline-tr COMPLIANT\nprobe-attest-override-baseline-tr COMPLIANT\nprobe-attest-junit-baseline-tr COMPLIANT\nprobe-attest-jira-baseline-tr NON-COMPLIANT\n\nShowing page 1 of 2, total 27 items", + "flags_to_test": [ + "fingerprint", + "flow", + "flow-tag", + "output", + "page", + "page-limit" + ], + "flag_values": { + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "flow-tag": "probe=flow-tag", + "output": "json", + "page": "1", + "page-limit": "5" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - } - ], - "verify": [] - }, - "unarchive control": { - "args": [ - "{control}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "control {control} was unarchived", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" + "rename flow": { + "args": [ + "{flow}", + "{name}-1" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "flow {flow} was renamed to {name}-1", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [ + [ + "get", + "flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "rotate api-key": { + "args": [ + "{apikey}" + ], + "flags": { + "service-account": "{account}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "ID: {apikey}\nKey: {secret}\nDescription: probe\nCreated At: {timestamp} \u2022 {ago}\nExpires At: N/A\nOld Key Valid Until: {timestamp} \u2022 in one day", + "flags_to_test": [ + "dry-run", + "expires-at", + "grace-period-hours", + "output", + "service-account" + ], + "flag_values": { + "dry-run": "true", + "expires-at": "4102444800", + "grace-period-hours": "24", + "output": "json", + "service-account": "{account}" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + }, + { + "argv": [ + "create", + "api-key", + "--service-account", + "{account}", + "--description", + "probe" + ], + "capture": [ + "apikey", + "ID:\\s+(\\S+)" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}" - ] - } - ], - "verify": [ - [ - "get", - "control", - "{control}", - "--output", - "json" - ] - ] - }, - "update control": { - "args": [ - "{control}" - ], - "flags": { - "name": "{name}" + "search": { + "args": [ + "{digest}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Search result resolved to artifact with fingerprint 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-assert-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-assert-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-attest-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-attest-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-get-artifact-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-get-artifact-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}\n\n\nName: cmd/kosli/testdata/person-schema.json\nFingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nHas provenance: true\nFlow: probe-get-attestation-baseline-fl\nGit commit: 1ade42f39dd06d36aa603b9524a1b3eeaba9b796\nCommit URL: http://example.com\nBuild URL: http://example.com\nArtifact URL: http://localhost/docs-cmd-test-user-shared/flows/probe-get-attestation-baseline-fl/artifacts/1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01\nCompliance state: COMPLIANT\nRunning in: [ ]\nExited from: [ ]\nHistory:\n Commit 1ade42f {timestamp}\n Artifact created {timestamp}", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "{digest}", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [] }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "control {control} was updated", - "flags_to_test": [ - "description", - "dry-run", - "link", - "name" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "link": "probe=http://example.com", - "name": "{name}" + "snapshot azure": { + "args": [ + "{env}" + ], + "flags": { + "azure-client-id": "probe-azure-client-id", + "azure-client-secret": "probe-azure-client-secret", + "azure-resource-group-name": "probe-azure-resource-group-name", + "azure-subscription-id": "probe-azure-subscription-id", + "azure-tenant-id": "probe-azure-tenant-id" + }, + "baseline_ok": false, + "error": "Error: [kosli snapshot azure] ClientSecretCredential authentication failed. ", + "needs": "azure", + "flags_to_test": [ + "azure-client-id", + "azure-client-secret", + "azure-resource-group-name", + "azure-subscription-id", + "azure-tenant-id", + "digests-source", + "dry-run", + "zip" + ], + "flag_values": { + "azure-client-id": "probe-azure-client-id", + "azure-client-secret": "probe-azure-client-secret", + "azure-resource-group-name": "probe-azure-resource-group-name", + "azure-subscription-id": "probe-azure-subscription-id", + "azure-tenant-id": "probe-azure-tenant-id", + "digests-source": "logs", + "dry-run": "true", + "zip": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot cloud-run": { + "args": [ + "{env}" + ], + "flags": { + "project": "probe-project", + "region": "probe-region" + }, + "baseline_ok": false, + "error": "Error: [kosli snapshot cloud-run] GCP client setup failed: credentials: could not find default credentials. See https://cloud.google.com/docs/authentication/external/set-up-adc for more information", + "needs": "google cloud", + "flags_to_test": [ + "dry-run", + "exclude", + "exclude-regex", + "include", + "include-regex", + "project", + "region", + "resolve-names" + ], + "flag_values": { + "dry-run": "true", + "exclude": "probe-exclude", + "exclude-regex": "probe-exclude-regex", + "include": "probe-include", + "include-regex": "probe-include-regex", + "project": "probe-project", + "region": "probe-region", + "resolve-names": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot docker": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[15] containers were reported to environment {env}", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "docker" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot ecs": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli snapshot ecs] failed to filter ECS clusters: operation error ECS: ListClusters, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded", + "needs": "aws", + "flags_to_test": [ + "aws-key-id", + "aws-region", + "aws-secret-key", + "cluster", + "clusters", + "clusters-regex", + "dry-run", + "exclude", + "exclude-regex", + "exclude-services", + "exclude-services-regex", + "service-name", + "services", + "services-regex" + ], + "flag_values": { + "aws-key-id": "probe-aws-key-id", + "aws-region": "probe-aws-region", + "aws-secret-key": "probe-aws-secret-key", + "cluster": "probe-cluster", + "clusters": "probe-clusters", + "clusters-regex": "probe-clusters-regex", + "dry-run": "true", + "exclude": "probe-exclude", + "exclude-regex": "probe-exclude-regex", + "exclude-services": "probe-exclude-services", + "exclude-services-regex": "probe-exclude-services-regex", + "service-name": "probe-service-name", + "services": "probe-services", + "services-regex": "probe-services-regex" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot k8s": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli snapshot k8s] could not build config from inside the cluster: unable to load in-cluster configuration, KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT must be defined", + "needs": "kubernetes", + "flags_to_test": [ + "config-file", + "dry-run", + "exclude-namespaces", + "exclude-namespaces-regex", + "kubeconfig", + "namespaces", + "namespaces-regex" + ], + "flag_values": { + "config-file": "probe-config-file", + "dry-run": "true", + "exclude-namespaces": "probe-exclude-namespaces", + "exclude-namespaces-regex": "probe-exclude-namespaces-regex", + "kubeconfig": "probe-kubeconfig", + "namespaces": "probe-namespaces", + "namespaces-regex": "probe-namespaces-regex" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot lambda": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": false, + "error": "Error: [kosli snapshot lambda] operation error Lambda: ListFunctions, get identity: get credentials: failed to refresh cached credentials, no EC2 IMDS role found, operation error ec2imds: GetMetadata, canceled, context deadline exceeded", + "needs": "aws", + "flags_to_test": [ + "aws-key-id", + "aws-region", + "aws-secret-key", + "dry-run", + "exclude", + "exclude-regex", + "function-name", + "function-names", + "function-names-regex", + "function-version" + ], + "flag_values": { + "aws-key-id": "probe-aws-key-id", + "aws-region": "probe-aws-region", + "aws-secret-key": "probe-aws-secret-key", + "dry-run": "true", + "exclude": "probe-exclude", + "exclude-regex": "probe-exclude-regex", + "function-name": "probe-function-name", + "function-names": "probe-function-names", + "function-names-regex": "probe-function-names-regex", + "function-version": "probe-function-version" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot path": { + "args": [ + "{env}" + ], + "flags": { + "name": "{name}", + "path": "cmd/kosli/testdata/person-schema.json" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[1] artifacts were reported to environment {env}", + "flags_to_test": [ + "dry-run", + "exclude", + "name", + "path", + "watch" + ], + "flag_values": { + "dry-run": "true", + "exclude": "probe-exclude", + "name": "{name}", + "path": "cmd/kosli/testdata/person-schema.json", + "watch": "false" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot paths": { + "args": [ + "{env}" + ], + "flags": { + "paths-file": "hack/empty-flag-audit/paths.yml" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[1] artifacts were reported to environment {env}", + "flags_to_test": [ + "dry-run", + "paths-file", + "watch" + ], + "flag_values": { + "dry-run": "true", + "paths-file": "hack/empty-flag-audit/paths.yml", + "watch": "false" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "snapshot s3": { + "args": [ + "{env}" + ], + "flags": { + "bucket": "probe-bucket" + }, + "baseline_ok": false, + "error": "Error: [kosli snapshot s3] operation error S3: ListObjectsV2, resolve auth scheme: resolve endpoint: endpoint rule error, Invalid region: region was not a valid DNS name.", + "needs": "aws", + "flags_to_test": [ + "aws-key-id", + "aws-region", + "aws-secret-key", + "bucket", + "dry-run", + "exclude", + "exclude-regex", + "include", + "include-regex" + ], + "flag_values": { + "aws-key-id": "probe-aws-key-id", + "aws-region": "probe-aws-region", + "aws-secret-key": "probe-aws-secret-key", + "bucket": "probe-bucket", + "dry-run": "true", + "exclude": "probe-exclude", + "exclude-regex": "probe-exclude-regex", + "include": "probe-include", + "include-regex": "probe-include-regex" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "status": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "OK", + "flags_to_test": [ + "assert" + ], + "flag_values": { + "assert": "true" + }, + "setup": [], + "verify": [] + }, + "tag": { + "args": [ + "flow", + "{flow}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "No tags were applied for flow '{flow}'", + "flags_to_test": [ + "dry-run", + "provider", + "repo-id", + "set", + "unset" + ], + "flag_values": { + "dry-run": "true", + "provider": "github", + "repo-id": "probe-repo-id", + "set": "probe=set", + "unset": "probe-unset" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "control", - "{control}", - "--name", - "{control}", - "--description", - "probe-description-to-clear" - ] - } - ], - "verify": [ - [ - "get", - "control", - "{control}", - "--output", - "json" - ] - ] - }, - "update default-org": { - "args": [ - "docs-cmd-test-user-shared" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "default organization is set to: docs-cmd-test-user-shared", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" + "unarchive control": { + "args": [ + "{control}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "control {control} was unarchived", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}" + ] + } + ], + "verify": [ + [ + "get", + "control", + "{control}", + "--output", + "json" + ] + ] + }, + "update control": { + "args": [ + "{control}" + ], + "flags": { + "name": "{name}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "control {control} was updated", + "flags_to_test": [ + "description", + "dry-run", + "link", + "name" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "link": "probe=http://example.com", + "name": "{name}" + }, + "setup": [ + { + "argv": [ + "create", + "control", + "{control}", + "--name", + "{control}", + "--description", + "probe-description-to-clear" + ] + } + ], + "verify": [ + [ + "get", + "control", + "{control}", + "--output", + "json" + ] + ] + }, + "update default-org": { + "args": [ + "docs-cmd-test-user-shared" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "default organization is set to: docs-cmd-test-user-shared", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [], + "verify": [] + }, + "version": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "version.BuildInfo{Version:\"dev\", GitCommit:\"\", GitTreeState:\"\", GoVersion:\"go1.26.5\"}", + "flags_to_test": [ + "short" + ], + "flag_values": { + "short": "true" + }, + "setup": [], + "verify": [] + }, + "attest override": { + "args": [], + "flags": { + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "new-compliance-status": "true", + "original-attestation-type": "generic", + "reason": "probe", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nattestation '{name}' has been overridden in trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "new-compliance-status", + "origin-url", + "original-attestation-type", + "reason", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "new-compliance-status": "true", + "origin-url": "http://example.com", + "original-attestation-type": "generic", + "reason": "probe", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "attest", + "generic", + "--name", + "{name}", + "--flow", + "{flow}", + "--trail", + "{trail}" + ] + }, + { + "argv": [ + "attest", + "artifact", + "cmd/kosli/testdata/person-schema.json", + "--fingerprint", + "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "--build-url", + "http://example.com", + "--commit-url", + "http://example.com", + "--flow", + "{flow}", + "--trail", + "{trail}", + "--name", + "{name}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ], + "args_for_flag": { + "artifact-type": [ + "cmd/kosli/testdata/person-schema.json" + ] + } + }, + "archive attestation-type": { + "args": [ + "{name}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Custom attestation type {name} was archived", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "attestation-type", + "{name}", + "--schema", + "cmd/kosli/testdata/person-schema.json" + ] + } + ], + "verify": [] + }, + "assert pullrequest azure": { + "args": [], + "flags": { + "azure-org-url": "probe-azure-org-url", + "azure-token": "probe-azure-token", + "project": "probe-project", + "repository": "probe-repository" + }, + "baseline_ok": false, + "error": "Error: [kosli assert pullrequest azure] Options \"probe-azure-org-url/_apis\": unsupported protocol scheme \"\"", + "needs": "azure devops", + "flags_to_test": [ + "azure-org-url", + "azure-token", + "commit", + "dry-run", + "project", + "repository" + ], + "flag_values": { + "azure-org-url": "probe-azure-org-url", + "azure-token": "probe-azure-token", + "commit": "HEAD", + "dry-run": "true", + "project": "probe-project", + "repository": "probe-repository" + }, + "setup": [], + "verify": [] + }, + "assert pullrequest bitbucket": { + "args": [], + "flags": { + "bitbucket-username": "probe-bitbucket-username", + "bitbucket-password": "probe-bitbucket-password", + "bitbucket-workspace": "probe-bitbucket-workspace", + "repository": "probe-repository" + }, + "baseline_ok": false, + "error": "Error: [kosli assert pullrequest bitbucket] unexpected end of JSON input", + "needs": "bitbucket", + "flags_to_test": [ + "bitbucket-access-token", + "bitbucket-password", + "bitbucket-username", + "bitbucket-workspace", + "commit", + "dry-run", + "repository" + ], + "flag_values": { + "bitbucket-access-token": "probe-bitbucket-access-token", + "bitbucket-password": "probe-bitbucket-password", + "bitbucket-username": "probe-bitbucket-username", + "bitbucket-workspace": "probe-bitbucket-workspace", + "commit": "HEAD", + "dry-run": "true", + "repository": "probe-repository" + }, + "setup": [], + "verify": [] + }, + "assert pullrequest github": { + "args": [], + "flags": { + "github-org": "probe-github-org", + "github-token": "probe-github-token", + "repository": "probe-repository" + }, + "baseline_ok": false, + "error": "Error: [kosli assert pullrequest github] non-200 OK status code: 401 Unauthorized body: \"{\\r\\n \\\"message\\\": \\\"Bad credentials\\\",\\r\\n \\\"documentation_url\\\": \\\"https://docs.github.com/rest\\\",\\r\\n \\\"status\\\": \\\"401\\\"\\r\\n}\"", + "needs": "github", + "flags_to_test": [ + "commit", + "dry-run", + "github-base-url", + "github-org", + "github-token", + "repository" + ], + "flag_values": { + "commit": "HEAD", + "dry-run": "true", + "github-base-url": "probe-github-base-url", + "github-org": "probe-github-org", + "github-token": "probe-github-token", + "repository": "probe-repository" + }, + "setup": [], + "verify": [] + }, + "assert pullrequest gitlab": { + "args": [], + "flags": { + "gitlab-base-url": "http://localhost:8001", + "gitlab-org": "probe-gitlab-org", + "gitlab-token": "probe-gitlab-token", + "repository": "probe-repository" + }, + "baseline_ok": false, + "error": "Error: [kosli assert pullrequest gitlab] failed to list merge requests for commit HEAD: GET https://gitlab.com/api/v4/projects/probe-gitlab-org%!F(MISSING)probe-repository/repository/commits/HEAD/merge_requests: 401 {message: 401 Unauthorized}", + "needs": "gitlab", + "flags_to_test": [ + "commit", + "dry-run", + "gitlab-base-url", + "gitlab-org", + "gitlab-token", + "repository" + ], + "flag_values": { + "commit": "HEAD", + "dry-run": "true", + "gitlab-base-url": "http://localhost:8001", + "gitlab-org": "probe-gitlab-org", + "gitlab-token": "probe-gitlab-token", + "repository": "probe-repository" + }, + "setup": [], + "verify": [] + }, + "attach-policy": { + "args": [ + "{policy}" + ], + "flags": { + "environment": "{env}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "policy '{policy}' is attached to environments: [{env}]", + "flags_to_test": [ + "dry-run", + "environment" + ], + "flag_values": { + "dry-run": "true", + "environment": "{env}" + }, + "setup": [ + { + "argv": [ + "create", + "policy", + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml" + ] + } + ], + "verify": [ + [ + "get", + "policy", + "{policy}", + "--output", + "json" + ] + ] + }, + "attest pullrequest azure": { + "args": [], + "flags": { + "azure-org-url": "probe-azure-org-url", + "azure-token": "probe-azure-token", + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "project": "probe-project", + "repository": "probe-repository", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest pullrequest azure flow=probe-attest-pullrequest-azure-baseline-fl trail=probe-attest-pullrequest-azure-baseline-tr] Options \"probe-azure-org-url/_apis\": unsupported protocol scheme \"\"", + "needs": "azure devops", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "azure-org-url", + "azure-token", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "project", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "azure-org-url": "probe-azure-org-url", + "azure-token": "probe-azure-token", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "project": "probe-project", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest pullrequest bitbucket": { + "args": [], + "flags": { + "bitbucket-password": "probe-bitbucket-password", + "bitbucket-username": "probe-bitbucket-username", + "bitbucket-workspace": "probe-bitbucket-workspace", + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "name": "{name}", + "repository": "probe-repository", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest pullrequest bitbucket flow=probe-attest-pullrequest-bitbucket-baseline-fl trail=probe-attest-pullrequest-bitbucket-baseline-tr] unexpected end of JSON input", + "needs": "bitbucket", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "bitbucket-access-token", + "bitbucket-password", + "bitbucket-username", + "bitbucket-workspace", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "bitbucket-access-token": "probe-bitbucket-access-token", + "bitbucket-password": "probe-bitbucket-password", + "bitbucket-username": "probe-bitbucket-username", + "bitbucket-workspace": "probe-bitbucket-workspace", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest pullrequest github": { + "args": [], + "flags": { + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "github-org": "probe-github-org", + "github-token": "probe-github-token", + "name": "{name}", + "repository": "probe-repository", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest pullrequest github flow=probe-attest-pullrequest-github-baseline-fl trail=probe-attest-pullrequest-github-baseline-tr] non-200 OK status code: 401 Unauthorized body: \"{\\r\\n \\\"message\\\": \\\"Bad credentials\\\",\\r\\n \\\"documentation_url\\\": \\\"https://docs.github.com/rest\\\",\\r\\n \\\"status\\\": \\\"401\\\"\\r\\n}\"", + "needs": "github", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "github-base-url", + "github-org", + "github-token", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "github-base-url": "probe-github-base-url", + "github-org": "probe-github-org", + "github-token": "probe-github-token", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "attest pullrequest gitlab": { + "args": [], + "flags": { + "commit": "HEAD", + "external-url": "probe=http://example.com", + "flow": "{flow}", + "gitlab-base-url": "http://localhost:8001", + "gitlab-org": "probe-gitlab-org", + "gitlab-token": "probe-gitlab-token", + "name": "{name}", + "repository": "probe-repository", + "trail": "{trail}" + }, + "baseline_ok": false, + "error": "Error: [kosli attest pullrequest gitlab flow=probe-attest-pullrequest-gitlab-baseline-fl trail=probe-attest-pullrequest-gitlab-baseline-tr] failed to list merge requests for commit 1ade42f39dd06d36aa603b9524a1b3eeaba9b796: GET https://gitlab.com/api/v4/projects/probe-gitlab-org%!F(MISSING)probe-repository/repository/commits/1ade42f39dd06d36aa603b9524a1b3eeaba9b796/merge_requests: 401 {message: 401 Unauthorized}", + "needs": "gitlab", + "flags_to_test": [ + "annotate", + "artifact-type", + "assert", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "gitlab-base-url", + "gitlab-org", + "gitlab-token", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "assert": "true", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "gitlab-base-url": "http://localhost:8001", + "gitlab-org": "probe-gitlab-org", + "gitlab-token": "probe-gitlab-token", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] + ] + }, + "create attestation-type": { + "args": [ + "{name}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "attestation-type {name} was created", + "flags_to_test": [ + "description", + "dry-run", + "jq", + "schema", + "summary", + "summary-json" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "jq": ".age >= 18", + "schema": "cmd/kosli/testdata/person-schema.json", + "summary": "Critical=.critical_count", + "summary-json": "[{\"name\":\"Critical\",\"expression\":\".critical_count\"}]" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] }, - "setup": [], - "verify": [] - }, - "version": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "version.BuildInfo{Version:\"dev\", GitCommit:\"\", GitTreeState:\"\", GoVersion:\"go1.26.5\"}", - "flags_to_test": [ - "short" - ], - "flag_values": { - "short": "true" + "delete service-account": { + "args": [ + "{account}" + ], + "flags": { + "assume-yes": "true" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "service account {account} was deleted!", + "flags_to_test": [ + "assume-yes", + "dry-run", + "yes" + ], + "flag_values": { + "assume-yes": "true", + "dry-run": "true", + "yes": "true" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [ + [ + "get", + "service-account", + "{account}", + "--output", + "json" + ] + ] + }, + "detach-policy": { + "args": [ + "{policy}" + ], + "flags": { + "environment": "{env}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "policy '{policy}' is detached from environments: [{env}]", + "flags_to_test": [ + "dry-run", + "environment" + ], + "flag_values": { + "dry-run": "true", + "environment": "{env}" + }, + "setup": [ + { + "argv": [ + "create", + "policy", + "{policy}", + "cmd/kosli/testdata/policy-files/test-policy.yml" + ] + } + ], + "verify": [ + [ + "get", + "policy", + "{policy}", + "--output", + "json" + ] + ] + }, + "get attestation-type": { + "args": [ + "{name}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Name: {name}\nOrganization: docs-cmd-test-user-shared\nArchived: false\nCreated By: docs-cmd-test-user\nCreated at: {timestamp} \u2022 {ago}\nLast modified at: {timestamp} \u2022 {ago}\nVersions: \n Version: 1\n Timestamp: {timestamp} \u2022 {ago}\n Created By: docs-cmd-test-user\n Type schema: {\"additionalProperties\":true,\"properties\":{\"age\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"}},\"type\":\"object\"}\n Evaluator: \n Content Type: default", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "attestation-type", + "{name}", + "--schema", + "cmd/kosli/testdata/person-schema.json" + ] + } + ], + "verify": [] + }, + "join environment": { + "args": [], + "flags": { + "logical": "{logical}", + "physical": "{env}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "environment '{env}' was joined to '{logical}'", + "flags_to_test": [ + "dry-run", + "logical", + "physical" + ], + "flag_values": { + "dry-run": "true", + "logical": "{logical}", + "physical": "{env}" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + }, + { + "argv": [ + "create", + "environment", + "{seed}", + "--type", + "K8S" + ] + }, + { + "argv": [ + "create", + "environment", + "{logical}", + "--type", + "logical", + "--included-environments", + "{seed}" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "list attestation-types": { + "args": [], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "NAME DESCRIPTION LATEST VERSION\n{name} 1\nprobe-get-attestation-type-baseline-nm 1\nprobe-create-attestation-type-baseline-nm 1\nprobe-attest-custom-baseline-nm 1", + "flags_to_test": [ + "output" + ], + "flag_values": { + "output": "json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + }, + { + "argv": [ + "create", + "attestation-type", + "{name}", + "--schema", + "cmd/kosli/testdata/person-schema.json" + ] + } + ], + "verify": [] }, - "setup": [], - "verify": [] - }, - "attest override": { - "args": [], - "flags": { - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "new-compliance-status": "true", - "original-attestation-type": "generic", - "reason": "probe", - "trail": "{trail}" + "log environment": { + "args": [ + "{env}" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "SNAPSHOT EVENT FLOW\n#1 Artifact: probe-artifact \n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n Description: 1 instance started running (from 0 to 1) \n Reported at: {timestamp}", + "flags_to_test": [ + "end", + "end-ts", + "interval", + "output", + "page", + "page-limit", + "repo", + "reverse", + "start", + "start-ts" + ], + "flag_values": { + "end": "1", + "end-ts": "4102444800", + "interval": "1", + "output": "json", + "page": "1", + "page-limit": "5", + "repo": "probe-repo", + "reverse": "true", + "start": "1", + "start-ts": "1" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + }, + { + "argv": [ + "snapshot", + "path", + "{env}", + "--path", + "cmd/kosli/testdata/person-schema.json", + "--name", + "probe-artifact" + ] + } + ], + "verify": [] }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nattestation '{name}' has been overridden in trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "new-compliance-status", - "origin-url", - "original-attestation-type", - "reason", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "new-compliance-status": "true", - "origin-url": "http://example.com", - "original-attestation-type": "generic", - "reason": "probe", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" + "rename environment": { + "args": [ + "{env}", + "{name}-1" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "environment {env} was renamed to {name}-1", + "flags_to_test": [ + "dry-run" + ], + "flag_values": { + "dry-run": "true" + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "K8S" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "update service-account": { + "args": [ + "{account}" + ], + "flags": { + "description": "probe-description" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "service account {account} was updated", + "flags_to_test": [ + "description", + "dry-run", + "privilege" + ], + "flag_values": { + "description": "probe-description", + "dry-run": "true", + "privilege": "reader" + }, + "setup": [ + { + "argv": [ + "create", + "service-account", + "{account}", + "--privilege", + "reader" + ] + } + ], + "verify": [ + [ + "get", + "service-account", + "{account}", + "--output", + "json" + ] + ] + }, + "report artifact": { + "args": [ + "cmd/kosli/testdata/person-schema.json" + ], + "flags": { + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "build-url": "http://example.com", + "commit-url": "http://example.com", + "flow": "{flow}", + "git-commit": "HEAD" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Command \"artifact\" is deprecated, see kosli attest commands\nartifact cmd/kosli/testdata/person-schema.json was reported with fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flags_to_test": [ + "artifact-type", + "build-url", + "commit-url", + "dry-run", + "exclude", + "fingerprint", + "flow", + "git-commit", + "name", + "registry-password", + "registry-provider", + "registry-username", + "repo-root" + ], + "flag_values": { + "artifact-type": "file", + "build-url": "http://example.com", + "commit-url": "http://example.com", + "dry-run": "true", + "exclude": "probe-exclude", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "git-commit": "HEAD", + "name": "{name}", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-root": "." + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [] }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "attest", - "generic", - "--name", - "{name}", - "--flow", - "{flow}", - "--trail", - "{trail}" - ] - }, - { - "argv": [ - "attest", - "artifact", - "cmd/kosli/testdata/person-schema.json", - "--fingerprint", - "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "--build-url", - "http://example.com", - "--commit-url", - "http://example.com", - "--flow", - "{flow}", - "--trail", - "{trail}", - "--name", - "{name}" + "snapshot server": { + "args": [ + "{env}" + ], + "flags": { + "paths": "." + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "Command \"server\" is deprecated, use 'kosli snapshot paths' instead\n[1] artifacts were reported to environment {env}", + "flags_to_test": [ + "dry-run", + "e", + "exclude", + "paths" + ], + "flag_values": { + "dry-run": "true", + "e": "probe-e", + "exclude": "probe-exclude", + "paths": "." + }, + "setup": [ + { + "argv": [ + "create", + "environment", + "{env}", + "--type", + "server" + ] + } + ], + "verify": [ + [ + "get", + "environment", + "{env}", + "--output", + "json" + ] + ] + }, + "completion": { + "args": [ + "bash" + ], + "flags": {}, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "# bash completion for kosli -*- shell-script -*-\n\n__kosli_debug()\n{\n if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then\n echo \"$*\" >> \"${BASH_COMP_DEBUG_FILE}\"\n fi\n}\n\n# Homebrew on Macs have version 1.3 of bash-completion which doesn't include\n# _init_completion. This is a very minimal version of that function.\n__kosli_init_completion()\n{\n COMPREPLY=()\n _get_comp_words_by_ref \"$@\" cur prev words cword\n}\n\n__kosli_index_of_word()\n{\n local w word=$1\n shift\n index=0\n for w in \"$@\"; do\n [[ $w = \"$word\" ]] && return\n index=$((index+1))\n done\n index=-1\n}\n\n__kosli_contains_word()\n{\n local w word=$1; shift\n for w in \"$@\"; do\n [[ $w = \"$word\" ]] && return\n done\n return 1\n}\n\n__kosli_handle_go_custom_completion()\n{\n __kosli_debug \"${FUNCNAME[0]}: cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}\"\n\n local shellCompDirectiveError=1\n local shellCompDirectiveNoSpace=2\n local shellCompDirectiveNoFileComp=4\n local shellCompDirectiveFilterFileExt=8\n local shellCompDirectiveFilterDirs=16\n\n local out requestComp lastParam lastChar comp directive args\n\n # Prepare the command to request completions for the program.\n # Calling ${words[0]} instead of directly kosli allows handling aliases\n args=(\"${words[@]:1}\")\n # Disable ActiveHelp which is not supported for bash completion v1\n requestComp=\"KOSLI_ACTIVE_HELP=0 ${words[0]} __completeNoDesc ${args[*]}\"\n\n lastParam=${words[$((${#words[@]}-1))]}\n lastChar=${lastParam:$((${#lastParam}-1)):1}\n __kosli_debug \"${FUNCNAME[0]}: lastParam ${lastParam}, lastChar ${lastChar}\"\n\n if [ -z \"${cur}\" ] && [ \"${lastChar}\" != \"=\" ]; then\n # If the last parameter is complete (there is a space following it)\n # We add an extra empty parameter so we can indicate this to the go method.\n __kosli_debug \"${FUNCNAME[0]}: Adding extra empty parameter\"\n requestComp=\"${requestComp} \\\"\\\"\"\n fi\n\n __kosli_debug \"${FUNCNAME[0]}: calling ${requestComp}\"\n # Use eval to handle any environment variables and such\n out=$(eval \"${requestComp}\" 2>/dev/null)\n\n # Extract the directive integer at the very end of the output following a colon (:)\n directive=${out##*:}\n # Remove the directive\n out=${out%:*}\n if [ \"${directive}\" = \"${out}\" ]; then\n # There is not directive specified\n directive=0\n fi\n __kosli_debug \"${FUNCNAME[0]}: the completion directive is: ${directive}\"\n __kosli_debug \"${FUNCNAME[0]}: the completions are: ${out}\"\n\n if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then\n # Error code. No completion.\n __kosli_debug \"${FUNCNAME[0]}: received error from custom completion go code\"\n return\n else\n if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n __kosli_debug \"${FUNCNAME[0]}: activating no space\"\n compopt -o nospace\n fi\n fi\n if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n __kosli_debug \"${FUNCNAME[0]}: activating no file completion\"\n compopt +o default\n fi\n fi\n fi\n\n if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then\n # File extension filtering\n local fullFilter filter filteringCmd\n # Do not use quotes around the $out variable or else newline\n # characters will be kept.\n for filter in ${out}; do\n fullFilter+=\"$filter|\"\n done\n\n filteringCmd=\"_filedir $fullFilter\"\n __kosli_debug \"File filtering command: $filteringCmd\"\n $filteringCmd\n elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then\n # File completion for directories only\n local subdir\n # Use printf to strip any trailing newline\n subdir=$(printf \"%s\" \"${out}\")\n if [ -n \"$subdir\" ]; then\n __kosli_debug \"Listing directories in $subdir\"\n __kosli_handle_subdirs_in_dir_flag \"$subdir\"\n else\n __kosli_debug \"Listing directories in .\"\n _filedir -d\n fi\n else\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${out}\" -- \"$cur\")\n fi\n}\n\n__kosli_handle_reply()\n{\n __kosli_debug \"${FUNCNAME[0]}\"\n local comp\n case $cur in\n -*)\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n compopt -o nospace\n fi\n local allflags\n if [ ${#must_have_one_flag[@]} -ne 0 ]; then\n allflags=(\"${must_have_one_flag[@]}\")\n else\n allflags=(\"${flags[*]} ${two_word_flags[*]}\")\n fi\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${allflags[*]}\" -- \"$cur\")\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n [[ \"${COMPREPLY[0]}\" == *= ]] || compopt +o nospace\n fi\n\n # complete after --flag=abc\n if [[ $cur == *=* ]]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n compopt +o nospace\n fi\n\n local index flag\n flag=\"${cur%=*}\"\n __kosli_index_of_word \"${flag}\" \"${flags_with_completion[@]}\"\n COMPREPLY=()\n if [[ ${index} -ge 0 ]]; then\n PREFIX=\"\"\n cur=\"${cur#*=}\"\n ${flags_completion[${index}]}\n if [ -n \"${ZSH_VERSION:-}\" ]; then\n # zsh completion needs --flag= prefix\n eval \"COMPREPLY=( \\\"\\${COMPREPLY[@]/#/${flag}=}\\\" )\"\n fi\n fi\n fi\n\n if [[ -z \"${flag_parsing_disabled}\" ]]; then\n # If flag parsing is enabled, we have completed the flags and can return.\n # If flag parsing is disabled, we may not know all (or any) of the flags, so we fallthrough\n # to possibly call handle_go_custom_completion.\n return 0;\n fi\n ;;\n esac\n\n # check if we are handling a flag with special work handling\n local index\n __kosli_index_of_word \"${prev}\" \"${flags_with_completion[@]}\"\n if [[ ${index} -ge 0 ]]; then\n ${flags_completion[${index}]}\n return\n fi\n\n # we are parsing a flag and don't have a special handler, no completion\n if [[ ${cur} != \"${words[cword]}\" ]]; then\n return\n fi\n\n local completions\n completions=(\"${commands[@]}\")\n if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then\n completions+=(\"${must_have_one_noun[@]}\")\n elif [[ -n \"${has_completion_function}\" ]]; then\n # if a go completion function is provided, defer to that function\n __kosli_handle_go_custom_completion\n fi\n if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then\n completions+=(\"${must_have_one_flag[@]}\")\n fi\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${completions[*]}\" -- \"$cur\")\n\n if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${noun_aliases[*]}\" -- \"$cur\")\n fi\n\n if [[ ${#COMPREPLY[@]} -eq 0 ]]; then\n if declare -F __kosli_custom_func >/dev/null; then\n # try command name qualified custom func\n __kosli_custom_func\n else\n # otherwise fall back to unqualified for compatibility\n declare -F __custom_func >/dev/null && __custom_func\n fi\n fi\n\n # available in bash-completion >= 2, not always present on macOS\n if declare -F __ltrim_colon_completions >/dev/null; then\n __ltrim_colon_completions \"$cur\"\n fi\n\n # If there is only 1 completion and it is a flag with an = it will be completed\n # but we don't want a space after the =\n if [[ \"${#COMPREPLY[@]}\" -eq \"1\" ]] && [[ $(type -t compopt) = \"builtin\" ]] && [[ \"${COMPREPLY[0]}\" == --*= ]]; then\n compopt -o nospace\n fi\n}\n\n# The arguments should be in the form \"ext1|ext2|extn\"\n__kosli_handle_filename_extension_flag()\n{\n local ext=\"$1\"\n _filedir \"@(${ext})\"\n}\n\n__kosli_handle_subdirs_in_dir_flag()\n{\n local dir=\"$1\"\n pushd \"${dir}\" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return\n}\n\n__kosli_handle_flag()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n # if a command required a flag, and we found it, unset must_have_one_flag()\n local flagname=${words[c]}\n local flagvalue=\"\"\n # if the word contained an =\n if [[ ${words[c]} == *\"=\"* ]]; then\n flagvalue=${flagname#*=} # take in as flagvalue after the =\n flagname=${flagname%=*} # strip everything after the =\n flagname=\"${flagname}=\" # but put the = back\n fi\n __kosli_debug \"${FUNCNAME[0]}: looking for ${flagname}\"\n if __kosli_contains_word \"${flagname}\" \"${must_have_one_flag[@]}\"; then\n must_have_one_flag=()\n fi\n\n # if you set a flag which only applies to this command, don't show subcommands\n if __kosli_contains_word \"${flagname}\" \"${local_nonpersistent_flags[@]}\"; then\n commands=()\n fi\n\n # keep flag value with flagname as flaghash\n # flaghash variable is an associative array which is only supported in bash > 3.\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n if [ -n \"${flagvalue}\" ] ; then\n flaghash[${flagname}]=${flagvalue}\n elif [ -n \"${words[ $((c+1)) ]}\" ] ; then\n flaghash[${flagname}]=${words[ $((c+1)) ]}\n else\n flaghash[${flagname}]=\"true\" # pad \"true\" for bool flag\n fi\n fi\n\n # skip the argument to a two word flag\n if [[ ${words[c]} != *\"=\"* ]] && __kosli_contains_word \"${words[c]}\" \"${two_word_flags[@]}\"; then\n __kosli_debug \"${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument\"\n c=$((c+1))\n # if we are looking for a flags value, don't show commands\n if [[ $c -eq $cword ]]; then\n commands=()\n fi\n fi\n\n c=$((c+1))\n\n}\n\n__kosli_handle_noun()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n if __kosli_contains_word \"${words[c]}\" \"${must_have_one_noun[@]}\"; then\n must_have_one_noun=()\n elif __kosli_contains_word \"${words[c]}\" \"${noun_aliases[@]}\"; then\n must_have_one_noun=()\n fi\n\n nouns+=(\"${words[c]}\")\n c=$((c+1))\n}\n\n__kosli_handle_command()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n local next_command\n if [[ -n ${last_command} ]]; then\n next_command=\"_${last_command}_${words[c]//:/__}\"\n else\n if [[ $c -eq 0 ]]; then\n next_command=\"_kosli_root_command\"\n else\n next_command=\"_${words[c]//:/__}\"\n fi\n fi\n c=$((c+1))\n __kosli_debug \"${FUNCNAME[0]}: looking for ${next_command}\"\n declare -F \"$next_command\" >/dev/null && $next_command\n}\n\n__kosli_handle_word()\n{\n if [[ $c -ge $cword ]]; then\n __kosli_handle_reply\n return\n fi\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n if [[ \"${words[c]}\" == -* ]]; then\n __kosli_handle_flag\n elif __kosli_contains_word \"${words[c]}\" \"${commands[@]}\"; then\n __kosli_handle_command\n elif [[ $c -eq 0 ]]; then\n __kosli_handle_command\n elif __kosli_contains_word \"${words[c]}\" \"${command_aliases[@]}\"; then\n # aliashash variable is an associative array which is only supported in bash > 3.\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n words[c]=${aliashash[${words[c]}]}\n __kosli_handle_command\n else\n __kosli_handle_noun\n fi\n else\n __kosli_handle_noun\n fi\n __kosli_handle_word\n}\n\n_kosli_allow_artifact()\n{\n last_command=\"kosli_allow_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--reason=\")\n two_word_flags+=(\"--reason\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_flag+=(\"--reason=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_allow()\n{\n last_command=\"kosli_allow\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_attestation-type()\n{\n last_command=\"kosli_archive_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_control()\n{\n last_command=\"kosli_archive_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_environment()\n{\n last_command=\"kosli_archive_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_flow()\n{\n last_command=\"kosli_archive_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive()\n{\n last_command=\"kosli_archive\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"environment\")\n commands+=(\"flow\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_artifact()\n{\n last_command=\"kosli_assert_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_azure()\n{\n last_command=\"kosli_assert_pullrequest_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--azure-org-url=\")\n two_word_flags+=(\"--azure-org-url\")\n flags+=(\"--azure-token=\")\n two_word_flags+=(\"--azure-token\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-org-url=\")\n must_have_one_flag+=(\"--azure-token=\")\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_bitbucket()\n{\n last_command=\"kosli_assert_pullrequest_bitbucket\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--bitbucket-access-token=\")\n two_word_flags+=(\"--bitbucket-access-token\")\n flags+=(\"--bitbucket-password=\")\n two_word_flags+=(\"--bitbucket-password\")\n flags+=(\"--bitbucket-username=\")\n two_word_flags+=(\"--bitbucket-username\")\n flags+=(\"--bitbucket-workspace=\")\n two_word_flags+=(\"--bitbucket-workspace\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bitbucket-workspace=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_github()\n{\n last_command=\"kosli_assert_pullrequest_github\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--github-base-url=\")\n two_word_flags+=(\"--github-base-url\")\n flags+=(\"--github-org=\")\n two_word_flags+=(\"--github-org\")\n flags+=(\"--github-token=\")\n two_word_flags+=(\"--github-token\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--github-org=\")\n must_have_one_flag+=(\"--github-token=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_gitlab()\n{\n last_command=\"kosli_assert_pullrequest_gitlab\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--gitlab-base-url=\")\n two_word_flags+=(\"--gitlab-base-url\")\n flags+=(\"--gitlab-org=\")\n two_word_flags+=(\"--gitlab-org\")\n flags+=(\"--gitlab-token=\")\n two_word_flags+=(\"--gitlab-token\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--gitlab-org=\")\n must_have_one_flag+=(\"--gitlab-token=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest()\n{\n last_command=\"kosli_assert_pullrequest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"az\")\n aliashash[\"az\"]=\"azure\"\n fi\n commands+=(\"bitbucket\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"bb\")\n aliashash[\"bb\"]=\"bitbucket\"\n fi\n commands+=(\"github\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gh\")\n aliashash[\"gh\"]=\"github\"\n fi\n commands+=(\"gitlab\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gl\")\n aliashash[\"gl\"]=\"gitlab\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_snapshot()\n{\n last_command=\"kosli_assert_snapshot\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_status()\n{\n last_command=\"kosli_assert_status\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert()\n{\n last_command=\"kosli_assert\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n commands+=(\"pullrequest\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"merge_request\")\n aliashash[\"merge_request\"]=\"pullrequest\"\n command_aliases+=(\"mergerequest\")\n aliashash[\"mergerequest\"]=\"pullrequest\"\n command_aliases+=(\"mr\")\n aliashash[\"mr\"]=\"pullrequest\"\n command_aliases+=(\"pr\")\n aliashash[\"pr\"]=\"pullrequest\"\n command_aliases+=(\"pull_request\")\n aliashash[\"pull_request\"]=\"pullrequest\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"status\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attach-policy()\n{\n last_command=\"kosli_attach-policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_artifact()\n{\n last_command=\"kosli_attest_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--build-url=\")\n two_word_flags+=(\"--build-url\")\n two_word_flags+=(\"-b\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--commit-url=\")\n two_word_flags+=(\"--commit-url\")\n two_word_flags+=(\"-u\")\n flags+=(\"--display-name=\")\n two_word_flags+=(\"--display-name\")\n two_word_flags+=(\"-N\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--build-url=\")\n must_have_one_flag+=(\"-b\")\n must_have_one_flag+=(\"--commit-url=\")\n must_have_one_flag+=(\"-u\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_custom()\n{\n last_command=\"kosli_attest_custom\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--attestation-data=\")\n two_word_flags+=(\"--attestation-data\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--attestation-data=\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_flag+=(\"--type=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_decision()\n{\n last_command=\"kosli_attest_decision\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--compliant\")\n flags+=(\"-C\")\n flags+=(\"--control=\")\n two_word_flags+=(\"--control\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--control=\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_generic()\n{\n last_command=\"kosli_attest_generic\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--compliant\")\n flags+=(\"-C\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_jira()\n{\n last_command=\"kosli_attest_jira\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--ignore-branch-match\")\n flags+=(\"--jira-api-token=\")\n two_word_flags+=(\"--jira-api-token\")\n flags+=(\"--jira-base-url=\")\n two_word_flags+=(\"--jira-base-url\")\n flags+=(\"--jira-issue-fields=\")\n two_word_flags+=(\"--jira-issue-fields\")\n flags+=(\"--jira-pat=\")\n two_word_flags+=(\"--jira-pat\")\n flags+=(\"--jira-project-key=\")\n two_word_flags+=(\"--jira-project-key\")\n flags+=(\"--jira-secondary-source=\")\n two_word_flags+=(\"--jira-secondary-source\")\n flags+=(\"--jira-username=\")\n two_word_flags+=(\"--jira-username\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--jira-base-url=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_junit()\n{\n last_command=\"kosli_attest_junit\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--results-dir=\")\n two_word_flags+=(\"--results-dir\")\n two_word_flags+=(\"-R\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--upload-results\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_azure()\n{\n last_command=\"kosli_attest_pullrequest_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--azure-org-url=\")\n two_word_flags+=(\"--azure-org-url\")\n flags+=(\"--azure-token=\")\n two_word_flags+=(\"--azure-token\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-org-url=\")\n must_have_one_flag+=(\"--azure-token=\")\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_bitbucket()\n{\n last_command=\"kosli_attest_pullrequest_bitbucket\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--bitbucket-access-token=\")\n two_word_flags+=(\"--bitbucket-access-token\")\n flags+=(\"--bitbucket-password=\")\n two_word_flags+=(\"--bitbucket-password\")\n flags+=(\"--bitbucket-username=\")\n two_word_flags+=(\"--bitbucket-username\")\n flags+=(\"--bitbucket-workspace=\")\n two_word_flags+=(\"--bitbucket-workspace\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bitbucket-workspace=\")\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_github()\n{\n last_command=\"kosli_attest_pullrequest_github\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--github-base-url=\")\n two_word_flags+=(\"--github-base-url\")\n flags+=(\"--github-org=\")\n two_word_flags+=(\"--github-org\")\n flags+=(\"--github-token=\")\n two_word_flags+=(\"--github-token\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--github-org=\")\n must_have_one_flag+=(\"--github-token=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_gitlab()\n{\n last_command=\"kosli_attest_pullrequest_gitlab\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--gitlab-base-url=\")\n two_word_flags+=(\"--gitlab-base-url\")\n flags+=(\"--gitlab-org=\")\n two_word_flags+=(\"--gitlab-org\")\n flags+=(\"--gitlab-token=\")\n two_word_flags+=(\"--gitlab-token\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--gitlab-org=\")\n must_have_one_flag+=(\"--gitlab-token=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest()\n{\n last_command=\"kosli_attest_pullrequest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"az\")\n aliashash[\"az\"]=\"azure\"\n fi\n commands+=(\"bitbucket\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"bb\")\n aliashash[\"bb\"]=\"bitbucket\"\n fi\n commands+=(\"github\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gh\")\n aliashash[\"gh\"]=\"github\"\n fi\n commands+=(\"gitlab\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gl\")\n aliashash[\"gl\"]=\"gitlab\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_snyk()\n{\n last_command=\"kosli_attest_snyk\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--scan-results=\")\n two_word_flags+=(\"--scan-results\")\n two_word_flags+=(\"-R\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--upload-results\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--scan-results=\")\n must_have_one_flag+=(\"-R\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_sonar()\n{\n last_command=\"kosli_attest_sonar\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--max-wait=\")\n two_word_flags+=(\"--max-wait\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--pull-request=\")\n two_word_flags+=(\"--pull-request\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--sonar-api-token=\")\n two_word_flags+=(\"--sonar-api-token\")\n flags+=(\"--sonar-ce-task-url=\")\n two_word_flags+=(\"--sonar-ce-task-url\")\n flags+=(\"--sonar-project-key=\")\n two_word_flags+=(\"--sonar-project-key\")\n flags+=(\"--sonar-revision=\")\n two_word_flags+=(\"--sonar-revision\")\n flags+=(\"--sonar-server-url=\")\n two_word_flags+=(\"--sonar-server-url\")\n flags+=(\"--sonar-working-dir=\")\n two_word_flags+=(\"--sonar-working-dir\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--sonar-api-token=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest()\n{\n last_command=\"kosli_attest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n commands+=(\"custom\")\n commands+=(\"decision\")\n commands+=(\"generic\")\n commands+=(\"jira\")\n commands+=(\"junit\")\n commands+=(\"pullrequest\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"merge_request\")\n aliashash[\"merge_request\"]=\"pullrequest\"\n command_aliases+=(\"mergerequest\")\n aliashash[\"mergerequest\"]=\"pullrequest\"\n command_aliases+=(\"mr\")\n aliashash[\"mr\"]=\"pullrequest\"\n command_aliases+=(\"pr\")\n aliashash[\"pr\"]=\"pullrequest\"\n command_aliases+=(\"pull_request\")\n aliashash[\"pull_request\"]=\"pullrequest\"\n fi\n commands+=(\"snyk\")\n commands+=(\"sonar\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_begin_trail()\n{\n last_command=\"kosli_begin_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--template-file=\")\n two_word_flags+=(\"--template-file\")\n two_word_flags+=(\"-f\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_begin()\n{\n last_command=\"kosli_begin\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"trail\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_completion()\n{\n last_command=\"kosli_completion\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--help\")\n flags+=(\"-h\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n must_have_one_noun+=(\"bash\")\n must_have_one_noun+=(\"fish\")\n must_have_one_noun+=(\"powershell\")\n must_have_one_noun+=(\"zsh\")\n noun_aliases=()\n}\n\n_kosli_config()\n{\n last_command=\"kosli_config\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--set=\")\n two_word_flags+=(\"--set\")\n flags+=(\"--unset=\")\n two_word_flags+=(\"--unset\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_api-key()\n{\n last_command=\"kosli_create_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--expires-at=\")\n two_word_flags+=(\"--expires-at\")\n two_word_flags+=(\"-e\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--description=\")\n must_have_one_flag+=(\"-d\")\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_attestation-type()\n{\n last_command=\"kosli_create_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--jq=\")\n two_word_flags+=(\"--jq\")\n flags+=(\"--schema=\")\n two_word_flags+=(\"--schema\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_control()\n{\n last_command=\"kosli_create_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_environment()\n{\n last_command=\"kosli_create_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--included-environments=\")\n two_word_flags+=(\"--included-environments\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--type=\")\n must_have_one_flag+=(\"-t\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_flow()\n{\n last_command=\"kosli_create_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--template=\")\n two_word_flags+=(\"--template\")\n two_word_flags+=(\"-t\")\n flags+=(\"--template-file=\")\n two_word_flags+=(\"--template-file\")\n two_word_flags+=(\"-f\")\n flags+=(\"--use-empty-template\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_policy()\n{\n last_command=\"kosli_create_policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--comment=\")\n two_word_flags+=(\"--comment\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_service-account()\n{\n last_command=\"kosli_create_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--privilege=\")\n two_word_flags+=(\"--privilege\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--privilege=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create()\n{\n last_command=\"kosli_create\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n commands+=(\"policy\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete_api-key()\n{\n last_command=\"kosli_delete_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assume-yes\")\n flags+=(\"-y\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete_service-account()\n{\n last_command=\"kosli_delete_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assume-yes\")\n flags+=(\"-y\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete()\n{\n last_command=\"kosli_delete\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_detach-policy()\n{\n last_command=\"kosli_detach-policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_diff_snapshots()\n{\n last_command=\"kosli_diff_snapshots\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--show-unchanged\")\n flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_diff()\n{\n last_command=\"kosli_diff\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"snapshots\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_disable_beta()\n{\n last_command=\"kosli_disable_beta\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_disable()\n{\n last_command=\"kosli_disable\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"beta\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"experimental\")\n aliashash[\"experimental\"]=\"beta\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_enable_beta()\n{\n last_command=\"kosli_enable_beta\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_enable()\n{\n last_command=\"kosli_enable\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"beta\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"experimental\")\n aliashash[\"experimental\"]=\"beta\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_input()\n{\n last_command=\"kosli_evaluate_input\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--input-file=\")\n two_word_flags+=(\"--input-file\")\n two_word_flags+=(\"-i\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_trail()\n{\n last_command=\"kosli_evaluate_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--attestations=\")\n two_word_flags+=(\"--attestations\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_trails()\n{\n last_command=\"kosli_evaluate_trails\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--attestations=\")\n two_word_flags+=(\"--attestations\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate()\n{\n last_command=\"kosli_evaluate\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"input\")\n commands+=(\"trail\")\n commands+=(\"trails\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_fingerprint()\n{\n last_command=\"kosli_fingerprint\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--artifact-type=\")\n must_have_one_flag+=(\"-t\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_api-key()\n{\n last_command=\"kosli_get_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_artifact()\n{\n last_command=\"kosli_get_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_attestation()\n{\n last_command=\"kosli_get_attestation\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--attestation-id=\")\n two_word_flags+=(\"--attestation-id\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_attestation-type()\n{\n last_command=\"kosli_get_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_control()\n{\n last_command=\"kosli_get_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_default-org()\n{\n last_command=\"kosli_get_default-org\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_environment()\n{\n last_command=\"kosli_get_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_flow()\n{\n last_command=\"kosli_get_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_policy()\n{\n last_command=\"kosli_get_policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_repo()\n{\n last_command=\"kosli_get_repo\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_service-account()\n{\n last_command=\"kosli_get_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_snapshot()\n{\n last_command=\"kosli_get_snapshot\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_trail()\n{\n last_command=\"kosli_get_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get()\n{\n last_command=\"kosli_get\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"artifact\")\n commands+=(\"attestation\")\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"default-org\")\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n commands+=(\"policy\")\n commands+=(\"repo\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"trail\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_help()\n{\n last_command=\"kosli_help\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n has_completion_function=1\n noun_aliases=()\n}\n\n_kosli_join_environment()\n{\n last_command=\"kosli_join_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--logical=\")\n two_word_flags+=(\"--logical\")\n flags+=(\"--physical=\")\n two_word_flags+=(\"--physical\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--logical=\")\n must_have_one_flag+=(\"--physical=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_join()\n{\n last_command=\"kosli_join\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_api-keys()\n{\n last_command=\"kosli_list_api-keys\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_artifacts()\n{\n last_command=\"kosli_list_artifacts\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--repo=\")\n two_word_flags+=(\"--repo\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_attestation-types()\n{\n last_command=\"kosli_list_attestation-types\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_controls()\n{\n last_command=\"kosli_list_controls\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--archived\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--search=\")\n two_word_flags+=(\"--search\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_environments()\n{\n last_command=\"kosli_list_environments\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--sort=\")\n two_word_flags+=(\"--sort\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--space-id=\")\n two_word_flags+=(\"--space-id\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_flows()\n{\n last_command=\"kosli_list_flows\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--ignore-case\")\n flags+=(\"-i\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-N\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_policies()\n{\n last_command=\"kosli_list_policies\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_repos()\n{\n last_command=\"kosli_list_repos\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--search=\")\n two_word_flags+=(\"--search\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_service-accounts()\n{\n last_command=\"kosli_list_service-accounts\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_snapshots()\n{\n last_command=\"kosli_list_snapshots\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--interval=\")\n two_word_flags+=(\"--interval\")\n two_word_flags+=(\"-i\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--reverse\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_trails()\n{\n last_command=\"kosli_list_trails\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--flow-tag=\")\n two_word_flags+=(\"--flow-tag\")\n two_word_flags+=(\"-t\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list()\n{\n last_command=\"kosli_list\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-keys\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-keys\"\n command_aliases+=(\"aks\")\n aliashash[\"aks\"]=\"api-keys\"\n command_aliases+=(\"api-key\")\n aliashash[\"api-key\"]=\"api-keys\"\n fi\n commands+=(\"artifacts\")\n commands+=(\"attestation-types\")\n commands+=(\"controls\")\n commands+=(\"environments\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environments\"\n command_aliases+=(\"envs\")\n aliashash[\"envs\"]=\"environments\"\n fi\n commands+=(\"flows\")\n commands+=(\"policies\")\n commands+=(\"repos\")\n commands+=(\"service-accounts\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-accounts\"\n command_aliases+=(\"sas\")\n aliashash[\"sas\"]=\"service-accounts\"\n command_aliases+=(\"service-account\")\n aliashash[\"service-account\"]=\"service-accounts\"\n fi\n commands+=(\"snapshots\")\n commands+=(\"trails\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_log_environment()\n{\n last_command=\"kosli_log_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--end=\")\n two_word_flags+=(\"--end\")\n flags+=(\"--end-ts=\")\n two_word_flags+=(\"--end-ts\")\n flags+=(\"--interval=\")\n two_word_flags+=(\"--interval\")\n two_word_flags+=(\"-i\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--repo=\")\n two_word_flags+=(\"--repo\")\n flags+=(\"--reverse\")\n flags+=(\"--start=\")\n two_word_flags+=(\"--start\")\n flags+=(\"--start-ts=\")\n two_word_flags+=(\"--start-ts\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_log()\n{\n last_command=\"kosli_log\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename_environment()\n{\n last_command=\"kosli_rename_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename_flow()\n{\n last_command=\"kosli_rename_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename()\n{\n last_command=\"kosli_rename\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rotate_api-key()\n{\n last_command=\"kosli_rotate_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--expires-at=\")\n two_word_flags+=(\"--expires-at\")\n two_word_flags+=(\"-e\")\n flags+=(\"--grace-period-hours=\")\n two_word_flags+=(\"--grace-period-hours\")\n two_word_flags+=(\"-g\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rotate()\n{\n last_command=\"kosli_rotate\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_search()\n{\n last_command=\"kosli_search\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_azure()\n{\n last_command=\"kosli_snapshot_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--azure-client-id=\")\n two_word_flags+=(\"--azure-client-id\")\n flags+=(\"--azure-client-secret=\")\n two_word_flags+=(\"--azure-client-secret\")\n flags+=(\"--azure-resource-group-name=\")\n two_word_flags+=(\"--azure-resource-group-name\")\n flags+=(\"--azure-subscription-id=\")\n two_word_flags+=(\"--azure-subscription-id\")\n flags+=(\"--azure-tenant-id=\")\n two_word_flags+=(\"--azure-tenant-id\")\n flags+=(\"--digests-source=\")\n two_word_flags+=(\"--digests-source\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--zip\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-client-id=\")\n must_have_one_flag+=(\"--azure-client-secret=\")\n must_have_one_flag+=(\"--azure-resource-group-name=\")\n must_have_one_flag+=(\"--azure-subscription-id=\")\n must_have_one_flag+=(\"--azure-tenant-id=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_cloud-run()\n{\n last_command=\"kosli_snapshot_cloud-run\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--include=\")\n two_word_flags+=(\"--include\")\n flags+=(\"--include-regex=\")\n two_word_flags+=(\"--include-regex\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--region=\")\n two_word_flags+=(\"--region\")\n flags+=(\"--resolve-names\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--region=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_docker()\n{\n last_command=\"kosli_snapshot_docker\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_ecs()\n{\n last_command=\"kosli_snapshot_ecs\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--clusters=\")\n two_word_flags+=(\"--clusters\")\n flags+=(\"--clusters-regex=\")\n two_word_flags+=(\"--clusters-regex\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--exclude-services=\")\n two_word_flags+=(\"--exclude-services\")\n flags+=(\"--exclude-services-regex=\")\n two_word_flags+=(\"--exclude-services-regex\")\n flags+=(\"--services=\")\n two_word_flags+=(\"--services\")\n flags+=(\"--services-regex=\")\n two_word_flags+=(\"--services-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_k8s()\n{\n last_command=\"kosli_snapshot_k8s\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude-namespaces=\")\n two_word_flags+=(\"--exclude-namespaces\")\n two_word_flags+=(\"-x\")\n flags+=(\"--exclude-namespaces-regex=\")\n two_word_flags+=(\"--exclude-namespaces-regex\")\n flags+=(\"--kubeconfig=\")\n two_word_flags+=(\"--kubeconfig\")\n two_word_flags+=(\"-k\")\n flags+=(\"--namespaces=\")\n two_word_flags+=(\"--namespaces\")\n two_word_flags+=(\"-n\")\n flags+=(\"--namespaces-regex=\")\n two_word_flags+=(\"--namespaces-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_lambda()\n{\n last_command=\"kosli_snapshot_lambda\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--function-names=\")\n two_word_flags+=(\"--function-names\")\n flags+=(\"--function-names-regex=\")\n two_word_flags+=(\"--function-names-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_path()\n{\n last_command=\"kosli_snapshot_path\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--path=\")\n two_word_flags+=(\"--path\")\n flags+=(\"--watch\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"--path=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_paths()\n{\n last_command=\"kosli_snapshot_paths\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--paths-file=\")\n two_word_flags+=(\"--paths-file\")\n flags+=(\"--watch\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--paths-file=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_s3()\n{\n last_command=\"kosli_snapshot_s3\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--bucket=\")\n two_word_flags+=(\"--bucket\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--include=\")\n two_word_flags+=(\"--include\")\n two_word_flags+=(\"-i\")\n flags+=(\"--include-regex=\")\n two_word_flags+=(\"--include-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bucket=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot()\n{\n last_command=\"kosli_snapshot\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n commands+=(\"cloud-run\")\n commands+=(\"docker\")\n commands+=(\"ecs\")\n commands+=(\"k8s\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"kubernetes\")\n aliashash[\"kubernetes\"]=\"k8s\"\n fi\n commands+=(\"lambda\")\n commands+=(\"path\")\n commands+=(\"paths\")\n commands+=(\"s3\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"S3\")\n aliashash[\"S3\"]=\"s3\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_status()\n{\n last_command=\"kosli_status\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_tag()\n{\n last_command=\"kosli_tag\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--set=\")\n two_word_flags+=(\"--set\")\n two_word_flags+=(\"-s\")\n flags+=(\"--unset=\")\n two_word_flags+=(\"--unset\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_unarchive_control()\n{\n last_command=\"kosli_unarchive_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_unarchive()\n{\n last_command=\"kosli_unarchive\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"control\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_control()\n{\n last_command=\"kosli_update_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--link=\")\n two_word_flags+=(\"--link\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_default-org()\n{\n last_command=\"kosli_update_default-org\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_service-account()\n{\n last_command=\"kosli_update_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--privilege=\")\n two_word_flags+=(\"--privilege\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update()\n{\n last_command=\"kosli_update\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"control\")\n commands+=(\"default-org\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_version()\n{\n last_command=\"kosli_version\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--short\")\n flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_root_command()\n{\n last_command=\"kosli\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"allow\")\n commands+=(\"archive\")\n commands+=(\"assert\")\n commands+=(\"attach-policy\")\n commands+=(\"attest\")\n commands+=(\"begin\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"init\")\n aliashash[\"init\"]=\"begin\"\n command_aliases+=(\"start\")\n aliashash[\"start\"]=\"begin\"\n fi\n commands+=(\"completion\")\n commands+=(\"config\")\n commands+=(\"create\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"c\")\n aliashash[\"c\"]=\"create\"\n command_aliases+=(\"cr\")\n aliashash[\"cr\"]=\"create\"\n fi\n commands+=(\"delete\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"d\")\n aliashash[\"d\"]=\"delete\"\n command_aliases+=(\"de\")\n aliashash[\"de\"]=\"delete\"\n command_aliases+=(\"remove\")\n aliashash[\"remove\"]=\"delete\"\n command_aliases+=(\"rm\")\n aliashash[\"rm\"]=\"delete\"\n fi\n commands+=(\"detach-policy\")\n commands+=(\"diff\")\n commands+=(\"disable\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"dis\")\n aliashash[\"dis\"]=\"disable\"\n fi\n commands+=(\"enable\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"en\")\n aliashash[\"en\"]=\"enable\"\n fi\n commands+=(\"evaluate\")\n commands+=(\"fingerprint\")\n commands+=(\"get\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"g\")\n aliashash[\"g\"]=\"get\"\n fi\n commands+=(\"help\")\n commands+=(\"join\")\n commands+=(\"list\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"l\")\n aliashash[\"l\"]=\"list\"\n command_aliases+=(\"ls\")\n aliashash[\"ls\"]=\"list\"\n fi\n commands+=(\"log\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"lo\")\n aliashash[\"lo\"]=\"log\"\n fi\n commands+=(\"rename\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"re\")\n aliashash[\"re\"]=\"rename\"\n fi\n commands+=(\"rotate\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ro\")\n aliashash[\"ro\"]=\"rotate\"\n fi\n commands+=(\"search\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"se\")\n aliashash[\"se\"]=\"search\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"status\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"st\")\n aliashash[\"st\"]=\"status\"\n fi\n commands+=(\"tag\")\n commands+=(\"unarchive\")\n commands+=(\"update\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"u\")\n aliashash[\"u\"]=\"update\"\n command_aliases+=(\"up\")\n aliashash[\"up\"]=\"update\"\n fi\n commands+=(\"version\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ver\")\n aliashash[\"ver\"]=\"version\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n__start_kosli()\n{\n local cur prev words cword split\n declare -A flaghash 2>/dev/null || :\n declare -A aliashash 2>/dev/null || :\n if declare -F _init_completion >/dev/null 2>&1; then\n _init_completion -s || return\n else\n __kosli_init_completion -n \"=\" || return\n fi\n\n local c=0\n local flag_parsing_disabled=\n local flags=()\n local two_word_flags=()\n local local_nonpersistent_flags=()\n local flags_with_completion=()\n local flags_completion=()\n local commands=(\"kosli\")\n local command_aliases=()\n local must_have_one_flag=()\n local must_have_one_noun=()\n local has_completion_function=\"\"\n local last_command=\"\"\n local nouns=()\n local noun_aliases=()\n\n __kosli_handle_word\n}\n\nif [[ $(type -t compopt) = \"builtin\" ]]; then\n complete -o default -F __start_kosli kosli\nelse\n complete -o default -o nospace -F __start_kosli kosli\nfi\n\n# ex: ts=4 sw=4 et filetype=sh", + "flags_to_test": [], + "flag_values": {}, + "setup": [], + "verify": [] + }, + "attest sbom": { + "args": [], + "flags": { + "flow": "{flow}", + "name": "{name}", + "sbom-file": "cmd/kosli/testdata/sbom/cyclonedx.json", + "trail": "{trail}" + }, + "baseline_ok": true, + "baseline_exit": 0, + "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nsbom attestation '{name}' is reported to trail: {trail}", + "flags_to_test": [ + "annotate", + "artifact-type", + "attachments", + "commit", + "description", + "dry-run", + "exclude", + "external-fingerprint", + "external-url", + "fingerprint", + "flow", + "name", + "origin-url", + "redact-commit-info", + "registry-password", + "registry-provider", + "registry-username", + "repo-id", + "repo-provider", + "repo-root", + "repo-url", + "repository", + "sbom-file", + "trail", + "user-data" + ], + "flag_values": { + "annotate": "probe=annotate", + "artifact-type": "file", + "attachments": "cmd/kosli/testdata/person-schema.json", + "commit": "HEAD", + "description": "probe-description", + "dry-run": "true", + "exclude": "probe-exclude", + "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "external-url": "probe=http://example.com", + "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", + "flow": "{flow}", + "name": "{name}", + "origin-url": "http://example.com", + "redact-commit-info": "author", + "registry-password": "probe-registry-password", + "registry-provider": "probe-registry-provider", + "registry-username": "probe-registry-username", + "repo-id": "probe-repo-id", + "repo-provider": "github", + "repo-root": ".", + "repo-url": "http://example.com", + "repository": "probe-repository", + "sbom-file": "cmd/kosli/testdata/sbom/cyclonedx.json", + "trail": "{trail}", + "user-data": "cmd/kosli/testdata/person-schema.json" + }, + "setup": [ + { + "argv": [ + "create", + "flow", + "{flow}", + "--use-empty-template" + ] + }, + { + "argv": [ + "begin", + "trail", + "{trail}", + "--flow", + "{flow}" + ] + } + ], + "verify": [ + [ + "get", + "trail", + "{trail}", + "--flow", + "{flow}", + "--output", + "json" + ] ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ], - "args_for_flag": { - "artifact-type": [ - "cmd/kosli/testdata/person-schema.json" - ] } - }, - "archive attestation-type": { - "args": [ - "{name}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Custom attestation type {name} was archived", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "attestation-type", - "{name}", - "--schema", - "cmd/kosli/testdata/person-schema.json" - ] - } - ], - "verify": [] - }, - "assert pullrequest azure": { - "args": [], - "flags": { - "azure-org-url": "probe-azure-org-url", - "azure-token": "probe-azure-token", - "project": "probe-project", - "repository": "probe-repository" - }, - "baseline_ok": false, - "error": "Error: [kosli assert pullrequest azure] Options \"probe-azure-org-url/_apis\": unsupported protocol scheme \"\"", - "needs": "azure devops", - "flags_to_test": [ - "azure-org-url", - "azure-token", - "commit", - "dry-run", - "project", - "repository" - ], - "flag_values": { - "azure-org-url": "probe-azure-org-url", - "azure-token": "probe-azure-token", - "commit": "HEAD", - "dry-run": "true", - "project": "probe-project", - "repository": "probe-repository" - }, - "setup": [], - "verify": [] - }, - "assert pullrequest bitbucket": { - "args": [], - "flags": { - "bitbucket-username": "probe-bitbucket-username", - "bitbucket-password": "probe-bitbucket-password", - "bitbucket-workspace": "probe-bitbucket-workspace", - "repository": "probe-repository" - }, - "baseline_ok": false, - "error": "Error: [kosli assert pullrequest bitbucket] unexpected end of JSON input", - "needs": "bitbucket", - "flags_to_test": [ - "bitbucket-access-token", - "bitbucket-password", - "bitbucket-username", - "bitbucket-workspace", - "commit", - "dry-run", - "repository" - ], - "flag_values": { - "bitbucket-access-token": "probe-bitbucket-access-token", - "bitbucket-password": "probe-bitbucket-password", - "bitbucket-username": "probe-bitbucket-username", - "bitbucket-workspace": "probe-bitbucket-workspace", - "commit": "HEAD", - "dry-run": "true", - "repository": "probe-repository" - }, - "setup": [], - "verify": [] - }, - "assert pullrequest github": { - "args": [], - "flags": { - "github-org": "probe-github-org", - "github-token": "probe-github-token", - "repository": "probe-repository" - }, - "baseline_ok": false, - "error": "Error: [kosli assert pullrequest github] non-200 OK status code: 401 Unauthorized body: \"{\\r\\n \\\"message\\\": \\\"Bad credentials\\\",\\r\\n \\\"documentation_url\\\": \\\"https://docs.github.com/rest\\\",\\r\\n \\\"status\\\": \\\"401\\\"\\r\\n}\"", - "needs": "github", - "flags_to_test": [ - "commit", - "dry-run", - "github-base-url", - "github-org", - "github-token", - "repository" - ], - "flag_values": { - "commit": "HEAD", - "dry-run": "true", - "github-base-url": "probe-github-base-url", - "github-org": "probe-github-org", - "github-token": "probe-github-token", - "repository": "probe-repository" - }, - "setup": [], - "verify": [] - }, - "assert pullrequest gitlab": { - "args": [], - "flags": { - "gitlab-base-url": "http://localhost:8001", - "gitlab-org": "probe-gitlab-org", - "gitlab-token": "probe-gitlab-token", - "repository": "probe-repository" - }, - "baseline_ok": false, - "error": "Error: [kosli assert pullrequest gitlab] failed to list merge requests for commit HEAD: GET https://gitlab.com/api/v4/projects/probe-gitlab-org%!F(MISSING)probe-repository/repository/commits/HEAD/merge_requests: 401 {message: 401 Unauthorized}", - "needs": "gitlab", - "flags_to_test": [ - "commit", - "dry-run", - "gitlab-base-url", - "gitlab-org", - "gitlab-token", - "repository" - ], - "flag_values": { - "commit": "HEAD", - "dry-run": "true", - "gitlab-base-url": "http://localhost:8001", - "gitlab-org": "probe-gitlab-org", - "gitlab-token": "probe-gitlab-token", - "repository": "probe-repository" - }, - "setup": [], - "verify": [] - }, - "attach-policy": { - "args": [ - "{policy}" - ], - "flags": { - "environment": "{env}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "policy '{policy}' is attached to environments: [{env}]", - "flags_to_test": [ - "dry-run", - "environment" - ], - "flag_values": { - "dry-run": "true", - "environment": "{env}" - }, - "setup": [ - { - "argv": [ - "create", - "policy", - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml" - ] - } - ], - "verify": [ - [ - "get", - "policy", - "{policy}", - "--output", - "json" - ] - ] - }, - "attest pullrequest azure": { - "args": [], - "flags": { - "azure-org-url": "probe-azure-org-url", - "azure-token": "probe-azure-token", - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "project": "probe-project", - "repository": "probe-repository", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest pullrequest azure flow=probe-attest-pullrequest-azure-baseline-fl trail=probe-attest-pullrequest-azure-baseline-tr] Options \"probe-azure-org-url/_apis\": unsupported protocol scheme \"\"", - "needs": "azure devops", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "azure-org-url", - "azure-token", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "project", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "azure-org-url": "probe-azure-org-url", - "azure-token": "probe-azure-token", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "project": "probe-project", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest pullrequest bitbucket": { - "args": [], - "flags": { - "bitbucket-password": "probe-bitbucket-password", - "bitbucket-username": "probe-bitbucket-username", - "bitbucket-workspace": "probe-bitbucket-workspace", - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "name": "{name}", - "repository": "probe-repository", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest pullrequest bitbucket flow=probe-attest-pullrequest-bitbucket-baseline-fl trail=probe-attest-pullrequest-bitbucket-baseline-tr] unexpected end of JSON input", - "needs": "bitbucket", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "bitbucket-access-token", - "bitbucket-password", - "bitbucket-username", - "bitbucket-workspace", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "bitbucket-access-token": "probe-bitbucket-access-token", - "bitbucket-password": "probe-bitbucket-password", - "bitbucket-username": "probe-bitbucket-username", - "bitbucket-workspace": "probe-bitbucket-workspace", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest pullrequest github": { - "args": [], - "flags": { - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "github-org": "probe-github-org", - "github-token": "probe-github-token", - "name": "{name}", - "repository": "probe-repository", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest pullrequest github flow=probe-attest-pullrequest-github-baseline-fl trail=probe-attest-pullrequest-github-baseline-tr] non-200 OK status code: 401 Unauthorized body: \"{\\r\\n \\\"message\\\": \\\"Bad credentials\\\",\\r\\n \\\"documentation_url\\\": \\\"https://docs.github.com/rest\\\",\\r\\n \\\"status\\\": \\\"401\\\"\\r\\n}\"", - "needs": "github", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "github-base-url", - "github-org", - "github-token", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "github-base-url": "probe-github-base-url", - "github-org": "probe-github-org", - "github-token": "probe-github-token", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "attest pullrequest gitlab": { - "args": [], - "flags": { - "commit": "HEAD", - "external-url": "probe=http://example.com", - "flow": "{flow}", - "gitlab-base-url": "http://localhost:8001", - "gitlab-org": "probe-gitlab-org", - "gitlab-token": "probe-gitlab-token", - "name": "{name}", - "repository": "probe-repository", - "trail": "{trail}" - }, - "baseline_ok": false, - "error": "Error: [kosli attest pullrequest gitlab flow=probe-attest-pullrequest-gitlab-baseline-fl trail=probe-attest-pullrequest-gitlab-baseline-tr] failed to list merge requests for commit 1ade42f39dd06d36aa603b9524a1b3eeaba9b796: GET https://gitlab.com/api/v4/projects/probe-gitlab-org%!F(MISSING)probe-repository/repository/commits/1ade42f39dd06d36aa603b9524a1b3eeaba9b796/merge_requests: 401 {message: 401 Unauthorized}", - "needs": "gitlab", - "flags_to_test": [ - "annotate", - "artifact-type", - "assert", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "gitlab-base-url", - "gitlab-org", - "gitlab-token", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "assert": "true", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "gitlab-base-url": "http://localhost:8001", - "gitlab-org": "probe-gitlab-org", - "gitlab-token": "probe-gitlab-token", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - }, - "create attestation-type": { - "args": [ - "{name}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "attestation-type {name} was created", - "flags_to_test": [ - "description", - "dry-run", - "jq", - "schema", - "summary", - "summary-json" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "jq": ".age >= 18", - "schema": "cmd/kosli/testdata/person-schema.json", - "summary": "Critical=.critical_count", - "summary-json": "[{\"name\":\"Critical\",\"expression\":\".critical_count\"}]" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "delete service-account": { - "args": [ - "{account}" - ], - "flags": { - "assume-yes": "true" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "service account {account} was deleted!", - "flags_to_test": [ - "assume-yes", - "dry-run", - "yes" - ], - "flag_values": { - "assume-yes": "true", - "dry-run": "true", - "yes": "true" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [ - [ - "get", - "service-account", - "{account}", - "--output", - "json" - ] - ] - }, - "detach-policy": { - "args": [ - "{policy}" - ], - "flags": { - "environment": "{env}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "policy '{policy}' is detached from environments: [{env}]", - "flags_to_test": [ - "dry-run", - "environment" - ], - "flag_values": { - "dry-run": "true", - "environment": "{env}" - }, - "setup": [ - { - "argv": [ - "create", - "policy", - "{policy}", - "cmd/kosli/testdata/policy-files/test-policy.yml" - ] - } - ], - "verify": [ - [ - "get", - "policy", - "{policy}", - "--output", - "json" - ] - ] - }, - "get attestation-type": { - "args": [ - "{name}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Name: {name}\nOrganization: docs-cmd-test-user-shared\nArchived: false\nCreated By: docs-cmd-test-user\nCreated at: {timestamp} \u2022 {ago}\nLast modified at: {timestamp} \u2022 {ago}\nVersions: \n Version: 1\n Timestamp: {timestamp} \u2022 {ago}\n Created By: docs-cmd-test-user\n Type schema: {\"additionalProperties\":true,\"properties\":{\"age\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"}},\"type\":\"object\"}\n Evaluator: \n Content Type: default", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "attestation-type", - "{name}", - "--schema", - "cmd/kosli/testdata/person-schema.json" - ] - } - ], - "verify": [] - }, - "join environment": { - "args": [], - "flags": { - "logical": "{logical}", - "physical": "{env}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "environment '{env}' was joined to '{logical}'", - "flags_to_test": [ - "dry-run", - "logical", - "physical" - ], - "flag_values": { - "dry-run": "true", - "logical": "{logical}", - "physical": "{env}" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - }, - { - "argv": [ - "create", - "environment", - "{seed}", - "--type", - "K8S" - ] - }, - { - "argv": [ - "create", - "environment", - "{logical}", - "--type", - "logical", - "--included-environments", - "{seed}" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "list attestation-types": { - "args": [], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "NAME DESCRIPTION LATEST VERSION\n{name} 1\nprobe-get-attestation-type-baseline-nm 1\nprobe-create-attestation-type-baseline-nm 1\nprobe-attest-custom-baseline-nm 1", - "flags_to_test": [ - "output" - ], - "flag_values": { - "output": "json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - }, - { - "argv": [ - "create", - "attestation-type", - "{name}", - "--schema", - "cmd/kosli/testdata/person-schema.json" - ] - } - ], - "verify": [] - }, - "log environment": { - "args": [ - "{env}" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "SNAPSHOT EVENT FLOW\n#1 Artifact: probe-artifact \n Fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01 \n Description: 1 instance started running (from 0 to 1) \n Reported at: {timestamp}", - "flags_to_test": [ - "end", - "end-ts", - "interval", - "output", - "page", - "page-limit", - "repo", - "reverse", - "start", - "start-ts" - ], - "flag_values": { - "end": "1", - "end-ts": "4102444800", - "interval": "1", - "output": "json", - "page": "1", - "page-limit": "5", - "repo": "probe-repo", - "reverse": "true", - "start": "1", - "start-ts": "1" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - }, - { - "argv": [ - "snapshot", - "path", - "{env}", - "--path", - "cmd/kosli/testdata/person-schema.json", - "--name", - "probe-artifact" - ] - } - ], - "verify": [] - }, - "rename environment": { - "args": [ - "{env}", - "{name}-1" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "environment {env} was renamed to {name}-1", - "flags_to_test": [ - "dry-run" - ], - "flag_values": { - "dry-run": "true" - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "K8S" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "update service-account": { - "args": [ - "{account}" - ], - "flags": { - "description": "probe-description" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "service account {account} was updated", - "flags_to_test": [ - "description", - "dry-run", - "privilege" - ], - "flag_values": { - "description": "probe-description", - "dry-run": "true", - "privilege": "reader" - }, - "setup": [ - { - "argv": [ - "create", - "service-account", - "{account}", - "--privilege", - "reader" - ] - } - ], - "verify": [ - [ - "get", - "service-account", - "{account}", - "--output", - "json" - ] - ] - }, - "report artifact": { - "args": [ - "cmd/kosli/testdata/person-schema.json" - ], - "flags": { - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "build-url": "http://example.com", - "commit-url": "http://example.com", - "flow": "{flow}", - "git-commit": "HEAD" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Command \"artifact\" is deprecated, see kosli attest commands\nartifact cmd/kosli/testdata/person-schema.json was reported with fingerprint: 1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flags_to_test": [ - "artifact-type", - "build-url", - "commit-url", - "dry-run", - "exclude", - "fingerprint", - "flow", - "git-commit", - "name", - "registry-password", - "registry-provider", - "registry-username", - "repo-root" - ], - "flag_values": { - "artifact-type": "file", - "build-url": "http://example.com", - "commit-url": "http://example.com", - "dry-run": "true", - "exclude": "probe-exclude", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "git-commit": "HEAD", - "name": "{name}", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-root": "." - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [] - }, - "snapshot server": { - "args": [ - "{env}" - ], - "flags": { - "paths": "." - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "Command \"server\" is deprecated, use 'kosli snapshot paths' instead\n[1] artifacts were reported to environment {env}", - "flags_to_test": [ - "dry-run", - "e", - "exclude", - "paths" - ], - "flag_values": { - "dry-run": "true", - "e": "probe-e", - "exclude": "probe-exclude", - "paths": "." - }, - "setup": [ - { - "argv": [ - "create", - "environment", - "{env}", - "--type", - "server" - ] - } - ], - "verify": [ - [ - "get", - "environment", - "{env}", - "--output", - "json" - ] - ] - }, - "completion": { - "args": [ - "bash" - ], - "flags": {}, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "# bash completion for kosli -*- shell-script -*-\n\n__kosli_debug()\n{\n if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then\n echo \"$*\" >> \"${BASH_COMP_DEBUG_FILE}\"\n fi\n}\n\n# Homebrew on Macs have version 1.3 of bash-completion which doesn't include\n# _init_completion. This is a very minimal version of that function.\n__kosli_init_completion()\n{\n COMPREPLY=()\n _get_comp_words_by_ref \"$@\" cur prev words cword\n}\n\n__kosli_index_of_word()\n{\n local w word=$1\n shift\n index=0\n for w in \"$@\"; do\n [[ $w = \"$word\" ]] && return\n index=$((index+1))\n done\n index=-1\n}\n\n__kosli_contains_word()\n{\n local w word=$1; shift\n for w in \"$@\"; do\n [[ $w = \"$word\" ]] && return\n done\n return 1\n}\n\n__kosli_handle_go_custom_completion()\n{\n __kosli_debug \"${FUNCNAME[0]}: cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}\"\n\n local shellCompDirectiveError=1\n local shellCompDirectiveNoSpace=2\n local shellCompDirectiveNoFileComp=4\n local shellCompDirectiveFilterFileExt=8\n local shellCompDirectiveFilterDirs=16\n\n local out requestComp lastParam lastChar comp directive args\n\n # Prepare the command to request completions for the program.\n # Calling ${words[0]} instead of directly kosli allows handling aliases\n args=(\"${words[@]:1}\")\n # Disable ActiveHelp which is not supported for bash completion v1\n requestComp=\"KOSLI_ACTIVE_HELP=0 ${words[0]} __completeNoDesc ${args[*]}\"\n\n lastParam=${words[$((${#words[@]}-1))]}\n lastChar=${lastParam:$((${#lastParam}-1)):1}\n __kosli_debug \"${FUNCNAME[0]}: lastParam ${lastParam}, lastChar ${lastChar}\"\n\n if [ -z \"${cur}\" ] && [ \"${lastChar}\" != \"=\" ]; then\n # If the last parameter is complete (there is a space following it)\n # We add an extra empty parameter so we can indicate this to the go method.\n __kosli_debug \"${FUNCNAME[0]}: Adding extra empty parameter\"\n requestComp=\"${requestComp} \\\"\\\"\"\n fi\n\n __kosli_debug \"${FUNCNAME[0]}: calling ${requestComp}\"\n # Use eval to handle any environment variables and such\n out=$(eval \"${requestComp}\" 2>/dev/null)\n\n # Extract the directive integer at the very end of the output following a colon (:)\n directive=${out##*:}\n # Remove the directive\n out=${out%:*}\n if [ \"${directive}\" = \"${out}\" ]; then\n # There is not directive specified\n directive=0\n fi\n __kosli_debug \"${FUNCNAME[0]}: the completion directive is: ${directive}\"\n __kosli_debug \"${FUNCNAME[0]}: the completions are: ${out}\"\n\n if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then\n # Error code. No completion.\n __kosli_debug \"${FUNCNAME[0]}: received error from custom completion go code\"\n return\n else\n if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n __kosli_debug \"${FUNCNAME[0]}: activating no space\"\n compopt -o nospace\n fi\n fi\n if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n __kosli_debug \"${FUNCNAME[0]}: activating no file completion\"\n compopt +o default\n fi\n fi\n fi\n\n if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then\n # File extension filtering\n local fullFilter filter filteringCmd\n # Do not use quotes around the $out variable or else newline\n # characters will be kept.\n for filter in ${out}; do\n fullFilter+=\"$filter|\"\n done\n\n filteringCmd=\"_filedir $fullFilter\"\n __kosli_debug \"File filtering command: $filteringCmd\"\n $filteringCmd\n elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then\n # File completion for directories only\n local subdir\n # Use printf to strip any trailing newline\n subdir=$(printf \"%s\" \"${out}\")\n if [ -n \"$subdir\" ]; then\n __kosli_debug \"Listing directories in $subdir\"\n __kosli_handle_subdirs_in_dir_flag \"$subdir\"\n else\n __kosli_debug \"Listing directories in .\"\n _filedir -d\n fi\n else\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${out}\" -- \"$cur\")\n fi\n}\n\n__kosli_handle_reply()\n{\n __kosli_debug \"${FUNCNAME[0]}\"\n local comp\n case $cur in\n -*)\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n compopt -o nospace\n fi\n local allflags\n if [ ${#must_have_one_flag[@]} -ne 0 ]; then\n allflags=(\"${must_have_one_flag[@]}\")\n else\n allflags=(\"${flags[*]} ${two_word_flags[*]}\")\n fi\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${allflags[*]}\" -- \"$cur\")\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n [[ \"${COMPREPLY[0]}\" == *= ]] || compopt +o nospace\n fi\n\n # complete after --flag=abc\n if [[ $cur == *=* ]]; then\n if [[ $(type -t compopt) = \"builtin\" ]]; then\n compopt +o nospace\n fi\n\n local index flag\n flag=\"${cur%=*}\"\n __kosli_index_of_word \"${flag}\" \"${flags_with_completion[@]}\"\n COMPREPLY=()\n if [[ ${index} -ge 0 ]]; then\n PREFIX=\"\"\n cur=\"${cur#*=}\"\n ${flags_completion[${index}]}\n if [ -n \"${ZSH_VERSION:-}\" ]; then\n # zsh completion needs --flag= prefix\n eval \"COMPREPLY=( \\\"\\${COMPREPLY[@]/#/${flag}=}\\\" )\"\n fi\n fi\n fi\n\n if [[ -z \"${flag_parsing_disabled}\" ]]; then\n # If flag parsing is enabled, we have completed the flags and can return.\n # If flag parsing is disabled, we may not know all (or any) of the flags, so we fallthrough\n # to possibly call handle_go_custom_completion.\n return 0;\n fi\n ;;\n esac\n\n # check if we are handling a flag with special work handling\n local index\n __kosli_index_of_word \"${prev}\" \"${flags_with_completion[@]}\"\n if [[ ${index} -ge 0 ]]; then\n ${flags_completion[${index}]}\n return\n fi\n\n # we are parsing a flag and don't have a special handler, no completion\n if [[ ${cur} != \"${words[cword]}\" ]]; then\n return\n fi\n\n local completions\n completions=(\"${commands[@]}\")\n if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then\n completions+=(\"${must_have_one_noun[@]}\")\n elif [[ -n \"${has_completion_function}\" ]]; then\n # if a go completion function is provided, defer to that function\n __kosli_handle_go_custom_completion\n fi\n if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then\n completions+=(\"${must_have_one_flag[@]}\")\n fi\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${completions[*]}\" -- \"$cur\")\n\n if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then\n while IFS='' read -r comp; do\n COMPREPLY+=(\"$comp\")\n done < <(compgen -W \"${noun_aliases[*]}\" -- \"$cur\")\n fi\n\n if [[ ${#COMPREPLY[@]} -eq 0 ]]; then\n if declare -F __kosli_custom_func >/dev/null; then\n # try command name qualified custom func\n __kosli_custom_func\n else\n # otherwise fall back to unqualified for compatibility\n declare -F __custom_func >/dev/null && __custom_func\n fi\n fi\n\n # available in bash-completion >= 2, not always present on macOS\n if declare -F __ltrim_colon_completions >/dev/null; then\n __ltrim_colon_completions \"$cur\"\n fi\n\n # If there is only 1 completion and it is a flag with an = it will be completed\n # but we don't want a space after the =\n if [[ \"${#COMPREPLY[@]}\" -eq \"1\" ]] && [[ $(type -t compopt) = \"builtin\" ]] && [[ \"${COMPREPLY[0]}\" == --*= ]]; then\n compopt -o nospace\n fi\n}\n\n# The arguments should be in the form \"ext1|ext2|extn\"\n__kosli_handle_filename_extension_flag()\n{\n local ext=\"$1\"\n _filedir \"@(${ext})\"\n}\n\n__kosli_handle_subdirs_in_dir_flag()\n{\n local dir=\"$1\"\n pushd \"${dir}\" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return\n}\n\n__kosli_handle_flag()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n # if a command required a flag, and we found it, unset must_have_one_flag()\n local flagname=${words[c]}\n local flagvalue=\"\"\n # if the word contained an =\n if [[ ${words[c]} == *\"=\"* ]]; then\n flagvalue=${flagname#*=} # take in as flagvalue after the =\n flagname=${flagname%=*} # strip everything after the =\n flagname=\"${flagname}=\" # but put the = back\n fi\n __kosli_debug \"${FUNCNAME[0]}: looking for ${flagname}\"\n if __kosli_contains_word \"${flagname}\" \"${must_have_one_flag[@]}\"; then\n must_have_one_flag=()\n fi\n\n # if you set a flag which only applies to this command, don't show subcommands\n if __kosli_contains_word \"${flagname}\" \"${local_nonpersistent_flags[@]}\"; then\n commands=()\n fi\n\n # keep flag value with flagname as flaghash\n # flaghash variable is an associative array which is only supported in bash > 3.\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n if [ -n \"${flagvalue}\" ] ; then\n flaghash[${flagname}]=${flagvalue}\n elif [ -n \"${words[ $((c+1)) ]}\" ] ; then\n flaghash[${flagname}]=${words[ $((c+1)) ]}\n else\n flaghash[${flagname}]=\"true\" # pad \"true\" for bool flag\n fi\n fi\n\n # skip the argument to a two word flag\n if [[ ${words[c]} != *\"=\"* ]] && __kosli_contains_word \"${words[c]}\" \"${two_word_flags[@]}\"; then\n __kosli_debug \"${FUNCNAME[0]}: found a flag ${words[c]}, skip the next argument\"\n c=$((c+1))\n # if we are looking for a flags value, don't show commands\n if [[ $c -eq $cword ]]; then\n commands=()\n fi\n fi\n\n c=$((c+1))\n\n}\n\n__kosli_handle_noun()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n if __kosli_contains_word \"${words[c]}\" \"${must_have_one_noun[@]}\"; then\n must_have_one_noun=()\n elif __kosli_contains_word \"${words[c]}\" \"${noun_aliases[@]}\"; then\n must_have_one_noun=()\n fi\n\n nouns+=(\"${words[c]}\")\n c=$((c+1))\n}\n\n__kosli_handle_command()\n{\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n\n local next_command\n if [[ -n ${last_command} ]]; then\n next_command=\"_${last_command}_${words[c]//:/__}\"\n else\n if [[ $c -eq 0 ]]; then\n next_command=\"_kosli_root_command\"\n else\n next_command=\"_${words[c]//:/__}\"\n fi\n fi\n c=$((c+1))\n __kosli_debug \"${FUNCNAME[0]}: looking for ${next_command}\"\n declare -F \"$next_command\" >/dev/null && $next_command\n}\n\n__kosli_handle_word()\n{\n if [[ $c -ge $cword ]]; then\n __kosli_handle_reply\n return\n fi\n __kosli_debug \"${FUNCNAME[0]}: c is $c words[c] is ${words[c]}\"\n if [[ \"${words[c]}\" == -* ]]; then\n __kosli_handle_flag\n elif __kosli_contains_word \"${words[c]}\" \"${commands[@]}\"; then\n __kosli_handle_command\n elif [[ $c -eq 0 ]]; then\n __kosli_handle_command\n elif __kosli_contains_word \"${words[c]}\" \"${command_aliases[@]}\"; then\n # aliashash variable is an associative array which is only supported in bash > 3.\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n words[c]=${aliashash[${words[c]}]}\n __kosli_handle_command\n else\n __kosli_handle_noun\n fi\n else\n __kosli_handle_noun\n fi\n __kosli_handle_word\n}\n\n_kosli_allow_artifact()\n{\n last_command=\"kosli_allow_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--reason=\")\n two_word_flags+=(\"--reason\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_flag+=(\"--reason=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_allow()\n{\n last_command=\"kosli_allow\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_attestation-type()\n{\n last_command=\"kosli_archive_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_control()\n{\n last_command=\"kosli_archive_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_environment()\n{\n last_command=\"kosli_archive_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive_flow()\n{\n last_command=\"kosli_archive_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_archive()\n{\n last_command=\"kosli_archive\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"environment\")\n commands+=(\"flow\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_artifact()\n{\n last_command=\"kosli_assert_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_azure()\n{\n last_command=\"kosli_assert_pullrequest_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--azure-org-url=\")\n two_word_flags+=(\"--azure-org-url\")\n flags+=(\"--azure-token=\")\n two_word_flags+=(\"--azure-token\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-org-url=\")\n must_have_one_flag+=(\"--azure-token=\")\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_bitbucket()\n{\n last_command=\"kosli_assert_pullrequest_bitbucket\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--bitbucket-access-token=\")\n two_word_flags+=(\"--bitbucket-access-token\")\n flags+=(\"--bitbucket-password=\")\n two_word_flags+=(\"--bitbucket-password\")\n flags+=(\"--bitbucket-username=\")\n two_word_flags+=(\"--bitbucket-username\")\n flags+=(\"--bitbucket-workspace=\")\n two_word_flags+=(\"--bitbucket-workspace\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bitbucket-workspace=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_github()\n{\n last_command=\"kosli_assert_pullrequest_github\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--github-base-url=\")\n two_word_flags+=(\"--github-base-url\")\n flags+=(\"--github-org=\")\n two_word_flags+=(\"--github-org\")\n flags+=(\"--github-token=\")\n two_word_flags+=(\"--github-token\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--github-org=\")\n must_have_one_flag+=(\"--github-token=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest_gitlab()\n{\n last_command=\"kosli_assert_pullrequest_gitlab\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--gitlab-base-url=\")\n two_word_flags+=(\"--gitlab-base-url\")\n flags+=(\"--gitlab-org=\")\n two_word_flags+=(\"--gitlab-org\")\n flags+=(\"--gitlab-token=\")\n two_word_flags+=(\"--gitlab-token\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--gitlab-org=\")\n must_have_one_flag+=(\"--gitlab-token=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_pullrequest()\n{\n last_command=\"kosli_assert_pullrequest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"az\")\n aliashash[\"az\"]=\"azure\"\n fi\n commands+=(\"bitbucket\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"bb\")\n aliashash[\"bb\"]=\"bitbucket\"\n fi\n commands+=(\"github\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gh\")\n aliashash[\"gh\"]=\"github\"\n fi\n commands+=(\"gitlab\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gl\")\n aliashash[\"gl\"]=\"gitlab\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_snapshot()\n{\n last_command=\"kosli_assert_snapshot\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert_status()\n{\n last_command=\"kosli_assert_status\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_assert()\n{\n last_command=\"kosli_assert\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n commands+=(\"pullrequest\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"merge_request\")\n aliashash[\"merge_request\"]=\"pullrequest\"\n command_aliases+=(\"mergerequest\")\n aliashash[\"mergerequest\"]=\"pullrequest\"\n command_aliases+=(\"mr\")\n aliashash[\"mr\"]=\"pullrequest\"\n command_aliases+=(\"pr\")\n aliashash[\"pr\"]=\"pullrequest\"\n command_aliases+=(\"pull_request\")\n aliashash[\"pull_request\"]=\"pullrequest\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"status\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attach-policy()\n{\n last_command=\"kosli_attach-policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_artifact()\n{\n last_command=\"kosli_attest_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--build-url=\")\n two_word_flags+=(\"--build-url\")\n two_word_flags+=(\"-b\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--commit-url=\")\n two_word_flags+=(\"--commit-url\")\n two_word_flags+=(\"-u\")\n flags+=(\"--display-name=\")\n two_word_flags+=(\"--display-name\")\n two_word_flags+=(\"-N\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--build-url=\")\n must_have_one_flag+=(\"-b\")\n must_have_one_flag+=(\"--commit-url=\")\n must_have_one_flag+=(\"-u\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_custom()\n{\n last_command=\"kosli_attest_custom\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--attestation-data=\")\n two_word_flags+=(\"--attestation-data\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--attestation-data=\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_flag+=(\"--type=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_decision()\n{\n last_command=\"kosli_attest_decision\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--compliant\")\n flags+=(\"-C\")\n flags+=(\"--control=\")\n two_word_flags+=(\"--control\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--control=\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_generic()\n{\n last_command=\"kosli_attest_generic\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--compliant\")\n flags+=(\"-C\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_jira()\n{\n last_command=\"kosli_attest_jira\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--ignore-branch-match\")\n flags+=(\"--jira-api-token=\")\n two_word_flags+=(\"--jira-api-token\")\n flags+=(\"--jira-base-url=\")\n two_word_flags+=(\"--jira-base-url\")\n flags+=(\"--jira-issue-fields=\")\n two_word_flags+=(\"--jira-issue-fields\")\n flags+=(\"--jira-pat=\")\n two_word_flags+=(\"--jira-pat\")\n flags+=(\"--jira-project-key=\")\n two_word_flags+=(\"--jira-project-key\")\n flags+=(\"--jira-secondary-source=\")\n two_word_flags+=(\"--jira-secondary-source\")\n flags+=(\"--jira-username=\")\n two_word_flags+=(\"--jira-username\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--jira-base-url=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_junit()\n{\n last_command=\"kosli_attest_junit\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--results-dir=\")\n two_word_flags+=(\"--results-dir\")\n two_word_flags+=(\"-R\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--upload-results\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_azure()\n{\n last_command=\"kosli_attest_pullrequest_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--azure-org-url=\")\n two_word_flags+=(\"--azure-org-url\")\n flags+=(\"--azure-token=\")\n two_word_flags+=(\"--azure-token\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-org-url=\")\n must_have_one_flag+=(\"--azure-token=\")\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_bitbucket()\n{\n last_command=\"kosli_attest_pullrequest_bitbucket\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--bitbucket-access-token=\")\n two_word_flags+=(\"--bitbucket-access-token\")\n flags+=(\"--bitbucket-password=\")\n two_word_flags+=(\"--bitbucket-password\")\n flags+=(\"--bitbucket-username=\")\n two_word_flags+=(\"--bitbucket-username\")\n flags+=(\"--bitbucket-workspace=\")\n two_word_flags+=(\"--bitbucket-workspace\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bitbucket-workspace=\")\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_github()\n{\n last_command=\"kosli_attest_pullrequest_github\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--github-base-url=\")\n two_word_flags+=(\"--github-base-url\")\n flags+=(\"--github-org=\")\n two_word_flags+=(\"--github-org\")\n flags+=(\"--github-token=\")\n two_word_flags+=(\"--github-token\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--github-org=\")\n must_have_one_flag+=(\"--github-token=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest_gitlab()\n{\n last_command=\"kosli_attest_pullrequest_gitlab\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--assert\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--gitlab-base-url=\")\n two_word_flags+=(\"--gitlab-base-url\")\n flags+=(\"--gitlab-org=\")\n two_word_flags+=(\"--gitlab-org\")\n flags+=(\"--gitlab-token=\")\n two_word_flags+=(\"--gitlab-token\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--commit=\")\n must_have_one_flag+=(\"-g\")\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--gitlab-org=\")\n must_have_one_flag+=(\"--gitlab-token=\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--repository=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_pullrequest()\n{\n last_command=\"kosli_attest_pullrequest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"az\")\n aliashash[\"az\"]=\"azure\"\n fi\n commands+=(\"bitbucket\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"bb\")\n aliashash[\"bb\"]=\"bitbucket\"\n fi\n commands+=(\"github\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gh\")\n aliashash[\"gh\"]=\"github\"\n fi\n commands+=(\"gitlab\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"gl\")\n aliashash[\"gl\"]=\"gitlab\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_snyk()\n{\n last_command=\"kosli_attest_snyk\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--scan-results=\")\n two_word_flags+=(\"--scan-results\")\n two_word_flags+=(\"-R\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--upload-results\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--scan-results=\")\n must_have_one_flag+=(\"-R\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest_sonar()\n{\n last_command=\"kosli_attest_sonar\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--annotate=\")\n two_word_flags+=(\"--annotate\")\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--attachments=\")\n two_word_flags+=(\"--attachments\")\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--max-wait=\")\n two_word_flags+=(\"--max-wait\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--pull-request=\")\n two_word_flags+=(\"--pull-request\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--sonar-api-token=\")\n two_word_flags+=(\"--sonar-api-token\")\n flags+=(\"--sonar-ce-task-url=\")\n two_word_flags+=(\"--sonar-ce-task-url\")\n flags+=(\"--sonar-project-key=\")\n two_word_flags+=(\"--sonar-project-key\")\n flags+=(\"--sonar-revision=\")\n two_word_flags+=(\"--sonar-revision\")\n flags+=(\"--sonar-server-url=\")\n two_word_flags+=(\"--sonar-server-url\")\n flags+=(\"--sonar-working-dir=\")\n two_word_flags+=(\"--sonar-working-dir\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-T\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_flag+=(\"--sonar-api-token=\")\n must_have_one_flag+=(\"--trail=\")\n must_have_one_flag+=(\"-T\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_attest()\n{\n last_command=\"kosli_attest\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"artifact\")\n commands+=(\"custom\")\n commands+=(\"decision\")\n commands+=(\"generic\")\n commands+=(\"jira\")\n commands+=(\"junit\")\n commands+=(\"pullrequest\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"merge_request\")\n aliashash[\"merge_request\"]=\"pullrequest\"\n command_aliases+=(\"mergerequest\")\n aliashash[\"mergerequest\"]=\"pullrequest\"\n command_aliases+=(\"mr\")\n aliashash[\"mr\"]=\"pullrequest\"\n command_aliases+=(\"pr\")\n aliashash[\"pr\"]=\"pullrequest\"\n command_aliases+=(\"pull_request\")\n aliashash[\"pull_request\"]=\"pullrequest\"\n fi\n commands+=(\"snyk\")\n commands+=(\"sonar\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_begin_trail()\n{\n last_command=\"kosli_begin_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--commit=\")\n two_word_flags+=(\"--commit\")\n two_word_flags+=(\"-g\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--external-fingerprint=\")\n two_word_flags+=(\"--external-fingerprint\")\n flags+=(\"--external-url=\")\n two_word_flags+=(\"--external-url\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n flags+=(\"--origin-url=\")\n two_word_flags+=(\"--origin-url\")\n two_word_flags+=(\"-o\")\n flags+=(\"--redact-commit-info=\")\n two_word_flags+=(\"--redact-commit-info\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--repo-provider=\")\n two_word_flags+=(\"--repo-provider\")\n flags+=(\"--repo-root=\")\n two_word_flags+=(\"--repo-root\")\n flags+=(\"--repo-url=\")\n two_word_flags+=(\"--repo-url\")\n flags+=(\"--repository=\")\n two_word_flags+=(\"--repository\")\n flags+=(\"--template-file=\")\n two_word_flags+=(\"--template-file\")\n two_word_flags+=(\"-f\")\n flags+=(\"--user-data=\")\n two_word_flags+=(\"--user-data\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_begin()\n{\n last_command=\"kosli_begin\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"trail\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_completion()\n{\n last_command=\"kosli_completion\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--help\")\n flags+=(\"-h\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n must_have_one_noun+=(\"bash\")\n must_have_one_noun+=(\"fish\")\n must_have_one_noun+=(\"powershell\")\n must_have_one_noun+=(\"zsh\")\n noun_aliases=()\n}\n\n_kosli_config()\n{\n last_command=\"kosli_config\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--set=\")\n two_word_flags+=(\"--set\")\n flags+=(\"--unset=\")\n two_word_flags+=(\"--unset\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_api-key()\n{\n last_command=\"kosli_create_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--expires-at=\")\n two_word_flags+=(\"--expires-at\")\n two_word_flags+=(\"-e\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--description=\")\n must_have_one_flag+=(\"-d\")\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_attestation-type()\n{\n last_command=\"kosli_create_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--jq=\")\n two_word_flags+=(\"--jq\")\n flags+=(\"--schema=\")\n two_word_flags+=(\"--schema\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_control()\n{\n last_command=\"kosli_create_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"-n\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_environment()\n{\n last_command=\"kosli_create_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--included-environments=\")\n two_word_flags+=(\"--included-environments\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--type=\")\n must_have_one_flag+=(\"-t\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_flow()\n{\n last_command=\"kosli_create_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--template=\")\n two_word_flags+=(\"--template\")\n two_word_flags+=(\"-t\")\n flags+=(\"--template-file=\")\n two_word_flags+=(\"--template-file\")\n two_word_flags+=(\"-f\")\n flags+=(\"--use-empty-template\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_policy()\n{\n last_command=\"kosli_create_policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--comment=\")\n two_word_flags+=(\"--comment\")\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create_service-account()\n{\n last_command=\"kosli_create_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--privilege=\")\n two_word_flags+=(\"--privilege\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--privilege=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_create()\n{\n last_command=\"kosli_create\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n commands+=(\"policy\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete_api-key()\n{\n last_command=\"kosli_delete_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assume-yes\")\n flags+=(\"-y\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete_service-account()\n{\n last_command=\"kosli_delete_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assume-yes\")\n flags+=(\"-y\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_delete()\n{\n last_command=\"kosli_delete\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_detach-policy()\n{\n last_command=\"kosli_detach-policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--environment=\")\n two_word_flags+=(\"--environment\")\n two_word_flags+=(\"-e\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--environment=\")\n must_have_one_flag+=(\"-e\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_diff_snapshots()\n{\n last_command=\"kosli_diff_snapshots\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--show-unchanged\")\n flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_diff()\n{\n last_command=\"kosli_diff\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"snapshots\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_disable_beta()\n{\n last_command=\"kosli_disable_beta\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_disable()\n{\n last_command=\"kosli_disable\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"beta\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"experimental\")\n aliashash[\"experimental\"]=\"beta\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_enable_beta()\n{\n last_command=\"kosli_enable_beta\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_enable()\n{\n last_command=\"kosli_enable\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"beta\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"experimental\")\n aliashash[\"experimental\"]=\"beta\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_input()\n{\n last_command=\"kosli_evaluate_input\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--input-file=\")\n two_word_flags+=(\"--input-file\")\n two_word_flags+=(\"-i\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_trail()\n{\n last_command=\"kosli_evaluate_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--attestations=\")\n two_word_flags+=(\"--attestations\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate_trails()\n{\n last_command=\"kosli_evaluate_trails\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--attestations=\")\n two_word_flags+=(\"--attestations\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--no-assert\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--params=\")\n two_word_flags+=(\"--params\")\n flags+=(\"--policy=\")\n two_word_flags+=(\"--policy\")\n two_word_flags+=(\"-p\")\n flags+=(\"--show-input\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_flag+=(\"--policy=\")\n must_have_one_flag+=(\"-p\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_evaluate()\n{\n last_command=\"kosli_evaluate\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"input\")\n commands+=(\"trail\")\n commands+=(\"trails\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_fingerprint()\n{\n last_command=\"kosli_fingerprint\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--artifact-type=\")\n two_word_flags+=(\"--artifact-type\")\n two_word_flags+=(\"-t\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--registry-password=\")\n two_word_flags+=(\"--registry-password\")\n flags+=(\"--registry-username=\")\n two_word_flags+=(\"--registry-username\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--artifact-type=\")\n must_have_one_flag+=(\"-t\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_api-key()\n{\n last_command=\"kosli_get_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_artifact()\n{\n last_command=\"kosli_get_artifact\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_attestation()\n{\n last_command=\"kosli_get_attestation\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--attestation-id=\")\n two_word_flags+=(\"--attestation-id\")\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--trail=\")\n two_word_flags+=(\"--trail\")\n two_word_flags+=(\"-t\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_attestation-type()\n{\n last_command=\"kosli_get_attestation-type\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_control()\n{\n last_command=\"kosli_get_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_default-org()\n{\n last_command=\"kosli_get_default-org\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_environment()\n{\n last_command=\"kosli_get_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_flow()\n{\n last_command=\"kosli_get_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_policy()\n{\n last_command=\"kosli_get_policy\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_repo()\n{\n last_command=\"kosli_get_repo\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_service-account()\n{\n last_command=\"kosli_get_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_snapshot()\n{\n last_command=\"kosli_get_snapshot\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get_trail()\n{\n last_command=\"kosli_get_trail\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--flow=\")\n must_have_one_flag+=(\"-f\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_get()\n{\n last_command=\"kosli_get\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n commands+=(\"artifact\")\n commands+=(\"attestation\")\n commands+=(\"attestation-type\")\n commands+=(\"control\")\n commands+=(\"default-org\")\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n commands+=(\"policy\")\n commands+=(\"repo\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"trail\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_help()\n{\n last_command=\"kosli_help\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n has_completion_function=1\n noun_aliases=()\n}\n\n_kosli_join_environment()\n{\n last_command=\"kosli_join_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--logical=\")\n two_word_flags+=(\"--logical\")\n flags+=(\"--physical=\")\n two_word_flags+=(\"--physical\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--logical=\")\n must_have_one_flag+=(\"--physical=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_join()\n{\n last_command=\"kosli_join\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_api-keys()\n{\n last_command=\"kosli_list_api-keys\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_artifacts()\n{\n last_command=\"kosli_list_artifacts\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--repo=\")\n two_word_flags+=(\"--repo\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_attestation-types()\n{\n last_command=\"kosli_list_attestation-types\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_controls()\n{\n last_command=\"kosli_list_controls\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--archived\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--search=\")\n two_word_flags+=(\"--search\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_environments()\n{\n last_command=\"kosli_list_environments\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--sort=\")\n two_word_flags+=(\"--sort\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--space-id=\")\n two_word_flags+=(\"--space-id\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--type=\")\n two_word_flags+=(\"--type\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_flows()\n{\n last_command=\"kosli_list_flows\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--ignore-case\")\n flags+=(\"-i\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-N\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_policies()\n{\n last_command=\"kosli_list_policies\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_repos()\n{\n last_command=\"kosli_list_repos\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--search=\")\n two_word_flags+=(\"--search\")\n flags+=(\"--sort-direction=\")\n two_word_flags+=(\"--sort-direction\")\n flags+=(\"--tag=\")\n two_word_flags+=(\"--tag\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_service-accounts()\n{\n last_command=\"kosli_list_service-accounts\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_snapshots()\n{\n last_command=\"kosli_list_snapshots\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--interval=\")\n two_word_flags+=(\"--interval\")\n two_word_flags+=(\"-i\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--reverse\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list_trails()\n{\n last_command=\"kosli_list_trails\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--fingerprint=\")\n two_word_flags+=(\"--fingerprint\")\n two_word_flags+=(\"-F\")\n flags+=(\"--flow=\")\n two_word_flags+=(\"--flow\")\n two_word_flags+=(\"-f\")\n flags+=(\"--flow-tag=\")\n two_word_flags+=(\"--flow-tag\")\n two_word_flags+=(\"-t\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_list()\n{\n last_command=\"kosli_list\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-keys\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-keys\"\n command_aliases+=(\"aks\")\n aliashash[\"aks\"]=\"api-keys\"\n command_aliases+=(\"api-key\")\n aliashash[\"api-key\"]=\"api-keys\"\n fi\n commands+=(\"artifacts\")\n commands+=(\"attestation-types\")\n commands+=(\"controls\")\n commands+=(\"environments\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environments\"\n command_aliases+=(\"envs\")\n aliashash[\"envs\"]=\"environments\"\n fi\n commands+=(\"flows\")\n commands+=(\"policies\")\n commands+=(\"repos\")\n commands+=(\"service-accounts\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-accounts\"\n command_aliases+=(\"sas\")\n aliashash[\"sas\"]=\"service-accounts\"\n command_aliases+=(\"service-account\")\n aliashash[\"service-account\"]=\"service-accounts\"\n fi\n commands+=(\"snapshots\")\n commands+=(\"trails\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_log_environment()\n{\n last_command=\"kosli_log_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--end=\")\n two_word_flags+=(\"--end\")\n flags+=(\"--end-ts=\")\n two_word_flags+=(\"--end-ts\")\n flags+=(\"--interval=\")\n two_word_flags+=(\"--interval\")\n two_word_flags+=(\"-i\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--page=\")\n two_word_flags+=(\"--page\")\n flags+=(\"--page-limit=\")\n two_word_flags+=(\"--page-limit\")\n two_word_flags+=(\"-n\")\n flags+=(\"--repo=\")\n two_word_flags+=(\"--repo\")\n flags+=(\"--reverse\")\n flags+=(\"--start=\")\n two_word_flags+=(\"--start\")\n flags+=(\"--start-ts=\")\n two_word_flags+=(\"--start-ts\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_log()\n{\n last_command=\"kosli_log\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename_environment()\n{\n last_command=\"kosli_rename_environment\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename_flow()\n{\n last_command=\"kosli_rename_flow\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rename()\n{\n last_command=\"kosli_rename\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"environment\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"env\")\n aliashash[\"env\"]=\"environment\"\n fi\n commands+=(\"flow\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rotate_api-key()\n{\n last_command=\"kosli_rotate_api-key\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--expires-at=\")\n two_word_flags+=(\"--expires-at\")\n two_word_flags+=(\"-e\")\n flags+=(\"--grace-period-hours=\")\n two_word_flags+=(\"--grace-period-hours\")\n two_word_flags+=(\"-g\")\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--service-account=\")\n two_word_flags+=(\"--service-account\")\n two_word_flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--service-account=\")\n must_have_one_flag+=(\"-s\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_rotate()\n{\n last_command=\"kosli_rotate\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"api-key\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ak\")\n aliashash[\"ak\"]=\"api-key\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_search()\n{\n last_command=\"kosli_search\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--output=\")\n two_word_flags+=(\"--output\")\n two_word_flags+=(\"-o\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_azure()\n{\n last_command=\"kosli_snapshot_azure\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--azure-client-id=\")\n two_word_flags+=(\"--azure-client-id\")\n flags+=(\"--azure-client-secret=\")\n two_word_flags+=(\"--azure-client-secret\")\n flags+=(\"--azure-resource-group-name=\")\n two_word_flags+=(\"--azure-resource-group-name\")\n flags+=(\"--azure-subscription-id=\")\n two_word_flags+=(\"--azure-subscription-id\")\n flags+=(\"--azure-tenant-id=\")\n two_word_flags+=(\"--azure-tenant-id\")\n flags+=(\"--digests-source=\")\n two_word_flags+=(\"--digests-source\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--zip\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--azure-client-id=\")\n must_have_one_flag+=(\"--azure-client-secret=\")\n must_have_one_flag+=(\"--azure-resource-group-name=\")\n must_have_one_flag+=(\"--azure-subscription-id=\")\n must_have_one_flag+=(\"--azure-tenant-id=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_cloud-run()\n{\n last_command=\"kosli_snapshot_cloud-run\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--include=\")\n two_word_flags+=(\"--include\")\n flags+=(\"--include-regex=\")\n two_word_flags+=(\"--include-regex\")\n flags+=(\"--project=\")\n two_word_flags+=(\"--project\")\n flags+=(\"--region=\")\n two_word_flags+=(\"--region\")\n flags+=(\"--resolve-names\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--project=\")\n must_have_one_flag+=(\"--region=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_docker()\n{\n last_command=\"kosli_snapshot_docker\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_ecs()\n{\n last_command=\"kosli_snapshot_ecs\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--clusters=\")\n two_word_flags+=(\"--clusters\")\n flags+=(\"--clusters-regex=\")\n two_word_flags+=(\"--clusters-regex\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--exclude-services=\")\n two_word_flags+=(\"--exclude-services\")\n flags+=(\"--exclude-services-regex=\")\n two_word_flags+=(\"--exclude-services-regex\")\n flags+=(\"--services=\")\n two_word_flags+=(\"--services\")\n flags+=(\"--services-regex=\")\n two_word_flags+=(\"--services-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_k8s()\n{\n last_command=\"kosli_snapshot_k8s\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude-namespaces=\")\n two_word_flags+=(\"--exclude-namespaces\")\n two_word_flags+=(\"-x\")\n flags+=(\"--exclude-namespaces-regex=\")\n two_word_flags+=(\"--exclude-namespaces-regex\")\n flags+=(\"--kubeconfig=\")\n two_word_flags+=(\"--kubeconfig\")\n two_word_flags+=(\"-k\")\n flags+=(\"--namespaces=\")\n two_word_flags+=(\"--namespaces\")\n two_word_flags+=(\"-n\")\n flags+=(\"--namespaces-regex=\")\n two_word_flags+=(\"--namespaces-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_lambda()\n{\n last_command=\"kosli_snapshot_lambda\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--function-names=\")\n two_word_flags+=(\"--function-names\")\n flags+=(\"--function-names-regex=\")\n two_word_flags+=(\"--function-names-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_path()\n{\n last_command=\"kosli_snapshot_path\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n flags+=(\"--path=\")\n two_word_flags+=(\"--path\")\n flags+=(\"--watch\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--name=\")\n must_have_one_flag+=(\"--path=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_paths()\n{\n last_command=\"kosli_snapshot_paths\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--paths-file=\")\n two_word_flags+=(\"--paths-file\")\n flags+=(\"--watch\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--paths-file=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot_s3()\n{\n last_command=\"kosli_snapshot_s3\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--aws-key-id=\")\n two_word_flags+=(\"--aws-key-id\")\n flags+=(\"--aws-region=\")\n two_word_flags+=(\"--aws-region\")\n flags+=(\"--aws-secret-key=\")\n two_word_flags+=(\"--aws-secret-key\")\n flags+=(\"--bucket=\")\n two_word_flags+=(\"--bucket\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--exclude=\")\n two_word_flags+=(\"--exclude\")\n two_word_flags+=(\"-x\")\n flags+=(\"--exclude-regex=\")\n two_word_flags+=(\"--exclude-regex\")\n flags+=(\"--include=\")\n two_word_flags+=(\"--include\")\n two_word_flags+=(\"-i\")\n flags+=(\"--include-regex=\")\n two_word_flags+=(\"--include-regex\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_flag+=(\"--bucket=\")\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_snapshot()\n{\n last_command=\"kosli_snapshot\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"azure\")\n commands+=(\"cloud-run\")\n commands+=(\"docker\")\n commands+=(\"ecs\")\n commands+=(\"k8s\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"kubernetes\")\n aliashash[\"kubernetes\"]=\"k8s\"\n fi\n commands+=(\"lambda\")\n commands+=(\"path\")\n commands+=(\"paths\")\n commands+=(\"s3\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"S3\")\n aliashash[\"S3\"]=\"s3\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--auto-environment\")\n flags+=(\"-A\")\n flags+=(\"--environment-description=\")\n two_word_flags+=(\"--environment-description\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_status()\n{\n last_command=\"kosli_status\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--assert\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_tag()\n{\n last_command=\"kosli_tag\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--provider=\")\n two_word_flags+=(\"--provider\")\n flags+=(\"--repo-id=\")\n two_word_flags+=(\"--repo-id\")\n flags+=(\"--set=\")\n two_word_flags+=(\"--set\")\n two_word_flags+=(\"-s\")\n flags+=(\"--unset=\")\n two_word_flags+=(\"--unset\")\n two_word_flags+=(\"-u\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_unarchive_control()\n{\n last_command=\"kosli_unarchive_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_unarchive()\n{\n last_command=\"kosli_unarchive\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"control\")\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_control()\n{\n last_command=\"kosli_update_control\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--link=\")\n two_word_flags+=(\"--link\")\n flags+=(\"--name=\")\n two_word_flags+=(\"--name\")\n two_word_flags+=(\"-n\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_default-org()\n{\n last_command=\"kosli_update_default-org\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update_service-account()\n{\n last_command=\"kosli_update_service-account\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--description=\")\n two_word_flags+=(\"--description\")\n two_word_flags+=(\"-d\")\n flags+=(\"--dry-run\")\n flags+=(\"-D\")\n flags+=(\"--privilege=\")\n two_word_flags+=(\"--privilege\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_update()\n{\n last_command=\"kosli_update\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"control\")\n commands+=(\"default-org\")\n commands+=(\"service-account\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"sa\")\n aliashash[\"sa\"]=\"service-account\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_version()\n{\n last_command=\"kosli_version\"\n\n command_aliases=()\n\n commands=()\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--short\")\n flags+=(\"-s\")\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n_kosli_root_command()\n{\n last_command=\"kosli\"\n\n command_aliases=()\n\n commands=()\n commands+=(\"allow\")\n commands+=(\"archive\")\n commands+=(\"assert\")\n commands+=(\"attach-policy\")\n commands+=(\"attest\")\n commands+=(\"begin\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"init\")\n aliashash[\"init\"]=\"begin\"\n command_aliases+=(\"start\")\n aliashash[\"start\"]=\"begin\"\n fi\n commands+=(\"completion\")\n commands+=(\"config\")\n commands+=(\"create\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"c\")\n aliashash[\"c\"]=\"create\"\n command_aliases+=(\"cr\")\n aliashash[\"cr\"]=\"create\"\n fi\n commands+=(\"delete\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"d\")\n aliashash[\"d\"]=\"delete\"\n command_aliases+=(\"de\")\n aliashash[\"de\"]=\"delete\"\n command_aliases+=(\"remove\")\n aliashash[\"remove\"]=\"delete\"\n command_aliases+=(\"rm\")\n aliashash[\"rm\"]=\"delete\"\n fi\n commands+=(\"detach-policy\")\n commands+=(\"diff\")\n commands+=(\"disable\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"dis\")\n aliashash[\"dis\"]=\"disable\"\n fi\n commands+=(\"enable\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"en\")\n aliashash[\"en\"]=\"enable\"\n fi\n commands+=(\"evaluate\")\n commands+=(\"fingerprint\")\n commands+=(\"get\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"g\")\n aliashash[\"g\"]=\"get\"\n fi\n commands+=(\"help\")\n commands+=(\"join\")\n commands+=(\"list\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"l\")\n aliashash[\"l\"]=\"list\"\n command_aliases+=(\"ls\")\n aliashash[\"ls\"]=\"list\"\n fi\n commands+=(\"log\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"lo\")\n aliashash[\"lo\"]=\"log\"\n fi\n commands+=(\"rename\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"re\")\n aliashash[\"re\"]=\"rename\"\n fi\n commands+=(\"rotate\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ro\")\n aliashash[\"ro\"]=\"rotate\"\n fi\n commands+=(\"search\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"se\")\n aliashash[\"se\"]=\"search\"\n fi\n commands+=(\"snapshot\")\n commands+=(\"status\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"st\")\n aliashash[\"st\"]=\"status\"\n fi\n commands+=(\"tag\")\n commands+=(\"unarchive\")\n commands+=(\"update\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"u\")\n aliashash[\"u\"]=\"update\"\n command_aliases+=(\"up\")\n aliashash[\"up\"]=\"update\"\n fi\n commands+=(\"version\")\n if [[ -z \"${BASH_VERSION:-}\" || \"${BASH_VERSINFO[0]:-}\" -gt 3 ]]; then\n command_aliases+=(\"ver\")\n aliashash[\"ver\"]=\"version\"\n fi\n\n flags=()\n two_word_flags=()\n local_nonpersistent_flags=()\n flags_with_completion=()\n flags_completion=()\n\n flags+=(\"--api-token=\")\n two_word_flags+=(\"--api-token\")\n two_word_flags+=(\"-a\")\n flags+=(\"--config-file=\")\n two_word_flags+=(\"--config-file\")\n two_word_flags+=(\"-c\")\n flags+=(\"--debug\")\n flags+=(\"--host=\")\n two_word_flags+=(\"--host\")\n two_word_flags+=(\"-H\")\n flags+=(\"--http-proxy=\")\n two_word_flags+=(\"--http-proxy\")\n flags+=(\"--max-api-retries=\")\n two_word_flags+=(\"--max-api-retries\")\n two_word_flags+=(\"-r\")\n flags+=(\"--org=\")\n two_word_flags+=(\"--org\")\n flags+=(\"--quiet\")\n flags+=(\"-q\")\n\n must_have_one_flag=()\n must_have_one_noun=()\n noun_aliases=()\n}\n\n__start_kosli()\n{\n local cur prev words cword split\n declare -A flaghash 2>/dev/null || :\n declare -A aliashash 2>/dev/null || :\n if declare -F _init_completion >/dev/null 2>&1; then\n _init_completion -s || return\n else\n __kosli_init_completion -n \"=\" || return\n fi\n\n local c=0\n local flag_parsing_disabled=\n local flags=()\n local two_word_flags=()\n local local_nonpersistent_flags=()\n local flags_with_completion=()\n local flags_completion=()\n local commands=(\"kosli\")\n local command_aliases=()\n local must_have_one_flag=()\n local must_have_one_noun=()\n local has_completion_function=\"\"\n local last_command=\"\"\n local nouns=()\n local noun_aliases=()\n\n __kosli_handle_word\n}\n\nif [[ $(type -t compopt) = \"builtin\" ]]; then\n complete -o default -F __start_kosli kosli\nelse\n complete -o default -o nospace -F __start_kosli kosli\nfi\n\n# ex: ts=4 sw=4 et filetype=sh", - "flags_to_test": [], - "flag_values": {}, - "setup": [], - "verify": [] - }, - "attest sbom": { - "args": [], - "flags": { - "flow": "{flow}", - "name": "{name}", - "sbom-file": "cmd/kosli/testdata/sbom/cyclonedx.json", - "trail": "{trail}" - }, - "baseline_ok": true, - "baseline_exit": 0, - "baseline_output": "[warning] Repo information will not be reported as ID, Name and URL are required.\nsbom attestation '{name}' is reported to trail: {trail}", - "flags_to_test": [ - "annotate", - "artifact-type", - "attachments", - "commit", - "description", - "dry-run", - "exclude", - "external-fingerprint", - "external-url", - "fingerprint", - "flow", - "name", - "origin-url", - "redact-commit-info", - "registry-password", - "registry-provider", - "registry-username", - "repo-id", - "repo-provider", - "repo-root", - "repo-url", - "repository", - "sbom-file", - "trail", - "user-data" - ], - "flag_values": { - "annotate": "probe=annotate", - "artifact-type": "file", - "attachments": "cmd/kosli/testdata/person-schema.json", - "commit": "HEAD", - "description": "probe-description", - "dry-run": "true", - "exclude": "probe-exclude", - "external-fingerprint": "probe=1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "external-url": "probe=http://example.com", - "fingerprint": "1bef738d0bb1e690500f99a5b57d958caf3a5eb3e00d9012e1f4369fc6812e01", - "flow": "{flow}", - "name": "{name}", - "origin-url": "http://example.com", - "redact-commit-info": "author", - "registry-password": "probe-registry-password", - "registry-provider": "probe-registry-provider", - "registry-username": "probe-registry-username", - "repo-id": "probe-repo-id", - "repo-provider": "github", - "repo-root": ".", - "repo-url": "http://example.com", - "repository": "probe-repository", - "sbom-file": "cmd/kosli/testdata/sbom/cyclonedx.json", - "trail": "{trail}", - "user-data": "cmd/kosli/testdata/person-schema.json" - }, - "setup": [ - { - "argv": [ - "create", - "flow", - "{flow}", - "--use-empty-template" - ] - }, - { - "argv": [ - "begin", - "trail", - "{trail}", - "--flow", - "{flow}" - ] - } - ], - "verify": [ - [ - "get", - "trail", - "{trail}", - "--flow", - "{flow}", - "--output", - "json" - ] - ] - } -} \ No newline at end of file +} diff --git a/internal/sbom/sbom.go b/internal/sbom/sbom.go index 3941b1c9e..4cbadb36e 100644 --- a/internal/sbom/sbom.go +++ b/internal/sbom/sbom.go @@ -67,6 +67,9 @@ var ( cycloneDXNamespace = regexp.MustCompile(`^https?://cyclonedx\.org/schema/bom/(\d+\.\d+)$`) ) +// ProcessSBOMFile reads the whole file with no size limit. A caller that needs +// one, as the attest command does, reads the bytes itself and calls ProcessSBOM. +// // ProcessSBOMFile reads an SBOM file and returns its format and a normalised // summary. It confirms the file identifies itself as the format it parses as; // it does not validate against the format's schema. From 5211c93c1a8d28dc25b7a38b11919b6642a4977f Mon Sep 17 00:00:00 2001 From: Alex Kantor Date: Sat, 12 Sep 2026 17:33:26 +0100 Subject: [PATCH 8/8] fix(attest-sbom): build the attachment list instead of appending to it The SBOM path was appended onto o.attachments, so "exactly one attachment" held only because a flag check left that field empty. Running the same options struct twice made it [sbom, sbom], which is tarred and gzipped while sbom_sha256 still describes the uncompressed original. That is the same re-entrancy as the annotation fix in the previous commit, but it fails silently: the attestation is simply wrong rather than refused. Passing a one-element slice removes the class. o.attachments is now neither read nor written on this path, so nothing that fills it first can raise the count. The gzip fixture was an 8KB blob, byte-identical to internal/sbom/testdata/gzipped.json.gz. The rejection matches on the first two bytes before anything is decompressed, so the fixture is now the eight magic bytes: same path exercised, readable in git show, and no second copy of a file that could drift from the original. ProcessSBOMFile's godoc opened twice with its own name after the last change, reading as a merge artifact and putting the caveat before the description. The paragraphs are swapped. Co-Authored-By: Claude Opus 5 --- cmd/kosli/attestSbom.go | 7 ++++--- cmd/kosli/testdata/sbom/compressed.json.gz | Bin 7931 -> 8 bytes internal/sbom/sbom.go | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd/kosli/attestSbom.go b/cmd/kosli/attestSbom.go index 35406a7b5..f90a326e4 100644 --- a/cmd/kosli/attestSbom.go +++ b/cmd/kosli/attestSbom.go @@ -188,9 +188,10 @@ func (o *attestSbomOptions) run(args []string) error { if err != nil { return err } - o.attachments = append(o.attachments, o.sbomFilePath) - - form, cleanupNeeded, evidencePath, err := prepareAttestationForm(o.payload, o.attachments) + // One attachment, built here rather than appended to o.attachments, so the + // count cannot be raised by anything that fills that field first. Two would + // be tarred and gzipped while sbom_sha256 still described the original. + form, cleanupNeeded, evidencePath, err := prepareAttestationForm(o.payload, []string{o.sbomFilePath}) if err != nil { return err } diff --git a/cmd/kosli/testdata/sbom/compressed.json.gz b/cmd/kosli/testdata/sbom/compressed.json.gz index f4943e11cc330cdd7fa3814c074221c3ba7aec1b..1cab47bf1b58e901c1f6d24e714cb1c4060a5d9d 100644 GIT binary patch literal 8 Mcmb2|=3oE;00jL2vj6}9 literal 7931 zcmVGs1>E&Hmppa<6!Uj z&fbA9{so`mn|&AuyS)=9ID;Z7(xX&)l+~#s{SJRr{Z~o)U6N=tyn4HhcG=DFg}03p z*ve*)-~Jo__Dl9VyXleyIJ%Q0QRq2)T+nag1$s`}8OmM&SG1>|wVgEG_WsfhxN? zXu;K$nqI9|<*L6>oQmS=HQiBaa%~|!6vp`Tx1XL~(W;*=z^PRhHC3&unj`B@uyAGg z7-)K><^>B)_xxI=B6(F^Q-X!GkW^pNeZ5vuY8B7*VV$Lg37`J>rTpz5=|a#dkD(WQ zqVME=dklTD+2Zzc9eSX^AMeZ3_Q1lU8wH{2_WNY_`?qhw8SFF)zJk#e*Zzm_>CgM7 z1^0aA_kUnlxTZfw1?7a6d*>e-aOLt$K_kFld=Hna zy|9djAa+7j-NTMw^Yuj6{8Ln!aDB1@(7@~KlJux)+M}$hixAC;FLXezs6tMsVJj+%QFuDHkDL^6eZ)WdruM zK6nCN;X1pZS}Fc6z|iZnUUALS(vOXcr$k5hO$rB-%BdGNA~zl$?M`&CuTtpG$MMT_ z8TOv*zc$~_Q&+JiUuj?LS+urIO>*XAt=C=c-RERyncC)c(r-`0-qMZRdwVK{BXhX7 zCyj>JZR{L#xbizN7yK^H`(si$zr3}=-qSY!J{rC`9fQVj=f)21J6ZF-*}ut zaZ4ILuT@LwFU0wSj=Xa>1HBioB)|JqeYxmYztcY09oTbsaB$|s<4dex?2DdwO8q#P zuGQi7>G(439S3hu=ix-ZTFNSN&DJ644%fZ63a%4meLi^Cq~a-SactFBy@P)p99*@( zdAasZgXh-KY{`R}GThpxym~RCgQt#Hpp&Q-* z;W{=)_;h>)IlVUZySDne{Kr2YZgBO_0FyT9-)-{ZvD#vu=Qd=C~R*!A-FO%i`|U_sxqd;TeZmA*>3 zG}1^Hh3>oap2z-&lK8zQtUQsHQ8n{KhT5|%;^IcU@bhoP27Ztx!7XdKNN zxq2n2tJ-4WtF=YNtNOrw9lxS3DsH9jNQ(2frYlo&al%DKuRHa{Lh*e`ss)PfDH1Sr zEvUGX?C6dp*J_%lE*7d2IE$(-RRagefa_^BU3P2k-&%+!D) zTGgr4m4zS3j;82!y(R^fisEUiTvK#e)&sSs>vFwbas9=@aVrZ@QPr&lfh;dP&xdUU zf$vCFwc)tSWcC9DCfMvgvmk!OZSp`A z>)|PJyjAe12tLApzr%Gz$rSib5;ogiH$7_AkYa7!sMAq5b7|qst%a{#k zlbQYl*4CJ=N6T?5ni}nXe-s(?eRH|Rb(~+qM$0yBh~|;xnEJuHRKDjj=x1_)h}|7s=yk^^HwmKu-n%q_!Hkv=xq(Tg<1}Jd1tvHjMzDs9J;#VXmMwLRa@%Ed zAp2@I*1)_ZFOHCrl3cC%U}<-Z*fF&Teh-65V``g2KK9cY=l5b=ww2}b$E0zzfh{_n z=-TUykCqB75*WeDa+~X6oyrth#NEBTxoSg$HEf*jXz8jxFdJaHu!oEZciOVwSsme; zs%^r4H|uPC_&(}&hDWa(T^!Tj`pw4CSG35Zb+x4)t1Y43V1 z;{fbW3MRmml-0`ZoR+R>tXvv%w)9PnWaTOrpTGU)BeTB%%je7snPLz3`n2Ubg>}KT zUdXTML=otUuW@*U??6wdT@M*C%0$sXFZ#~y7%)y>16>~B-jx^A{A-jEGBy|VlIt`Z zXXz_o56yJ^bU&5lI7Y@uGC2A3{>fE`xDHW|ksU|C$V>Lp>}P8NJ(B*w9=6V8&1BF; zxf_=kvZ;P#sUy-M$UObLgL#jz#ueHotzneOhF`;M5bpyPegFmvEE(3`r1f2Wz>It^ zxW`q*Wr}vn*9W>lSuIO)-}u1TXCPnLe{+@Kx|yx@!6u^{8Zc4BWZ^J+w1jP@~F zet({w`gAR>Nk`pqSrh?F z%2tVYcYg&uuw8Wq41a~=g{G;?Uf4@|-Qm_U&oGu8Stj@{{AKcneRRQInavDr)5rg( zSwXgLd%nVbf?UXUPlzdi2Um_G8;~Weh1nnK%K>bdcA_`f$JH*bZwfNFSPHDMV}qYc zcm2le_F@09=NQLi*V$-~9eL%jHS7Va5|oie_NQH6a{mF@4tKuEWNd8=uxsrIx`qr` zPH3HIUtP$uH)9oILWKVZ8-HW|G)6pJLuMzFO@UuHqVHtap1ALVFU257+!x12Sl7;; z4-U=Dww}VN(*F;{NAL;2-TwYoCz_VY1Z=`L&kTn;Hu$N8@`3o%K42CvUKv#~QBF+JeeD;w<5n%gVKJg=n}*j0>QG3?c3_-4&VOY|Ag_nX@_)_AXDGJFG@l86JrcYdcX?lW8Wcd!ewDDW1bvI6r(BLmb%y zCK4_fzzrPEWe5+tK42zbVKGLa?MSe;#4=ClOA25W!-yu{3wF(Y+Pj>9JD^_mONJv1 z3)2{UgEKh}^drP6;D8W!PQ-_-3Ccp>F>FBn^%EQL3fJMYwUZwLhk|{wcmn*cLp+Sd zM%mlI{J<-7KZJO5gQ=(Gn8^rzO95HWQ5PV~R8PQDN4Y(5U1dB1)(vqpar4-B1^x%I zs2!sH*qiZ!GtF&=eRox7jznbH*L2mC5 zD=;39r4%DlJ0V}9xXJd-_msHBJs~He&%hH;!5rnVl2YCw*x`lZJ7G!nK138wAycPFhGkK$59l?*T0bFC7vdE{%=8^CDCgc>|{>oDJjK8YU z738tc^ApNR_8`}ltrYSRv^(In$n~scYTE*4r*Raojc@flWBP%-19HbJ=b>y}5c6QK zijcF-d0c{AbtH0FLAJO06XFr(2UidD<|BVr5c_1n#y!QTEHN$Qu{22#n{nX6W?0(S}ZqnOwd2saV7i+13^wVJV>-Ro?9X&5-&kM;Io|K(rcA+ z*jyK7T_JaZcyMoRjV;B!*off&5GRHakK2eTqE1m)nXC{8!1m8R@oSVX;uCPS4#i=- zUj=*LX1s;4ahJvd#DXs694sGt7G)~r9m^Ta!#Qf^j~JWW`9R?A<0Qjx#S-fUXbU30 zi;#yEWq_E7xsieUWqD9{Kv;*lSFh7r0^fpt84}7}@F|Q@JG+agW|(VgAWJz4I>5z& ztN1bd?gi$9{A7di9&B6#Jwv`H11Bspf@d)n)&cb9qP9O*7@|%%Y>4W$vEZ%C%%GBeXBf*Z<#6p0FcO9HmC!q~@h zLSA#EoDFkwTnFGM*b&4V;G4P4@cQD>j%}*7fqbtJXECOx|0a-A0!JI|I42bGmEsM| z6(ddxSRimppZHR0FM_?V*r_*hgag_p=cp7YZ6#FXMSAd&p0sH>b&KNcY#EBBrNY4Re3+p+3xuwWVx)Sko2b z2Fx85Yy;L}XMCg$oDfgYQ_h^$tgzN4a-CLQ8&La4PaW)muR_i(F-{G91=fi*DAE<> zncy>Sr>(*|6TgXd)HCoNpLhw^OTPDlY+HoTrep;C(~nw{RcY z6<`_S##3SZH$g8j=31~du!jxiPHDZ8@?eaeVB_L-`T0U_hpaZ8a%sX1p%zih4>Jyh za$svuc|sTED8m|Ht~_R}^4c!sf4GiGT4y{X?rl<@L_8boTjnUmSPAT7Vw)na6K~x>W}xL(l`RKS^Z?@`XIi*uQWtLH7fW zqW_D$&^2|iK|ABn$dB3jKCESAH4L%F!ew3X5m-Z%+M!J~dR@)9f@kV|v9 z$>=wblVaRsdr~nsq^^uNXWmHARz$sJxn({c{rw<@uGo3VIz68##IYZYUkkONRS4LC z`&+tmjTAeI2MCMAEx;%tPz9H z*qJP8{2IlJr>#&28zjAUbo3zyfw)6;4#=+(%ms5US*(HbIstOzyZLzWypiWQY!2~E zjOu?_#};!}`0m8{2KpWN?-=VYpd)5urLk9#r;3;axgXXN(I;39_`~&!dCyZ(_l3Nt zi*+Z=`!e~ba$ZAhpj;Dq2$LDbixihG#Ggub#cGOoee#ZOMoF&~#YH?#>oK^;7Un>& zMk{(APY}C|3d{-l{5fL$1TYGC8`>)7&?VWG&nH=anby@m#*NIzkk6*E-RAaFnj@{1 zN5t1+V+A-#^)k|Ve%?bhTk)(kt@ZNUQnJVoN@vgvn^5jNHm9;+GC*EQywA-1gXP8f z*gOYEP6qld*}z%}#10YXfPY!Iw(B;Jry#rOTAxj3 z!#2jEpv&>1kZFe7tj30eiLz_zto2NOBi=)kpI~?A?{* zljXA(+vf?m3-BS}0kM(hyjdOYV?9{+a0Bb_5MPO3Gut6P&|kk`ZinZTg1@^c1IRIu zqgwOE$p$=v_&sydIuLTSZV8ujjQKH@$NiBsOLa!vH?1++Y;0bmq`VMw`YWpgYr9}l ztOKyIxxF@dt$oAKiCZZLnjKP1x8`fAuhM5a`}dJ!N@7j8B%2&VbN~9V?us_fVsC+) z?C5-6(Kem}wlFH%4m+b6EZG^}7&{%;zA5GP@Z66jz+$P0g(Yw7bSz z>hJ8_DUSiXo*HNSyu%a4vqRrE{jjT5tLD-Lr~99*sR9 z9&mYz`G{dpH#K*$H;C&nJ3B1aIQV(&kk?Lt*IkA4l2Tr(VGYJ`A*Y7Cj{BEU@hHcM zB&r#yh`Te+Z~K6iFo#%w228j)`(fuyhtxjUIC;*>_03}Tob`g0>WO*Ix#66fpVQdI z+GTpiguWyLZ|6Nj|E(Gk#RKdI;WksW^~|2prV8Wc_|^jdW|+o17!sn8#F~0D)C#5+w>)VmR ze}=sFUteauMic6t5OBT$u}r4(8NV$u=J&j$;!!Wk3?fLKxWtE+W2z7m` z37bMcTA|*WmZywBJVE#w-&Nakw;{Y7;TG}J> zo>lsU3iViY&MUu=$AW*Ta4oNWkRPl4g!R&$3TGY}p0eB~+v9f@8>lvWzXpf(fh-P# zy+@c^-`F1Hz(=Yvgiqnf7%V5oAndjJjhPfp1E$&;$|srbAeOyhEMs$vn1lUJAJy(se_9@p0}DDNoxpYA zBN5hFHLS}L@4GZ2pK&6>hP3a~jq8}R(YZX;8P&cfo-GvmcDh)r9D$z*Jrb7&0BdmXLiQH>@sE?vAxHB)7$fU@~^yymGwyAnJCtQt`KXfpR?4bh**O?0BMf_adpH- z*6V@1cf5i)y5YSvypB%iJ)i^PBH%9(w`-JNUQ18=2=Dh0@w4ptD31p$j&R=8h8S|D z9_2!OEZ1e5tDoz)6!yWm^7%-(hUfZ{2SB~8=p(sqNd`N#IaqIkwHNd+&}sa^ zSx}D6qyvmqln-L>8TAdM@gMVH;L4e7asQm>tbr?F-$cf5egMB7nL|3GBmK648*T7B z40C#{hXYUHoE_I+!iKrip&b2Es?Fc@KK-qpBry-fz5q2n2h?Ni*)8{tSk&X}Q_T#1 z=lG2|4BHpj^BeD#zWRXMU{mNXS)9W2W$aakeDXm1DxS5ZeR^PPZ9%4e#H_3@3o+zH zA=hIxVDKiK;Z@vE8UqF@J|5%89FnXjXc5Uci__r<&~h58At zbRVMvCeqWej2E8x`5&GI$~@j;9TQ_ocDA_t=zJFQx|BN?`ze`REz!5c+`U`!vrf^^ zT+z?Cua4=tAHCCSkAV}(Q}9jTa*gMyq_uzx_Tk?tJLhRMX6;5BpARyhx629Wp7{^O z#k5bT!Jju0@f!7^k-c;a{V+J@3~Rc`q0<`TXpS~osG|{%2du`B_U>X0X@#<5y_+`Z z@qF}^0!DNOSSZY3xup10%K z0&oFcM!U5zKgC#%wMwyH8g&BsgoidY7slps1M6F!igk!~h4a$ulMQl^7gd+PS-w# z`8B=d2id(?zaTCnGykF50@qQNvtv9!onlVL-V`AEg;2+)H4E_*;uM_)VQeg)AqjrJ z@`ZCWz}mvw3oP#E{H+LCJ;uA}13Y7yM#J{Yw09WrF^s>%%YTATXHWT)4VTVvn#FpV zuqTvb`P#q8tN%xGY9W`dkbGu}5tV9yk?7lyi$<1$_C7!v9coH*qOAIYckk5Au##Gm)ip7KAPPG22*$oK2^efceYVEEfhuh|+-TKMGe*Zp}f zj``;&4;&|a_@8^)J_-DA`5qLXK7MdEUa;F2-;Yy%Zuyf(^|O_H_P{>B=;O!s`2~OV z@IJrn_7VP%UXk>Fb`#nE|HyB{8RPKgwM(Tv9@wMgwW?aL$Ti=s`kKB_y^1RPY9KF^ zs_c1HwI*v?wO;Z3`){er3^v-bck+DOZ@>Llhs<7Cbo2Cj>HTbS{ZW=bd_UVA5#I=3 ze8)u`{1erKj`s1(zyv|xd&kMmJDG0YRB`78Ai@G$?A02jw}9Mz8Q9%7f&BK_1)D$s zilUv|zAog(PD)F}H%TSi_x+crL2LZ+D?|#f!(w-Q@ER<-_S08k33C2>D|~%w{^g<& zWxsy#PPIEqzw>@AVcOeQY-K0_)^+phwcI{0H}-NA--U?qoV{O#H2B~LNwD#QjTZ)Y l-mvnw-mb!i+WpuR-#GK>%{Om-`Qw*A{}VG#Co$wv000S}45|PC diff --git a/internal/sbom/sbom.go b/internal/sbom/sbom.go index 4cbadb36e..743496591 100644 --- a/internal/sbom/sbom.go +++ b/internal/sbom/sbom.go @@ -67,12 +67,12 @@ var ( cycloneDXNamespace = regexp.MustCompile(`^https?://cyclonedx\.org/schema/bom/(\d+\.\d+)$`) ) -// ProcessSBOMFile reads the whole file with no size limit. A caller that needs -// one, as the attest command does, reads the bytes itself and calls ProcessSBOM. -// // ProcessSBOMFile reads an SBOM file and returns its format and a normalised // summary. It confirms the file identifies itself as the format it parses as; // it does not validate against the format's schema. +// +// It reads the whole file with no size limit. A caller that needs one, as the +// attest command does, reads the bytes itself and calls ProcessSBOM. func ProcessSBOMFile(file string) (*SBOMData, error) { content, err := os.ReadFile(file) if err != nil {