@frontera-sdk/cli 1.53.17 → 1.53.19

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontera-sdk/cli",
3
- "version": "1.53.17",
3
+ "version": "1.53.19",
4
4
  "description": "The frontera CLI — scaffold, pull, save and deploy Frontera apps and automations.",
5
5
  "keywords": [
6
6
  "frontera",
@@ -31,7 +31,7 @@
31
31
  }
32
32
  },
33
33
  "scripts": {
34
- "test": "bun test",
34
+ "test": "bun test --parallel",
35
35
  "typecheck": "../../node_modules/typescript7/bin/tsc --noEmit",
36
36
  "sync:sdk": "bun run scripts/sync-sdk.ts",
37
37
  "sync:kit": "bun run scripts/sync-kit.ts",
@@ -40,8 +40,8 @@
40
40
  "dependencies": {
41
41
  "@anthropic-ai/claude-agent-sdk": "^0.3.251",
42
42
  "@faker-js/faker": "10.6.0",
43
- "@frontera-sdk/core": "1.53.17",
44
- "@frontera-sdk/functions": "1.53.17",
43
+ "@frontera-sdk/core": "1.53.19",
44
+ "@frontera-sdk/functions": "1.53.19",
45
45
  "ai": "^6.0.319",
46
46
  "axe-core": "4.12.1",
47
47
  "gray-matter": "^4.0.3",
@@ -49,7 +49,7 @@
49
49
  "yaml": "^2.9.0"
50
50
  },
51
51
  "devDependencies": {
52
- "@frontera-sdk/forge-contracts": "1.53.17",
52
+ "@frontera-sdk/forge-contracts": "1.53.19",
53
53
  "@types/bun": "^1.3.14",
54
54
  "typescript": "^5.9.3"
55
55
  }
@@ -43,8 +43,9 @@ export function appPort(raw: string | undefined): number {
43
43
  async function waitForApp(origin: string, process: Bun.Subprocess): Promise<void> {
44
44
  const deadline = Date.now() + READY_TIMEOUT_MS
45
45
  while (Date.now() < deadline) {
46
- if (process.exitCode !== null) {
47
- throw new CliError(`App dev server exited with code ${process.exitCode}`, {
46
+ // A server killed by a signal (Ctrl+C, a group TERM) has a signalCode and no exitCode.
47
+ if (process.exitCode !== null || process.signalCode !== null) {
48
+ throw new CliError(`App dev server exited with ${process.signalCode ?? `code ${process.exitCode}`}`, {
48
49
  code: 'FAILURE',
49
50
  hint: 'run `bun run dev` directly to inspect the framework error',
50
51
  })
@@ -321,7 +322,8 @@ export const appDev: Command = {
321
322
  forgetDevServer(home, project.slug, process.pid)
322
323
  stop()
323
324
  // Once the framework's server has exited (or after a while, whatever it does), what it wrote goes back.
324
- await Promise.race([child.exited, Bun.sleep(STOP_WAIT_MS)])
325
+ // Unref'd: a pending wait would hold this process open for the whole STOP_WAIT_MS after the server exited.
326
+ await Promise.race([child.exited, new Promise((resolve) => setTimeout(resolve, STOP_WAIT_MS).unref())])
325
327
  const { putBack, left } = kept.atStop()
326
328
  for (const line of [putBackLine(putBack, 'stopped'), leftLine(left)]) if (line) ctx.output.note(`[dev] ${line}`)
327
329
  if (aside) ctx.output.note(`[dev] ${aside.restore()}`)
@@ -208,12 +208,19 @@ export function settingEffect(line: string): SettingEffect | null {
208
208
 
209
209
  /**
210
210
  * Feature flags that change nothing about how the project runs locally, so a
211
- * different value is not a difference to report. `workflows.enabled` only
212
- * shows or hides the Workflows entry in the platform's navigation; the local
213
- * runtime applies and runs workflows whatever its value (always on locally
214
- * for development).
211
+ * different value is not a difference to report: the retired flags, which an
212
+ * older platform still reports and an older CLI recorded. The surface flags
213
+ * only showed or hid navigation; personal Grok now follows the deployment.
215
214
  */
216
- export const NOT_A_DIFFERENCE_HERE: ReadonlySet<string> = new Set(['workflows.enabled'])
215
+ export const NOT_A_DIFFERENCE_HERE: ReadonlySet<string> = new Set([
216
+ 'blueprint.authoring',
217
+ 'blueprint.enabled',
218
+ 'apps.enabled',
219
+ 'copilot.enabled',
220
+ 'workflows.enabled',
221
+ 'xaiSubscription.enabled',
222
+ 'xaiSubscription.sessionsEnabled',
223
+ ])
217
224
 
218
225
  type Call = (method: string, path: string, body?: unknown) => Promise<{ status: number; body: unknown }>
219
226
 
@@ -381,9 +381,8 @@ export async function ensureProviderModels(args: { serviceUrl: string; password:
381
381
  }
382
382
 
383
383
  /**
384
- * Make Blueprint usable in a fresh local organization: authoring on (it is
385
- * off by default for an organization) and the lifecycle adopted, so the
386
- * Blueprint CLI loop (`pull`, `plan`, `apply`) and Studio's Blueprint section
384
+ * Make Blueprint usable in a fresh local organization: the lifecycle
385
+ * adopted, so the Blueprint CLI loop (`pull`, `plan`, `apply`) and Studio's Blueprint section
387
386
  * work from the first start. The seeded owner is already the Steward.
388
387
  */
389
388
  export async function ensureBlueprint(args: { serviceUrl: string; password: string; organizationId: string; logFile: string }): Promise<void> {
@@ -393,13 +392,6 @@ export async function ensureBlueprint(args: { serviceUrl: string; password: stri
393
392
  } catch {
394
393
  return
395
394
  }
396
- const flag = await call(args.serviceUrl, '/v1/config/feature-flags', {
397
- method: 'PUT',
398
- token,
399
- orgId: args.organizationId,
400
- body: { key: 'blueprint.authoring', value: true },
401
- })
402
- if (flag.status >= 300) log(args.logFile, `turning on Blueprint authoring answered ${flag.status}`)
403
395
  const lifecycle = await call(args.serviceUrl, '/v1/blueprint/lifecycle', { token, orgId: args.organizationId })
404
396
  if (lifecycle.status === 404) {
405
397
  const adopted = await call(args.serviceUrl, '/v1/blueprint/lifecycle/adopt', { token, orgId: args.organizationId, body: {} })