@intlpullhq/cli 0.1.9 → 0.1.11

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
@@ -193,6 +193,9 @@ npx @intlpullhq/cli download --format json --output ./messages
193
193
  # Download specific languages
194
194
  npx @intlpullhq/cli download --languages en,es,fr
195
195
 
196
+ # Download specific namespaces
197
+ npx @intlpullhq/cli download --namespace common,auth
198
+
196
199
  # Quiet mode for CI
197
200
  npx @intlpullhq/cli download --quiet
198
201
 
@@ -207,6 +210,7 @@ npx @intlpullhq/cli pull
207
210
  | `--format <format>` | Output format: `json`, `yaml`, `ts` (default: `json`) |
208
211
  | `--output <dir>` | Output directory (auto-detected from framework) |
209
212
  | `--languages <langs>` | Languages to download (comma-separated) |
213
+ | `--namespace <namespaces>` | Namespaces to download (comma-separated, defaults to all) |
210
214
  | `--branch <branch>` | Translation branch to download from |
211
215
  | `--platform <platform>` | Platform variant: `default`, `ios`, `android`, `web` |
212
216
  | `--no-parallel` | Disable parallel fetching |
@@ -12,19 +12,19 @@ import {
12
12
  WebhooksApi,
13
13
  WorkflowsApi,
14
14
  createApiClient
15
- } from "./chunk-WVCVQFBI.js";
15
+ } from "./chunk-QOUDOZX4.js";
16
16
  import {
17
17
  ProjectsApi
18
- } from "./chunk-KCZQUMQP.js";
18
+ } from "./chunk-RQI7KQQ5.js";
19
19
  import {
20
20
  TranslationsApi
21
- } from "./chunk-WSY27J6N.js";
21
+ } from "./chunk-OMGFIATE.js";
22
22
  import {
23
23
  KeysApi
24
- } from "./chunk-BULIQM4U.js";
24
+ } from "./chunk-DSTFGTTF.js";
25
25
  import {
26
26
  BaseApiClient
27
- } from "./chunk-KIDP7N6D.js";
27
+ } from "./chunk-ZYZSONV6.js";
28
28
  import "./chunk-IWYURZV2.js";
29
29
  export {
30
30
  ApiClient,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseApiClient
3
- } from "./chunk-KIDP7N6D.js";
3
+ } from "./chunk-ZYZSONV6.js";
4
4
 
5
5
  // src/lib/api/keys.ts
6
6
  var KeysApi = class extends BaseApiClient {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseApiClient
3
- } from "./chunk-KIDP7N6D.js";
3
+ } from "./chunk-ZYZSONV6.js";
4
4
  import {
5
5
  getProjectConfig
6
6
  } from "./chunk-IWYURZV2.js";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  ProjectsApi
3
- } from "./chunk-KCZQUMQP.js";
3
+ } from "./chunk-RQI7KQQ5.js";
4
4
  import {
5
5
  TranslationsApi
6
- } from "./chunk-WSY27J6N.js";
6
+ } from "./chunk-OMGFIATE.js";
7
7
  import {
8
8
  KeysApi
9
- } from "./chunk-BULIQM4U.js";
9
+ } from "./chunk-DSTFGTTF.js";
10
10
  import {
11
11
  BaseApiClient
12
- } from "./chunk-KIDP7N6D.js";
12
+ } from "./chunk-ZYZSONV6.js";
13
13
  import {
14
14
  getAuthErrorMessage
15
15
  } from "./chunk-IWYURZV2.js";
@@ -21,7 +21,8 @@ var ImportExportApi = class extends BaseApiClient {
21
21
  const params = new URLSearchParams();
22
22
  params.set("format", options.format);
23
23
  if (options.languages?.length) {
24
- params.set("languages", options.languages.join(","));
24
+ const normalizedLanguages = options.languages.map((lang) => lang.trim());
25
+ params.set("languages", normalizedLanguages.join(","));
25
26
  }
26
27
  if (options.namespaces?.length) {
27
28
  params.set("namespaces", options.namespaces.join(","));
@@ -493,7 +494,7 @@ var SnapshotsApi = class extends BaseApiClient {
493
494
  */
494
495
  async createSnapshot(projectId, data) {
495
496
  const response = await this.request(
496
- `/projects/${projectId}/snapshots`,
497
+ `/api/v1/projects/${projectId}/snapshots`,
497
498
  {
498
499
  method: "POST",
499
500
  body: JSON.stringify(data)
@@ -506,18 +507,18 @@ var SnapshotsApi = class extends BaseApiClient {
506
507
  */
507
508
  async listSnapshots(projectId) {
508
509
  const response = await this.request(
509
- `/projects/${projectId}/snapshots`,
510
+ `/api/v1/projects/${projectId}/snapshots`,
510
511
  {
511
512
  method: "GET"
512
513
  }
513
514
  );
514
- return response.snapshots;
515
+ return response?.snapshots ?? [];
515
516
  }
516
517
  /**
517
518
  * Get snapshot details
518
519
  */
519
520
  async getSnapshot(projectId, snapshotId) {
520
- return this.request(`/projects/${projectId}/snapshots/${snapshotId}`, {
521
+ return this.request(`/api/v1/projects/${projectId}/snapshots/${snapshotId}`, {
521
522
  method: "GET"
522
523
  });
523
524
  }
@@ -526,7 +527,7 @@ var SnapshotsApi = class extends BaseApiClient {
526
527
  */
527
528
  async restoreSnapshot(projectId, snapshotId) {
528
529
  return this.request(
529
- `/projects/${projectId}/snapshots/${snapshotId}/restore`,
530
+ `/api/v1/projects/${projectId}/snapshots/${snapshotId}/restore`,
530
531
  {
531
532
  method: "POST"
532
533
  }
@@ -536,7 +537,7 @@ var SnapshotsApi = class extends BaseApiClient {
536
537
  * Delete a snapshot
537
538
  */
538
539
  async deleteSnapshot(projectId, snapshotId) {
539
- await this.request(`/projects/${projectId}/snapshots/${snapshotId}`, {
540
+ await this.request(`/api/v1/projects/${projectId}/snapshots/${snapshotId}`, {
540
541
  method: "DELETE"
541
542
  });
542
543
  }
@@ -595,8 +596,8 @@ var TMApi = class extends BaseApiClient {
595
596
  * This fetches keys without translations and applies TM matches
596
597
  */
597
598
  async applyTMMatches(projectId, data) {
598
- const { KeysApi: KeysApi2 } = await import("./keys-P3F5IKS2.js");
599
- const { TranslationsApi: TranslationsApi2 } = await import("./translations-7GWEFVRG.js");
599
+ const { KeysApi: KeysApi2 } = await import("./keys-WDJKXFH3.js");
600
+ const { TranslationsApi: TranslationsApi2 } = await import("./translations-45NWLMJR.js");
600
601
  const keysApi = new KeysApi2();
601
602
  const translationsApi = new TranslationsApi2();
602
603
  const { keys } = await keysApi.listKeys(projectId, {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseApiClient
3
- } from "./chunk-KIDP7N6D.js";
3
+ } from "./chunk-ZYZSONV6.js";
4
4
 
5
5
  // src/lib/api/projects.ts
6
6
  var ProjectsApi = class extends BaseApiClient {
@@ -130,6 +130,9 @@ var BaseApiClient = class {
130
130
  const contentType = response.headers.get("content-type") || "";
131
131
  if (contentType.includes("application/json")) {
132
132
  const jsonData = await response.json();
133
+ if (jsonData.error && typeof jsonData.error === "string") {
134
+ throw new Error(jsonData.error);
135
+ }
133
136
  if (jsonData.url && typeof jsonData.url === "string") {
134
137
  const fileResponse = await fetch(jsonData.url);
135
138
  if (!fileResponse.ok) {
@@ -137,6 +140,9 @@ var BaseApiClient = class {
137
140
  }
138
141
  return fileResponse.blob();
139
142
  }
143
+ if (typeof jsonData === "object" && Object.keys(jsonData).length === 0) {
144
+ throw new Error("no translations found for the requested languages");
145
+ }
140
146
  const jsonString = JSON.stringify(jsonData, null, 2);
141
147
  return new Blob([jsonString], { type: "application/json" });
142
148
  }
package/dist/index.js CHANGED
@@ -5,15 +5,15 @@ import {
5
5
  TMApi,
6
6
  WebhooksApi,
7
7
  createApiClient
8
- } from "./chunk-WVCVQFBI.js";
8
+ } from "./chunk-QOUDOZX4.js";
9
9
  import {
10
10
  ProjectsApi
11
- } from "./chunk-KCZQUMQP.js";
12
- import "./chunk-WSY27J6N.js";
11
+ } from "./chunk-RQI7KQQ5.js";
12
+ import "./chunk-OMGFIATE.js";
13
13
  import {
14
14
  KeysApi
15
- } from "./chunk-BULIQM4U.js";
16
- import "./chunk-KIDP7N6D.js";
15
+ } from "./chunk-DSTFGTTF.js";
16
+ import "./chunk-ZYZSONV6.js";
17
17
  import {
18
18
  detectFramework,
19
19
  getAuthErrorMessage,
@@ -1296,7 +1296,14 @@ async function fetchTranslationsParallel(projectId, apiUrl, apiKey, options) {
1296
1296
  const availableLanguages = projectData.languages?.map((l) => l.code) || ["en"];
1297
1297
  const targetLanguages = options?.languages?.length ? options.languages : availableLanguages;
1298
1298
  const namespacesResult = await fetchNamespaces(projectId, apiUrl, apiKey);
1299
- const namespaces = namespacesResult.namespaces;
1299
+ let namespaces = namespacesResult.namespaces;
1300
+ if (options?.namespaces?.length) {
1301
+ const requestedNamespaces = new Set(options.namespaces);
1302
+ namespaces = namespaces.filter((ns) => requestedNamespaces.has(ns));
1303
+ const missingNamespaces = options.namespaces.filter((ns) => !namespacesResult.namespaces.includes(ns));
1304
+ if (missingNamespaces.length > 0) {
1305
+ }
1306
+ }
1300
1307
  const taskParams = [];
1301
1308
  for (const lang of targetLanguages) {
1302
1309
  for (const ns of namespaces) {
@@ -2599,6 +2606,7 @@ Or use a project-scoped API key for automatic selection.`
2599
2606
  let version;
2600
2607
  let namespaceCount = 0;
2601
2608
  let namespaces = [];
2609
+ const targetNamespaces = options.namespaces ? options.namespaces.split(",").map((n) => n.trim()).filter(Boolean) : void 0;
2602
2610
  if (useParallel) {
2603
2611
  const result = await fetchTranslationsParallel(
2604
2612
  projectId,
@@ -2608,6 +2616,7 @@ Or use a project-scoped API key for automatic selection.`
2608
2616
  languages: targetLanguages,
2609
2617
  platform,
2610
2618
  branch,
2619
+ namespaces: targetNamespaces,
2611
2620
  onProgress: (completed, total) => {
2612
2621
  setState((s) => ({
2613
2622
  ...s,
@@ -4807,8 +4816,8 @@ function ExportComponent({ options }) {
4807
4816
  json: "json",
4808
4817
  yaml: "yaml",
4809
4818
  ts: "ts",
4810
- android: "zip",
4811
- ios: "zip",
4819
+ android: "xml",
4820
+ ios: "strings",
4812
4821
  xliff: "xliff",
4813
4822
  po: "po",
4814
4823
  arb: "arb",
@@ -9259,6 +9268,22 @@ async function fetchProjects7(apiUrl, apiKey) {
9259
9268
  return data.projects || [];
9260
9269
  }
9261
9270
  var isInteractiveTerminal7 = process.stdin.isTTY && process.stdout.isTTY;
9271
+ var NON_LANGUAGE_FIELDS = /* @__PURE__ */ new Set(["url", "filename", "expires_at", "size", "download_url", "content_type", "error", "message"]);
9272
+ function isTranslationData(value) {
9273
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
9274
+ return false;
9275
+ }
9276
+ const entries = Object.entries(value);
9277
+ if (entries.length === 0) return false;
9278
+ const validCount = entries.filter(([, v]) => typeof v === "string" || typeof v === "object" && v !== null).length;
9279
+ return validCount >= entries.length * 0.5;
9280
+ }
9281
+ function isValidLanguageCode(key) {
9282
+ if (NON_LANGUAGE_FIELDS.has(key)) {
9283
+ return false;
9284
+ }
9285
+ return /^[a-z]{2,3}(-[A-Z]{2,3}|-[A-Za-z]{4})?$/i.test(key);
9286
+ }
9262
9287
  async function fetchTranslationsFromExport(projectId, apiUrl, apiKey, options) {
9263
9288
  const params = new URLSearchParams();
9264
9289
  params.set("format", "json");
@@ -9286,9 +9311,16 @@ async function fetchTranslationsFromExport(projectId, apiUrl, apiKey, options) {
9286
9311
  data = { [lang]: data };
9287
9312
  }
9288
9313
  }
9289
- const languages = Object.keys(data);
9290
- const keyCount = languages.length > 0 && data[languages[0]] ? Object.keys(data[languages[0]]).length : 0;
9291
- return { bundle: data, languages, keyCount };
9314
+ const filteredData = {};
9315
+ for (const key of Object.keys(data)) {
9316
+ const value = data[key];
9317
+ if (isValidLanguageCode(key) && isTranslationData(value)) {
9318
+ filteredData[key] = value;
9319
+ }
9320
+ }
9321
+ const languages = Object.keys(filteredData);
9322
+ const keyCount = languages.length > 0 && filteredData[languages[0]] ? Object.keys(filteredData[languages[0]]).length : 0;
9323
+ return { bundle: filteredData, languages, keyCount };
9292
9324
  }
9293
9325
  async function fetchNamespaces2(projectId, apiUrl, apiKey) {
9294
9326
  const response = await fetch(`${apiUrl}/api/v1/projects/${projectId}/namespaces`, {
@@ -11707,7 +11739,7 @@ var KeysCreate = ({ keyName, options }) => {
11707
11739
  }
11708
11740
  const api = new KeysApi();
11709
11741
  const tags = options.tags ? options.tags.split(",").map((t) => t.trim()) : void 0;
11710
- const { ProjectsApi: ProjectsApi2 } = await import("./projects-AMQMORAR.js");
11742
+ const { ProjectsApi: ProjectsApi2 } = await import("./projects-C6BDSZVS.js");
11711
11743
  const projectsApi = new ProjectsApi2();
11712
11744
  const project = await projectsApi.getProject(projectId);
11713
11745
  const created = await api.createKey(projectId, {
@@ -12610,37 +12642,40 @@ var TMStatsComponent = ({ options }) => {
12610
12642
  if (!stats) {
12611
12643
  return /* @__PURE__ */ jsx50(Text47, { children: "No statistics available" });
12612
12644
  }
12645
+ const totalEntries = stats.total_entries ?? 0;
12646
+ const avgQuality = stats.avg_quality ?? 0;
12647
+ const languagePairs = stats.language_pairs ?? [];
12613
12648
  return /* @__PURE__ */ jsxs47(Box44, { flexDirection: "column", children: [
12614
12649
  /* @__PURE__ */ jsx50(Text47, { bold: true, children: "Translation Memory Statistics" }),
12615
12650
  /* @__PURE__ */ jsx50(Newline6, {}),
12616
12651
  /* @__PURE__ */ jsxs47(Text47, { children: [
12617
12652
  /* @__PURE__ */ jsx50(Text47, { bold: true, children: "Total Entries:" }),
12618
12653
  " ",
12619
- stats.total_entries.toLocaleString()
12654
+ totalEntries.toLocaleString()
12620
12655
  ] }),
12621
12656
  /* @__PURE__ */ jsxs47(Text47, { children: [
12622
12657
  /* @__PURE__ */ jsx50(Text47, { bold: true, children: "Average Quality:" }),
12623
12658
  " ",
12624
- stats.avg_quality.toFixed(1),
12659
+ avgQuality.toFixed(1),
12625
12660
  "%"
12626
12661
  ] }),
12627
12662
  /* @__PURE__ */ jsx50(Newline6, {}),
12628
- stats.language_pairs.length > 0 && /* @__PURE__ */ jsxs47(Fragment8, { children: [
12663
+ languagePairs.length > 0 && /* @__PURE__ */ jsxs47(Fragment8, { children: [
12629
12664
  /* @__PURE__ */ jsx50(Text47, { bold: true, children: "Language Pairs:" }),
12630
12665
  /* @__PURE__ */ jsx50(Newline6, {}),
12631
- /* @__PURE__ */ jsx50(Box44, { flexDirection: "column", children: stats.language_pairs.map((pair, idx) => /* @__PURE__ */ jsxs47(Text47, { children: [
12666
+ /* @__PURE__ */ jsx50(Box44, { flexDirection: "column", children: languagePairs.map((pair, idx) => /* @__PURE__ */ jsxs47(Text47, { children: [
12632
12667
  /* @__PURE__ */ jsxs47(Text47, { color: "cyan", children: [
12633
12668
  pair.source,
12634
12669
  " \u2192 ",
12635
12670
  pair.target
12636
12671
  ] }),
12637
12672
  ": ",
12638
- pair.count.toLocaleString(),
12673
+ (pair.count ?? 0).toLocaleString(),
12639
12674
  " ",
12640
12675
  pair.count === 1 ? "entry" : "entries"
12641
12676
  ] }, idx)) })
12642
12677
  ] }),
12643
- stats.language_pairs.length === 0 && /* @__PURE__ */ jsx50(Text47, { dimColor: true, children: "No language pairs found. Add entries with `intlpull tm add`" })
12678
+ languagePairs.length === 0 && /* @__PURE__ */ jsx50(Text47, { dimColor: true, children: "No language pairs found. Add entries with `intlpull tm add`" })
12644
12679
  ] });
12645
12680
  };
12646
12681
  function runTMStats(options) {
@@ -13047,7 +13082,12 @@ var SnapshotsList = ({ options }) => {
13047
13082
  const result = await api.listSnapshots(projectId);
13048
13083
  setSnapshots(result);
13049
13084
  } catch (err) {
13050
- setError(err instanceof Error ? err.message : "Failed to list snapshots");
13085
+ const errorMessage = err instanceof Error ? err.message : "Failed to list snapshots";
13086
+ if (errorMessage.includes("404")) {
13087
+ setError("Snapshots feature is not available for this project. This feature may require a plan upgrade or is not yet enabled.");
13088
+ } else {
13089
+ setError(errorMessage);
13090
+ }
13051
13091
  } finally {
13052
13092
  setIsLoading(false);
13053
13093
  }
@@ -13412,7 +13452,7 @@ var WebhooksList = ({ options }) => {
13412
13452
  }
13413
13453
  const api = new WebhooksApi();
13414
13454
  const result = await api.listWebhooks(projectId);
13415
- setWebhooks(result.webhooks);
13455
+ setWebhooks(result?.webhooks ?? []);
13416
13456
  } catch (err) {
13417
13457
  setError(err instanceof Error ? err.message : "Failed to fetch webhooks");
13418
13458
  } finally {
@@ -13870,10 +13910,16 @@ var ContributorsList = ({ options }) => {
13870
13910
  console.log(JSON.stringify(members, null, 2));
13871
13911
  return null;
13872
13912
  }
13913
+ const formatJoinedDate = (dateString) => {
13914
+ if (!dateString) return "Unknown";
13915
+ const date = new Date(dateString);
13916
+ if (isNaN(date.getTime())) return "Unknown";
13917
+ return date.toLocaleDateString();
13918
+ };
13873
13919
  const data = members.map((member) => {
13874
13920
  const emailDisplay = member.email.length > 25 ? member.email.substring(0, 22) + "..." : member.email;
13875
13921
  const languagesDisplay = member.languages && member.languages.length > 0 ? member.languages.length > 3 ? member.languages.slice(0, 3).join(",") + ` +${member.languages.length - 3}` : member.languages.join(",") : "All";
13876
- const joinedDate = new Date(member.joined_at).toLocaleDateString();
13922
+ const joinedDate = formatJoinedDate(member.joined_at);
13877
13923
  return {
13878
13924
  Email: emailDisplay,
13879
13925
  Name: member.name || "-",
@@ -14240,7 +14286,7 @@ contributorsCommand.command("remove <userId>").description("Remove a team member
14240
14286
 
14241
14287
  // src/index.tsx
14242
14288
  var program = new Command7();
14243
- program.name("intlpull").description("Intelligent i18n CLI for modern apps").version("0.1.5").option("--env-file <path>", "Path to custom env file (e.g., .env.production)").hook("preAction", (thisCommand) => {
14289
+ program.name("intlpull").description("Intelligent i18n CLI for modern apps").version("0.1.11").option("--env-file <path>", "Path to custom env file (e.g., .env.production)").hook("preAction", (thisCommand) => {
14244
14290
  const envFile = thisCommand.opts().envFile;
14245
14291
  if (envFile) {
14246
14292
  setCustomEnvFile(envFile);
@@ -14272,7 +14318,7 @@ program.command("logout").description("Clear stored credentials").action(async (
14272
14318
  });
14273
14319
  program.command("whoami").description("Show current authenticated user").action(async () => {
14274
14320
  const { getResolvedApiKey: getResolvedApiKey2, getAuthErrorMessage: getAuthErrorMessage2 } = await import("./config-F3O3XWYX.js");
14275
- const { createApiClient: createApiClient2 } = await import("./api-77ZWU4IB.js");
14321
+ const { createApiClient: createApiClient2 } = await import("./api-BTTALAAQ.js");
14276
14322
  const resolved = getResolvedApiKey2();
14277
14323
  if (!resolved) {
14278
14324
  console.log(getAuthErrorMessage2());
@@ -14318,7 +14364,7 @@ program.command("upload").description("Upload translation keys to IntlPull (auto
14318
14364
  tmDryRun: options.tmDryRun
14319
14365
  });
14320
14366
  });
14321
- program.command("download").description("Download translations from IntlPull (auto-detects project, framework, and languages)").option("--project <id>", "Project ID (auto-detected with project-scoped API key)").option("--format <format>", "Output format (json|yaml|ts)", "json").option("--output <dir>", "Output directory (auto-detected from framework)").option("--languages <langs>", "Languages to download (comma-separated, defaults to all)").option("--branch <branch>", "Translation branch to download from").option("--platform <platform>", "Platform variant (default|ios|android|web)").option("--no-parallel", "Disable parallel fetching (use single request)").option("-i, --interactive", "Run in interactive mode with prompts").option("-q, --quiet", "Suppress output except errors").option("--clean-orphans [mode]", 'Remove orphaned files (files not in remote). Use "dry-run" to preview').option("-f, --force", "Skip confirmation prompts for destructive operations").option("--translation-key-prefix <prefix>", 'Strip this prefix from keys (e.g., "checkout" makes "checkout.submit" \u2192 "submit")').option("--filter-by-prefix <prefix>", "Only download keys starting with this prefix").action((options) => {
14367
+ program.command("download").description("Download translations from IntlPull (auto-detects project, framework, and languages)").option("--project <id>", "Project ID (auto-detected with project-scoped API key)").option("--format <format>", "Output format (json|yaml|ts)", "json").option("--output <dir>", "Output directory (auto-detected from framework)").option("--languages <langs>", "Languages to download (comma-separated, defaults to all)").option("--namespace <namespaces>", "Namespaces to download (comma-separated, defaults to all)").option("--branch <branch>", "Translation branch to download from").option("--platform <platform>", "Platform variant (default|ios|android|web)").option("--no-parallel", "Disable parallel fetching (use single request)").option("-i, --interactive", "Run in interactive mode with prompts").option("-q, --quiet", "Suppress output except errors").option("--clean-orphans [mode]", 'Remove orphaned files (files not in remote). Use "dry-run" to preview').option("-f, --force", "Skip confirmation prompts for destructive operations").option("--translation-key-prefix <prefix>", 'Strip this prefix from keys (e.g., "checkout" makes "checkout.submit" \u2192 "submit")').option("--filter-by-prefix <prefix>", "Only download keys starting with this prefix").action((options) => {
14322
14368
  let cleanOrphans;
14323
14369
  if (options.cleanOrphans === true || options.cleanOrphans === "") {
14324
14370
  cleanOrphans = true;
@@ -14330,6 +14376,7 @@ program.command("download").description("Download translations from IntlPull (au
14330
14376
  format: options.format,
14331
14377
  output: options.output,
14332
14378
  languages: options.languages,
14379
+ namespaces: options.namespace,
14333
14380
  branch: options.branch,
14334
14381
  platform: options.platform,
14335
14382
  parallel: options.parallel,
@@ -14464,7 +14511,7 @@ projects.command("list").description("List all projects").action(async () => {
14464
14511
  console.log("Not authenticated. Run `npx @intlpullhq/cli login` first.");
14465
14512
  return;
14466
14513
  }
14467
- const { createApiClient: createApiClient2 } = await import("./api-77ZWU4IB.js");
14514
+ const { createApiClient: createApiClient2 } = await import("./api-BTTALAAQ.js");
14468
14515
  try {
14469
14516
  const api = createApiClient2();
14470
14517
  const { projects: projects2 } = await api.listProjects();
@@ -14490,7 +14537,7 @@ projects.command("create <name>").description("Create a new project").option("--
14490
14537
  console.log("Not authenticated. Run `npx @intlpullhq/cli login` first.");
14491
14538
  return;
14492
14539
  }
14493
- const { createApiClient: createApiClient2 } = await import("./api-77ZWU4IB.js");
14540
+ const { createApiClient: createApiClient2 } = await import("./api-BTTALAAQ.js");
14494
14541
  try {
14495
14542
  const api = createApiClient2();
14496
14543
  const languages = options.languages.split(",").map((l) => l.trim());
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  KeysApi
3
- } from "./chunk-BULIQM4U.js";
4
- import "./chunk-KIDP7N6D.js";
3
+ } from "./chunk-DSTFGTTF.js";
4
+ import "./chunk-ZYZSONV6.js";
5
5
  import "./chunk-IWYURZV2.js";
6
6
  export {
7
7
  KeysApi
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ProjectsApi
3
- } from "./chunk-KCZQUMQP.js";
4
- import "./chunk-KIDP7N6D.js";
3
+ } from "./chunk-RQI7KQQ5.js";
4
+ import "./chunk-ZYZSONV6.js";
5
5
  import "./chunk-IWYURZV2.js";
6
6
  export {
7
7
  ProjectsApi
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TranslationsApi
3
- } from "./chunk-WSY27J6N.js";
4
- import "./chunk-KIDP7N6D.js";
3
+ } from "./chunk-OMGFIATE.js";
4
+ import "./chunk-ZYZSONV6.js";
5
5
  import "./chunk-IWYURZV2.js";
6
6
  export {
7
7
  TranslationsApi
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intlpullhq/cli",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "The official CLI for IntlPull - intelligent i18n for modern apps. Manage translations, sync with cloud, and automate localization workflows.",
5
5
  "type": "module",
6
6
  "bin": {