@outerlayer/cli 0.7.0 → 0.8.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +5 -5
  3. package/dist/{agent-setup-TXLDY5RV.js → agent-setup-K6RD2Z4P.js} +4 -4
  4. package/dist/{build-JF5UOWKJ.js → build-MS34XEGN.js} +2 -1
  5. package/dist/build-info.json +1 -1
  6. package/dist/builder-IG6FNA54.js +13 -0
  7. package/dist/{check-ASZL5BEO.js → check-GX5ND6RO.js} +26 -22
  8. package/dist/chunk-2BRSMBBB.js +264 -0
  9. package/dist/{chunk-PUN7LMNS.js → chunk-4ACZCY4I.js} +2 -2
  10. package/dist/{chunk-2VO25HHO.js → chunk-4FPWKV7L.js} +3 -3
  11. package/dist/{chunk-AII7CKTH.js → chunk-5ODHQP6O.js} +68 -145
  12. package/dist/chunk-7RQ73DLO.js +23 -0
  13. package/dist/{chunk-7FTNIAHS.js → chunk-AX23QKHS.js} +7 -3
  14. package/dist/{chunk-6ZZHWY2Z.js → chunk-BF4KKEFY.js} +4 -4
  15. package/dist/{chunk-5FWNEQNZ.js → chunk-BQFNZOMQ.js} +1 -1
  16. package/dist/chunk-CX22S5BA.js +45 -0
  17. package/dist/{chunk-D6FXM5OW.js → chunk-GAYWY4GI.js} +8 -8
  18. package/dist/{chunk-MQPRB5K7.js → chunk-HSN5QNS5.js} +8 -8
  19. package/dist/chunk-I2UOAV7X.js +133 -0
  20. package/dist/chunk-I7CJIRMM.js +93 -0
  21. package/dist/{chunk-SSU747O6.js → chunk-ILEA3YHM.js} +1 -1
  22. package/dist/{chunk-OUUINEYB.js → chunk-JKIWMRFH.js} +1 -1
  23. package/dist/{chunk-JPR2WHHF.js → chunk-KSLNQOOS.js} +1 -1
  24. package/dist/{chunk-DGAIVMMN.js → chunk-KV47VQJZ.js} +5 -5
  25. package/dist/{chunk-E4PIFIC3.js → chunk-M4ERCYDB.js} +133 -159
  26. package/dist/chunk-PTW6W5NR.js +127 -0
  27. package/dist/{chunk-DTXOJDEH.js → chunk-PWBILI5P.js} +3 -2
  28. package/dist/{chunk-X2FSFU4C.js → chunk-PXFEYBDE.js} +3 -3
  29. package/dist/{chunk-6IYLDODX.js → chunk-Q4432IZT.js} +5 -5
  30. package/dist/{chunk-AJKEHABI.js → chunk-QB5JQH5V.js} +255 -54
  31. package/dist/{chunk-AQ54MKSQ.js → chunk-QNRSFEGY.js} +2 -2
  32. package/dist/{chunk-774HEQL6.js → chunk-TEKZRTM3.js} +91 -8
  33. package/dist/{chunk-CEBIA5FD.js → chunk-TTNFGMHO.js} +42 -50
  34. package/dist/{chunk-F6GFZXZ3.js → chunk-UXYLWVTQ.js} +1 -18
  35. package/dist/{chunk-M5POMKKW.js → chunk-V7NIVOFD.js} +5 -5
  36. package/dist/{chunk-BCLJSQCV.js → chunk-YO4PSLVB.js} +1 -1
  37. package/dist/{chunk-6QWV3YDJ.js → chunk-Z2THOHPP.js} +2 -2
  38. package/dist/{cli-LEVCGAQV.js → cli-X5ONGYNY.js} +128 -78
  39. package/dist/{command-FLSYCGIB.js → command-7NFU3IPO.js} +38 -20
  40. package/dist/{config-I3TVFYLH.js → config-Z3USDBLU.js} +3 -2
  41. package/dist/{connect-cmd-MJMUONDY.js → connect-cmd-PNZ6IJLJ.js} +2 -2
  42. package/dist/{context-adopt-CE4KDXS3.js → context-adopt-D2Z7F7PB.js} +3 -3
  43. package/dist/{context-materialize-QL33HDJN.js → context-materialize-4PMTDS6K.js} +3 -3
  44. package/dist/{dist-PXBSA7QX.js → dist-3ZTZF2TP.js} +1 -1
  45. package/dist/docker-PRHRSJM5.js +15 -0
  46. package/dist/{doctor-FVDT3KJZ.js → doctor-KALLPCRB.js} +39 -16
  47. package/dist/{emit-artifact-cmd-7RPMRSVP.js → emit-artifact-cmd-D5GMVWNC.js} +7 -7
  48. package/dist/{emit-criteria-cmd-MKI7WETO.js → emit-criteria-cmd-IE7VIM64.js} +5 -5
  49. package/dist/{emit-finding-cmd-RMLGZASB.js → emit-finding-cmd-46PTPN3A.js} +5 -5
  50. package/dist/{emit-result-cmd-MTXAZ2GV.js → emit-result-cmd-KXHHP6HX.js} +7 -7
  51. package/dist/{hook-fast-XBOZ3N6L.js → hook-fast-5H5QBJKT.js} +1 -1
  52. package/dist/{host-key-KDYZ5ECC.js → host-key-YMLXY6QB.js} +1 -1
  53. package/dist/index.js +3 -3
  54. package/dist/{init-VLW7H6RW.js → init-B4CECVOX.js} +25 -18
  55. package/dist/{init-BACXESVV.js → init-S4DH6PWW.js} +16 -13
  56. package/dist/{init-cmd-VJFB5L7X.js → init-cmd-P4MVCBCZ.js} +8 -8
  57. package/dist/{install-NMAPLLBQ.js → install-FHTVJZS6.js} +5 -4
  58. package/dist/{install-cmd-B5SEU3G7.js → install-cmd-BEC7XTNG.js} +3 -1
  59. package/dist/{loop-D3243JKT.js → loop-ODMRE3CW.js} +26 -22
  60. package/dist/{machine-EB3GEVI4.js → machine-J4SAB3Z2.js} +15 -12
  61. package/dist/{mcp-serve-cmd-N6UD2KBX.js → mcp-serve-cmd-CT47P4YQ.js} +2 -2
  62. package/dist/{session-sender-LMACEJJS.js → session-sender-V46VPWQ5.js} +6 -6
  63. package/dist/{status-F4THTJJK.js → status-QBKSH3QE.js} +19 -16
  64. package/dist/{sync-cmd-M6JA3OEE.js → sync-cmd-RJR77V4O.js} +5 -5
  65. package/dist/{watch-NB5TGPEZ.js → watch-YNZTFLEY.js} +5 -5
  66. package/dist/{work-claim-cmd-UHMWOS3G.js → work-claim-cmd-KAD3ZAH7.js} +10 -9
  67. package/dist/{work-cmd-6UMCFTAW.js → work-cmd-CNWPTH7W.js} +6 -6
  68. package/dist/{work-comment-cmd-E4LEUIXZ.js → work-comment-cmd-HH45S6UE.js} +6 -6
  69. package/dist/{work-open-pr-cmd-OPZWGSEQ.js → work-open-pr-cmd-5KR3KFCN.js} +7 -7
  70. package/dist/{work-pr-cmd-IDIAFFRU.js → work-pr-cmd-TTEGCP76.js} +6 -6
  71. package/package.json +2 -2
  72. package/skill-pack/maintained/amend/SKILL.md +22 -6
  73. package/dist/chunk-Q5G2ODUZ.js +0 -54
  74. package/dist/docker-NEGDLU6D.js +0 -7
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+
4
+ createRequire(import.meta.url);
5
+
6
+ // src/runner/update/version-order.ts
7
+ function parse(version) {
8
+ const match = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(version);
9
+ if (match === null) return void 0;
10
+ return { core: [Number(match[1]), Number(match[2]), Number(match[3])], pre: match[4] };
11
+ }
12
+ function comparePre(a, b) {
13
+ const left = a.split(".");
14
+ const right = b.split(".");
15
+ for (let i = 0; i < Math.max(left.length, right.length); i++) {
16
+ const x = left[i];
17
+ const y = right[i];
18
+ if (x === void 0) return -1;
19
+ if (y === void 0) return 1;
20
+ const xNum = /^\d+$/.test(x);
21
+ const yNum = /^\d+$/.test(y);
22
+ if (xNum && yNum) {
23
+ const difference = Number(x) - Number(y);
24
+ if (difference !== 0) return Math.sign(difference);
25
+ } else if (xNum !== yNum) {
26
+ return xNum ? -1 : 1;
27
+ } else if (x < y) {
28
+ return -1;
29
+ } else if (x > y) {
30
+ return 1;
31
+ }
32
+ }
33
+ return 0;
34
+ }
35
+ function compareVersions(a, b) {
36
+ const left = parse(a);
37
+ const right = parse(b);
38
+ if (left === void 0 || right === void 0) return void 0;
39
+ for (let i = 0; i < 3; i++) {
40
+ const difference = left.core[i] - right.core[i];
41
+ if (difference !== 0) return Math.sign(difference);
42
+ }
43
+ if (left.pre === right.pre) return 0;
44
+ if (left.pre === void 0) return 1;
45
+ if (right.pre === void 0) return -1;
46
+ return comparePre(left.pre, right.pre);
47
+ }
48
+ function compareCores(a, b) {
49
+ for (let i = 0; i < 3; i++) {
50
+ const difference = a[i] - b[i];
51
+ if (difference !== 0) return Math.sign(difference);
52
+ }
53
+ return 0;
54
+ }
55
+ function parsePartial(text) {
56
+ if (text === "" || text === "*" || text === "x" || text === "X") return [];
57
+ const match = /^v?(\d+|[xX*])(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?$/.exec(text);
58
+ if (match === null) return void 0;
59
+ const numbers = [];
60
+ for (const part of [match[1], match[2], match[3]]) {
61
+ if (part === void 0 || !/^\d+$/.test(part)) break;
62
+ numbers.push(Number(part));
63
+ }
64
+ return numbers;
65
+ }
66
+ function bumpLast(numbers) {
67
+ const core = [numbers[0] ?? 0, numbers[1] ?? 0, numbers[2] ?? 0];
68
+ const last = numbers.length - 1;
69
+ core[last] = core[last] + 1;
70
+ for (let i = last + 1; i < 3; i++) core[i] = 0;
71
+ return core;
72
+ }
73
+ function fill(numbers) {
74
+ return [numbers[0] ?? 0, numbers[1] ?? 0, numbers[2] ?? 0];
75
+ }
76
+ function meets(version, comparator) {
77
+ const match = /^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(comparator);
78
+ const op = match[1] ?? "";
79
+ const numbers = parsePartial(match[2]);
80
+ if (numbers === void 0) return void 0;
81
+ if (numbers.length === 0) return op === "" || op === "=" || op === ">=" || op === "<=" ? true : void 0;
82
+ const low = fill(numbers);
83
+ const whole = numbers.length === 3;
84
+ switch (op) {
85
+ case ">=":
86
+ return compareCores(version, low) >= 0;
87
+ case ">":
88
+ return whole ? compareCores(version, low) > 0 : compareCores(version, bumpLast(numbers)) >= 0;
89
+ case "<":
90
+ return compareCores(version, low) < 0;
91
+ case "<=":
92
+ return whole ? compareCores(version, low) <= 0 : compareCores(version, bumpLast(numbers)) < 0;
93
+ case "~":
94
+ return compareCores(version, low) >= 0 && compareCores(version, bumpLast(numbers.slice(0, Math.min(numbers.length, 2)))) < 0;
95
+ case "^": {
96
+ let pivot = numbers.findIndex((n) => n !== 0);
97
+ if (pivot === -1) pivot = numbers.length - 1;
98
+ return compareCores(version, low) >= 0 && compareCores(version, bumpLast(numbers.slice(0, pivot + 1))) < 0;
99
+ }
100
+ default:
101
+ return compareCores(version, low) >= 0 && (whole ? compareCores(version, low) <= 0 : compareCores(version, bumpLast(numbers)) < 0);
102
+ }
103
+ }
104
+ function satisfiesRange(version, range) {
105
+ const parsed = parse(version.trim().replace(/^v/, ""));
106
+ if (parsed === void 0 || parsed.pre !== void 0) return void 0;
107
+ let anyUnreadable = false;
108
+ for (const alternative of range.split("||")) {
109
+ if (/\s-\s/.test(alternative)) {
110
+ anyUnreadable = true;
111
+ continue;
112
+ }
113
+ const comparators = alternative.trim().replace(/(>=|<=|>|<|=|\^|~)\s+/g, "$1").split(/\s+/).filter((c) => c !== "");
114
+ if (comparators.length === 0) comparators.push("*");
115
+ let all = true;
116
+ for (const comparator of comparators) {
117
+ const met = meets(parsed.core, comparator);
118
+ if (met === void 0) {
119
+ anyUnreadable = true;
120
+ all = false;
121
+ break;
122
+ }
123
+ if (!met) {
124
+ all = false;
125
+ break;
126
+ }
127
+ }
128
+ if (all) return true;
129
+ }
130
+ return anyUnreadable ? void 0 : false;
131
+ }
132
+
133
+ export { compareVersions, satisfiesRange };
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { compareVersions } from './chunk-I2UOAV7X.js';
4
+ import { launcherPath, writeLauncher, LauncherWriteError, pathNotes } from './chunk-PTW6W5NR.js';
5
+ import { currentVersion, currentLink, isInLayout, packageRootIn, versionDir, switchCurrent, execStartLine } from './chunk-TI7B7UEO.js';
6
+ import { RUNNER_DIR_MODE } from './chunk-ZM2IMMYN.js';
7
+ import { realpathSync, readFileSync, mkdirSync, rmSync, cpSync, existsSync } from 'fs';
8
+ import { dirname, sep, join } from 'path';
9
+
10
+ createRequire(import.meta.url);
11
+ var RunnerInstallError = class extends Error {
12
+ };
13
+ var RunnerDowngradeError = class extends RunnerInstallError {
14
+ };
15
+ function runRunnerInstall(args) {
16
+ const { configPath, nodePath } = args;
17
+ let entry;
18
+ try {
19
+ entry = realpathSync(args.entryPath);
20
+ } catch {
21
+ throw new RunnerInstallError(`cannot read the running CLI at ${args.entryPath}`);
22
+ }
23
+ const packageRoot = dirname(dirname(entry));
24
+ if (!packageRoot.split(sep).includes("node_modules")) {
25
+ throw new RunnerInstallError(
26
+ `${packageRoot} is not an installed package: run \`outerlayer runner install\` from a CLI installed with npm, not from a source checkout`
27
+ );
28
+ }
29
+ let manifest;
30
+ try {
31
+ manifest = JSON.parse(readFileSync(`${packageRoot}/package.json`, "utf8"));
32
+ } catch {
33
+ manifest = {};
34
+ }
35
+ if (manifest.name !== "@outerlayer/cli") throw new RunnerInstallError(`${packageRoot} is not the @outerlayer/cli package`);
36
+ const version = manifest.version;
37
+ if (typeof version !== "string" || version === "") throw new RunnerInstallError(`${packageRoot}/package.json has no version`);
38
+ const installed = currentVersion(configPath);
39
+ if (args.allowDowngrade !== true && installed !== void 0 && (compareVersions(version, installed) ?? 0) < 0) {
40
+ const command = args.command ?? "runner install";
41
+ throw new RunnerDowngradeError(
42
+ `this CLI is ${version}, older than ${installed}, the version the runner runs from ${currentLink(configPath)}. Installing it would move the runner back to ${version}. Run \`${launcherPath(args.home)} ${command}\` instead, which runs ${installed}. To install ${version} anyway, run \`outerlayer ${command} --allow-downgrade\``
43
+ );
44
+ }
45
+ if (!isInLayout(configPath, entry) && !sameBuildInstalled(packageRoot, packageRootIn(versionDir(configPath, version)))) {
46
+ const target = packageRootIn(versionDir(configPath, version));
47
+ mkdirSync(dirname(target), { recursive: true, mode: RUNNER_DIR_MODE });
48
+ rmSync(target, { recursive: true, force: true });
49
+ cpSync(packageRoot, target, { recursive: true });
50
+ carryHoistedDevcontainerCli(packageRoot, target);
51
+ }
52
+ switchCurrent(configPath, version);
53
+ let written;
54
+ try {
55
+ written = writeLauncher({ home: args.home, configPath, nodePath, replace: args.replace });
56
+ } catch (error) {
57
+ if (error instanceof LauncherWriteError) throw new RunnerInstallError(error.message);
58
+ throw error;
59
+ }
60
+ return {
61
+ version,
62
+ execStart: execStartLine(configPath, nodePath),
63
+ launcher: {
64
+ path: launcherPath(args.home),
65
+ state: written.state,
66
+ follows: currentLink(configPath),
67
+ notes: pathNotes({ home: args.home, PATH: args.PATH, state: written.state, launcher: written.path })
68
+ }
69
+ };
70
+ }
71
+ function sameBuildInstalled(source, target) {
72
+ try {
73
+ const wanted = readFileSync(join(source, "dist", "build-info.json"), "utf8");
74
+ return wanted !== "" && wanted === readFileSync(join(target, "dist", "build-info.json"), "utf8");
75
+ } catch {
76
+ return false;
77
+ }
78
+ }
79
+ function carryHoistedDevcontainerCli(packageRoot, target) {
80
+ const dependency = join("@devcontainers", "cli");
81
+ if (existsSync(join(packageRoot, "node_modules", dependency))) return;
82
+ const hoisted = join(dirname(dirname(packageRoot)), dependency);
83
+ if (!existsSync(hoisted)) return;
84
+ const carried = join(dirname(dirname(target)), dependency);
85
+ mkdirSync(dirname(carried), { recursive: true, mode: RUNNER_DIR_MODE });
86
+ cpSync(hoisted, carried, { recursive: true });
87
+ }
88
+ function launcherSummary(launcher) {
89
+ if (launcher.state === "foreign") return void 0;
90
+ return `${launcher.state === "unchanged" ? "outerlayer command already at" : "wrote the outerlayer command at"} ${launcher.path}, which runs the CLI that ${launcher.follows} names`;
91
+ }
92
+
93
+ export { RunnerDowngradeError, RunnerInstallError, launcherSummary, runRunnerInstall };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { sanitizeTerminal } from './chunk-ZYHKJKSU.js';
4
- import { remoteLookupFailed } from './chunk-D6FXM5OW.js';
4
+ import { remoteLookupFailed } from './chunk-GAYWY4GI.js';
5
5
  import { DEFAULT_DASHBOARD } from './chunk-USO2DKBD.js';
6
6
  import { resolveGatewayCredentials } from './chunk-BOLTI6LR.js';
7
7
  import { readCloudConfig } from './chunk-EABW6AJQ.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { parseSize } from './chunk-F6GFZXZ3.js';
3
+ import { parseSize } from './chunk-7RQ73DLO.js';
4
4
 
5
5
  createRequire(import.meta.url);
6
6
 
@@ -628,7 +628,7 @@ async function runHookFast(event, home = homeFromEnv(), read = readStdin, env =
628
628
  recordHookErrorsSeen(home, hookErrorsBytes);
629
629
  if (contextPossiblyGoverned(sessionCwd, home)) {
630
630
  try {
631
- const { materializeContext: materialize } = await import('./context-materialize-QL33HDJN.js');
631
+ const { materializeContext: materialize } = await import('./context-materialize-4PMTDS6K.js');
632
632
  const sessionId = typeof payload.session_id === "string" ? payload.session_id : "unknown";
633
633
  const result = await materialize({ cwd: sessionCwd, sessionId, home });
634
634
  materializeMessage = result.message;
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { autoConnect } from './chunk-PUN7LMNS.js';
3
+ import { autoConnect } from './chunk-4ACZCY4I.js';
4
4
  import { detectActiveSession } from './chunk-BFESLKPP.js';
5
5
  import { sanitizeTerminal } from './chunk-ZYHKJKSU.js';
6
- import { resolveRepoIdentity } from './chunk-D6FXM5OW.js';
6
+ import { resolveRepoIdentity } from './chunk-GAYWY4GI.js';
7
7
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
8
- import { defaultFetch } from './chunk-BCLJSQCV.js';
8
+ import { defaultFetch } from './chunk-YO4PSLVB.js';
9
9
  import { resolveGatewayCredentials, unauthorizedMessage } from './chunk-BOLTI6LR.js';
10
- import { signRunnerRequest } from './chunk-M5POMKKW.js';
10
+ import { signRunnerRequest } from './chunk-V7NIVOFD.js';
11
11
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
12
12
 
13
13
  createRequire(import.meta.url);
@@ -347,7 +347,7 @@ async function runWorkLinkSession(opts) {
347
347
  return await linkSession(opts);
348
348
  } catch (err) {
349
349
  if (opts.logFailures) {
350
- const { logHookError } = await import('./hook-fast-XBOZ3N6L.js');
350
+ const { logHookError } = await import('./hook-fast-5H5QBJKT.js');
351
351
  const reason = err instanceof Error ? err.message : String(err);
352
352
  logHookError(opts.home ?? homeFromEnv(opts.env ?? process.env), new Error(`work link-session #${opts.number} failed: ${reason}`));
353
353
  }