@guidanti/duet 1.9.0 → 1.10.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/LICENSE.md CHANGED
@@ -36,7 +36,7 @@ Stating a reservation of rights is not a claim to control everything adjacent to
36
36
 
37
37
  ## 5. External software
38
38
 
39
- duet bundles no third-party code. It needs a Python interpreter, Git and the vendor CLIs it drives, and it installs, bundles and redistributes none of them -- see [NOTICE.md](NOTICE.md) for what that means for each of them and whose terms govern them.
39
+ duet bundles third-party code: four pure-Python wheels -- rich, markdown-it-py, mdurl and pygments, at the exact versions pinned in `src/duet/dependencies.json` -- travel inside the wheel the npm package carries, and each of them is published by its own copyright holder under its own terms, MIT or BSD-2-Clause. Those terms travel inside the bytes that carry them, and this file neither grants, restricts nor speaks for anything in them: the rights reserved above are the rights in duet's own code, and "duet" in clause 1 does not mean the distributions it bundles. duet also needs a Python interpreter, Git and the vendor CLIs it drives, and it installs, bundles and redistributes none of those. See [NOTICE.md](NOTICE.md) for the pinned set, where each distribution's notices travel, and whose terms govern each external program.
40
40
 
41
41
  ## 6. No warranty, and no liability
42
42
 
@@ -48,4 +48,4 @@ Licensing enquiries: **min@guidanti.com**. [Permission to use duet](docs/licensi
48
48
 
49
49
  ---
50
50
 
51
- **Review status: approved.** This wording was **revised on 2026-10-08** to carry the owner's decisions -- the repository stays private, Guidanti Inc. owns the existing code, Ontario and Canada govern the grant, contributions are internal only, and min@guidanti.com is the published contact -- and **corrected the same day**, because clause 2 described the private repository as meaning duet's source is not distributed and the public package's wheel is readable Python source. The owner was shown those corrected terms and **approved them on 2026-10-08**, naming the exact bytes: sha256 `41d8a0763b603eafe24d5d9605167299bfc03d52cd01c9add56c8b5a843ad9e7` for this file and `23f7ea74c9f7afc9c96baaf268136b73200fc9f8d0937ba92f5991cee1726d10` for [NOTICE.md](NOTICE.md). Clauses 1 to 7 above are unchanged by this note and are the approved text; what changed after the approval is this paragraph, which is why the file no longer hashes to the digest the approval names. A change to any clause would be a new approval and a different build identity. A distribution under these terms has now happened: the authorized `0.0.x` publication rehearsal put `@guidanti/duet` on npm carrying this file, and no release of duet has been published.
51
+ **Review status: approved on 2026-10-08; clause 5 has been corrected since and is not covered by that approval.** This wording was **revised on 2026-10-08** to carry the owner's decisions -- the repository stays private, Guidanti Inc. owns the existing code, Ontario and Canada govern the grant, contributions are internal only, and min@guidanti.com is the published contact -- and **corrected the same day**, because clause 2 described the private repository as meaning duet's source is not distributed and the public package's wheel is readable Python source. The owner was shown those corrected terms and **approved them on 2026-10-08**, naming the exact bytes: sha256 `41d8a0763b603eafe24d5d9605167299bfc03d52cd01c9add56c8b5a843ad9e7` for this file and `23f7ea74c9f7afc9c96baaf268136b73200fc9f8d0937ba92f5991cee1726d10` for [NOTICE.md](NOTICE.md). Clauses 1 to 4, 6 and 7 above are unchanged since that approval and are the approved text. **Clause 5 is not**: it said duet bundles no third-party code, duet now distributes the four pinned wheels [NOTICE.md](NOTICE.md) names, and the clause was corrected to describe what is actually distributed and whose terms govern it. That correction states a fact and makes no licensing decision -- the ownership, the distribution decisions, the route to permission, the governing law, the contribution position and the warranty and liability clauses are as the owner decided and approved them -- and **it claims no approval**: a changed clause is a new approval and a different build identity, so the owner's review of this wording is a prerequisite of publishing a release that carries that payload, and the digests named above are the earlier bytes rather than these. This paragraph is the other reason the file does not hash to the digest the approval names. A distribution under these terms has now happened: the authorized `0.0.x` publication rehearsal put `@guidanti/duet` on npm carrying this file as it stood then, with clause 5 as the approval named it, and no release of duet has been published.
package/NOTICE.md CHANGED
@@ -2,11 +2,24 @@
2
2
 
3
3
  Copyright © 2026 Guidanti Inc. All rights reserved. The terms are in [LICENSE.md](LICENSE.md); this file is the third-party notice that travels beside them.
4
4
 
5
- ## duet bundles no third-party code
5
+ ## The third-party code duet bundles
6
6
 
7
- Every byte duet distributes is its own. The wheel holds the `duet` package and its own metadata and nothing else: `pyproject.toml` declares an empty dependency list, the test suite re-derives that list from the package's own imports so adding a dependency fails there rather than quietly becoming part of the installation, and `duet install --artifact` refuses an artifact that declares any `Requires-Dist` at all. The generated `@guidanti/duet` npm package is assembled from an explicit allowlist -- a launcher, an install script, a bootstrap, that same wheel, its record, a generated manifest and README, and these notices -- with no dependencies and nothing taken from a checkout. Nothing is downloaded by an installation of duet, at any point.
7
+ **duet distributes four third-party wheels, and each distribution's own terms travel inside the bytes that carry it.** The set is Rich and the distributions Rich requires, each pinned to one version, length and sha256 in `src/duet/dependencies.json`. That inventory is the only list of them: `pyproject.toml` declares `dependencies` dynamic and `setup.py` renders the exact `==` pins from it, a managed build writes those same pins into the artifact's `Requires-Dist`, and `duet install --artifact` refuses an artifact whose metadata, carried wheels and own inventory are not one agreeing set.
8
8
 
9
- So there is no vendored library here, no statically linked component, and no accompanying licence text that a redistribution would have to carry. If that ever changes, the component and its terms belong in this file and in the packaging allowlists that carry it.
9
+ | Distribution | Version | Whose terms govern | Where its notices travel |
10
+ | --- | --- | --- | --- |
11
+ | [rich](https://pypi.org/project/rich/15.0.0/) | 15.0.0 | its publishers', under MIT | `duet-<version>.dist-info/licenses/rich-15.0.0/` |
12
+ | [markdown-it-py](https://pypi.org/project/markdown-it-py/3.0.0/) | 3.0.0 | its publishers', under MIT | `duet-<version>.dist-info/licenses/markdown-it-py-3.0.0/` |
13
+ | [mdurl](https://pypi.org/project/mdurl/0.1.2/) | 0.1.2 | its publishers', under MIT | `duet-<version>.dist-info/licenses/mdurl-0.1.2/` |
14
+ | [pygments](https://pypi.org/project/pygments/2.21.0/) | 2.21.0 | its publishers', under BSD-2-Clause | `duet-<version>.dist-info/licenses/pygments-2.21.0/` |
15
+
16
+ Those are their own copyright holders' terms, and nothing in [LICENSE.md](LICENSE.md) adds to them, narrows them or speaks for them. Their notice files are not retyped here: a build reads each one out of the wheel whose bytes it has just held to the pinned length and digest, carries it at the path in the table, and names it in the wheel's `METADATA` as a `License-File` beside duet's own -- so what is redistributed is each publisher's own file, and an artifact that does not carry a notice its inventory records for a distribution does not verify and is not installed.
17
+
18
+ **Where those bytes are, and what carries them.** The four wheels are members of duet's own wheel, at `duet/_dependencies/<wheel>`, so one artifact is the whole of what a release distributes. The generated `@guidanti/duet` npm package is assembled from an explicit allowlist -- a launcher, an install script, a bootstrap, that wheel, its record, a generated manifest and README, and these notices -- and it carries the payload and the carried distributions' notices because they are inside the wheel the allowlist already names, with nothing taken from a checkout. The package itself declares no npm dependencies, and nothing in it runs under Node. Setup unpacks the carried wheels into the managed runtime's own environment: an npm installation, `duet install --artifact`, a restoration and an ordinary command resolve no version and download no package.
19
+
20
+ **One route does download them, and it is not a release's.** An ordinary `pip install .` resolves `pyproject.toml`'s dependency list -- those same exact pins -- from whatever index you point pip at, into an environment you chose, under pip's integrity checks rather than duet's. duet neither creates nor records that environment and makes no claim about the bytes pip put in it.
21
+
22
+ One duet module imports one of the carried distributions -- `src/duet/live.py` imports Rich, for the live row it draws while a turn runs -- and no other module imports anything outside the standard library; nothing compares what duet imports with that inventory. So a change to the set is an edit to the inventory, a re-run of `tools/prepare_dependencies.py`, and a revision of this file -- by hand, because no check here derives one from the other.
10
23
 
11
24
  ## What duet needs, and does not distribute
12
25
 
@@ -32,4 +45,4 @@ duet drives model providers, and what a provider's model writes into a report, a
32
45
 
33
46
  ---
34
47
 
35
- **Review status: approved.** Revised with [LICENSE.md](LICENSE.md) on 2026-10-08 under the owner's decisions and **approved the same day**, by sha256 `23f7ea74c9f7afc9c96baaf268136b73200fc9f8d0937ba92f5991cee1726d10`, which is this file as it stood when the approval was recorded. Everything above this note is the approved text and is unchanged by it; this paragraph is what moved the digest afterwards. Nothing else in this file has ever changed: duet still bundles no third-party code, so the decisions about distribution, jurisdiction, contributions and contact touch the terms rather than the notices. The account of the approval is in [permission to use duet](docs/licensing.md#what-the-owner-decided-and-what-that-settled).
48
+ **Review status: approved on 2026-10-08; the third-party section has been corrected since and is not covered by that approval.** This file was revised with [LICENSE.md](LICENSE.md) on 2026-10-08 under the owner's decisions and **approved the same day**, by sha256 `23f7ea74c9f7afc9c96baaf268136b73200fc9f8d0937ba92f5991cee1726d10`, which is this file as it stood when the approval was recorded; the account of that approval is in [permission to use duet](docs/licensing.md#what-the-owner-decided-and-what-that-settled). What has changed since is the section on third-party code, and it changed as a statement of fact: duet began distributing the four pinned wheels, the approved text said it distributed none, and an approval of earlier bytes is not a reason to go on publishing an inaccurate notice. **No new approval is claimed here.** The owner's decisions are untouched by that correction -- the copyright holder, what is distributed where, the governing law, the contribution position and the published address are [LICENSE.md](LICENSE.md)'s and are unchanged -- and the corrected wording is awaiting the owner's review, which [the activation checklist](docs/release-publication.md#the-activation-checklist) carries as a prerequisite of publishing a release carrying that payload. The sections on the external programs duet runs, the contributor tooling and the agents' own output are the approved text, unchanged.
package/README.md CHANGED
@@ -18,6 +18,8 @@ The install command below carries `--allow-scripts=@guidanti/duet`, and that all
18
18
  npm install --global @guidanti/duet --allow-scripts=@guidanti/duet
19
19
  ```
20
20
 
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
+
21
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 which release is installed, whether it is still the build it says it is, and whether it is the default. It reports an activation only where `default.json` says so and that release is intact: a zero npm status is not one. It takes no version or tag, so installing a named release stays the npm command above with `@<version>` in it.
22
24
 
23
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.
@@ -40,7 +42,7 @@ Setup also creates six starter instruction files under `~/.duet/instructions/`,
40
42
 
41
43
  ## What your runtimes are called
42
44
 
43
- A managed runtime is named by the version it publishes: `~/.duet/installations/1.9.0/`. 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`, `duet status --installations`, and `duet select` listing what is there, interactively on a terminal and read-only under `--json`).
45
+ A managed runtime is named by the version it publishes: `~/.duet/installations/1.10.0/`. 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`).
44
46
 
45
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.
46
48
 
@@ -56,12 +58,15 @@ That removes this package and the `duet` npm linked onto your PATH. It removes n
56
58
 
57
59
  ## This build
58
60
 
59
- - version `1.9.0`, build `00bad774e066ab13`
60
- - artifact `duet-1.9.0-py3-none-any.whl`
61
- - `sha256=126f6a3b8139990f2ac0008947c0417ff92b5e45558f9d0d7f35525816897f26`
61
+ - version `1.10.0`, build `2f5e084fa87940f2`
62
+ - artifact `duet-1.10.0-py3-none-any.whl`
63
+ - `sha256=1eb946c64874ed78190b8959a4873fca48a694670446dd6cb2b5639120c63112`
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
62
65
 
63
66
  ## Permission to use duet
64
67
 
65
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.
66
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.0.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
+
67
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.
@@ -0,0 +1,56 @@
1
+ {
2
+ "build_id": "2f5e084fa87940f2",
3
+ "dependencies": {
4
+ "carried_in": "duet/_dependencies",
5
+ "packages": [
6
+ {
7
+ "name": "markdown-it-py",
8
+ "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
9
+ "size": 87528,
10
+ "version": "3.0.0",
11
+ "wheel": "markdown_it_py-3.0.0-py3-none-any.whl"
12
+ },
13
+ {
14
+ "name": "mdurl",
15
+ "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
16
+ "size": 9979,
17
+ "version": "0.1.2",
18
+ "wheel": "mdurl-0.1.2-py3-none-any.whl"
19
+ },
20
+ {
21
+ "name": "pygments",
22
+ "sha256": "2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9",
23
+ "size": 1250147,
24
+ "version": "2.21.0",
25
+ "wheel": "pygments-2.21.0-py3-none-any.whl"
26
+ },
27
+ {
28
+ "name": "rich",
29
+ "sha256": "33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb",
30
+ "size": 310654,
31
+ "version": "15.0.0",
32
+ "wheel": "rich-15.0.0-py3-none-any.whl"
33
+ }
34
+ ],
35
+ "requires": [
36
+ "markdown-it-py==3.0.0",
37
+ "mdurl==0.1.2",
38
+ "pygments==2.21.0",
39
+ "rich==15.0.0"
40
+ ],
41
+ "schema": 1,
42
+ "unpacked": false
43
+ },
44
+ "name": "duet",
45
+ "schema": 2,
46
+ "source": {
47
+ "clean": true,
48
+ "commit": "57e555292a538374065a602d7186daea32e1a00f"
49
+ },
50
+ "verification": {
51
+ "contract": 2
52
+ },
53
+ "version": "1.10.0",
54
+ "wheel": "duet-1.10.0-py3-none-any.whl",
55
+ "wheel_sha256": "1eb946c64874ed78190b8959a4873fca48a694670446dd6cb2b5639120c63112"
56
+ }
package/bin/duet CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/bin/sh
2
- # Generated by duet.npm for @guidanti/duet 1.9.0.
2
+ # Generated by duet.npm for @guidanti/duet 1.10.0.
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.9.0 --allow-scripts=@guidanti/duet
38
- See why it failed: npm install --global @guidanti/duet@1.9.0 --allow-scripts=@guidanti/duet --foreground-scripts
37
+ Install or retry: npm install --global @guidanti/duet@1.10.0 --allow-scripts=@guidanti/duet
38
+ See why it failed: npm install --global @guidanti/duet@1.10.0 --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": "126f6a3b8139990f2ac0008947c0417ff92b5e45558f9d0d7f35525816897f26"'*) return 0 ;;
58
+ *'"wheel_sha256": "1eb946c64874ed78190b8959a4873fca48a694670446dd6cb2b5639120c63112"'*) 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.9.0 is installed and no setup record under
65
+ duet: @guidanti/duet 1.10.0 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.9.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.9.0 --allow-scripts=@guidanti/duet
79
- See why it failed: npm install --global @guidanti/duet@1.9.0 --allow-scripts=@guidanti/duet --foreground-scripts
78
+ Retry the setup: npm install --global @guidanti/duet@1.10.0 --allow-scripts=@guidanti/duet
79
+ See why it failed: npm install --global @guidanti/duet@1.10.0 --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,23 +1,64 @@
1
1
  {
2
2
  "artifact": {
3
- "build_id": "00bad774e066ab13",
4
- "sidecar": "duet-1.9.0.artifact.json",
3
+ "build_id": "2f5e084fa87940f2",
4
+ "dependencies": {
5
+ "carried_in": "duet/_dependencies",
6
+ "packages": [
7
+ {
8
+ "name": "markdown-it-py",
9
+ "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
10
+ "size": 87528,
11
+ "version": "3.0.0",
12
+ "wheel": "markdown_it_py-3.0.0-py3-none-any.whl"
13
+ },
14
+ {
15
+ "name": "mdurl",
16
+ "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
17
+ "size": 9979,
18
+ "version": "0.1.2",
19
+ "wheel": "mdurl-0.1.2-py3-none-any.whl"
20
+ },
21
+ {
22
+ "name": "pygments",
23
+ "sha256": "2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9",
24
+ "size": 1250147,
25
+ "version": "2.21.0",
26
+ "wheel": "pygments-2.21.0-py3-none-any.whl"
27
+ },
28
+ {
29
+ "name": "rich",
30
+ "sha256": "33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb",
31
+ "size": 310654,
32
+ "version": "15.0.0",
33
+ "wheel": "rich-15.0.0-py3-none-any.whl"
34
+ }
35
+ ],
36
+ "requires": [
37
+ "markdown-it-py==3.0.0",
38
+ "mdurl==0.1.2",
39
+ "pygments==2.21.0",
40
+ "rich==15.0.0"
41
+ ],
42
+ "schema": 1,
43
+ "unpacked": false
44
+ },
45
+ "sidecar": "duet-1.10.0.artifact.json",
5
46
  "verification": {
6
47
  "contract": 2
7
48
  },
8
- "wheel": "duet-1.9.0-py3-none-any.whl",
9
- "wheel_sha256": "126f6a3b8139990f2ac0008947c0417ff92b5e45558f9d0d7f35525816897f26"
49
+ "wheel": "duet-1.10.0-py3-none-any.whl",
50
+ "wheel_sha256": "1eb946c64874ed78190b8959a4873fca48a694670446dd6cb2b5639120c63112"
10
51
  },
11
52
  "contents": {
12
- "LICENSE.md": "cbc7853b308655c45a049a2c8c53c0a5e556cee29229d80209cbe82a896b1d0e",
13
- "NOTICE.md": "8cf095fd1e5abc0c29634b010890189a9a8a340f96358db93635650dbdf5ed89",
14
- "README.md": "dd80dc22bce122ca3f5af3d2afd9242f634d1db1f41a003ae38f22a21c8b768c",
15
- "artifact/duet-1.9.0-py3-none-any.whl": "126f6a3b8139990f2ac0008947c0417ff92b5e45558f9d0d7f35525816897f26",
16
- "artifact/duet-1.9.0.artifact.json": "084e7f915434f5ac70e9775fb077aa2bb7e18429a665bc90b00f7c647d53d8ee",
17
- "bin/duet": "67c43a86457b9c38abd6f0a9e33b4bf2f2b78ffce0d59dcc5c17445dc0d318b3",
18
- "lib/setup.py": "cb1e1efde7ec58dd14b2eb73097391858a063ffafdf5e362df3a901bc170795f",
19
- "lib/setup.sh": "8b86b06c2c9e683a791b7e284ce1cdfc883e88c0defb39f7e471839d5397b396",
20
- "package.json": "d8b7cd0fb9351cf1767ae4518ca77fc87679d40dcdc61305e3db7ea0ad148849"
53
+ "LICENSE.md": "16f67dce425dbd3ff2c85bb92325d5b0a8b0e230e8813f1120ee1e1f330ddbfa",
54
+ "NOTICE.md": "1045e33f6939d1f23b4763f09ab8a5235df15f7be341dca673b05c45654eddeb",
55
+ "README.md": "3ee7232880a07fceedafb58e1d4039911f629af2dc071525e074bc4d2c54a32e",
56
+ "artifact/duet-1.10.0-py3-none-any.whl": "1eb946c64874ed78190b8959a4873fca48a694670446dd6cb2b5639120c63112",
57
+ "artifact/duet-1.10.0.artifact.json": "21d0284fc7e4ec48a66cb2f6e8c44afc68f8c18f4e79c538fdf0f7aa112a1d12",
58
+ "bin/duet": "542dc62ec7b04f9748785e1acb3966621f196a75f0e49878228bc7982a44be73",
59
+ "lib/setup.py": "cb237a13ea3ed263530a78ba3a030bc9aeff3d73ce057121d081400a9bcf8522",
60
+ "lib/setup.sh": "6e5617978d97e380e212d9206a03587141ba135f5d2ef3ee0dfd9c57b671d831",
61
+ "package.json": "5684ae9684f94b07ae90a45eedb08bea9643163e158fc5af9628508dfe67f8c8"
21
62
  },
22
63
  "notices": [
23
64
  "LICENSE.md",
@@ -27,7 +68,7 @@
27
68
  "schema": 1,
28
69
  "source": {
29
70
  "clean": true,
30
- "commit": "6bb9a3be09ef3fff1846c4a65ce495c893f96fec"
71
+ "commit": "57e555292a538374065a602d7186daea32e1a00f"
31
72
  },
32
- "version": "1.9.0"
73
+ "version": "1.10.0"
33
74
  }
package/lib/setup.py CHANGED
@@ -1,21 +1,23 @@
1
- """Generated by duet.npm for @guidanti/duet 1.9.0.
1
+ """Generated by duet.npm for @guidanti/duet 1.10.0.
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
5
- those same bytes, and run it. Nothing here verifies an artifact
6
- itself or creates an environment."""
5
+ those same bytes, and run it. That digest covers the whole artifact,
6
+ the pinned dependency wheels inside it included, so there is nothing
7
+ beside it to check here and nothing to fetch. Nothing here verifies
8
+ an artifact itself or creates an environment."""
7
9
 
8
10
  import hashlib
9
11
  import os
10
12
  import sys
11
13
 
12
14
  PACKAGE = '@guidanti/duet'
13
- PACKAGE_VERSION = '1.9.0'
15
+ PACKAGE_VERSION = '1.10.0'
14
16
  HERE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
15
- WHEEL = os.path.join(HERE, 'artifact', 'duet-1.9.0-py3-none-any.whl')
16
- SIDECAR = os.path.join(HERE, 'artifact', 'duet-1.9.0.artifact.json')
17
- WHEEL_SHA256 = '126f6a3b8139990f2ac0008947c0417ff92b5e45558f9d0d7f35525816897f26'
18
- 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.9.0 --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.')
17
+ WHEEL = os.path.join(HERE, 'artifact', 'duet-1.10.0-py3-none-any.whl')
18
+ SIDECAR = os.path.join(HERE, 'artifact', 'duet-1.10.0.artifact.json')
19
+ WHEEL_SHA256 = '1eb946c64874ed78190b8959a4873fca48a694670446dd6cb2b5639120c63112'
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.0 --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.')
19
21
 
20
22
 
21
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.9.0.
2
+ # Generated by duet.npm for @guidanti/duet 1.10.0.
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.9.0 --allow-scripts=@guidanti/duet
69
+ npm install --global @guidanti/duet@1.10.0 --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.9.0 --allow-scripts=@guidanti/duet
113
- Or name one yourself: DUET_SETUP_PYTHON=/path/to/python3 npm install --global @guidanti/duet@1.9.0 --allow-scripts=@guidanti/duet
112
+ Then run: npm install --global @guidanti/duet@1.10.0 --allow-scripts=@guidanti/duet
113
+ Or name one yourself: DUET_SETUP_PYTHON=/path/to/python3 npm install --global @guidanti/duet@1.10.0 --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
@@ -23,5 +23,5 @@
23
23
  "scripts": {
24
24
  "postinstall": "/bin/sh lib/setup.sh"
25
25
  },
26
- "version": "1.9.0"
26
+ "version": "1.10.0"
27
27
  }
@@ -1,15 +0,0 @@
1
- {
2
- "build_id": "00bad774e066ab13",
3
- "name": "duet",
4
- "schema": 1,
5
- "source": {
6
- "clean": true,
7
- "commit": "6bb9a3be09ef3fff1846c4a65ce495c893f96fec"
8
- },
9
- "verification": {
10
- "contract": 2
11
- },
12
- "version": "1.9.0",
13
- "wheel": "duet-1.9.0-py3-none-any.whl",
14
- "wheel_sha256": "126f6a3b8139990f2ac0008947c0417ff92b5e45558f9d0d7f35525816897f26"
15
- }