storeshot 0.1.0
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.
- package/CHANGELOG.md +15 -0
- package/CONTRIBUTING.md +75 -0
- package/LICENSE +21 -0
- package/README.md +142 -0
- package/SECURITY.md +25 -0
- package/THIRD_PARTY_LICENSES.txt +668 -0
- package/THIRD_PARTY_NOTICES.md +93 -0
- package/dist/cli.js +1458 -0
- package/dist/cli.js.map +1 -0
- package/dist/ui/artwork/tabler/LICENSE +21 -0
- package/dist/ui/artwork/tabler/README.md +23 -0
- package/dist/ui/artwork/tabler/filled/grid-pattern.svg +13 -0
- package/dist/ui/artwork/tabler/filled/laurel-wreath-1.svg +13 -0
- package/dist/ui/artwork/tabler/filled/laurel-wreath-2.svg +13 -0
- package/dist/ui/artwork/tabler/filled/laurel-wreath-3.svg +13 -0
- package/dist/ui/artwork/tabler/filled/laurel-wreath.svg +13 -0
- package/dist/ui/artwork/tabler/filled/sparkles.svg +15 -0
- package/dist/ui/artwork/tabler/filled/stars.svg +15 -0
- package/dist/ui/artwork/tabler/outline/scribble.svg +19 -0
- package/dist/ui/artwork/tabler/outline/underline.svg +20 -0
- package/dist/ui/assets/AssetsView-D0lbK5rm.js +1 -0
- package/dist/ui/assets/SetEditor-BBUlgGT0.js +440 -0
- package/dist/ui/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/dist/ui/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/dist/ui/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/dist/ui/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/dist/ui/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/dist/ui/assets/index-DPDaBFld.js +10 -0
- package/dist/ui/assets/index-DfZBqsD3.css +2 -0
- package/dist/ui/assets/shared-BiRg4I01.js +1 -0
- package/dist/ui/index.html +14 -0
- package/dist/ui/licenses/geist-OFL-1.1.txt +93 -0
- package/dist/ui/mockup-bundles/frameup-free/LICENSE +21 -0
- package/dist/ui/mockup-bundles/frameup-free/README.md +12 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/imac-pro.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/imac-retina.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/imac.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-air-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-air-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-air-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-mini-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-mini-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-mini-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-pro-11-silver-landscape.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-pro-11-silver-portrait.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-pro-11-space-gray-landscape.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-pro-11-space-gray-portrait.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-pro-13-silver-landscape.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-pro-13-silver-portrait.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-pro-13-space-gray-landscape.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-pro-13-space-gray-portrait.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/ipad-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-black.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-green.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-pro-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-pro-max-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-pro-max-midnight-green.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-pro-max-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-pro-max-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-pro-midnight-green.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-pro-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-pro-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-purple.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-red.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-white.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-11-yellow.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-13-pro-max.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-13-pro.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-14-pro-max-no-cutout.svg +4 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-14-pro-max.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-14-pro-no-cutout.svg +4 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-14-pro.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-15-pro-max-no-cutout.svg +4 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-15-pro-max.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-15-pro-no-cutout.svg +4 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-15-pro.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-16-pro-max-no-cutout.svg +10 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-16-pro-max.svg +11 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-16-pro-no-cutout.svg +4 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-16-pro.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-17-pro-max-no-cutout.svg +4 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-17-pro-max.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-17-pro-no-cutout.svg +4 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-17-pro.svg +5 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-5c-blue.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-5c-green.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-5c-red.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-5c-white.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-5c-yellow.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-5s-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-5s-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-5s-space-gray.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-6s-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-6s-plus-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-6s-plus-rose-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-6s-plus-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-6s-plus-space-gray.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-6s-rose-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-6s-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-6s-space-gray.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-jet-black.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-matte-black.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-plus-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-plus-jet-black.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-plus-matte-black.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-plus-rose-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-plus-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-rose-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-7-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-8-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-8-plus-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-8-plus-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-8-plus-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-8-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-8-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-se-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-se-rose-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-se-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-se-space-gray.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-x-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-x-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xr-blue.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xr-coral.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xr-red.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xr-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xr-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xr-yellow.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xs-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xs-max-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xs-max-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xs-max-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xs-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/iphone-xs-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-air-13-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-air-13-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-air-13-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-gold.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-pro-13-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-pro-13-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-pro-15-silver.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-pro-15-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/macbook-space-grey.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/pro-display-xdr.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/assets/thunderbolt-display.png +0 -0
- package/dist/ui/mockup-bundles/frameup-free/storeshot-mockups.json +2279 -0
- package/docs/mockup-bundles.md +104 -0
- package/docs/releasing.md +155 -0
- package/package.json +85 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# StoreShot mockup bundles
|
|
2
|
+
|
|
3
|
+
A mockup bundle is a normal folder. StoreShot deliberately uses an inspectable
|
|
4
|
+
manifest plus ordinary image files instead of a custom binary archive or a ZIP
|
|
5
|
+
dependency.
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
my-device-frames/
|
|
9
|
+
├── storeshot-mockups.json
|
|
10
|
+
├── LICENSE
|
|
11
|
+
└── assets/
|
|
12
|
+
├── iphone-front.svg
|
|
13
|
+
└── iphone-angle.webp
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Choose the folder from **Import bundle** in the device-frame picker. StoreShot
|
|
17
|
+
reads the manifest first, lets the user select individual mockups, and copies
|
|
18
|
+
only the selected definitions, their referenced assets, and the license file
|
|
19
|
+
into the current project's `mockup-bundles/<bundle-id>/` folder.
|
|
20
|
+
|
|
21
|
+
## Manifest
|
|
22
|
+
|
|
23
|
+
`storeshot-mockups.json` uses format version 1:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"format": "storeshot-mockup-bundle",
|
|
28
|
+
"version": 1,
|
|
29
|
+
"id": "example-apple-frames",
|
|
30
|
+
"name": "Example Apple Frames",
|
|
31
|
+
"author": "Example Studio",
|
|
32
|
+
"license": {
|
|
33
|
+
"name": "MIT",
|
|
34
|
+
"url": "https://example.com/license",
|
|
35
|
+
"file": "LICENSE"
|
|
36
|
+
},
|
|
37
|
+
"source": {
|
|
38
|
+
"name": "example/frames",
|
|
39
|
+
"url": "https://example.com/frames",
|
|
40
|
+
"revision": "0123456789abcdef"
|
|
41
|
+
},
|
|
42
|
+
"mockups": [
|
|
43
|
+
{
|
|
44
|
+
"id": "iphone-front",
|
|
45
|
+
"groupId": "iphone-example",
|
|
46
|
+
"groupName": "iPhone Example",
|
|
47
|
+
"name": "iPhone Example",
|
|
48
|
+
"description": "Front · Black",
|
|
49
|
+
"platform": "iphone",
|
|
50
|
+
"style": "standard",
|
|
51
|
+
"frame": "assets/iphone-front.svg",
|
|
52
|
+
"width": 462,
|
|
53
|
+
"height": 978,
|
|
54
|
+
"screen": {
|
|
55
|
+
"kind": "rect",
|
|
56
|
+
"x": 11,
|
|
57
|
+
"y": 11,
|
|
58
|
+
"width": 440,
|
|
59
|
+
"height": 956,
|
|
60
|
+
"cornerRadius": 55
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
All identifiers use lowercase letters, numbers, and hyphens. Asset and license
|
|
68
|
+
paths are relative to the bundle root and cannot contain parent-directory
|
|
69
|
+
segments. Supported frame formats are SVG, PNG, JPEG, and WebP. `thumbnail` is
|
|
70
|
+
optional and defaults to the frame asset.
|
|
71
|
+
|
|
72
|
+
Installed mockup IDs are namespaced as `<bundle-id>/<mockup-id>`, so unrelated
|
|
73
|
+
bundles can safely use the same local mockup names.
|
|
74
|
+
|
|
75
|
+
## Screen geometry
|
|
76
|
+
|
|
77
|
+
The usual `rect` geometry places the screenshot into an axis-aligned rounded
|
|
78
|
+
rectangle before drawing the transparent frame above it.
|
|
79
|
+
|
|
80
|
+
Perspective frames can use a normalized 3×3 homography:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"kind": "projective",
|
|
85
|
+
"transform": [
|
|
86
|
+
[0.62, -0.08, 0.20],
|
|
87
|
+
[0.04, 0.73, 0.12],
|
|
88
|
+
[0.02, -0.01, 1]
|
|
89
|
+
],
|
|
90
|
+
"sourceCornerRadius": { "x": 0.08, "y": 0.04 }
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The transform maps normalized screenshot coordinates `(u, v)` into normalized
|
|
95
|
+
frame coordinates. This makes matrices independent of the source screenshot
|
|
96
|
+
resolution while the frame's `width` and `height` define its output coordinate
|
|
97
|
+
space.
|
|
98
|
+
|
|
99
|
+
## Licensing
|
|
100
|
+
|
|
101
|
+
Bundle authors should include a license file when redistribution is allowed and
|
|
102
|
+
record the source URL and revision. StoreShot preserves that metadata when only
|
|
103
|
+
a subset of a bundle is imported. Importing a bundle does not grant rights to
|
|
104
|
+
its assets; users remain responsible for following the bundle's license.
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Releasing StoreShot
|
|
2
|
+
|
|
3
|
+
StoreShot publishes stable releases to npm from GitHub Actions. A `vX.Y.Z` Git
|
|
4
|
+
tag is the release trigger, and the tag must match the version in `package.json`.
|
|
5
|
+
The workflow uses npm trusted publishing (OIDC), so the repository does not need
|
|
6
|
+
an `NPM_TOKEN` secret.
|
|
7
|
+
|
|
8
|
+
## One-time setup and first release
|
|
9
|
+
|
|
10
|
+
The `storeshot` package does not exist on npm yet. npm only allows a trusted
|
|
11
|
+
publisher to be configured after the package exists, so `0.1.0` must be
|
|
12
|
+
published manually once.
|
|
13
|
+
|
|
14
|
+
1. Create an account at [npmjs.com](https://www.npmjs.com/) if needed, verify
|
|
15
|
+
the account email address, and enable two-factor authentication for
|
|
16
|
+
authorization and publishing.
|
|
17
|
+
2. Make sure the publishing-workflow and package-metadata changes are merged
|
|
18
|
+
into `main` and pushed to GitHub.
|
|
19
|
+
3. From a clean checkout of `main`, sign in and verify the account:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm login
|
|
23
|
+
npm whoami
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
4. Validate exactly what will be released:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm ci
|
|
30
|
+
npm run check
|
|
31
|
+
npm pack --dry-run
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Read the package-content list. It should contain the built `dist/` files,
|
|
35
|
+
documentation, notices, and licenses, but no source-only secrets or local
|
|
36
|
+
project data.
|
|
37
|
+
|
|
38
|
+
5. Publish the initial release:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm publish
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
npm runs `prepublishOnly`, so the validation gate runs again before upload.
|
|
45
|
+
Complete the two-factor prompt when npm asks for it.
|
|
46
|
+
|
|
47
|
+
6. Configure trusted publishing on the new package:
|
|
48
|
+
|
|
49
|
+
- Open the `storeshot` package on npm while signed in, then go to
|
|
50
|
+
**Settings** and find **Trusted Publisher**.
|
|
51
|
+
- Select **GitHub Actions**.
|
|
52
|
+
- Organization or user: `mikkokut`
|
|
53
|
+
- Repository: `storeshot`
|
|
54
|
+
- Workflow filename: `publish.yml`
|
|
55
|
+
- Environment: leave empty
|
|
56
|
+
- Allowed action: `npm publish`
|
|
57
|
+
|
|
58
|
+
The names are case-sensitive. Enter only `publish.yml`, not the full
|
|
59
|
+
`.github/workflows/publish.yml` path.
|
|
60
|
+
|
|
61
|
+
7. Create and push the initial release tag. The workflow recognizes that
|
|
62
|
+
`0.1.0` already exists and exits successfully:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git tag -a v0.1.0 -m "Release v0.1.0"
|
|
66
|
+
git push origin v0.1.0
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
8. Confirm that the **Publish to npm** workflow succeeded in GitHub Actions and
|
|
70
|
+
that `npm view storeshot version` prints `0.1.0`.
|
|
71
|
+
|
|
72
|
+
After the first trusted publish succeeds, remove any old npm automation tokens.
|
|
73
|
+
In the npm package settings, disallow token-based publishing if that option is
|
|
74
|
+
available. Keep trusted publishing enabled.
|
|
75
|
+
|
|
76
|
+
## Publishing later versions
|
|
77
|
+
|
|
78
|
+
Prepare releases on `main`, after all intended changes have landed.
|
|
79
|
+
|
|
80
|
+
1. Update `CHANGELOG.md`: move relevant entries from **Unreleased** into a new
|
|
81
|
+
version section with the release date, and restore an empty **Unreleased**
|
|
82
|
+
section for future work.
|
|
83
|
+
2. Check the working tree and run the release gate:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
git status --short
|
|
87
|
+
npm ci
|
|
88
|
+
npm run check
|
|
89
|
+
npm pack --dry-run
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
3. Choose the semantic-version increment:
|
|
93
|
+
|
|
94
|
+
- `patch` for backward-compatible fixes (`0.1.0` to `0.1.1`)
|
|
95
|
+
- `minor` for backward-compatible features (`0.1.0` to `0.2.0`)
|
|
96
|
+
- `major` for breaking changes once the project reaches `1.0.0`
|
|
97
|
+
- While the project is on `0.x`, use a minor bump for meaningful breaking
|
|
98
|
+
changes and explain them in the changelog.
|
|
99
|
+
|
|
100
|
+
4. Commit the changelog and other release preparation, then make sure the tree
|
|
101
|
+
is clean:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
git add CHANGELOG.md
|
|
105
|
+
git commit -m "Prepare v0.1.1 release"
|
|
106
|
+
git status --short
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
5. Let npm update both `package.json` and `package-lock.json`, create the version
|
|
110
|
+
commit, and create the matching Git tag:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npm version patch -m "Release v%s"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Replace `patch` with `minor`, `major`, or an exact version when appropriate.
|
|
117
|
+
Do not use `--force`; `npm version` intentionally requires a clean tree.
|
|
118
|
+
|
|
119
|
+
6. Inspect the result before publishing:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
git show --stat --oneline HEAD
|
|
123
|
+
git tag --points-at HEAD
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
7. Push the version commit and tag together:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
git push origin main --follow-tags
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
8. Watch the **Publish to npm** workflow. When it succeeds, verify the registry:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
npm view storeshot version
|
|
136
|
+
npm install --global storeshot@0.1.1
|
|
137
|
+
storeshot --version
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Replace `0.1.1` with the released version. Optionally create a GitHub Release
|
|
141
|
+
from the same tag and copy the corresponding changelog section into it.
|
|
142
|
+
|
|
143
|
+
## If publishing fails
|
|
144
|
+
|
|
145
|
+
- Fix the cause; do not delete and recreate a published npm version. npm package
|
|
146
|
+
name/version pairs cannot be reused.
|
|
147
|
+
- If validation fails before `npm publish`, fix the code on `main`, remove the
|
|
148
|
+
unpublished local and remote tag, bump again, and push the corrected tag.
|
|
149
|
+
- If npm reports an authentication error, confirm that trusted publishing uses
|
|
150
|
+
`mikkokut/storeshot`, the exact filename `publish.yml`, no environment, and
|
|
151
|
+
that the workflow has `id-token: write` permission.
|
|
152
|
+
- If npm already contains the version, the workflow exits successfully without
|
|
153
|
+
attempting to overwrite it.
|
|
154
|
+
- Never add an npm write token to the repository or workflow. Trusted publishing
|
|
155
|
+
is the normal release path after the initial bootstrap release.
|
package/package.json
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "storeshot",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A local-first, agent-native CLI for creating App Store screenshots.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"app-store",
|
|
7
|
+
"screenshots",
|
|
8
|
+
"ios",
|
|
9
|
+
"cli",
|
|
10
|
+
"local-first",
|
|
11
|
+
"agent-native"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": "Mikko Kutilainen",
|
|
15
|
+
"homepage": "https://github.com/mikkokut/storeshot#readme",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/mikkokut/storeshot/issues"
|
|
18
|
+
},
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/mikkokut/storeshot.git"
|
|
22
|
+
},
|
|
23
|
+
"type": "module",
|
|
24
|
+
"bin": {
|
|
25
|
+
"storeshot": "./dist/cli.js"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"CHANGELOG.md",
|
|
29
|
+
"CONTRIBUTING.md",
|
|
30
|
+
"dist",
|
|
31
|
+
"docs",
|
|
32
|
+
"LICENSE",
|
|
33
|
+
"README.md",
|
|
34
|
+
"SECURITY.md",
|
|
35
|
+
"THIRD_PARTY_LICENSES.txt",
|
|
36
|
+
"THIRD_PARTY_NOTICES.md"
|
|
37
|
+
],
|
|
38
|
+
"scripts": {
|
|
39
|
+
"storeshot": "tsx src/cli.ts",
|
|
40
|
+
"dev": "tsx watch --clear-screen=false src/cli.ts dev playground --no-open",
|
|
41
|
+
"build": "npm run build:cli && npm run build:ui",
|
|
42
|
+
"build:cli": "tsup",
|
|
43
|
+
"build:ui": "vite build",
|
|
44
|
+
"typecheck": "tsc --noEmit",
|
|
45
|
+
"test": "node --import tsx --test test/*.test.ts",
|
|
46
|
+
"licenses": "node scripts/generate-third-party-licenses.mjs",
|
|
47
|
+
"check:licenses": "node scripts/generate-third-party-licenses.mjs --check",
|
|
48
|
+
"check": "npm run check:licenses && npm run typecheck && npm test && npm run build",
|
|
49
|
+
"prepublishOnly": "npm run check"
|
|
50
|
+
},
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=22.12"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@base-ui/react": "^1.6.0",
|
|
56
|
+
"@fontsource-variable/geist": "^5.2.9",
|
|
57
|
+
"commander": "^15.0.0",
|
|
58
|
+
"fabric": "^7.4.0",
|
|
59
|
+
"open": "^11.0.0",
|
|
60
|
+
"react-resizable-panels": "^4.12.2",
|
|
61
|
+
"tw-animate-css": "^1.4.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@tailwindcss/vite": "^4.3.2",
|
|
65
|
+
"@types/node": "^26.1.1",
|
|
66
|
+
"@types/react": "^19.2.17",
|
|
67
|
+
"@types/react-dom": "^19.2.3",
|
|
68
|
+
"@vitejs/plugin-react": "^6.0.3",
|
|
69
|
+
"class-variance-authority": "^0.7.1",
|
|
70
|
+
"clsx": "^2.1.1",
|
|
71
|
+
"lucide-react": "^1.24.0",
|
|
72
|
+
"react": "^19.2.7",
|
|
73
|
+
"react-dom": "^19.2.7",
|
|
74
|
+
"shadcn": "^4.13.0",
|
|
75
|
+
"tailwind-merge": "^3.6.0",
|
|
76
|
+
"tailwindcss": "^4.3.2",
|
|
77
|
+
"tsup": "^8.5.1",
|
|
78
|
+
"tsx": "^4.23.1",
|
|
79
|
+
"typescript": "^7.0.2",
|
|
80
|
+
"vite": "^8.1.4"
|
|
81
|
+
},
|
|
82
|
+
"publishConfig": {
|
|
83
|
+
"access": "public"
|
|
84
|
+
}
|
|
85
|
+
}
|