primitive-admin 1.0.11 → 1.0.12

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.
@@ -3,6 +3,7 @@ import { Command } from "commander";
3
3
  import { readFileSync } from "fs";
4
4
  import { fileURLToPath } from "url";
5
5
  import { dirname, resolve } from "path";
6
+ import { registerInitCommand } from "../src/commands/init.js";
6
7
  import { registerAuthCommands } from "../src/commands/auth.js";
7
8
  import { registerAppsCommands } from "../src/commands/apps.js";
8
9
  import { registerUsersCommands } from "../src/commands/users.js";
@@ -49,7 +50,8 @@ App Context:
49
50
  Documentation:
50
51
  See https://primitive-labs.github.io/primitive-docs/ for full documentation.
51
52
  `);
52
- // Register all command groups
53
+ // Register all command groups (init first, then logically grouped)
54
+ registerInitCommand(program);
53
55
  registerAuthCommands(program);
54
56
  registerAppsCommands(program);
55
57
  registerUsersCommands(program);
@@ -1 +1 @@
1
- {"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"primitive.js","sourceRoot":"","sources":["../../bin/primitive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,347 @@
1
+ import { existsSync } from "fs";
2
+ import { resolve, basename } from "path";
3
+ import { input, confirm, select } from "@inquirer/prompts";
4
+ import { loadCredentials } from "../lib/config.js";
5
+ import { browserLogin } from "../lib/auth-flow.js";
6
+ import { ApiClient } from "../lib/api-client.js";
7
+ import { downloadAndExtractTemplate, updateEnvFile, isPnpmInstalled, installPnpm, runPnpmInstall, isDirectoryEmpty, } from "../lib/template.js";
8
+ import { success, error, info, warn, keyValue, divider, } from "../lib/output.js";
9
+ const DEFAULT_SERVER_URL = process.env.PRIMITIVE_SERVER_URL || "https://primitiveapi.com";
10
+ export function registerInitCommand(program) {
11
+ program
12
+ .command("init")
13
+ .description("Create a new Primitive app from template")
14
+ .argument("[directory]", "Directory to create the project in (default: current directory)")
15
+ .option("--use-existing-app-id <id>", "Use an existing app ID instead of creating a new one")
16
+ .option("-s, --server <url>", "Server URL", DEFAULT_SERVER_URL)
17
+ .option("--skip-install", "Skip running pnpm install")
18
+ .addHelpText("after", `
19
+ Examples:
20
+ $ primitive init my-app # Create in ./my-app, prompt for app name
21
+ $ primitive init # Interactive: prompt for directory and app name
22
+ $ primitive init . --use-existing-app-id 01HXY... # Use existing app in current dir
23
+ $ primitive init my-app --skip-install # Skip dependency install
24
+
25
+ This command will:
26
+ 1. Download the Primitive app template
27
+ 2. Prompt for an app name and create it on the Primitive server (or use existing)
28
+ 3. Configure the project with your app ID
29
+ 4. Install dependencies with pnpm
30
+ `)
31
+ .action(handleInit);
32
+ }
33
+ async function handleInit(projectDirArg, options) {
34
+ const serverUrl = options.server || DEFAULT_SERVER_URL;
35
+ // Step 1: Determine project directory
36
+ let projectDir = projectDirArg;
37
+ if (!projectDir) {
38
+ projectDir = await input({
39
+ message: "Where would you like to create the project?",
40
+ default: ".",
41
+ validate: (value) => {
42
+ if (!value.trim())
43
+ return "Directory cannot be empty";
44
+ return true;
45
+ },
46
+ });
47
+ }
48
+ const targetDir = resolve(process.cwd(), projectDir);
49
+ // Used as the default app name suggestion when prompting
50
+ const defaultAppName = projectDir === "." ? basename(targetDir) : projectDir;
51
+ // Step 2: Check if directory exists and is non-empty
52
+ if (existsSync(targetDir) && !isDirectoryEmpty(targetDir)) {
53
+ warn(`Directory "${projectDir}" already exists and is not empty.`);
54
+ const overwrite = await confirm({
55
+ message: "Do you want to overwrite the existing contents?",
56
+ default: false,
57
+ });
58
+ if (!overwrite) {
59
+ error("Aborted. Please choose a different project name.");
60
+ process.exit(1);
61
+ }
62
+ }
63
+ // Step 3: Download template
64
+ info("Setting up your project...");
65
+ try {
66
+ await downloadAndExtractTemplate({
67
+ targetDir,
68
+ onProgress: info,
69
+ });
70
+ }
71
+ catch (err) {
72
+ error(`Failed to download template: ${err.message}`);
73
+ error("Check your internet connection and try again.");
74
+ process.exit(1);
75
+ }
76
+ // Step 4: Check authentication
77
+ let credentials = loadCredentials();
78
+ let appId;
79
+ let appName;
80
+ if (options.useExistingAppId) {
81
+ // Using existing app ID - verify it exists
82
+ appId = options.useExistingAppId;
83
+ appName = "(existing app)"; // Default if we can't verify
84
+ if (!credentials) {
85
+ info("You need to log in to verify the app.");
86
+ const shouldLogin = await confirm({
87
+ message: "Log in now?",
88
+ default: true,
89
+ });
90
+ if (shouldLogin) {
91
+ const result = await browserLogin(serverUrl);
92
+ if (!result.success) {
93
+ error(`Login failed: ${result.error}`);
94
+ warn(`Template files were extracted to "${targetDir}" but VITE_APP_ID is not configured.`);
95
+ warn("You'll need to manually set VITE_APP_ID in your .env file to use this project.");
96
+ process.exit(1);
97
+ }
98
+ credentials = result.credentials;
99
+ success(`Logged in as ${credentials.email}`);
100
+ }
101
+ else {
102
+ warn("Skipping app verification. Make sure the app ID is correct.");
103
+ }
104
+ }
105
+ if (credentials) {
106
+ try {
107
+ const client = new ApiClient();
108
+ const appInfo = await client.getApp(appId);
109
+ appName = appInfo.name;
110
+ info(`Using existing app: ${appName}`);
111
+ }
112
+ catch (err) {
113
+ warn(`Could not verify app: ${err.message}`);
114
+ }
115
+ }
116
+ }
117
+ else {
118
+ // Creating new app - authentication required
119
+ if (!credentials) {
120
+ info("You need to log in to create an app.");
121
+ const shouldLogin = await confirm({
122
+ message: "Log in now?",
123
+ default: true,
124
+ });
125
+ if (!shouldLogin) {
126
+ error("Cannot create app without authentication. Use --use-existing-app-id to skip app creation.");
127
+ warn(`Template files were extracted to "${targetDir}" but VITE_APP_ID is not configured.`);
128
+ warn("You'll need to manually set VITE_APP_ID in your .env file to use this project.");
129
+ process.exit(1);
130
+ }
131
+ const result = await browserLogin(serverUrl);
132
+ if (!result.success) {
133
+ error(`Login failed: ${result.error}`);
134
+ warn(`Template files were extracted to "${targetDir}" but VITE_APP_ID is not configured.`);
135
+ warn("You'll need to manually set VITE_APP_ID in your .env file to use this project.");
136
+ process.exit(1);
137
+ }
138
+ credentials = result.credentials;
139
+ success(`Logged in as ${credentials.email}`);
140
+ }
141
+ // Prompt for app name
142
+ appName = await input({
143
+ message: "What would you like to name your app?",
144
+ default: defaultAppName,
145
+ });
146
+ // Create app
147
+ info("Creating app on Primitive server...");
148
+ try {
149
+ const client = new ApiClient();
150
+ const result = await client.createApp({
151
+ name: appName,
152
+ initialAdminEmail: credentials.email,
153
+ });
154
+ const id = result.app?.appId || result.appId;
155
+ if (!id) {
156
+ throw new Error("App created but no appId returned");
157
+ }
158
+ appId = id;
159
+ success(`App created: ${appName}`);
160
+ keyValue("App ID", appId);
161
+ }
162
+ catch (err) {
163
+ error(`Failed to create app: ${err.message}`);
164
+ error("You can try again or use --use-existing-app-id with an existing app.");
165
+ warn(`Template files were extracted to "${targetDir}" but VITE_APP_ID is not configured.`);
166
+ warn("You'll need to manually set VITE_APP_ID in your .env file to use this project.");
167
+ process.exit(1);
168
+ }
169
+ // Configure app access mode
170
+ console.log();
171
+ info("Let's configure who can access your app.");
172
+ info("(You can change this later with 'primitive apps update')");
173
+ const accessMode = await select({
174
+ message: "Who should be able to sign up for your app?",
175
+ choices: [
176
+ {
177
+ value: "public",
178
+ name: "Anyone (public)",
179
+ description: "Anyone can create an account",
180
+ },
181
+ {
182
+ value: "domain",
183
+ name: "Domain restricted",
184
+ description: "Only users with email addresses from specific domains",
185
+ },
186
+ {
187
+ value: "invite-only",
188
+ name: "Invite only",
189
+ description: "Only users you explicitly invite can sign up",
190
+ },
191
+ ],
192
+ default: "invite-only",
193
+ });
194
+ const client = new ApiClient();
195
+ const settingsPayload = {
196
+ mode: accessMode,
197
+ };
198
+ if (accessMode === "domain") {
199
+ const domainsInput = await input({
200
+ message: "Enter allowed email domain(s) (comma-separated, e.g., 'acme.com, example.org'):",
201
+ validate: (value) => {
202
+ if (!value.trim())
203
+ return "Please enter at least one domain";
204
+ return true;
205
+ },
206
+ });
207
+ const allowedDomains = domainsInput
208
+ .split(",")
209
+ .map((d) => d.trim().toLowerCase())
210
+ .filter((d) => d.length > 0);
211
+ settingsPayload.allowedDomains = allowedDomains;
212
+ }
213
+ // Update app settings with the chosen mode
214
+ try {
215
+ await client.updateAppSettings(appId, settingsPayload);
216
+ success(`App configured for ${accessMode} access.`);
217
+ }
218
+ catch (err) {
219
+ warn(`Could not update app settings: ${err.message}`);
220
+ }
221
+ // If invite-only, offer to add initial allowed users
222
+ if (accessMode === "invite-only") {
223
+ const inviteNow = await confirm({
224
+ message: "Would you like to add initial users who can sign up? (no emails will be sent)",
225
+ default: false,
226
+ });
227
+ if (inviteNow) {
228
+ const emailsInput = await input({
229
+ message: "Enter email address(es) to allow (comma-separated):",
230
+ validate: (value) => {
231
+ if (!value.trim())
232
+ return "Please enter at least one email";
233
+ const emails = value.split(",").map((e) => e.trim());
234
+ for (const email of emails) {
235
+ if (!email.includes("@")) {
236
+ return `Invalid email: ${email}`;
237
+ }
238
+ }
239
+ return true;
240
+ },
241
+ });
242
+ const emails = emailsInput
243
+ .split(",")
244
+ .map((e) => e.trim())
245
+ .filter((e) => e.length > 0);
246
+ info("Adding invited users...");
247
+ let inviteCount = 0;
248
+ for (const email of emails) {
249
+ try {
250
+ await client.createInvitation(appId, {
251
+ email,
252
+ role: "member",
253
+ sendEmail: false,
254
+ });
255
+ inviteCount++;
256
+ }
257
+ catch (err) {
258
+ warn(`Could not add ${email}: ${err.message}`);
259
+ }
260
+ }
261
+ if (inviteCount > 0) {
262
+ success(`Added ${inviteCount} user(s) to the invite list.`);
263
+ }
264
+ }
265
+ }
266
+ }
267
+ // Step 5: Update .env file
268
+ info("Configuring environment...");
269
+ try {
270
+ const envResult = updateEnvFile(targetDir, appId);
271
+ if (!envResult.envUpdated) {
272
+ warn("No .env or .env.example file found in template.");
273
+ warn(`Please manually set VITE_APP_ID=${appId} in your .env file.`);
274
+ }
275
+ else if (!envResult.envProductionUpdated) {
276
+ info(".env configured. No .env.production file found (this is optional).");
277
+ }
278
+ else {
279
+ success("Environment configured (.env and .env.production).");
280
+ }
281
+ }
282
+ catch (err) {
283
+ warn(`Could not update .env file: ${err.message}`);
284
+ warn(`Please manually set VITE_APP_ID=${appId} in your .env file.`);
285
+ }
286
+ // Step 6: Check and install pnpm
287
+ if (!options.skipInstall) {
288
+ let pnpmAvailable = await isPnpmInstalled();
289
+ if (!pnpmAvailable) {
290
+ info("pnpm is required but not installed.");
291
+ const installPnpmNow = await confirm({
292
+ message: "Install pnpm globally now?",
293
+ default: true,
294
+ });
295
+ if (installPnpmNow) {
296
+ info("Installing pnpm...");
297
+ try {
298
+ await installPnpm();
299
+ success("pnpm installed.");
300
+ pnpmAvailable = true;
301
+ }
302
+ catch (err) {
303
+ warn(`Could not install pnpm: ${err.message}`);
304
+ warn("Please install pnpm manually: npm install -g pnpm");
305
+ warn("Then run 'pnpm install' in your project directory.");
306
+ }
307
+ }
308
+ else {
309
+ warn("Skipping dependency installation.");
310
+ warn("Please install pnpm and run 'pnpm install' in your project.");
311
+ }
312
+ }
313
+ // Step 7: Run pnpm install if pnpm is available
314
+ if (pnpmAvailable) {
315
+ info("Installing dependencies...");
316
+ try {
317
+ await runPnpmInstall(targetDir);
318
+ success("Dependencies installed.");
319
+ }
320
+ catch (err) {
321
+ warn(`Dependency installation failed: ${err.message}`);
322
+ warn("You can try running 'pnpm install' manually.");
323
+ }
324
+ }
325
+ }
326
+ else {
327
+ info("Skipping dependency installation (--skip-install).");
328
+ }
329
+ // Step 8: Show success message
330
+ divider();
331
+ success("Project initialized successfully!");
332
+ divider();
333
+ keyValue("Directory", targetDir);
334
+ keyValue("App Name", appName);
335
+ keyValue("App ID", appId);
336
+ divider();
337
+ info("Next steps:");
338
+ if (projectDir !== ".") {
339
+ console.log(` cd ${projectDir}`);
340
+ }
341
+ if (options.skipInstall) {
342
+ console.log(" pnpm install");
343
+ }
344
+ console.log(" pnpm run dev");
345
+ console.log();
346
+ }
347
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, renameSync, rmSync, statSync, } from "fs";
2
+ import { join } from "path";
3
+ import * as tar from "tar";
4
+ const TEMPLATE_URL = "https://github.com/Primitive-Labs/primitive-app-template/archive/refs/heads/main.tar.gz";
5
+ const DOWNLOAD_TIMEOUT_MS = 30000; // 30 seconds
6
+ /**
7
+ * Check if a directory is empty.
8
+ */
9
+ export function isDirectoryEmpty(dir) {
10
+ if (!existsSync(dir)) {
11
+ return true;
12
+ }
13
+ const files = readdirSync(dir);
14
+ return files.length === 0;
15
+ }
16
+ /**
17
+ * Downloads and extracts the Primitive app template.
18
+ * The tarball extracts to a subfolder, so we strip that prefix by moving contents up.
19
+ */
20
+ export async function downloadAndExtractTemplate(options) {
21
+ const { targetDir, onProgress } = options;
22
+ // Ensure target directory exists
23
+ mkdirSync(targetDir, { recursive: true });
24
+ onProgress?.("Downloading template...");
25
+ // Fetch the tarball with timeout
26
+ const controller = new AbortController();
27
+ const timeout = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);
28
+ let response;
29
+ try {
30
+ response = await fetch(TEMPLATE_URL, { signal: controller.signal });
31
+ }
32
+ catch (err) {
33
+ clearTimeout(timeout);
34
+ if (err.name === "AbortError") {
35
+ throw new Error(`Download timed out after ${DOWNLOAD_TIMEOUT_MS / 1000} seconds`);
36
+ }
37
+ throw err;
38
+ }
39
+ finally {
40
+ clearTimeout(timeout);
41
+ }
42
+ if (!response.ok) {
43
+ throw new Error(`Failed to download template: HTTP ${response.status}`);
44
+ }
45
+ const arrayBuffer = await response.arrayBuffer();
46
+ const buffer = Buffer.from(arrayBuffer);
47
+ onProgress?.("Extracting template...");
48
+ // Create a temporary directory for extraction
49
+ const tempDir = join(targetDir, ".primitive-temp-" + Date.now());
50
+ mkdirSync(tempDir, { recursive: true });
51
+ // Write buffer to temp file and extract
52
+ const tempTarPath = join(tempDir, "template.tar.gz");
53
+ writeFileSync(tempTarPath, buffer);
54
+ // Extract tarball using tar
55
+ await tar.extract({
56
+ file: tempTarPath,
57
+ cwd: tempDir,
58
+ });
59
+ // Remove the temp tarball
60
+ rmSync(tempTarPath);
61
+ // Find the extracted directory (e.g., "primitive-app-template-main")
62
+ const extractedItems = readdirSync(tempDir);
63
+ if (extractedItems.length !== 1) {
64
+ throw new Error(`Unexpected template structure: expected 1 directory, found ${extractedItems.length}`);
65
+ }
66
+ const extractedDir = join(tempDir, extractedItems[0]);
67
+ // Verify it's a directory
68
+ if (!statSync(extractedDir).isDirectory()) {
69
+ throw new Error("Unexpected template structure: expected a directory");
70
+ }
71
+ // Move contents to target directory
72
+ for (const item of readdirSync(extractedDir)) {
73
+ const src = join(extractedDir, item);
74
+ const dest = join(targetDir, item);
75
+ // Remove existing item if it exists (for overwrite scenarios)
76
+ if (existsSync(dest)) {
77
+ rmSync(dest, { recursive: true, force: true });
78
+ }
79
+ renameSync(src, dest);
80
+ }
81
+ // Clean up temp directory
82
+ rmSync(tempDir, { recursive: true, force: true });
83
+ onProgress?.("Template extracted successfully.");
84
+ }
85
+ /**
86
+ * Updates a single env file with the app ID.
87
+ * Returns true if the file was updated, false if it didn't exist.
88
+ */
89
+ function updateSingleEnvFile(envPath, appId, fallbackPath) {
90
+ let envContent = "";
91
+ // If file doesn't exist but fallback does, copy from fallback
92
+ if (!existsSync(envPath) && fallbackPath && existsSync(fallbackPath)) {
93
+ envContent = readFileSync(fallbackPath, "utf-8");
94
+ }
95
+ else if (existsSync(envPath)) {
96
+ envContent = readFileSync(envPath, "utf-8");
97
+ }
98
+ else {
99
+ return false;
100
+ }
101
+ // Update or add VITE_APP_ID
102
+ if (envContent.includes("VITE_APP_ID=")) {
103
+ envContent = envContent.replace(/VITE_APP_ID=.*/, `VITE_APP_ID=${appId}`);
104
+ }
105
+ else {
106
+ envContent = envContent.trimEnd() + `\nVITE_APP_ID=${appId}\n`;
107
+ }
108
+ writeFileSync(envPath, envContent.trimEnd() + "\n");
109
+ return true;
110
+ }
111
+ /**
112
+ * Updates .env and .env.production files with the app ID.
113
+ * For .env, if it doesn't exist but .env.example does, copies from example first.
114
+ * Returns information about which files were updated.
115
+ */
116
+ export function updateEnvFile(targetDir, appId) {
117
+ const envPath = join(targetDir, ".env");
118
+ const envExamplePath = join(targetDir, ".env.example");
119
+ const envProductionPath = join(targetDir, ".env.production");
120
+ // Update .env (create from .env.example if needed)
121
+ const envUpdated = updateSingleEnvFile(envPath, appId, envExamplePath);
122
+ // Update .env.production if it exists
123
+ const envProductionUpdated = updateSingleEnvFile(envProductionPath, appId);
124
+ return { envUpdated, envProductionUpdated };
125
+ }
126
+ /**
127
+ * Checks if pnpm is installed globally.
128
+ */
129
+ export async function isPnpmInstalled() {
130
+ const { execSync } = await import("child_process");
131
+ try {
132
+ execSync("pnpm --version", { stdio: "ignore" });
133
+ return true;
134
+ }
135
+ catch {
136
+ return false;
137
+ }
138
+ }
139
+ /**
140
+ * Attempts to install pnpm globally using npm.
141
+ */
142
+ export async function installPnpm() {
143
+ const { spawn } = await import("child_process");
144
+ return new Promise((resolve, reject) => {
145
+ const proc = spawn("npm", ["install", "-g", "pnpm"], {
146
+ stdio: "inherit",
147
+ shell: true,
148
+ });
149
+ proc.on("close", (code) => {
150
+ if (code === 0) {
151
+ resolve();
152
+ }
153
+ else {
154
+ reject(new Error(`npm install -g pnpm exited with code ${code}`));
155
+ }
156
+ });
157
+ proc.on("error", reject);
158
+ });
159
+ }
160
+ /**
161
+ * Runs pnpm install in the target directory.
162
+ */
163
+ export async function runPnpmInstall(targetDir) {
164
+ const { spawn } = await import("child_process");
165
+ return new Promise((resolve, reject) => {
166
+ const proc = spawn("pnpm", ["install"], {
167
+ cwd: targetDir,
168
+ stdio: "inherit",
169
+ shell: true,
170
+ });
171
+ proc.on("close", (code) => {
172
+ if (code === 0) {
173
+ resolve();
174
+ }
175
+ else {
176
+ reject(new Error(`pnpm install exited with code ${code}`));
177
+ }
178
+ });
179
+ proc.on("error", reject);
180
+ });
181
+ }
182
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/lib/template.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "primitive-admin",
3
- "version": "1.0.11",
3
+ "version": "1.0.12",
4
4
  "description": "CLI for administering Primitive applications",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,19 +10,6 @@
10
10
  "dist/",
11
11
  "README.md"
12
12
  ],
13
- "scripts": {
14
- "build": "tsc",
15
- "typecheck": "tsc --noEmit",
16
- "prepublishOnly": "pnpm run build",
17
- "test": "vitest run --config vitest.config.ts",
18
- "test:unit": "vitest run --config vitest.config.ts tests/unit",
19
- "test:integration": "vitest run --config vitest.config.ts tests/integration",
20
- "test:llm": "vitest run --config vitest.config.ts tests/integration/llm.test.ts",
21
- "test:batch": "vitest run --config vitest.config.ts tests/integration/batch-tests.test.ts",
22
- "test:prompt-tests": "vitest run --config vitest.config.ts tests/integration/prompt-tests.test.ts",
23
- "test:workflow-tests": "vitest run --config vitest.config.ts tests/integration/workflow-tests.test.ts",
24
- "test:sync-test-cases": "vitest run --config vitest.config.ts tests/integration/sync-test-cases.test.ts"
25
- },
26
13
  "keywords": [
27
14
  "primitive",
28
15
  "cli",
@@ -41,7 +28,8 @@
41
28
  "commander": "^12.1.0",
42
29
  "inquirer": "^9.2.12",
43
30
  "mime-types": "^2.1.35",
44
- "open": "^10.0.3"
31
+ "open": "^10.0.3",
32
+ "tar": "^7.0.0"
45
33
  },
46
34
  "devDependencies": {
47
35
  "@types/inquirer": "^9.0.9",
@@ -50,5 +38,17 @@
50
38
  "tsx": "^4.20.3",
51
39
  "typescript": "^5.7.2",
52
40
  "vitest": "^1.6.1"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc",
44
+ "typecheck": "tsc --noEmit",
45
+ "test": "vitest run --config vitest.config.ts",
46
+ "test:unit": "vitest run --config vitest.config.ts tests/unit",
47
+ "test:integration": "vitest run --config vitest.config.ts tests/integration",
48
+ "test:llm": "vitest run --config vitest.config.ts tests/integration/llm.test.ts",
49
+ "test:batch": "vitest run --config vitest.config.ts tests/integration/batch-tests.test.ts",
50
+ "test:prompt-tests": "vitest run --config vitest.config.ts tests/integration/prompt-tests.test.ts",
51
+ "test:workflow-tests": "vitest run --config vitest.config.ts tests/integration/workflow-tests.test.ts",
52
+ "test:sync-test-cases": "vitest run --config vitest.config.ts tests/integration/sync-test-cases.test.ts"
53
53
  }
54
- }
54
+ }