@outerlayer/cli 0.12.0 → 0.14.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.
Files changed (98) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +9 -4
  3. package/dist/agent-setup-CN2HUBEJ.js +26 -0
  4. package/dist/{build-LELVCWHV.js → build-BG2YENGK.js} +2 -2
  5. package/dist/build-info.json +1 -1
  6. package/dist/{builder-OF67QKDS.js → builder-2D3WSOOY.js} +4 -4
  7. package/dist/{check-RJOJU2WA.js → check-SRGR36KI.js} +37 -37
  8. package/dist/{chunk-XR3BJN33.js → chunk-22RMZBGW.js} +20 -1
  9. package/dist/{chunk-AHZQBGD2.js → chunk-2M63GG56.js} +1 -1
  10. package/dist/{chunk-SZOVKFWB.js → chunk-3NLOVYJQ.js} +4 -4
  11. package/dist/{chunk-USO2DKBD.js → chunk-4KSQKQXE.js} +8 -2
  12. package/dist/{chunk-QEESCZ26.js → chunk-4NPZVMJU.js} +2 -2
  13. package/dist/{chunk-DVT73QJO.js → chunk-4OGPT6I2.js} +14 -14
  14. package/dist/{chunk-ZQUCTFXC.js → chunk-FOJGZYFC.js} +11 -5
  15. package/dist/{chunk-G5XY6CVG.js → chunk-HFKKFTXU.js} +12 -16
  16. package/dist/{chunk-ANW7VHMH.js → chunk-HFKQIZXL.js} +95 -16
  17. package/dist/{chunk-325272HM.js → chunk-J5M7BSJQ.js} +11 -4
  18. package/dist/{chunk-NPXQXYVA.js → chunk-JJEGKEFV.js} +6 -8
  19. package/dist/{chunk-3ZPYPFNM.js → chunk-JXYVA45C.js} +1 -1
  20. package/dist/{chunk-IBB4D4KE.js → chunk-JYIEHQIF.js} +1 -1
  21. package/dist/{chunk-5TGQHOUX.js → chunk-KFRM23WD.js} +3 -3
  22. package/dist/{chunk-GGMRZPEA.js → chunk-KMDLFI4P.js} +1 -1
  23. package/dist/{chunk-G5IEVZGI.js → chunk-LCEXHCHD.js} +1 -1
  24. package/dist/{chunk-27Y7AX2O.js → chunk-MSASO5O4.js} +44 -8
  25. package/dist/chunk-MTF3PHVZ.js +161 -0
  26. package/dist/{chunk-G4RXNF2L.js → chunk-NHDVD7DU.js} +12 -12
  27. package/dist/{chunk-GATMPAMK.js → chunk-NPQWKGUA.js} +2 -2
  28. package/dist/{chunk-YEQL54G5.js → chunk-PQUM37BK.js} +1 -1
  29. package/dist/{chunk-GEBQXUFY.js → chunk-Q2UK3C4P.js} +24 -10
  30. package/dist/{chunk-SKHN72JO.js → chunk-RBKIH5ST.js} +13 -13
  31. package/dist/{chunk-2KLBKHT4.js → chunk-RLYZLUQ7.js} +1 -1
  32. package/dist/chunk-RMWLBUCJ.js +50 -0
  33. package/dist/{chunk-PDRYXERC.js → chunk-SMHOCDCI.js} +5 -5
  34. package/dist/{chunk-6FH2AHJY.js → chunk-SWHQ4LUM.js} +30 -17
  35. package/dist/{agent-setup-52LRZ6AY.js → chunk-SXWS25JC.js} +8 -21
  36. package/dist/{chunk-VK25O2ZM.js → chunk-T5VPP6H7.js} +1 -1
  37. package/dist/{chunk-JOXYKGUV.js → chunk-WUYTWNMA.js} +4 -2
  38. package/dist/{chunk-A56PYPDF.js → chunk-XCK2YAY5.js} +14 -4
  39. package/dist/{chunk-C7N4TDHW.js → chunk-YDSMROTB.js} +5 -5
  40. package/dist/{chunk-FO7KKPYG.js → chunk-ZA5CHAFY.js} +2 -2
  41. package/dist/{cli-JSSRGA6V.js → cli-UW2H3UUW.js} +138 -85
  42. package/dist/{command-3WYZ2ML5.js → command-5LD7G2QQ.js} +27 -27
  43. package/dist/{config-MKBX2ZQD.js → config-N3C6DFQA.js} +1 -1
  44. package/dist/{connect-cmd-A5NGODCJ.js → connect-cmd-JUAW6MU4.js} +5 -5
  45. package/dist/{context-adopt-BAHGXJZV.js → context-adopt-PJUMW2EZ.js} +6 -6
  46. package/dist/{context-materialize-45OVRRK2.js → context-materialize-FDHYKNDT.js} +6 -6
  47. package/dist/{dist-EQDW7MZW.js → dist-LKDWQWZ7.js} +2 -2
  48. package/dist/{docker-VGWEJWI7.js → docker-4J77Q2BF.js} +5 -5
  49. package/dist/{doctor-4FFXTQJ2.js → doctor-H7REBSLQ.js} +29 -29
  50. package/dist/{emit-artifact-cmd-QS7XNKBT.js → emit-artifact-cmd-FOGNJXVR.js} +18 -21
  51. package/dist/emit-cmd-ZEYWLC2C.js +11 -0
  52. package/dist/{emit-criteria-cmd-XN6AKA53.js → emit-criteria-cmd-HBP6XS5C.js} +8 -11
  53. package/dist/{emit-finding-cmd-SQJSEHYS.js → emit-finding-cmd-DLI4MKMN.js} +8 -11
  54. package/dist/{emit-result-cmd-56RHPHOA.js → emit-result-cmd-MUSL7GQA.js} +12 -15
  55. package/dist/{hook-fast-HLESEJAL.js → hook-fast-WYQD6D7T.js} +1 -1
  56. package/dist/{import-capture-cmd-NHMAFDM6.js → import-capture-cmd-6QVCOIHK.js} +10 -13
  57. package/dist/{import-ruler-cmd-UYB32YUT.js → import-ruler-cmd-KLRGRBCP.js} +7 -10
  58. package/dist/index.js +3 -3
  59. package/dist/{init-UZKD4RY7.js → init-NTXA3SN7.js} +28 -28
  60. package/dist/{init-6AY5T3P6.js → init-UBXK6MF7.js} +47 -37
  61. package/dist/{init-cmd-XGSX2BCC.js → init-cmd-NARDUPIG.js} +20 -13
  62. package/dist/init-update-O5YYFGF4.js +165 -0
  63. package/dist/{install-VXXI7UR6.js → install-HDBIPHTX.js} +2 -2
  64. package/dist/{login-browser-7XGSV7MA.js → login-browser-QZCS3WW6.js} +2 -1
  65. package/dist/{loop-4NMI2USY.js → loop-SW2M5VDD.js} +37 -37
  66. package/dist/{machine-4JX2D4TS.js → machine-U66FKVDP.js} +23 -23
  67. package/dist/mcp-install-cmd-FDTPQQS6.js +9 -0
  68. package/dist/{runner-env-WAXTJXZK.js → runner-env-XTC53CHN.js} +3 -3
  69. package/dist/runner-key-3JSMDRJA.js +154 -0
  70. package/dist/{session-sender-T7PN4YRC.js → session-sender-4M247XSV.js} +7 -7
  71. package/dist/starter-pack-IB4UUIX3.js +11 -0
  72. package/dist/{status-OXBIRWJ7.js → status-STZYPU3W.js} +30 -30
  73. package/dist/{sync-cmd-EVXNR47N.js → sync-cmd-UWD5JOFU.js} +6 -6
  74. package/dist/{watch-7NSFOAL5.js → watch-DBNB7R6X.js} +6 -6
  75. package/dist/{work-claim-cmd-KR7UR2AB.js → work-claim-cmd-LY4U6QHN.js} +13 -13
  76. package/dist/{work-cmd-JPM37MLF.js → work-cmd-RVRQ32EH.js} +7 -7
  77. package/dist/{work-comment-cmd-3DC6BC34.js → work-comment-cmd-FFUM4TJU.js} +10 -13
  78. package/dist/{work-open-pr-cmd-XZQRJBNZ.js → work-open-pr-cmd-HLDWP4T2.js} +10 -13
  79. package/dist/{work-pr-cmd-WHGZOP22.js → work-pr-cmd-L77K32WK.js} +7 -7
  80. package/package.json +1 -1
  81. package/skill-pack/maintained/emitting-evidence/SKILL.md +8 -2
  82. package/skill-pack/shipped.json +70 -0
  83. package/skill-pack/template/build/SKILL.md +66 -35
  84. package/skill-pack/template/build/references/agent-briefs.md +4 -2
  85. package/skill-pack/template/build/references/release.md +36 -8
  86. package/skill-pack/template/build/references/review-loop.md +6 -2
  87. package/skill-pack/template/build/scripts/record-criteria.mjs +109 -143
  88. package/skill-pack/template/spec/SKILL.md +33 -22
  89. package/skill-pack/template/writing-specs/SKILL.md +36 -3
  90. package/skill-pack/template/writing-specs/references/agents-snippet.md +57 -0
  91. package/skill-pack/template/writing-tests/SKILL.md +117 -0
  92. package/skill-pack/validators/acceptance-criteria.yaml +35 -0
  93. package/skill-pack/validators/code-review.yaml +4 -2
  94. package/dist/chunk-T6OIJQRT.js +0 -31
  95. package/dist/emit-cmd-LXEIDKLT.js +0 -10
  96. package/dist/mcp-install-cmd-XZARXNYT.js +0 -9
  97. package/dist/starter-pack-Z22VRFPF.js +0 -11
  98. package/dist/{chunk-3FMPZPJQ.js → chunk-R7PF5OOU.js} +1 -1
@@ -1,17 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { normalizePath } from './chunk-AHZQBGD2.js';
4
- import './chunk-325272HM.js';
3
+ import { C } from './chunk-YRYMNBGQ.js';
4
+ import { normalizePath } from './chunk-2M63GG56.js';
5
+ import './chunk-J5M7BSJQ.js';
5
6
  import './chunk-Z5GEFMRW.js';
6
7
  import { existsSync, readdirSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
7
8
  import { join, dirname } from 'path';
8
9
 
9
10
  createRequire(import.meta.url);
10
11
  var SKIP_DIRS = /* @__PURE__ */ new Set(["node_modules", ".git"]);
11
- var GREEN = "\x1B[32m";
12
- var YELLOW = "\x1B[33m";
13
- var DIM = "\x1B[2m";
14
- var RESET = "\x1B[0m";
15
12
  var ImportRulerError = class extends Error {
16
13
  };
17
14
  function toRepoRelative(base, name) {
@@ -98,10 +95,10 @@ function writeOutFile(repoRoot, relPath, content) {
98
95
  }
99
96
  function renderSuccess(scopes, warnings) {
100
97
  const warningSuffix = warnings.length > 0 ? `, ${warnings.length} warning${warnings.length === 1 ? "" : "s"}` : "";
101
- const lines = [`${GREEN}\u2713${RESET} imported ${scopes.length} .ruler/ scope${scopes.length === 1 ? "" : "s"}${warningSuffix}`];
98
+ const lines = [`${C.green}\u2713${C.reset} imported ${scopes.length} .ruler/ scope${scopes.length === 1 ? "" : "s"}${warningSuffix}`];
102
99
  for (const s of scopes) {
103
100
  const written = [s.agentsMdWritten, s.mcpWritten].filter((p) => p !== void 0);
104
- lines.push(` ${DIM}${s.scopePath === "" ? "(root)" : s.scopePath}${RESET} \u2192 ${written.join(", ") || "nothing to import"}`);
101
+ lines.push(` ${C.dim}${s.scopePath === "" ? "(root)" : s.scopePath}${C.reset} \u2192 ${written.join(", ") || "nothing to import"}`);
105
102
  }
106
103
  return lines.join("\n");
107
104
  }
@@ -110,7 +107,7 @@ function runImportRuler(opts = {}) {
110
107
  if (!existsSync(cwd)) throw new ImportRulerError(`no such directory: ${cwd}`);
111
108
  const rulerDirs = discoverRulerDirs(cwd);
112
109
  if (rulerDirs.length === 0) {
113
- const output2 = opts.json ? JSON.stringify({ scopes: [], warnings: [] }) : `${DIM}no .ruler/ directories found \u2014 nothing to import${RESET}`;
110
+ const output2 = opts.json ? JSON.stringify({ scopes: [], warnings: [] }) : `${C.dim}no .ruler/ directories found \u2014 nothing to import${C.reset}`;
114
111
  if (!opts.quiet) process.stdout.write(output2 + "\n");
115
112
  return { scopes: [], warnings: [], output: output2, exitCode: 0 };
116
113
  }
@@ -164,7 +161,7 @@ ${mdContent}`;
164
161
  process.stdout.write(output + "\n");
165
162
  } else {
166
163
  process.stdout.write(output + "\n");
167
- for (const w of warnings) process.stderr.write(` ${YELLOW}!${RESET} ${w.path}: ${w.message}
164
+ for (const w of warnings) process.stderr.write(` ${C.yellow}!${C.reset} ${w.path}: ${w.message}
168
165
  `);
169
166
  }
170
167
  }
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ createRequire(import.meta.url);
6
6
  // src/index.ts
7
7
  var argv = process.argv.slice(2);
8
8
  if (argv[0] === "hook") {
9
- const { runHookFast } = await import('./hook-fast-HLESEJAL.js');
9
+ const { runHookFast } = await import('./hook-fast-WYQD6D7T.js');
10
10
  await runHookFast(argv[1]);
11
11
  process.exit(0);
12
12
  }
@@ -21,6 +21,6 @@ if (argv[0] === "statusline") {
21
21
  await runStatuslineFast(argv.slice(1));
22
22
  process.exit(0);
23
23
  }
24
- (await import('./hook-fast-HLESEJAL.js')).recordLinkExitFailure(argv);
25
- var { runCli } = await import('./cli-JSSRGA6V.js');
24
+ (await import('./hook-fast-WYQD6D7T.js')).recordLinkExitFailure(argv);
25
+ var { runCli } = await import('./cli-UW2H3UUW.js');
26
26
  await runCli(process.argv);
@@ -1,44 +1,44 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { PLACEHOLDER_MARKER, RunnerInitError, isPlaceholderCommand, readConfigObject, runRunnerInit } from './chunk-GEBQXUFY.js';
4
- import './chunk-IBB4D4KE.js';
5
- import './chunk-SKHN72JO.js';
6
- import './chunk-VK25O2ZM.js';
7
- import './chunk-2KLBKHT4.js';
8
- import './chunk-6MZSX4M7.js';
9
- import './chunk-3FMPZPJQ.js';
10
- import './chunk-N5FOE5PS.js';
11
- import './chunk-OGFGZQA3.js';
12
- import './chunk-GGMRZPEA.js';
13
- import './chunk-QOZKPLVJ.js';
14
- import './chunk-QEESCZ26.js';
15
- import './chunk-CX22S5BA.js';
3
+ export { PLACEHOLDER_MARKER, RunnerInitError, isPlaceholderCommand, prepareRunnerInit, readConfigObject, runRunnerInit, writeRunnerInit } from './chunk-Q2UK3C4P.js';
4
+ import './chunk-JYIEHQIF.js';
5
+ import './chunk-RBKIH5ST.js';
6
+ import './chunk-KMDLFI4P.js';
16
7
  import './chunk-QKFB4K7X.js';
17
8
  import './chunk-RSNSZ2LJ.js';
18
- import './chunk-6FH2AHJY.js';
19
- import './chunk-GATMPAMK.js';
9
+ import './chunk-T5VPP6H7.js';
10
+ import './chunk-RLYZLUQ7.js';
11
+ import './chunk-6MZSX4M7.js';
12
+ import './chunk-SWHQ4LUM.js';
13
+ import './chunk-NPQWKGUA.js';
20
14
  import './chunk-IP7BIBXJ.js';
21
- import './chunk-C7N4TDHW.js';
22
- import './chunk-JOXYKGUV.js';
23
- import './chunk-3ZPYPFNM.js';
24
- import './chunk-USO2DKBD.js';
25
- import './chunk-N6LURUEF.js';
26
- import './chunk-YRYMNBGQ.js';
27
- import './chunk-XR3BJN33.js';
15
+ import './chunk-22RMZBGW.js';
28
16
  import './chunk-UXYLWVTQ.js';
17
+ import './chunk-R7PF5OOU.js';
18
+ import './chunk-QOZKPLVJ.js';
19
+ import './chunk-N5FOE5PS.js';
20
+ import './chunk-OGFGZQA3.js';
21
+ import './chunk-4NPZVMJU.js';
29
22
  import './chunk-7RQ73DLO.js';
30
23
  import './chunk-4Q7OMKAT.js';
24
+ import './chunk-CX22S5BA.js';
25
+ import './chunk-YDSMROTB.js';
26
+ import './chunk-WUYTWNMA.js';
27
+ import './chunk-JXYVA45C.js';
28
+ import './chunk-4KSQKQXE.js';
29
+ import './chunk-N6LURUEF.js';
30
+ import './chunk-YRYMNBGQ.js';
31
31
  import './chunk-WZBHBH3J.js';
32
- import './chunk-SZOVKFWB.js';
32
+ import './chunk-3NLOVYJQ.js';
33
+ import './chunk-LCEXHCHD.js';
33
34
  import './chunk-ZJSNLVCE.js';
34
- import './chunk-FO7KKPYG.js';
35
- import './chunk-G5IEVZGI.js';
36
- import './chunk-AHZQBGD2.js';
37
35
  import './chunk-YO4PSLVB.js';
36
+ import './chunk-BYT5O5RV.js';
37
+ import './chunk-ZA5CHAFY.js';
38
+ import './chunk-2M63GG56.js';
38
39
  import './chunk-PLMTLGYH.js';
39
- import './chunk-325272HM.js';
40
+ import './chunk-J5M7BSJQ.js';
40
41
  import './chunk-EABW6AJQ.js';
41
- import './chunk-BYT5O5RV.js';
42
42
  import './chunk-RA3O54FC.js';
43
43
  import './chunk-V7NIVOFD.js';
44
44
  import './chunk-ZM2IMMYN.js';
@@ -1,46 +1,46 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { npmSupportsProvenance } from './chunk-YETTWTAY.js';
4
- import { RunnerInitError, readConfigObject } from './chunk-GEBQXUFY.js';
5
- import './chunk-IBB4D4KE.js';
6
- import './chunk-SKHN72JO.js';
7
- import './chunk-VK25O2ZM.js';
8
- import { checkFit, VM_SERVICE_NAME, RUNNER_RESERVE_BYTES } from './chunk-2KLBKHT4.js';
4
+ import { RunnerInitError, readConfigObject } from './chunk-Q2UK3C4P.js';
5
+ import './chunk-JYIEHQIF.js';
6
+ import './chunk-RBKIH5ST.js';
7
+ import './chunk-KMDLFI4P.js';
8
+ import './chunk-QKFB4K7X.js';
9
+ import './chunk-RSNSZ2LJ.js';
10
+ import './chunk-T5VPP6H7.js';
11
+ import { checkFit, VM_SERVICE_NAME, RUNNER_RESERVE_BYTES } from './chunk-RLYZLUQ7.js';
9
12
  import './chunk-6MZSX4M7.js';
13
+ import './chunk-SWHQ4LUM.js';
14
+ import './chunk-NPQWKGUA.js';
15
+ import './chunk-IP7BIBXJ.js';
16
+ import { runnerCredentialProblem, resolveBuild, resolveHousekeeping } from './chunk-22RMZBGW.js';
17
+ import './chunk-UXYLWVTQ.js';
10
18
  import { writeLaunchAgent } from './chunk-LF6MLJCY.js';
11
- import './chunk-3FMPZPJQ.js';
19
+ import './chunk-R7PF5OOU.js';
20
+ import './chunk-QOZKPLVJ.js';
12
21
  import './chunk-N5FOE5PS.js';
13
22
  import './chunk-OGFGZQA3.js';
14
- import './chunk-GGMRZPEA.js';
15
- import './chunk-QOZKPLVJ.js';
16
- import './chunk-QEESCZ26.js';
23
+ import './chunk-4NPZVMJU.js';
24
+ import { parseSize } from './chunk-7RQ73DLO.js';
25
+ import './chunk-4Q7OMKAT.js';
17
26
  import './chunk-CX22S5BA.js';
18
- import './chunk-QKFB4K7X.js';
19
- import './chunk-RSNSZ2LJ.js';
20
- import './chunk-6FH2AHJY.js';
21
- import './chunk-GATMPAMK.js';
22
- import './chunk-IP7BIBXJ.js';
23
- import './chunk-C7N4TDHW.js';
24
- import './chunk-JOXYKGUV.js';
25
- import './chunk-3ZPYPFNM.js';
26
- import './chunk-USO2DKBD.js';
27
+ import './chunk-YDSMROTB.js';
28
+ import './chunk-WUYTWNMA.js';
29
+ import './chunk-JXYVA45C.js';
30
+ import './chunk-4KSQKQXE.js';
27
31
  import './chunk-N6LURUEF.js';
28
32
  import './chunk-YRYMNBGQ.js';
29
- import { resolveBuild, resolveHousekeeping } from './chunk-XR3BJN33.js';
30
- import './chunk-UXYLWVTQ.js';
31
- import { parseSize } from './chunk-7RQ73DLO.js';
32
- import './chunk-4Q7OMKAT.js';
33
33
  import './chunk-WZBHBH3J.js';
34
- import './chunk-SZOVKFWB.js';
34
+ import './chunk-3NLOVYJQ.js';
35
+ import './chunk-LCEXHCHD.js';
35
36
  import './chunk-ZJSNLVCE.js';
36
- import './chunk-FO7KKPYG.js';
37
- import './chunk-G5IEVZGI.js';
38
- import './chunk-AHZQBGD2.js';
39
37
  import './chunk-YO4PSLVB.js';
38
+ import './chunk-BYT5O5RV.js';
39
+ import './chunk-ZA5CHAFY.js';
40
+ import './chunk-2M63GG56.js';
40
41
  import './chunk-PLMTLGYH.js';
41
- import './chunk-325272HM.js';
42
+ import './chunk-J5M7BSJQ.js';
42
43
  import './chunk-EABW6AJQ.js';
43
- import './chunk-BYT5O5RV.js';
44
44
  import './chunk-RA3O54FC.js';
45
45
  import './chunk-V7NIVOFD.js';
46
46
  import { hostKeyPath } from './chunk-ZM2IMMYN.js';
@@ -48,7 +48,8 @@ import './chunk-XCCLFVXM.js';
48
48
  import './chunk-BJ3KTMDH.js';
49
49
  import './chunk-VNVZDWO3.js';
50
50
  import './chunk-Z5GEFMRW.js';
51
- import { readFileSync, writeFileSync, existsSync, rmSync } from 'fs';
51
+ import { existsSync, readFileSync, mkdirSync, writeFileSync, rmSync } from 'fs';
52
+ import { dirname } from 'path';
52
53
 
53
54
  createRequire(import.meta.url);
54
55
 
@@ -103,15 +104,18 @@ async function runVmInit(configPath, deps) {
103
104
  "limactl is not installed, and the Linux VM needs it. Install Lima with `brew install lima` (https://lima-vm.io/docs/installation/), then run this again."
104
105
  );
105
106
  }
106
- const config = readConfigObject(configPath);
107
+ const onDisk = deps.runnerKey !== void 0 && !existsSync(configPath) ? {} : readConfigObject(configPath);
108
+ let config = onDisk;
107
109
  const noted = config.runnerVm;
108
110
  if (noted !== void 0) {
109
111
  throw new RunnerInitError(
110
112
  `${configPath}: the runner already lives in the VM ${noted.instance}. Start it with \`limactl start ${noted.instance}\`, or remove the runnerVm key after deleting the VM.`
111
113
  );
112
114
  }
113
- if (typeof config.url !== "string" || typeof config.apiKey !== "string" || typeof config.appId !== "string") {
114
- throw new RunnerInitError(`${configPath}: url, apiKey and appId are needed to move the runner into a VM. Run \`outerlayer login\` first.`);
115
+ const problem = deps.runnerKey === void 0 ? runnerCredentialProblem(config) : void 0;
116
+ if (problem !== void 0) {
117
+ const login = problem.reason === "is missing" ? " Run `outerlayer login` first." : "";
118
+ throw new RunnerInitError(`${configPath}: ${problem.field} ${problem.reason}. The runner in the VM needs url, apiKey and appId.${login}`);
115
119
  }
116
120
  const block = config.runner;
117
121
  const { hooks: _ownHooks, ...carried } = block ?? {};
@@ -135,6 +139,11 @@ async function runVmInit(configPath, deps) {
135
139
  if (!fit.fits) {
136
140
  throw new RunnerInitError(`${configPath}: the VM this Mac can give the runner is ${size.memoryGiB} GiB, and ${fit.message}. Lower runner.concurrency or runner.build.memory, then run this again.`);
137
141
  }
142
+ let created;
143
+ if (deps.runnerKey !== void 0) {
144
+ created = await deps.runnerKey();
145
+ config = { ...config, url: created.url, apiKey: created.apiKey, appId: created.appId };
146
+ }
138
147
  const leftBehind = `The VM ${instance} was left as it is; delete it with \`limactl delete --force ${instance}\` to start over.`;
139
148
  const failed = (what, result) => new VmInitError(`${what} failed: ${result.stderr.trim() || result.stdout.trim() || `exit status ${result.status}`}. ${leftBehind}`);
140
149
  const sh = async (argv, stdin) => {
@@ -155,8 +164,8 @@ async function runVmInit(configPath, deps) {
155
164
  }
156
165
  };
157
166
  progress(`creating the Linux VM ${instance}: this downloads an image and can take several minutes`);
158
- const created = await stillRunning("creating the VM", lima.create({ instance, cpus: size.cpus, memoryGiB: size.memoryGiB, diskGiB: size.diskGiB }));
159
- if (created.status !== 0) throw failed("`limactl create`", created);
167
+ const made = await stillRunning("creating the VM", lima.create({ instance, cpus: size.cpus, memoryGiB: size.memoryGiB, diskGiB: size.diskGiB }));
168
+ if (made.status !== 0) throw failed("`limactl create`", made);
160
169
  progress("starting the VM");
161
170
  const started = await stillRunning("starting the VM", lima.start(instance));
162
171
  if (started.status !== 0) throw failed("`limactl start`", started);
@@ -201,7 +210,8 @@ async function runVmInit(configPath, deps) {
201
210
  let hadHostKey;
202
211
  try {
203
212
  agent = writeLaunchAgent(deps.home, limactl, instance);
204
- const { apiKey: _apiKey, runner: _runner, ...kept } = config;
213
+ const { apiKey: _apiKey, runner: _runner, ...kept } = onDisk;
214
+ mkdirSync(dirname(configPath), { recursive: true });
205
215
  writeFileSync(configPath, `${JSON.stringify({ ...kept, runnerVm: { instance, since: (deps.now ?? (() => /* @__PURE__ */ new Date()))().toISOString() } }, null, 2)}
206
216
  `);
207
217
  hadHostKey = existsSync(hostKeyPath(configPath));
@@ -215,9 +225,9 @@ async function runVmInit(configPath, deps) {
215
225
  `created the Linux VM ${instance}: ${size.cpus} CPUs, ${size.memoryGiB} GiB memory, ${size.diskGiB} GiB disk`,
216
226
  ...innerOut.split("\n").map((line) => line.trim()).filter((line) => line !== ""),
217
227
  `the VM starts at login through ${agent}`,
218
- `moved the runner key into the VM: apiKey and runner are gone from ${configPath}`,
228
+ created === void 0 ? `moved the runner key into the VM: apiKey and runner are gone from ${configPath}` : `created the runner key ${created.name} from your login and gave it to the VM; it is not stored on this Mac`,
219
229
  ...hadHostKey ? ["deleted this Mac's old host key. If the runner key was bound to it, a member uses Clear host key on the API keys page before the VM's first claim"] : [],
220
- "run outerlayer login again to use capture on this Mac, with a key that is not the runner key",
230
+ ...created === void 0 ? ["run outerlayer login again to use capture on this Mac, with a key that is not the runner key"] : [],
221
231
  ...installOut.split("\n").map((line) => line.trim()).filter((line) => line !== ""),
222
232
  ...deps.credential === void 0 ? [
223
233
  `put CLAUDE_CODE_OAUTH_TOKEN in ${home}/.outerlayer/runner.env inside the VM, then restart the runner so it reads the file: limactl shell ${instance} sudo systemctl restart ${VM_SERVICE_NAME}`
@@ -1,28 +1,33 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { summarizeChecks, summaryText, renderDoctorText } from './chunk-ANW7VHMH.js';
3
+ import { summarizeChecks, summaryText, renderDoctorText } from './chunk-HFKQIZXL.js';
4
+ import './chunk-MTF3PHVZ.js';
5
+ import './chunk-SWHQ4LUM.js';
6
+ import './chunk-NPQWKGUA.js';
7
+ import './chunk-IP7BIBXJ.js';
4
8
  import './chunk-F47JBIAW.js';
5
9
  import './chunk-BKO6JEZI.js';
6
- import './chunk-6FH2AHJY.js';
7
- import './chunk-GATMPAMK.js';
8
- import './chunk-IP7BIBXJ.js';
9
- import { runConnect, COMMIT_LINE } from './chunk-C7N4TDHW.js';
10
- import './chunk-JOXYKGUV.js';
11
- import './chunk-3ZPYPFNM.js';
12
- import './chunk-USO2DKBD.js';
10
+ import './chunk-XCK2YAY5.js';
11
+ import './chunk-FOJGZYFC.js';
12
+ import { runConnect, COMMIT_LINE } from './chunk-YDSMROTB.js';
13
+ import './chunk-WUYTWNMA.js';
14
+ import './chunk-JXYVA45C.js';
15
+ import './chunk-4KSQKQXE.js';
13
16
  import './chunk-N6LURUEF.js';
14
17
  import { C } from './chunk-YRYMNBGQ.js';
15
18
  import './chunk-WZBHBH3J.js';
16
19
  import './chunk-5QRP3MVS.js';
17
- import './chunk-G5IEVZGI.js';
18
- import './chunk-AHZQBGD2.js';
20
+ import './chunk-LCEXHCHD.js';
19
21
  import './chunk-YO4PSLVB.js';
22
+ import './chunk-ZA5CHAFY.js';
23
+ import './chunk-2M63GG56.js';
20
24
  import './chunk-PLMTLGYH.js';
21
- import './chunk-325272HM.js';
25
+ import './chunk-J5M7BSJQ.js';
22
26
  import './chunk-EABW6AJQ.js';
27
+ import './chunk-RA3O54FC.js';
23
28
  import './chunk-V7NIVOFD.js';
24
29
  import './chunk-ZM2IMMYN.js';
25
- import './chunk-YEQL54G5.js';
30
+ import './chunk-PQUM37BK.js';
26
31
  import './chunk-XCCLFVXM.js';
27
32
  import './chunk-BJ3KTMDH.js';
28
33
  import './chunk-VNVZDWO3.js';
@@ -87,7 +92,9 @@ ${CLOSING_LINE}
87
92
  if (connect.linkUrl !== void 0 && connect.repository !== void 0) unlinked = { repository: connect.repository, url: connect.linkUrl };
88
93
  const connected = connect.outcome === "done";
89
94
  if (connect.outcome === "done") {
90
- (flags.json ? deps.stderr : { write: (s) => (say(`${C.green}\u2713${C.reset} ${s}`), true) }).write(connect.text);
95
+ const mark = connect.linked === false ? `${C.yellow}!${C.reset}` : `${C.green}\u2713${C.reset}`;
96
+ if (flags.json) deps.stderr.write(connect.text);
97
+ else say(`${mark} ${connect.text}`);
91
98
  } else if (connect.outcome === "skipped") {
92
99
  say(`${C.dim}- Connect skipped: ${connect.reason}${C.reset}
93
100
  `);
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { keepHandWritten } from './chunk-SXWS25JC.js';
4
+ import { runEmit } from './chunk-HFKKFTXU.js';
5
+ import { contextIsGoverned, inspectStarterFiles, canonical } from './chunk-MTF3PHVZ.js';
6
+ import { setMcpEntry } from './chunk-XCK2YAY5.js';
7
+ import './chunk-FOJGZYFC.js';
8
+ import { COMMIT_LINE } from './chunk-YDSMROTB.js';
9
+ import './chunk-WUYTWNMA.js';
10
+ import './chunk-JXYVA45C.js';
11
+ import './chunk-4KSQKQXE.js';
12
+ import './chunk-N6LURUEF.js';
13
+ import { C } from './chunk-YRYMNBGQ.js';
14
+ import './chunk-3NLOVYJQ.js';
15
+ import './chunk-LCEXHCHD.js';
16
+ import './chunk-ZJSNLVCE.js';
17
+ import './chunk-YO4PSLVB.js';
18
+ import './chunk-BYT5O5RV.js';
19
+ import './chunk-ZA5CHAFY.js';
20
+ import './chunk-2M63GG56.js';
21
+ import './chunk-PLMTLGYH.js';
22
+ import './chunk-J5M7BSJQ.js';
23
+ import './chunk-EABW6AJQ.js';
24
+ import './chunk-RA3O54FC.js';
25
+ import './chunk-V7NIVOFD.js';
26
+ import './chunk-ZM2IMMYN.js';
27
+ import './chunk-XCCLFVXM.js';
28
+ import { findGitDirs } from './chunk-BJ3KTMDH.js';
29
+ import './chunk-VNVZDWO3.js';
30
+ import './chunk-Z5GEFMRW.js';
31
+ import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
32
+ import { join, dirname } from 'path';
33
+
34
+ createRequire(import.meta.url);
35
+ var NOT_COMPILED = "There is no .outerlayer/config.json, so `outerlayer context emit` did not run.";
36
+ var errorMessage = (err) => err instanceof Error ? err.message : String(err);
37
+ function actionFor(item) {
38
+ if (item.state === "outdated") return "update";
39
+ if (item.state === "missing") return "write";
40
+ if (item.state === "current") return "none";
41
+ return "keep";
42
+ }
43
+ function plan(report) {
44
+ return report.items.map((item) => {
45
+ const planned = { path: item.path, state: item.state, action: actionFor(item) };
46
+ if (item.kind === "mcp") planned.server = item.server;
47
+ if (item.kind === "file" && item.state === "edited" && item.file.source !== void 0) {
48
+ planned.compare = `git diff --no-index ${item.file.source} ${item.path}`;
49
+ }
50
+ return planned;
51
+ });
52
+ }
53
+ function apply(root, item) {
54
+ if (item.kind === "file") {
55
+ const abs = join(root, item.path);
56
+ mkdirSync(dirname(abs), { recursive: true });
57
+ writeFileSync(abs, item.file.content);
58
+ } else {
59
+ setMcpEntry(root, item.server, { ...item.entry });
60
+ }
61
+ }
62
+ var CLASHING_FLAGS = ["remove", "org", "local", "template", "factory"];
63
+ function updateFlagProblem(flags) {
64
+ if (flags.update !== true) return flags.dryRun === true ? "--dry-run only applies to --update." : void 0;
65
+ const clash = CLASHING_FLAGS.find((name) => flags[name] !== void 0 && flags[name] !== false);
66
+ return clash === void 0 ? void 0 : `--update changes only the files init wrote, so it cannot be combined with --${clash}.`;
67
+ }
68
+ var MCP_SOURCE = ".outerlayer/mcp.json";
69
+ function sameJson(a, b) {
70
+ try {
71
+ return b !== void 0 && canonical(JSON.parse(a)) === canonical(JSON.parse(b));
72
+ } catch {
73
+ return false;
74
+ }
75
+ }
76
+ function keepUnlessCompiled(keep, mcpSourceBefore) {
77
+ return (output) => {
78
+ if (output.kind === "file" && sameJson(output.existing, mcpSourceBefore)) return false;
79
+ return keep(output);
80
+ };
81
+ }
82
+ function runInitUpdate(opts) {
83
+ const dryRun = opts.dryRun === true;
84
+ const empty = { dryRun, items: [], emitted: [], kept: [], manifest: "ok" };
85
+ const dirs = findGitDirs(opts.cwd);
86
+ if (dirs === void 0) return { ...empty, status: "skipped", reason: "not a git repository" };
87
+ const root = dirs.repoRoot;
88
+ if (contextIsGoverned(root, dirs.gitCommonDir)) {
89
+ return { ...empty, status: "skipped", reason: "this repository's context comes from a control plane and arrives at session start" };
90
+ }
91
+ const report = inspectStarterFiles(root, { packRoot: opts.packRoot });
92
+ const items = plan(report);
93
+ const base = { dryRun, items, emitted: [], kept: [], manifest: report.manifest };
94
+ const changes = report.items.filter((i) => i.state === "outdated" || i.state === "missing");
95
+ if (dryRun || changes.length === 0) return { ...base, status: "done", reason: changes.length === 0 ? "nothing to update" : "dry run" };
96
+ const created = new Set(changes.filter((i) => i.kind === "file" && i.state === "missing").map((i) => i.path));
97
+ const mcpSource = join(root, MCP_SOURCE);
98
+ const mcpSourceBefore = existsSync(mcpSource) ? readFileSync(mcpSource, "utf8") : void 0;
99
+ try {
100
+ for (const item of changes) apply(root, item);
101
+ } catch (err) {
102
+ return { ...base, status: "failed", reason: `could not write the files: ${errorMessage(err)}` };
103
+ }
104
+ if (!existsSync(join(root, ".outerlayer", "config.json"))) {
105
+ return { ...base, status: "done", reason: NOT_COMPILED };
106
+ }
107
+ try {
108
+ const keep = keepUnlessCompiled(keepHandWritten(created), mcpSourceBefore);
109
+ const pending = runEmit({ cwd: root, check: true, quiet: true, keep }).drift ?? [];
110
+ const emitted = runEmit({ cwd: root, quiet: true, keep });
111
+ if (emitted.exitCode !== 0) throw new Error(emitted.errors.map((e) => `${e.path}: ${e.message}`).join("; "));
112
+ return {
113
+ ...base,
114
+ status: "done",
115
+ reason: "updated",
116
+ emitted: pending.filter((d) => d.kind !== "orphaned").map((d) => d.path),
117
+ kept: emitted.kept
118
+ };
119
+ } catch (err) {
120
+ return { ...base, status: "failed", reason: `context emit failed: ${errorMessage(err)}` };
121
+ }
122
+ }
123
+ var VERB = {
124
+ update: { done: "updated", planned: "would update" },
125
+ write: { done: "wrote", planned: "would write" }
126
+ };
127
+ function formatInitUpdate(result) {
128
+ if (result.status === "skipped") return `${C.dim}- Nothing to update: ${result.reason}${C.reset}
129
+ `;
130
+ const lines = [];
131
+ const label = (p) => p.server === void 0 ? p.path : `${p.path} "${p.server}" server`;
132
+ const changed = result.items.filter((p) => p.action === "update" || p.action === "write");
133
+ const kept = result.items.filter((p) => p.action === "keep");
134
+ const current = result.items.filter((p) => p.action === "none");
135
+ lines.push(result.dryRun ? "Plan for `outerlayer init --update` (nothing written):" : "Starter files:");
136
+ for (const p of changed) {
137
+ const verb = VERB[p.action];
138
+ const why = p.action === "update" ? "outdated, unedited" : "missing";
139
+ lines.push(` ${result.dryRun ? verb.planned : `${C.green}${verb.done}${C.reset}`} ${label(p)} ${C.dim}(${why})${C.reset}`);
140
+ }
141
+ for (const p of kept) {
142
+ const why = p.state === "unreadable" ? "not valid JSON" : "edited by you";
143
+ lines.push(` ${C.yellow}kept${C.reset} ${label(p)} ${C.dim}(${why}, left as it is)${C.reset}`);
144
+ if (p.compare !== void 0) lines.push(` ${C.dim}compare: ${p.compare}${C.reset}`);
145
+ }
146
+ if (current.length > 0) lines.push(` ${C.dim}${current.length} already current${C.reset}`);
147
+ if (result.manifest !== "ok") {
148
+ lines.push(
149
+ ` ${C.yellow}!${C.reset} This CLI's record of earlier versions is ${result.manifest}, so every changed file counts as edited and is left as it is.`
150
+ );
151
+ }
152
+ if (result.emitted.length > 0) {
153
+ lines.push("", "Recompiled by `outerlayer context emit`:", ...result.emitted.map((p) => ` ${p}`));
154
+ }
155
+ for (const p of result.kept) lines.push(` ${C.dim}kept ${p} (written by hand, not replaced)${C.reset}`);
156
+ if (result.status === "failed") lines.push("", `${C.red}\u2717${C.reset} ${result.reason}`);
157
+ else if (!result.dryRun && changed.length > 0) {
158
+ if (result.reason === NOT_COMPILED) lines.push("", `${C.dim}${NOT_COMPILED}${C.reset}`);
159
+ lines.push("", "The changes are left uncommitted.", COMMIT_LINE);
160
+ } else if (changed.length === 0) lines.push("", `${C.green}\u2713${C.reset} Nothing to update.`);
161
+ return `${lines.join("\n")}
162
+ `;
163
+ }
164
+
165
+ export { formatInitUpdate, runInitUpdate, updateFlagProblem };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { DEFAULT_UNIT_NAME, installService, uninstallService, unitPathFor } from './chunk-2KLBKHT4.js';
4
- import './chunk-XR3BJN33.js';
3
+ export { DEFAULT_UNIT_NAME, installService, uninstallService, unitPathFor } from './chunk-RLYZLUQ7.js';
4
+ import './chunk-22RMZBGW.js';
5
5
  import './chunk-UXYLWVTQ.js';
6
6
  import './chunk-7RQ73DLO.js';
7
7
  import './chunk-4Q7OMKAT.js';
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { DEFAULT_DASHBOARD, readPipedKey, realLoginDeps, runLoginCommand, sanitizeMachineName, stdinKind } from './chunk-USO2DKBD.js';
3
+ export { DEFAULT_DASHBOARD, readPipedKey, realLoginDeps, runLoginCommand, sanitizeMachineName, stdinKind } from './chunk-4KSQKQXE.js';
4
4
  import './chunk-N6LURUEF.js';
5
5
  import './chunk-YRYMNBGQ.js';
6
6
  import './chunk-EABW6AJQ.js';
7
+ import './chunk-BJ3KTMDH.js';
7
8
  import './chunk-VNVZDWO3.js';
8
9
  import './chunk-Z5GEFMRW.js';
9
10
 
@@ -1,69 +1,69 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { RunnerStartError, listJobFiles, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-G4RXNF2L.js';
4
- import './chunk-DVT73QJO.js';
3
+ export { RunnerStartError, listJobFiles, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-NHDVD7DU.js';
4
+ import './chunk-4OGPT6I2.js';
5
5
  import './chunk-O765JR4W.js';
6
6
  import './chunk-UGP76IZ5.js';
7
7
  import './chunk-3JVYMD4G.js';
8
- import './chunk-T6OIJQRT.js';
9
- import './chunk-I2UOAV7X.js';
10
8
  import './chunk-YETTWTAY.js';
9
+ import './chunk-RMWLBUCJ.js';
10
+ import './chunk-I2UOAV7X.js';
11
+ import './chunk-HYZRY4KZ.js';
11
12
  import './chunk-FI5UYJMQ.js';
12
- import './chunk-5TGQHOUX.js';
13
- import './chunk-27Y7AX2O.js';
13
+ import './chunk-KFRM23WD.js';
14
+ import './chunk-MSASO5O4.js';
14
15
  import './chunk-HHJDN6AU.js';
15
- import './chunk-HYZRY4KZ.js';
16
- import './chunk-PDRYXERC.js';
16
+ import './chunk-SMHOCDCI.js';
17
17
  import './chunk-YYYRBYWG.js';
18
18
  import './chunk-TI7B7UEO.js';
19
19
  import './chunk-TBT347UY.js';
20
- import './chunk-GEBQXUFY.js';
21
- import './chunk-IBB4D4KE.js';
22
- import './chunk-SKHN72JO.js';
23
- import './chunk-VK25O2ZM.js';
24
- import './chunk-2KLBKHT4.js';
20
+ import './chunk-Q2UK3C4P.js';
21
+ import './chunk-JYIEHQIF.js';
22
+ import './chunk-RBKIH5ST.js';
23
+ import './chunk-KMDLFI4P.js';
24
+ import './chunk-QKFB4K7X.js';
25
+ import './chunk-RSNSZ2LJ.js';
26
+ import './chunk-T5VPP6H7.js';
27
+ import './chunk-RLYZLUQ7.js';
25
28
  import './chunk-6MZSX4M7.js';
26
- import './chunk-3FMPZPJQ.js';
29
+ import './chunk-SWHQ4LUM.js';
30
+ import './chunk-NPQWKGUA.js';
31
+ import './chunk-IP7BIBXJ.js';
32
+ import './chunk-22RMZBGW.js';
33
+ import './chunk-UXYLWVTQ.js';
34
+ import './chunk-R7PF5OOU.js';
35
+ import './chunk-QOZKPLVJ.js';
27
36
  import './chunk-N5FOE5PS.js';
28
37
  import './chunk-OGFGZQA3.js';
29
- import './chunk-GGMRZPEA.js';
30
- import './chunk-QOZKPLVJ.js';
31
- import './chunk-QEESCZ26.js';
38
+ import './chunk-4NPZVMJU.js';
39
+ import './chunk-7RQ73DLO.js';
40
+ import './chunk-4Q7OMKAT.js';
32
41
  import './chunk-CX22S5BA.js';
33
- import './chunk-QKFB4K7X.js';
34
- import './chunk-RSNSZ2LJ.js';
35
42
  import './chunk-F7CU5ABH.js';
36
43
  import './chunk-BKO6JEZI.js';
37
- import './chunk-6FH2AHJY.js';
38
- import './chunk-GATMPAMK.js';
39
- import './chunk-IP7BIBXJ.js';
40
- import './chunk-C7N4TDHW.js';
41
- import './chunk-JOXYKGUV.js';
42
- import './chunk-3ZPYPFNM.js';
43
- import './chunk-USO2DKBD.js';
44
+ import './chunk-YDSMROTB.js';
45
+ import './chunk-WUYTWNMA.js';
46
+ import './chunk-JXYVA45C.js';
47
+ import './chunk-4KSQKQXE.js';
44
48
  import './chunk-N6LURUEF.js';
45
49
  import './chunk-YRYMNBGQ.js';
46
- import './chunk-XR3BJN33.js';
47
- import './chunk-UXYLWVTQ.js';
48
- import './chunk-7RQ73DLO.js';
49
- import './chunk-4Q7OMKAT.js';
50
50
  import './chunk-GQD22KKN.js';
51
51
  import './chunk-WZBHBH3J.js';
52
52
  import './chunk-5QRP3MVS.js';
53
- import './chunk-SZOVKFWB.js';
53
+ import './chunk-3NLOVYJQ.js';
54
+ import './chunk-LCEXHCHD.js';
54
55
  import './chunk-ZJSNLVCE.js';
55
- import './chunk-FO7KKPYG.js';
56
- import './chunk-G5IEVZGI.js';
57
- import './chunk-AHZQBGD2.js';
58
56
  import './chunk-YO4PSLVB.js';
57
+ import './chunk-BYT5O5RV.js';
58
+ import './chunk-ZA5CHAFY.js';
59
+ import './chunk-2M63GG56.js';
59
60
  import './chunk-PLMTLGYH.js';
60
- import './chunk-325272HM.js';
61
+ import './chunk-J5M7BSJQ.js';
61
62
  import './chunk-EABW6AJQ.js';
62
- import './chunk-BYT5O5RV.js';
63
63
  import './chunk-RA3O54FC.js';
64
64
  import './chunk-V7NIVOFD.js';
65
65
  import './chunk-ZM2IMMYN.js';
66
- import './chunk-YEQL54G5.js';
66
+ import './chunk-PQUM37BK.js';
67
67
  import './chunk-XCCLFVXM.js';
68
68
  import './chunk-BJ3KTMDH.js';
69
69
  import './chunk-VNVZDWO3.js';