primitive-admin 1.1.0-alpha.64 → 1.1.0-alpha.66

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 (90) hide show
  1. package/README.md +4 -4
  2. package/assets/skill/skills/primitive-platform/SKILL.md +83 -13
  3. package/dist/bin/primitive.js +6 -3
  4. package/dist/bin/primitive.js.map +1 -1
  5. package/dist/src/commands/apps.js +14 -5
  6. package/dist/src/commands/apps.js.map +1 -1
  7. package/dist/src/commands/config.js +11 -4
  8. package/dist/src/commands/config.js.map +1 -1
  9. package/dist/src/commands/cron-triggers.js +25 -28
  10. package/dist/src/commands/cron-triggers.js.map +1 -1
  11. package/dist/src/commands/env.d.ts +12 -1
  12. package/dist/src/commands/env.js +96 -21
  13. package/dist/src/commands/env.js.map +1 -1
  14. package/dist/src/commands/feature-flags.d.ts +14 -0
  15. package/dist/src/commands/feature-flags.js +116 -0
  16. package/dist/src/commands/feature-flags.js.map +1 -0
  17. package/dist/src/commands/init.d.ts +1 -1
  18. package/dist/src/commands/init.js +78 -25
  19. package/dist/src/commands/init.js.map +1 -1
  20. package/dist/src/commands/integrations.js +55 -2
  21. package/dist/src/commands/integrations.js.map +1 -1
  22. package/dist/src/commands/prompts.js +58 -3
  23. package/dist/src/commands/prompts.js.map +1 -1
  24. package/dist/src/commands/rule-sets.d.ts +1 -1
  25. package/dist/src/commands/rule-sets.js +1 -0
  26. package/dist/src/commands/rule-sets.js.map +1 -1
  27. package/dist/src/commands/sync-app-settings.d.ts +83 -55
  28. package/dist/src/commands/sync-app-settings.js +131 -200
  29. package/dist/src/commands/sync-app-settings.js.map +1 -1
  30. package/dist/src/commands/sync.d.ts +309 -40
  31. package/dist/src/commands/sync.js +2493 -397
  32. package/dist/src/commands/sync.js.map +1 -1
  33. package/dist/src/commands/users.js +92 -1
  34. package/dist/src/commands/users.js.map +1 -1
  35. package/dist/src/commands/webhooks.js +59 -2
  36. package/dist/src/commands/webhooks.js.map +1 -1
  37. package/dist/src/commands/workflows.js +32 -22
  38. package/dist/src/commands/workflows.js.map +1 -1
  39. package/dist/src/lib/api-client.d.ts +51 -4
  40. package/dist/src/lib/api-client.js +71 -7
  41. package/dist/src/lib/api-client.js.map +1 -1
  42. package/dist/src/lib/app-settings-descriptor.d.ts +143 -15
  43. package/dist/src/lib/app-settings-descriptor.js +315 -28
  44. package/dist/src/lib/app-settings-descriptor.js.map +1 -1
  45. package/dist/src/lib/config-object-descriptor.js +6 -14
  46. package/dist/src/lib/config-object-descriptor.js.map +1 -1
  47. package/dist/src/lib/config-payload.js +14 -3
  48. package/dist/src/lib/config-payload.js.map +1 -1
  49. package/dist/src/lib/config-surface.d.ts +38 -1
  50. package/dist/src/lib/config-surface.js +123 -1
  51. package/dist/src/lib/config-surface.js.map +1 -1
  52. package/dist/src/lib/env-resolver-core.d.ts +147 -0
  53. package/dist/src/lib/env-resolver-core.js +265 -0
  54. package/dist/src/lib/env-resolver-core.js.map +1 -0
  55. package/dist/src/lib/env-resolver.d.ts +28 -6
  56. package/dist/src/lib/env-resolver.js +44 -32
  57. package/dist/src/lib/env-resolver.js.map +1 -1
  58. package/dist/src/lib/generated-config-surfaces.d.ts +66 -0
  59. package/dist/src/lib/generated-config-surfaces.js +391 -104
  60. package/dist/src/lib/generated-config-surfaces.js.map +1 -1
  61. package/dist/src/lib/integration-request-config.d.ts +30 -0
  62. package/dist/src/lib/integration-request-config.js +145 -0
  63. package/dist/src/lib/integration-request-config.js.map +1 -0
  64. package/dist/src/lib/local-state.d.ts +55 -0
  65. package/dist/src/lib/local-state.js +167 -0
  66. package/dist/src/lib/local-state.js.map +1 -0
  67. package/dist/src/lib/log-inspection.d.ts +2 -2
  68. package/dist/src/lib/log-inspection.js +3 -3
  69. package/dist/src/lib/log-inspection.js.map +1 -1
  70. package/dist/src/lib/object-status-filter.d.ts +22 -0
  71. package/dist/src/lib/object-status-filter.js +45 -0
  72. package/dist/src/lib/object-status-filter.js.map +1 -0
  73. package/dist/src/lib/server-text-normalization.d.ts +51 -0
  74. package/dist/src/lib/server-text-normalization.js +90 -0
  75. package/dist/src/lib/server-text-normalization.js.map +1 -0
  76. package/dist/src/lib/swift-codegen/generator.js +2 -4
  77. package/dist/src/lib/swift-codegen/generator.js.map +1 -1
  78. package/dist/src/lib/sync-resource-types.d.ts +8 -0
  79. package/dist/src/lib/sync-resource-types.js +21 -2
  80. package/dist/src/lib/sync-resource-types.js.map +1 -1
  81. package/dist/src/lib/template.d.ts +27 -0
  82. package/dist/src/lib/template.js +46 -20
  83. package/dist/src/lib/template.js.map +1 -1
  84. package/dist/src/lib/workflow-defaults.d.ts +1 -2
  85. package/dist/src/lib/workflow-defaults.js +3 -3
  86. package/dist/src/lib/workflow-defaults.js.map +1 -1
  87. package/dist/src/lib/workflow-payload.js +0 -6
  88. package/dist/src/lib/workflow-payload.js.map +1 -1
  89. package/dist/src/types/index.d.ts +32 -7
  90. package/package.json +2 -2
@@ -5,14 +5,29 @@
5
5
  * env list — show all environments
6
6
  * env add <name> — add a new environment
7
7
  * env remove <name> — delete an environment
8
- * env use <name> — set defaultEnvironment
8
+ * env use <name> — select the environment THIS machine uses
9
9
  * env show [name] — show details for an environment (default: current)
10
+ *
11
+ * Two different things live here, and #2873 stopped them sharing one field:
12
+ * - `defaultEnvironment` in the committed config is the TEAM default — what
13
+ * a fresh clone resolves.
14
+ * - `.primitive/local.json` is THIS machine's selection, written by
15
+ * `env use`. It is gitignored, so switching backends never dirties a
16
+ * tracked file.
17
+ *
18
+ * `list` and `show` therefore refuse to paper over a broken selection: corrupt
19
+ * local state, or a selection naming an environment that no longer exists, is
20
+ * a different situation from "nothing is selected" and has a different remedy.
10
21
  */
11
22
  import { join, dirname } from "path";
12
23
  import { CURRENT_CONFIG_VERSION, PROJECT_CONFIG_DIR, PROJECT_CONFIG_FILENAME, PROJECT_CONFIG_DISPLAY_NAME, ProjectConfigError, findProjectConfigPath, loadProjectConfig, saveProjectConfig, } from "../lib/project-config.js";
13
- import { getCurrentEnvNameSafe as getResolvedEnvName, resetEnvResolver, } from "../lib/env-resolver.js";
24
+ import { getCurrentEnvironment, resetEnvResolver, } from "../lib/env-resolver.js";
25
+ import { PrimitiveEnvError, localStatePathForConfigPath, readLocalSelection, } from "../lib/env-resolver-core.js";
26
+ import { clearLocalSelection, ensureLocalStateIgnored, writeLocalSelection, } from "../lib/local-state.js";
14
27
  import { clearCredentialsForEnvInProject } from "../lib/credentials-store.js";
15
28
  import { error, info, keyValue, result as printResult, success, warn, json, formatTable, divider, } from "../lib/output.js";
29
+ /** How the per-machine selection file is named in user-facing messages. */
30
+ const LOCAL_STATE_LABEL = ".primitive/local.json";
16
31
  function requireProjectConfig() {
17
32
  const path = findProjectConfigPath();
18
33
  if (!path) {
@@ -43,6 +58,28 @@ function validateEnvName(name) {
43
58
  }
44
59
  return null;
45
60
  }
61
+ /**
62
+ * The environment display commands resolve for real rather than through the
63
+ * error-swallowing `getCurrentEnvNameSafe()`. A selection that cannot resolve
64
+ * is the whole point of these commands: hiding it behind "(none)" is how a
65
+ * user ends up staring at a table that disagrees with every other command.
66
+ */
67
+ function resolveForDisplay() {
68
+ try {
69
+ const configPath = findProjectConfigPath();
70
+ const selected = configPath ? readLocalSelection(configPath) : null;
71
+ return { name: getCurrentEnvironment()?.name ?? null, selected };
72
+ }
73
+ catch (err) {
74
+ if (err instanceof PrimitiveEnvError && err.kind === "no-selection") {
75
+ // Nothing selected among several environments is a legitimate state to
76
+ // display — the table shows them all and marks no current one.
77
+ return { name: null, selected: null };
78
+ }
79
+ error(err.message || String(err));
80
+ process.exit(1);
81
+ }
82
+ }
46
83
  export function registerEnvCommands(program) {
47
84
  const env = program
48
85
  .command("env")
@@ -51,7 +88,7 @@ export function registerEnvCommands(program) {
51
88
  Examples:
52
89
  $ primitive env list # list environments
53
90
  $ primitive env add prod --api-url https://... # add an environment
54
- $ primitive env use prod # set default
91
+ $ primitive env use prod # select it on this machine
55
92
  $ primitive env show dev # show env details
56
93
  $ primitive env remove staging # remove an environment
57
94
  `);
@@ -62,14 +99,18 @@ Examples:
62
99
  .option("--json", "Output as JSON")
63
100
  .action((options) => {
64
101
  const { config } = requireProjectConfig();
102
+ const { name: current, selected } = resolveForDisplay();
65
103
  const rows = Object.entries(config.environments).map(([name, e]) => ({
66
104
  name,
67
105
  apiUrl: e.apiUrl,
68
106
  appId: e.appId || "(unset)",
107
+ current: name === current ? "*" : "",
69
108
  default: name === config.defaultEnvironment ? "*" : "",
70
109
  }));
71
110
  if (options.json) {
72
111
  json({
112
+ currentEnvironment: current,
113
+ selectedEnvironment: selected,
73
114
  defaultEnvironment: config.defaultEnvironment || null,
74
115
  environments: config.environments,
75
116
  });
@@ -80,11 +121,18 @@ Examples:
80
121
  return;
81
122
  }
82
123
  console.log(formatTable(rows, [
83
- { key: "default", header: "" },
124
+ { key: "current", header: "CURRENT" },
84
125
  { key: "name", header: "Name" },
85
126
  { key: "apiUrl", header: "API URL" },
86
127
  { key: "appId", header: "App ID" },
128
+ { key: "default", header: "TEAM DEFAULT" },
87
129
  ]));
130
+ if (selected) {
131
+ info(`"${selected}" is selected on this machine (${LOCAL_STATE_LABEL}).`);
132
+ }
133
+ else if (config.defaultEnvironment) {
134
+ info(`No local selection; falling back to the committed default "${config.defaultEnvironment}". Run 'primitive env use <name>' to choose one.`);
135
+ }
88
136
  });
89
137
  // env add
90
138
  env
@@ -137,7 +185,7 @@ Examples:
137
185
  info(`"${name}" is now the default environment.`);
138
186
  }
139
187
  else {
140
- info(`Run 'primitive env use ${name}' to make it the default.`);
188
+ info(`Run 'primitive env use ${name}' to point this machine at it.`);
141
189
  }
142
190
  });
143
191
  // env remove
@@ -158,6 +206,12 @@ Examples:
158
206
  warn(`"${name}" was the default environment. Set a new default with 'primitive env use <name>'.`);
159
207
  }
160
208
  writeProjectConfig(path, config);
209
+ // A selection naming an environment that no longer exists would make
210
+ // every later command fail on an unknown-environment error, so drop it
211
+ // with the environment it names.
212
+ if (clearLocalSelection(path, name)) {
213
+ info(`Cleared the local selection of "${name}" (${LOCAL_STATE_LABEL}).`);
214
+ }
161
215
  // Also drop the credentials slot for this env so a subsequent `env add`
162
216
  // with the same name can't silently re-use stale tokens from the old
163
217
  // instance. The project root is two levels up from .primitive/config.json.
@@ -167,7 +221,7 @@ Examples:
167
221
  // env use
168
222
  env
169
223
  .command("use")
170
- .description("Set the default environment")
224
+ .description("Select the environment this machine uses (local, not committed)")
171
225
  .argument("<name>", "Environment name")
172
226
  .action((name) => {
173
227
  const { path, config } = requireProjectConfig();
@@ -175,9 +229,35 @@ Examples:
175
229
  error(`Environment "${name}" does not exist. Run 'primitive env list' to see available environments.`);
176
230
  process.exit(1);
177
231
  }
178
- config.defaultEnvironment = name;
179
- writeProjectConfig(path, config);
180
- success(`Default environment is now "${name}".`);
232
+ // Ignore coverage BEFORE the write: a selection that shows up in
233
+ // `git status` is the tracked-file problem this replaced, just moved to
234
+ // an untracked file.
235
+ const localPath = localStatePathForConfigPath(path);
236
+ const coverage = ensureLocalStateIgnored(localPath);
237
+ if (coverage.status === "excluded") {
238
+ info(`Added "${coverage.pattern}" to ${coverage.excludePath} so the selection stays out of git.`);
239
+ info(`Consider committing "${LOCAL_STATE_LABEL}" to .gitignore so the whole team is covered.`);
240
+ }
241
+ else if (coverage.status === "failed") {
242
+ // Stop rather than write: an unignored local.json is committable state,
243
+ // which is the whole problem `env use` moved off the tracked config.
244
+ // The remedy is one line in .gitignore, after which this succeeds.
245
+ error(`Could not confirm ${LOCAL_STATE_LABEL} is git-ignored: ${coverage.detail}`);
246
+ error(`Add "${LOCAL_STATE_LABEL}" to your .gitignore and run 'primitive env use ${name}' again — ` +
247
+ `the selection is per-machine state and must never be committable.`);
248
+ process.exit(1);
249
+ }
250
+ writeLocalSelection(path, name);
251
+ resetEnvResolver();
252
+ success(`Now using environment "${name}" on this machine.`);
253
+ keyValue("API URL", config.environments[name].apiUrl);
254
+ if (config.environments[name].appId) {
255
+ keyValue("App ID", config.environments[name].appId);
256
+ }
257
+ info(`Selection stored in ${localPath} (local state — never committed).`);
258
+ info(config.defaultEnvironment
259
+ ? `The committed team default ("defaultEnvironment") is still "${config.defaultEnvironment}".`
260
+ : `No committed team default ("defaultEnvironment") is set for a fresh clone.`);
181
261
  });
182
262
  // env show
183
263
  env
@@ -187,17 +267,12 @@ Examples:
187
267
  .option("--json", "Output as JSON")
188
268
  .action((name, options) => {
189
269
  const { config } = requireProjectConfig();
190
- // "Current" means the resolved env (honoring --env / PRIMITIVE_ENV /
191
- // defaultEnvironment). We intentionally read this AFTER
192
- // requireProjectConfig() so errors surface in a consistent order.
193
- const resolvedName = (() => {
194
- try {
195
- return getResolvedEnvName();
196
- }
197
- catch {
198
- return null;
199
- }
200
- })();
270
+ // "Current" means the resolved env (honoring --env / PRIMITIVE_ENV / the
271
+ // local selection / defaultEnvironment). We intentionally read this
272
+ // AFTER requireProjectConfig() so errors surface in a consistent order —
273
+ // and we do NOT swallow a broken selection, which would show the default
274
+ // as though it were current.
275
+ const resolvedName = name ? null : resolveForDisplay().name;
201
276
  const envName = name || resolvedName || config.defaultEnvironment;
202
277
  if (!envName) {
203
278
  error(`No environment specified and no defaultEnvironment set. Usage: primitive env show <name>`);
@@ -222,7 +297,7 @@ Examples:
222
297
  if (e.description)
223
298
  printResult("Description", e.description);
224
299
  if (config.defaultEnvironment === envName) {
225
- info("(default environment)");
300
+ info(`(committed team default — "defaultEnvironment")`);
226
301
  }
227
302
  divider();
228
303
  });
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/commands/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/commands/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * The platform's feature flags (issue #2803, phase 6).
4
+ *
5
+ * A feature flag is already what the rest of this issue is arguing for: one
6
+ * server-owned toggle with one writer. What it did not have was both surfaces —
7
+ * the console could flip a flag and the CLI could not read one, so an operator
8
+ * without a browser had no way to see or change platform behaviour.
9
+ *
10
+ * The model is unchanged (`enabled`, a boolean; not the five carrying types'
11
+ * `status`), and the routes already existed. This is the missing half of
12
+ * "every operational control is reachable from the CLI and from web-admin".
13
+ */
14
+ export declare function registerFeatureFlagsCommands(program: Command): void;
@@ -0,0 +1,116 @@
1
+ import { ApiClient } from "../lib/api-client.js";
2
+ import { success, error, info, formatTable, formatBoolean, result as printResult, json, } from "../lib/output.js";
3
+ /**
4
+ * The platform's feature flags (issue #2803, phase 6).
5
+ *
6
+ * A feature flag is already what the rest of this issue is arguing for: one
7
+ * server-owned toggle with one writer. What it did not have was both surfaces —
8
+ * the console could flip a flag and the CLI could not read one, so an operator
9
+ * without a browser had no way to see or change platform behaviour.
10
+ *
11
+ * The model is unchanged (`enabled`, a boolean; not the five carrying types'
12
+ * `status`), and the routes already existed. This is the missing half of
13
+ * "every operational control is reachable from the CLI and from web-admin".
14
+ */
15
+ export function registerFeatureFlagsCommands(program) {
16
+ const flags = program
17
+ .command("feature-flags")
18
+ .description("Read and toggle platform feature flags (super-admin only)")
19
+ .addHelpText("after", `
20
+ Examples:
21
+ $ primitive feature-flags list
22
+ $ primitive feature-flags get unified-block-canonical-storage
23
+ $ primitive feature-flags enable unified-block-canonical-storage
24
+ $ primitive feature-flags disable unified-block-canonical-storage
25
+
26
+ A flag is platform state, not app configuration: it is not in the TOML tree and
27
+ 'config push' neither reads nor writes it.
28
+ `);
29
+ flags
30
+ .command("list")
31
+ .description("List every feature flag and whether it is enabled")
32
+ .option("--json", "Output as JSON")
33
+ .action(async (options) => {
34
+ const client = new ApiClient();
35
+ try {
36
+ const result = await client.listFeatureFlags();
37
+ const items = result?.items ?? result?.flags ?? result ?? [];
38
+ if (options.json) {
39
+ json(items);
40
+ return;
41
+ }
42
+ if (!Array.isArray(items) || items.length === 0) {
43
+ info("No feature flags found.");
44
+ return;
45
+ }
46
+ console.log(formatTable(items, [
47
+ { header: "KEY", key: "flagKey" },
48
+ { header: "ENABLED", key: "enabled", format: formatBoolean },
49
+ { header: "DESCRIPTION", key: "description" },
50
+ ]));
51
+ }
52
+ catch (err) {
53
+ error(err.message);
54
+ process.exit(1);
55
+ }
56
+ });
57
+ flags
58
+ .command("get")
59
+ .description("Show one feature flag, including its per-app overrides")
60
+ .argument("<flag-key>", "Feature flag key")
61
+ .option("--json", "Output as JSON")
62
+ .action(async (flagKey, options) => {
63
+ const client = new ApiClient();
64
+ try {
65
+ const flag = await client.getFeatureFlag(flagKey);
66
+ if (options.json) {
67
+ json(flag);
68
+ return;
69
+ }
70
+ printResult("Key", flag.flagKey);
71
+ printResult("Enabled", formatBoolean(flag.enabled));
72
+ printResult("Description", flag.description || "-");
73
+ // The per-app overrides are what make a flag's effective value differ
74
+ // from the global one, so `get` shows them rather than only the global.
75
+ printResult("Enabled for apps", Array.isArray(flag.enabledAppIds) && flag.enabledAppIds.length > 0
76
+ ? flag.enabledAppIds.join(", ")
77
+ : "-");
78
+ printResult("Disabled for apps", Array.isArray(flag.disabledAppIds) && flag.disabledAppIds.length > 0
79
+ ? flag.disabledAppIds.join(", ")
80
+ : "-");
81
+ }
82
+ catch (err) {
83
+ error(err.message);
84
+ process.exit(1);
85
+ }
86
+ });
87
+ for (const [verb, enabled] of [
88
+ ["enable", true],
89
+ ["disable", false],
90
+ ]) {
91
+ flags
92
+ .command(verb)
93
+ .description(enabled
94
+ ? "Turn a feature flag on globally"
95
+ : "Turn a feature flag off globally")
96
+ .argument("<flag-key>", "Feature flag key")
97
+ .option("--json", "Output as JSON")
98
+ .action(async (flagKey, options) => {
99
+ const client = new ApiClient();
100
+ try {
101
+ const flag = await client.setFeatureFlagEnabled(flagKey, enabled);
102
+ if (options.json) {
103
+ json(flag);
104
+ return;
105
+ }
106
+ success(`Feature flag ${enabled ? "enabled" : "disabled"}: ${flagKey}`);
107
+ info("Per-app overrides still apply — `primitive feature-flags get` shows them.");
108
+ }
109
+ catch (err) {
110
+ error(err.message);
111
+ process.exit(1);
112
+ }
113
+ });
114
+ }
115
+ }
116
+ //# sourceMappingURL=feature-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.js","sourceRoot":"","sources":["../../../src/commands/feature-flags.ts"],"names":[],"mappings":"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"}
@@ -13,5 +13,5 @@ import { Command } from "commander";
13
13
  * the restored `.primitive-sync.json` baseline — can never surface as untracked
14
14
  * files in a tracked custom config dir.
15
15
  */
16
- export declare const GITIGNORE_LOCAL_STATE_ENTRIES: readonly [".primitive/credentials.json", ".primitive/sync/**/.primitive-sync.json", ".primitive/sync-backups/", ".snapshots/", "config-snapshots/"];
16
+ export declare const GITIGNORE_LOCAL_STATE_ENTRIES: readonly [".primitive/credentials.json", ".primitive/local.json", ".primitive/sync/**/.primitive-sync.json", ".primitive/sync-backups/", ".snapshots/", "config-snapshots/"];
17
17
  export declare function registerInitCommand(program: Command): void;
@@ -15,7 +15,7 @@ import { DEFAULT_DEV_PORT, resolveDevPort, validateDevPort, } from "../lib/resol
15
15
  import { DEFAULT_SERVER_URL } from "../lib/constants.js";
16
16
  import { divider, error, info, keyValue, success, warn, } from "../lib/output.js";
17
17
  import { installCommand, PRIMITIVE_CLI_PACKAGE } from "../lib/package-manager.js";
18
- import { gitInitialCommit, gitInitRepo, installPnpmGlobally, installPrimitiveCli, isDirectoryEmpty, isPnpmInstalled, isPortFree, isPrimitiveCliInstalled, isXcodeInstalled, iosTemplateUrl, vueTemplateUrl, resolveTemplateBranch, prepareTemplate, runPnpmInstall, runSwiftPackageResolve, updateEnvFile, updateEnvPort, updatePrimitiveJson, updateViteConfig, } from "../lib/template.js";
18
+ import { gitInitialCommit, gitInitRepo, installPnpmGlobally, installPrimitiveCli, isDirectoryEmpty, isPnpmInstalled, isPortFree, isPrimitiveCliInstalled, isXcodeInstalled, iosTemplateUrl, vueTemplateUrl, resolveTemplateBranch, prepareTemplate, runPnpmInstall, runSwiftPackageResolve, updateEnvFile, updateEnvPort, configurePrimitiveJson, updateViteConfig, } from "../lib/template.js";
19
19
  /**
20
20
  * The .gitignore lines `init` writes for Primitive CLI local state.
21
21
  *
@@ -32,6 +32,10 @@ import { gitInitialCommit, gitInitRepo, installPnpmGlobally, installPrimitiveCli
32
32
  */
33
33
  export const GITIGNORE_LOCAL_STATE_ENTRIES = [
34
34
  ".primitive/credentials.json",
35
+ // This machine's Primitive environment selection (`primitive env use`).
36
+ // The committed `defaultEnvironment` is the team default; the selection is
37
+ // per-machine and must never be committable (#2873).
38
+ ".primitive/local.json",
35
39
  ".primitive/sync/**/.primitive-sync.json",
36
40
  ".primitive/sync-backups/",
37
41
  ".snapshots/",
@@ -835,21 +839,38 @@ async function handleInit(projectDirArg, options) {
835
839
  // Steps 5-8: Platform-specific configuration and dependency installation
836
840
  if (isApple) {
837
841
  // ── Apple (SwiftUI) path ──────────────────────────────────────────
838
- // Step 5: Update primitive.json
842
+ // Step 5: Generate primitive.json from the environment we just scaffolded.
843
+ //
844
+ // In a current template the file is a build product, written by
845
+ // `scripts/resolve-primitive-config.sh` from `.primitive/config.json`
846
+ // (#2873) — so the scaffold gets one immediately rather than on first
847
+ // build. A template that predates the change has no such script and a
848
+ // tracked primitive.json instead; fill that in the old way.
839
849
  info("Configuring primitive.json...");
840
850
  try {
841
- const updated = updatePrimitiveJson(targetDir, appId, serverUrl, appName);
842
- if (!updated) {
843
- warn("No primitive.json file found in template.");
844
- warn(`Please manually set appId to "${appId}" in your primitive.json.`);
851
+ const result = configurePrimitiveJson(targetDir, appId, serverUrl, appName);
852
+ if (result.outcome === "generated") {
853
+ success("primitive.json generated from .primitive/config.json.");
845
854
  }
846
- else {
855
+ else if (result.outcome === "filled") {
847
856
  success("primitive.json configured.");
848
857
  }
858
+ else if (result.outcome === "failed") {
859
+ warn(`Could not generate primitive.json: ${result.detail}`);
860
+ warn("Run 'bash scripts/resolve-primitive-config.sh' in the project to retry.");
861
+ }
862
+ else {
863
+ // Neither the resolve script nor a template primitive.json — an
864
+ // unexpectedly old or trimmed template. The remedy is still never
865
+ // "type the app ID somewhere else": it is already in
866
+ // .primitive/config.json, which is where every reader looks.
867
+ warn("This template has neither scripts/resolve-primitive-config.sh nor a primitive.json.");
868
+ warn(`Environment "dev" in .primitive/config.json holds the app ID; update the template to generate primitive.json from it.`);
869
+ }
849
870
  }
850
871
  catch (err) {
851
- warn(`Could not update primitive.json: ${err.message}`);
852
- warn(`Please manually set appId to "${appId}" in your primitive.json.`);
872
+ warn(`Could not configure primitive.json: ${err.message}`);
873
+ warn("Run 'bash scripts/resolve-primitive-config.sh' in the project to retry.");
853
874
  }
854
875
  // Step 6-7: Skip port selection and pnpm (not applicable to Apple)
855
876
  // Step 8: Resolve Swift packages
@@ -870,24 +891,25 @@ async function handleInit(projectDirArg, options) {
870
891
  }
871
892
  else {
872
893
  // ── Web path ──────────────────────────────────────────────────────
873
- // Step 5: Update .env file
894
+ // Step 5: Fill in an OLD template's .env identity keys.
895
+ //
896
+ // A current template does not author them at all — `primitiveEnv()` reads
897
+ // `.primitive/config.json`, which we just scaffolded — so "no keys to
898
+ // replace" is the expected outcome, not a problem (#2873). The fill-in
899
+ // survives only so a new CLI still produces a working scaffold from a
900
+ // template that predates the change.
874
901
  info("Configuring environment...");
875
902
  try {
876
903
  const envResult = updateEnvFile(targetDir, appId, serverUrl, appName);
877
904
  if (!envResult.envUpdated) {
878
- warn("No .env or .env.example file found in template.");
879
- warn(`Please manually set VITE_APP_ID=${appId} in your .env file.`);
880
- }
881
- else if (!envResult.envProductionUpdated) {
882
- info(".env configured. No .env.production file found (this is optional).");
905
+ info("No .env file in this template — identity comes from .primitive/config.json.");
883
906
  }
884
907
  else {
885
- success("Environment configured (.env and .env.production).");
908
+ success("Environment configured.");
886
909
  }
887
910
  }
888
911
  catch (err) {
889
912
  warn(`Could not update .env file: ${err.message}`);
890
- warn(`Please manually set VITE_APP_ID=${appId} in your .env file.`);
891
913
  }
892
914
  // Step 6: Determine the dev port. Default to 5173; warn about taken ports
893
915
  // when prompting. The init config's `dev_port` decides it non-interactively
@@ -945,15 +967,19 @@ async function handleInit(projectDirArg, options) {
945
967
  try {
946
968
  const client = new ApiClient();
947
969
  let existingOrigins = [];
948
- let existingRedirectUris = [];
970
+ let existingEmailRedirectUris = [];
971
+ let existingGoogleClients = null;
949
972
  try {
950
973
  const currentSettings = await client.getAppSettings(appId);
951
974
  if (currentSettings.corsMode === "custom" &&
952
975
  Array.isArray(currentSettings.corsAllowedOrigins)) {
953
976
  existingOrigins = currentSettings.corsAllowedOrigins;
954
977
  }
955
- if (Array.isArray(currentSettings.redirectUris)) {
956
- existingRedirectUris = currentSettings.redirectUris;
978
+ if (Array.isArray(currentSettings.emailRedirectUris)) {
979
+ existingEmailRedirectUris = currentSettings.emailRedirectUris;
980
+ }
981
+ if (currentSettings.googleClients) {
982
+ existingGoogleClients = currentSettings.googleClients;
957
983
  }
958
984
  }
959
985
  catch {
@@ -961,18 +987,45 @@ async function handleInit(projectDirArg, options) {
961
987
  }
962
988
  // Always include 5173 since it's the universal localhost default
963
989
  const corsOrigins = Array.from(new Set([...existingOrigins, defaultOrigin, devOrigin]));
964
- const redirectUris = Array.from(new Set([
965
- ...existingRedirectUris,
990
+ // MERGED into the creation-time seed, never replacing it (#2891):
991
+ // `emailRedirectUris` matching is fail-closed, so blindly writing
992
+ // only this port's callback would break every other environment the
993
+ // app already serves.
994
+ const emailRedirectUris = Array.from(new Set([
995
+ ...existingEmailRedirectUris,
966
996
  `${defaultOrigin}/oauth/callback`,
967
997
  `${devOrigin}/oauth/callback`,
968
998
  ]));
969
- await client.updateAppSettings(appId, {
999
+ const settingsUpdate = {
970
1000
  corsMode: "custom",
971
1001
  corsAllowedOrigins: corsOrigins,
972
1002
  corsAllowCredentials: true,
973
- redirectUris,
1003
+ emailRedirectUris,
974
1004
  baseUrl: devOrigin,
975
- });
1005
+ };
1006
+ // A Google web client redirects to this dev origin too, so its own
1007
+ // `redirectUris` needs the callback. A PUT replaces the WHOLE map,
1008
+ // so the complete map is sent back — an entry for a platform this
1009
+ // scaffold does not touch (ios, desktop, …) would otherwise be
1010
+ // deleted as a side effect of choosing a dev port.
1011
+ const webEntry = existingGoogleClients?.clients?.web;
1012
+ if (webEntry) {
1013
+ settingsUpdate.googleClients = {
1014
+ ...existingGoogleClients,
1015
+ clients: {
1016
+ ...existingGoogleClients.clients,
1017
+ web: {
1018
+ ...webEntry,
1019
+ redirectUris: Array.from(new Set([
1020
+ ...(webEntry.redirectUris ?? []),
1021
+ `${defaultOrigin}/oauth/callback`,
1022
+ `${devOrigin}/oauth/callback`,
1023
+ ])),
1024
+ },
1025
+ },
1026
+ };
1027
+ }
1028
+ await client.updateAppSettings(appId, settingsUpdate);
976
1029
  success(`Dev port set to ${chosenPort}: ${viteUpdated ? "vite.config.ts, " : ""}.env, CORS, redirect URIs, and base URL updated.`);
977
1030
  }
978
1031
  catch (err) {