primitive-admin 1.0.49 → 1.0.50

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 (120) hide show
  1. package/README.md +102 -2
  2. package/assets/skill/skills/primitive-platform/SKILL.md +85 -30
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +66 -1
  5. package/dist/bin/primitive.js.map +1 -1
  6. package/dist/src/commands/admins.d.ts +2 -0
  7. package/dist/src/commands/analytics.d.ts +2 -0
  8. package/dist/src/commands/apps.d.ts +2 -0
  9. package/dist/src/commands/apps.js +20 -0
  10. package/dist/src/commands/apps.js.map +1 -1
  11. package/dist/src/commands/auth.d.ts +2 -0
  12. package/dist/src/commands/blob-buckets.d.ts +2 -0
  13. package/dist/src/commands/catalog.d.ts +2 -0
  14. package/dist/src/commands/collection-type-configs.d.ts +2 -0
  15. package/dist/src/commands/collections.d.ts +2 -0
  16. package/dist/src/commands/comparisons.d.ts +2 -0
  17. package/dist/src/commands/cron-triggers.d.ts +2 -0
  18. package/dist/src/commands/cron-triggers.js +8 -15
  19. package/dist/src/commands/cron-triggers.js.map +1 -1
  20. package/dist/src/commands/database-types.d.ts +2 -0
  21. package/dist/src/commands/databases.d.ts +2 -0
  22. package/dist/src/commands/databases.js +31 -0
  23. package/dist/src/commands/databases.js.map +1 -1
  24. package/dist/src/commands/documents.d.ts +2 -0
  25. package/dist/src/commands/email-templates.d.ts +2 -0
  26. package/dist/src/commands/env.d.ts +12 -0
  27. package/dist/src/commands/group-type-configs.d.ts +2 -0
  28. package/dist/src/commands/groups.d.ts +2 -0
  29. package/dist/src/commands/guides.d.ts +84 -0
  30. package/dist/src/commands/guides.js +201 -24
  31. package/dist/src/commands/guides.js.map +1 -1
  32. package/dist/src/commands/init.d.ts +17 -0
  33. package/dist/src/commands/init.js +63 -25
  34. package/dist/src/commands/init.js.map +1 -1
  35. package/dist/src/commands/integrations.d.ts +2 -0
  36. package/dist/src/commands/integrations.js +22 -5
  37. package/dist/src/commands/integrations.js.map +1 -1
  38. package/dist/src/commands/llm.d.ts +2 -0
  39. package/dist/src/commands/prompts.d.ts +2 -0
  40. package/dist/src/commands/rule-sets.d.ts +2 -0
  41. package/dist/src/commands/secrets.d.ts +2 -0
  42. package/dist/src/commands/skill.d.ts +2 -0
  43. package/dist/src/commands/sync.d.ts +113 -0
  44. package/dist/src/commands/sync.js +366 -12
  45. package/dist/src/commands/sync.js.map +1 -1
  46. package/dist/src/commands/tokens.d.ts +2 -0
  47. package/dist/src/commands/tokens.js +104 -1
  48. package/dist/src/commands/tokens.js.map +1 -1
  49. package/dist/src/commands/users.d.ts +2 -0
  50. package/dist/src/commands/waitlist.d.ts +2 -0
  51. package/dist/src/commands/waitlist.js +1 -1
  52. package/dist/src/commands/waitlist.js.map +1 -1
  53. package/dist/src/commands/webhooks.d.ts +2 -0
  54. package/dist/src/commands/workflows.d.ts +49 -0
  55. package/dist/src/commands/workflows.js +74 -21
  56. package/dist/src/commands/workflows.js.map +1 -1
  57. package/dist/src/lib/api-client.d.ts +1244 -0
  58. package/dist/src/lib/api-client.js +30 -0
  59. package/dist/src/lib/api-client.js.map +1 -1
  60. package/dist/src/lib/auth-flow.d.ts +8 -0
  61. package/dist/src/lib/cli-manifest.d.ts +60 -0
  62. package/dist/src/lib/cli-manifest.js +70 -0
  63. package/dist/src/lib/cli-manifest.js.map +1 -0
  64. package/dist/src/lib/config.d.ts +37 -0
  65. package/dist/src/lib/confirm-prompt.d.ts +66 -0
  66. package/dist/src/lib/confirm-prompt.js +85 -0
  67. package/dist/src/lib/confirm-prompt.js.map +1 -0
  68. package/dist/src/lib/constants.d.ts +2 -0
  69. package/dist/src/lib/crash-handlers.d.ts +20 -0
  70. package/dist/src/lib/crash-handlers.js +49 -0
  71. package/dist/src/lib/crash-handlers.js.map +1 -0
  72. package/dist/src/lib/credentials-store.d.ts +79 -0
  73. package/dist/src/lib/csv.d.ts +48 -0
  74. package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
  75. package/dist/src/lib/db-codegen/dbGenerator.d.ts +111 -0
  76. package/dist/src/lib/db-codegen/dbNaming.d.ts +45 -0
  77. package/dist/src/lib/db-codegen/dbTemplates.d.ts +97 -0
  78. package/dist/src/lib/db-codegen/dbTemplates.js +31 -10
  79. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -1
  80. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +78 -0
  81. package/dist/src/lib/db-codegen/dbTsTypes.js +2 -2
  82. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -1
  83. package/dist/src/lib/env-resolver.d.ts +62 -0
  84. package/dist/src/lib/fetch.d.ts +5 -0
  85. package/dist/src/lib/init-config.d.ts +46 -0
  86. package/dist/src/lib/init-config.js +7 -0
  87. package/dist/src/lib/init-config.js.map +1 -1
  88. package/dist/src/lib/migration-nag.d.ts +49 -0
  89. package/dist/src/lib/output.d.ts +49 -0
  90. package/dist/src/lib/output.js +25 -1
  91. package/dist/src/lib/output.js.map +1 -1
  92. package/dist/src/lib/paginate.d.ts +33 -0
  93. package/dist/src/lib/project-config.d.ts +97 -0
  94. package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
  95. package/dist/src/lib/resolve-platform.d.ts +45 -0
  96. package/dist/src/lib/resolve-platform.js +43 -0
  97. package/dist/src/lib/resolve-platform.js.map +1 -0
  98. package/dist/src/lib/skill-installer.d.ts +23 -0
  99. package/dist/src/lib/snapshots.d.ts +99 -0
  100. package/dist/src/lib/snapshots.js +357 -0
  101. package/dist/src/lib/snapshots.js.map +1 -0
  102. package/dist/src/lib/sync-paths.d.ts +72 -0
  103. package/dist/src/lib/sync-paths.js +29 -1
  104. package/dist/src/lib/sync-paths.js.map +1 -1
  105. package/dist/src/lib/template.d.ts +93 -0
  106. package/dist/src/lib/token-inject.d.ts +56 -0
  107. package/dist/src/lib/token-inject.js +204 -0
  108. package/dist/src/lib/token-inject.js.map +1 -0
  109. package/dist/src/lib/toml-database-config.d.ts +132 -0
  110. package/dist/src/lib/toml-params-validator.d.ts +95 -0
  111. package/dist/src/lib/version-check.d.ts +10 -0
  112. package/dist/src/lib/workflow-fragments.d.ts +41 -0
  113. package/dist/src/lib/workflow-toml-validator.d.ts +86 -0
  114. package/dist/src/lib/workflow-toml-validator.js +31 -1
  115. package/dist/src/lib/workflow-toml-validator.js.map +1 -1
  116. package/dist/src/types/index.d.ts +513 -0
  117. package/dist/src/validators.d.ts +64 -0
  118. package/dist/src/validators.js +63 -0
  119. package/dist/src/validators.js.map +1 -0
  120. package/package.json +7 -1
@@ -9,6 +9,109 @@ const CACHE_META_FILE = join(GUIDES_CACHE_DIR, "cache-meta.json");
9
9
  const GITHUB_RAW_BASE = "https://raw.githubusercontent.com/Primitive-Labs/primitive-docs/main/guides";
10
10
  const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
11
11
  const CLIENT_PACKAGE_NAME = "js-bao-wss-client";
12
+ // Language aliases — map the agent's natural vocabulary onto canonical values.
13
+ const LANGUAGE_ALIASES = {
14
+ typescript: "ts",
15
+ javascript: "ts",
16
+ js: "ts",
17
+ };
18
+ /**
19
+ * Normalize a `--language` flag value: lowercase, trim, and map known aliases
20
+ * (typescript/javascript/js → ts). Unknown values pass through unchanged.
21
+ *
22
+ * NOTE: guide flags are intentionally NOT validated against a fixed enum. An
23
+ * unknown/typo'd value simply matches no variant and falls back to the guide's
24
+ * default `file` (the "never fail" behavior from #977). This DIVERGES from
25
+ * `init --platform`, which validates and exits for unsupported values
26
+ * (cli/src/commands/init.ts) — that divergence is deliberate and guide-specific.
27
+ */
28
+ export function normalizeLanguage(value) {
29
+ if (value === undefined)
30
+ return undefined;
31
+ const lower = value.trim().toLowerCase();
32
+ if (lower === "")
33
+ return undefined;
34
+ return LANGUAGE_ALIASES[lower] ?? lower;
35
+ }
36
+ /**
37
+ * Normalize a `--platform` flag value: lowercase + trim. No aliases for now.
38
+ * Like `normalizeLanguage`, unknown values pass through and fall back to the
39
+ * default `file` rather than erroring (guide-specific "never fail" behavior).
40
+ */
41
+ export function normalizePlatform(value) {
42
+ if (value === undefined)
43
+ return undefined;
44
+ const lower = value.trim().toLowerCase();
45
+ if (lower === "")
46
+ return undefined;
47
+ return lower;
48
+ }
49
+ /**
50
+ * Select the guide variant filename for a requested (language, platform).
51
+ *
52
+ * Implemented as ordered `find()` passes — NOT a wildcard scoring system —
53
+ * with the no-flags case special-cased to the default `file`:
54
+ *
55
+ * 0. No flags at all → guide.file (deterministic "default")
56
+ * 1. Exact pair → variant pins BOTH requested dims
57
+ * 2. Language-only → variant pins language; platform agnostic
58
+ * 3. Platform-only → variant pins platform; language agnostic
59
+ * 4. Default → guide.file
60
+ *
61
+ * An omitted REQUEST dimension acts as a wildcard during matching (a
62
+ * `--language swift` request matches a swift variant regardless of platform).
63
+ * This function NEVER throws — an unknown/typo'd/unavailable combination simply
64
+ * falls through to the guide's default `file`.
65
+ */
66
+ export function selectVariant(guide, request) {
67
+ const reqLang = request.language;
68
+ const reqPlat = request.platform;
69
+ const variants = guide.variants ?? [];
70
+ // 0. No flags supplied at all → deterministically serve the default file.
71
+ if (reqLang === undefined && reqPlat === undefined) {
72
+ return { file: guide.file, matchedOn: "default" };
73
+ }
74
+ // A variant "matches" a dimension if the request omits it (wildcard) OR the
75
+ // variant pins it to exactly the requested value. A variant that omits a
76
+ // dimension is agnostic and matches any requested value for that dimension.
77
+ const langMatches = (v) => reqLang === undefined || v.language === undefined || v.language === reqLang;
78
+ const platMatches = (v) => reqPlat === undefined || v.platform === undefined || v.platform === reqPlat;
79
+ // 1. Exact pair: variant pins both requested dimensions to the request.
80
+ if (reqLang !== undefined && reqPlat !== undefined) {
81
+ const exact = variants.find((v) => v.language === reqLang && v.platform === reqPlat);
82
+ if (exact)
83
+ return { file: exact.file, matchedOn: "exact" };
84
+ }
85
+ // 2. Language requested. Prefer a platform-agnostic variant that pins the
86
+ // language (reported as "language" — pinned one dim, agnostic on the
87
+ // other). If none exists, honor the omitted-platform wildcard and fall
88
+ // back to a pair-specific variant that still satisfies the request
89
+ // (e.g. only `{swift,ios}` published + `--language swift`). That fallback
90
+ // pins BOTH dimensions to satisfy the request, so it's reported as
91
+ // "exact" — the variant is as specific as an exact-pair hit.
92
+ if (reqLang !== undefined) {
93
+ const langAgnostic = variants.find((v) => v.language === reqLang && v.platform === undefined);
94
+ if (langAgnostic)
95
+ return { file: langAgnostic.file, matchedOn: "language" };
96
+ const langWildcard = variants.find((v) => v.language === reqLang && platMatches(v));
97
+ if (langWildcard)
98
+ return { file: langWildcard.file, matchedOn: "exact" };
99
+ }
100
+ // 3. Platform requested (symmetric to pass 2). Prefer a language-agnostic
101
+ // variant that pins the platform ("platform"); otherwise honor the
102
+ // omitted-language wildcard and fall back to a pair-specific variant
103
+ // satisfying the request, reported as "exact".
104
+ if (reqPlat !== undefined) {
105
+ const platAgnostic = variants.find((v) => v.platform === reqPlat && v.language === undefined);
106
+ if (platAgnostic)
107
+ return { file: platAgnostic.file, matchedOn: "platform" };
108
+ const platWildcard = variants.find((v) => v.platform === reqPlat && langMatches(v));
109
+ if (platWildcard)
110
+ return { file: platWildcard.file, matchedOn: "exact" };
111
+ }
112
+ // 4. Nothing matched → the guide's default file (never throws).
113
+ return { file: guide.file, matchedOn: "default" };
114
+ }
12
115
  function detectClientVersion() {
13
116
  const clientPkgPath = join(process.cwd(), "node_modules", CLIENT_PACKAGE_NAME, "package.json");
14
117
  try {
@@ -184,26 +287,30 @@ async function fetchManifest(versionInfo, forceRefresh = false) {
184
287
  }
185
288
  throw new Error(`Failed to fetch guides manifest for ${versionInfo.version}`);
186
289
  }
187
- async function fetchGuide(guide, version, forceRefresh = false) {
290
+ async function fetchGuide(guide, version, request = {}, forceRefresh = false) {
188
291
  ensureCacheDir(version);
189
292
  const meta = loadCacheMeta();
190
- const guideFileName = basename(guide.file);
293
+ // Resolve the variant filename for the requested (language, platform).
294
+ const { file: selectedFile } = selectVariant(guide, request);
295
+ const guideFileName = basename(selectedFile);
191
296
  const cachedPath = join(getGuidesCacheDir(version), guideFileName);
192
- const fetchedAt = meta.guidesFetchedAt?.[version]?.[guide.topic];
297
+ // Freshness is keyed by the RESOLVED filename (not topic) so a `ts` fetch
298
+ // cannot mark the `swift` variant fresh — and vice versa (#977).
299
+ const fetchedAt = meta.guidesFetchedAt?.[version]?.[guideFileName];
193
300
  const cacheExpired = isCacheExpired(fetchedAt);
194
301
  const hasCachedGuide = existsSync(cachedPath);
195
302
  // If cache is valid and not forcing refresh, use it
196
303
  if (!forceRefresh && !cacheExpired && hasCachedGuide) {
197
304
  try {
198
305
  const content = readFileSync(cachedPath, "utf-8");
199
- return { content, fromCache: true, stale: false };
306
+ return { content, fromCache: true, stale: false, selectedFile };
200
307
  }
201
308
  catch {
202
309
  // Cache corrupted, will fetch fresh
203
310
  }
204
311
  }
205
312
  // Try to fetch from network
206
- const guideUrl = getGuideUrl(version, guide.file);
313
+ const guideUrl = getGuideUrl(version, selectedFile);
207
314
  try {
208
315
  const response = await fetchWithTimeout(guideUrl);
209
316
  if (!response.ok) {
@@ -214,16 +321,16 @@ async function fetchGuide(guide, version, forceRefresh = false) {
214
321
  writeFileSync(cachedPath, content);
215
322
  meta.guidesFetchedAt = meta.guidesFetchedAt || {};
216
323
  meta.guidesFetchedAt[version] = meta.guidesFetchedAt[version] || {};
217
- meta.guidesFetchedAt[version][guide.topic] = new Date().toISOString();
324
+ meta.guidesFetchedAt[version][guideFileName] = new Date().toISOString();
218
325
  saveCacheMeta(meta);
219
- return { content, fromCache: false, stale: false };
326
+ return { content, fromCache: false, stale: false, selectedFile };
220
327
  }
221
328
  catch (err) {
222
329
  // Network failed, try stale cache
223
330
  if (hasCachedGuide) {
224
331
  try {
225
332
  const content = readFileSync(cachedPath, "utf-8");
226
- return { content, fromCache: true, stale: true };
333
+ return { content, fromCache: true, stale: true, selectedFile };
227
334
  }
228
335
  catch {
229
336
  // Cache corrupted
@@ -232,21 +339,59 @@ async function fetchGuide(guide, version, forceRefresh = false) {
232
339
  throw new Error(`Failed to fetch guide "${guide.topic}": ${err.message}`);
233
340
  }
234
341
  }
342
+ /** Normalize a guide's variants for display / --json output. */
343
+ function normalizeVariants(guide) {
344
+ return (guide.variants ?? []).map((v) => ({
345
+ ...(v.language !== undefined ? { language: v.language } : {}),
346
+ ...(v.platform !== undefined ? { platform: v.platform } : {}),
347
+ file: v.file,
348
+ }));
349
+ }
350
+ /** Compact human-readable rendering of a guide's available combinations. */
351
+ function formatCombinations(guide) {
352
+ const variants = guide.variants ?? [];
353
+ if (variants.length === 0)
354
+ return "default";
355
+ const parts = variants.map((v) => {
356
+ if (v.language !== undefined && v.platform !== undefined) {
357
+ return `${v.language}_${v.platform}`;
358
+ }
359
+ if (v.language !== undefined)
360
+ return v.language;
361
+ if (v.platform !== undefined)
362
+ return v.platform;
363
+ return "default";
364
+ });
365
+ // De-dupe while preserving order.
366
+ return [...new Set(parts)].join("; ");
367
+ }
235
368
  export function registerGuidesCommands(program) {
236
369
  const guides = program
237
370
  .command("guides")
238
371
  .description("Access Primitive how-to guides for building apps")
239
372
  .addHelpText("after", `
240
373
  Examples:
241
- $ primitive guides list # List available guides
242
- $ primitive guides list --json # List as JSON for programmatic use
243
- $ primitive guides get documents # Fetch and display the documents guide
244
- $ primitive guides get workflows # Fetch and display the workflows guide
245
- $ primitive guides list --version 1 # List guides for client v1
374
+ $ primitive guides list # List available guides + combinations
375
+ $ primitive guides list --json # List as JSON for programmatic use
376
+ $ primitive guides get documents # Fetch the default (TS) documents guide
377
+ $ primitive guides get documents --language swift # Fetch the Swift variant
378
+ $ primitive guides get documents --language swift --platform ios
379
+ $ primitive guides list --guide-version 1 # List guides for client v1
380
+ $ primitive guides list --guide-version latest # List guides for the latest line
381
+
382
+ Language & platform:
383
+ --language <ts|swift|...> and --platform <web|ios|macos|...> let the calling
384
+ agent request a specific guide variant. Aliases: typescript/javascript/js -> ts.
385
+ These flags are guide-specific and NEVER fail: an unknown value or an
386
+ unavailable (language, platform) combination falls back to the guide's default
387
+ variant rather than erroring. (This intentionally differs from 'init --platform',
388
+ which validates and exits.) Run 'guides list' to see available combinations.
246
389
 
247
390
  Versioning:
248
391
  By default, guides are fetched for the detected ${CLIENT_PACKAGE_NAME} version.
249
- Use --version to explicitly request a specific major version.
392
+ Use --guide-version to explicitly request a specific major version (e.g. 1, 2,
393
+ or 'latest'). (The flag is --guide-version, not --version, because the root
394
+ 'primitive --version' prints the CLI version and would otherwise swallow it.)
250
395
  Falls back to 'latest' if the version is not found.
251
396
 
252
397
  Cache:
@@ -259,11 +404,17 @@ Cache:
259
404
  .description("List available guides")
260
405
  .option("--json", "Output as JSON")
261
406
  .option("--refresh", "Force refresh from network")
262
- .option("--version <version>", "Fetch guides for a specific major version (e.g., 1, 2, or 'latest')")
407
+ .option("--guide-version <version>", "Fetch guides for a specific major version (e.g., 1, 2, or 'latest')")
408
+ .option("--language <lang>", "Language the agent is targeting (ts, swift, ...; informational here)")
409
+ .option("--platform <platform>", "Platform the agent is targeting (web, ios, macos, ...; informational here)")
263
410
  .action(async (options) => {
264
411
  try {
265
- const requestedVersion = resolveVersion(options.version);
412
+ const requestedVersion = resolveVersion(options.guideVersion);
266
413
  const { manifest, stale, versionInfo } = await fetchManifest(requestedVersion, options.refresh);
414
+ // Normalize requested dimensions (informational on `list` — surfaced so
415
+ // the agent can confirm what it asked for; selection happens on `get`).
416
+ const reqLanguage = normalizeLanguage(options.language);
417
+ const reqPlatform = normalizePlatform(options.platform);
267
418
  if (stale) {
268
419
  warn("Using stale cache (network unavailable)");
269
420
  }
@@ -271,6 +422,9 @@ Cache:
271
422
  json({
272
423
  version: versionInfo.version,
273
424
  versionSource: versionInfo.source,
425
+ defaults: manifest.defaults ?? null,
426
+ language: reqLanguage ?? null,
427
+ platform: reqPlatform ?? null,
274
428
  guides: manifest.guides.map((g) => ({
275
429
  topic: g.topic,
276
430
  description: g.description,
@@ -279,6 +433,7 @@ Cache:
279
433
  concepts: g.concepts,
280
434
  prerequisites: g.prerequisites,
281
435
  relatedGuides: g.relatedGuides,
436
+ availableVariants: normalizeVariants(g),
282
437
  })),
283
438
  });
284
439
  return;
@@ -290,13 +445,19 @@ Cache:
290
445
  keyValue("Client version", formatClientVersion(versionInfo));
291
446
  keyValue("Guides version", formatGuidesVersion(versionInfo));
292
447
  console.log("");
293
- console.log(formatTable(manifest.guides, [
448
+ const rows = manifest.guides.map((g) => ({
449
+ topic: g.topic,
450
+ description: g.description,
451
+ combinations: formatCombinations(g),
452
+ }));
453
+ console.log(formatTable(rows, [
294
454
  { header: "TOPIC", key: "topic" },
295
- { header: "DESCRIPTION", key: "description", width: 60 },
455
+ { header: "DESCRIPTION", key: "description", width: 48, truncate: true },
456
+ { header: "COMBINATIONS", key: "combinations" },
296
457
  ]));
297
458
  console.log("");
298
459
  keyValue("Cache location", getVersionCacheDir(versionInfo.version));
299
- info("Use 'primitive guides get <topic>' to fetch a guide.");
460
+ info("Use 'primitive guides get <topic> [--language <lang>] [--platform <platform>]' to fetch a guide.");
300
461
  }
301
462
  catch (err) {
302
463
  error(err.message);
@@ -310,10 +471,12 @@ Cache:
310
471
  .argument("<topic>", "Guide topic (e.g., documents, workflows, prompts)")
311
472
  .option("--json", "Output metadata as JSON instead of content")
312
473
  .option("--refresh", "Force refresh from network")
313
- .option("--version <version>", "Fetch guides for a specific major version (e.g., 1, 2, or 'latest')")
474
+ .option("--guide-version <version>", "Fetch guides for a specific major version (e.g., 1, 2, or 'latest')")
475
+ .option("--language <lang>", "Language variant to fetch (ts, swift, ...; aliases typescript/javascript/js -> ts)")
476
+ .option("--platform <platform>", "Platform variant to fetch (web, ios, macos, ...)")
314
477
  .action(async (topic, options) => {
315
478
  try {
316
- const requestedVersion = resolveVersion(options.version);
479
+ const requestedVersion = resolveVersion(options.guideVersion);
317
480
  const { manifest, stale: manifestStale, versionInfo } = await fetchManifest(requestedVersion, options.refresh);
318
481
  const guide = manifest.guides.find((g) => g.topic.toLowerCase() === topic.toLowerCase());
319
482
  if (!guide) {
@@ -321,8 +484,17 @@ Cache:
321
484
  error(`Guide "${topic}" not found. Available topics: ${availableTopics}`);
322
485
  process.exit(1);
323
486
  }
487
+ // Normalize the requested (language, platform). Unknown values pass
488
+ // through and fall back to the default variant (never fail — #977).
489
+ const reqLanguage = normalizeLanguage(options.language);
490
+ const reqPlatform = normalizePlatform(options.platform);
491
+ const selection = selectVariant(guide, {
492
+ language: reqLanguage,
493
+ platform: reqPlatform,
494
+ });
324
495
  if (options.json) {
325
- // Output just metadata
496
+ // Output just metadata — does NOT fetch content. `selectedFile` is the
497
+ // file that WOULD be served for this request (see selection above).
326
498
  json({
327
499
  version: versionInfo.version,
328
500
  versionSource: versionInfo.source,
@@ -333,11 +505,16 @@ Cache:
333
505
  concepts: guide.concepts,
334
506
  prerequisites: guide.prerequisites,
335
507
  relatedGuides: guide.relatedGuides,
336
- cacheLocation: join(getGuidesCacheDir(versionInfo.version), basename(guide.file)),
508
+ language: reqLanguage ?? null,
509
+ platform: reqPlatform ?? null,
510
+ selectedFile: selection.file,
511
+ matchedOn: selection.matchedOn,
512
+ availableVariants: normalizeVariants(guide),
513
+ cacheLocation: join(getGuidesCacheDir(versionInfo.version), basename(selection.file)),
337
514
  });
338
515
  return;
339
516
  }
340
- const { content, stale: guideStale } = await fetchGuide(guide, versionInfo.version, options.refresh);
517
+ const { content, stale: guideStale } = await fetchGuide(guide, versionInfo.version, { language: reqLanguage, platform: reqPlatform }, options.refresh);
341
518
  if (manifestStale || guideStale) {
342
519
  warn("Using stale cache (network unavailable)");
343
520
  }
@@ -1 +1 @@
1
- {"version":3,"file":"guides.js","sourceRoot":"","sources":["../../../src/commands/guides.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guides.js","sourceRoot":"","sources":["../../../src/commands/guides.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * The .gitignore lines `init` writes for Primitive CLI local state.
4
+ *
5
+ * Pre-pull sync snapshots (issue #578) are per-machine local recovery state and
6
+ * must never be committed. They can land in three places depending on how the
7
+ * sync dir resolves (see `resolveSnapshotsRoot` in `lib/sync-paths.ts`):
8
+ * - project mode: `<projectRoot>/.primitive/sync-backups/<env>/<appId>/`
9
+ * - legacy `--dir <p>`: `<p>/.snapshots/` (sibling of the user dir)
10
+ * - no-project fallback: `./config-snapshots/`
11
+ * The bare `.snapshots/` and `config-snapshots/` entries (no leading slash)
12
+ * match those directories wherever `--dir` points, so backup copies — including
13
+ * the restored `.primitive-sync.json` baseline — can never surface as untracked
14
+ * files in a tracked custom config dir.
15
+ */
16
+ export declare const GITIGNORE_LOCAL_STATE_ENTRIES: readonly [".primitive/credentials.json", ".primitive/sync/**/.primitive-sync.json", ".primitive/sync-backups/", ".snapshots/", "config-snapshots/"];
17
+ export declare function registerInitCommand(program: Command): void;
@@ -6,9 +6,31 @@ import { ApiClient } from "../lib/api-client.js";
6
6
  import { browserLogin } from "../lib/auth-flow.js";
7
7
  import { loadCredentials, setCurrentApp } from "../lib/config.js";
8
8
  import { INIT_CONFIG_FILENAME, loadInitConfig, parseInitConfigToml, validateInitConfig, } from "../lib/init-config.js";
9
+ import { resolvePlatform, } from "../lib/resolve-platform.js";
9
10
  import { divider, error, info, keyValue, success, warn, } from "../lib/output.js";
10
11
  import { downloadAndExtractTemplate, gitInitialCommit, gitInitRepo, installPnpmGlobally, installPrimitiveCli, isDirectoryEmpty, isPnpmInstalled, isPortFree, isPrimitiveCliInstalled, isXcodeInstalled, IOS_TEMPLATE_URL, runPnpmInstall, runSwiftPackageResolve, updateEnvFile, updateEnvPort, updatePrimitiveJson, updateViteConfig, } from "../lib/template.js";
11
12
  const DEFAULT_SERVER_URL = process.env.PRIMITIVE_SERVER_URL || "https://primitiveapi.com";
13
+ /**
14
+ * The .gitignore lines `init` writes for Primitive CLI local state.
15
+ *
16
+ * Pre-pull sync snapshots (issue #578) are per-machine local recovery state and
17
+ * must never be committed. They can land in three places depending on how the
18
+ * sync dir resolves (see `resolveSnapshotsRoot` in `lib/sync-paths.ts`):
19
+ * - project mode: `<projectRoot>/.primitive/sync-backups/<env>/<appId>/`
20
+ * - legacy `--dir <p>`: `<p>/.snapshots/` (sibling of the user dir)
21
+ * - no-project fallback: `./config-snapshots/`
22
+ * The bare `.snapshots/` and `config-snapshots/` entries (no leading slash)
23
+ * match those directories wherever `--dir` points, so backup copies — including
24
+ * the restored `.primitive-sync.json` baseline — can never surface as untracked
25
+ * files in a tracked custom config dir.
26
+ */
27
+ export const GITIGNORE_LOCAL_STATE_ENTRIES = [
28
+ ".primitive/credentials.json",
29
+ ".primitive/sync/**/.primitive-sync.json",
30
+ ".primitive/sync-backups/",
31
+ ".snapshots/",
32
+ "config-snapshots/",
33
+ ];
12
34
  /**
13
35
  * Writes .primitive/config.json into the project directory and ensures the
14
36
  * .gitignore entry for local state exists. Safe to call in a directory that
@@ -66,10 +88,7 @@ async function scaffoldProjectConfig(opts) {
66
88
  // users who re-run init pick up the fix.
67
89
  const gitignorePath = join(opts.targetDir, ".gitignore");
68
90
  const LEGACY_SYNC_IGNORE = ".primitive/sync/";
69
- const gitignoreEntries = [
70
- ".primitive/credentials.json",
71
- ".primitive/sync/**/.primitive-sync.json",
72
- ];
91
+ const gitignoreEntries = [...GITIGNORE_LOCAL_STATE_ENTRIES];
73
92
  let linesToAdd = [];
74
93
  if (existsSync(gitignorePath)) {
75
94
  const existing = readFileSync(gitignorePath, "utf-8");
@@ -224,7 +243,8 @@ export function registerInitCommand(program) {
224
243
  .option("--use-existing-app-id <id>", "Use an existing app ID instead of creating a new one")
225
244
  .option("-s, --server <url>", "Server URL (default: current CLI server or https://primitiveapi.com)")
226
245
  .option("--skip-install", "Skip dependency installation")
227
- .option("-p, --platform <platform>", "Target platform: web (default) or ios (SwiftUI)", "web")
246
+ .option("--config <path>", `Path to an init config file for non-interactive setup (default: auto-discover ${INIT_CONFIG_FILENAME} in the current directory)`)
247
+ .option("-p, --platform <platform>", "Target platform: web or ios (SwiftUI). Omit to be prompted interactively.")
228
248
  .addHelpText("after", `
229
249
  Examples:
230
250
  $ primitive init my-app # Create web app in ./my-app
@@ -242,6 +262,7 @@ Non-interactive mode:
242
262
  app_name = "My App" # Required for action = "create"
243
263
  app_id = "01HXY..." # Required for action = "use-existing"
244
264
  dir = "my-app" # Project directory (optional)
265
+ platform = "web" # "web" or "ios" (optional, defaults to web)
245
266
  access_mode = "invite-only" # "public", "domain", or "invite-only" (optional)
246
267
  dev_port = 5173 # Dev server port (optional)
247
268
  skip_install = false # Skip pnpm install (optional)
@@ -259,23 +280,46 @@ This command will:
259
280
  .action(handleInit);
260
281
  }
261
282
  async function handleInit(projectDirArg, options) {
262
- const platform = options.platform || "web";
263
- // Apple-family platforms (iOS + the unadvertised macOS) share the same
264
- // SwiftUI template, Xcode toolchain, and primitive.json config path.
265
- const isApple = platform === "ios" || platform === "macos";
283
+ // Validate an explicitly-passed `--platform` flag up front. Only `web` and
284
+ // `ios` are supported (#1009 removed `macos`). An omitted flag is
285
+ // `undefined` (the commander default was dropped) and is resolved below.
286
+ if (options.platform !== undefined &&
287
+ options.platform !== "web" &&
288
+ options.platform !== "ios") {
289
+ error(`Unknown platform "${options.platform}". Supported platforms: web, ios`);
290
+ process.exit(1);
291
+ }
266
292
  // `initConfig` is the parsed-and-validated `primitive-init.toml` for
267
293
  // non-interactive runs (CI, scripted scaffolding). When non-null, the
268
294
  // rest of this function uses it to skip prompts.
269
295
  const initConfig = loadInitConfigFromOptions(options);
270
- // Validate platform. `macos` is accepted but not listed — see the
271
- // `Platform` type note. `web` and `ios` are the advertised options.
272
- if (platform !== "web" && platform !== "ios" && platform !== "macos") {
273
- error(`Unknown platform "${platform}". Supported platforms: web, ios`);
274
- process.exit(1);
275
- }
296
+ // Resolve the target platform per the 4-case interactivity contract:
297
+ // (a) explicit --platform flag -> use it (never prompt)
298
+ // (b) init-config TOML present -> use its platform or fall back to web
299
+ // (c) interactive TTY, no flag/cfg -> prompt
300
+ // (d) non-TTY, no flag/cfg -> fall back to web (no hang/crash)
301
+ // The prompt is TTY-guarded inside `resolvePlatform` so a piped/CI stdin
302
+ // never triggers the `@inquirer/prompts` `ERR_USE_AFTER_CLOSE` crash.
303
+ const platform = await resolvePlatform({
304
+ flag: options.platform,
305
+ configPlatform: initConfig?.platform,
306
+ hasConfig: initConfig != null,
307
+ isTTY: Boolean(process.stdin.isTTY),
308
+ promptFn: () => select({
309
+ message: "What platform are you building for?",
310
+ choices: [
311
+ { value: "web", name: "web (Vue 3 + TypeScript + Tailwind)" },
312
+ { value: "ios", name: "ios (Swift + SwiftUI)" },
313
+ ],
314
+ default: "web",
315
+ }),
316
+ });
317
+ // iOS shares the SwiftUI template, Xcode toolchain, and primitive.json
318
+ // config path. (macOS was removed in #1009.)
319
+ const isApple = platform === "ios";
276
320
  // Apple-family platforms require macOS with Xcode.
277
321
  if (isApple && process.platform !== "darwin") {
278
- error("iOS/macOS apps require macOS with Xcode installed.");
322
+ error("iOS apps require macOS with Xcode installed.");
279
323
  process.exit(1);
280
324
  }
281
325
  if (isApple) {
@@ -383,7 +427,7 @@ async function handleInit(projectDirArg, options) {
383
427
  }
384
428
  }
385
429
  // Step 3: Download template
386
- info(`Setting up your ${platform === "ios" ? "iOS" : platform === "macos" ? "macOS" : "web"} project...`);
430
+ info(`Setting up your ${platform === "ios" ? "iOS" : "web"} project...`);
387
431
  try {
388
432
  await downloadAndExtractTemplate({
389
433
  targetDir,
@@ -871,11 +915,7 @@ async function handleInit(projectDirArg, options) {
871
915
  keyValue("Directory", targetDir);
872
916
  keyValue("App Name", appName);
873
917
  keyValue("App ID", appId);
874
- keyValue("Platform", platform === "ios"
875
- ? "iOS (SwiftUI)"
876
- : platform === "macos"
877
- ? "macOS (SwiftUI)"
878
- : "Web");
918
+ keyValue("Platform", platform === "ios" ? "iOS (SwiftUI)" : "Web");
879
919
  divider();
880
920
  info("Next steps:");
881
921
  if (projectDir !== ".") {
@@ -886,9 +926,7 @@ async function handleInit(projectDirArg, options) {
886
926
  console.log(" swift package resolve");
887
927
  }
888
928
  console.log(" open *.xcodeproj");
889
- console.log(platform === "macos"
890
- ? " # or: ./run.sh (macOS)"
891
- : " # or: ./run-ios.sh (iOS Simulator)");
929
+ console.log(" # or: ./run-ios.sh (iOS Simulator)");
892
930
  }
893
931
  else {
894
932
  if (options.skipInstall) {