hatchkit 0.1.42 → 0.1.45

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 (55) hide show
  1. package/dist/adopt.d.ts +77 -0
  2. package/dist/adopt.d.ts.map +1 -1
  3. package/dist/adopt.js +395 -157
  4. package/dist/adopt.js.map +1 -1
  5. package/dist/deploy/rollback.d.ts.map +1 -1
  6. package/dist/deploy/rollback.js +9 -0
  7. package/dist/deploy/rollback.js.map +1 -1
  8. package/dist/dev-setup.d.ts +106 -0
  9. package/dist/dev-setup.d.ts.map +1 -0
  10. package/dist/dev-setup.js +1340 -0
  11. package/dist/dev-setup.js.map +1 -0
  12. package/dist/doctor.d.ts.map +1 -1
  13. package/dist/doctor.js +6 -0
  14. package/dist/doctor.js.map +1 -1
  15. package/dist/index.js +58 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/prompts.d.ts +12 -0
  18. package/dist/prompts.d.ts.map +1 -1
  19. package/dist/prompts.js +42 -0
  20. package/dist/prompts.js.map +1 -1
  21. package/dist/provision/s3-buckets.d.ts.map +1 -1
  22. package/dist/provision/s3-buckets.js +44 -24
  23. package/dist/provision/s3-buckets.js.map +1 -1
  24. package/dist/provision/write-env.d.ts +6 -0
  25. package/dist/provision/write-env.d.ts.map +1 -1
  26. package/dist/provision/write-env.js +17 -0
  27. package/dist/provision/write-env.js.map +1 -1
  28. package/dist/scaffold/app.d.ts +6 -0
  29. package/dist/scaffold/app.d.ts.map +1 -1
  30. package/dist/scaffold/app.js +20 -1
  31. package/dist/scaffold/app.js.map +1 -1
  32. package/dist/scaffold/build-pipeline.d.ts +26 -2
  33. package/dist/scaffold/build-pipeline.d.ts.map +1 -1
  34. package/dist/scaffold/build-pipeline.js +159 -6
  35. package/dist/scaffold/build-pipeline.js.map +1 -1
  36. package/dist/scaffold/manifest.d.ts +12 -0
  37. package/dist/scaffold/manifest.d.ts.map +1 -1
  38. package/dist/scaffold/manifest.js +1 -0
  39. package/dist/scaffold/manifest.js.map +1 -1
  40. package/dist/scaffold/update.d.ts +20 -1
  41. package/dist/scaffold/update.d.ts.map +1 -1
  42. package/dist/scaffold/update.js +126 -54
  43. package/dist/scaffold/update.js.map +1 -1
  44. package/dist/templates/build-pipeline/Dockerfile.nextjs-monorepo.hbs +107 -0
  45. package/dist/templates/build-pipeline/docker-compose.yml.hbs +14 -2
  46. package/dist/utils/flags.d.ts +5 -0
  47. package/dist/utils/flags.d.ts.map +1 -1
  48. package/dist/utils/flags.js +13 -1
  49. package/dist/utils/flags.js.map +1 -1
  50. package/dist/utils/run-ledger.d.ts +9 -0
  51. package/dist/utils/run-ledger.d.ts.map +1 -1
  52. package/dist/utils/run-ledger.js.map +1 -1
  53. package/package.json +4 -2
  54. package/scripts/release-bump.mjs +29 -3
  55. package/scripts/release-packages.mjs +131 -0
@@ -0,0 +1,107 @@
1
+ # syntax=docker/dockerfile:1
2
+ #
3
+ # Next.js + Coolify image for {{name}} (pnpm/yarn workspace monorepo
4
+ # variant). The Next app lives at `{{monorepoPackage}}/` and is built
5
+ # from the workspace root so the lockfile / hoisted node_modules stay
6
+ # coherent with what `pnpm install` produces on the developer's machine.
7
+ #
8
+ # Why a separate template from Dockerfile.nextjs.hbs:
9
+ # - `pnpm install --frozen-lockfile` must run at the WORKSPACE ROOT,
10
+ # not inside the sub-package, or pnpm refuses to resolve the lockfile.
11
+ # - `pnpm --filter <name> build` keys off the package `name` field
12
+ # (not the directory), which is why we pass `packageName` separately
13
+ # from `monorepoPackage`.
14
+ # - `next start` needs WORKDIR to be the sub-package so it can find
15
+ # `.next/` and `next.config.*` where Next.js expects them on disk.
16
+ #
17
+ # dotenvx decrypts the committed encrypted .env.production at TWO points:
18
+ #
19
+ # 1. Build stage — uses the dotenvx_private_key BuildKit secret
20
+ # (passed by the workflow from the GH Actions secret
21
+ # DOTENV_PRIVATE_KEY_PRODUCTION) to decrypt in-memory before
22
+ # running the build. Required so NEXT_PUBLIC_* values get inlined
23
+ # into the static client bundle. The secret is mounted as tmpfs
24
+ # and never lands in `docker history` or any image layer.
25
+ #
26
+ # 2. Runtime CMD — `dotenvx run` reads the same .env.production and
27
+ # decrypts again, this time using DOTENV_PRIVATE_KEY_PRODUCTION
28
+ # from the container env (forwarded by docker-compose.yml from
29
+ # Coolify's app env). This covers server-side values the runtime
30
+ # reads with `process.env.X` — Server Action handlers, route
31
+ # handlers, etc.
32
+ #
33
+ # Image base is bookworm-slim (not alpine) because Next's optional
34
+ # native deps (sharp for image optimisation) ship glibc binaries that
35
+ # don't run on Alpine's musl without a rebuild.
36
+ ARG NODE_VERSION={{nodeMajor}}
37
+
38
+ # ---------------------------------------------------------------------------
39
+ # Build
40
+ # ---------------------------------------------------------------------------
41
+ FROM node:${NODE_VERSION}-bookworm-slim AS build
42
+ WORKDIR /app
43
+
44
+ RUN corepack enable
45
+
46
+ # Bring in the workspace manifests first so `pnpm install` can hit the
47
+ # Docker layer cache when only source files (not deps) change.
48
+ COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
49
+ COPY {{monorepoPackage}}/package.json ./{{monorepoPackage}}/package.json
50
+ RUN pnpm install --frozen-lockfile
51
+
52
+ COPY . .
53
+
54
+ # Two separate RUN steps on purpose: BuildKit echoes the entire RUN
55
+ # body into any failure log, so splitting the secret-presence check
56
+ # off means the "secret not supplied" message only surfaces when
57
+ # that's actually what failed — a downstream `next build` error
58
+ # won't drag the misleading echo into its context.
59
+ RUN --mount=type=secret,id=dotenvx_private_key,env=DOTENV_PRIVATE_KEY_PRODUCTION \
60
+ test -n "$DOTENV_PRIVATE_KEY_PRODUCTION" || { \
61
+ echo "ERROR: dotenvx_private_key build secret not supplied. The workflow at .github/workflows/deploy.yml should pass it via 'secrets:' from the GH Actions secret DOTENV_PRIVATE_KEY_PRODUCTION." >&2; \
62
+ exit 1; \
63
+ }
64
+
65
+ # dotenvx decrypts .env.production in memory and re-exports each
66
+ # KEY=VALUE for `pnpm build`. next build sees the plain values and
67
+ # bakes NEXT_PUBLIC_* into the static client bundle. The --filter
68
+ # targets the package by its `name` field, not its directory.
69
+ RUN --mount=type=secret,id=dotenvx_private_key,env=DOTENV_PRIVATE_KEY_PRODUCTION \
70
+ pnpm dlx @dotenvx/dotenvx run -- pnpm --filter {{packageName}} build
71
+
72
+ # ---------------------------------------------------------------------------
73
+ # Runtime — `next start` on PORT={{port}}, WORKDIR'd into the sub-package.
74
+ # ---------------------------------------------------------------------------
75
+ FROM node:${NODE_VERSION}-bookworm-slim AS runtime
76
+ WORKDIR /app
77
+
78
+ ENV NODE_ENV=production
79
+ ENV PORT={{port}}
80
+
81
+ # dotenvx is rarely a direct dep of the Next sub-package; install it
82
+ # globally in the runtime stage so the CMD always finds it.
83
+ RUN npm install -g @dotenvx/dotenvx@latest && npm cache clean --force
84
+
85
+ # Workspace skeleton: pnpm refuses to resolve when the lockfile or
86
+ # workspace manifest is missing, and `next start` walks up looking for
87
+ # `next.config.*` so the sub-package manifest has to be in place too.
88
+ COPY --from=build /app/package.json /app/pnpm-lock.yaml /app/pnpm-workspace.yaml ./
89
+ COPY --from=build /app/node_modules ./node_modules
90
+ COPY --from=build /app/.env.production ./
91
+ COPY --from=build /app/{{monorepoPackage}}/package.json ./{{monorepoPackage}}/package.json
92
+ COPY --from=build /app/{{monorepoPackage}}/next.config.* ./{{monorepoPackage}}/
93
+ COPY --from=build /app/{{monorepoPackage}}/node_modules ./{{monorepoPackage}}/node_modules
94
+ COPY --from=build /app/{{monorepoPackage}}/.next ./{{monorepoPackage}}/.next
95
+
96
+ WORKDIR /app/{{monorepoPackage}}
97
+
98
+ EXPOSE {{port}}
99
+
100
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=5 \
101
+ CMD node -e "require('http').get('http://127.0.0.1:{{port}}/',r=>{process.exit(r.statusCode<400?0:1)}).on('error',()=>process.exit(1))"
102
+
103
+ # dotenvx decrypts /app/.env.production at startup using
104
+ # DOTENV_PRIVATE_KEY_PRODUCTION from the container env (forwarded by
105
+ # Coolify via docker-compose.yml). The -f flag is required because
106
+ # WORKDIR is the sub-package, not the workspace root.
107
+ CMD ["dotenvx", "run", "-f", "/app/.env.production", "--", "./node_modules/.bin/next", "start", "--port", "{{port}}"]
@@ -8,9 +8,21 @@
8
8
  services:
9
9
  app:
10
10
  image: ghcr.io/{{owner}}/{{name}}:latest
11
+ # Force a registry pull on every `docker compose up`. Without this,
12
+ # Compose happily reuses whichever digest the local engine cached the
13
+ # last time it saw the `:latest` tag, so Coolify's redeploy webhook
14
+ # fires after each CI build but the running container keeps serving
15
+ # stale code. `always` makes the floating tag actually float.
16
+ pull_policy: always
11
17
  restart: unless-stopped
12
- ports:
13
- - "{{port}}:{{port}}"
18
+ # Coolify's Traefik reverse-proxy already owns host ports 80/443 and
19
+ # routes to this container via its internal Docker network. Use
20
+ # `expose` (not `ports`) so we declare the container port without
21
+ # trying to bind it on the host — binding the host port collides with
22
+ # Traefik and the deploy fails with
23
+ # "Bind for 0.0.0.0:{{port}} failed: port is already allocated".
24
+ expose:
25
+ - "{{port}}"
14
26
  environment:
15
27
  - NODE_ENV=production
16
28
  # Forwarded from Coolify's app env. dotenvx inside the
@@ -13,6 +13,11 @@ export interface ParsedCreateFlags {
13
13
  forceNoGithub: boolean;
14
14
  forceNoDeploy: boolean;
15
15
  forceNoInstall: boolean;
16
+ /** --no-local-dev hard-disables the Tailscale dev URL opt-in even when
17
+ * `--local-dev` / a preset would have enabled it. Distinct from the
18
+ * absence of `--local-dev`: a fresh `hatchkit create` without flags
19
+ * still defaults to enabling the integration. */
20
+ forceNoLocalDev: boolean;
16
21
  }
17
22
  export declare function parseCreateFlags(argv: string[]): ParsedCreateFlags;
18
23
  //# sourceMappingURL=flags.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC;uDACmD;IACnD,GAAG,EAAE,OAAO,CAAC;IACb;2DACuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC;6DACyD;IACzD,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CACzB;AAsBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA+FlE"}
1
+ {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAsB,aAAa,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IAChC;uDACmD;IACnD,GAAG,EAAE,OAAO,CAAC;IACb;2DACuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC;6DACyD;IACzD,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB;;;sDAGkD;IAClD,eAAe,EAAE,OAAO,CAAC;CAC1B;AAsBD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA2GlE"}
@@ -49,6 +49,7 @@ export function parseCreateFlags(argv) {
49
49
  const forceNoGithub = argv.includes("--no-github");
50
50
  const forceNoDeploy = argv.includes("--no-deploy");
51
51
  const forceNoInstall = argv.includes("--no-install");
52
+ const forceNoLocalDev = argv.includes("--no-local-dev");
52
53
  // Start from --config <path> if present, then layer individual flags on top.
53
54
  const presets = {};
54
55
  const configPath = get("config");
@@ -112,12 +113,23 @@ export function parseCreateFlags(argv) {
112
113
  presets.runDeployment = false;
113
114
  if (forceNoInstall)
114
115
  presets.installDeps = false;
116
+ if (forceNoLocalDev)
117
+ presets.localDev = undefined;
118
+ // --local-dev=<slug> sets an explicit slug; --local-dev with no value
119
+ // signals "yes, enable, derive slug from project name". The latter
120
+ // arrives as an empty string from `get()` when the flag has no `=`,
121
+ // which we treat the same as "derive". Conflicts with --no-local-dev
122
+ // resolve in favour of --no-local-dev (it's the safer choice).
123
+ const localDevSlug = get("local-dev");
124
+ if (localDevSlug !== undefined && !forceNoLocalDev) {
125
+ presets.localDev = { slug: localDevSlug };
126
+ }
115
127
  // Validate that presets-provided values look right before we pass
116
128
  // them on (the prompt layer would also catch these, but failing
117
129
  // early in non-interactive mode gives a cleaner error).
118
130
  if (has("config") && typeof presets.name !== "string" && yes) {
119
131
  // fine — may still come from --name flag or default
120
132
  }
121
- return { yes, dryRun, presets, forceNoGithub, forceNoDeploy, forceNoInstall };
133
+ return { yes, dryRun, presets, forceNoGithub, forceNoDeploy, forceNoInstall, forceNoLocalDev };
122
134
  }
123
135
  //# sourceMappingURL=flags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"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"}
@@ -152,6 +152,15 @@ export type LedgerStep = {
152
152
  repo: string;
153
153
  projectDir: string;
154
154
  cname?: string;
155
+ }
156
+ /** Tailscale-served local-dev Caddy fragment dropped at
157
+ * `~/.config/dev/projects/<slug>.caddy`. Recorded only when the
158
+ * project opted into the local-dev integration. Destroy removes the
159
+ * fragment file — host-wide Caddy + tailscale serve stay put (they
160
+ * belong to the user, not this project). */
161
+ | {
162
+ kind: "localDevFragment";
163
+ slug: string;
155
164
  };
156
165
  export interface LedgerData {
157
166
  /** Project slug. Also the filename. */
@@ -1 +1 @@
1
- {"version":3,"file":"run-ledger.d.ts","sourceRoot":"","sources":["../../src/utils/run-ledger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-ledger.d.ts","sourceRoot":"","sources":["../../src/utils/run-ledger.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run-ledger.js","sourceRoot":"","sources":["../../src/utils/run-ledger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-ledger.js","sourceRoot":"","sources":["../../src/utils/run-ledger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hatchkit",
3
- "version": "0.1.42",
3
+ "version": "0.1.45",
4
4
  "packageManager": "pnpm@10.33.2",
5
5
  "description": "Interactive CLI for scaffolding full-stack projects and provisioning observability/email clients",
6
6
  "type": "module",
@@ -18,6 +18,7 @@
18
18
  "start": "node dist/index.js",
19
19
  "test": "tsx test-scaffold.ts",
20
20
  "typecheck": "tsc --noEmit",
21
+ "dev:typecheck": "tsc --noEmit --watch --preserveWatchOutput",
21
22
  "lint": "biome check src",
22
23
  "lint:fix": "biome check --write src",
23
24
  "format": "biome format --write src",
@@ -27,12 +28,13 @@
27
28
  "release:patch": "node scripts/release-prep.mjs && node scripts/release-bump.mjs patch && pnpm run _release:finish",
28
29
  "release:minor": "node scripts/release-prep.mjs && node scripts/release-bump.mjs minor && pnpm run _release:finish",
29
30
  "release:major": "node scripts/release-prep.mjs && node scripts/release-bump.mjs major && pnpm run _release:finish",
30
- "_release:finish": "pnpm run build && pnpm run typecheck && npm publish --access public && git push --follow-tags && npm install -g .",
31
+ "_release:finish": "pnpm run build && pnpm run typecheck && node scripts/release-packages.mjs && npm publish --access public && git push --follow-tags && npm install -g .",
31
32
  "prepublishOnly": "pnpm run build"
32
33
  },
33
34
  "dependencies": {
34
35
  "@aws-sdk/client-s3": "^3.700.0",
35
36
  "@dotenvx/dotenvx": "^1.61.2",
37
+ "@hatchkit/dev-shared": "workspace:*",
36
38
  "@inquirer/core": "^10.3.0",
37
39
  "@inquirer/figures": "^1.0.0",
38
40
  "@inquirer/prompts": "^7.0.0",
@@ -54,9 +54,35 @@ pkg.version = next;
54
54
  writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, "utf-8");
55
55
  console.log(` release-bump: ${current} → ${next}`);
56
56
 
57
- // Stage + commit + tag from the repo root so the path in the commit
58
- // is `cli/package.json` regardless of where the script was invoked.
59
- sh(`git add ${JSON.stringify(join("cli", "package.json"))}`, { cwd: repoRoot });
57
+ // Bump `@hatchkit/dev-*` workspace packages in lockstep with the CLI.
58
+ // The CLI's runtime references the plugin version range as
59
+ // `^${cliVersion}` (see devPluginNextVersionRange in dev-setup.ts), so
60
+ // every release must guarantee the plugin packages exist on npm at the
61
+ // same version. release-packages.mjs publishes them right after this
62
+ // script bumps + commits the lockstep set.
63
+ const stagedPaths = [join("cli", "package.json")];
64
+ const lockstepPackages = ["dev-shared", "dev-plugin-next", "dev-plugin-vite"];
65
+ for (const name of lockstepPackages) {
66
+ const subPath = join(repoRoot, "packages", name, "package.json");
67
+ let subPkg;
68
+ try {
69
+ subPkg = JSON.parse(readFileSync(subPath, "utf-8"));
70
+ } catch (err) {
71
+ console.error(` release-bump: missing packages/${name}/package.json — ${err.message}`);
72
+ process.exit(1);
73
+ }
74
+ if (subPkg.version === next) continue;
75
+ subPkg.version = next;
76
+ writeFileSync(subPath, `${JSON.stringify(subPkg, null, 2)}\n`, "utf-8");
77
+ stagedPaths.push(join("packages", name, "package.json"));
78
+ console.log(` release-bump: packages/${name} → ${next}`);
79
+ }
80
+
81
+ // Stage + commit + tag from the repo root so the paths in the commit
82
+ // are repo-relative regardless of where the script was invoked.
83
+ for (const p of stagedPaths) {
84
+ sh(`git add ${JSON.stringify(p)}`, { cwd: repoRoot });
85
+ }
60
86
  sh(`git commit -m ${JSON.stringify(`chore: release v${next}`)}`, { cwd: repoRoot });
61
87
  sh(`git tag ${JSON.stringify(`v${next}`)}`, { cwd: repoRoot });
62
88
  console.log(` release-bump: committed + tagged v${next}`);
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * release-packages — build + publish the `@hatchkit/dev-*` workspace
4
+ * packages alongside the CLI. Runs BEFORE the CLI itself publishes so
5
+ * that scaffolds generated by the just-published CLI find their plugin
6
+ * dep on the registry.
7
+ *
8
+ * Publish order is topological:
9
+ * 1. @hatchkit/dev-shared (no @hatchkit/* deps)
10
+ * 2. @hatchkit/dev-plugin-next (depends on dev-shared)
11
+ * 3. @hatchkit/dev-plugin-vite (depends on dev-shared)
12
+ *
13
+ * Version sync: every `@hatchkit/dev-*` package matches the CLI's
14
+ * version. release-bump.mjs handles the bump in lockstep, so by the
15
+ * time we get here the package.jsons are already aligned. This script
16
+ * verifies that invariant and refuses to publish if anything drifted
17
+ * (a manual `npm version` in one package would do it).
18
+ *
19
+ * Idempotent w.r.t. already-published versions: each `npm publish`
20
+ * that hits "you cannot publish over the previously published versions"
21
+ * is treated as success (the version already exists on npm — that's
22
+ * what we wanted). Real failures (auth, network) propagate.
23
+ *
24
+ * Skip with RELEASE_SKIP_PACKAGES=1.
25
+ */
26
+
27
+ import { execSync, spawnSync } from "node:child_process";
28
+ import { existsSync, readFileSync } from "node:fs";
29
+ import { dirname, join } from "node:path";
30
+ import { fileURLToPath } from "node:url";
31
+
32
+ if (process.env.RELEASE_SKIP_PACKAGES === "1") {
33
+ console.log(" release-packages: RELEASE_SKIP_PACKAGES=1 — skipping.");
34
+ process.exit(0);
35
+ }
36
+
37
+ const here = dirname(fileURLToPath(import.meta.url));
38
+ const cliDir = join(here, "..");
39
+ const repoRoot = sh("git rev-parse --show-toplevel");
40
+
41
+ const PACKAGES = ["dev-shared", "dev-plugin-next", "dev-plugin-vite"];
42
+
43
+ const cliVersion = readJson(join(cliDir, "package.json")).version;
44
+ if (!cliVersion) {
45
+ console.error(" release-packages: couldn't read cli/package.json version. Aborting.");
46
+ process.exit(1);
47
+ }
48
+
49
+ // Sanity check: every dev-* package must already be bumped to cliVersion.
50
+ // release-bump.mjs does this; if someone skipped it, fail loud.
51
+ for (const name of PACKAGES) {
52
+ const pkgPath = join(repoRoot, "packages", name, "package.json");
53
+ if (!existsSync(pkgPath)) {
54
+ console.error(` release-packages: missing packages/${name}/package.json — aborting.`);
55
+ process.exit(1);
56
+ }
57
+ const pkg = readJson(pkgPath);
58
+ if (pkg.version !== cliVersion) {
59
+ console.error(
60
+ ` release-packages: packages/${name}/package.json is at ${pkg.version} but CLI is at ${cliVersion}.`,
61
+ );
62
+ console.error(
63
+ " release-bump.mjs should have aligned these. Did you run a release flow out of order?",
64
+ );
65
+ process.exit(1);
66
+ }
67
+ }
68
+
69
+ console.log(` release-packages: aligning @hatchkit/dev-* packages at v${cliVersion}.`);
70
+
71
+ for (const name of PACKAGES) {
72
+ const pkgDir = join(repoRoot, "packages", name);
73
+ console.log(`\n ── packages/${name}`);
74
+
75
+ // Build the workspace package. pnpm honours each package's own build
76
+ // script (tsc → dist).
77
+ shStream("pnpm", ["run", "build"], { cwd: pkgDir });
78
+
79
+ // Publish. pnpm publish from the package dir handles workspace:*
80
+ // dep rewrites (the dev plugins both depend on @hatchkit/dev-shared
81
+ // via workspace:*; pnpm replaces with the matching real version on
82
+ // publish). `--no-git-checks` because release-prep.mjs already
83
+ // confirmed the tree is clean and the commit/tag came from
84
+ // release-bump.mjs.
85
+ const publish = spawnSync(
86
+ "pnpm",
87
+ ["publish", "--access", "public", "--no-git-checks"],
88
+ { cwd: pkgDir, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" },
89
+ );
90
+ process.stdout.write(publish.stdout);
91
+ if (publish.status === 0) continue;
92
+
93
+ // Treat "version already published" as success — the goal is "this
94
+ // version exists on npm", and re-runs of a partially-completed
95
+ // release should be self-healing rather than re-bumping.
96
+ const stderr = publish.stderr ?? "";
97
+ if (
98
+ /You cannot publish over the previously published versions?/i.test(stderr) ||
99
+ /403 Forbidden.*cannot publish over/i.test(stderr)
100
+ ) {
101
+ console.log(` release-packages: @hatchkit/${name}@${cliVersion} already on npm — skipping.`);
102
+ continue;
103
+ }
104
+
105
+ console.error(`\n ✗ release-packages: pnpm publish failed for ${name}.\n`);
106
+ process.stderr.write(stderr);
107
+ process.exit(1);
108
+ }
109
+
110
+ console.log(`\n ✓ release-packages: all @hatchkit/dev-* packages at v${cliVersion} on npm.`);
111
+
112
+ function readJson(path) {
113
+ try {
114
+ return JSON.parse(readFileSync(path, "utf-8"));
115
+ } catch (err) {
116
+ console.error(` release-packages: couldn't read ${path} — ${err.message}`);
117
+ process.exit(1);
118
+ }
119
+ }
120
+
121
+ function sh(cmd, opts = {}) {
122
+ return execSync(cmd, { encoding: "utf-8", ...opts }).trim();
123
+ }
124
+
125
+ function shStream(bin, args, opts = {}) {
126
+ const res = spawnSync(bin, args, { stdio: "inherit", ...opts });
127
+ if (res.status !== 0) {
128
+ console.error(` release-packages: ${bin} ${args.join(" ")} failed (exit ${res.status}).`);
129
+ process.exit(res.status ?? 1);
130
+ }
131
+ }