@openfn/cli 1.12.1 → 1.13.1

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/README.md CHANGED
@@ -317,6 +317,7 @@ A workflow has a structure like this:
317
317
  {
318
318
  "workflow": {
319
319
  "name": "my-workflow", // human readable name used in logging
320
+ "globals": "./common-funcs.js", // code or path to functions that can be accessed in any step. globally scoped
320
321
  "steps": [
321
322
  {
322
323
  "name": "a", // human readable name used in logging
package/dist/index.js CHANGED
@@ -291,6 +291,14 @@ var force = {
291
291
  default: false
292
292
  }
293
293
  };
294
+ var keepUnsupported = {
295
+ name: "keep-unsupported",
296
+ yargs: {
297
+ boolean: true,
298
+ description: "Keep adaptors that do not support metadata (do not remove them)",
299
+ default: false
300
+ }
301
+ };
294
302
  var immutable = {
295
303
  name: "immutable",
296
304
  yargs: {
@@ -916,6 +924,7 @@ var options6 = [
916
924
  expandAdaptors,
917
925
  adaptors,
918
926
  force,
927
+ keepUnsupported,
919
928
  log,
920
929
  logJson,
921
930
  repoDir,
@@ -320,7 +320,11 @@ var get_autoinstall_targets_default = getAutoinstallTargets;
320
320
  // src/repo/handler.ts
321
321
  import { exec } from "node:child_process";
322
322
  import treeify from "treeify";
323
- import { install as rtInstall, loadRepoPkg } from "@openfn/runtime";
323
+ import {
324
+ install as rtInstall,
325
+ loadRepoPkg,
326
+ getNameAndVersion as getNameAndVersion2
327
+ } from "@openfn/runtime";
324
328
  var install = async (opts, log = defaultLogger) => {
325
329
  let { packages, adaptors, repoDir } = opts;
326
330
  const targets = [].concat(packages ?? [], adaptors ?? []);
@@ -335,6 +339,29 @@ var install = async (opts, log = defaultLogger) => {
335
339
  }
336
340
  return [];
337
341
  };
342
+ var removePackage = async (packageSpecifier, repoDir, logger) => {
343
+ const { name, version } = getNameAndVersion2(packageSpecifier);
344
+ if (!version) {
345
+ logger.warn(`Cannot remove ${packageSpecifier}: no version specified`);
346
+ return;
347
+ }
348
+ const aliasedName = `${name}_${version}`;
349
+ logger.info(`Removing package ${aliasedName} from repo...`);
350
+ try {
351
+ await new Promise((resolve, reject) => {
352
+ exec(`npm uninstall ${aliasedName}`, { cwd: repoDir }, (error) => {
353
+ if (error) {
354
+ reject(error);
355
+ } else {
356
+ resolve();
357
+ }
358
+ });
359
+ });
360
+ logger.success(`Successfully removed ${aliasedName}`);
361
+ } catch (error) {
362
+ logger.warn(`Failed to remove ${aliasedName}: ${error.message}`);
363
+ }
364
+ };
338
365
  var clean = async (options, logger) => {
339
366
  if (options.repoDir) {
340
367
  const doIt = await logger.confirm(
@@ -390,7 +417,10 @@ var list = async (options, logger) => {
390
417
  };
391
418
 
392
419
  // src/compile/compile.ts
393
- import compile, { preloadAdaptorExports } from "@openfn/compiler";
420
+ import compile, {
421
+ preloadAdaptorExports,
422
+ getExports
423
+ } from "@openfn/compiler";
394
424
  import { getModulePath } from "@openfn/runtime";
395
425
 
396
426
  // src/util/abort.ts
@@ -459,11 +489,13 @@ var compileJob = async (job, opts, log, jobName) => {
459
489
  }
460
490
  };
461
491
  var compileWorkflow = async (plan, opts, log) => {
492
+ let globalsIgnoreList = getExports(plan.workflow.globals);
462
493
  for (const step of plan.workflow.steps) {
463
494
  const job = step;
464
495
  const jobOpts = {
465
496
  ...opts,
466
- adaptors: job.adaptors ?? opts.adaptors
497
+ adaptors: job.adaptors ?? opts.adaptors,
498
+ ignoreImports: globalsIgnoreList
467
499
  };
468
500
  if (job.expression) {
469
501
  const { code, map } = await compileJob(
@@ -683,7 +715,7 @@ var expand_adaptors_default = (input) => {
683
715
  import { readFile as readFile2 } from "node:fs/promises";
684
716
  import path3 from "node:path";
685
717
  import assert from "node:assert";
686
- import { getNameAndVersion as getNameAndVersion2 } from "@openfn/runtime";
718
+ import { getNameAndVersion as getNameAndVersion3 } from "@openfn/runtime";
687
719
  var validateMonoRepo = async (repoPath, log) => {
688
720
  try {
689
721
  const raw = await readFile2(`${repoPath}/package.json`, "utf8");
@@ -698,7 +730,7 @@ var updatePath = (adaptor, repoPath, log) => {
698
730
  if (adaptor.match("=")) {
699
731
  return adaptor;
700
732
  }
701
- const { name, version } = getNameAndVersion2(adaptor);
733
+ const { name, version } = getNameAndVersion3(adaptor);
702
734
  if (version) {
703
735
  log.warn(
704
736
  `Warning: Ignoring version specifier on ${adaptor} as loading from the adaptors monorepo`
@@ -822,7 +854,8 @@ var loadExpression = async (options, logger) => {
822
854
  const plan = {
823
855
  workflow: {
824
856
  name,
825
- steps: [step]
857
+ steps: [step],
858
+ globals: options.globals
826
859
  },
827
860
  options: wfOptions
828
861
  };
@@ -854,7 +887,8 @@ var loadOldWorkflow = async (workflow, options, logger, defaultName = "") => {
854
887
  logger.warn(final);
855
888
  return final;
856
889
  };
857
- var fetchFile = async (jobId, rootDir = "", filePath, log) => {
890
+ var fetchFile = async (fileInfo, log) => {
891
+ const { rootDir = "", filePath, name } = fileInfo;
858
892
  try {
859
893
  const fullPath = filePath.startsWith("~") ? filePath : path4.resolve(rootDir, filePath);
860
894
  const result = await fs3.readFile(fullPath, "utf8");
@@ -863,7 +897,7 @@ var fetchFile = async (jobId, rootDir = "", filePath, log) => {
863
897
  } catch (e) {
864
898
  abort_default(
865
899
  log,
866
- `File not found for job ${jobId}: ${filePath}`,
900
+ `File not found for ${name}: ${filePath}`,
867
901
  void 0,
868
902
  `This workflow references a file which cannot be found at ${filePath}
869
903
 
@@ -872,6 +906,19 @@ Paths inside the workflow are relative to the workflow.json`
872
906
  return ".";
873
907
  }
874
908
  };
909
+ var importGlobals = async (plan, rootDir, log) => {
910
+ const fnStr = plan.workflow?.globals;
911
+ if (fnStr) {
912
+ if (isPath(fnStr)) {
913
+ plan.workflow.globals = await fetchFile(
914
+ { name: "globals", rootDir, filePath: fnStr },
915
+ log
916
+ );
917
+ } else {
918
+ plan.workflow.globals = fnStr;
919
+ }
920
+ }
921
+ };
875
922
  var importExpressions = async (plan, rootDir, log) => {
876
923
  let idx = 0;
877
924
  for (const step of plan.workflow.steps) {
@@ -885,26 +932,32 @@ var importExpressions = async (plan, rootDir, log) => {
885
932
  const stateStr = typeof job.state === "string" && job.state?.trim();
886
933
  if (expressionStr && isPath(expressionStr)) {
887
934
  job.expression = await fetchFile(
888
- job.id || `${idx}`,
889
- rootDir,
890
- expressionStr,
935
+ {
936
+ name: `job ${job.id || idx}`,
937
+ rootDir,
938
+ filePath: expressionStr
939
+ },
891
940
  log
892
941
  );
893
942
  }
894
943
  if (configurationStr && isPath(configurationStr)) {
895
944
  const configString = await fetchFile(
896
- job.id || `${idx}`,
897
- rootDir,
898
- configurationStr,
945
+ {
946
+ name: `job configuration ${job.id || idx}`,
947
+ rootDir,
948
+ filePath: configurationStr
949
+ },
899
950
  log
900
951
  );
901
952
  job.configuration = JSON.parse(configString);
902
953
  }
903
954
  if (stateStr && isPath(stateStr)) {
904
955
  const stateString = await fetchFile(
905
- job.id || `${idx}`,
906
- rootDir,
907
- stateStr,
956
+ {
957
+ name: `job state ${job.id || idx}`,
958
+ rootDir,
959
+ filePath: stateStr
960
+ },
908
961
  log
909
962
  );
910
963
  job.state = JSON.parse(stateString);
@@ -929,6 +982,9 @@ var loadXPlan = async (plan, options, logger, defaultName = "") => {
929
982
  plan.workflow.name = defaultName;
930
983
  }
931
984
  ensureAdaptors(plan);
985
+ if (options.globals)
986
+ plan.workflow.globals = options.globals;
987
+ await importGlobals(plan, options.baseDir, logger);
932
988
  await importExpressions(plan, options.baseDir, logger);
933
989
  if (options.expandAdaptors) {
934
990
  expand_adaptors_default(plan);
@@ -1620,7 +1676,7 @@ import { writeFile as writeFile5 } from "node:fs/promises";
1620
1676
  import { readFileSync, writeFileSync, mkdirSync, rmSync } from "node:fs";
1621
1677
  import path7 from "node:path";
1622
1678
  import { describePackage } from "@openfn/describe-package";
1623
- import { getNameAndVersion as getNameAndVersion3 } from "@openfn/runtime";
1679
+ import { getNameAndVersion as getNameAndVersion4 } from "@openfn/runtime";
1624
1680
  var RETRY_DURATION = 500;
1625
1681
  var RETRY_COUNT = 20;
1626
1682
  var TIMEOUT_MS = 1e3 * 60;
@@ -1672,7 +1728,7 @@ var waitForDocs = async (docs, path12, logger, retryDuration = RETRY_DURATION) =
1672
1728
  };
1673
1729
  var docgenHandler = (options, logger, docgen = actualDocGen, retryDuration = RETRY_DURATION) => {
1674
1730
  const { specifier, repoDir } = options;
1675
- const { version } = getNameAndVersion3(specifier);
1731
+ const { version } = getNameAndVersion4(specifier);
1676
1732
  if (!version) {
1677
1733
  logger.error("Error: No version number detected");
1678
1734
  logger.error("eg, @openfn/language-common@1.7.5");
@@ -1713,7 +1769,7 @@ var handler_default7 = docgenHandler;
1713
1769
  // src/docs/handler.ts
1714
1770
  import { readFile as readFile4 } from "node:fs/promises";
1715
1771
  import c from "chalk";
1716
- import { getNameAndVersion as getNameAndVersion4, getLatestVersion } from "@openfn/runtime";
1772
+ import { getNameAndVersion as getNameAndVersion5, getLatestVersion } from "@openfn/runtime";
1717
1773
  var describeFn = (adaptorName, fn) => [
1718
1774
  c.green(
1719
1775
  `## ${fn.name}(${fn.parameters.map(({ name }) => name).join(",")})`
@@ -1744,7 +1800,7 @@ var docsHandler = async (options, logger) => {
1744
1800
  const { adaptor, operation, repoDir } = options;
1745
1801
  const adaptors = expand_adaptors_default([adaptor]);
1746
1802
  const [adaptorName] = adaptors;
1747
- let { name, version } = getNameAndVersion4(adaptorName);
1803
+ let { name, version } = getNameAndVersion5(adaptorName);
1748
1804
  if (!version) {
1749
1805
  logger.info("No version number provided, looking for latest...");
1750
1806
  version = await getLatestVersion(name);
@@ -1798,11 +1854,28 @@ var docsHandler = async (options, logger) => {
1798
1854
  var handler_default8 = docsHandler;
1799
1855
 
1800
1856
  // src/metadata/cache.ts
1857
+ import { getNameAndVersion as getNameAndVersion6 } from "@openfn/runtime";
1801
1858
  import { createHash } from "node:crypto";
1802
- import { readFileSync as readFileSync2 } from "node:fs";
1859
+ import { mkdir as mkdir3, readFile as readFile5, writeFile as writeFile6, readdir, rm } from "node:fs/promises";
1803
1860
  import path8 from "node:path";
1804
- import { writeFile as writeFile6, mkdir as mkdir3 } from "node:fs/promises";
1805
- var getPath = (repoDir, key) => `${repoDir}/meta/${key}.json`;
1861
+ var UNSUPPORTED_FILE_NAME = "unsupported.json";
1862
+ var getCachePath2 = (repoDir, key) => {
1863
+ const base = path8.join(repoDir, "meta");
1864
+ if (key) {
1865
+ return path8.join(base, key.endsWith(".json") ? key : `${key}.json`);
1866
+ }
1867
+ return base;
1868
+ };
1869
+ var getCache = async (repoDir, key) => {
1870
+ try {
1871
+ const cachePath = getCachePath2(repoDir, key);
1872
+ const content = await readFile5(cachePath, "utf8");
1873
+ return JSON.parse(content);
1874
+ } catch (e) {
1875
+ return null;
1876
+ }
1877
+ };
1878
+ var getUnsupportedCache = (repoDir) => getCache(repoDir, UNSUPPORTED_FILE_NAME);
1806
1879
  var sortKeys = (obj) => {
1807
1880
  const newObj = {};
1808
1881
  Object.keys(obj).sort().forEach((k) => {
@@ -1817,24 +1890,83 @@ var sortKeys = (obj) => {
1817
1890
  };
1818
1891
  var generateKey = (config, adaptor) => {
1819
1892
  const sorted = sortKeys(config);
1820
- const key = `${JSON.stringify(sorted)}-${adaptor}}`;
1893
+ const key = `${JSON.stringify(sorted)}-${adaptor}`;
1821
1894
  return createHash("sha256").update(key).digest("hex");
1822
1895
  };
1823
- var get2 = (repoPath, key) => {
1896
+ var get2 = async (repoPath, key) => {
1897
+ const p = getCachePath2(repoPath, key);
1824
1898
  try {
1825
- const data = readFileSync2(getPath(repoPath, key), "utf8");
1826
- const json = JSON.parse(data);
1827
- return json;
1899
+ const result = await readFile5(p, "utf8");
1900
+ return JSON.parse(result);
1828
1901
  } catch (e) {
1829
1902
  return null;
1830
1903
  }
1831
1904
  };
1832
- var set2 = async (repoPath, key, data) => {
1833
- const fullPath = getPath(repoPath, key);
1834
- await mkdir3(path8.dirname(fullPath), { recursive: true });
1835
- await writeFile6(fullPath, JSON.stringify(data));
1905
+ var set2 = async (repoPath, key, result) => {
1906
+ const p = getCachePath2(repoPath, key);
1907
+ await mkdir3(path8.dirname(p), { recursive: true });
1908
+ await writeFile6(p, JSON.stringify(result));
1909
+ };
1910
+ var getUnsupportedCachePath = (repoDir) => {
1911
+ return getCachePath2(repoDir, UNSUPPORTED_FILE_NAME);
1912
+ };
1913
+ var parseVersion = (version) => {
1914
+ const parts = version.split(".").map(Number);
1915
+ return {
1916
+ major: parts[0] || 0,
1917
+ minor: parts[1] || 0,
1918
+ patch: parts[2] || 0,
1919
+ majorMinor: `${parts[0] || 0}.${parts[1] || 0}`
1920
+ };
1921
+ };
1922
+ var compareVersions = (version1, version2) => {
1923
+ const v1 = parseVersion(version1);
1924
+ const v2 = parseVersion(version2);
1925
+ if (v1.major !== v2.major)
1926
+ return v1.major - v2.major;
1927
+ if (v1.minor !== v2.minor)
1928
+ return v1.minor - v2.minor;
1929
+ return v1.patch - v2.patch;
1930
+ };
1931
+ var isAdaptorUnsupported = async (adaptorSpecifier, repoDir) => {
1932
+ const { name, version } = getNameAndVersion6(adaptorSpecifier);
1933
+ if (!version)
1934
+ return false;
1935
+ const cache = await getUnsupportedCache(repoDir);
1936
+ if (!cache || !cache[name]) {
1937
+ return false;
1938
+ }
1939
+ const cached = cache[name];
1940
+ const currentParsed = parseVersion(version);
1941
+ const cachedParsed = parseVersion(cached.lastCheckedVersion);
1942
+ if (currentParsed.major > cachedParsed.major || currentParsed.major === cachedParsed.major && currentParsed.minor > cachedParsed.minor) {
1943
+ return false;
1944
+ }
1945
+ return true;
1946
+ };
1947
+ var markAdaptorAsUnsupported = async (adaptorSpecifier, repoDir) => {
1948
+ const { name, version } = getNameAndVersion6(adaptorSpecifier);
1949
+ if (!version)
1950
+ return;
1951
+ const cachePath = getUnsupportedCachePath(repoDir);
1952
+ let cache = {};
1953
+ try {
1954
+ const cacheContent = await readFile5(cachePath, "utf8");
1955
+ cache = JSON.parse(cacheContent);
1956
+ } catch (error) {
1957
+ }
1958
+ const parsed = parseVersion(version);
1959
+ const existing = cache[name];
1960
+ if (!existing || compareVersions(version, existing.lastCheckedVersion) > 0) {
1961
+ cache[name] = {
1962
+ lastCheckedVersion: version,
1963
+ majorMinor: parsed.majorMinor,
1964
+ timestamp: Date.now()
1965
+ };
1966
+ await mkdir3(path8.dirname(cachePath), { recursive: true });
1967
+ await writeFile6(cachePath, JSON.stringify(cache, null, 2));
1968
+ }
1836
1969
  };
1837
- var cache_default = { get: get2, set: set2, generateKey, getPath, sortKeys };
1838
1970
 
1839
1971
  // src/metadata/handler.ts
1840
1972
  import { getModuleEntryPoint } from "@openfn/runtime";
@@ -1871,8 +2003,15 @@ var getAdaptorPath = async (adaptor, logger, repoDir) => {
1871
2003
  };
1872
2004
  var shouldAutoinstall = (adaptor) => adaptor?.length > 0 && !adaptor.startsWith("/") && !adaptor.includes("=");
1873
2005
  var metadataHandler = async (options, logger) => {
1874
- const { repoDir, adaptors } = options;
1875
- const adaptor = adaptors[0];
2006
+ const { repoDir, adaptors, keepUnsupported } = options;
2007
+ let adaptor = adaptors[0];
2008
+ if (await isAdaptorUnsupported(adaptor, repoDir)) {
2009
+ logger.info(
2010
+ `Adaptor ${adaptor} is known to not support metadata (cached) - skipping lookup`
2011
+ );
2012
+ logger.error("No metadata helper found");
2013
+ process.exit(1);
2014
+ }
1876
2015
  const state = await load_state_default({}, options, logger);
1877
2016
  logger.success(`Generating metadata`);
1878
2017
  logger.info("config:", state);
@@ -1883,31 +2022,58 @@ var metadataHandler = async (options, logger) => {
1883
2022
  }
1884
2023
  const finish2 = () => {
1885
2024
  logger.success("Done!");
1886
- logger.print(cache_default.getPath(repoDir, id));
2025
+ logger.print(getCachePath2(repoDir, id));
1887
2026
  };
1888
- const id = cache_default.generateKey(config, adaptor);
2027
+ const id = generateKey(config, adaptor);
1889
2028
  if (!options.force) {
1890
2029
  logger.debug("config hash: ", id);
1891
- const cached = await cache_default.get(repoDir, id);
2030
+ const cached = await get2(repoDir, id);
1892
2031
  if (cached) {
1893
2032
  logger.success("Returning metadata from cache");
1894
2033
  return finish2();
1895
2034
  }
1896
2035
  }
2036
+ let wasAutoInstalled = false;
1897
2037
  try {
1898
2038
  if (shouldAutoinstall(adaptor)) {
1899
- await install({ packages: [adaptor], repoDir }, logger);
2039
+ const autoinstallResult = await install(
2040
+ { packages: [adaptor], repoDir },
2041
+ logger
2042
+ );
2043
+ wasAutoInstalled = true;
2044
+ adaptor = autoinstallResult[0];
1900
2045
  }
1901
2046
  const adaptorPath = await getAdaptorPath(adaptor, logger, options.repoDir);
2047
+ if (!adaptorPath) {
2048
+ throw new Error(`Could not resolve adaptor path for ${adaptor}`);
2049
+ }
1902
2050
  const mod = await import(adaptorPath);
1903
- if (mod.metadata) {
2051
+ if (mod.metadata && typeof mod.metadata === "function") {
1904
2052
  logger.info("Metadata function found. Generating metadata...");
1905
2053
  const result = await mod.metadata(config);
1906
2054
  decorateMetadata(result);
1907
- await cache_default.set(repoDir, id, result);
2055
+ await set2(
2056
+ repoDir,
2057
+ id,
2058
+ result
2059
+ );
1908
2060
  finish2();
1909
2061
  } else {
1910
2062
  logger.error("No metadata helper found");
2063
+ if (wasAutoInstalled && !keepUnsupported) {
2064
+ logger.info("Removing unsupported adaptor from disk...");
2065
+ await removePackage(adaptor, repoDir, logger);
2066
+ await markAdaptorAsUnsupported(adaptor, repoDir);
2067
+ logger.info("Adaptor removed and marked as unsupported");
2068
+ } else if (wasAutoInstalled && keepUnsupported) {
2069
+ if (adaptor === "@openfn/language-openfn") {
2070
+ logger.log({ wasAutoInstalled, keepUnsupported });
2071
+ }
2072
+ logger.info(
2073
+ "Keeping unsupported adaptor as requested by --keep-unsupported flag"
2074
+ );
2075
+ await markAdaptorAsUnsupported(adaptor, repoDir);
2076
+ }
1911
2077
  process.exit(1);
1912
2078
  }
1913
2079
  } catch (e) {
@@ -2099,10 +2265,10 @@ function pickFirst2(...args) {
2099
2265
  var handler_default10 = pullHandler;
2100
2266
 
2101
2267
  // src/util/print-versions.ts
2102
- import { readFileSync as readFileSync3 } from "node:fs";
2268
+ import { readFileSync as readFileSync2 } from "node:fs";
2103
2269
  import path11 from "node:path";
2104
2270
  import url from "node:url";
2105
- import { getNameAndVersion as getNameAndVersion5 } from "@openfn/runtime";
2271
+ import { getNameAndVersion as getNameAndVersion7 } from "@openfn/runtime";
2106
2272
  import { mainSymbols } from "figures";
2107
2273
  var NODE = "node.js";
2108
2274
  var CLI2 = "cli";
@@ -2112,7 +2278,7 @@ var { triangleRightSmall: t } = mainSymbols;
2112
2278
  var loadVersionFromPath = (adaptorPath) => {
2113
2279
  try {
2114
2280
  const pkg = JSON.parse(
2115
- readFileSync3(path11.resolve(adaptorPath, "package.json"), "utf8")
2281
+ readFileSync2(path11.resolve(adaptorPath, "package.json"), "utf8")
2116
2282
  );
2117
2283
  return pkg.version;
2118
2284
  } catch (e) {
@@ -2129,12 +2295,12 @@ var printVersions = async (logger, options = {}, includeComponents = false) => {
2129
2295
  if (adaptor.match("=")) {
2130
2296
  const [namePart, pathPart] = adaptor.split("=");
2131
2297
  adaptorVersion = loadVersionFromPath(pathPart);
2132
- adaptorName = getNameAndVersion5(namePart).name;
2298
+ adaptorName = getNameAndVersion7(namePart).name;
2133
2299
  } else if (options.monorepoPath) {
2134
- adaptorName = getNameAndVersion5(adaptor).name;
2300
+ adaptorName = getNameAndVersion7(adaptor).name;
2135
2301
  adaptorVersion = "monorepo";
2136
2302
  } else {
2137
- const { name, version: version2 } = getNameAndVersion5(adaptor);
2303
+ const { name, version: version2 } = getNameAndVersion7(adaptor);
2138
2304
  adaptorName = name;
2139
2305
  adaptorVersion = version2 || "latest";
2140
2306
  }
@@ -2148,7 +2314,7 @@ var printVersions = async (logger, options = {}, includeComponents = false) => {
2148
2314
  );
2149
2315
  const prefix = (str) => ` ${t} ${str.padEnd(longest + 4, " ")}`;
2150
2316
  const dirname3 = path11.dirname(url.fileURLToPath(import.meta.url));
2151
- const pkg = JSON.parse(readFileSync3(`${dirname3}/../../package.json`, "utf8"));
2317
+ const pkg = JSON.parse(readFileSync2(`${dirname3}/../../package.json`, "utf8"));
2152
2318
  const { version, dependencies } = pkg;
2153
2319
  const compilerVersion = dependencies["@openfn/compiler"];
2154
2320
  const runtimeVersion = dependencies["@openfn/runtime"];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@openfn/cli",
3
- "version": "1.12.1",
4
- "description": "CLI devtools for the openfn toolchain.",
3
+ "version": "1.13.1",
4
+ "description": "CLI devtools for the OpenFn toolchain",
5
5
  "engines": {
6
6
  "node": ">=18",
7
7
  "pnpm": ">=7"
@@ -48,12 +48,12 @@
48
48
  "ws": "^8.18.0",
49
49
  "yargs": "^17.7.2",
50
50
  "@openfn/deploy": "0.11.2",
51
- "@openfn/compiler": "1.0.4",
51
+ "@openfn/compiler": "1.1.0",
52
52
  "@openfn/lexicon": "^1.2.2",
53
- "@openfn/logger": "1.0.5",
53
+ "@openfn/describe-package": "0.1.4",
54
54
  "@openfn/project": "^0.1.0",
55
- "@openfn/runtime": "1.6.4",
56
- "@openfn/describe-package": "0.1.4"
55
+ "@openfn/logger": "1.0.5",
56
+ "@openfn/runtime": "1.7.1"
57
57
  },
58
58
  "files": [
59
59
  "dist",