primitive-admin 1.1.0-alpha.4 → 1.1.0-alpha.41

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 (219) hide show
  1. package/README.md +325 -31
  2. package/assets/skill/skills/primitive-platform/SKILL.md +281 -0
  3. package/dist/bin/primitive.d.ts +2 -0
  4. package/dist/bin/primitive.js +268 -16
  5. package/dist/bin/primitive.js.map +1 -1
  6. package/dist/src/commands/admins.d.ts +2 -0
  7. package/dist/src/commands/admins.js +123 -18
  8. package/dist/src/commands/admins.js.map +1 -1
  9. package/dist/src/commands/analytics.d.ts +2 -0
  10. package/dist/src/commands/analytics.js +464 -55
  11. package/dist/src/commands/analytics.js.map +1 -1
  12. package/dist/src/commands/apps.d.ts +2 -0
  13. package/dist/src/commands/apps.js +55 -13
  14. package/dist/src/commands/apps.js.map +1 -1
  15. package/dist/src/commands/auth.d.ts +2 -0
  16. package/dist/src/commands/auth.js +177 -7
  17. package/dist/src/commands/auth.js.map +1 -1
  18. package/dist/src/commands/blob-buckets.d.ts +2 -0
  19. package/dist/src/commands/blob-buckets.js +422 -0
  20. package/dist/src/commands/blob-buckets.js.map +1 -0
  21. package/dist/src/commands/catalog.d.ts +2 -0
  22. package/dist/src/commands/catalog.js +34 -35
  23. package/dist/src/commands/catalog.js.map +1 -1
  24. package/dist/src/commands/collection-type-configs.d.ts +2 -0
  25. package/dist/src/commands/collection-type-configs.js +178 -0
  26. package/dist/src/commands/collection-type-configs.js.map +1 -0
  27. package/dist/src/commands/collections.d.ts +2 -0
  28. package/dist/src/commands/collections.js +515 -0
  29. package/dist/src/commands/collections.js.map +1 -0
  30. package/dist/src/commands/comparisons.d.ts +2 -0
  31. package/dist/src/commands/comparisons.js +6 -6
  32. package/dist/src/commands/comparisons.js.map +1 -1
  33. package/dist/src/commands/cron-triggers.d.ts +2 -0
  34. package/dist/src/commands/cron-triggers.js +357 -0
  35. package/dist/src/commands/cron-triggers.js.map +1 -0
  36. package/dist/src/commands/database-types.d.ts +2 -0
  37. package/dist/src/commands/database-types.js +471 -0
  38. package/dist/src/commands/database-types.js.map +1 -0
  39. package/dist/src/commands/databases.d.ts +2 -0
  40. package/dist/src/commands/databases.js +1462 -83
  41. package/dist/src/commands/databases.js.map +1 -1
  42. package/dist/src/commands/documents.d.ts +2 -0
  43. package/dist/src/commands/documents.js +518 -11
  44. package/dist/src/commands/documents.js.map +1 -1
  45. package/dist/src/commands/email-templates.d.ts +2 -0
  46. package/dist/src/commands/email-templates.js +281 -0
  47. package/dist/src/commands/email-templates.js.map +1 -0
  48. package/dist/src/commands/env.d.ts +12 -0
  49. package/dist/src/commands/env.js +260 -0
  50. package/dist/src/commands/env.js.map +1 -0
  51. package/dist/src/commands/group-type-configs.d.ts +2 -0
  52. package/dist/src/commands/group-type-configs.js +181 -0
  53. package/dist/src/commands/group-type-configs.js.map +1 -0
  54. package/dist/src/commands/groups.d.ts +2 -0
  55. package/dist/src/commands/groups.js +48 -45
  56. package/dist/src/commands/groups.js.map +1 -1
  57. package/dist/src/commands/guides.d.ts +159 -0
  58. package/dist/src/commands/guides.js +449 -35
  59. package/dist/src/commands/guides.js.map +1 -1
  60. package/dist/src/commands/init.d.ts +17 -0
  61. package/dist/src/commands/init.js +811 -201
  62. package/dist/src/commands/init.js.map +1 -1
  63. package/dist/src/commands/integrations.d.ts +2 -0
  64. package/dist/src/commands/integrations.js +533 -46
  65. package/dist/src/commands/integrations.js.map +1 -1
  66. package/dist/src/commands/llm.d.ts +2 -0
  67. package/dist/src/commands/llm.js +4 -2
  68. package/dist/src/commands/llm.js.map +1 -1
  69. package/dist/src/commands/metadata.d.ts +2 -0
  70. package/dist/src/commands/metadata.js +194 -0
  71. package/dist/src/commands/metadata.js.map +1 -0
  72. package/dist/src/commands/prompts.d.ts +2 -0
  73. package/dist/src/commands/prompts.js +50 -52
  74. package/dist/src/commands/prompts.js.map +1 -1
  75. package/dist/src/commands/rule-sets.d.ts +3 -0
  76. package/dist/src/commands/rule-sets.js +388 -0
  77. package/dist/src/commands/rule-sets.js.map +1 -0
  78. package/dist/src/commands/scripts.d.ts +2 -0
  79. package/dist/src/commands/scripts.js +667 -0
  80. package/dist/src/commands/scripts.js.map +1 -0
  81. package/dist/src/commands/secrets.d.ts +2 -0
  82. package/dist/src/commands/secrets.js +108 -0
  83. package/dist/src/commands/secrets.js.map +1 -0
  84. package/dist/src/commands/skill.d.ts +2 -0
  85. package/dist/src/commands/skill.js +29 -0
  86. package/dist/src/commands/skill.js.map +1 -0
  87. package/dist/src/commands/sync.d.ts +175 -0
  88. package/dist/src/commands/sync.js +4412 -233
  89. package/dist/src/commands/sync.js.map +1 -1
  90. package/dist/src/commands/tokens.d.ts +2 -0
  91. package/dist/src/commands/tokens.js +122 -19
  92. package/dist/src/commands/tokens.js.map +1 -1
  93. package/dist/src/commands/users.d.ts +2 -0
  94. package/dist/src/commands/users.js +440 -22
  95. package/dist/src/commands/users.js.map +1 -1
  96. package/dist/src/commands/waitlist.d.ts +2 -0
  97. package/dist/src/commands/waitlist.js +10 -10
  98. package/dist/src/commands/waitlist.js.map +1 -1
  99. package/dist/src/commands/webhooks.d.ts +2 -0
  100. package/dist/src/commands/webhooks.js +391 -0
  101. package/dist/src/commands/webhooks.js.map +1 -0
  102. package/dist/src/commands/workflows.d.ts +49 -0
  103. package/dist/src/commands/workflows.js +1009 -123
  104. package/dist/src/commands/workflows.js.map +1 -1
  105. package/dist/src/lib/api-client.d.ts +1283 -0
  106. package/dist/src/lib/api-client.js +1129 -83
  107. package/dist/src/lib/api-client.js.map +1 -1
  108. package/dist/src/lib/auth-flow.d.ts +8 -0
  109. package/dist/src/lib/block-layout.d.ts +160 -0
  110. package/dist/src/lib/block-layout.js +451 -0
  111. package/dist/src/lib/block-layout.js.map +1 -0
  112. package/dist/src/lib/cli-manifest.d.ts +60 -0
  113. package/dist/src/lib/cli-manifest.js +70 -0
  114. package/dist/src/lib/cli-manifest.js.map +1 -0
  115. package/dist/src/lib/config.d.ts +53 -0
  116. package/dist/src/lib/config.js +92 -53
  117. package/dist/src/lib/config.js.map +1 -1
  118. package/dist/src/lib/confirm-prompt.d.ts +83 -0
  119. package/dist/src/lib/confirm-prompt.js +110 -0
  120. package/dist/src/lib/confirm-prompt.js.map +1 -0
  121. package/dist/src/lib/constants.d.ts +2 -0
  122. package/dist/src/lib/constants.js +3 -0
  123. package/dist/src/lib/constants.js.map +1 -0
  124. package/dist/src/lib/crash-handlers.d.ts +20 -0
  125. package/dist/src/lib/crash-handlers.js +49 -0
  126. package/dist/src/lib/crash-handlers.js.map +1 -0
  127. package/dist/src/lib/credentials-store.d.ts +79 -0
  128. package/dist/src/lib/credentials-store.js +307 -0
  129. package/dist/src/lib/credentials-store.js.map +1 -0
  130. package/dist/src/lib/csv.d.ts +48 -0
  131. package/dist/src/lib/csv.js +177 -0
  132. package/dist/src/lib/csv.js.map +1 -0
  133. package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
  134. package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
  135. package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
  136. package/dist/src/lib/db-codegen/dbGenerator.d.ts +111 -0
  137. package/dist/src/lib/db-codegen/dbGenerator.js +371 -0
  138. package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
  139. package/dist/src/lib/db-codegen/dbNaming.d.ts +45 -0
  140. package/dist/src/lib/db-codegen/dbNaming.js +104 -0
  141. package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
  142. package/dist/src/lib/db-codegen/dbTemplates.d.ts +97 -0
  143. package/dist/src/lib/db-codegen/dbTemplates.js +159 -0
  144. package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
  145. package/dist/src/lib/db-codegen/dbTsTypes.d.ts +78 -0
  146. package/dist/src/lib/db-codegen/dbTsTypes.js +112 -0
  147. package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
  148. package/dist/src/lib/env-resolver.d.ts +62 -0
  149. package/dist/src/lib/env-resolver.js +121 -0
  150. package/dist/src/lib/env-resolver.js.map +1 -0
  151. package/dist/src/lib/fetch.d.ts +5 -0
  152. package/dist/src/lib/generated-allowlist.d.ts +28 -0
  153. package/dist/src/lib/generated-allowlist.js +220 -0
  154. package/dist/src/lib/generated-allowlist.js.map +1 -0
  155. package/dist/src/lib/init-config.d.ts +59 -0
  156. package/dist/src/lib/init-config.js +113 -0
  157. package/dist/src/lib/init-config.js.map +1 -0
  158. package/dist/src/lib/migration-nag.d.ts +49 -0
  159. package/dist/src/lib/migration-nag.js +163 -0
  160. package/dist/src/lib/migration-nag.js.map +1 -0
  161. package/dist/src/lib/output.d.ts +86 -0
  162. package/dist/src/lib/output.js +150 -8
  163. package/dist/src/lib/output.js.map +1 -1
  164. package/dist/src/lib/paginate.d.ts +33 -0
  165. package/dist/src/lib/paginate.js +42 -0
  166. package/dist/src/lib/paginate.js.map +1 -0
  167. package/dist/src/lib/project-config.d.ts +97 -0
  168. package/dist/src/lib/project-config.js +209 -0
  169. package/dist/src/lib/project-config.js.map +1 -0
  170. package/dist/src/lib/query-operators.d.ts +43 -0
  171. package/dist/src/lib/query-operators.js +80 -0
  172. package/dist/src/lib/query-operators.js.map +1 -0
  173. package/dist/src/lib/refresh-admin-credentials.d.ts +65 -0
  174. package/dist/src/lib/refresh-admin-credentials.js +103 -0
  175. package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
  176. package/dist/src/lib/resolve-platform.d.ts +45 -0
  177. package/dist/src/lib/resolve-platform.js +43 -0
  178. package/dist/src/lib/resolve-platform.js.map +1 -0
  179. package/dist/src/lib/skill-installer.d.ts +23 -0
  180. package/dist/src/lib/skill-installer.js +135 -0
  181. package/dist/src/lib/skill-installer.js.map +1 -0
  182. package/dist/src/lib/snapshots.d.ts +99 -0
  183. package/dist/src/lib/snapshots.js +357 -0
  184. package/dist/src/lib/snapshots.js.map +1 -0
  185. package/dist/src/lib/sync-paths.d.ts +72 -0
  186. package/dist/src/lib/sync-paths.js +130 -0
  187. package/dist/src/lib/sync-paths.js.map +1 -0
  188. package/dist/src/lib/template.d.ts +97 -0
  189. package/dist/src/lib/template.js +336 -62
  190. package/dist/src/lib/template.js.map +1 -1
  191. package/dist/src/lib/token-inject.d.ts +56 -0
  192. package/dist/src/lib/token-inject.js +204 -0
  193. package/dist/src/lib/token-inject.js.map +1 -0
  194. package/dist/src/lib/toml-database-config.d.ts +152 -0
  195. package/dist/src/lib/toml-database-config.js +600 -0
  196. package/dist/src/lib/toml-database-config.js.map +1 -0
  197. package/dist/src/lib/toml-metadata-config.d.ts +139 -0
  198. package/dist/src/lib/toml-metadata-config.js +427 -0
  199. package/dist/src/lib/toml-metadata-config.js.map +1 -0
  200. package/dist/src/lib/toml-params-validator.d.ts +129 -0
  201. package/dist/src/lib/toml-params-validator.js +298 -0
  202. package/dist/src/lib/toml-params-validator.js.map +1 -0
  203. package/dist/src/lib/version-check.d.ts +10 -0
  204. package/dist/src/lib/version-check.js +172 -0
  205. package/dist/src/lib/version-check.js.map +1 -0
  206. package/dist/src/lib/workflow-apply.d.ts +66 -0
  207. package/dist/src/lib/workflow-apply.js +117 -0
  208. package/dist/src/lib/workflow-apply.js.map +1 -0
  209. package/dist/src/lib/workflow-fragments.d.ts +41 -0
  210. package/dist/src/lib/workflow-fragments.js +121 -0
  211. package/dist/src/lib/workflow-fragments.js.map +1 -0
  212. package/dist/src/lib/workflow-toml-validator.d.ts +95 -0
  213. package/dist/src/lib/workflow-toml-validator.js +323 -0
  214. package/dist/src/lib/workflow-toml-validator.js.map +1 -0
  215. package/dist/src/types/index.d.ts +520 -0
  216. package/dist/src/validators.d.ts +64 -0
  217. package/dist/src/validators.js +63 -0
  218. package/dist/src/validators.js.map +1 -0
  219. package/package.json +18 -4
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Credentials storage with dual-mode support.
3
+ *
4
+ * Mode A (project mode): credentials live at
5
+ * <projectRoot>/.primitive/credentials.json
6
+ * with per-environment slots:
7
+ * {
8
+ * "environments": {
9
+ * "dev": { "accessToken": "...", "refreshToken": "...", ... },
10
+ * "prod": { ... }
11
+ * }
12
+ * }
13
+ *
14
+ * Mode B (legacy mode): no .primitive/config.json in scope, so we fall back to
15
+ * ~/.primitive/credentials.json
16
+ * with the flat Credentials shape the CLI has always used.
17
+ *
18
+ * The legacy mode is still the "global default" for users who haven't
19
+ * run `primitive init` yet.
20
+ */
21
+ import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync, } from "fs";
22
+ import { homedir } from "os";
23
+ import { join } from "path";
24
+ import { getCurrentEnvironment, getProjectConfig } from "./env-resolver.js";
25
+ export const PROJECT_LOCAL_DIR = ".primitive";
26
+ export const PROJECT_CREDENTIALS_FILENAME = "credentials.json";
27
+ /**
28
+ * Resolves the legacy config dir on each call (rather than capturing it
29
+ * at module load) so tests and environment variables can override it
30
+ * after the module has already been imported.
31
+ */
32
+ function getLegacyConfigDir() {
33
+ return process.env.PRIMITIVE_CONFIG_DIR || join(homedir(), ".primitive");
34
+ }
35
+ function getLegacyCredentialsFile() {
36
+ return join(getLegacyConfigDir(), PROJECT_CREDENTIALS_FILENAME);
37
+ }
38
+ /** Returns true when a .primitive/config.json is in scope (project mode active). */
39
+ export function isProjectMode() {
40
+ return getProjectConfig() !== null;
41
+ }
42
+ /**
43
+ * Returns the path to the credentials file that will be used, based on
44
+ * whether we're in project mode or legacy mode.
45
+ */
46
+ export function getCredentialsFilePath() {
47
+ const env = resolveCurrentEnvironment();
48
+ if (env) {
49
+ return join(env.projectRoot, PROJECT_LOCAL_DIR, PROJECT_CREDENTIALS_FILENAME);
50
+ }
51
+ return getLegacyCredentialsFile();
52
+ }
53
+ /**
54
+ * Resolves the current environment. If an environment CAN'T be resolved
55
+ * (e.g. --env points at an unknown name), this throws — we never silently
56
+ * fall back to legacy credentials because a typo in the env name must not
57
+ * cause the CLI to operate against the wrong app/server.
58
+ *
59
+ * Returns null only in genuine legacy mode (no project config found at all).
60
+ */
61
+ function resolveCurrentEnvironment() {
62
+ return getCurrentEnvironment();
63
+ }
64
+ function ensureDir(dir) {
65
+ if (!existsSync(dir)) {
66
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
67
+ }
68
+ }
69
+ function readJsonFile(path) {
70
+ try {
71
+ if (!existsSync(path))
72
+ return null;
73
+ const data = readFileSync(path, "utf-8");
74
+ return JSON.parse(data);
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ /**
81
+ * Loads a legacy (global) credentials file. Used for backwards compat.
82
+ */
83
+ function loadLegacyCredentials() {
84
+ return readJsonFile(getLegacyCredentialsFile());
85
+ }
86
+ /**
87
+ * Loads the project credentials file, if present. Never throws — returns
88
+ * an empty shape when the file is missing or unreadable.
89
+ */
90
+ function loadProjectCredentialsFile(projectRoot) {
91
+ const path = join(projectRoot, PROJECT_LOCAL_DIR, PROJECT_CREDENTIALS_FILENAME);
92
+ const data = readJsonFile(path);
93
+ if (!data || typeof data !== "object" || !data.environments) {
94
+ return { environments: {} };
95
+ }
96
+ return data;
97
+ }
98
+ function writeProjectCredentialsFile(projectRoot, file) {
99
+ const dir = join(projectRoot, PROJECT_LOCAL_DIR);
100
+ ensureDir(dir);
101
+ const path = join(dir, PROJECT_CREDENTIALS_FILENAME);
102
+ writeFileSync(path, JSON.stringify(file, null, 2), { mode: 0o600 });
103
+ try {
104
+ chmodSync(path, 0o600);
105
+ }
106
+ catch {
107
+ // Best-effort on Windows / weird filesystems
108
+ }
109
+ }
110
+ /**
111
+ * Reads credentials for the current environment (project mode) or the
112
+ * legacy global file. Returns the standard Credentials shape so existing
113
+ * callers don't need to change.
114
+ *
115
+ * In project mode, we blend the per-env stored creds with the serverUrl
116
+ * and appId from .primitive/config.json to produce the Credentials the rest of
117
+ * the CLI expects.
118
+ */
119
+ export function loadCredentialsStore() {
120
+ const env = resolveCurrentEnvironment();
121
+ if (!env) {
122
+ return loadLegacyCredentials();
123
+ }
124
+ const file = loadProjectCredentialsFile(env.projectRoot);
125
+ const stored = file.environments[env.name];
126
+ if (!stored)
127
+ return null;
128
+ return {
129
+ serverUrl: env.config.apiUrl,
130
+ accessToken: stored.accessToken,
131
+ refreshToken: stored.refreshToken,
132
+ expiresAt: stored.expiresAt,
133
+ adminId: stored.adminId,
134
+ email: stored.email,
135
+ role: stored.role,
136
+ name: stored.name,
137
+ // Prefer the project-level appId (canonical); fall back to the stored
138
+ // per-session current app for compatibility.
139
+ currentAppId: env.config.appId || stored.currentAppId,
140
+ currentAppName: env.config.appName || stored.currentAppName,
141
+ globalAdminAppId: stored.globalAdminAppId,
142
+ };
143
+ }
144
+ /**
145
+ * Saves credentials. In project mode, writes to the per-env slot in the
146
+ * project credentials file. In legacy mode, writes the global file.
147
+ *
148
+ * The serverUrl on the incoming Credentials is used as-is for legacy
149
+ * mode, and ignored in project mode (the env's apiUrl is canonical).
150
+ */
151
+ export function saveCredentialsStore(credentials) {
152
+ const env = resolveCurrentEnvironment();
153
+ if (!env) {
154
+ ensureDir(getLegacyConfigDir());
155
+ writeFileSync(getLegacyCredentialsFile(), JSON.stringify(credentials, null, 2), {
156
+ mode: 0o600,
157
+ });
158
+ try {
159
+ chmodSync(getLegacyCredentialsFile(), 0o600);
160
+ }
161
+ catch {
162
+ // Best-effort
163
+ }
164
+ return;
165
+ }
166
+ const file = loadProjectCredentialsFile(env.projectRoot);
167
+ file.environments[env.name] = {
168
+ accessToken: credentials.accessToken,
169
+ refreshToken: credentials.refreshToken,
170
+ expiresAt: credentials.expiresAt,
171
+ adminId: credentials.adminId,
172
+ email: credentials.email,
173
+ role: credentials.role,
174
+ name: credentials.name,
175
+ globalAdminAppId: credentials.globalAdminAppId,
176
+ // Only persist currentAppId/Name when they're NOT already declared
177
+ // in .primitive/config.json — otherwise the project config is the source of
178
+ // truth.
179
+ currentAppId: env.config.appId ? undefined : credentials.currentAppId,
180
+ currentAppName: env.config.appName ? undefined : credentials.currentAppName,
181
+ };
182
+ writeProjectCredentialsFile(env.projectRoot, file);
183
+ }
184
+ /**
185
+ * Clears credentials for the current environment (project mode) or
186
+ * deletes the legacy file (legacy mode).
187
+ */
188
+ export function clearCredentialsStore() {
189
+ const env = resolveCurrentEnvironment();
190
+ if (!env) {
191
+ try {
192
+ if (existsSync(getLegacyCredentialsFile())) {
193
+ unlinkSync(getLegacyCredentialsFile());
194
+ }
195
+ }
196
+ catch {
197
+ // Ignore
198
+ }
199
+ return;
200
+ }
201
+ const file = loadProjectCredentialsFile(env.projectRoot);
202
+ delete file.environments[env.name];
203
+ writeProjectCredentialsFile(env.projectRoot, file);
204
+ }
205
+ /**
206
+ * Removes the credentials slot for the named environment in a specific
207
+ * project's credentials file. Used by `env remove` so stale tokens from a
208
+ * previously-removed environment can never be silently re-used if the same
209
+ * name is later added back. Never throws.
210
+ */
211
+ export function clearCredentialsForEnvInProject(projectRoot, envName) {
212
+ try {
213
+ const file = loadProjectCredentialsFile(projectRoot);
214
+ if (file.environments[envName]) {
215
+ delete file.environments[envName];
216
+ writeProjectCredentialsFile(projectRoot, file);
217
+ }
218
+ }
219
+ catch {
220
+ // Best-effort — removal is not a hard requirement for env removal to succeed.
221
+ }
222
+ }
223
+ /**
224
+ * Lists all environments that have stored credentials in project mode.
225
+ * Returns an empty array in legacy mode.
226
+ */
227
+ export function listAuthenticatedEnvironments() {
228
+ const env = resolveCurrentEnvironment();
229
+ if (!env)
230
+ return [];
231
+ const file = loadProjectCredentialsFile(env.projectRoot);
232
+ return Object.keys(file.environments);
233
+ }
234
+ /**
235
+ * Updates the "current app" in credential storage. In project mode with a
236
+ * project-level appId this is a no-op (the project config is canonical).
237
+ */
238
+ export function setCurrentAppStore(appId, appName) {
239
+ const env = resolveCurrentEnvironment();
240
+ if (!env) {
241
+ // Legacy mode — mutate the global credentials file directly.
242
+ const creds = loadLegacyCredentials();
243
+ if (!creds) {
244
+ throw new Error("Not logged in. Run 'primitive login' first.");
245
+ }
246
+ creds.currentAppId = appId;
247
+ creds.currentAppName = appName;
248
+ ensureDir(getLegacyConfigDir());
249
+ writeFileSync(getLegacyCredentialsFile(), JSON.stringify(creds, null, 2), {
250
+ mode: 0o600,
251
+ });
252
+ return;
253
+ }
254
+ // Project mode: if the env already has an appId in .primitive/config.json, we
255
+ // don't overwrite it here (use `primitive env use` or edit .primitive/config.json
256
+ // to change the project binding). We *do* store a per-session override
257
+ // in credentials for environments without a declared appId.
258
+ if (env.config.appId) {
259
+ // No-op: env is bound to a specific appId in .primitive/config.json
260
+ return;
261
+ }
262
+ const file = loadProjectCredentialsFile(env.projectRoot);
263
+ const slot = file.environments[env.name];
264
+ if (!slot) {
265
+ throw new Error(`Not logged in to environment "${env.name}". Run 'primitive login --env ${env.name}' first.`);
266
+ }
267
+ slot.currentAppId = appId;
268
+ slot.currentAppName = appName;
269
+ writeProjectCredentialsFile(env.projectRoot, file);
270
+ }
271
+ /**
272
+ * Clears the "current app" for the current environment.
273
+ */
274
+ export function clearCurrentAppStore() {
275
+ const env = resolveCurrentEnvironment();
276
+ if (!env) {
277
+ const creds = loadLegacyCredentials();
278
+ if (!creds)
279
+ return;
280
+ delete creds.currentAppId;
281
+ delete creds.currentAppName;
282
+ ensureDir(getLegacyConfigDir());
283
+ writeFileSync(getLegacyCredentialsFile(), JSON.stringify(creds, null, 2), {
284
+ mode: 0o600,
285
+ });
286
+ return;
287
+ }
288
+ if (env.config.appId) {
289
+ // Can't clear a project-bound app; the user should edit .primitive/config.json.
290
+ return;
291
+ }
292
+ const file = loadProjectCredentialsFile(env.projectRoot);
293
+ const slot = file.environments[env.name];
294
+ if (!slot)
295
+ return;
296
+ delete slot.currentAppId;
297
+ delete slot.currentAppName;
298
+ writeProjectCredentialsFile(env.projectRoot, file);
299
+ }
300
+ /**
301
+ * Returns the legacy credentials file, if one exists. Used by migration
302
+ * prompts that want to detect a pre-project-config install.
303
+ */
304
+ export function peekLegacyCredentials() {
305
+ return loadLegacyCredentials();
306
+ }
307
+ //# sourceMappingURL=credentials-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials-store.js","sourceRoot":"","sources":["../../../src/lib/credentials-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Parse a CSV string into an array of row objects keyed by header.
3
+ *
4
+ * Quote-aware: respects double-quoted fields that may contain the delimiter,
5
+ * embedded newlines, and escaped double-quotes (`""`). Empty-string cells are
6
+ * omitted from the row object (matching the client). Headers-only / empty
7
+ * input yields `[]`.
8
+ */
9
+ export declare function parseCsv(csv: string, delimiter?: string): Record<string, string>[];
10
+ /**
11
+ * Coerce a string cell to a target type. Mirrors the client's `coerceValue`:
12
+ * a failed number coercion returns the original string (so the server's
13
+ * schema validation surfaces a precise error rather than a silent bad write).
14
+ */
15
+ export declare function coerceValue(value: string, type: string): any;
16
+ /**
17
+ * Rename row keys per a `{ "CSV Header": "fieldName" }` map. Keys not present
18
+ * in the map are preserved. No-op when `map` is undefined.
19
+ */
20
+ export declare function applyColumnMap(rows: Record<string, any>[], map: Record<string, string> | undefined): Record<string, any>[];
21
+ export interface BuildRowsOptions {
22
+ /** Model name passed in each batch item's params. */
23
+ modelName: string;
24
+ /** Type coercion overrides keyed by (post-column-map) field name. */
25
+ types?: Record<string, string>;
26
+ /** CSV column whose value to use as the record id (else a ULID is generated). */
27
+ idColumn?: string;
28
+ }
29
+ export interface BatchItem {
30
+ params: {
31
+ modelName: string;
32
+ id: string;
33
+ data: Record<string, any>;
34
+ };
35
+ }
36
+ export interface BuildRowsResult {
37
+ batch: BatchItem[];
38
+ rowCount: number;
39
+ }
40
+ /**
41
+ * Apply type coercion, assign each row an id (from `idColumn` or a generated
42
+ * ULID), and shape rows into `executeBatch` items
43
+ * (`{ params: { modelName, id, data } }`). Mirrors steps 5–7 of the client's
44
+ * `importCsv`.
45
+ */
46
+ export declare function buildRows(rows: Record<string, any>[], options: BuildRowsOptions): BuildRowsResult;
47
+ /** Split an array into fixed-size chunks. */
48
+ export declare function chunk<T>(items: T[], size: number): T[][];
@@ -0,0 +1,177 @@
1
+ /**
2
+ * CSV parsing + value coercion for `primitive databases import-csv`.
3
+ *
4
+ * This is a **thin port** of the client library's reference implementation
5
+ * (`src/client/api/databasesApi.ts` `parseCsv` :21 / `coerceValue` :94) so the
6
+ * CLI's import semantics match the client's `importCsv` exactly. It is a
7
+ * conscious 4th copy of the parser (client, web-admin, sample helper, now CLI);
8
+ * the shared-core extraction (design Option C) is deferred. **Parser edge-case
9
+ * fixes must be replicated across all copies** — see the plan-of-record
10
+ * duplication note (#145 Codex finding (b)).
11
+ *
12
+ * Zero dependencies beyond `ulid` (already a repo dependency).
13
+ */
14
+ import { ulid } from "ulid";
15
+ /**
16
+ * Parse a CSV string into an array of row objects keyed by header.
17
+ *
18
+ * Quote-aware: respects double-quoted fields that may contain the delimiter,
19
+ * embedded newlines, and escaped double-quotes (`""`). Empty-string cells are
20
+ * omitted from the row object (matching the client). Headers-only / empty
21
+ * input yields `[]`.
22
+ */
23
+ export function parseCsv(csv, delimiter = ",") {
24
+ // Split into lines respecting quoted fields (which may contain newlines).
25
+ const lines = [];
26
+ let current = "";
27
+ let inQuotes = false;
28
+ for (let i = 0; i < csv.length; i++) {
29
+ const ch = csv[i];
30
+ if (ch === '"') {
31
+ if (inQuotes && i + 1 < csv.length && csv[i + 1] === '"') {
32
+ current += '"';
33
+ i++;
34
+ }
35
+ else {
36
+ inQuotes = !inQuotes;
37
+ }
38
+ current += ch;
39
+ }
40
+ else if ((ch === "\n" || ch === "\r") && !inQuotes) {
41
+ lines.push(current);
42
+ current = "";
43
+ if (ch === "\r" && i + 1 < csv.length && csv[i + 1] === "\n")
44
+ i++;
45
+ }
46
+ else {
47
+ current += ch;
48
+ }
49
+ }
50
+ if (current.length > 0)
51
+ lines.push(current);
52
+ const result = [];
53
+ if (lines.length === 0)
54
+ return result;
55
+ const parseRow = (line) => {
56
+ const fields = [];
57
+ let field = "";
58
+ let q = false;
59
+ let wasQuoted = false;
60
+ for (let i = 0; i < line.length; i++) {
61
+ const ch = line[i];
62
+ if (ch === '"') {
63
+ if (q && i + 1 < line.length && line[i + 1] === '"') {
64
+ field += '"';
65
+ i++;
66
+ }
67
+ else {
68
+ q = !q;
69
+ if (q)
70
+ wasQuoted = true;
71
+ }
72
+ }
73
+ else if (ch === delimiter && !q) {
74
+ fields.push(wasQuoted ? field : field.trim());
75
+ field = "";
76
+ wasQuoted = false;
77
+ }
78
+ else {
79
+ field += ch;
80
+ }
81
+ }
82
+ fields.push(wasQuoted ? field : field.trim());
83
+ return fields;
84
+ };
85
+ const headers = parseRow(lines[0]);
86
+ for (let i = 1; i < lines.length; i++) {
87
+ const line = lines[i].trim();
88
+ if (!line)
89
+ continue;
90
+ const values = parseRow(line);
91
+ const row = {};
92
+ headers.forEach((h, idx) => {
93
+ if (values[idx] !== undefined && values[idx] !== "") {
94
+ row[h] = values[idx];
95
+ }
96
+ });
97
+ if (Object.keys(row).length > 0) {
98
+ result.push(row);
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ /**
104
+ * Coerce a string cell to a target type. Mirrors the client's `coerceValue`:
105
+ * a failed number coercion returns the original string (so the server's
106
+ * schema validation surfaces a precise error rather than a silent bad write).
107
+ */
108
+ export function coerceValue(value, type) {
109
+ switch (type) {
110
+ case "number": {
111
+ const n = Number(value);
112
+ return isNaN(n) ? value : n;
113
+ }
114
+ case "boolean":
115
+ return value === "true" || value === "1" || value === "yes";
116
+ default:
117
+ return value;
118
+ }
119
+ }
120
+ /**
121
+ * Rename row keys per a `{ "CSV Header": "fieldName" }` map. Keys not present
122
+ * in the map are preserved. No-op when `map` is undefined.
123
+ */
124
+ export function applyColumnMap(rows, map) {
125
+ if (!map)
126
+ return rows;
127
+ return rows.map((row) => {
128
+ const mapped = {};
129
+ for (const [key, value] of Object.entries(row)) {
130
+ const newKey = map[key] ?? key;
131
+ mapped[newKey] = value;
132
+ }
133
+ return mapped;
134
+ });
135
+ }
136
+ /**
137
+ * Apply type coercion, assign each row an id (from `idColumn` or a generated
138
+ * ULID), and shape rows into `executeBatch` items
139
+ * (`{ params: { modelName, id, data } }`). Mirrors steps 5–7 of the client's
140
+ * `importCsv`.
141
+ */
142
+ export function buildRows(rows, options) {
143
+ const typeMap = options.types ?? {};
144
+ const batch = [];
145
+ for (const original of rows) {
146
+ const row = { ...original };
147
+ // Type coercion (only string cells, only declared types).
148
+ for (const [field, targetType] of Object.entries(typeMap)) {
149
+ if (field in row && typeof row[field] === "string") {
150
+ row[field] = coerceValue(row[field], targetType);
151
+ }
152
+ }
153
+ // Assign id.
154
+ let id;
155
+ if (options.idColumn && row[options.idColumn] != null) {
156
+ id = String(row[options.idColumn]);
157
+ }
158
+ else if (row.id != null) {
159
+ id = String(row.id);
160
+ }
161
+ else {
162
+ id = ulid();
163
+ }
164
+ row.id = id;
165
+ batch.push({ params: { modelName: options.modelName, id, data: row } });
166
+ }
167
+ return { batch, rowCount: batch.length };
168
+ }
169
+ /** Split an array into fixed-size chunks. */
170
+ export function chunk(items, size) {
171
+ const out = [];
172
+ for (let i = 0; i < items.length; i += size) {
173
+ out.push(items.slice(i, i + size));
174
+ }
175
+ return out;
176
+ }
177
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/lib/csv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Short fingerprint for a database-type TOML string (issue #814).
3
+ *
4
+ * Stamped in the header of every generated file so a human (or the
5
+ * `--check` CI guard) can tell at a glance whether the source TOML and the
6
+ * generated output are in sync. Mirrors codegen-v2's `fingerprintToml`
7
+ * (`packages/js-bao/src/cli/v2/fingerprint.ts`): 16 hex chars of SHA-256 —
8
+ * enough for a sanity check, short enough to fit on one comment line.
9
+ */
10
+ export declare function fingerprintToml(tomlContent: string): string;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Short fingerprint for a database-type TOML string (issue #814).
3
+ *
4
+ * Stamped in the header of every generated file so a human (or the
5
+ * `--check` CI guard) can tell at a glance whether the source TOML and the
6
+ * generated output are in sync. Mirrors codegen-v2's `fingerprintToml`
7
+ * (`packages/js-bao/src/cli/v2/fingerprint.ts`): 16 hex chars of SHA-256 —
8
+ * enough for a sanity check, short enough to fit on one comment line.
9
+ */
10
+ import { createHash } from "crypto";
11
+ export function fingerprintToml(tomlContent) {
12
+ return createHash("sha256")
13
+ .update(tomlContent, "utf-8")
14
+ .digest("hex")
15
+ .slice(0, 16);
16
+ }
17
+ //# sourceMappingURL=dbFingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbFingerprint.js","sourceRoot":"","sources":["../../../../src/lib/db-codegen/dbFingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC;SAC5B,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}