@macula-io/martha 1.0.0 → 1.0.2
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/README.md
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/macula-io/martha/main/assets/martha-full-dark.svg">
|
|
4
|
+
<img src="https://raw.githubusercontent.com/macula-io/martha/main/assets/martha-full-light.svg" alt="Macula Martha" width="320">
|
|
5
|
+
</picture>
|
|
6
|
+
</p>
|
|
7
|
+
|
|
1
8
|
# @macula-io/martha
|
|
2
9
|
|
|
3
|
-
|
|
10
|
+
**Goal:** one developer, or a whole team, runs a crew of coding agents that plans, builds, reviews and releases
|
|
11
|
+
software, with one method and one tool.
|
|
12
|
+
|
|
13
|
+
This is the installer for [Martha](https://github.com/macula-io/martha): it installs Martha from its signed public
|
|
14
|
+
package, with nothing but Node.
|
|
4
15
|
|
|
5
16
|
```sh
|
|
6
17
|
npx -y --ignore-scripts @macula-io/martha@<exact version> [<martha version>]
|
|
@@ -34,26 +45,8 @@ martha-install [<version>] [--downgrade] [--digest sha256:<hex>]
|
|
|
34
45
|
|
|
35
46
|
## How a release is made
|
|
36
47
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
through the same signing workflow, then checks that the signature verifies for that branch and is refused for
|
|
40
|
-
`refs/tags/v<version>`, that an unsigned image is refused, and that the layer is exactly the committed tree.
|
|
41
|
-
Its two tags are kept in the public package, not pruned: one pair per run, and runs are started by hand.
|
|
42
|
-
Neither is ever installed: no tag of that shape is a version, and the signature is for a branch, so an install,
|
|
43
|
-
which demands `refs/tags/v<version>`, refuses it. Pruning would need a workflow that can delete package versions,
|
|
44
|
-
and none of Martha's workflows holds that power. A maintainer may delete old ones by hand in the package settings.
|
|
45
|
-
2. The first dry run is what makes the release package. The maintainers then link it to this repository and make it
|
|
46
|
-
public, before any release tag: every install pulls anonymously, and a refused pull must never read as
|
|
47
|
-
"unsigned".
|
|
48
|
-
3. `installer-v<version>` publishes this installer to npm, with provenance, through trusted publishing.
|
|
49
|
-
4. `v<version>` publishes a signed Martha release into the package, pinning that installer.
|
|
50
|
-
|
|
51
|
-
Neither tag publishes while a dependency of Martha or of this installer carries a known published advisory
|
|
52
|
-
(`advisories.yml`, which also runs on every pull request). An advisory is fixed or waived by a dated, named, expiring
|
|
53
|
-
row in `.github/advisories-waivers.txt`; there is no baseline. The `overrides` in `package.json` are such fixes:
|
|
54
|
-
sigstore 5.0.0 resolves glob 13 and minimatch 10, which carry GHSA-3g3m-2fjr-6pw4 and GHSA-g3hv-75wg-m249, so the
|
|
55
|
-
installer pins their first patched releases. Its callers use only `glob(pattern, options)` and
|
|
56
|
-
`minimatch(path, pattern)`, which both majors keep. Drop an override once sigstore resolves a patched release itself.
|
|
48
|
+
For maintainers: how a release is built, signed and published, and what stops one, is in
|
|
49
|
+
[the repository's docs](https://github.com/macula-io/martha/tree/main/docs), in `how-a-release-is-made.md`.
|
|
57
50
|
|
|
58
51
|
## License
|
|
59
52
|
|
|
@@ -17,6 +17,7 @@ const manifest = createRequire(import.meta.url)('../package.json')
|
|
|
17
17
|
* @property {string} issuer the OIDC issuer of the signing certificate
|
|
18
18
|
* @property {string} command the command an installed release puts on PATH
|
|
19
19
|
* @property {string} releaseFolder the one top-level folder a release's layer holds
|
|
20
|
+
* @property {string} pinFile the file the packer generates in that folder: the installer a release pins
|
|
20
21
|
* @property {string} releaseTagPrefix what a release tag starts with
|
|
21
22
|
* @property {string} installerTagPrefix what an installer tag starts with
|
|
22
23
|
* @property {string} installerPublishWorkflow the workflow whose run publishes this installer, and signs that publish
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@macula-io/martha",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@macula-io/martha",
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.2",
|
|
10
10
|
"bundleDependencies": [
|
|
11
11
|
"sigstore"
|
|
12
12
|
],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@macula-io/martha",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Install Martha from its signed public package: verifies the release's sigstore signature, then installs it",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -59,6 +59,7 @@
|
|
|
59
59
|
"releaseTagPrefix": "v",
|
|
60
60
|
"installerTagPrefix": "installer-v",
|
|
61
61
|
"releaseFolder": "martha",
|
|
62
|
+
"pinFile": "installer.json",
|
|
62
63
|
"dryRunTagPrefix": "dry-run-",
|
|
63
64
|
"installerPublishWorkflow": ".github/workflows/installer.yml"
|
|
64
65
|
}
|
|
@@ -156,7 +156,7 @@ async function failure ({ bundle, sha, ref, source, makeVerifier, tufCachePath }
|
|
|
156
156
|
* { sha } of the listed signer whose identity one of `bundles` verifies under, for `version` of `digest`; or
|
|
157
157
|
* { reasons } saying why each try failed. A trust root that could not be fetched throws CouldNotCheck instead.
|
|
158
158
|
* `ref` is refs/tags/v<version>; only the release dry run, from a test file, names its branch's ref.
|
|
159
|
-
* @param {{ bundles: any[], digest: string, version: string, signers: string[], source?: string, ref?: string, makeVerifier?: MakeVerifier, tufCachePath?: string | undefined }} request
|
|
159
|
+
* @param {{ bundles: any[], digest: string, version: string, signers: string[], source?: string, ref?: string | undefined, makeVerifier?: MakeVerifier, tufCachePath?: string | undefined }} request
|
|
160
160
|
* @returns {Promise<{ sha: string } | { reasons: string[] }>}
|
|
161
161
|
*/
|
|
162
162
|
export async function signedBy ({ bundles, digest, version, signers, source = NAMES.sourceRepository, ref = releaseRef(version), makeVerifier = createVerifier, tufCachePath }) {
|