@smoothbricks/cli 0.10.5 → 0.10.6

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 (41) hide show
  1. package/dist/cli.js +2 -2
  2. package/dist/github-ci/index.d.ts.map +1 -1
  3. package/dist/github-ci/index.js +5 -3
  4. package/dist/lib/json.d.ts +2 -0
  5. package/dist/lib/json.d.ts.map +1 -1
  6. package/dist/lib/json.js +2 -2
  7. package/dist/monorepo/ci-workflow.d.ts +2 -0
  8. package/dist/monorepo/ci-workflow.d.ts.map +1 -1
  9. package/dist/monorepo/ci-workflow.js +10 -4
  10. package/dist/monorepo/github-runs-on.d.ts +14 -0
  11. package/dist/monorepo/github-runs-on.d.ts.map +1 -0
  12. package/dist/monorepo/github-runs-on.js +43 -0
  13. package/dist/monorepo/index.d.ts +2 -2
  14. package/dist/monorepo/index.d.ts.map +1 -1
  15. package/dist/monorepo/index.js +7 -7
  16. package/dist/monorepo/managed-files.d.ts +30 -3
  17. package/dist/monorepo/managed-files.d.ts.map +1 -1
  18. package/dist/monorepo/managed-files.js +78 -63
  19. package/dist/monorepo/packs/index.js +1 -1
  20. package/dist/monorepo/publish-workflow.d.ts +3 -0
  21. package/dist/monorepo/publish-workflow.d.ts.map +1 -1
  22. package/dist/monorepo/publish-workflow.js +17 -14
  23. package/managed/raw/tooling/direnv/github-actions-bootstrap.sh +24 -7
  24. package/managed/templates/github/actions/cache-nix-devenv/action.yml +13 -11
  25. package/managed/templates/github/actions/save-nix-devenv/action.yml +34 -3
  26. package/managed/templates/github/actions/setup-devenv/action.yml +44 -15
  27. package/managed/templates/github/workflows/managed-files.yml +64 -12
  28. package/package.json +1 -1
  29. package/src/cli.ts +2 -2
  30. package/src/github-ci/index.test.ts +3 -3
  31. package/src/github-ci/index.ts +6 -3
  32. package/src/lib/json.ts +2 -0
  33. package/src/monorepo/__tests__/ci-workflow.test.ts +37 -1
  34. package/src/monorepo/__tests__/publish-workflow.test.ts +28 -1
  35. package/src/monorepo/ci-workflow.ts +14 -4
  36. package/src/monorepo/github-runs-on.ts +45 -0
  37. package/src/monorepo/index.ts +7 -7
  38. package/src/monorepo/managed-files.test.ts +49 -0
  39. package/src/monorepo/managed-files.ts +100 -64
  40. package/src/monorepo/packs/index.ts +1 -1
  41. package/src/monorepo/publish-workflow.ts +23 -15
package/dist/cli.js CHANGED
@@ -57,11 +57,11 @@ function buildProgram() {
57
57
  .option('--warn', 'report drift as warnings (GitHub annotations) instead of failing')
58
58
  .action(async (options) => {
59
59
  const { checkManagedFiles } = await import('./monorepo/index.js');
60
- checkManagedFiles(await findRepoRoot(), { warn: options.warn });
60
+ await checkManagedFiles(await findRepoRoot(), { warn: options.warn });
61
61
  });
62
62
  monorepo.command('diff').action(async () => {
63
63
  const { diffManagedFiles } = await import('./monorepo/index.js');
64
- diffManagedFiles(await findRepoRoot());
64
+ await diffManagedFiles(await findRepoRoot());
65
65
  });
66
66
  monorepo
67
67
  .command('validate-commit-msg <commitMsgFile>')
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/github-ci/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAsB,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAmBhD,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAEpD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBtE;AAmFD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAO3G;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACpG,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,oBAAoB,CAiC9G;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAwC/E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAehF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9F;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CAGf;AAgCD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACrG,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/github-ci/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAsB,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAmBhD,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAKpD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBtE;AAmFD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAO3G;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACpG,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,oBAAoB,CAiC9G;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAwC/E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAehF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9F;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CAGf;AAgCD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACrG,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -25,6 +25,8 @@ const parseNxProjectDeployConfigurations = (() => {
25
25
  const __is = input => "object" === typeof input && null !== input && false === Array.isArray(input) && _io0(input);
26
26
  return input => { input = JSON.parse(input); return __is(input) ? input : null; };
27
27
  })();
28
+ /** Nx workers = host cores (CI runners sized for full machine use). */
29
+ const NX_PARALLEL = '100%';
28
30
  export async function cleanupGithubCiCache(root) {
29
31
  const githubOutput = process.env.GITHUB_OUTPUT;
30
32
  const markCacheReady = async (ready) => {
@@ -127,7 +129,7 @@ export function nxSmartArgs(target, mode, configuration) {
127
129
  if (configuration) {
128
130
  args.push(`--configuration=${configuration}`);
129
131
  }
130
- args.push(`--exclude=tag:ci:skip:${target}`, '--parallel=5');
132
+ args.push(`--exclude=tag:ci:skip:${target}`, `--parallel=${NX_PARALLEL}`);
131
133
  return args;
132
134
  }
133
135
  export async function githubCiNxSmart(root, options) {
@@ -226,7 +228,7 @@ export function nxRunManyArgs(run, configuration) {
226
228
  if (configuration) {
227
229
  nxArgs.push(`--configuration=${configuration}`);
228
230
  }
229
- nxArgs.push('--parallel=5');
231
+ nxArgs.push(`--parallel=${NX_PARALLEL}`);
230
232
  return nxArgs;
231
233
  }
232
234
  export async function readGitHeadSha(root) {
@@ -291,7 +293,7 @@ export async function githubCiNxDeploy(root, options) {
291
293
  const projectList = projects.join(',');
292
294
  const targets = options.verify === true ? ['build', 'lint', 'test', 'deploy'] : ['deploy'];
293
295
  for (const target of targets) {
294
- const nxArgs = ['run-many', '-t', target, `--projects=${projectList}`, '--parallel=5'];
296
+ const nxArgs = ['run-many', '-t', target, `--projects=${projectList}`, `--parallel=${NX_PARALLEL}`];
295
297
  if (target === 'deploy') {
296
298
  nxArgs.push(`--configuration=${options.configuration}`);
297
299
  }
@@ -16,6 +16,8 @@ export interface PackagePublishConfig {
16
16
  }
17
17
  export interface PackageSmooGithub {
18
18
  pushBranches?: string[];
19
+ /** GitHub Actions runs-on for managed CI (string or label list). Default: ubuntu-latest. */
20
+ runsOn?: string | string[];
19
21
  }
20
22
  export interface PackageSmooConfig {
21
23
  github?: PackageSmooGithub;
@@ -1 +1 @@
1
- {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"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"}
package/dist/lib/json.js CHANGED
@@ -43,7 +43,7 @@ export const parsePackageJsonText = (() => {
43
43
  return true;
44
44
  });
45
45
  const _io12 = (input, _vctx = {}) => undefined === input.github || "object" === typeof input.github && null !== input.github && false === Array.isArray(input.github) && _io13(input.github, _vctx);
46
- const _io13 = (input, _vctx = {}) => undefined === input.pushBranches || Array.isArray(input.pushBranches) && input.pushBranches.every(elem => "string" === typeof elem);
46
+ const _io13 = (input, _vctx = {}) => (undefined === input.pushBranches || Array.isArray(input.pushBranches) && input.pushBranches.every(elem => "string" === typeof elem)) && (null !== input.runsOn && (undefined === input.runsOn || "string" === typeof input.runsOn || Array.isArray(input.runsOn) && input.runsOn.every(elem => "string" === typeof elem)));
47
47
  const _io2 = (input, _vctx = {}) => (_vctx.io2 || (_vctx.io2 = new WeakSet())).has(input) ? true : (_vctx.io2.add(input), (Object.keys(input).every(key => {
48
48
  const value = input[key];
49
49
  if (undefined === value)
@@ -156,7 +156,7 @@ const isPackageJsonValue = (() => {
156
156
  return true;
157
157
  });
158
158
  const _io12 = (input, _vctx = {}) => undefined === input.github || "object" === typeof input.github && null !== input.github && false === Array.isArray(input.github) && _io13(input.github, _vctx);
159
- const _io13 = (input, _vctx = {}) => undefined === input.pushBranches || Array.isArray(input.pushBranches) && input.pushBranches.every(elem => "string" === typeof elem);
159
+ const _io13 = (input, _vctx = {}) => (undefined === input.pushBranches || Array.isArray(input.pushBranches) && input.pushBranches.every(elem => "string" === typeof elem)) && (null !== input.runsOn && (undefined === input.runsOn || "string" === typeof input.runsOn || Array.isArray(input.runsOn) && input.runsOn.every(elem => "string" === typeof elem)));
160
160
  const _io2 = (input, _vctx = {}) => (_vctx.io2 || (_vctx.io2 = new WeakSet())).has(input) ? true : (_vctx.io2.add(input), (Object.keys(input).every(key => {
161
161
  const value = input[key];
162
162
  if (undefined === value)
@@ -22,6 +22,8 @@ export interface CiWorkflowDefinitionOptions {
22
22
  deploy: boolean;
23
23
  deployProvider?: 'cloudflare';
24
24
  pushBranches: string[];
25
+ /** Default ubuntu-latest when omitted. */
26
+ runsOn?: string | string[];
25
27
  }
26
28
  export declare function defineCiWorkflow(options: CiWorkflowDefinitionOptions): CiWorkflowStep[];
27
29
  export declare function renderCiWorkflowYaml(options: CiWorkflowDefinitionOptions): string;
@@ -1 +1 @@
1
- {"version":3,"file":"ci-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/ci-workflow.ts"],"names":[],"mappings":"AAEA,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,SAAS,gBAAgB;IACzB,cAAc,qBAAqB;IACnC,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,eAAe;IACxB,iBAAiB,wBAAwB;IACzC,oBAAoB,2BAA2B;IAC/C,MAAM,WAAW;IACjB,WAAW,kBAAkB;IAC7B,cAAc,qBAAqB;IACnC,aAAa,oBAAoB;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,EAAE,CAqBvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CAGjF"}
1
+ {"version":3,"file":"ci-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/ci-workflow.ts"],"names":[],"mappings":"AAIA,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,SAAS,gBAAgB;IACzB,cAAc,qBAAqB;IACnC,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,eAAe;IACxB,iBAAiB,wBAAwB;IACzC,oBAAoB,2BAA2B;IAC/C,MAAM,WAAW;IACjB,WAAW,kBAAkB;IAC7B,cAAc,qBAAqB;IACnC,aAAa,oBAAoB;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC5B;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,EAAE,CAqBvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CAGjF"}
@@ -1,4 +1,5 @@
1
1
  /* biome-ignore-all lint/suspicious/noTemplateCurlyInString: GitHub Actions expressions are emitted literally. */
2
+ import { renderRunsOnLine } from './github-runs-on.js';
2
3
  export var CiWorkflowStepKind;
3
4
  (function (CiWorkflowStepKind) {
4
5
  CiWorkflowStepKind["Checkout"] = "checkout";
@@ -59,7 +60,7 @@ defaults:
59
60
  jobs:
60
61
  main:
61
62
  name: Validate
62
- runs-on: ubuntu-latest
63
+ ${renderRunsOnLine(options.runsOn)}
63
64
  timeout-minutes: 45
64
65
  env:
65
66
  NIX_STORE_NAR: ${githubExpression('github.workspace')}/nix-store.nar
@@ -124,6 +125,8 @@ function yamlLinesForStep(step, options) {
124
125
  ' fetch-depth: 0',
125
126
  ];
126
127
  case CiWorkflowStepKind.SetupDevenv:
128
+ // One step everywhere. setup-devenv detects host-nix (GARM) vs ephemeral
129
+ // and skips GH install/cache steps internally — same for ci/publish/managed.
127
130
  return [` - name: ${step.name}`, ' id: setup', ' uses: ./.github/actions/setup-devenv'];
128
131
  case CiWorkflowStepKind.SetNxShas:
129
132
  return [
@@ -158,7 +161,7 @@ function yamlLinesForStep(step, options) {
158
161
  // recursion guard, so the default token suffices.
159
162
  return [
160
163
  ` - name: ${step.name}`,
161
- " if: ${{ steps.managed-drift.outputs.drifted != '' && steps.managed-drift.outputs.drifted != '0' }}",
164
+ " if: steps.managed-drift.outputs.drifted != '' && steps.managed-drift.outputs.drifted != '0'",
162
165
  ' run: gh workflow run managed-files.yml --ref "$GITHUB_REF_NAME"',
163
166
  ];
164
167
  case CiWorkflowStepKind.Deploy:
@@ -186,7 +189,8 @@ function yamlLinesForStep(step, options) {
186
189
  case CiWorkflowStepKind.UploadTraceDbs:
187
190
  return [
188
191
  ` - name: ${step.name}`,
189
- ' if: ${{ always() }}',
192
+ ' # success() is the default; always() keeps traces after a red build/test.',
193
+ ' if: always()',
190
194
  ' uses: actions/upload-artifact@v7.0.1',
191
195
  ' with:',
192
196
  ' name: trace-results-${{ github.run_id }}',
@@ -198,7 +202,9 @@ function yamlLinesForStep(step, options) {
198
202
  case CiWorkflowStepKind.SaveNixDevenv:
199
203
  return [
200
204
  ` - name: ${step.name}`,
201
- ' if: ${{ always() }}',
205
+ ' # always() still saves after a red job. Nix NAR is ephemeral-only;',
206
+ ' # devenv eval-cache also saves on host-nix when setup missed.',
207
+ ' if: always()',
202
208
  ' uses: ./.github/actions/save-nix-devenv',
203
209
  ' with:',
204
210
  ' nix-cache-hit: ${{ steps.setup.outputs.nix-cache-hit }}',
@@ -0,0 +1,14 @@
1
+ /** Shared `runs-on:` emission for generated GitHub workflow YAML. */
2
+ export type WorkflowRunsOn = string | string[] | undefined;
3
+ export declare function isNixosRunner(runsOn: WorkflowRunsOn): boolean;
4
+ /**
5
+ * Trusted jobs use configured nixos self-hosted labels; fork PRs stay on
6
+ * ubuntu-latest (no access to the private runner fleet).
7
+ */
8
+ export declare function githubUsesNixosRunnerExpr(): string;
9
+ /**
10
+ * Full ` runs-on: …` line(s), indented for a job under `jobs.<id>:`.
11
+ * Nixos labels emit the multiline prettier-stable fork-gate expression.
12
+ */
13
+ export declare function renderRunsOnLine(runsOn: WorkflowRunsOn): string;
14
+ //# sourceMappingURL=github-runs-on.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-runs-on.d.ts","sourceRoot":"","sources":["../../src/monorepo/github-runs-on.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAE3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAG7D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuB/D"}
@@ -0,0 +1,43 @@
1
+ /** Shared `runs-on:` emission for generated GitHub workflow YAML. */
2
+ export function isNixosRunner(runsOn) {
3
+ const labels = runsOn === undefined ? [] : typeof runsOn === 'string' ? [runsOn] : runsOn;
4
+ return labels.some((label) => label === 'nixos' || label.startsWith('nixos-'));
5
+ }
6
+ /**
7
+ * Trusted jobs use configured nixos self-hosted labels; fork PRs stay on
8
+ * ubuntu-latest (no access to the private runner fleet).
9
+ */
10
+ export function githubUsesNixosRunnerExpr() {
11
+ return "(github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository)";
12
+ }
13
+ /**
14
+ * Full ` runs-on: …` line(s), indented for a job under `jobs.<id>:`.
15
+ * Nixos labels emit the multiline prettier-stable fork-gate expression.
16
+ */
17
+ export function renderRunsOnLine(runsOn) {
18
+ if (!isNixosRunner(runsOn)) {
19
+ let value;
20
+ if (runsOn === undefined) {
21
+ value = 'ubuntu-latest';
22
+ }
23
+ else if (typeof runsOn === 'string') {
24
+ value = runsOn.length > 0 ? runsOn : 'ubuntu-latest';
25
+ }
26
+ else if (runsOn.length === 0) {
27
+ value = 'ubuntu-latest';
28
+ }
29
+ else if (runsOn.length === 1) {
30
+ value = runsOn[0] ?? 'ubuntu-latest';
31
+ }
32
+ else {
33
+ value = `[${runsOn.map((label) => `'${label}'`).join(', ')}]`;
34
+ }
35
+ return ` runs-on: ${value}`;
36
+ }
37
+ const labels = typeof runsOn === 'string' ? [runsOn] : runsOn;
38
+ // Multiline matches prettier so checked-in workflows stay byte-identical.
39
+ const nixosJson = JSON.stringify(labels);
40
+ return ` runs-on:
41
+ \${{ ${githubUsesNixosRunnerExpr()} &&
42
+ fromJSON('${nixosJson}') || 'ubuntu-latest' }}`;
43
+ }
@@ -33,8 +33,8 @@ export declare function validateMonorepo(root: string, options?: ValidateOptions
33
33
  export declare function updateManagedFiles(root: string): Promise<void>;
34
34
  export declare function checkManagedFiles(root: string, options?: {
35
35
  warn?: boolean;
36
- }): void;
37
- export declare function diffManagedFiles(root: string): void;
36
+ }): Promise<void>;
37
+ export declare function diffManagedFiles(root: string): Promise<void>;
38
38
  export declare function validateCommitMessageFile(path: string | undefined, options?: ValidateCommitMessageOptions, root?: string): void;
39
39
  export declare function listReleaseProjectNamesForNx(root: string, options?: ListReleasePackagesOptions): string;
40
40
  export declare function validatePublicPackageTags(root: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/monorepo/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAOxD,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBjG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAapE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAUtF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,GAAE,4BAAiC,EAC1C,IAAI,SAAgB,GACnB,IAAI,CAgBN;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B,GAAG,MAAM,CAW3G;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5D;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,uBAAuB,EAChC,KAAK,GAAE,qBAAoD,GAC1D,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/monorepo/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAOxD,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBjG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAapE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrG;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,GAAE,4BAAiC,EAC1C,IAAI,SAAgB,GACnB,IAAI,CAgBN;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B,GAAG,MAAM,CAW3G;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5D;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,uBAAuB,EAChC,KAAK,GAAE,qBAAoD,GAC1D,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,CAAC"}
@@ -15,7 +15,7 @@ export async function initMonorepo(root, options) {
15
15
  await syncRootRuntimeVersions(root);
16
16
  return;
17
17
  }
18
- printResults(applyManagedFiles(root, 'update'));
18
+ printResults(await applyManagedFiles(root, 'update'));
19
19
  await runInitPacks({ root, syncRuntime: process.env.DEVENV_ROOT !== undefined || options.syncRuntime === true });
20
20
  }
21
21
  export async function validateMonorepo(root, options = {}) {
@@ -37,7 +37,7 @@ export async function validateMonorepo(root, options = {}) {
37
37
  }
38
38
  }
39
39
  export async function updateManagedFiles(root) {
40
- printResults(applyManagedFiles(root, 'update'));
40
+ printResults(await applyManagedFiles(root, 'update'));
41
41
  // Tool dependency policy (typescript API 6, @typescript/native for ttsc, nx, …)
42
42
  // lives next to managed templates — update must install them, not only rewrite files.
43
43
  await applyToolConfigDefaults(root);
@@ -50,19 +50,19 @@ export async function updateManagedFiles(root) {
50
50
  throw new Error(`bun install failed after monorepo update${stderr || stdout ? `:\n${stderr || stdout}` : ''}`);
51
51
  }
52
52
  }
53
- export function checkManagedFiles(root, options = {}) {
53
+ export async function checkManagedFiles(root, options = {}) {
54
54
  if (options.warn === true) {
55
- warnOnManagedFileDrift(root);
55
+ await warnOnManagedFileDrift(root);
56
56
  return;
57
57
  }
58
- const results = applyManagedFiles(root, 'check');
58
+ const results = await applyManagedFiles(root, 'check');
59
59
  printResults(results);
60
60
  if (results.some((result) => result.action === 'drifted')) {
61
61
  throw new Error('Managed monorepo files are out of date. Run: smoo monorepo update');
62
62
  }
63
63
  }
64
- export function diffManagedFiles(root) {
65
- printResults(applyManagedFiles(root, 'diff'));
64
+ export async function diffManagedFiles(root) {
65
+ printResults(await applyManagedFiles(root, 'diff'));
66
66
  }
67
67
  export function validateCommitMessageFile(path, options = {}, root = process.cwd()) {
68
68
  if (!path) {
@@ -47,10 +47,37 @@ export interface FileResult {
47
47
  target: string;
48
48
  action: 'created' | 'updated' | 'unchanged' | 'skipped' | 'skipped-symlink' | 'drifted' | 'ok-symlink';
49
49
  }
50
- export declare function applyManagedFiles(root: string, mode: 'update' | 'check' | 'diff'): FileResult[];
50
+ interface DeployTargetInfo {
51
+ exists: boolean;
52
+ provider?: 'cloudflare';
53
+ }
54
+ export declare function applyManagedFiles(root: string, mode: 'update' | 'check' | 'diff'): Promise<FileResult[]>;
51
55
  export declare function platformTargetGlobsForTest(targetNames: Iterable<string>): string[];
56
+ /** Resolved Nx project node as returned under `graph.nodes` / project-graph.json. */
57
+ export type NxGraphProjectNode = {
58
+ data?: {
59
+ targets?: Record<string, NxGraphTarget>;
60
+ };
61
+ targets?: Record<string, NxGraphTarget>;
62
+ };
63
+ type NxGraphTarget = {
64
+ command?: string;
65
+ options?: {
66
+ command?: string;
67
+ };
68
+ configurations?: Record<string, {
69
+ command?: string;
70
+ options?: {
71
+ command?: string;
72
+ };
73
+ }>;
74
+ };
75
+ /** Test seam: collect target names from a graph.nodes map. */
76
+ export declare function targetNamesFromProjects(nodes: Record<string, NxGraphProjectNode>): string[];
77
+ /** Test seam: deploy configuration presence/provider from graph nodes. */
78
+ export declare function deployTargetInfoFromProjects(nodes: Record<string, NxGraphProjectNode>, configuration: string): DeployTargetInfo;
52
79
  export declare function printResults(results: FileResult[]): void;
53
- export declare function validateManagedFiles(root: string): number;
80
+ export declare function validateManagedFiles(root: string): Promise<number>;
54
81
  /**
55
82
  * Non-blocking drift report: prints the per-file table and surfaces drift as
56
83
  * GitHub Actions warning annotations (plain stderr elsewhere) without failing
@@ -61,6 +88,6 @@ export declare function validateManagedFiles(root: string): number;
61
88
  * Under GitHub Actions the drifted-file count is published as the step output
62
89
  * `drifted`, so downstream steps gate declaratively instead of parsing logs.
63
90
  */
64
- export declare function warnOnManagedFileDrift(root: string): void;
91
+ export declare function warnOnManagedFileDrift(root: string): Promise<void>;
65
92
  export {};
66
93
  //# sourceMappingURL=managed-files.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"managed-files.d.ts","sourceRoot":"","sources":["../../src/monorepo/managed-files.ts"],"names":[],"mappings":"AAYA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,yEAAyE,CAAC;AAU3G,sFAAsF;AACtF,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAIlF;AAED,uCAAuC;AACvC,eAAO,MAAM,wBAAwB,0BAAoB,CAAC;AAE1D;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;8BAE8B;AAC9B,iBAAS,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAkCxG;AAED,wCAAwC;AACxC,eAAO,MAAM,+BAA+B,iCAA2B,CAAC;AAExE;+EAC+E;AAC/E,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAqBtF;AAED,yCAAyC;AACzC,eAAO,MAAM,gCAAgC,kCAA4B,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAAC;CACxG;AA8HD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,EAAE,CAG/F;AA6FD,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAMlF;AAgGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAIxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkBzD"}
1
+ {"version":3,"file":"managed-files.d.ts","sourceRoot":"","sources":["../../src/monorepo/managed-files.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { execFileSync } from 'node:child_process';
2
1
  import { appendFileSync, existsSync, lstatSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
2
  import { dirname, join, resolve } from 'node:path';
4
3
  import { fileURLToPath } from 'node:url';
5
4
  import { PLATFORM_TARGET_GLOBS } from '@smoothbricks/nx-plugin/workspace-config-policy';
6
- import { parseNxProjectJsonText, parseStringArrayText } from '../lib/json.js';
5
+ // Nx package exports are CLI-oriented; this is the module the CLI uses for graph + daemon IPC.
6
+ import { createProjectGraphAsync } from 'nx/src/project-graph/project-graph.js';
7
7
  import { listReleasePackages, readPackageJson } from '../lib/workspace.js';
8
8
  import { renderCiWorkflowYaml } from './ci-workflow.js';
9
9
  import { renderPublishWorkflowYaml } from './publish-workflow.js';
@@ -199,8 +199,8 @@ const managedFiles = [
199
199
  },
200
200
  ];
201
201
  const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
202
- export function applyManagedFiles(root, mode) {
203
- const context = getManagedFileContext(root);
202
+ export async function applyManagedFiles(root, mode) {
203
+ const context = await getManagedFileContext(root);
204
204
  return managedFiles.map((file) => applyManagedFile(root, file, mode, context));
205
205
  }
206
206
  function applyManagedFile(root, file, mode, context) {
@@ -244,6 +244,7 @@ function getManagedContent(file, context) {
244
244
  deploy: context.hasStagingDeployTargets,
245
245
  deployProvider: context.stagingDeployProvider,
246
246
  pushBranches: context.ciPushBranches,
247
+ runsOn: context.ciRunsOn,
247
248
  });
248
249
  }
249
250
  if (file.source === 'publish-workflow') {
@@ -252,6 +253,7 @@ function getManagedContent(file, context) {
252
253
  deployProvider: context.productionDeployProvider,
253
254
  repoName: context.repoName,
254
255
  platformTargetGlobs: context.platformTargetGlobs,
256
+ runsOn: context.ciRunsOn,
255
257
  });
256
258
  }
257
259
  throw new Error(`Unknown generated managed file source ${file.source}`);
@@ -264,13 +266,16 @@ function getManagedContent(file, context) {
264
266
  }
265
267
  return renderTemplate(context, content);
266
268
  }
267
- function getManagedFileContext(root) {
269
+ async function getManagedFileContext(root) {
268
270
  const packageJson = readPackageJson(join(root, 'package.json'));
269
271
  const repoName = packageJson?.name ?? 'monorepo';
270
272
  const ciPushBranches = getCiPushBranches(packageJson?.json);
271
- const stagingDeploy = getDeployTargetInfo(root, 'staging');
272
- const productionDeploy = getDeployTargetInfo(root, 'production');
273
- const platformTargetGlobs = platformTargetGlobsForTest(readResolvedNxTargetNames(root));
273
+ const ciRunsOn = getCiRunsOn(packageJson?.json);
274
+ // In-process Nx API → daemon socket (no second Node/`nx` CLI process).
275
+ const nxProjects = await loadNxGraphProjects(root);
276
+ const stagingDeploy = deployTargetInfoFromProjects(nxProjects, 'staging');
277
+ const productionDeploy = deployTargetInfoFromProjects(nxProjects, 'production');
278
+ const platformTargetGlobs = platformTargetGlobsForTest(targetNamesFromProjects(nxProjects));
274
279
  const nodeModulesCacheKey = existsSync(join(root, 'bun.lock'))
275
280
  ? `$${"{{ hashFiles('bun.lock', 'package.json', 'packages/*/package.json') }}"}`
276
281
  : `$${"{{ hashFiles('bun.lockb', 'package.json', 'packages/*/package.json') }}"}`;
@@ -281,6 +286,7 @@ function getManagedFileContext(root) {
281
286
  stagingDeployProvider: stagingDeploy.provider,
282
287
  productionDeployProvider: productionDeploy.provider,
283
288
  ciPushBranches,
289
+ ciRunsOn,
284
290
  nodeModulesCacheKey,
285
291
  repoName,
286
292
  platformTargetGlobs,
@@ -293,77 +299,86 @@ export function platformTargetGlobsForTest(targetNames) {
293
299
  return names.some((name) => name.endsWith(suffix));
294
300
  });
295
301
  }
296
- function readResolvedNxTargetNames(root) {
297
- const output = execFileSync('nx', ['show', 'projects', '--json'], {
298
- cwd: root,
299
- encoding: 'utf8',
300
- stdio: ['ignore', 'pipe', 'inherit'],
301
- });
302
- const projects = parseStringArrayText(output);
303
- if (!projects) {
304
- return [];
302
+ /**
303
+ * Load resolved project nodes via Nx's programmatic API.
304
+ *
305
+ * `createProjectGraphAsync` is what the CLI uses: with the daemon up it speaks the
306
+ * daemon unix socket instead of rebuilding the graph in a fresh Node process.
307
+ * Spawning `nx graph` / `nx show` only added CLI boot + plugin-worker overhead on
308
+ * top of that. smoo runs under Bun; Bun can import this CJS module directly.
309
+ */
310
+ async function loadNxGraphProjects(root) {
311
+ const prevCwd = process.cwd();
312
+ process.chdir(root);
313
+ try {
314
+ const graph = (await createProjectGraphAsync());
315
+ const out = {};
316
+ for (const [name, node] of Object.entries(graph.nodes)) {
317
+ out[name] = { data: { targets: node.data?.targets ?? {} } };
318
+ }
319
+ return out;
320
+ }
321
+ finally {
322
+ process.chdir(prevCwd);
305
323
  }
324
+ }
325
+ function targetsOfProject(node) {
326
+ return node.data?.targets ?? node.targets ?? {};
327
+ }
328
+ /** Test seam: collect target names from a graph.nodes map. */
329
+ export function targetNamesFromProjects(nodes) {
306
330
  const targetNames = new Set();
307
- for (const project of projects) {
308
- const projectOutput = execFileSync('nx', ['show', 'project', project, '--json'], {
309
- cwd: root,
310
- encoding: 'utf8',
311
- stdio: ['ignore', 'pipe', 'inherit'],
312
- });
313
- const projectJson = parseNxProjectJsonText(projectOutput);
314
- const targets = projectJson?.targets;
315
- if (targets) {
316
- for (const targetName of Object.keys(targets)) {
317
- targetNames.add(targetName);
318
- }
331
+ for (const node of Object.values(nodes)) {
332
+ for (const name of Object.keys(targetsOfProject(node))) {
333
+ targetNames.add(name);
319
334
  }
320
335
  }
321
336
  return [...targetNames];
322
337
  }
323
- function renderTemplate(context, template) {
324
- return template
325
- .replaceAll('{{REPO_NAME}}', context.repoName)
326
- .replaceAll('__SMOO_CI_PUSH_BRANCHES__', renderYamlFlowList(context.ciPushBranches))
327
- .replaceAll('{{NODE_MODULES_CACHE_KEY}}', context.nodeModulesCacheKey);
328
- }
329
- function getDeployTargetInfo(root, configuration) {
330
- const output = execFileSync('nx', ['show', 'projects', '--withTarget', 'deploy', '--json'], {
331
- cwd: root,
332
- encoding: 'utf8',
333
- stdio: ['ignore', 'pipe', 'inherit'],
334
- });
335
- const projects = parseStringArrayText(output);
336
- if (!projects) {
337
- return { exists: false };
338
- }
338
+ /** Test seam: deploy configuration presence/provider from graph nodes. */
339
+ export function deployTargetInfoFromProjects(nodes, configuration) {
339
340
  let exists = false;
340
341
  let provider;
341
- for (const project of projects) {
342
- const target = nxDeployTarget(root, project, configuration);
343
- if (!target.exists) {
342
+ for (const node of Object.values(nodes)) {
343
+ const info = deployTargetInfoFromTargets(targetsOfProject(node), configuration);
344
+ if (!info.exists) {
344
345
  continue;
345
346
  }
346
347
  exists = true;
347
- provider ??= target.provider;
348
+ provider ??= info.provider;
348
349
  }
349
350
  return { exists, provider };
350
351
  }
351
- function nxDeployTarget(root, project, configuration) {
352
- const output = execFileSync('nx', ['show', 'project', project, '--json'], {
353
- cwd: root,
354
- encoding: 'utf8',
355
- stdio: ['ignore', 'pipe', 'inherit'],
356
- });
357
- const projectJson = parseNxProjectJsonText(output);
358
- const deploy = projectJson?.targets?.deploy;
359
- const config = deploy?.configurations?.[configuration];
352
+ function deployTargetInfoFromTargets(targets, configuration) {
353
+ const deploy = targets.deploy;
354
+ if (!deploy) {
355
+ return { exists: false };
356
+ }
357
+ const config = deploy.configurations?.[configuration];
360
358
  if (!config) {
361
359
  return { exists: false };
362
360
  }
363
- const commandValue = config.command ?? config.options?.command ?? deploy?.options?.command;
361
+ const commandValue = config.command ?? config.options?.command ?? deploy.options?.command ?? deploy.command;
364
362
  const command = typeof commandValue === 'string' ? commandValue : '';
365
363
  return { exists: true, provider: command.includes('wrangler ') ? 'cloudflare' : undefined };
366
364
  }
365
+ function renderTemplate(context, template) {
366
+ return template
367
+ .replaceAll('{{REPO_NAME}}', context.repoName)
368
+ .replaceAll('__SMOO_CI_PUSH_BRANCHES__', renderYamlFlowList(context.ciPushBranches))
369
+ .replaceAll('{{NODE_MODULES_CACHE_KEY}}', context.nodeModulesCacheKey);
370
+ }
371
+ function getCiRunsOn(packageJson) {
372
+ const configured = packageJson?.smoo?.github?.runsOn;
373
+ if (configured === undefined) {
374
+ return 'ubuntu-latest';
375
+ }
376
+ if (typeof configured === 'string') {
377
+ return configured.length > 0 ? configured : 'ubuntu-latest';
378
+ }
379
+ const labels = configured.filter((label) => label.length > 0);
380
+ return labels.length > 0 ? labels : 'ubuntu-latest';
381
+ }
367
382
  function getCiPushBranches(packageJson) {
368
383
  const configured = readCiPushBranches(packageJson);
369
384
  return configured.length > 0 ? configured : ['main'];
@@ -384,8 +399,8 @@ export function printResults(results) {
384
399
  console.log(`${result.action.padEnd(15)} ${result.target}`);
385
400
  }
386
401
  }
387
- export function validateManagedFiles(root) {
388
- const results = applyManagedFiles(root, 'check');
402
+ export async function validateManagedFiles(root) {
403
+ const results = await applyManagedFiles(root, 'check');
389
404
  printResults(results);
390
405
  const failures = results.filter((result) => result.action === 'drifted').length;
391
406
  if (failures > 0) {
@@ -403,8 +418,8 @@ export function validateManagedFiles(root) {
403
418
  * Under GitHub Actions the drifted-file count is published as the step output
404
419
  * `drifted`, so downstream steps gate declaratively instead of parsing logs.
405
420
  */
406
- export function warnOnManagedFileDrift(root) {
407
- const results = applyManagedFiles(root, 'check');
421
+ export async function warnOnManagedFileDrift(root) {
422
+ const results = await applyManagedFiles(root, 'check');
408
423
  printResults(results);
409
424
  const drifted = results.filter((result) => result.action === 'drifted');
410
425
  if (process.env.GITHUB_OUTPUT) {
@@ -40,7 +40,7 @@ const packs = [
40
40
  // Managed-file drift is derived state (CLI template x pinned version) with
41
41
  // its own remediation flow; it warns instead of failing so validation only
42
42
  // blocks on actual package issues. See warnOnManagedFileDrift.
43
- warnOnManagedFileDrift(ctx.root);
43
+ await warnOnManagedFileDrift(ctx.root);
44
44
  return (runtimeFailures +
45
45
  validateRootPackagePolicy(ctx.root) +
46
46
  (await validateToolConfig(ctx.root)) +
@@ -1,3 +1,4 @@
1
+ import { type WorkflowRunsOn } from './github-runs-on.js';
1
2
  export type PublishWorkflowBump = 'auto' | 'patch' | 'minor' | 'major' | 'prerelease';
2
3
  export type PublishWorkflowCondition = 'version-mode-not-none' | 'deploy-production' | 'failure' | 'always';
3
4
  export type PublishWorkflowNxTarget = 'build' | 'lint' | 'test';
@@ -35,6 +36,8 @@ export interface PublishWorkflowDefinitionOptions {
35
36
  deployProvider?: 'cloudflare';
36
37
  repoName?: string;
37
38
  platformTargetGlobs?: readonly string[];
39
+ /** Linux jobs only. Default ubuntu-latest. Same smoo.github.runsOn as CI. */
40
+ runsOn?: WorkflowRunsOn;
38
41
  }
39
42
  export interface PublishWorkflowInputs {
40
43
  bump: PublishWorkflowBump;