{"components":{"parameters":{"IdempotencyKey":{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":128,"minLength":8,"type":"string"}},"JobPath":{"in":"path","name":"id","required":true,"schema":{"pattern":"^job_[a-z0-9]+$","type":"string"}},"Limit":{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},"NamePath":{"in":"path","name":"name","required":true,"schema":{"pattern":"^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$","type":"string"}},"Offset":{"in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}},"VersionPath":{"in":"path","name":"version","required":true,"schema":{"pattern":"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+$","type":"string"}}},"responses":{"Error":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Structured error"}},"schemas":{"AuthRotateRequest":{"additionalProperties":false,"properties":{"grace_period":{"default":"0s","type":"string"}},"type":"object"},"AuthRotateResponse":{"properties":{"fingerprint":{"type":"string"},"old_expires_at":{"format":"date-time","type":"string"},"token":{"description":"Returned exactly once.","type":"string","writeOnly":true}},"required":["token","fingerprint"],"type":"object"},"CreateRepositoryRequest":{"additionalProperties":false,"properties":{"name":{"type":"string"},"password":{"format":"password","maxLength":128,"minLength":12,"type":"string","writeOnly":true},"repository_name":{"type":"string"},"username":{"type":"string"}},"required":["name"],"type":"object"},"CredentialResponse":{"properties":{"password":{"description":"Present exactly once only when generated by dckreg.","format":"password","type":"string","writeOnly":true},"password_generated":{"type":"boolean"},"repository":{"$ref":"#/components/schemas/Repository"}},"required":["repository","password_generated"],"type":"object"},"ErrorEnvelope":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string"},"details":{"type":"object"},"message":{"type":"string"},"request_id":{"type":"string"},"retryable":{"type":"boolean"}},"required":["code","message","request_id","retryable","details"],"type":"object"}},"required":["error"],"type":"object"},"Health":{"additionalProperties":false,"properties":{"status":{"enum":["ok","unavailable"],"type":"string"}},"required":["status"],"type":"object"},"ImportRequest":{"allOf":[{"$ref":"#/components/schemas/CreateRepositoryRequest"},{"properties":{"all_tags":{"type":"boolean"},"conflict_mode":{"default":"fail-if-exists","enum":["fail-if-exists","skip-existing","overwrite"],"type":"string"},"source":{"type":"string"},"source_password":{"format":"password","type":"string","writeOnly":true},"source_username":{"type":"string","writeOnly":true},"tags":{"items":{"type":"string"},"type":"array"}},"required":["source","name"],"type":"object"}]},"ImportResponse":{"properties":{"credential":{"$ref":"#/components/schemas/CredentialResponse"},"job":{"$ref":"#/components/schemas/Job"}},"required":["credential","job"],"type":"object"},"Job":{"properties":{"attempt":{"type":"integer"},"created_at":{"format":"date-time","type":"string"},"error_code":{"type":"string"},"error_message":{"type":"string"},"finished_at":{"format":"date-time","type":"string"},"id":{"type":"string"},"kind":{"type":"string"},"repository_id":{"type":"string"},"spec":{"type":"object"},"started_at":{"format":"date-time","type":"string"},"status":{"enum":["queued","running","waiting_for_credentials","succeeded","partially_failed","failed","canceled"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","kind","status","attempt","created_at","updated_at"],"type":"object"},"JobItem":{"properties":{"attempts":{"type":"integer"},"bytes_copied":{"type":"integer"},"error_code":{"type":"string"},"error_message":{"type":"string"},"id":{"type":"string"},"job_id":{"type":"string"},"name":{"type":"string"},"source_digest":{"type":"string"},"status":{"type":"string"},"target_digest":{"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","job_id","name","status","bytes_copied","attempts","updated_at"],"type":"object"},"PasswordRequest":{"additionalProperties":false,"properties":{"password":{"format":"password","maxLength":128,"minLength":12,"type":"string","writeOnly":true}},"type":"object"},"Policy":{"additionalProperties":false,"properties":{"protected_tags":{"items":{"type":"string"},"type":"array"},"quota_bytes":{"minimum":1073741824,"type":"integer"},"retention_count":{"minimum":1,"type":"integer"},"untagged_grace":{"type":"string"}},"required":["quota_bytes","retention_count","protected_tags","untagged_grace"],"type":"object"},"RenameRequest":{"additionalProperties":false,"properties":{"keep_credentials":{"default":false,"type":"boolean"},"keep_old_for":{"default":"168h","type":"string"},"new_name":{"type":"string"}},"required":["new_name"],"type":"object"},"RenameResponse":{"properties":{"credential":{"$ref":"#/components/schemas/CredentialResponse"},"job":{"$ref":"#/components/schemas/Job"}},"required":["job"],"type":"object"},"Repository":{"properties":{"created_at":{"format":"date-time","type":"string"},"harbor_project_id":{"type":"integer"},"harbor_project_name":{"type":"string"},"harbor_user_id":{"type":"integer"},"id":{"type":"string"},"logical_name":{"type":"string"},"pending_deletion_at":{"format":"date-time","type":"string"},"purge_after":{"format":"date-time","type":"string"},"quota_bytes":{"type":"integer"},"registry_host":{"type":"string"},"registry_username":{"type":"string"},"repository_name":{"type":"string"},"retention_policy":{"type":"object"},"status":{"enum":["provisioning","active","renaming","pending_deletion","purged","error"],"type":"string"},"updated_at":{"format":"date-time","type":"string"},"username_was_generated":{"type":"boolean"}},"required":["id","logical_name","harbor_project_name","repository_name","registry_host","registry_username","status","quota_bytes","retention_policy","username_was_generated","created_at","updated_at"],"type":"object"},"SourceCredentialRequest":{"additionalProperties":false,"properties":{"source_password":{"format":"password","type":"string","writeOnly":true},"source_username":{"type":"string","writeOnly":true}},"type":"object"},"Version":{"additionalProperties":false,"properties":{"build_time":{"type":"string"},"commit":{"type":"string"},"harbor_version":{"type":"string"},"version":{"type":"string"}},"required":["version","commit","build_time","harbor_version"],"type":"object"}},"securitySchemes":{"bearerAuth":{"bearerFormat":"dckreg token","scheme":"bearer","type":"http"}}},"info":{"description":"Management API for private Harbor-backed OCI repositories. Secrets are returned only once.","title":"dckreg API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/":{"get":{"operationId":"landingPage","responses":{"200":{"content":{"text/html":{"schema":{"type":"string"}}},"description":"Product landing page and CLI quickstart"}},"security":[]}},"/SKILL.md":{"get":{"deprecated":true,"operationId":"skillCompatibilityAlias","responses":{"200":{"content":{"text/markdown":{"schema":{"type":"string"}}},"description":"Compatibility alias for the agent skill"}},"security":[]}},"/docs":{"get":{"operationId":"humanDocumentation","responses":{"200":{"content":{"text/html":{"schema":{"type":"string"}}},"description":"Human CLI documentation"}},"security":[]}},"/downloads/{version}/checksums.txt":{"get":{"operationId":"checksums","parameters":[{"$ref":"#/components/parameters/VersionPath"}],"responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"SHA-256 manifest"},"404":{"$ref":"#/components/responses/Error"}},"security":[]}},"/downloads/{version}/{artifact}":{"get":{"operationId":"download","parameters":[{"$ref":"#/components/parameters/VersionPath"},{"in":"path","name":"artifact","required":true,"schema":{"pattern":"^dckreg_[0-9]+\\\\.[0-9]+\\\\.[0-9]+_(linux|darwin)_(amd64|arm64)\\\\.tar\\\\.gz$","type":"string"}}],"responses":{"200":{"content":{"application/gzip":{"schema":{"format":"binary","type":"string"}}},"description":"Release archive"},"404":{"$ref":"#/components/responses/Error"}},"security":[]}},"/healthz":{"get":{"operationId":"health","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}},"description":"Process is alive"}},"security":[]}},"/install.sh":{"get":{"operationId":"installer","responses":{"200":{"content":{"text/x-shellscript":{"schema":{"type":"string"}}},"description":"Verified POSIX installer"}},"security":[]}},"/llms.txt":{"get":{"operationId":"llms","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Agent documentation"}},"security":[]}},"/metrics":{"get":{"operationId":"metrics","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Prometheus metrics"}}}},"/openapi.json":{"get":{"operationId":"openapi","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"This contract"}},"security":[]}},"/readyz":{"get":{"operationId":"readiness","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}},"description":"Dependencies are ready"},"503":{"$ref":"#/components/responses/Error"}},"security":[]}},"/skill.md":{"get":{"operationId":"skill","responses":{"200":{"content":{"text/markdown":{"schema":{"type":"string"}}},"description":"Agent skill"}},"security":[]}},"/v1/auth/rotate":{"post":{"operationId":"rotateAuth","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRotateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRotateResponse"}}},"description":"New token returned exactly once"},"401":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"}}}},"/v1/auth/verify":{"get":{"operationId":"verifyAuth","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"authenticated":{"enum":[true],"type":"boolean"},"fingerprint":{"type":"string"}},"required":["authenticated","fingerprint"],"type":"object"}}},"description":"Token is valid"},"401":{"$ref":"#/components/responses/Error"}}}},"/v1/cleanup":{"get":{"operationId":"cleanupStatus","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Cleanup status"}}},"post":{"operationId":"runCleanup","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"dry_run":{"type":"boolean"}},"required":["dry_run"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Cleanup result"}}}},"/v1/imports":{"post":{"operationId":"createImport","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResponse"}}},"description":"Import repository credential and job"}}}},"/v1/jobs":{"get":{"operationId":"listJobs","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Offset"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/Job"},"type":"array"}},"required":["jobs"],"type":"object"}}},"description":"Jobs"}}}},"/v1/jobs/{id}":{"get":{"operationId":"inspectJob","parameters":[{"$ref":"#/components/parameters/JobPath"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/JobItem"},"type":"array"},"job":{"$ref":"#/components/schemas/Job"}},"required":["job","items"],"type":"object"}}},"description":"Job and per-tag status"},"404":{"$ref":"#/components/responses/Error"}}}},"/v1/jobs/{id}/cancel":{"post":{"operationId":"cancelJob","parameters":[{"$ref":"#/components/parameters/JobPath"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}},"description":"Cancellation requested"}}}},"/v1/jobs/{id}/retry":{"post":{"operationId":"retryJob","parameters":[{"$ref":"#/components/parameters/JobPath"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceCredentialRequest"}}},"required":false},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}},"description":"Job queued"}}}},"/v1/repositories":{"get":{"operationId":"listRepositories","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Offset"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"repositories":{"items":{"$ref":"#/components/schemas/Repository"},"type":"array"}},"required":["repositories"],"type":"object"}}},"description":"Stable name-sorted page"},"401":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"createRepository","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRepositoryRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialResponse"}}},"description":"Repository and one-time credential"},"400":{"$ref":"#/components/responses/Error"},"401":{"$ref":"#/components/responses/Error"},"409":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/v1/repositories/{name}":{"delete":{"operationId":"deleteRepository","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"},{"in":"query","name":"purge","schema":{"default":false,"type":"boolean"}},{"in":"query","name":"confirm","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Repository"}}},"description":"Updated repository"},"400":{"$ref":"#/components/responses/Error"},"404":{"$ref":"#/components/responses/Error"}}},"get":{"operationId":"inspectRepository","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Repository"}}},"description":"Repository without passwords"},"404":{"$ref":"#/components/responses/Error"}}},"parameters":[{"$ref":"#/components/parameters/NamePath"}]},"/v1/repositories/{name}/credentials/rotate":{"post":{"operationId":"rotateRepositoryCredentials","parameters":[{"$ref":"#/components/parameters/NamePath"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordRequest"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialResponse"}}},"description":"Rotated one-time credential"}}}},"/v1/repositories/{name}/policy":{"get":{"operationId":"getRepositoryPolicy","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}},"description":"Policy"}}},"parameters":[{"$ref":"#/components/parameters/NamePath"}],"put":{"operationId":"setRepositoryPolicy","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Policy"}}},"description":"Applied policy"}}}},"/v1/repositories/{name}/rename":{"post":{"operationId":"renameRepository","parameters":[{"$ref":"#/components/parameters/NamePath"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameResponse"}}},"description":"Completed or resumable rename with optional one-time replacement credential"},"409":{"$ref":"#/components/responses/Error"}}}},"/v1/repositories/{name}/restore":{"post":{"operationId":"restoreRepository","parameters":[{"$ref":"#/components/parameters/NamePath"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Repository"}}},"description":"Restored repository"}}}},"/v1/storage":{"get":{"operationId":"storageStatus","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Storage and quota status"}}}},"/version":{"get":{"operationId":"version","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Version"}}},"description":"Build information"}},"security":[]}}},"security":[{"bearerAuth":[]}],"servers":[{"url":"https://dckreg.example.com"}]}