@homeflare/config 0.7.0 → 0.9.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.
@@ -72,14 +72,18 @@ export function renderStep(step: JobStep, depth: number): string[] {
72
72
  ? renderRun(step.run ?? '', depth + 1)
73
73
  : [`${indent(depth + 1)}uses: ${step.uses}`];
74
74
 
75
- if (step.name === undefined) {
76
- // ⚠️ The first line of the item carries the dash, so an unnamed step's `run:` or
77
- // `uses:` is inlined after it and any block body follows at its own indent.
78
- const [first = '', ...rest] = body;
79
- lines.push(`${indent(depth)}- ${first.trimStart()}`, ...rest);
80
- } else {
81
- lines.push(`${indent(depth)}- name: ${scalar(step.name)}`, ...body);
82
- }
75
+ // ★ `name:` then `if:` then the body, because that is the order a reader scans: what
76
+ // this step is, whether it runs, what it does. All three are ordinary mapping keys
77
+ // to GitHub, so the order is for the person reading the diff, not the parser.
78
+ const head: string[] = [];
79
+ if (step.name !== undefined) head.push(`${indent(depth + 1)}name: ${scalar(step.name)}`);
80
+ if (step.if !== undefined) head.push(`${indent(depth + 1)}if: ${scalar(step.if)}`);
81
+
82
+ // ⚠️ The first line of the item carries the dash, whichever key it turns out to be —
83
+ // an unnamed, unconditional step still inlines its `run:` or `uses:` after the dash
84
+ // and lets any block body follow at its own indent.
85
+ const [first = '', ...rest] = [...head, ...body];
86
+ lines.push(`${indent(depth)}- ${first.trimStart()}`, ...rest);
83
87
 
84
88
  if (step.with !== undefined && Object.keys(step.with).length > 0) {
85
89
  lines.push(`${indent(depth + 1)}with:`, ...renderMapping(step.with, depth + 2));
@@ -0,0 +1,61 @@
1
+ /**
2
+ * `@homeflare/config/versions`: the one aligned set of versions the estate runs.
3
+ *
4
+ * import { ESTATE_VERSIONS } from '@homeflare/config/versions';
5
+ * ESTATE_VERSIONS.alchemy; // '2.0.0-beta.79'
6
+ *
7
+ * ★ WHY IT LIVES HERE. Until this file, the set had two homes and neither was reachable from
8
+ * outside the kit. Bun was `BUN_VERSION` in repo-shape/ci.ts. Every other pin sat in
9
+ * homeflare-kit's root `catalog`, which is authoritative but never published. Measured
10
+ * 2026-09-22, read-only, from each repository's lockfile: seven app repositories resolve
11
+ * `alchemy` 2.0.0-beta.78, the monorepo resolves beta.77 with `effect` rc.112, and one app
12
+ * resolves TypeScript 5.9.3. None of them had anything to compare against.
13
+ * `@homeflare/config` is the one package almost every estate repository already depends
14
+ * on (repo-shape.ts header: 13 of 14), so the set goes here.
15
+ *
16
+ * ⛔ THE KIT'S ROOT CATALOG STAYS AUTHORITATIVE. `tests/estate-versions.test.ts` fails when any
17
+ * value below differs from it, and it also fails when `bun` differs from `BUN_VERSION` or
18
+ * from the root's `packageManager`. A catalog bump that does not reach this file is
19
+ * therefore a red test in the same PR. Otherwise the estate would drift from a published
20
+ * source that looks correct.
21
+ *
22
+ * ★ RUNTIME PINS FOLLOW THE PINNED ALCHEMY RELEASE, NEVER THE OTHER WAY. `effect` and
23
+ * `@distilled.cloud/cloudflare` are the versions `alchemy@2.0.0-beta.79` was built and
24
+ * tested against. That release's own `dependencies` pin every `@distilled.cloud/*` at
25
+ * exactly 1.0.0-rc.12, and its workspace overrides pin `effect` 4.0.0-rc.115
26
+ * (alchemy-run/alchemy `pnpm-workspace.yaml@v2.0.0-beta.79#overrides`). The test reads the
27
+ * installed `alchemy/package.json` to prove the distilled pin. These values move only in
28
+ * the same PR as the `alchemy` bump.
29
+ *
30
+ * ⚠️ PUBLISHING THE SET ENFORCES NOTHING. No consumer check reads it yet. Wiring it into
31
+ * `checkProject`, so that each repository's lockfile is compared with it, is a separate,
32
+ * estate-wide rollout. Doing that here would turn the next bump into thirteen red CIs at
33
+ * once.
34
+ */
35
+ import { BUN_VERSION } from './repo-shape/ci.ts';
36
+
37
+ /** The package names the set pins. One entry per tool or runtime the whole estate shares. */
38
+ export type EstatePackage =
39
+ | 'bun'
40
+ | 'alchemy'
41
+ | 'effect'
42
+ | '@distilled.cloud/cloudflare'
43
+ | 'typescript'
44
+ | 'oxfmt'
45
+ | 'oxlint'
46
+ | '@types/bun';
47
+
48
+ /**
49
+ * Exact versions, never ranges. A range is what lets two repositories resolve two different
50
+ * versions from one line, which is exactly the drift this set exists to name.
51
+ */
52
+ export const ESTATE_VERSIONS: Readonly<Record<EstatePackage, string>> = {
53
+ bun: BUN_VERSION,
54
+ alchemy: '2.0.0-beta.79',
55
+ effect: '4.0.0-rc.115',
56
+ '@distilled.cloud/cloudflare': '1.0.0-rc.12',
57
+ typescript: '7.0.2',
58
+ oxfmt: '0.68.0',
59
+ oxlint: '1.83.0',
60
+ '@types/bun': '1.4.2',
61
+ };