everything-dev 2.0.0-rc.6 → 2.0.0-rc.8

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 (148) hide show
  1. package/README.md +2 -2
  2. package/dist/api/auth-middleware.cjs +14 -1
  3. package/dist/api/auth-middleware.cjs.map +1 -1
  4. package/dist/api/auth-middleware.d.cts +9 -0
  5. package/dist/api/auth-middleware.d.mts +9 -0
  6. package/dist/api/auth-middleware.mjs +14 -1
  7. package/dist/api/auth-middleware.mjs.map +1 -1
  8. package/dist/build.cjs +1 -1
  9. package/dist/build.mjs +1 -1
  10. package/dist/bundle-cache.cjs +1 -1
  11. package/dist/bundle-cache.cjs.map +1 -1
  12. package/dist/bundle-cache.mjs +1 -1
  13. package/dist/bundle-cache.mjs.map +1 -1
  14. package/dist/cli/init.cjs +22 -10
  15. package/dist/cli/init.cjs.map +1 -1
  16. package/dist/cli/init.mjs +22 -10
  17. package/dist/cli/init.mjs.map +1 -1
  18. package/dist/cli.cjs +6 -5
  19. package/dist/cli.cjs.map +1 -1
  20. package/dist/cli.mjs +5 -4
  21. package/dist/cli.mjs.map +1 -1
  22. package/dist/commands/deploy.cjs +111 -1
  23. package/dist/commands/deploy.cjs.map +1 -1
  24. package/dist/commands/deploy.mjs +112 -2
  25. package/dist/commands/deploy.mjs.map +1 -1
  26. package/dist/commands/keys.cjs +1 -1
  27. package/dist/commands/keys.cjs.map +1 -1
  28. package/dist/commands/keys.mjs +1 -1
  29. package/dist/commands/keys.mjs.map +1 -1
  30. package/dist/commands/smoke.cjs +41 -0
  31. package/dist/commands/smoke.cjs.map +1 -0
  32. package/dist/commands/smoke.mjs +41 -0
  33. package/dist/commands/smoke.mjs.map +1 -0
  34. package/dist/commands/upgrade.cjs +2 -2
  35. package/dist/commands/upgrade.cjs.map +1 -1
  36. package/dist/commands/upgrade.mjs +1 -1
  37. package/dist/commands/upgrade.mjs.map +1 -1
  38. package/dist/contract.cjs +27 -1
  39. package/dist/contract.cjs.map +1 -1
  40. package/dist/contract.d.cts +65 -1
  41. package/dist/contract.d.mts +65 -1
  42. package/dist/contract.meta.cjs +14 -2
  43. package/dist/contract.meta.cjs.map +1 -1
  44. package/dist/contract.meta.d.cts +24 -2
  45. package/dist/contract.meta.d.mts +24 -2
  46. package/dist/contract.meta.mjs +14 -2
  47. package/dist/contract.meta.mjs.map +1 -1
  48. package/dist/contract.mjs +26 -2
  49. package/dist/contract.mjs.map +1 -1
  50. package/dist/db/core.cjs +22 -4
  51. package/dist/db/core.cjs.map +1 -1
  52. package/dist/db/core.mjs +22 -4
  53. package/dist/db/core.mjs.map +1 -1
  54. package/dist/dev-log-pipeline.cjs +6 -0
  55. package/dist/dev-log-pipeline.cjs.map +1 -1
  56. package/dist/dev-log-pipeline.mjs +6 -0
  57. package/dist/dev-log-pipeline.mjs.map +1 -1
  58. package/dist/dev-program.cjs +20 -3
  59. package/dist/dev-program.cjs.map +1 -1
  60. package/dist/dev-program.mjs +20 -4
  61. package/dist/dev-program.mjs.map +1 -1
  62. package/dist/dev-session.cjs +1 -0
  63. package/dist/dev-session.cjs.map +1 -1
  64. package/dist/dev-session.mjs +1 -0
  65. package/dist/dev-session.mjs.map +1 -1
  66. package/dist/fastkv.cjs +21 -3
  67. package/dist/fastkv.cjs.map +1 -1
  68. package/dist/fastkv.d.cts +14 -1
  69. package/dist/fastkv.d.mts +14 -1
  70. package/dist/fastkv.mjs +21 -5
  71. package/dist/fastkv.mjs.map +1 -1
  72. package/dist/{mf.cjs → federation.cjs} +6 -13
  73. package/dist/federation.cjs.map +1 -0
  74. package/dist/{mf.d.cts → federation.d.cts} +2 -2
  75. package/dist/{mf.d.mts → federation.d.mts} +2 -2
  76. package/dist/{mf.mjs → federation.mjs} +6 -13
  77. package/dist/federation.mjs.map +1 -0
  78. package/dist/http-client.cjs +84 -57
  79. package/dist/http-client.cjs.map +1 -1
  80. package/dist/http-client.mjs +84 -58
  81. package/dist/http-client.mjs.map +1 -1
  82. package/dist/image-deploy.cjs +9 -0
  83. package/dist/image-deploy.cjs.map +1 -1
  84. package/dist/image-deploy.mjs +9 -1
  85. package/dist/image-deploy.mjs.map +1 -1
  86. package/dist/index.cjs +4 -0
  87. package/dist/index.d.cts +3 -3
  88. package/dist/index.d.mts +3 -3
  89. package/dist/index.mjs +3 -3
  90. package/dist/infra/planner.cjs +6 -2
  91. package/dist/infra/planner.cjs.map +1 -1
  92. package/dist/infra/planner.mjs +6 -2
  93. package/dist/infra/planner.mjs.map +1 -1
  94. package/dist/orchestrator.cjs +39 -35
  95. package/dist/orchestrator.cjs.map +1 -1
  96. package/dist/orchestrator.mjs +39 -35
  97. package/dist/orchestrator.mjs.map +1 -1
  98. package/dist/plugin.cjs +2 -0
  99. package/dist/plugin.cjs.map +1 -1
  100. package/dist/plugin.d.cts +24 -0
  101. package/dist/plugin.d.mts +24 -0
  102. package/dist/plugin.mjs +2 -0
  103. package/dist/plugin.mjs.map +1 -1
  104. package/dist/process-registry.cjs +1 -1
  105. package/dist/process-registry.mjs +1 -1
  106. package/dist/publish.cjs +3 -3
  107. package/dist/publish.cjs.map +1 -1
  108. package/dist/publish.mjs +4 -4
  109. package/dist/publish.mjs.map +1 -1
  110. package/dist/resolver.cjs +293 -0
  111. package/dist/resolver.cjs.map +1 -0
  112. package/dist/resolver.d.cts +99 -0
  113. package/dist/resolver.d.mts +99 -0
  114. package/dist/resolver.mjs +284 -0
  115. package/dist/resolver.mjs.map +1 -0
  116. package/dist/smoke.cjs +262 -0
  117. package/dist/smoke.cjs.map +1 -0
  118. package/dist/smoke.mjs +260 -0
  119. package/dist/smoke.mjs.map +1 -0
  120. package/dist/ui/auth.d.cts +217 -123
  121. package/dist/ui/auth.d.mts +217 -123
  122. package/dist/ui/router-client.cjs +2 -1
  123. package/dist/ui/router-client.cjs.map +1 -1
  124. package/dist/ui/router-client.mjs +2 -1
  125. package/dist/ui/router-client.mjs.map +1 -1
  126. package/dist/version-manifest-resolve.cjs +3 -3
  127. package/dist/version-manifest-resolve.cjs.map +1 -1
  128. package/dist/version-manifest-resolve.mjs +1 -1
  129. package/dist/version-manifest-resolve.mjs.map +1 -1
  130. package/dist/workspace.cjs +1 -1
  131. package/dist/workspace.mjs +1 -1
  132. package/package.json +18 -18
  133. package/skills/api-and-auth/SKILL.md +12 -9
  134. package/skills/api-and-auth/references/middleware.md +38 -0
  135. package/skills/cli-reference/SKILL.md +22 -6
  136. package/skills/talk-to-the-app/SKILL.md +32 -5
  137. package/dist/bundle-fs-resolve.cjs +0 -235
  138. package/dist/bundle-fs-resolve.cjs.map +0 -1
  139. package/dist/bundle-fs-resolve.d.cts +0 -82
  140. package/dist/bundle-fs-resolve.d.mts +0 -82
  141. package/dist/bundle-fs-resolve.mjs +0 -228
  142. package/dist/bundle-fs-resolve.mjs.map +0 -1
  143. package/dist/bundle-path.cjs +0 -48
  144. package/dist/bundle-path.cjs.map +0 -1
  145. package/dist/bundle-path.mjs +0 -45
  146. package/dist/bundle-path.mjs.map +0 -1
  147. package/dist/mf.cjs.map +0 -1
  148. package/dist/mf.mjs.map +0 -1
@@ -0,0 +1,41 @@
1
+ const require_shared = require('./shared.cjs');
2
+ const require_smoke = require('../smoke.cjs');
3
+ let effect = require("effect");
4
+
5
+ //#region src/commands/smoke.ts
6
+ function registerSmoke(builder) {
7
+ return { smoke: builder.smoke.handler(async ({ input, context }) => {
8
+ const deps = effect.Context.get(context["effect/context"], require_shared.BosDepsTag);
9
+ const account = input.account ?? deps.session?.config?.account;
10
+ const gateway = input.gateway ?? deps.session?.config?.domain;
11
+ if (!input.image) return {
12
+ status: "error",
13
+ error: "smoke requires an image ref — pass --image <ref>"
14
+ };
15
+ console.log(`smoke: booting ${input.image} on :${input.port}`);
16
+ const result = await require_smoke.runSmoke({
17
+ image: input.image,
18
+ port: input.port,
19
+ keep: input.keep,
20
+ ...account ? { account } : {},
21
+ ...gateway ? { gateway } : {},
22
+ ...input.apiDatabaseUrl ? { apiDatabaseUrl: input.apiDatabaseUrl } : {},
23
+ ...input.authDatabaseUrl ? { authDatabaseUrl: input.authDatabaseUrl } : {}
24
+ });
25
+ if (result.ok) return {
26
+ status: "ok",
27
+ image: result.image,
28
+ summary: result.summary
29
+ };
30
+ return {
31
+ status: "error",
32
+ image: result.image,
33
+ ...result.diagnosis ? { diagnosis: result.diagnosis } : {},
34
+ error: result.error
35
+ };
36
+ }) };
37
+ }
38
+
39
+ //#endregion
40
+ exports.registerSmoke = registerSmoke;
41
+ //# sourceMappingURL=smoke.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.cjs","names":["Context","BosDepsTag","runSmoke"],"sources":["../../src/commands/smoke.ts"],"sourcesContent":["import { Context } from \"effect\";\nimport { runSmoke } from \"../smoke\";\nimport { type BosBuilder, BosDepsTag } from \"./shared\";\n\nexport function registerSmoke(builder: BosBuilder) {\n return {\n smoke: builder.smoke.handler(async ({ input, context }) => {\n const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n const account = input.account ?? deps.session?.config?.account;\n const gateway = input.gateway ?? deps.session?.config?.domain;\n\n if (!input.image) {\n return {\n status: \"error\" as const,\n error: \"smoke requires an image ref — pass --image <ref>\",\n };\n }\n\n console.log(`smoke: booting ${input.image} on :${input.port}`);\n const result = await runSmoke({\n image: input.image,\n port: input.port,\n keep: input.keep,\n ...(account ? { account } : {}),\n ...(gateway ? { gateway } : {}),\n ...(input.apiDatabaseUrl ? { apiDatabaseUrl: input.apiDatabaseUrl } : {}),\n ...(input.authDatabaseUrl ? { authDatabaseUrl: input.authDatabaseUrl } : {}),\n });\n\n if (result.ok) {\n return {\n status: \"ok\" as const,\n image: result.image,\n summary: result.summary,\n };\n }\n return {\n status: \"error\" as const,\n image: result.image,\n ...(result.diagnosis ? { diagnosis: result.diagnosis } : {}),\n error: result.error,\n };\n }),\n };\n}\n"],"mappings":";;;;;AAIA,SAAgB,cAAc,SAAqB;CACjD,OAAO,EACL,OAAO,QAAQ,MAAM,QAAQ,OAAO,EAAE,OAAO,cAAc;EACzD,MAAM,OAAOA,eAAQ,IAAI,QAAQ,mBAAmBC,yBAAU;EAC9D,MAAM,UAAU,MAAM,WAAW,KAAK,SAAS,QAAQ;EACvD,MAAM,UAAU,MAAM,WAAW,KAAK,SAAS,QAAQ;EAEvD,IAAI,CAAC,MAAM,OACT,OAAO;GACL,QAAQ;GACR,OAAO;EACT;EAGF,QAAQ,IAAI,kBAAkB,MAAM,MAAM,OAAO,MAAM,MAAM;EAC7D,MAAM,SAAS,MAAMC,uBAAS;GAC5B,OAAO,MAAM;GACb,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;GAC7B,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;GAC7B,GAAI,MAAM,iBAAiB,EAAE,gBAAgB,MAAM,eAAe,IAAI,CAAC;GACvE,GAAI,MAAM,kBAAkB,EAAE,iBAAiB,MAAM,gBAAgB,IAAI,CAAC;EAC5E,CAAC;EAED,IAAI,OAAO,IACT,OAAO;GACL,QAAQ;GACR,OAAO,OAAO;GACd,SAAS,OAAO;EAClB;EAEF,OAAO;GACL,QAAQ;GACR,OAAO,OAAO;GACd,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;GAC1D,OAAO,OAAO;EAChB;CACF,CAAC,EACH;AACF"}
@@ -0,0 +1,41 @@
1
+ import { BosDepsTag } from "./shared.mjs";
2
+ import { runSmoke } from "../smoke.mjs";
3
+ import { Context } from "effect";
4
+
5
+ //#region src/commands/smoke.ts
6
+ function registerSmoke(builder) {
7
+ return { smoke: builder.smoke.handler(async ({ input, context }) => {
8
+ const deps = Context.get(context["effect/context"], BosDepsTag);
9
+ const account = input.account ?? deps.session?.config?.account;
10
+ const gateway = input.gateway ?? deps.session?.config?.domain;
11
+ if (!input.image) return {
12
+ status: "error",
13
+ error: "smoke requires an image ref — pass --image <ref>"
14
+ };
15
+ console.log(`smoke: booting ${input.image} on :${input.port}`);
16
+ const result = await runSmoke({
17
+ image: input.image,
18
+ port: input.port,
19
+ keep: input.keep,
20
+ ...account ? { account } : {},
21
+ ...gateway ? { gateway } : {},
22
+ ...input.apiDatabaseUrl ? { apiDatabaseUrl: input.apiDatabaseUrl } : {},
23
+ ...input.authDatabaseUrl ? { authDatabaseUrl: input.authDatabaseUrl } : {}
24
+ });
25
+ if (result.ok) return {
26
+ status: "ok",
27
+ image: result.image,
28
+ summary: result.summary
29
+ };
30
+ return {
31
+ status: "error",
32
+ image: result.image,
33
+ ...result.diagnosis ? { diagnosis: result.diagnosis } : {},
34
+ error: result.error
35
+ };
36
+ }) };
37
+ }
38
+
39
+ //#endregion
40
+ export { registerSmoke };
41
+ //# sourceMappingURL=smoke.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke.mjs","names":[],"sources":["../../src/commands/smoke.ts"],"sourcesContent":["import { Context } from \"effect\";\nimport { runSmoke } from \"../smoke\";\nimport { type BosBuilder, BosDepsTag } from \"./shared\";\n\nexport function registerSmoke(builder: BosBuilder) {\n return {\n smoke: builder.smoke.handler(async ({ input, context }) => {\n const deps = Context.get(context[\"effect/context\"], BosDepsTag);\n const account = input.account ?? deps.session?.config?.account;\n const gateway = input.gateway ?? deps.session?.config?.domain;\n\n if (!input.image) {\n return {\n status: \"error\" as const,\n error: \"smoke requires an image ref — pass --image <ref>\",\n };\n }\n\n console.log(`smoke: booting ${input.image} on :${input.port}`);\n const result = await runSmoke({\n image: input.image,\n port: input.port,\n keep: input.keep,\n ...(account ? { account } : {}),\n ...(gateway ? { gateway } : {}),\n ...(input.apiDatabaseUrl ? { apiDatabaseUrl: input.apiDatabaseUrl } : {}),\n ...(input.authDatabaseUrl ? { authDatabaseUrl: input.authDatabaseUrl } : {}),\n });\n\n if (result.ok) {\n return {\n status: \"ok\" as const,\n image: result.image,\n summary: result.summary,\n };\n }\n return {\n status: \"error\" as const,\n image: result.image,\n ...(result.diagnosis ? { diagnosis: result.diagnosis } : {}),\n error: result.error,\n };\n }),\n };\n}\n"],"mappings":";;;;;AAIA,SAAgB,cAAc,SAAqB;CACjD,OAAO,EACL,OAAO,QAAQ,MAAM,QAAQ,OAAO,EAAE,OAAO,cAAc;EACzD,MAAM,OAAO,QAAQ,IAAI,QAAQ,mBAAmB,UAAU;EAC9D,MAAM,UAAU,MAAM,WAAW,KAAK,SAAS,QAAQ;EACvD,MAAM,UAAU,MAAM,WAAW,KAAK,SAAS,QAAQ;EAEvD,IAAI,CAAC,MAAM,OACT,OAAO;GACL,QAAQ;GACR,OAAO;EACT;EAGF,QAAQ,IAAI,kBAAkB,MAAM,MAAM,OAAO,MAAM,MAAM;EAC7D,MAAM,SAAS,MAAM,SAAS;GAC5B,OAAO,MAAM;GACb,MAAM,MAAM;GACZ,MAAM,MAAM;GACZ,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;GAC7B,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;GAC7B,GAAI,MAAM,iBAAiB,EAAE,gBAAgB,MAAM,eAAe,IAAI,CAAC;GACvE,GAAI,MAAM,kBAAkB,EAAE,iBAAiB,MAAM,gBAAgB,IAAI,CAAC;EAC5E,CAAC;EAED,IAAI,OAAO,IACT,OAAO;GACL,QAAQ;GACR,OAAO,OAAO;GACd,SAAS,OAAO;EAClB;EAEF,OAAO;GACL,QAAQ;GACR,OAAO,OAAO;GACd,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;GAC1D,OAAO,OAAO;EAChB;CACF,CAAC,EACH;AACF"}
@@ -2,7 +2,7 @@ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
2
  const require_config = require('../config.cjs');
3
3
  const require_theme = require('../utils/theme.cjs');
4
4
  const require_resolution_session = require('../resolution/session.cjs');
5
- const require_mf = require('../mf.cjs');
5
+ const require_federation = require('../federation.cjs');
6
6
  const require_build = require('../build.cjs');
7
7
  const require_code_artifacts = require('../code-artifacts.cjs');
8
8
  const require_dev_program = require('../dev-program.cjs');
@@ -331,7 +331,7 @@ function registerUpgrade(builder) {
331
331
  remotes: []
332
332
  };
333
333
  }
334
- const report = await require_mf.checkFederationCompat(authored, { timeoutMs: input.timeoutMs });
334
+ const report = await require_federation.checkFederationCompat(authored, { timeoutMs: input.timeoutMs });
335
335
  return {
336
336
  status: report.ok ? "ok" : "fail",
337
337
  hostVersion: report.hostVersion,
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.cjs","names":["findConfigPath","MISSING_CONFIG_MESSAGE","resolve","dirname","syncTemplate","openResolution","generateCodeArtifacts","upgradeTemplate","process","existsSync","join","relative","selectWorkspaceTargets","readFileSync","colors","spawnSync","readAuthoredConfigInput","resolvePublishedConfig","checkFederationCompat"],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { selectWorkspaceTargets } from \"../build\";\nimport { syncTemplate } from \"../cli/sync\";\nimport { upgradeTemplate } from \"../cli/upgrade\";\nimport { generateCodeArtifacts } from \"../code-artifacts\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"../config\";\nimport { resolvePublishedConfig } from \"../dev-program\";\nimport { checkFederationCompat } from \"../mf\";\nimport { openResolution } from \"../resolution/session\";\nimport type { BosConfig } from \"../types\";\nimport { colors } from \"../utils/theme\";\nimport type { BosBuilder } from \"./shared\";\n\nexport function registerUpgrade(builder: BosBuilder) {\n return {\n sync: builder.sync.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const result = await syncTemplate(projectDir, input);\n\n if (result.status === \"synced\" || result.status === \"dry-run\") {\n const syncedConfig = await openResolution({ cwd: projectDir });\n if (syncedConfig?.config) {\n await generateCodeArtifacts(projectDir, syncedConfig.config);\n }\n }\n\n return result;\n } catch (error) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n upgrade: builder.upgrade.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await upgradeTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typesGen: builder.typesGen.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const env =\n input.env ?? (process.env.NODE_ENV === \"production\" ? \"production\" : \"development\");\n\n const refreshed = await openResolution({\n cwd: projectDir,\n env,\n remotePlugins: input.remotePlugins,\n });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n if (input.dryRun) {\n const pluginEntries = Object.entries(runtime.plugins ?? {});\n const fetched: string[] = [];\n const skipped: string[] = [];\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n\n if (runtime.api.source !== \"local\") {\n fetched.push(`api remote (${runtime.api.url})`);\n } else {\n const path = runtime.api.localPath\n ? ` (${relative(projectDir, runtime.api.localPath)})`\n : \"\";\n skipped.push(`api local${path}`);\n }\n\n if (runtime.auth) {\n if (runtime.auth.source !== \"local\") {\n fetched.push(`auth remote (${runtime.auth.url})`);\n } else {\n const path = runtime.auth.localPath\n ? ` (${relative(projectDir, runtime.auth.localPath)})`\n : \"\";\n skipped.push(`auth local${path}`);\n }\n }\n\n for (const [key, plugin] of pluginEntries) {\n if (plugin.url && plugin.source !== \"local\") {\n fetched.push(`${key} remote (${plugin.url})`);\n } else if (plugin.localPath) {\n skipped.push(`${key} local (${relative(projectDir, plugin.localPath)})`);\n } else {\n skipped.push(`${key} no URL resolved`);\n }\n }\n\n const generated = [\"ui/src/lib/api-types.gen.ts\", \"ui/src/lib/auth-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of pluginEntries) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed: [],\n };\n }\n\n const artifacts = await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n const generated = [\"ui/src/lib/api-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (runtime.auth && (runtime.auth.source !== \"local\" || runtime.auth.localPath)) {\n generated.push(\"ui/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n const contractStatus = artifacts?.contractStatus ?? [];\n const fetched: string[] = [];\n const skipped: string[] = [];\n const failed: string[] = [];\n for (const entry of contractStatus) {\n if (entry.source === \"remote\") {\n fetched.push(entry.url ? `${entry.key} remote (${entry.url})` : entry.key);\n } else if (entry.source === \"local\") {\n const path = entry.localPath ? ` (${relative(projectDir, entry.localPath)})` : \"\";\n skipped.push(`${entry.key} local${path}`);\n } else if (entry.source === \"skipped\") {\n skipped.push(`${entry.key} no URL resolved`);\n } else if (entry.source === \"failed\") {\n const detail = entry.error ? `: ${entry.error}` : \"\";\n failed.push(`${entry.key}${detail}`);\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typecheck: builder.typecheck.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const refreshed = await openResolution({ cwd: projectDir });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n type AppTarget = { source?: string; localPath?: string };\n const workspaceEntries: Array<{\n key: string;\n label: string;\n dir: string;\n }> = [];\n const skipped: Array<{ key: string; label: string }> = [];\n\n const appTargets: Array<{\n key: string;\n label: string;\n target: AppTarget | undefined;\n }> = [\n { key: \"host\", label: \"host\", target: runtime.host },\n { key: \"ui\", label: \"ui\", target: runtime.ui },\n { key: \"api\", label: \"api\", target: runtime.api },\n ];\n if (runtime.auth) {\n appTargets.push({ key: \"auth\", label: \"auth\", target: runtime.auth });\n }\n\n for (const entry of appTargets) {\n if (\n entry.target?.source === \"local\" &&\n entry.target.localPath &&\n existsSync(join(entry.target.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({\n key: entry.key,\n label: entry.label,\n dir: entry.target.localPath,\n });\n } else {\n skipped.push({ key: entry.key, label: entry.label });\n }\n }\n\n for (const [key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const label = `plugins/${key}`;\n if (\n plugin.source === \"local\" &&\n plugin.localPath &&\n existsSync(join(plugin.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({ key, label, dir: plugin.localPath });\n } else {\n skipped.push({ key, label });\n }\n }\n\n const selected = selectWorkspaceTargets(input.packages, resolvedConfig);\n const targets =\n input.packages === \"all\"\n ? workspaceEntries\n : workspaceEntries.filter((entry) => selected.includes(entry.key));\n const skippedEntries =\n input.packages === \"all\"\n ? skipped\n : skipped.filter((entry) => selected.includes(entry.key));\n\n const checked: string[] = [];\n const results: Array<{\n workspace: string;\n passed: boolean;\n error?: string;\n }> = [];\n\n for (const entry of targets) {\n const packageJsonPath = join(entry.dir, \"package.json\");\n let args: string[] = [\"exec\", \"tsc\", \"--noEmit\"];\n if (existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n scripts?: Record<string, string>;\n };\n if (pkg.scripts?.typecheck) {\n args = [\"run\", \"typecheck\"];\n }\n } catch {}\n }\n\n console.log(`\\n ${colors.dim(\"Checking\")} ${colors.cyan(entry.label)}`);\n const child = spawnSync(\"pnpm\", args, {\n cwd: entry.dir,\n stdio: \"inherit\",\n });\n const passed = child.status === 0;\n checked.push(entry.label);\n results.push({\n workspace: entry.label,\n passed,\n error: passed ? undefined : `typecheck failed (exit code ${child.status ?? \"n/a\"})`,\n });\n }\n\n return {\n status: \"success\" as const,\n checked,\n skipped: skippedEntries.map((entry) => entry.label),\n results,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n mfCheck: builder.mfCheck.handler(async ({ input }) => {\n let authored: BosConfig | null = null;\n try {\n authored = (await readAuthoredConfigInput()) as BosConfig | null;\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n // No local authored config (the universal image carries none): fall\n // back to the registry identity — the same source `bos start` boots\n // from in a runtime container.\n const account = process.env.BOS_ACCOUNT;\n const gateway = process.env.BOS_GATEWAY;\n if (!account || !gateway) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: MISSING_CONFIG_MESSAGE,\n remotes: [],\n };\n }\n try {\n authored = await resolvePublishedConfig(account, gateway);\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: `No config found at bos://${account}/${gateway} — verify BOS_ACCOUNT/BOS_GATEWAY and that the config has been published.`,\n remotes: [],\n };\n }\n }\n\n const report = await checkFederationCompat(authored, {\n timeoutMs: input.timeoutMs,\n });\n return {\n status: report.ok ? (\"ok\" as const) : (\"fail\" as const),\n hostVersion: report.hostVersion,\n hostReachable: report.hostReachable,\n hostReason: report.hostReason,\n remotes: report.remotes,\n };\n }),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"upgrade.cjs","names":["findConfigPath","MISSING_CONFIG_MESSAGE","resolve","dirname","syncTemplate","openResolution","generateCodeArtifacts","upgradeTemplate","process","existsSync","join","relative","selectWorkspaceTargets","readFileSync","colors","spawnSync","readAuthoredConfigInput","resolvePublishedConfig","checkFederationCompat"],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { selectWorkspaceTargets } from \"../build\";\nimport { syncTemplate } from \"../cli/sync\";\nimport { upgradeTemplate } from \"../cli/upgrade\";\nimport { generateCodeArtifacts } from \"../code-artifacts\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"../config\";\nimport { resolvePublishedConfig } from \"../dev-program\";\nimport { checkFederationCompat } from \"../federation\";\nimport { openResolution } from \"../resolution/session\";\nimport type { BosConfig } from \"../types\";\nimport { colors } from \"../utils/theme\";\nimport type { BosBuilder } from \"./shared\";\n\nexport function registerUpgrade(builder: BosBuilder) {\n return {\n sync: builder.sync.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const result = await syncTemplate(projectDir, input);\n\n if (result.status === \"synced\" || result.status === \"dry-run\") {\n const syncedConfig = await openResolution({ cwd: projectDir });\n if (syncedConfig?.config) {\n await generateCodeArtifacts(projectDir, syncedConfig.config);\n }\n }\n\n return result;\n } catch (error) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n upgrade: builder.upgrade.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await upgradeTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typesGen: builder.typesGen.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const env =\n input.env ?? (process.env.NODE_ENV === \"production\" ? \"production\" : \"development\");\n\n const refreshed = await openResolution({\n cwd: projectDir,\n env,\n remotePlugins: input.remotePlugins,\n });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n if (input.dryRun) {\n const pluginEntries = Object.entries(runtime.plugins ?? {});\n const fetched: string[] = [];\n const skipped: string[] = [];\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n\n if (runtime.api.source !== \"local\") {\n fetched.push(`api remote (${runtime.api.url})`);\n } else {\n const path = runtime.api.localPath\n ? ` (${relative(projectDir, runtime.api.localPath)})`\n : \"\";\n skipped.push(`api local${path}`);\n }\n\n if (runtime.auth) {\n if (runtime.auth.source !== \"local\") {\n fetched.push(`auth remote (${runtime.auth.url})`);\n } else {\n const path = runtime.auth.localPath\n ? ` (${relative(projectDir, runtime.auth.localPath)})`\n : \"\";\n skipped.push(`auth local${path}`);\n }\n }\n\n for (const [key, plugin] of pluginEntries) {\n if (plugin.url && plugin.source !== \"local\") {\n fetched.push(`${key} remote (${plugin.url})`);\n } else if (plugin.localPath) {\n skipped.push(`${key} local (${relative(projectDir, plugin.localPath)})`);\n } else {\n skipped.push(`${key} no URL resolved`);\n }\n }\n\n const generated = [\"ui/src/lib/api-types.gen.ts\", \"ui/src/lib/auth-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of pluginEntries) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed: [],\n };\n }\n\n const artifacts = await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n const generated = [\"ui/src/lib/api-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (runtime.auth && (runtime.auth.source !== \"local\" || runtime.auth.localPath)) {\n generated.push(\"ui/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n const contractStatus = artifacts?.contractStatus ?? [];\n const fetched: string[] = [];\n const skipped: string[] = [];\n const failed: string[] = [];\n for (const entry of contractStatus) {\n if (entry.source === \"remote\") {\n fetched.push(entry.url ? `${entry.key} remote (${entry.url})` : entry.key);\n } else if (entry.source === \"local\") {\n const path = entry.localPath ? ` (${relative(projectDir, entry.localPath)})` : \"\";\n skipped.push(`${entry.key} local${path}`);\n } else if (entry.source === \"skipped\") {\n skipped.push(`${entry.key} no URL resolved`);\n } else if (entry.source === \"failed\") {\n const detail = entry.error ? `: ${entry.error}` : \"\";\n failed.push(`${entry.key}${detail}`);\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typecheck: builder.typecheck.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const refreshed = await openResolution({ cwd: projectDir });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n type AppTarget = { source?: string; localPath?: string };\n const workspaceEntries: Array<{\n key: string;\n label: string;\n dir: string;\n }> = [];\n const skipped: Array<{ key: string; label: string }> = [];\n\n const appTargets: Array<{\n key: string;\n label: string;\n target: AppTarget | undefined;\n }> = [\n { key: \"host\", label: \"host\", target: runtime.host },\n { key: \"ui\", label: \"ui\", target: runtime.ui },\n { key: \"api\", label: \"api\", target: runtime.api },\n ];\n if (runtime.auth) {\n appTargets.push({ key: \"auth\", label: \"auth\", target: runtime.auth });\n }\n\n for (const entry of appTargets) {\n if (\n entry.target?.source === \"local\" &&\n entry.target.localPath &&\n existsSync(join(entry.target.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({\n key: entry.key,\n label: entry.label,\n dir: entry.target.localPath,\n });\n } else {\n skipped.push({ key: entry.key, label: entry.label });\n }\n }\n\n for (const [key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const label = `plugins/${key}`;\n if (\n plugin.source === \"local\" &&\n plugin.localPath &&\n existsSync(join(plugin.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({ key, label, dir: plugin.localPath });\n } else {\n skipped.push({ key, label });\n }\n }\n\n const selected = selectWorkspaceTargets(input.packages, resolvedConfig);\n const targets =\n input.packages === \"all\"\n ? workspaceEntries\n : workspaceEntries.filter((entry) => selected.includes(entry.key));\n const skippedEntries =\n input.packages === \"all\"\n ? skipped\n : skipped.filter((entry) => selected.includes(entry.key));\n\n const checked: string[] = [];\n const results: Array<{\n workspace: string;\n passed: boolean;\n error?: string;\n }> = [];\n\n for (const entry of targets) {\n const packageJsonPath = join(entry.dir, \"package.json\");\n let args: string[] = [\"exec\", \"tsc\", \"--noEmit\"];\n if (existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n scripts?: Record<string, string>;\n };\n if (pkg.scripts?.typecheck) {\n args = [\"run\", \"typecheck\"];\n }\n } catch {}\n }\n\n console.log(`\\n ${colors.dim(\"Checking\")} ${colors.cyan(entry.label)}`);\n const child = spawnSync(\"pnpm\", args, {\n cwd: entry.dir,\n stdio: \"inherit\",\n });\n const passed = child.status === 0;\n checked.push(entry.label);\n results.push({\n workspace: entry.label,\n passed,\n error: passed ? undefined : `typecheck failed (exit code ${child.status ?? \"n/a\"})`,\n });\n }\n\n return {\n status: \"success\" as const,\n checked,\n skipped: skippedEntries.map((entry) => entry.label),\n results,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n mfCheck: builder.mfCheck.handler(async ({ input }) => {\n let authored: BosConfig | null = null;\n try {\n authored = (await readAuthoredConfigInput()) as BosConfig | null;\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n // No local authored config (the universal image carries none): fall\n // back to the registry identity — the same source `bos start` boots\n // from in a runtime container.\n const account = process.env.BOS_ACCOUNT;\n const gateway = process.env.BOS_GATEWAY;\n if (!account || !gateway) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: MISSING_CONFIG_MESSAGE,\n remotes: [],\n };\n }\n try {\n authored = await resolvePublishedConfig(account, gateway);\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: `No config found at bos://${account}/${gateway} — verify BOS_ACCOUNT/BOS_GATEWAY and that the config has been published.`,\n remotes: [],\n };\n }\n }\n\n const report = await checkFederationCompat(authored, {\n timeoutMs: input.timeoutMs,\n });\n return {\n status: report.ok ? (\"ok\" as const) : (\"fail\" as const),\n hostVersion: report.hostVersion,\n hostReachable: report.hostReachable,\n hostReason: report.hostReason,\n remotes: report.remotes,\n };\n }),\n };\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { MISSING_CONFIG_MESSAGE, findConfigPath, readAuthoredConfigInput } from "../config.mjs";
2
2
  import { colors } from "../utils/theme.mjs";
3
3
  import { openResolution } from "../resolution/session.mjs";
4
- import { checkFederationCompat } from "../mf.mjs";
4
+ import { checkFederationCompat } from "../federation.mjs";
5
5
  import { selectWorkspaceTargets } from "../build.mjs";
6
6
  import { generateCodeArtifacts } from "../code-artifacts.mjs";
7
7
  import { resolvePublishedConfig } from "../dev-program.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.mjs","names":[],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { selectWorkspaceTargets } from \"../build\";\nimport { syncTemplate } from \"../cli/sync\";\nimport { upgradeTemplate } from \"../cli/upgrade\";\nimport { generateCodeArtifacts } from \"../code-artifacts\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"../config\";\nimport { resolvePublishedConfig } from \"../dev-program\";\nimport { checkFederationCompat } from \"../mf\";\nimport { openResolution } from \"../resolution/session\";\nimport type { BosConfig } from \"../types\";\nimport { colors } from \"../utils/theme\";\nimport type { BosBuilder } from \"./shared\";\n\nexport function registerUpgrade(builder: BosBuilder) {\n return {\n sync: builder.sync.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const result = await syncTemplate(projectDir, input);\n\n if (result.status === \"synced\" || result.status === \"dry-run\") {\n const syncedConfig = await openResolution({ cwd: projectDir });\n if (syncedConfig?.config) {\n await generateCodeArtifacts(projectDir, syncedConfig.config);\n }\n }\n\n return result;\n } catch (error) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n upgrade: builder.upgrade.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await upgradeTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typesGen: builder.typesGen.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const env =\n input.env ?? (process.env.NODE_ENV === \"production\" ? \"production\" : \"development\");\n\n const refreshed = await openResolution({\n cwd: projectDir,\n env,\n remotePlugins: input.remotePlugins,\n });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n if (input.dryRun) {\n const pluginEntries = Object.entries(runtime.plugins ?? {});\n const fetched: string[] = [];\n const skipped: string[] = [];\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n\n if (runtime.api.source !== \"local\") {\n fetched.push(`api remote (${runtime.api.url})`);\n } else {\n const path = runtime.api.localPath\n ? ` (${relative(projectDir, runtime.api.localPath)})`\n : \"\";\n skipped.push(`api local${path}`);\n }\n\n if (runtime.auth) {\n if (runtime.auth.source !== \"local\") {\n fetched.push(`auth remote (${runtime.auth.url})`);\n } else {\n const path = runtime.auth.localPath\n ? ` (${relative(projectDir, runtime.auth.localPath)})`\n : \"\";\n skipped.push(`auth local${path}`);\n }\n }\n\n for (const [key, plugin] of pluginEntries) {\n if (plugin.url && plugin.source !== \"local\") {\n fetched.push(`${key} remote (${plugin.url})`);\n } else if (plugin.localPath) {\n skipped.push(`${key} local (${relative(projectDir, plugin.localPath)})`);\n } else {\n skipped.push(`${key} no URL resolved`);\n }\n }\n\n const generated = [\"ui/src/lib/api-types.gen.ts\", \"ui/src/lib/auth-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of pluginEntries) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed: [],\n };\n }\n\n const artifacts = await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n const generated = [\"ui/src/lib/api-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (runtime.auth && (runtime.auth.source !== \"local\" || runtime.auth.localPath)) {\n generated.push(\"ui/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n const contractStatus = artifacts?.contractStatus ?? [];\n const fetched: string[] = [];\n const skipped: string[] = [];\n const failed: string[] = [];\n for (const entry of contractStatus) {\n if (entry.source === \"remote\") {\n fetched.push(entry.url ? `${entry.key} remote (${entry.url})` : entry.key);\n } else if (entry.source === \"local\") {\n const path = entry.localPath ? ` (${relative(projectDir, entry.localPath)})` : \"\";\n skipped.push(`${entry.key} local${path}`);\n } else if (entry.source === \"skipped\") {\n skipped.push(`${entry.key} no URL resolved`);\n } else if (entry.source === \"failed\") {\n const detail = entry.error ? `: ${entry.error}` : \"\";\n failed.push(`${entry.key}${detail}`);\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typecheck: builder.typecheck.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const refreshed = await openResolution({ cwd: projectDir });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n type AppTarget = { source?: string; localPath?: string };\n const workspaceEntries: Array<{\n key: string;\n label: string;\n dir: string;\n }> = [];\n const skipped: Array<{ key: string; label: string }> = [];\n\n const appTargets: Array<{\n key: string;\n label: string;\n target: AppTarget | undefined;\n }> = [\n { key: \"host\", label: \"host\", target: runtime.host },\n { key: \"ui\", label: \"ui\", target: runtime.ui },\n { key: \"api\", label: \"api\", target: runtime.api },\n ];\n if (runtime.auth) {\n appTargets.push({ key: \"auth\", label: \"auth\", target: runtime.auth });\n }\n\n for (const entry of appTargets) {\n if (\n entry.target?.source === \"local\" &&\n entry.target.localPath &&\n existsSync(join(entry.target.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({\n key: entry.key,\n label: entry.label,\n dir: entry.target.localPath,\n });\n } else {\n skipped.push({ key: entry.key, label: entry.label });\n }\n }\n\n for (const [key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const label = `plugins/${key}`;\n if (\n plugin.source === \"local\" &&\n plugin.localPath &&\n existsSync(join(plugin.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({ key, label, dir: plugin.localPath });\n } else {\n skipped.push({ key, label });\n }\n }\n\n const selected = selectWorkspaceTargets(input.packages, resolvedConfig);\n const targets =\n input.packages === \"all\"\n ? workspaceEntries\n : workspaceEntries.filter((entry) => selected.includes(entry.key));\n const skippedEntries =\n input.packages === \"all\"\n ? skipped\n : skipped.filter((entry) => selected.includes(entry.key));\n\n const checked: string[] = [];\n const results: Array<{\n workspace: string;\n passed: boolean;\n error?: string;\n }> = [];\n\n for (const entry of targets) {\n const packageJsonPath = join(entry.dir, \"package.json\");\n let args: string[] = [\"exec\", \"tsc\", \"--noEmit\"];\n if (existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n scripts?: Record<string, string>;\n };\n if (pkg.scripts?.typecheck) {\n args = [\"run\", \"typecheck\"];\n }\n } catch {}\n }\n\n console.log(`\\n ${colors.dim(\"Checking\")} ${colors.cyan(entry.label)}`);\n const child = spawnSync(\"pnpm\", args, {\n cwd: entry.dir,\n stdio: \"inherit\",\n });\n const passed = child.status === 0;\n checked.push(entry.label);\n results.push({\n workspace: entry.label,\n passed,\n error: passed ? undefined : `typecheck failed (exit code ${child.status ?? \"n/a\"})`,\n });\n }\n\n return {\n status: \"success\" as const,\n checked,\n skipped: skippedEntries.map((entry) => entry.label),\n results,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n mfCheck: builder.mfCheck.handler(async ({ input }) => {\n let authored: BosConfig | null = null;\n try {\n authored = (await readAuthoredConfigInput()) as BosConfig | null;\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n // No local authored config (the universal image carries none): fall\n // back to the registry identity — the same source `bos start` boots\n // from in a runtime container.\n const account = process.env.BOS_ACCOUNT;\n const gateway = process.env.BOS_GATEWAY;\n if (!account || !gateway) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: MISSING_CONFIG_MESSAGE,\n remotes: [],\n };\n }\n try {\n authored = await resolvePublishedConfig(account, gateway);\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: `No config found at bos://${account}/${gateway} — verify BOS_ACCOUNT/BOS_GATEWAY and that the config has been published.`,\n remotes: [],\n };\n }\n }\n\n const report = await checkFederationCompat(authored, {\n timeoutMs: input.timeoutMs,\n });\n return {\n status: report.ok ? (\"ok\" as const) : (\"fail\" as const),\n hostVersion: report.hostVersion,\n hostReachable: report.hostReachable,\n hostReason: report.hostReason,\n remotes: report.remotes,\n };\n }),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"upgrade.mjs","names":[],"sources":["../../src/commands/upgrade.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport process from \"node:process\";\nimport { selectWorkspaceTargets } from \"../build\";\nimport { syncTemplate } from \"../cli/sync\";\nimport { upgradeTemplate } from \"../cli/upgrade\";\nimport { generateCodeArtifacts } from \"../code-artifacts\";\nimport { findConfigPath, MISSING_CONFIG_MESSAGE, readAuthoredConfigInput } from \"../config\";\nimport { resolvePublishedConfig } from \"../dev-program\";\nimport { checkFederationCompat } from \"../federation\";\nimport { openResolution } from \"../resolution/session\";\nimport type { BosConfig } from \"../types\";\nimport { colors } from \"../utils/theme\";\nimport type { BosBuilder } from \"./shared\";\n\nexport function registerUpgrade(builder: BosBuilder) {\n return {\n sync: builder.sync.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const result = await syncTemplate(projectDir, input);\n\n if (result.status === \"synced\" || result.status === \"dry-run\") {\n const syncedConfig = await openResolution({ cwd: projectDir });\n if (syncedConfig?.config) {\n await generateCodeArtifacts(projectDir, syncedConfig.config);\n }\n }\n\n return result;\n } catch (error) {\n return {\n status: \"error\" as const,\n updated: [],\n skipped: [],\n added: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n upgrade: builder.upgrade.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n packages: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n return await upgradeTemplate(projectDir, input);\n } catch (error) {\n return {\n status: \"error\" as const,\n packages: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typesGen: builder.typesGen.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const env =\n input.env ?? (process.env.NODE_ENV === \"production\" ? \"production\" : \"development\");\n\n const refreshed = await openResolution({\n cwd: projectDir,\n env,\n remotePlugins: input.remotePlugins,\n });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n if (input.dryRun) {\n const pluginEntries = Object.entries(runtime.plugins ?? {});\n const fetched: string[] = [];\n const skipped: string[] = [];\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n\n if (runtime.api.source !== \"local\") {\n fetched.push(`api remote (${runtime.api.url})`);\n } else {\n const path = runtime.api.localPath\n ? ` (${relative(projectDir, runtime.api.localPath)})`\n : \"\";\n skipped.push(`api local${path}`);\n }\n\n if (runtime.auth) {\n if (runtime.auth.source !== \"local\") {\n fetched.push(`auth remote (${runtime.auth.url})`);\n } else {\n const path = runtime.auth.localPath\n ? ` (${relative(projectDir, runtime.auth.localPath)})`\n : \"\";\n skipped.push(`auth local${path}`);\n }\n }\n\n for (const [key, plugin] of pluginEntries) {\n if (plugin.url && plugin.source !== \"local\") {\n fetched.push(`${key} remote (${plugin.url})`);\n } else if (plugin.localPath) {\n skipped.push(`${key} local (${relative(projectDir, plugin.localPath)})`);\n } else {\n skipped.push(`${key} no URL resolved`);\n }\n }\n\n const generated = [\"ui/src/lib/api-types.gen.ts\", \"ui/src/lib/auth-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of pluginEntries) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed: [],\n };\n }\n\n const artifacts = await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n\n const hasLocalApiWorkspace = existsSync(join(projectDir, \"api\", \"src\"));\n const generated = [\"ui/src/lib/api-types.gen.ts\"];\n if (hasLocalApiWorkspace) {\n generated.push(\"api/src/lib/plugins-types.gen.ts\", \"api/src/lib/auth-types.gen.ts\");\n }\n if (runtime.auth && (runtime.auth.source !== \"local\" || runtime.auth.localPath)) {\n generated.push(\"ui/src/lib/auth-types.gen.ts\");\n }\n if (existsSync(join(projectDir, \"host\", \"src\"))) {\n generated.push(\"host/src/lib/auth-types.gen.ts\");\n }\n for (const [_key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const localPath = plugin.localPath;\n if (!localPath) continue;\n const pluginSrc = join(localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(pluginSrc)) {\n generated.push(relative(projectDir, pluginSrc));\n }\n }\n if (runtime.auth?.localPath) {\n const authSrc = join(runtime.auth.localPath, \"src\", \"lib\", \"plugins-client.gen.ts\");\n if (existsSync(authSrc)) {\n generated.push(relative(projectDir, authSrc));\n }\n }\n\n const contractStatus = artifacts?.contractStatus ?? [];\n const fetched: string[] = [];\n const skipped: string[] = [];\n const failed: string[] = [];\n for (const entry of contractStatus) {\n if (entry.source === \"remote\") {\n fetched.push(entry.url ? `${entry.key} remote (${entry.url})` : entry.key);\n } else if (entry.source === \"local\") {\n const path = entry.localPath ? ` (${relative(projectDir, entry.localPath)})` : \"\";\n skipped.push(`${entry.key} local${path}`);\n } else if (entry.source === \"skipped\") {\n skipped.push(`${entry.key} no URL resolved`);\n } else if (entry.source === \"failed\") {\n const detail = entry.error ? `: ${entry.error}` : \"\";\n failed.push(`${entry.key}${detail}`);\n }\n }\n\n return {\n status: \"success\" as const,\n generated,\n fetched,\n skipped,\n failed,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n generated: [],\n fetched: [],\n skipped: [],\n failed: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n typecheck: builder.typecheck.handler(async ({ input }) => {\n try {\n const configPath = findConfigPath();\n if (!configPath) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: `${MISSING_CONFIG_MESSAGE} in current directory`,\n };\n }\n\n const projectDir = resolve(dirname(configPath));\n const refreshed = await openResolution({ cwd: projectDir });\n if (!refreshed?.config || !refreshed.runtime) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: \"Failed to load the authored config\",\n };\n }\n\n const runtime = refreshed.runtime;\n const resolvedConfig = refreshed.config;\n\n await generateCodeArtifacts(projectDir, resolvedConfig, {\n runtimeConfig: runtime,\n });\n type AppTarget = { source?: string; localPath?: string };\n const workspaceEntries: Array<{\n key: string;\n label: string;\n dir: string;\n }> = [];\n const skipped: Array<{ key: string; label: string }> = [];\n\n const appTargets: Array<{\n key: string;\n label: string;\n target: AppTarget | undefined;\n }> = [\n { key: \"host\", label: \"host\", target: runtime.host },\n { key: \"ui\", label: \"ui\", target: runtime.ui },\n { key: \"api\", label: \"api\", target: runtime.api },\n ];\n if (runtime.auth) {\n appTargets.push({ key: \"auth\", label: \"auth\", target: runtime.auth });\n }\n\n for (const entry of appTargets) {\n if (\n entry.target?.source === \"local\" &&\n entry.target.localPath &&\n existsSync(join(entry.target.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({\n key: entry.key,\n label: entry.label,\n dir: entry.target.localPath,\n });\n } else {\n skipped.push({ key: entry.key, label: entry.label });\n }\n }\n\n for (const [key, plugin] of Object.entries(runtime.plugins ?? {})) {\n const label = `plugins/${key}`;\n if (\n plugin.source === \"local\" &&\n plugin.localPath &&\n existsSync(join(plugin.localPath, \"tsconfig.json\"))\n ) {\n workspaceEntries.push({ key, label, dir: plugin.localPath });\n } else {\n skipped.push({ key, label });\n }\n }\n\n const selected = selectWorkspaceTargets(input.packages, resolvedConfig);\n const targets =\n input.packages === \"all\"\n ? workspaceEntries\n : workspaceEntries.filter((entry) => selected.includes(entry.key));\n const skippedEntries =\n input.packages === \"all\"\n ? skipped\n : skipped.filter((entry) => selected.includes(entry.key));\n\n const checked: string[] = [];\n const results: Array<{\n workspace: string;\n passed: boolean;\n error?: string;\n }> = [];\n\n for (const entry of targets) {\n const packageJsonPath = join(entry.dir, \"package.json\");\n let args: string[] = [\"exec\", \"tsc\", \"--noEmit\"];\n if (existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n scripts?: Record<string, string>;\n };\n if (pkg.scripts?.typecheck) {\n args = [\"run\", \"typecheck\"];\n }\n } catch {}\n }\n\n console.log(`\\n ${colors.dim(\"Checking\")} ${colors.cyan(entry.label)}`);\n const child = spawnSync(\"pnpm\", args, {\n cwd: entry.dir,\n stdio: \"inherit\",\n });\n const passed = child.status === 0;\n checked.push(entry.label);\n results.push({\n workspace: entry.label,\n passed,\n error: passed ? undefined : `typecheck failed (exit code ${child.status ?? \"n/a\"})`,\n });\n }\n\n return {\n status: \"success\" as const,\n checked,\n skipped: skippedEntries.map((entry) => entry.label),\n results,\n };\n } catch (error) {\n return {\n status: \"error\" as const,\n checked: [],\n skipped: [],\n results: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n }),\n\n mfCheck: builder.mfCheck.handler(async ({ input }) => {\n let authored: BosConfig | null = null;\n try {\n authored = (await readAuthoredConfigInput()) as BosConfig | null;\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n // No local authored config (the universal image carries none): fall\n // back to the registry identity — the same source `bos start` boots\n // from in a runtime container.\n const account = process.env.BOS_ACCOUNT;\n const gateway = process.env.BOS_GATEWAY;\n if (!account || !gateway) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: MISSING_CONFIG_MESSAGE,\n remotes: [],\n };\n }\n try {\n authored = await resolvePublishedConfig(account, gateway);\n } catch (e) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: e instanceof Error ? e.message : String(e),\n remotes: [],\n };\n }\n if (!authored) {\n return {\n status: \"fail\" as const,\n hostVersion: null,\n hostReachable: false,\n hostReason: `No config found at bos://${account}/${gateway} — verify BOS_ACCOUNT/BOS_GATEWAY and that the config has been published.`,\n remotes: [],\n };\n }\n }\n\n const report = await checkFederationCompat(authored, {\n timeoutMs: input.timeoutMs,\n });\n return {\n status: report.ok ? (\"ok\" as const) : (\"fail\" as const),\n hostVersion: report.hostVersion,\n hostReachable: report.hostReachable,\n hostReason: report.hostReason,\n remotes: report.remotes,\n };\n }),\n };\n}\n"],"mappings":"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"}
package/dist/contract.cjs CHANGED
@@ -213,7 +213,8 @@ const DeployOptionsSchema = zod.object({
213
213
  service: zod.string().optional(),
214
214
  registry: zod.string().optional(),
215
215
  imageDigest: zod.string().optional().refine((digest) => digest === void 0 || require_image_deploy.isValidImageDigest(digest), { message: "image digest must be sha256:<64 hex characters>" }).describe("Digest (sha256:…) of a pre-pushed runtime image — skips the image build/push leg and pins Railway to this digest"),
216
- fullUpload: zod.boolean().default(false).describe("Re-upload every dist file instead of diffing unchanged files against the previous deploy")
216
+ fullUpload: zod.boolean().default(false).describe("Re-upload every dist file instead of diffing unchanged files against the previous deploy"),
217
+ smoke: zod.boolean().default(false).describe("After publish, boot the runtime image against the just-published config and gate the Railway promotion on it — a red smoke rolls the config back to the previous snapshot")
217
218
  });
218
219
  const DeployManifestListEntrySchema = zod.object({
219
220
  key: zod.string(),
@@ -242,6 +243,24 @@ const DeployResultSchema = zod.object({
242
243
  error: zod.string().optional(),
243
244
  deployResults: zod.array(WorkspaceDeployResultSchema).optional()
244
245
  });
246
+ const SmokeOptionsSchema = zod.object({
247
+ image: zod.string().optional().describe("Runtime image ref to boot — required unless defaulted by the deploy train"),
248
+ port: zod.number().int().default(3e3),
249
+ keep: zod.boolean().default(false),
250
+ account: zod.string().optional().describe("Registry identity — defaults to the resolved session config"),
251
+ gateway: zod.string().optional(),
252
+ apiDatabaseUrl: zod.string().optional(),
253
+ authDatabaseUrl: zod.string().optional(),
254
+ env: zod.enum(["production", "staging"]).default("production"),
255
+ registry: zod.string().optional()
256
+ });
257
+ const SmokeResultSchema = zod.object({
258
+ status: zod.enum(["ok", "error"]),
259
+ image: zod.string().optional(),
260
+ summary: zod.string().optional(),
261
+ diagnosis: zod.string().optional(),
262
+ error: zod.string().optional()
263
+ });
245
264
  function parseNearAmount(value) {
246
265
  const match = value.replace(/[\s_,]/g, "").match(/^(\d+(?:\.\d+)?)near$/i);
247
266
  if (!match) return NaN;
@@ -595,6 +614,7 @@ const commandOptionSchemas = {
595
614
  publish: PublishOptionsSchema,
596
615
  rollback: RollbackOptionsSchema,
597
616
  deploy: DeployOptionsSchema,
617
+ smoke: SmokeOptionsSchema,
598
618
  keyPublish: KeyPublishOptionsSchema,
599
619
  login: LoginOptionsSchema,
600
620
  logout: LogoutOptionsSchema,
@@ -659,6 +679,10 @@ const bosContract = _orpc_contract.oc.router({
659
679
  method: "POST",
660
680
  path: "/deploy"
661
681
  }).input(DeployOptionsSchema).output(DeployResultSchema),
682
+ smoke: _orpc_contract.oc.route({
683
+ method: "POST",
684
+ path: "/smoke"
685
+ }).input(SmokeOptionsSchema).output(SmokeResultSchema),
662
686
  keyPublish: _orpc_contract.oc.route({
663
687
  method: "POST",
664
688
  path: "/key/publish"
@@ -786,6 +810,8 @@ exports.RollbackResultSchema = RollbackResultSchema;
786
810
  exports.RollbackSlotCheckSchema = RollbackSlotCheckSchema;
787
811
  exports.RuntimeOverrideTargetBaseSchema = RuntimeOverrideTargetBaseSchema;
788
812
  exports.RuntimeOverrideTargetSchema = RuntimeOverrideTargetSchema;
813
+ exports.SmokeOptionsSchema = SmokeOptionsSchema;
814
+ exports.SmokeResultSchema = SmokeResultSchema;
789
815
  exports.StartOptionsSchema = StartOptionsSchema;
790
816
  exports.StartResultSchema = StartResultSchema;
791
817
  exports.StatusResultSchema = StatusResultSchema;