@spunto/build 0.17.0 → 0.18.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.
- package/package.json +1 -1
- package/src/catalogs/index.ts +43 -22
- package/src/script/setup-script.ts +8 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spunto/build",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "Spunto's shared Build engine — the devcontainer image protocol and VS Code extension registry clients, with no database, no HTTP framework and no UI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
package/src/catalogs/index.ts
CHANGED
|
@@ -42,42 +42,63 @@ export type DevFeature = {
|
|
|
42
42
|
defaultOptions?: Record<string, string>
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The starter images, newest first. Refreshed on 2026-10-20 — Node 26 is the current release and
|
|
47
|
+
* becomes LTS this month, Node 24 the active LTS; Python 3.14, Go 1.27, Java 25 LTS, .NET 10 LTS,
|
|
48
|
+
* Ubuntu 24.04. Tags checked against `mcr.microsoft.com/v2/devcontainers/<image>/tags/list`.
|
|
49
|
+
*
|
|
50
|
+
* A project stores the image reference, never this id: dropping an entry here leaves the projects
|
|
51
|
+
* built on it working — they just show it as a custom image. On Spunto Cloud a catalog image with
|
|
52
|
+
* nothing added is a *starter* recipe whose build every org shares (`isSharedRecipe`, docs/onboarding.md).
|
|
53
|
+
*/
|
|
45
54
|
export const AVAILABLE_IMAGES: DevImage[] = [
|
|
46
55
|
{
|
|
47
|
-
id: "typescript-node-
|
|
48
|
-
label: "Node.js
|
|
49
|
-
image: "mcr.microsoft.com/devcontainers/typescript-node:
|
|
50
|
-
description: "Node.js
|
|
56
|
+
id: "typescript-node-26",
|
|
57
|
+
label: "Node.js 26 (TypeScript)",
|
|
58
|
+
image: "mcr.microsoft.com/devcontainers/typescript-node:26",
|
|
59
|
+
description: "Node.js 26 + TypeScript, npm/yarn/pnpm",
|
|
51
60
|
},
|
|
52
61
|
{
|
|
53
|
-
id: "
|
|
54
|
-
label: "Node.js
|
|
55
|
-
image: "mcr.microsoft.com/devcontainers/
|
|
56
|
-
description: "Node.js
|
|
62
|
+
id: "typescript-node-24",
|
|
63
|
+
label: "Node.js 24 LTS (TypeScript)",
|
|
64
|
+
image: "mcr.microsoft.com/devcontainers/typescript-node:24",
|
|
65
|
+
description: "Node.js 24 LTS + TypeScript, npm/yarn/pnpm",
|
|
57
66
|
},
|
|
58
67
|
{
|
|
59
|
-
id: "python-
|
|
60
|
-
label: "Python 3.
|
|
61
|
-
image: "mcr.microsoft.com/devcontainers/python:3.
|
|
62
|
-
description: "Python 3.
|
|
68
|
+
id: "python-314",
|
|
69
|
+
label: "Python 3.14",
|
|
70
|
+
image: "mcr.microsoft.com/devcontainers/python:3.14",
|
|
71
|
+
description: "Python 3.14, pip, pipx",
|
|
63
72
|
},
|
|
64
73
|
{
|
|
65
|
-
id: "go-
|
|
66
|
-
label: "Go 1.
|
|
67
|
-
image: "mcr.microsoft.com/devcontainers/go:1.
|
|
68
|
-
description: "Go 1.
|
|
74
|
+
id: "go-127",
|
|
75
|
+
label: "Go 1.27",
|
|
76
|
+
image: "mcr.microsoft.com/devcontainers/go:1.27",
|
|
77
|
+
description: "Go 1.27, gopls, delve",
|
|
69
78
|
},
|
|
70
79
|
{
|
|
71
80
|
id: "rust",
|
|
72
81
|
label: "Rust",
|
|
73
|
-
image: "mcr.microsoft.com/devcontainers/rust:
|
|
74
|
-
description: "Rust stable, cargo",
|
|
82
|
+
image: "mcr.microsoft.com/devcontainers/rust:1",
|
|
83
|
+
description: "Rust stable, cargo, rust-analyzer",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "java-25",
|
|
87
|
+
label: "Java 25 LTS",
|
|
88
|
+
image: "mcr.microsoft.com/devcontainers/java:25",
|
|
89
|
+
description: "Java 25 (JDK), Maven, Gradle",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: "dotnet-10",
|
|
93
|
+
label: ".NET 10 LTS",
|
|
94
|
+
image: "mcr.microsoft.com/devcontainers/dotnet:10.0",
|
|
95
|
+
description: ".NET 10 SDK, C#",
|
|
75
96
|
},
|
|
76
97
|
{
|
|
77
|
-
id: "
|
|
78
|
-
label: "
|
|
79
|
-
image: "mcr.microsoft.com/devcontainers/
|
|
80
|
-
description: "
|
|
98
|
+
id: "ubuntu-2404",
|
|
99
|
+
label: "Ubuntu 24.04",
|
|
100
|
+
image: "mcr.microsoft.com/devcontainers/base:noble",
|
|
101
|
+
description: "A bare Ubuntu 24.04 — bring your own toolchain",
|
|
81
102
|
},
|
|
82
103
|
]
|
|
83
104
|
|
|
@@ -1132,10 +1132,15 @@ export function buildSetupScript(params: SetupScriptParams): { script: string }
|
|
|
1132
1132
|
// `project.dind` makes DinD available without the docker-in-docker feature (baked into the base
|
|
1133
1133
|
// image, see images/worker-base) — treat it like the feature for entrypoint start + docker wait.
|
|
1134
1134
|
const hasDinDFeature = (project.features?.some((f) => f.id === "docker-in-docker") ?? false) || !!project.dind
|
|
1135
|
+
// `_MP_EP_STARTED` tells the every-start block of the same run (buildWorkerScript inlines both in
|
|
1136
|
+
// one shell) not to start them a second time: the docker-in-docker feature's entrypoint doesn't
|
|
1137
|
+
// check for a running daemon, and a second dockerd fails on the volume store lock — after having
|
|
1138
|
+
// replaced the first one's socket, leaving Docker unreachable for postStart and everything after.
|
|
1135
1139
|
if (project.postCreateCommand && ((project.features && project.features.length > 0) || project.dind)) {
|
|
1136
1140
|
push(
|
|
1137
1141
|
"",
|
|
1138
1142
|
"if [ -f " + FEATURE_ENTRYPOINTS_FILE + " ]; then",
|
|
1143
|
+
" _MP_EP_STARTED=1",
|
|
1139
1144
|
' echo "--- Starting feature entrypoints for postCreate ---"',
|
|
1140
1145
|
" while IFS= read -r _ep; do",
|
|
1141
1146
|
' if [ -f "$_ep" ]; then',
|
|
@@ -1299,9 +1304,11 @@ export function buildStartScript(params: StartScriptParams): { script: string; h
|
|
|
1299
1304
|
}
|
|
1300
1305
|
|
|
1301
1306
|
// ── 2. Feature entrypoints ────────────────────────────────────────────────
|
|
1307
|
+
// Skipped when the first-start setup of this same run already started them for postCreate
|
|
1308
|
+
// (`_MP_EP_STARTED`, see buildSetupScript §6).
|
|
1302
1309
|
push(
|
|
1303
1310
|
"",
|
|
1304
|
-
"if [ -f " + FEATURE_ENTRYPOINTS_FILE + " ]; then",
|
|
1311
|
+
"if [ -f " + FEATURE_ENTRYPOINTS_FILE + " ] && [ -z \"${_MP_EP_STARTED:-}\" ]; then",
|
|
1305
1312
|
' echo "--- Starting feature entrypoints ---"',
|
|
1306
1313
|
" while IFS= read -r _ep; do",
|
|
1307
1314
|
' if [ -f "$_ep" ]; then',
|