playcademy 0.33.0 → 0.33.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -52,7 +52,7 @@ Remove stored credentials.
52
52
 
53
53
  ```bash
54
54
  playcademy logout
55
- playcademy logout --profile work
55
+ playcademy logout work
56
56
  ```
57
57
 
58
58
  #### `me`
@@ -91,24 +91,24 @@ Check your current developer status.
91
91
  playcademy dev status
92
92
  ```
93
93
 
94
- ### Games
94
+ ### Projects
95
95
 
96
- #### `games list`
96
+ #### `projects list`
97
97
 
98
- List all your games.
98
+ List your deployed projects.
99
99
 
100
100
  ```bash
101
- playcademy games list
101
+ playcademy projects list
102
102
  ```
103
103
 
104
- #### `games delete`
104
+ #### `projects delete`
105
105
 
106
- Delete a game.
106
+ Delete a project.
107
107
 
108
108
  ```bash
109
- playcademy games delete <slug>
110
- playcademy games delete # Interactive selection
111
- playcademy games delete my-game -f # Skip confirmation
109
+ playcademy projects delete <slug>
110
+ playcademy projects delete # Interactive selection
111
+ playcademy projects delete my-game -f # Skip confirmation
112
112
  ```
113
113
 
114
114
  ### Deployment
@@ -144,7 +144,7 @@ playcademy deploy --debug # Show debug info
144
144
  - `-d, --description <desc>` - Description
145
145
  - `-e, --emoji <emoji>` - Emoji icon
146
146
  - `-b, --build <path>` - Path to frontend zip file
147
- - `--env <env>` - Environment (`production` or `staging`)
147
+ - `--env <env>` - Environment (`local`, `staging`, or `production`)
148
148
  - `--backend` - Deploy API routes
149
149
  - `--no-backend` - Skip API routes
150
150
  - `--dry-run` - Validate only
@@ -178,38 +178,53 @@ Or `playcademy.config.json`:
178
178
 
179
179
  **Backend API Routes:**
180
180
 
181
- Add custom API routes by creating an `api/` directory:
181
+ Add custom API routes by creating a `server/api/` directory:
182
182
 
183
183
  ```
184
184
  my-game/
185
185
  ├── playcademy.config.js
186
186
  ├── dist/
187
187
  │ └── game.zip
188
- └── api/
189
- └── hello.ts # GET /api/hello
188
+ └── server/
189
+ └── api/
190
+ └── hello.ts # GET /api/hello
190
191
  ```
191
192
 
193
+ Set `integrations.customRoutes.directory` in your config to use a different routes directory.
194
+
192
195
  Backend routes are automatically deployed with hosted games.
193
196
 
194
197
  ### Credential Storage
195
198
 
196
- Credentials are stored in `~/.playcademy/auth.json`:
199
+ Credentials are stored in `~/.playcademy/auth.json`, separately for each environment:
197
200
 
198
201
  ```json
199
202
  {
200
- "default": {
201
- "token": "YOUR_TOKEN",
202
- "userId": "user_123",
203
- "email": "user@example.com",
204
- "expiresAt": "2024-12-31T23:59:59Z"
203
+ "local": {
204
+ "default": null,
205
+ "profiles": {}
205
206
  },
206
- "profiles": {
207
- "work": {
208
- "token": "WORK_TOKEN",
207
+ "staging": {
208
+ "default": {
209
+ "token": "YOUR_TOKEN",
210
+ "tokenType": "session",
209
211
  "userId": "user_123",
210
212
  "email": "user@example.com",
211
213
  "expiresAt": "2024-12-31T23:59:59Z"
214
+ },
215
+ "profiles": {
216
+ "work": {
217
+ "token": "WORK_TOKEN",
218
+ "tokenType": "session",
219
+ "userId": "user_123",
220
+ "email": "user@example.com",
221
+ "expiresAt": "2024-12-31T23:59:59Z"
222
+ }
212
223
  }
224
+ },
225
+ "production": {
226
+ "default": null,
227
+ "profiles": {}
213
228
  }
214
229
  }
215
230
  ```
@@ -301,7 +316,7 @@ another object.
301
316
 
302
317
  - `CI` - Set to `1` or `true` to disable interactive prompts
303
318
  - `PLAYCADEMY_API_TOKEN` - API token for non-interactive authentication
304
- - `PLAYCADEMY_ENV` - Environment: `staging` or `production` (default: `production`)
319
+ - `PLAYCADEMY_ENV` - Environment: `local`, `staging`, or `production` (default: `staging`)
305
320
  - `PLAYCADEMY_BASE_URL` - Override API endpoint (default: based on `PLAYCADEMY_ENV`)
306
321
  - `PLAYCADEMY_PROFILE` - Authentication profile to use (default: `default`)
307
322
  - `PLAYCADEMY_CONFIG_PATH` - Path to a config file
package/dist/bucket.js CHANGED
@@ -42,7 +42,7 @@ var GAME_API_ROUTES_DIRECTORY = `${GAME_SERVER_ROOT_DIRECTORY}/api`;
42
42
  // ../better-auth/package.json
43
43
  var package_default = {
44
44
  name: "@playcademy/better-auth",
45
- version: "0.0.25",
45
+ version: "0.0.26-beta.2",
46
46
  type: "module",
47
47
  exports: {
48
48
  "./server": {
package/dist/cli.js CHANGED
@@ -1208,7 +1208,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
1208
1208
  // ../better-auth/package.json
1209
1209
  var package_default = {
1210
1210
  name: "@playcademy/better-auth",
1211
- version: "0.0.25",
1211
+ version: "0.0.26-beta.2",
1212
1212
  type: "module",
1213
1213
  exports: {
1214
1214
  "./server": {
@@ -3045,7 +3045,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as re
3045
3045
  import { join as join12 } from "node:path";
3046
3046
 
3047
3047
  // src/version.ts
3048
- var cliVersion = false ? "0.0.0-dev" : "0.33.0";
3048
+ var cliVersion = false ? "0.0.0-dev" : "0.33.1-beta.2";
3049
3049
 
3050
3050
  // src/lib/init/database.ts
3051
3051
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
package/dist/constants.js CHANGED
@@ -21,7 +21,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
21
21
  // ../better-auth/package.json
22
22
  var package_default = {
23
23
  name: "@playcademy/better-auth",
24
- version: "0.0.25",
24
+ version: "0.0.26-beta.2",
25
25
  type: "module",
26
26
  exports: {
27
27
  "./server": {
package/dist/db.d.ts CHANGED
@@ -400,6 +400,17 @@ declare function reportBaselineVerification(plan: DatabasePlan | null): void;
400
400
  * @param schemaHash - The claimed snapshot hash the platform recorded.
401
401
  */
402
402
  declare function reportPushBaselineRecorded(schemaHash: string): void;
403
+ /**
404
+ * The journal tag the claim is anchored at: everything up to and including
405
+ * it is recorded as already applied. Non-interactive runs must pass --tag.
406
+ *
407
+ * The picker shows evidence instead of asking for a guess: each entry's
408
+ * generation date, the platform's last deploy, and an annotation on
409
+ * entries generated after it (the likely-never-deployed teammate
410
+ * migrations). The default sits on the newest entry generated before the
411
+ * last deploy — never on the newest entry outright, which is the wrong
412
+ * answer whenever undeployed migrations exist.
413
+ */
403
414
  declare function pickBaselineTag(migrations: DeployMigration[], evidence: BaselineMigrationEvidence[] | null, lastDeploy: DeploymentStateResponse['lastDeploy'], environment: string, explicitTag: string | undefined): Promise<string>;
404
415
  /**
405
416
  * Build the migrate-mode claim: the chosen tag plus the complete journal
package/dist/db.js CHANGED
@@ -2333,7 +2333,7 @@ var GAME_API_ROUTES_DIRECTORY = `${GAME_SERVER_ROOT_DIRECTORY}/api`;
2333
2333
  // ../better-auth/package.json
2334
2334
  var package_default = {
2335
2335
  name: "@playcademy/better-auth",
2336
- version: "0.0.25",
2336
+ version: "0.0.26-beta.2",
2337
2337
  type: "module",
2338
2338
  exports: {
2339
2339
  "./server": {
package/dist/index.d.ts CHANGED
@@ -1480,6 +1480,12 @@ type IntegrationChangeDetectors = {
1480
1480
  [K in keyof IntegrationsConfig]: IntegrationChangeDetector;
1481
1481
  };
1482
1482
 
1483
+ /**
1484
+ * Stable machine-readable codes for deploy-gate refusals, surfaced in the
1485
+ * --json error envelope. A closed union so a typo'd slug is a type error,
1486
+ * never a silently shipped new code — extend here when a gate is added.
1487
+ */
1488
+ type BlockedCode = 'blocked:baseline-required' | 'blocked:checksum-mismatch' | 'blocked:ledger-orphans' | 'blocked:out-of-order' | 'blocked:prune-secrets' | 'blocked:strategy-mismatch' | 'blocked:timeback-admin-required' | 'blocked:timeback-drift' | 'blocked:timeback-drift-check-failed' | 'blocked:version-rollback';
1483
1489
  /**
1484
1490
  * Local convenience cache for a deployed project (PLA-217 D9).
1485
1491
  *
@@ -1489,12 +1495,6 @@ type IntegrationChangeDetectors = {
1489
1495
  * server-managed state — the automatic seed-on-deploy adoption (D7), which
1490
1496
  * then falls back to the manual `playcademy db baseline` path.
1491
1497
  */
1492
- /**
1493
- * Stable machine-readable codes for deploy-gate refusals, surfaced in the
1494
- * --json error envelope. A closed union so a typo'd slug is a type error,
1495
- * never a silently shipped new code — extend here when a gate is added.
1496
- */
1497
- type BlockedCode = 'blocked:baseline-required' | 'blocked:checksum-mismatch' | 'blocked:ledger-orphans' | 'blocked:out-of-order' | 'blocked:prune-secrets' | 'blocked:strategy-mismatch' | 'blocked:timeback-admin-required' | 'blocked:timeback-drift' | 'blocked:timeback-drift-check-failed' | 'blocked:version-rollback';
1498
1498
  interface DeployedGameInfo {
1499
1499
  /** Interactive prompt default for the frontend zip path */
1500
1500
  buildPath?: string;
package/dist/index.js CHANGED
@@ -2345,7 +2345,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
2345
2345
  // ../better-auth/package.json
2346
2346
  var package_default = {
2347
2347
  name: "@playcademy/better-auth",
2348
- version: "0.0.25",
2348
+ version: "0.0.26-beta.2",
2349
2349
  type: "module",
2350
2350
  exports: {
2351
2351
  "./server": {
@@ -6487,7 +6487,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync2, readFileSync as re
6487
6487
  import { join as join12 } from "node:path";
6488
6488
 
6489
6489
  // src/version.ts
6490
- var cliVersion = false ? "0.0.0-dev" : "0.33.0";
6490
+ var cliVersion = false ? "0.0.0-dev" : "0.33.1-beta.2";
6491
6491
 
6492
6492
  // src/lib/init/database.ts
6493
6493
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
@@ -32868,9 +32868,12 @@ var PresignedUploadError = class extends Error {
32868
32868
  }
32869
32869
  };
32870
32870
  var TRANSFER_CONCURRENCY = 8;
32871
- var MAX_RETRIES = 6;
32872
32871
  var INITIAL_BACKOFF_MS = 1e3;
32873
32872
  var MAX_BACKOFF_MS = 6e4;
32873
+ var MAX_RETRIES = 8;
32874
+ function backoffCeiling(retry) {
32875
+ return Math.min(INITIAL_BACKOFF_MS * 2 ** retry, MAX_BACKOFF_MS);
32876
+ }
32874
32877
  function isRetryableStatus(status) {
32875
32878
  return status === 429 || status >= 500;
32876
32879
  }
@@ -32887,7 +32890,6 @@ function isRetryable(error) {
32887
32890
  }
32888
32891
  async function runPool(items, task) {
32889
32892
  async function attempt(item) {
32890
- let backoff = INITIAL_BACKOFF_MS;
32891
32893
  for (let tries = 0; ; tries++) {
32892
32894
  try {
32893
32895
  return await task(item);
@@ -32895,9 +32897,8 @@ async function runPool(items, task) {
32895
32897
  if (tries >= MAX_RETRIES || !isRetryable(error)) {
32896
32898
  throw error;
32897
32899
  }
32898
- const wait = backoff / 2 + Math.random() * (backoff / 2);
32899
- await sleep(Math.min(wait, MAX_BACKOFF_MS));
32900
- backoff = Math.min(backoff * 2, MAX_BACKOFF_MS);
32900
+ const ceiling = backoffCeiling(tries);
32901
+ await sleep(ceiling / 2 + Math.random() * (ceiling / 2));
32901
32902
  }
32902
32903
  }
32903
32904
  }
@@ -35435,6 +35436,7 @@ export {
35435
35436
  LEVEL_DELIMITER,
35436
35437
  MANAGED_PACKAGES,
35437
35438
  MANIFEST_OBJECT_KEY,
35439
+ MAX_RETRIES,
35438
35440
  METRICS_RESOLVER_EXTENSIONS,
35439
35441
  NUDGE_COOLDOWN_MS,
35440
35442
  NonInteractivePromptError,
@@ -35455,6 +35457,7 @@ export {
35455
35457
  assertExtractorOutput,
35456
35458
  assertRemoteWhenEnvGiven,
35457
35459
  assessmentFixturePath,
35460
+ backoffCeiling,
35458
35461
  blockDeploy,
35459
35462
  bootstrapDashboardAdmin,
35460
35463
  buildCatalog,
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.33.0",
3
- "sdkVersion": "0.21.0",
4
- "runtimeBuildId": "19a4ce1ffe72",
5
- "inputFingerprint": "19a4ce1ffe72bb7d2cec83e1d903fc96bc167cfc3c0ce26a85fa1eec4edb4bfd",
2
+ "cliVersion": "0.33.1-beta.2",
3
+ "sdkVersion": "0.21.1-beta.2",
4
+ "runtimeBuildId": "f950ec4256aa",
5
+ "inputFingerprint": "f950ec4256aaa17da2234326f2325b3e9fdd3414f776f3d67b6fd7d08db2def3",
6
6
  "entry": "index.js"
7
7
  }
@@ -14335,9 +14335,9 @@ var init_list = __esm({
14335
14335
  // ../edge-play/src/game/lib/metadata.ts
14336
14336
  function getRuntimeMetadata() {
14337
14337
  return {
14338
- cliVersion: true ? "0.33.0" : "0.0.0-dev",
14339
- sdkVersion: true ? "0.21.0" : "0.0.0-dev",
14340
- buildId: true ? "19a4ce1ffe72" : "dev-source"
14338
+ cliVersion: true ? "0.33.1-beta.2" : "0.0.0-dev",
14339
+ sdkVersion: true ? "0.21.1-beta.2" : "0.0.0-dev",
14340
+ buildId: true ? "f950ec4256aa" : "dev-source"
14341
14341
  };
14342
14342
  }
14343
14343
  var init_metadata = __esm({
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.33.0",
3
- "sdkVersion": "0.21.0",
4
- "runtimeBuildId": "19a4ce1ffe72",
5
- "inputFingerprint": "19a4ce1ffe72bb7d2cec83e1d903fc96bc167cfc3c0ce26a85fa1eec4edb4bfd",
2
+ "cliVersion": "0.33.1-beta.2",
3
+ "sdkVersion": "0.21.1-beta.2",
4
+ "runtimeBuildId": "f950ec4256aa",
5
+ "inputFingerprint": "f950ec4256aaa17da2234326f2325b3e9fdd3414f776f3d67b6fd7d08db2def3",
6
6
  "entry": "index.js"
7
7
  }
package/dist/utils.js CHANGED
@@ -397,7 +397,7 @@ var DASHBOARD_API_ROUTES_DIRECTORY = "api";
397
397
  // ../better-auth/package.json
398
398
  var package_default = {
399
399
  name: "@playcademy/better-auth",
400
- version: "0.0.25",
400
+ version: "0.0.26-beta.2",
401
401
  type: "module",
402
402
  exports: {
403
403
  "./server": {
@@ -2878,7 +2878,7 @@ import { existsSync as existsSync10, mkdirSync as mkdirSync2, writeFileSync as w
2878
2878
  import { dirname as dirname4, join as join14 } from "node:path";
2879
2879
 
2880
2880
  // src/version.ts
2881
- var cliVersion = false ? "0.0.0-dev" : "0.33.0";
2881
+ var cliVersion = false ? "0.0.0-dev" : "0.33.1-beta.2";
2882
2882
 
2883
2883
  // src/lib/build/binary-resource.ts
2884
2884
  function writeFileTree(baseDir, files) {
package/dist/version.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __pcCreateRequire } from 'node:module'; const require = __pcCreateRequire(import.meta.url);
2
2
 
3
3
  // src/version.ts
4
- var cliVersion = false ? "0.0.0-dev" : "0.33.0";
4
+ var cliVersion = false ? "0.0.0-dev" : "0.33.1-beta.2";
5
5
  export {
6
6
  cliVersion
7
7
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "playcademy",
3
- "version": "0.33.0",
3
+ "version": "0.33.1-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -55,7 +55,7 @@
55
55
  },
56
56
  "dependencies": {
57
57
  "@inquirer/prompts": "^7.8.6",
58
- "@playcademy/sdk": "0.21.0",
58
+ "@playcademy/sdk": "0.21.1-beta.2",
59
59
  "chokidar": "^4.0.3",
60
60
  "colorette": "^2.0.20",
61
61
  "commander": "^14.0.1",