swallowkit 1.0.0-beta.8 → 1.0.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 (272) hide show
  1. package/README.ja.md +87 -181
  2. package/README.md +87 -238
  3. package/dist/__tests__/fixtures.d.ts +12 -0
  4. package/dist/__tests__/fixtures.d.ts.map +1 -1
  5. package/dist/__tests__/fixtures.js +101 -0
  6. package/dist/__tests__/fixtures.js.map +1 -1
  7. package/dist/cli/commands/add-auth.d.ts +15 -0
  8. package/dist/cli/commands/add-auth.d.ts.map +1 -0
  9. package/dist/cli/commands/add-auth.js +790 -0
  10. package/dist/cli/commands/add-auth.js.map +1 -0
  11. package/dist/cli/commands/add-connector.d.ts +20 -0
  12. package/dist/cli/commands/add-connector.d.ts.map +1 -0
  13. package/dist/cli/commands/add-connector.js +164 -0
  14. package/dist/cli/commands/add-connector.js.map +1 -0
  15. package/dist/cli/commands/cosmos-worktree-isolation.d.ts +25 -0
  16. package/dist/cli/commands/cosmos-worktree-isolation.d.ts.map +1 -0
  17. package/dist/cli/commands/cosmos-worktree-isolation.js +124 -0
  18. package/dist/cli/commands/cosmos-worktree-isolation.js.map +1 -0
  19. package/dist/cli/commands/create-model.d.ts +1 -4
  20. package/dist/cli/commands/create-model.d.ts.map +1 -1
  21. package/dist/cli/commands/create-model.js +20 -82
  22. package/dist/cli/commands/create-model.js.map +1 -1
  23. package/dist/cli/commands/dev-seeds.d.ts +27 -0
  24. package/dist/cli/commands/dev-seeds.d.ts.map +1 -1
  25. package/dist/cli/commands/dev-seeds.js +188 -6
  26. package/dist/cli/commands/dev-seeds.js.map +1 -1
  27. package/dist/cli/commands/dev.d.ts +30 -0
  28. package/dist/cli/commands/dev.d.ts.map +1 -1
  29. package/dist/cli/commands/dev.js +495 -129
  30. package/dist/cli/commands/dev.js.map +1 -1
  31. package/dist/cli/commands/init.d.ts +70 -0
  32. package/dist/cli/commands/init.d.ts.map +1 -1
  33. package/dist/cli/commands/init.js +797 -768
  34. package/dist/cli/commands/init.js.map +1 -1
  35. package/dist/cli/commands/scaffold.d.ts +24 -3
  36. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  37. package/dist/cli/commands/scaffold.js +408 -189
  38. package/dist/cli/commands/scaffold.js.map +1 -1
  39. package/dist/cli/index.d.ts +5 -1
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +335 -58
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/core/config.d.ts +13 -3
  44. package/dist/core/config.d.ts.map +1 -1
  45. package/dist/core/config.js +151 -8
  46. package/dist/core/config.js.map +1 -1
  47. package/dist/core/mock/connector-mock-server.d.ts +101 -0
  48. package/dist/core/mock/connector-mock-server.d.ts.map +1 -0
  49. package/dist/core/mock/connector-mock-server.js +480 -0
  50. package/dist/core/mock/connector-mock-server.js.map +1 -0
  51. package/dist/core/mock/zod-mock-generator.d.ts +14 -0
  52. package/dist/core/mock/zod-mock-generator.d.ts.map +1 -0
  53. package/dist/core/mock/zod-mock-generator.js +163 -0
  54. package/dist/core/mock/zod-mock-generator.js.map +1 -0
  55. package/dist/core/operations/auth-operations.d.ts +61 -0
  56. package/dist/core/operations/auth-operations.d.ts.map +1 -0
  57. package/dist/core/operations/auth-operations.js +272 -0
  58. package/dist/core/operations/auth-operations.js.map +1 -0
  59. package/dist/core/operations/create-model.d.ts +15 -0
  60. package/dist/core/operations/create-model.d.ts.map +1 -0
  61. package/dist/core/operations/create-model.js +185 -0
  62. package/dist/core/operations/create-model.js.map +1 -0
  63. package/dist/core/operations/file-session.d.ts +56 -0
  64. package/dist/core/operations/file-session.d.ts.map +1 -0
  65. package/dist/core/operations/file-session.js +203 -0
  66. package/dist/core/operations/file-session.js.map +1 -0
  67. package/dist/core/operations/provision-operations.d.ts +52 -0
  68. package/dist/core/operations/provision-operations.d.ts.map +1 -0
  69. package/dist/core/operations/provision-operations.js +211 -0
  70. package/dist/core/operations/provision-operations.js.map +1 -0
  71. package/dist/core/operations/runtime.d.ts +37 -0
  72. package/dist/core/operations/runtime.d.ts.map +1 -0
  73. package/dist/core/operations/runtime.js +248 -0
  74. package/dist/core/operations/runtime.js.map +1 -0
  75. package/dist/core/operations/scaffold-apply.d.ts +21 -0
  76. package/dist/core/operations/scaffold-apply.d.ts.map +1 -0
  77. package/dist/core/operations/scaffold-apply.js +57 -0
  78. package/dist/core/operations/scaffold-apply.js.map +1 -0
  79. package/dist/core/operations/scaffold-machine.d.ts +16 -0
  80. package/dist/core/operations/scaffold-machine.d.ts.map +1 -0
  81. package/dist/core/operations/scaffold-machine.js +51 -0
  82. package/dist/core/operations/scaffold-machine.js.map +1 -0
  83. package/dist/core/operations/scaffold-plan.d.ts +43 -0
  84. package/dist/core/operations/scaffold-plan.d.ts.map +1 -0
  85. package/dist/core/operations/scaffold-plan.js +187 -0
  86. package/dist/core/operations/scaffold-plan.js.map +1 -0
  87. package/dist/core/project/agent-instructions.d.ts +29 -0
  88. package/dist/core/project/agent-instructions.d.ts.map +1 -0
  89. package/dist/core/project/agent-instructions.js +160 -0
  90. package/dist/core/project/agent-instructions.js.map +1 -0
  91. package/dist/core/project/artifacts.d.ts +58 -0
  92. package/dist/core/project/artifacts.d.ts.map +1 -0
  93. package/dist/core/project/artifacts.js +179 -0
  94. package/dist/core/project/artifacts.js.map +1 -0
  95. package/dist/core/project/boundaries.d.ts +50 -0
  96. package/dist/core/project/boundaries.d.ts.map +1 -0
  97. package/dist/core/project/boundaries.js +117 -0
  98. package/dist/core/project/boundaries.js.map +1 -0
  99. package/dist/core/project/capabilities.d.ts +58 -0
  100. package/dist/core/project/capabilities.d.ts.map +1 -0
  101. package/dist/core/project/capabilities.js +135 -0
  102. package/dist/core/project/capabilities.js.map +1 -0
  103. package/dist/core/project/drift.d.ts +29 -0
  104. package/dist/core/project/drift.d.ts.map +1 -0
  105. package/dist/core/project/drift.js +188 -0
  106. package/dist/core/project/drift.js.map +1 -0
  107. package/dist/core/project/infra.d.ts +49 -0
  108. package/dist/core/project/infra.d.ts.map +1 -0
  109. package/dist/core/project/infra.js +167 -0
  110. package/dist/core/project/infra.js.map +1 -0
  111. package/dist/core/project/manifest.d.ts +92 -0
  112. package/dist/core/project/manifest.d.ts.map +1 -0
  113. package/dist/core/project/manifest.js +321 -0
  114. package/dist/core/project/manifest.js.map +1 -0
  115. package/dist/core/project/state.d.ts +15 -0
  116. package/dist/core/project/state.d.ts.map +1 -0
  117. package/dist/core/project/state.js +106 -0
  118. package/dist/core/project/state.js.map +1 -0
  119. package/dist/core/project/validation.d.ts +20 -0
  120. package/dist/core/project/validation.d.ts.map +1 -0
  121. package/dist/core/project/validation.js +274 -0
  122. package/dist/core/project/validation.js.map +1 -0
  123. package/dist/core/project/workflows.d.ts +43 -0
  124. package/dist/core/project/workflows.d.ts.map +1 -0
  125. package/dist/core/project/workflows.js +299 -0
  126. package/dist/core/project/workflows.js.map +1 -0
  127. package/dist/core/scaffold/auth-generator.d.ts +63 -0
  128. package/dist/core/scaffold/auth-generator.d.ts.map +1 -0
  129. package/dist/core/scaffold/auth-generator.js +1774 -0
  130. package/dist/core/scaffold/auth-generator.js.map +1 -0
  131. package/dist/core/scaffold/connector-functions-generator.d.ts +41 -0
  132. package/dist/core/scaffold/connector-functions-generator.d.ts.map +1 -0
  133. package/dist/core/scaffold/connector-functions-generator.js +1029 -0
  134. package/dist/core/scaffold/connector-functions-generator.js.map +1 -0
  135. package/dist/core/scaffold/functions-generator.d.ts +4 -3
  136. package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
  137. package/dist/core/scaffold/functions-generator.js +405 -134
  138. package/dist/core/scaffold/functions-generator.js.map +1 -1
  139. package/dist/core/scaffold/model-parser.d.ts +20 -0
  140. package/dist/core/scaffold/model-parser.d.ts.map +1 -1
  141. package/dist/core/scaffold/model-parser.js +229 -78
  142. package/dist/core/scaffold/model-parser.js.map +1 -1
  143. package/dist/core/scaffold/native-schema-generator.d.ts +19 -0
  144. package/dist/core/scaffold/native-schema-generator.d.ts.map +1 -0
  145. package/dist/core/scaffold/native-schema-generator.js +753 -0
  146. package/dist/core/scaffold/native-schema-generator.js.map +1 -0
  147. package/dist/core/scaffold/nextjs-generator.d.ts +8 -0
  148. package/dist/core/scaffold/nextjs-generator.d.ts.map +1 -1
  149. package/dist/core/scaffold/nextjs-generator.js +152 -8
  150. package/dist/core/scaffold/nextjs-generator.js.map +1 -1
  151. package/dist/core/scaffold/ui-generator.d.ts +17 -4
  152. package/dist/core/scaffold/ui-generator.d.ts.map +1 -1
  153. package/dist/core/scaffold/ui-generator.js +174 -34
  154. package/dist/core/scaffold/ui-generator.js.map +1 -1
  155. package/dist/core/verify/index.d.ts +69 -0
  156. package/dist/core/verify/index.d.ts.map +1 -0
  157. package/dist/core/verify/index.js +412 -0
  158. package/dist/core/verify/index.js.map +1 -0
  159. package/dist/machine/contracts.d.ts +24 -0
  160. package/dist/machine/contracts.d.ts.map +1 -0
  161. package/dist/machine/contracts.js +3 -0
  162. package/dist/machine/contracts.js.map +1 -0
  163. package/dist/machine/errors.d.ts +14 -0
  164. package/dist/machine/errors.d.ts.map +1 -0
  165. package/dist/machine/errors.js +42 -0
  166. package/dist/machine/errors.js.map +1 -0
  167. package/dist/machine/index.d.ts +3 -0
  168. package/dist/machine/index.d.ts.map +1 -0
  169. package/dist/machine/index.js +566 -0
  170. package/dist/machine/index.js.map +1 -0
  171. package/dist/mcp/index.d.ts +25 -0
  172. package/dist/mcp/index.d.ts.map +1 -0
  173. package/dist/mcp/index.js +425 -0
  174. package/dist/mcp/index.js.map +1 -0
  175. package/dist/types/index.d.ts +105 -0
  176. package/dist/types/index.d.ts.map +1 -1
  177. package/dist/utils/package-manager.d.ts +7 -11
  178. package/dist/utils/package-manager.d.ts.map +1 -1
  179. package/dist/utils/package-manager.js +42 -17
  180. package/dist/utils/package-manager.js.map +1 -1
  181. package/dist/utils/python-uv.d.ts +21 -0
  182. package/dist/utils/python-uv.d.ts.map +1 -0
  183. package/dist/utils/python-uv.js +111 -0
  184. package/dist/utils/python-uv.js.map +1 -0
  185. package/dist/version.d.ts +2 -0
  186. package/dist/version.d.ts.map +1 -0
  187. package/dist/version.js +49 -0
  188. package/dist/version.js.map +1 -0
  189. package/package.json +15 -17
  190. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +716 -22
  191. package/src/__tests__/__snapshots__/nextjs-generator.test.ts.snap +19 -7
  192. package/src/__tests__/__snapshots__/ui-generator.test.ts.snap +20 -12
  193. package/src/__tests__/agent-instructions.test.ts +237 -0
  194. package/src/__tests__/agent-loop-phase34.test.ts +513 -0
  195. package/src/__tests__/auth.test.ts +770 -0
  196. package/src/__tests__/bff-swa-auth.test.ts +275 -0
  197. package/src/__tests__/config.test.ts +176 -3
  198. package/src/__tests__/connector-functions-generator.test.ts +288 -0
  199. package/src/__tests__/connector-mock-server.test.ts +459 -0
  200. package/src/__tests__/connector-model-bff.test.ts +162 -0
  201. package/src/__tests__/cosmos-worktree-isolation.test.ts +149 -0
  202. package/src/__tests__/dev-seeds.test.ts +124 -0
  203. package/src/__tests__/dev.test.ts +254 -0
  204. package/src/__tests__/file-session.test.ts +98 -0
  205. package/src/__tests__/fixtures.ts +101 -0
  206. package/src/__tests__/functions-generator.test.ts +137 -1
  207. package/src/__tests__/init.test.ts +386 -1
  208. package/src/__tests__/jest-globals.d.ts +8 -0
  209. package/src/__tests__/machine.test.ts +371 -0
  210. package/src/__tests__/mcp.test.ts +253 -0
  211. package/src/__tests__/model-parser.test.ts +142 -0
  212. package/src/__tests__/multi-auth.test.ts +160 -0
  213. package/src/__tests__/nextjs-generator.test.ts +8 -0
  214. package/src/__tests__/package-manager.test.ts +59 -4
  215. package/src/__tests__/plan-apply.test.ts +499 -0
  216. package/src/__tests__/python-uv.test.ts +48 -0
  217. package/src/__tests__/scaffold.test.ts +287 -24
  218. package/src/__tests__/tsconfig.json +15 -0
  219. package/src/__tests__/ui-generator.test.ts +104 -0
  220. package/src/__tests__/zod-mock-generator.test.ts +132 -0
  221. package/src/cli/commands/add-auth.ts +853 -0
  222. package/src/cli/commands/add-connector.ts +159 -0
  223. package/src/cli/commands/cosmos-worktree-isolation.ts +130 -0
  224. package/src/cli/commands/create-model.ts +21 -100
  225. package/src/cli/commands/dev-seeds.ts +278 -7
  226. package/src/cli/commands/dev.ts +607 -160
  227. package/src/cli/commands/init.ts +880 -808
  228. package/src/cli/commands/scaffold.ts +531 -236
  229. package/src/cli/index.ts +338 -60
  230. package/src/core/config.ts +145 -9
  231. package/src/core/mock/connector-mock-server.ts +555 -0
  232. package/src/core/mock/zod-mock-generator.ts +205 -0
  233. package/src/core/operations/auth-operations.ts +360 -0
  234. package/src/core/operations/create-model.ts +191 -0
  235. package/src/core/operations/file-session.ts +222 -0
  236. package/src/core/operations/provision-operations.ts +297 -0
  237. package/src/core/operations/runtime.ts +258 -0
  238. package/src/core/operations/scaffold-apply.ts +106 -0
  239. package/src/core/operations/scaffold-machine.ts +77 -0
  240. package/src/core/operations/scaffold-plan.ts +215 -0
  241. package/src/core/project/agent-instructions.ts +167 -0
  242. package/src/core/project/agent-templates/AGENTS.md +504 -0
  243. package/src/core/project/agent-templates/CLAUDE.md +31 -0
  244. package/src/core/project/agent-templates/azure-functions.instructions.md +22 -0
  245. package/src/core/project/agent-templates/bff-routes.instructions.md +18 -0
  246. package/src/core/project/agent-templates/copilot-instructions.md +27 -0
  247. package/src/core/project/agent-templates/shared-models.instructions.md +72 -0
  248. package/src/core/project/artifacts.ts +205 -0
  249. package/src/core/project/boundaries.ts +170 -0
  250. package/src/core/project/capabilities.ts +193 -0
  251. package/src/core/project/drift.ts +202 -0
  252. package/src/core/project/infra.ts +196 -0
  253. package/src/core/project/manifest.ts +402 -0
  254. package/src/core/project/state.ts +77 -0
  255. package/src/core/project/validation.ts +295 -0
  256. package/src/core/project/workflows.ts +295 -0
  257. package/src/core/scaffold/auth-generator.ts +1824 -0
  258. package/src/core/scaffold/connector-functions-generator.ts +1133 -0
  259. package/src/core/scaffold/functions-generator.ts +432 -134
  260. package/src/core/scaffold/model-parser.ts +244 -90
  261. package/src/core/scaffold/native-schema-generator.ts +904 -0
  262. package/src/core/scaffold/nextjs-generator.ts +174 -9
  263. package/src/core/scaffold/ui-generator.ts +191 -36
  264. package/src/core/verify/index.ts +468 -0
  265. package/src/machine/contracts.ts +33 -0
  266. package/src/machine/errors.ts +45 -0
  267. package/src/machine/index.ts +690 -0
  268. package/src/mcp/index.ts +423 -0
  269. package/src/types/index.ts +137 -0
  270. package/src/utils/package-manager.ts +41 -19
  271. package/src/utils/python-uv.ts +96 -0
  272. package/src/version.ts +13 -0
@@ -30,13 +30,13 @@ export interface PackageManagerCommands {
30
30
  dlx: string;
31
31
  /** Run a script: "pnpm run" / "npm run" */
32
32
  run: string;
33
- /** Run a script with filter: "pnpm run --filter <ws>" / "npm run --workspace=<ws>" */
33
+ /** Run a script with filter: "pnpm --filter <ws> run" / "npm run --workspace=<ws>" */
34
34
  runFilter: (workspace: string) => string;
35
35
  /** Start script: "pnpm start" / "npm start" */
36
36
  start: string;
37
37
  /** Install production only (in temp dir for CI): "pnpm install --prod" / "npm install --omit=dev" */
38
38
  installProd: string;
39
- /** create-next-app flag: "--use-pnpm" / (none for npm) */
39
+ /** create-next-app flag: "--use-pnpm" / "--use-npm" */
40
40
  createNextAppFlag: string | null;
41
41
  }
42
42
 
@@ -55,9 +55,9 @@ export function getCommands(pm: PackageManager): PackageManagerCommands {
55
55
  exec: "pnpm exec",
56
56
  dlx: "pnpm dlx",
57
57
  run: "pnpm run",
58
- runFilter: (ws) => `pnpm run --filter ${ws}`,
58
+ runFilter: (ws) => `pnpm --filter ${ws} run`,
59
59
  start: "pnpm start",
60
- installProd: "pnpm install --prod",
60
+ installProd: "pnpm install --prod --no-frozen-lockfile",
61
61
  createNextAppFlag: "--use-pnpm",
62
62
  };
63
63
  }
@@ -76,23 +76,20 @@ export function getCommands(pm: PackageManager): PackageManagerCommands {
76
76
  runFilter: (ws) => `npm run --workspace=${ws}`,
77
77
  start: "npm start",
78
78
  installProd: "npm install --omit=dev",
79
- createNextAppFlag: null,
79
+ createNextAppFlag: "--use-npm",
80
80
  };
81
81
  }
82
82
 
83
83
  /**
84
84
  * Detect the preferred package manager for new project initialisation.
85
85
  *
86
- * Strategy (pnpm-preferred):
87
- * 1. If pnpm is installed on the system → always use pnpm
88
- * (even when invoked via `npx`, since `npx` is often used out of habit)
89
- * 2. Otherwise → npm
90
- *
91
- * This is intentionally independent of `npm_config_user_agent` so that
92
- * `npx swallowkit init` still creates a pnpm project when pnpm is available.
86
+ * Honor the invoking package manager before falling back to available binaries.
93
87
  */
94
- export function detectFromUserAgent(): PackageManager {
95
- return isPnpmInstalled() ? "pnpm" : "npm";
88
+ export function detectFromUserAgent(pnpmIsInstalled: () => boolean = isPnpmInstalled): PackageManager {
89
+ const agent = process.env.npm_config_user_agent || "";
90
+ if (agent.startsWith("pnpm/")) return "pnpm";
91
+ if (agent.startsWith("npm/")) return "npm";
92
+ return pnpmIsInstalled() ? "pnpm" : "npm";
96
93
  }
97
94
 
98
95
  /**
@@ -111,11 +108,18 @@ function isPnpmInstalled(): boolean {
111
108
  * Detect the package manager used in an existing project directory
112
109
  * by checking for lockfiles.
113
110
  *
114
- * Priority: pnpm-lock.yaml > package-lock.json > fallback to detectFromUserAgent()
111
+ * Priority: explicit project metadata > lockfiles > workspace config > invocation/binaries
115
112
  */
116
113
  export function detectFromProject(projectDir?: string): PackageManager {
117
114
  const dir = projectDir || process.cwd();
118
115
 
116
+ const manifestPath = path.join(dir, "package.json");
117
+ if (fs.existsSync(manifestPath)) {
118
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
119
+ const manager = manifest.devEngines?.packageManager?.name || manifest.packageManager?.split("@")[0];
120
+ if (manager === "npm" || manager === "pnpm") return manager;
121
+ }
122
+
119
123
  if (fs.existsSync(path.join(dir, "pnpm-lock.yaml"))) {
120
124
  return "pnpm";
121
125
  }
@@ -124,6 +128,7 @@ export function detectFromProject(projectDir?: string): PackageManager {
124
128
  }
125
129
 
126
130
  // No lockfile found — fall back to user agent detection
131
+ if (fs.existsSync(path.join(dir, "pnpm-workspace.yaml"))) return "pnpm";
127
132
  return detectFromUserAgent();
128
133
  }
129
134
 
@@ -151,7 +156,7 @@ export function getWorkspaceConfig(pm: PackageManager, workspaces: string[]) {
151
156
  /** pnpm uses pnpm-workspace.yaml */
152
157
  type: "file" as const,
153
158
  filename: "pnpm-workspace.yaml",
154
- content: `packages:\n${workspaces.map((w) => ` - ${w}`).join("\n")}\n`,
159
+ content: `packages:\n${workspaces.map((w) => ` - ${w}`).join("\n")}\nallowBuilds:\n protobufjs: false\n unrs-resolver: false\n`,
155
160
  };
156
161
  }
157
162
 
@@ -169,12 +174,29 @@ export function getWorkspaceConfig(pm: PackageManager, workspaces: string[]) {
169
174
  export function getCiSetupStep(pm: PackageManager): string {
170
175
  if (pm === "pnpm") {
171
176
  return ` - name: Setup pnpm
172
- uses: pnpm/action-setup@v4`;
177
+ uses: pnpm/action-setup@v4
178
+ with:
179
+ version: 11`;
173
180
  }
174
181
  // npm: no extra setup needed (comes with Node.js)
175
182
  return "";
176
183
  }
177
184
 
185
+ export function getCiInstallCommand(ciPm: PackageManager, projectPm: PackageManager = ciPm): string {
186
+ void projectPm; // Reserved for package-manager-specific CI bridging.
187
+ if (ciPm === "pnpm") {
188
+ return getCommands(ciPm).ci;
189
+ }
190
+ return getCommands(ciPm).ci;
191
+ }
192
+
193
+ export function getSwaAppBuildCommand(ciPm: PackageManager, projectPm: PackageManager = ciPm): string {
194
+ if (ciPm === "pnpm") {
195
+ return "pnpm install --frozen-lockfile && pnpm run build";
196
+ }
197
+ return `${getCiInstallCommand(ciPm, projectPm)} && npm run build`;
198
+ }
199
+
178
200
  /**
179
201
  * CI/CD setup steps for Azure Pipelines
180
202
  */
@@ -182,7 +204,7 @@ export function getAzurePipelinesSetup(pm: PackageManager): string {
182
204
  if (pm === "pnpm") {
183
205
  return ` - script: |
184
206
  corepack enable
185
- corepack prepare pnpm@latest --activate
207
+ corepack prepare pnpm@11 --activate
186
208
  displayName: 'Setup pnpm'`;
187
209
  }
188
210
  // npm: no extra step needed
@@ -196,7 +218,7 @@ export function getBuildScript(pm: PackageManager): string {
196
218
  const copyStandaloneAssets = `node -e "const fs=require('fs');fs.mkdirSync('.next/standalone/.next',{recursive:true});if(fs.existsSync('.next/static'))fs.cpSync('.next/static','.next/standalone/.next/static',{recursive:true});if(fs.existsSync('public'))fs.cpSync('public','.next/standalone/public',{recursive:true});"`;
197
219
 
198
220
  if (pm === "pnpm") {
199
- return `pnpm run --filter shared build && next build --webpack && ${copyStandaloneAssets}`;
221
+ return `pnpm --filter shared run build && next build --webpack && ${copyStandaloneAssets}`;
200
222
  }
201
223
  return `npm run --workspace=shared build && next build --webpack && ${copyStandaloneAssets}`;
202
224
  }
@@ -0,0 +1,96 @@
1
+ import * as path from "path";
2
+
3
+ export const SWALLOWKIT_PYTHON_VERSION = "3.11";
4
+
5
+ export interface ProjectLocalUvPaths {
6
+ stateDir: string;
7
+ cacheDir: string;
8
+ pythonInstallDir: string;
9
+ toolDir: string;
10
+ toolBinDir: string;
11
+ localUvInstallDir: string;
12
+ localUvExecutable: string;
13
+ }
14
+
15
+ export function getPythonProjectRoot(functionsDir: string): string {
16
+ return path.dirname(functionsDir);
17
+ }
18
+
19
+ export function getProjectLocalUvPaths(projectRoot: string): ProjectLocalUvPaths {
20
+ const stateDir = path.join(projectRoot, ".uv");
21
+ const localUvInstallDir = path.join(stateDir, "bin");
22
+
23
+ return {
24
+ stateDir,
25
+ cacheDir: path.join(stateDir, "cache"),
26
+ pythonInstallDir: path.join(stateDir, "python"),
27
+ toolDir: path.join(stateDir, "tools"),
28
+ toolBinDir: path.join(stateDir, "tools", "bin"),
29
+ localUvInstallDir,
30
+ localUvExecutable: process.platform === "win32"
31
+ ? path.join(localUvInstallDir, "uv.exe")
32
+ : path.join(localUvInstallDir, "uv"),
33
+ };
34
+ }
35
+
36
+ export function buildProjectLocalUvEnv(
37
+ baseEnv: NodeJS.ProcessEnv,
38
+ projectRoot: string
39
+ ): NodeJS.ProcessEnv {
40
+ const uvPaths = getProjectLocalUvPaths(projectRoot);
41
+ const env: NodeJS.ProcessEnv = {
42
+ ...baseEnv,
43
+ UV_CACHE_DIR: uvPaths.cacheDir,
44
+ UV_PYTHON_INSTALL_DIR: uvPaths.pythonInstallDir,
45
+ UV_TOOL_DIR: uvPaths.toolDir,
46
+ UV_TOOL_BIN_DIR: uvPaths.toolBinDir,
47
+ UV_PYTHON_PREFERENCE: "only-managed",
48
+ };
49
+
50
+ if (process.platform === "win32") {
51
+ env.UV_PYTHON_NO_REGISTRY = "true";
52
+ }
53
+
54
+ return env;
55
+ }
56
+
57
+ export function buildProjectLocalUvInstallerEnv(
58
+ baseEnv: NodeJS.ProcessEnv,
59
+ projectRoot: string
60
+ ): NodeJS.ProcessEnv {
61
+ const uvPaths = getProjectLocalUvPaths(projectRoot);
62
+
63
+ return {
64
+ ...buildProjectLocalUvEnv(baseEnv, projectRoot),
65
+ UV_UNMANAGED_INSTALL: uvPaths.localUvInstallDir,
66
+ UV_NO_MODIFY_PATH: "1",
67
+ };
68
+ }
69
+
70
+ export function getProjectLocalUvInstallerCommand(): { command: string; args: string[] } {
71
+ if (process.platform === "win32") {
72
+ return {
73
+ command: "powershell",
74
+ args: [
75
+ "-NoProfile",
76
+ "-ExecutionPolicy",
77
+ "Bypass",
78
+ "-Command",
79
+ "$ProgressPreference = 'SilentlyContinue'; irm https://astral.sh/uv/install.ps1 | iex",
80
+ ],
81
+ };
82
+ }
83
+
84
+ return {
85
+ command: "sh",
86
+ args: ["-c", "curl -LsSf https://astral.sh/uv/install.sh | sh"],
87
+ };
88
+ }
89
+
90
+ export function buildUvVenvArgs(venvDir: string, pythonVersion = SWALLOWKIT_PYTHON_VERSION): string[] {
91
+ return ["venv", venvDir, "--python", pythonVersion];
92
+ }
93
+
94
+ export function buildUvPipInstallArgs(pythonExecutable: string, requirementsPath: string): string[] {
95
+ return ["pip", "install", "--python", pythonExecutable, "-r", requirementsPath];
96
+ }
package/src/version.ts ADDED
@@ -0,0 +1,13 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+
4
+ export function getSwallowKitVersion(): string {
5
+ const packageJsonPath = path.resolve(__dirname, "..", "package.json");
6
+
7
+ try {
8
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")) as { version?: string };
9
+ return packageJson.version || "0.0.0";
10
+ } catch {
11
+ return process.env.npm_package_version || "0.0.0";
12
+ }
13
+ }