@azure-id/orc 0.55.2 → 0.56.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 CHANGED
@@ -10,6 +10,81 @@ Format: `### v<version> — <title> _(<date>)_`.
10
10
 
11
11
  ---
12
12
 
13
+ ### v0.56.0 - a rename moved the command, and nobody could reach the fix _(2026-08-27)_
14
+
15
+ **READ THIS FIRST IF YOUR `orc upgrade` IS FAILING.** If you are on a version
16
+ before v0.56.0, this release cannot install itself - your `orc upgrade` is the
17
+ OLD one and it fails the same way every other route does. Run these three lines
18
+ once, by hand, and you are across for good:
19
+
20
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
21
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
22
+ - **Step 3 - re-apply it to your project:** `orc update` (add `--global` to also
23
+ refresh `~/.claude`)
24
+
25
+ Then check it worked: `orc version` should print 0.56.0 or newer, and
26
+ `orc doctor` should no longer mention `legacy-global-package`. Nothing in your
27
+ `.claude/` is touched by any of this, and your `orc.config.yaml` survives.
28
+ **Do not use `npm i -g -f`** - `--force` overwrites the command file and leaves
29
+ the old package installed underneath, owning nothing and never updated again.
30
+ From v0.56.0 onward `orc upgrade` does all three steps for you, announced.
31
+
32
+ **The package moved from the unscoped `orc` to `@azure-id/orc`, and every
33
+ upgrade path in the field died at once.** Both names declare the same `orc` bin.
34
+ npm links a bin only if the shim is unowned or owned by the installing package,
35
+ so with the old `orc` package still on disk globally, installing the new scoped
36
+ one failed with `EEXIST` on the command file itself. That error is about a FILE,
37
+ not a source - which is exactly why swapping sources changed nothing: the
38
+ tarball, the `github:` spec and the registry all failed identically, `orc
39
+ upgrade` walked all three and then printed npm's error wall, and `orc ui`'s
40
+ upgrade action did the same. `npm i -g -f` was the only thing that "worked", and
41
+ only by overwriting the command file and leaving the superseded package
42
+ installed underneath as a ghost that owns nothing and is never updated again.
43
+
44
+ - **The legacy package is EVICTED BEFORE any source is tried.** `orc upgrade`
45
+ now looks for a globally-installed package that is not this one and whose
46
+ `bin` declares `orc`, and uninstalls it first. Ordering is the point: the
47
+ collision fails every source identically, so walking the ladder first only
48
+ spends three network round trips arriving at the same `EEXIST`. It is
49
+ announced, never silent - it is a global npm mutation on the user's machine,
50
+ and the only one ORC makes for them.
51
+ - **Detection is by OWNERSHIP, never by directory name.** A directory called
52
+ `orc` that holds THIS package is not legacy, and a package that declares no
53
+ `orc` bin blocks nothing. A machine that never saw the rename land must not
54
+ have its working install uninstalled.
55
+ - **`--force` survives, scoped to the one case it is right for.** If a
56
+ collision remains after the eviction there was nothing to uninstall - an
57
+ ORPHANED shim npm left behind with no package owning it. `--force` overwrites
58
+ a file that belongs to nobody, which is the case it exists for.
59
+ `isBinShimCollision` requires the `EEXIST` code AND a path component that IS
60
+ the bin name, so it never reaches for `--force` on an unrelated `EEXIST`
61
+ deeper in a dependency tree.
62
+ - **The npm REGISTRY is now tried first**, then the tarball, then the `github:`
63
+ spec. The registry resolves a VERSION rather than a branch tip; the `github:`
64
+ spec shells out to git and fails under restricted git / NVM, so it stays last.
65
+ `--from` and `ORC_INSTALL_SPEC` still win outright, and the remembered
66
+ `last_good_spec` still leads.
67
+ - **`freshCliPath()` resolves the SCOPED directory first.** It looked only under
68
+ `<npm root -g>/orc`, which after the rename is the LEGACY package - so on a
69
+ machine mid-rename it resolved a path that existed and step 2 re-applied the
70
+ very templates step 1 had just superseded. A hit is now accepted only if the
71
+ manifest there says the current package name: a directory that exists is not
72
+ proof of identity.
73
+ - **`orc doctor` reports it by name.** `legacy-global-package` is the one
74
+ finding that explains why `orc upgrade` cannot fix anything else in the
75
+ report. It is deliberately NOT `--fix`-able: `orc doctor --fix` is scoped to
76
+ this project's `.claude/`, and evicting a global npm package is neither
77
+ project-scoped nor something to do without saying so - so its `fix_command`
78
+ points at `orc upgrade`, which does it announced. `FINDING_ROUTE` sends it to
79
+ Maintenance, where the upgrade action is.
80
+ - **A CAUTION at the top of the README carries the one-time manual fix**, because
81
+ the fix cannot reach the people who need it most: a user still on the old
82
+ package does not have this code, so their `orc upgrade` still fails. Two lines
83
+ (`npm uninstall -g orc` then `npm i -g @azure-id/orc`) get them across once,
84
+ and from here `orc upgrade` handles it.
85
+
86
+ ---
87
+
13
88
  ### v0.55.2 - a gate that is never probed is a gate that is always off _(2026-08-27)_
14
89
 
15
90
  **`/orc-quick` and `/orc-fast` documented the foreign-worker option and then