manifesto-cloudsmith 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,252 @@
1
+ Metadata-Version: 2.4
2
+ Name: manifesto-cloudsmith
3
+ Version: 1.0.0
4
+ Summary: Inspect, analyze, and manage Docker images in Cloudsmith repositories — multi-arch support, vulnerability scanning, and bulk cleanup.
5
+ Author-email: Colin Moynes <colinmoynes@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/colinmoynes/Manifesto
8
+ Project-URL: Repository, https://github.com/colinmoynes/Manifesto
9
+ Project-URL: Issues, https://github.com/colinmoynes/Manifesto/issues
10
+ Keywords: docker,cloudsmith,container,manifest,registry
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: System Administrators
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.8
19
+ Classifier: Programming Language :: Python :: 3.9
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Software Development :: Build Tools
25
+ Classifier: Topic :: System :: Software Distribution
26
+ Requires-Python: >=3.8
27
+ Description-Content-Type: text/markdown
28
+ Requires-Dist: rich>=10.0.0
29
+ Requires-Dist: rich-argparse>=1.0.0
30
+
31
+ # Manifesto
32
+
33
+ <div align="center">
34
+ <img src="assets/manifesto-logo.png">
35
+
36
+
37
+ **Analyze your Cloudsmith repositories with a hierarchical view of your Docker images, including
38
+ manifest/lists (tags), digests, platform support, Cloudsmith sync status, and download statistics.**
39
+
40
+
41
+ </div>
42
+
43
+ > [!CAUTION]
44
+ > This project is an independent, community-developed tool and is **not** affiliated with, endorsed by, or supported by Cloudsmith Ltd. It is provided "as is", without warranty of any kind. Cloudsmith Ltd. accepts no responsibility or liability for any loss, damage, or issues arising from the use of this tool. Use at your own risk.
45
+
46
+
47
+ This Python script audits for Docker images stored in your Cloudsmith repositories. It interacts with both the Cloudsmith API and Docker Manifest V2 endpoints to provide a detailed analysis of your images.
48
+
49
+ Here is a summary of its capabilities:
50
+
51
+ 1. **Visualization & Hierarchy**
52
+ - **Rich Tables:** Uses the `rich` library to render formatted, colored terminal tables.
53
+ - **Multi-Arch & Single Images:** Visually groups architecture-specific images under their parent Manifest List tag, and automatically detects standalone single-architecture images.
54
+ - **Details:** Displays the Tag, Type, Platform, Status, Download Counts, and SHA256 Digests.
55
+ - **Export Options:** Supports exporting analysis data to JSON or CSV for integration with other tools.
56
+ - **Multi-Arch status:** Aggregates child image quarantine states to determine parent manifest status.
57
+ 2. **Inspection Modes**
58
+ - **Single Image:** Can inspect a specific image repository (e.g., `my-org/my-repo/my-image`).
59
+ - **Full Catalog:** If no image name is provided, it automatically fetches the catalog and scans every image in the repository.
60
+ - **Detailed View:** The `--detailed` flag expands the output to show every individual child digest and its specific download count.
61
+ - **Summary View:** The `--summary` flag shows a compact one-line-per-image overview with tag counts, architecture breakdown, total downloads, and optional vulnerability totals.
62
+ - **Manifest Inspect:** The `--inspect` flag fetches and displays the raw Docker V2 manifest for a given tag or digest reference.
63
+ - **Filtering:** The `--filter` flag accepts Cloudsmith's package query syntax (`tag:`, `uploaded:`, `downloads:`, etc.) to narrow the scan.
64
+ 3. **Maintenance & Cleanup**
65
+ - **Untagged Detection:** The `--untagged` flag scans for "orphaned" images or manifest lists that exist but have no version tags.
66
+ - **Granular Deletion:** Supports deleting specific tags (`--delete-tag`), cleaning up untagged items (`--untagged-delete`), or wiping all detected images (`--delete-all`).
67
+ 4. **Data Aggregation**
68
+ - It combines data from two sources:
69
+ - **Docker Manifests:** To determine architecture/OS platforms and digest relationships.
70
+ - **Cloudsmith API:** To retrieve processing status (Synced, Failed, In Progress) and download statistics.
71
+ - For multi-arch tags, download counts are aggregated across the manifest list and its per-architecture children.
72
+ 5. **Security & Vulnerability Scanning**
73
+ - **CVE Summary:** The `--vulnerabilities` flag queries Cloudsmith's vulnerability scan results for each image, displaying scan status and counts by severity (Critical, High, Medium, Low).
74
+ - **Multi-Arch Rollup:** For manifest lists, vulnerability counts are rolled up from child images (using max-per-severity to avoid double-counting shared CVEs).
75
+ 6. **Cosign Artifact Handling**
76
+ - **Hidden by default:** Cosign signature, attestation, and SBOM tags (e.g. `sha256-<digest>.sig`) are filtered from the output so they don't pollute your tag list.
77
+ - **Opt-in:** Pass `--show-signatures` to include them, where they are labelled with their artifact type (`signature` / `attestation` / `sbom`).
78
+
79
+ #### Query repository for images.
80
+ <img src="assets/simple.gif">
81
+
82
+ #### Query for detailed results.
83
+ <img src="assets/detailed.gif">
84
+
85
+ #### Inspect Docker manifest.
86
+ <img src="assets/inspect.gif">
87
+
88
+
89
+ ## Installation
90
+
91
+ **From PyPI:**
92
+ ```bash
93
+ pip install manifesto-cloudsmith
94
+ ```
95
+
96
+ **From source:**
97
+ ```bash
98
+ git clone https://github.com/your-org/manifesto.git
99
+ cd manifesto
100
+ pip install .
101
+ ```
102
+
103
+ Once installed, the `manifesto` command is available directly:
104
+ ```bash
105
+ manifesto my-org my-repo
106
+ ```
107
+
108
+ ## Authentication
109
+
110
+ Manifesto resolves credentials in the following order — the first match wins:
111
+
112
+ **1. Environment variable** — highest priority, recommended for CI/CD:
113
+ ```bash
114
+ export CLOUDSMITH_API_KEY=<your-api-key>
115
+ ```
116
+
117
+ **2. Cloudsmith CLI login** — if you have the [Cloudsmith CLI](https://docs.cloudsmith.com/developer-tools/cli) installed and have run `cloudsmith login`, Manifesto will automatically read credentials from the CLI's `credentials.ini` file:
118
+ ```bash
119
+ cloudsmith login
120
+ ```
121
+
122
+ If no credentials are found, Manifesto will exit with an error indicating which options are available.
123
+
124
+ ## Prerequisites
125
+
126
+ 1. **Multi Arch Deletions**
127
+ To ensure that multi-arch images are fully deleted including child digests, ensure that you have the feature flag `Docker Manifest List Cascading` enabled for your Cloudsmith account.
128
+ This feature implements cascading deletions whenever the parent manifest/list is deleted. Please reach out to [Cloudsmith Support](https://help.cloudsmith.io/docs/contact-us) for further assistance with enabling this.
129
+
130
+
131
+ ## How to use
132
+
133
+ 1. **Basic Usage**
134
+ Run the script targeting your Organization and Repository.
135
+
136
+ - Scan a specific image:
137
+ ```bash
138
+ manifesto my-org my-repo my-image
139
+ ```
140
+
141
+ - Scan ALL images in the repository:
142
+ (Omit the image name)
143
+
144
+ 2. **Advanced Flags**
145
+ **Inspection**
146
+ | Flag | Description |
147
+ |-----------------------|--------------------------------------------------------------|
148
+ | `--detailed` | Shows child digests for multi-arch images. |
149
+ | `--untagged` | Show untagged manifest lists and orphaned images (untagged and unreferenced). |
150
+ | `--vulnerabilities` | Show vulnerability scan status and CVE severity summary (Critical/High/Medium/Low). |
151
+ | `--filter QUERY` | Query using Cloudsmith's package syntax (e.g. `tag:latest`, `uploaded:<'30 days ago'`, `downloads:>0`). |
152
+ | `--show-signatures` | Include cosign signature/attestation/SBOM artifact tags (hidden by default). |
153
+ | `--summary` | One-line-per-image summary with tag counts, downloads, and vulnerability totals. |
154
+ | `--inspect REF` | Fetch and display the raw Docker V2 manifest for a tag or digest. |
155
+
156
+ **Deletion**
157
+ | Flag | Description |
158
+ |-----------------------|--------------------------------------------------------------|
159
+ | `--delete-tag TAG` | Deletes an image via tag. |
160
+ | `--delete-all` | Wipes all images and manifest lists detected. |
161
+ | `--untagged-delete` | Deletes any untagged/orphaned images found. |
162
+ | `--force` | Force deletion without interactive prompt. Helpful for programmatic workflows. |
163
+
164
+ **Output**
165
+ | Flag | Description |
166
+ |-----------------------|--------------------------------------------------------------|
167
+ | `--output FORMAT` | Output format: `table` (default), `json`, or `csv`. |
168
+ | `--debug-log` | Enable verbose debug logging to `manifesto.log`. |
169
+ | `--version` | Print the version number and exit. |
170
+
171
+ 3. **Examples**
172
+ - Scan all images in a repository:
173
+ ```bash
174
+ manifesto my-org my-repo
175
+ ```
176
+
177
+ - Get a summary of all tags for a specific image:
178
+ ```bash
179
+ manifesto my-org my-repo my-image
180
+ ```
181
+
182
+ - See full breakdown (platforms & digests) for all images:
183
+ ```bash
184
+ manifesto my-org my-repo --detailed
185
+ ```
186
+
187
+ - Show vulnerability scan results:
188
+ ```bash
189
+ manifesto my-org my-repo my-image --vulnerabilities
190
+ ```
191
+
192
+ - Get untagged/orphaned images:
193
+ ```bash
194
+ manifesto my-org my-repo my-image --untagged
195
+ ```
196
+
197
+ - Filter by tag:
198
+ ```bash
199
+ manifesto my-org my-repo my-image --filter "tag:latest"
200
+ ```
201
+
202
+ - Filter by upload date and download count:
203
+ ```bash
204
+ manifesto my-org my-repo --filter "uploaded:<'30 days ago' AND downloads:>0"
205
+ ```
206
+
207
+ - Include cosign signature/SBOM artifacts in the output:
208
+ ```bash
209
+ manifesto my-org my-repo my-image --show-signatures
210
+ ```
211
+
212
+ - Quick summary across all images:
213
+ ```bash
214
+ manifesto my-org my-repo --summary
215
+ ```
216
+
217
+ - Inspect the raw manifest for a tag:
218
+ ```bash
219
+ manifesto my-org my-repo my-image --inspect latest
220
+ ```
221
+
222
+ - Export results to JSON:
223
+ ```bash
224
+ manifesto my-org my-repo --output json
225
+ ```
226
+
227
+ - Export results to CSV:
228
+ ```bash
229
+ manifesto my-org my-repo --output csv > report.csv
230
+ ```
231
+
232
+ - Delete untagged/orphaned images:
233
+ ```bash
234
+ manifesto my-org my-repo my-image --untagged-delete
235
+ ```
236
+
237
+ - Delete a specific tag:
238
+ ```bash
239
+ manifesto my-org my-repo my-image --delete-tag tag
240
+ ```
241
+
242
+ - Wipe all detected images (use with caution!):
243
+ ```bash
244
+ manifesto my-org my-repo --delete-all
245
+ ```
246
+
247
+
248
+
249
+
250
+
251
+
252
+
@@ -0,0 +1,222 @@
1
+ # Manifesto
2
+
3
+ <div align="center">
4
+ <img src="assets/manifesto-logo.png">
5
+
6
+
7
+ **Analyze your Cloudsmith repositories with a hierarchical view of your Docker images, including
8
+ manifest/lists (tags), digests, platform support, Cloudsmith sync status, and download statistics.**
9
+
10
+
11
+ </div>
12
+
13
+ > [!CAUTION]
14
+ > This project is an independent, community-developed tool and is **not** affiliated with, endorsed by, or supported by Cloudsmith Ltd. It is provided "as is", without warranty of any kind. Cloudsmith Ltd. accepts no responsibility or liability for any loss, damage, or issues arising from the use of this tool. Use at your own risk.
15
+
16
+
17
+ This Python script audits for Docker images stored in your Cloudsmith repositories. It interacts with both the Cloudsmith API and Docker Manifest V2 endpoints to provide a detailed analysis of your images.
18
+
19
+ Here is a summary of its capabilities:
20
+
21
+ 1. **Visualization & Hierarchy**
22
+ - **Rich Tables:** Uses the `rich` library to render formatted, colored terminal tables.
23
+ - **Multi-Arch & Single Images:** Visually groups architecture-specific images under their parent Manifest List tag, and automatically detects standalone single-architecture images.
24
+ - **Details:** Displays the Tag, Type, Platform, Status, Download Counts, and SHA256 Digests.
25
+ - **Export Options:** Supports exporting analysis data to JSON or CSV for integration with other tools.
26
+ - **Multi-Arch status:** Aggregates child image quarantine states to determine parent manifest status.
27
+ 2. **Inspection Modes**
28
+ - **Single Image:** Can inspect a specific image repository (e.g., `my-org/my-repo/my-image`).
29
+ - **Full Catalog:** If no image name is provided, it automatically fetches the catalog and scans every image in the repository.
30
+ - **Detailed View:** The `--detailed` flag expands the output to show every individual child digest and its specific download count.
31
+ - **Summary View:** The `--summary` flag shows a compact one-line-per-image overview with tag counts, architecture breakdown, total downloads, and optional vulnerability totals.
32
+ - **Manifest Inspect:** The `--inspect` flag fetches and displays the raw Docker V2 manifest for a given tag or digest reference.
33
+ - **Filtering:** The `--filter` flag accepts Cloudsmith's package query syntax (`tag:`, `uploaded:`, `downloads:`, etc.) to narrow the scan.
34
+ 3. **Maintenance & Cleanup**
35
+ - **Untagged Detection:** The `--untagged` flag scans for "orphaned" images or manifest lists that exist but have no version tags.
36
+ - **Granular Deletion:** Supports deleting specific tags (`--delete-tag`), cleaning up untagged items (`--untagged-delete`), or wiping all detected images (`--delete-all`).
37
+ 4. **Data Aggregation**
38
+ - It combines data from two sources:
39
+ - **Docker Manifests:** To determine architecture/OS platforms and digest relationships.
40
+ - **Cloudsmith API:** To retrieve processing status (Synced, Failed, In Progress) and download statistics.
41
+ - For multi-arch tags, download counts are aggregated across the manifest list and its per-architecture children.
42
+ 5. **Security & Vulnerability Scanning**
43
+ - **CVE Summary:** The `--vulnerabilities` flag queries Cloudsmith's vulnerability scan results for each image, displaying scan status and counts by severity (Critical, High, Medium, Low).
44
+ - **Multi-Arch Rollup:** For manifest lists, vulnerability counts are rolled up from child images (using max-per-severity to avoid double-counting shared CVEs).
45
+ 6. **Cosign Artifact Handling**
46
+ - **Hidden by default:** Cosign signature, attestation, and SBOM tags (e.g. `sha256-<digest>.sig`) are filtered from the output so they don't pollute your tag list.
47
+ - **Opt-in:** Pass `--show-signatures` to include them, where they are labelled with their artifact type (`signature` / `attestation` / `sbom`).
48
+
49
+ #### Query repository for images.
50
+ <img src="assets/simple.gif">
51
+
52
+ #### Query for detailed results.
53
+ <img src="assets/detailed.gif">
54
+
55
+ #### Inspect Docker manifest.
56
+ <img src="assets/inspect.gif">
57
+
58
+
59
+ ## Installation
60
+
61
+ **From PyPI:**
62
+ ```bash
63
+ pip install manifesto-cloudsmith
64
+ ```
65
+
66
+ **From source:**
67
+ ```bash
68
+ git clone https://github.com/your-org/manifesto.git
69
+ cd manifesto
70
+ pip install .
71
+ ```
72
+
73
+ Once installed, the `manifesto` command is available directly:
74
+ ```bash
75
+ manifesto my-org my-repo
76
+ ```
77
+
78
+ ## Authentication
79
+
80
+ Manifesto resolves credentials in the following order — the first match wins:
81
+
82
+ **1. Environment variable** — highest priority, recommended for CI/CD:
83
+ ```bash
84
+ export CLOUDSMITH_API_KEY=<your-api-key>
85
+ ```
86
+
87
+ **2. Cloudsmith CLI login** — if you have the [Cloudsmith CLI](https://docs.cloudsmith.com/developer-tools/cli) installed and have run `cloudsmith login`, Manifesto will automatically read credentials from the CLI's `credentials.ini` file:
88
+ ```bash
89
+ cloudsmith login
90
+ ```
91
+
92
+ If no credentials are found, Manifesto will exit with an error indicating which options are available.
93
+
94
+ ## Prerequisites
95
+
96
+ 1. **Multi Arch Deletions**
97
+ To ensure that multi-arch images are fully deleted including child digests, ensure that you have the feature flag `Docker Manifest List Cascading` enabled for your Cloudsmith account.
98
+ This feature implements cascading deletions whenever the parent manifest/list is deleted. Please reach out to [Cloudsmith Support](https://help.cloudsmith.io/docs/contact-us) for further assistance with enabling this.
99
+
100
+
101
+ ## How to use
102
+
103
+ 1. **Basic Usage**
104
+ Run the script targeting your Organization and Repository.
105
+
106
+ - Scan a specific image:
107
+ ```bash
108
+ manifesto my-org my-repo my-image
109
+ ```
110
+
111
+ - Scan ALL images in the repository:
112
+ (Omit the image name)
113
+
114
+ 2. **Advanced Flags**
115
+ **Inspection**
116
+ | Flag | Description |
117
+ |-----------------------|--------------------------------------------------------------|
118
+ | `--detailed` | Shows child digests for multi-arch images. |
119
+ | `--untagged` | Show untagged manifest lists and orphaned images (untagged and unreferenced). |
120
+ | `--vulnerabilities` | Show vulnerability scan status and CVE severity summary (Critical/High/Medium/Low). |
121
+ | `--filter QUERY` | Query using Cloudsmith's package syntax (e.g. `tag:latest`, `uploaded:<'30 days ago'`, `downloads:>0`). |
122
+ | `--show-signatures` | Include cosign signature/attestation/SBOM artifact tags (hidden by default). |
123
+ | `--summary` | One-line-per-image summary with tag counts, downloads, and vulnerability totals. |
124
+ | `--inspect REF` | Fetch and display the raw Docker V2 manifest for a tag or digest. |
125
+
126
+ **Deletion**
127
+ | Flag | Description |
128
+ |-----------------------|--------------------------------------------------------------|
129
+ | `--delete-tag TAG` | Deletes an image via tag. |
130
+ | `--delete-all` | Wipes all images and manifest lists detected. |
131
+ | `--untagged-delete` | Deletes any untagged/orphaned images found. |
132
+ | `--force` | Force deletion without interactive prompt. Helpful for programmatic workflows. |
133
+
134
+ **Output**
135
+ | Flag | Description |
136
+ |-----------------------|--------------------------------------------------------------|
137
+ | `--output FORMAT` | Output format: `table` (default), `json`, or `csv`. |
138
+ | `--debug-log` | Enable verbose debug logging to `manifesto.log`. |
139
+ | `--version` | Print the version number and exit. |
140
+
141
+ 3. **Examples**
142
+ - Scan all images in a repository:
143
+ ```bash
144
+ manifesto my-org my-repo
145
+ ```
146
+
147
+ - Get a summary of all tags for a specific image:
148
+ ```bash
149
+ manifesto my-org my-repo my-image
150
+ ```
151
+
152
+ - See full breakdown (platforms & digests) for all images:
153
+ ```bash
154
+ manifesto my-org my-repo --detailed
155
+ ```
156
+
157
+ - Show vulnerability scan results:
158
+ ```bash
159
+ manifesto my-org my-repo my-image --vulnerabilities
160
+ ```
161
+
162
+ - Get untagged/orphaned images:
163
+ ```bash
164
+ manifesto my-org my-repo my-image --untagged
165
+ ```
166
+
167
+ - Filter by tag:
168
+ ```bash
169
+ manifesto my-org my-repo my-image --filter "tag:latest"
170
+ ```
171
+
172
+ - Filter by upload date and download count:
173
+ ```bash
174
+ manifesto my-org my-repo --filter "uploaded:<'30 days ago' AND downloads:>0"
175
+ ```
176
+
177
+ - Include cosign signature/SBOM artifacts in the output:
178
+ ```bash
179
+ manifesto my-org my-repo my-image --show-signatures
180
+ ```
181
+
182
+ - Quick summary across all images:
183
+ ```bash
184
+ manifesto my-org my-repo --summary
185
+ ```
186
+
187
+ - Inspect the raw manifest for a tag:
188
+ ```bash
189
+ manifesto my-org my-repo my-image --inspect latest
190
+ ```
191
+
192
+ - Export results to JSON:
193
+ ```bash
194
+ manifesto my-org my-repo --output json
195
+ ```
196
+
197
+ - Export results to CSV:
198
+ ```bash
199
+ manifesto my-org my-repo --output csv > report.csv
200
+ ```
201
+
202
+ - Delete untagged/orphaned images:
203
+ ```bash
204
+ manifesto my-org my-repo my-image --untagged-delete
205
+ ```
206
+
207
+ - Delete a specific tag:
208
+ ```bash
209
+ manifesto my-org my-repo my-image --delete-tag tag
210
+ ```
211
+
212
+ - Wipe all detected images (use with caution!):
213
+ ```bash
214
+ manifesto my-org my-repo --delete-all
215
+ ```
216
+
217
+
218
+
219
+
220
+
221
+
222
+