@kybernesis/create 0.24.0 → 0.24.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.
Files changed (2) hide show
  1. package/dist/upgrade.js +20 -1
  2. package/package.json +1 -1
package/dist/upgrade.js CHANGED
@@ -785,6 +785,12 @@ function newestBuildForEve(name, eve) {
785
785
  const candidates = [];
786
786
  for (const version of ordered) {
787
787
  const peer = targetEvePeer(name, version);
788
+ // A package whose newest build declares no eve peer at all (this CLI,
789
+ // @kybernesis/create) is not built per eve line: its newest is the answer.
790
+ // Without this, every agent that keeps kyb in its own package.json could
791
+ // never plan an upgrade (`kyb upgrade --check` reported it unresolved).
792
+ if (!peer && candidates.length === 0)
793
+ return version;
788
794
  candidates.push({ version, ...(peer ? { peer } : {}) });
789
795
  const hit = newestOnLine(candidates, eve);
790
796
  if (hit)
@@ -989,6 +995,10 @@ export async function upgrade(options = {}) {
989
995
  installedMajorMinor &&
990
996
  targetMajorMinor &&
991
997
  (installedMajorMinor[0] !== targetMajorMinor[0] || installedMajorMinor[1] !== targetMajorMinor[1]));
998
+ // eve already at the pin but saved as a range (an agent scaffolded before
999
+ // the pin was exact, or installed by hand): pin it in place. The version
1000
+ // does not move, so this is not a change to plan or approve.
1001
+ const loosePin = Boolean(eveTarget && eveInstalled === eveTarget && targets.some((target) => target.name === "eve" && target.currentRange !== eveTarget));
992
1002
  const changed = [...new Set(targets
993
1003
  .filter((target) => target.installedVersion !== target.targetVersion && !(target.name === "eve" && versionLt(target.targetVersion, target.installedVersion)))
994
1004
  .map((target) => `${target.name}@${target.targetVersion}`))];
@@ -1009,6 +1019,15 @@ export async function upgrade(options = {}) {
1009
1019
  }
1010
1020
  repairLocalQueueTimeouts(cwd, deps);
1011
1021
  if (changed.length === 0) {
1022
+ if (loosePin) {
1023
+ const pinned = commandResult("npm", ["install", "--save-exact", `eve@${eveTarget}`], cwd);
1024
+ if (pinned.status !== 0) {
1025
+ console.log(red(`\nCould not pin eve exactly to ${eveTarget}:\n${pinned.stderr.trim()}`));
1026
+ process.exitCode = 1;
1027
+ return;
1028
+ }
1029
+ console.log(` ${green("✓")} eve pinned exactly to ${eveTarget} ${dim("(was a range)")}`);
1030
+ }
1012
1031
  console.log(`\n${green("Everything is at latest certified versions.")}\n`);
1013
1032
  repairBuzzSetup(cwd, deps);
1014
1033
  repairRemovedDefaultTools(cwd);
@@ -1043,7 +1062,7 @@ export async function upgrade(options = {}) {
1043
1062
  }
1044
1063
  // Outside a clean install, eve goes in with --save-exact for the same
1045
1064
  // reason rewriteManifest pins it: npm would save a caret by default.
1046
- const eveChange = changed.find((spec) => spec.startsWith("eve@"));
1065
+ const eveChange = changed.find((spec) => spec.startsWith("eve@")) ?? (loosePin ? `eve@${eveTarget}` : undefined);
1047
1066
  const others = changed.filter((spec) => spec !== eveChange);
1048
1067
  /**
1049
1068
  * A third-party extension whose declared peer range trails the certified
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kybernesis/create",
3
- "version": "0.24.0",
3
+ "version": "0.24.2",
4
4
  "description": "The Kybernesis agent scaffolder and FDE toolkit: one command to a governed, remembering, multiplayer, self-testing eve agent \u2014 plus doctor and upgrade.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",