@guidanti/duet 1.10.0 → 1.10.1
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 +7 -7
- package/artifact/{duet-1.10.0-py3-none-any.whl → duet-1.10.1-py3-none-any.whl} +0 -0
- package/artifact/{duet-1.10.0.artifact.json → duet-1.10.1.artifact.json} +5 -5
- package/bin/duet +7 -7
- package/duet-npm.json +13 -13
- package/lib/setup.py +6 -6
- package/lib/setup.sh +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ npm install --global @guidanti/duet --allow-scripts=@guidanti/duet
|
|
|
20
20
|
|
|
21
21
|
**Setup installs the whole runtime from the bundled artifact and downloads nothing for it.** The artifact declares the pinned third-party wheels it travels with and carries their exact bytes, and installing it unpacks duet and every one of those wheels into the runtime's own environment, which is created without pip and resolves nothing. A runtime missing any of them is not published: the staged tree is held to the manifest it declares before anything is renamed into place.
|
|
22
22
|
|
|
23
|
-
Once duet is installed, `duet upgrade` runs exactly that command for you -- npm's own global install with this package's install-script allowance -- shows npm's output and its failures unchanged, and then reads the installation root to say
|
|
23
|
+
Once duet is installed, `duet upgrade` runs exactly that command for you -- npm's own global install with this package's install-script allowance -- with one difference: it first asks npm which release the configured registry names `latest` (`npm view --global @guidanti/duet@latest version`, through npm's own registry, proxy and credentials, and global because the install is global -- npm ignores a project `.npmrc` for a global command, so a local read could name a version from a registry the install never visits) and installs that exact version, so what it confirms afterwards is the release it asked for rather than whatever a second lookup inside npm returned. A tag it could not resolve to one release is a refusal that installs nothing, the bare tag included. It shows npm's output and its failures unchanged, and then reads the installation root to say whether the release installed is that target, whether it is still the build it says it is, and whether it is the default. It reports an activation only where the installed package is the version it asked for, `default.json` says so and that release is intact: a zero npm status is not one. `latest` is mutable and nothing is promised about it past that read. It takes no version or tag of its own, so installing a named release stays the npm command above with `@<version>` in it.
|
|
24
24
|
|
|
25
25
|
**What it can and cannot tell you about setup.** It reads this record before the install and again afterwards, and reports the comparison as what it is. The read afterwards is one read, and both questions about the record -- which artifact it names and whether its bytes are the ones from before -- are answered from those same bytes, so they are answered about one record rather than about two a setup of another release could have published between. A record that names the installed release's artifact and whose bytes changed while the command ran is evidence that a setup completed during it -- not proof of which process ran that setup, since nothing duet can read records that, and a concurrent setup or `duet select` is an ordinary thing. A record that is unchanged, that names another artifact, or that is absent is the absence of that evidence and not proof that no setup ran: npm runs no install script for a package it decides is already up to date, each record names the single artifact its own setup installed, and the record is written last. A read that could not open the record is not a reading of it either: the read before the install keeps its own state, so a record that was there and would not open is held as unreadable rather than as the absent record it is not, and where either read failed to open the file the comparison is reported as not established -- neither a setup during the command nor an unchanged record -- because a historical record of this release that was unreadable before the install and readable afterwards would otherwise read as one written during it. This record and `default.json` are two files, read one after the other and not under one lock, so the pair is reported as two observations rather than as a history: a record that changed under a default naming another release is not reported as a selection that replaced this release after it was activated, because that is an order of writes duet did not observe. A failing or interrupted install is read the same way -- npm's non-zero status is not evidence that nothing was installed or activated, because the install script is where setup happens and it can have got anywhere before the failure. An interruption signals the process group npm led, by the group id duet read while npm was running and for as long as anything is still in that group -- so npm's own exit, which is usually an interrupt's first effect, neither ends the cleanup nor takes the group's name away with it -- and then says which signals were delivered, how npm ended, whether anything outlived a signal and whether anything is left in that group, never reporting a cleanup it did not establish. `duet --version` and `duet select --json` are the read-only answers afterwards.
|
|
26
26
|
|
|
@@ -30,7 +30,7 @@ Once duet is installed, `duet upgrade` runs exactly that command for you -- npm'
|
|
|
30
30
|
/bin/sh "$(npm root -g)/@guidanti/duet/lib/setup.sh"
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
Setup runs in this package's install script: it verifies the bundled artifact, installs it as an immutable managed runtime under `~/.duet/installations/<version>/`, self-checks that runtime, writes the dispatcher, and then makes that release the default for new runs -- on a first install, on an upgrade, on an explicit downgrade to an older version, and whatever was selected before. A run that already exists keeps the build it was started on, and `duet select <version>` changes the default again at any time -- as does `duet select` with no version on a terminal, which lists the installed releases,
|
|
33
|
+
Setup runs in this package's install script: it verifies the bundled artifact, installs it as an immutable managed runtime under `~/.duet/installations/<version>/`, self-checks that runtime, writes the dispatcher, and then makes that release the default for new runs -- on a first install, on an upgrade, on an explicit downgrade to an older version, and whatever was selected before. A run that already exists keeps the build it was started on, and `duet select <version>` changes the default again at any time -- as does `duet select` with no version on a terminal, which lists the installed releases, labels the saved default `(default)` and selects the one you move the cursor to with the arrow keys and confirm with Enter. Escape, Ctrl-C and an end of input leave the default exactly as it was. A new version installs beside what is there and removes nothing.
|
|
34
34
|
|
|
35
35
|
Running the same command again is the retry and the upgrade -- but a reinstall is npm's decision, not duet's: npm runs no install script for a package it decides is already up to date, and nothing then installs or selects anything. The two routes that always do are `duet select <version>`, which moves the default by hand, and `/bin/sh <package>/lib/setup.sh`, which runs this package's own setup for the release it carries. Installing another version or tag (`@guidanti/duet@<version>`) is a change npm does perform, and it activates that release.
|
|
36
36
|
|
|
@@ -42,7 +42,7 @@ Setup also creates six starter instruction files under `~/.duet/instructions/`,
|
|
|
42
42
|
|
|
43
43
|
## What your runtimes are called
|
|
44
44
|
|
|
45
|
-
A managed runtime is named by the version it publishes: `~/.duet/installations/1.10.
|
|
45
|
+
A managed runtime is named by the version it publishes: `~/.duet/installations/1.10.1/`. That name is what `duet select`, `duet remove` and every report use, and `duet --version` prints the version alone. The build identity -- a digest of the exact bytes installed -- is kept where it is load-bearing instead of in the name: the runtime's own manifest, every run's pin, and the reports whose job is to say which build this is (`duet self-check`, and `duet select` listing what is there, interactively on a terminal and read-only under `--json`).
|
|
46
46
|
|
|
47
47
|
Runtimes installed before this release are named `<version>+<build id>`, and they keep that name: they stay listed, stay selectable and stay runnable, nothing is renamed, and no run is repinned. Select one by its full name. A bare version that *is* the name of a runtime selects that runtime; a bare version that is not a name, and that two older runtimes share, is ambiguous and refuses with both names printed for you to choose from. `duet remove` takes an exact name only.
|
|
48
48
|
|
|
@@ -58,15 +58,15 @@ That removes this package and the `duet` npm linked onto your PATH. It removes n
|
|
|
58
58
|
|
|
59
59
|
## This build
|
|
60
60
|
|
|
61
|
-
- version `1.10.
|
|
62
|
-
- artifact `duet-1.10.
|
|
63
|
-
- `sha256=
|
|
61
|
+
- version `1.10.1`, build `9218227709bec34d`
|
|
62
|
+
- artifact `duet-1.10.1-py3-none-any.whl`
|
|
63
|
+
- `sha256=1b5e305170728c47ca4b1c335acd5f5ee5955cc3002330802d4274b119c43ff4`
|
|
64
64
|
- carries 4 pinned wheels: markdown-it-py 3.0.0, mdurl 0.1.2, pygments 2.21.0, rich 15.0.0, by digest inside that artifact; nothing is downloaded for them, and setup unpacks them into the runtime's own environment beside duet
|
|
65
65
|
|
|
66
66
|
## Permission to use duet
|
|
67
67
|
|
|
68
68
|
duet is not open-source software and installing it is not permission to use it: the copyright is Guidanti Inc.'s, all rights are reserved, and permission is granted individually and in writing. `license` is `UNLICENSED`, which is npm's own spelling for "no license is granted here" and is accurate rather than provisional. The terms are `LICENSE.md` and `NOTICE.md` in this package; the source repository is private, so ask for permission at min@guidanti.com rather than looking for an issue tracker.
|
|
69
69
|
|
|
70
|
-
**The distributions this release carries are published under their own terms, and those terms travel with their bytes.** Each one's notice files are inside the artifact above, at `duet-1.10.
|
|
70
|
+
**The distributions this release carries are published under their own terms, and those terms travel with their bytes.** Each one's notice files are inside the artifact above, at `duet-1.10.1.dist-info/licenses/<name>-<version>/`, and are named in that artifact's own `METADATA` as `License-File` beside duet's: an artifact that does not carry the notice its inventory records for a distribution does not verify and is not installed. They are their publishers' terms rather than a grant made here, and this package carries no second copy of them.
|
|
71
71
|
|
|
72
72
|
`docs/packaging.md` and `docs/launching.md` are the full documentation, in that private repository; this README and the files beside it are what travels with the package.
|
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"build_id": "
|
|
2
|
+
"build_id": "9218227709bec34d",
|
|
3
3
|
"dependencies": {
|
|
4
4
|
"carried_in": "duet/_dependencies",
|
|
5
5
|
"packages": [
|
|
@@ -45,12 +45,12 @@
|
|
|
45
45
|
"schema": 2,
|
|
46
46
|
"source": {
|
|
47
47
|
"clean": true,
|
|
48
|
-
"commit": "
|
|
48
|
+
"commit": "202dc31aa6ad76e22cb71d90fb5bdada29853dbe"
|
|
49
49
|
},
|
|
50
50
|
"verification": {
|
|
51
51
|
"contract": 2
|
|
52
52
|
},
|
|
53
|
-
"version": "1.10.
|
|
54
|
-
"wheel": "duet-1.10.
|
|
55
|
-
"wheel_sha256": "
|
|
53
|
+
"version": "1.10.1",
|
|
54
|
+
"wheel": "duet-1.10.1-py3-none-any.whl",
|
|
55
|
+
"wheel_sha256": "1b5e305170728c47ca4b1c335acd5f5ee5955cc3002330802d4274b119c43ff4"
|
|
56
56
|
}
|
package/bin/duet
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
|
-
# Generated by duet.npm for @guidanti/duet 1.10.
|
|
2
|
+
# Generated by duet.npm for @guidanti/duet 1.10.1.
|
|
3
3
|
#
|
|
4
4
|
# This is the whole of what npm puts on your PATH. It invokes no
|
|
5
5
|
# Node, no npm and no source checkout: it finds the managed
|
|
@@ -34,8 +34,8 @@ duet: there is no executable duet dispatcher at $dispatcher.
|
|
|
34
34
|
file is written. This message cannot tell you which of those
|
|
35
35
|
happened, and it says nothing about what is installed under
|
|
36
36
|
$root or which release is selected there.
|
|
37
|
-
Install or retry: npm install --global @guidanti/duet@1.10.
|
|
38
|
-
See why it failed: npm install --global @guidanti/duet@1.10.
|
|
37
|
+
Install or retry: npm install --global @guidanti/duet@1.10.1 --allow-scripts=@guidanti/duet
|
|
38
|
+
See why it failed: npm install --global @guidanti/duet@1.10.1 --allow-scripts=@guidanti/duet --foreground-scripts
|
|
39
39
|
If scripts are off: npm config get ignore-scripts
|
|
40
40
|
Run setup by hand: /bin/sh "$here/lib/setup.sh"
|
|
41
41
|
A successful setup installs this package's release and makes it
|
|
@@ -55,14 +55,14 @@ set_up_here() {
|
|
|
55
55
|
[ -f "$1" ] || return 1
|
|
56
56
|
while IFS= read -r line; do
|
|
57
57
|
case "$line" in
|
|
58
|
-
*'"wheel_sha256": "
|
|
58
|
+
*'"wheel_sha256": "1b5e305170728c47ca4b1c335acd5f5ee5955cc3002330802d4274b119c43ff4"'*) return 0 ;;
|
|
59
59
|
esac
|
|
60
60
|
done < "$1"
|
|
61
61
|
return 1
|
|
62
62
|
}
|
|
63
63
|
if ! set_up_here "$root/npm.json"; then
|
|
64
64
|
cat >&2 <<INCOMPLETE
|
|
65
|
-
duet: @guidanti/duet 1.10.
|
|
65
|
+
duet: @guidanti/duet 1.10.1 is installed and no setup record under
|
|
66
66
|
$root names the artifact it carries.
|
|
67
67
|
That record names the one artifact its own setup installed, so
|
|
68
68
|
this reads the same whether none has been written here, a setup
|
|
@@ -75,8 +75,8 @@ duet: @guidanti/duet 1.10.0 is installed and no setup record under
|
|
|
75
75
|
dispatcher decides that from the pin of the run you named and the
|
|
76
76
|
selected default, and every run still reaches the build it was
|
|
77
77
|
started on.
|
|
78
|
-
Retry the setup: npm install --global @guidanti/duet@1.10.
|
|
79
|
-
See why it failed: npm install --global @guidanti/duet@1.10.
|
|
78
|
+
Retry the setup: npm install --global @guidanti/duet@1.10.1 --allow-scripts=@guidanti/duet
|
|
79
|
+
See why it failed: npm install --global @guidanti/duet@1.10.1 --allow-scripts=@guidanti/duet --foreground-scripts
|
|
80
80
|
If scripts are off: npm config get ignore-scripts
|
|
81
81
|
Run setup by hand: /bin/sh "$here/lib/setup.sh"
|
|
82
82
|
npm runs no install script for a package it decides is already up
|
package/duet-npm.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"artifact": {
|
|
3
|
-
"build_id": "
|
|
3
|
+
"build_id": "9218227709bec34d",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"carried_in": "duet/_dependencies",
|
|
6
6
|
"packages": [
|
|
@@ -42,23 +42,23 @@
|
|
|
42
42
|
"schema": 1,
|
|
43
43
|
"unpacked": false
|
|
44
44
|
},
|
|
45
|
-
"sidecar": "duet-1.10.
|
|
45
|
+
"sidecar": "duet-1.10.1.artifact.json",
|
|
46
46
|
"verification": {
|
|
47
47
|
"contract": 2
|
|
48
48
|
},
|
|
49
|
-
"wheel": "duet-1.10.
|
|
50
|
-
"wheel_sha256": "
|
|
49
|
+
"wheel": "duet-1.10.1-py3-none-any.whl",
|
|
50
|
+
"wheel_sha256": "1b5e305170728c47ca4b1c335acd5f5ee5955cc3002330802d4274b119c43ff4"
|
|
51
51
|
},
|
|
52
52
|
"contents": {
|
|
53
53
|
"LICENSE.md": "16f67dce425dbd3ff2c85bb92325d5b0a8b0e230e8813f1120ee1e1f330ddbfa",
|
|
54
54
|
"NOTICE.md": "1045e33f6939d1f23b4763f09ab8a5235df15f7be341dca673b05c45654eddeb",
|
|
55
|
-
"README.md": "
|
|
56
|
-
"artifact/duet-1.10.
|
|
57
|
-
"artifact/duet-1.10.
|
|
58
|
-
"bin/duet": "
|
|
59
|
-
"lib/setup.py": "
|
|
60
|
-
"lib/setup.sh": "
|
|
61
|
-
"package.json": "
|
|
55
|
+
"README.md": "34247fdc022c610bb2ab7a4d4997488b19d458bec30773dbb3eec5f497606b4a",
|
|
56
|
+
"artifact/duet-1.10.1-py3-none-any.whl": "1b5e305170728c47ca4b1c335acd5f5ee5955cc3002330802d4274b119c43ff4",
|
|
57
|
+
"artifact/duet-1.10.1.artifact.json": "2e8bff96a126da072ce496fb6e880481a3f102b2b9307247edb39ed341c94dbc",
|
|
58
|
+
"bin/duet": "328703ffd11b0e3f2c8eee9bddf74039edece61bc11efa18a2d51285ab14863c",
|
|
59
|
+
"lib/setup.py": "22d9f3aecf1b057cc514be147b1fbb3c90b095ca236301da14c2f11afe3b2bbf",
|
|
60
|
+
"lib/setup.sh": "334343397f02054b452bf21c7572e1470bfcb27cfa56a70ec68ad3edfa7f1d01",
|
|
61
|
+
"package.json": "369ed60ac5704216793d02d80cab40182c310b85e87bcc77af6be35c06d9b2ea"
|
|
62
62
|
},
|
|
63
63
|
"notices": [
|
|
64
64
|
"LICENSE.md",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"schema": 1,
|
|
69
69
|
"source": {
|
|
70
70
|
"clean": true,
|
|
71
|
-
"commit": "
|
|
71
|
+
"commit": "202dc31aa6ad76e22cb71d90fb5bdada29853dbe"
|
|
72
72
|
},
|
|
73
|
-
"version": "1.10.
|
|
73
|
+
"version": "1.10.1"
|
|
74
74
|
}
|
package/lib/setup.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Generated by duet.npm for @guidanti/duet 1.10.
|
|
1
|
+
"""Generated by duet.npm for @guidanti/duet 1.10.1.
|
|
2
2
|
|
|
3
3
|
The install script's Python half: check the bundled artifact against
|
|
4
4
|
the digest this file was generated with, import the installer out of
|
|
@@ -12,12 +12,12 @@ import os
|
|
|
12
12
|
import sys
|
|
13
13
|
|
|
14
14
|
PACKAGE = '@guidanti/duet'
|
|
15
|
-
PACKAGE_VERSION = '1.10.
|
|
15
|
+
PACKAGE_VERSION = '1.10.1'
|
|
16
16
|
HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
17
|
-
WHEEL = os.path.join(HERE, 'artifact', 'duet-1.10.
|
|
18
|
-
SIDECAR = os.path.join(HERE, 'artifact', 'duet-1.10.
|
|
19
|
-
WHEEL_SHA256 = '
|
|
20
|
-
REINSTALL = ('The files in this installed package are not the ones it was published with, and npm runs nothing for a package it decides is already up to date. Remove it and install it again:', ' npm uninstall --global @guidanti/duet', ' npm install --global @guidanti/duet@1.10.
|
|
17
|
+
WHEEL = os.path.join(HERE, 'artifact', 'duet-1.10.1-py3-none-any.whl')
|
|
18
|
+
SIDECAR = os.path.join(HERE, 'artifact', 'duet-1.10.1.artifact.json')
|
|
19
|
+
WHEEL_SHA256 = '1b5e305170728c47ca4b1c335acd5f5ee5955cc3002330802d4274b119c43ff4'
|
|
20
|
+
REINSTALL = ('The files in this installed package are not the ones it was published with, and npm runs nothing for a package it decides is already up to date. Remove it and install it again:', ' npm uninstall --global @guidanti/duet', ' npm install --global @guidanti/duet@1.10.1 --allow-scripts=@guidanti/duet', "That install names this package's own version, so a release you installed deliberately is the release you get back.", 'That uninstall takes this package and the duet npm linked onto your PATH. It takes nothing under ~/.duet: every managed runtime, every run and every piece of evidence stays where it is.')
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def refuse(message, *lines):
|
package/lib/setup.sh
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/bin/sh
|
|
2
|
-
# Generated by duet.npm for @guidanti/duet 1.10.
|
|
2
|
+
# Generated by duet.npm for @guidanti/duet 1.10.1.
|
|
3
3
|
#
|
|
4
4
|
# npm runs this once, after it has unpacked the package. It finds an
|
|
5
5
|
# interpreter that can run the installer and hands over to it; the
|
|
@@ -66,7 +66,7 @@ duet: DUET_SETUP_PYTHON names $DUET_SETUP_PYTHON, which duet will not run as an
|
|
|
66
66
|
Install Python from https://www.python.org/downloads/macos/
|
|
67
67
|
An explicit interpreter is an instruction, so duet does not look elsewhere when it is unusable.
|
|
68
68
|
Nothing was installed and nothing was selected. Unset it or name another, then run:
|
|
69
|
-
npm install --global @guidanti/duet@1.10.
|
|
69
|
+
npm install --global @guidanti/duet@1.10.1 --allow-scripts=@guidanti/duet
|
|
70
70
|
npm runs no install script for a package it decides is already up to date, so that install can do nothing at all. While this package is installed, its own setup script always runs setup, for the release it carries:
|
|
71
71
|
/bin/sh "$here/lib/setup.sh"
|
|
72
72
|
OVERRIDE
|
|
@@ -109,8 +109,8 @@ if [ -z "$found" ]; then
|
|
|
109
109
|
duet: no usable Python was found, and duet does not install one.
|
|
110
110
|
duet needs CPython >=3.9 on macOS (arm64), able to create a virtual environment.
|
|
111
111
|
Install Python from https://www.python.org/downloads/macos/
|
|
112
|
-
Then run: npm install --global @guidanti/duet@1.10.
|
|
113
|
-
Or name one yourself: DUET_SETUP_PYTHON=/path/to/python3 npm install --global @guidanti/duet@1.10.
|
|
112
|
+
Then run: npm install --global @guidanti/duet@1.10.1 --allow-scripts=@guidanti/duet
|
|
113
|
+
Or name one yourself: DUET_SETUP_PYTHON=/path/to/python3 npm install --global @guidanti/duet@1.10.1 --allow-scripts=@guidanti/duet
|
|
114
114
|
npm runs no install script for a package it decides is already up to date, so that install can do nothing at all. While this package is installed, its own setup script always runs setup, for the release it carries:
|
|
115
115
|
/bin/sh "$(npm root -g)/@guidanti/duet/lib/setup.sh"
|
|
116
116
|
Nothing was installed, nothing was selected, and no existing duet installation was changed.
|
package/package.json
CHANGED