adapty 0.9.2 → 0.9.4

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.
@@ -1177,12 +1177,27 @@
1177
1177
  "update.js"
1178
1178
  ]
1179
1179
  },
1180
- "paywalls:create": {
1180
+ "migrations:close": {
1181
1181
  "aliases": [],
1182
1182
  "args": {},
1183
- "description": "Create a paywall with products",
1183
+ "description": "Choose finish to mark the migration as completed, or cancel to abandon it.\nBoth outcomes permanently close the migration and require --yes. No confirmation prompt is shown.\n\nWith --json, returns the full migration response after closing.",
1184
1184
  "examples": [
1185
- "<%= config.bin %> paywalls create --app UUID --title \"Default Paywall\" --product-id UUID1 --product-id UUID2"
1185
+ {
1186
+ "description": "Finish the saved migration:",
1187
+ "command": "<%= config.bin %> migrations close --outcome finish --yes"
1188
+ },
1189
+ {
1190
+ "description": "Mark the migration as finished:",
1191
+ "command": "<%= config.bin %> migrations close -m mig_7x2 --outcome finish --yes"
1192
+ },
1193
+ {
1194
+ "description": "Abandon the migration:",
1195
+ "command": "<%= config.bin %> migrations close -m mig_7x2 --outcome cancel --yes"
1196
+ },
1197
+ {
1198
+ "description": "Finish and return the final state as JSON:",
1199
+ "command": "<%= config.bin %> migrations close -m mig_7x2 --outcome finish --yes --json"
1200
+ }
1186
1201
  ],
1187
1202
  "flags": {
1188
1203
  "json": {
@@ -1192,59 +1207,69 @@
1192
1207
  "allowNo": false,
1193
1208
  "type": "boolean"
1194
1209
  },
1195
- "app": {
1196
- "description": "App ID (UUID)",
1197
- "name": "app",
1198
- "required": true,
1210
+ "migration": {
1211
+ "char": "m",
1212
+ "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
1213
+ "name": "migration",
1199
1214
  "hasDynamicHelp": false,
1215
+ "helpValue": "ID",
1200
1216
  "multiple": false,
1201
1217
  "type": "option"
1202
1218
  },
1203
- "product-id": {
1204
- "description": "Product ID (UUID). Repeat for multiple.",
1205
- "name": "product-id",
1219
+ "outcome": {
1220
+ "description": "finish: mark completed; cancel: abandon the migration",
1221
+ "name": "outcome",
1206
1222
  "required": true,
1207
1223
  "hasDynamicHelp": false,
1208
- "multiple": true,
1224
+ "multiple": false,
1225
+ "options": [
1226
+ "finish",
1227
+ "cancel"
1228
+ ],
1209
1229
  "type": "option"
1210
1230
  },
1211
- "title": {
1212
- "description": "Paywall title",
1213
- "name": "title",
1231
+ "yes": {
1232
+ "char": "y",
1233
+ "description": "Confirm permanent closure of this migration",
1234
+ "name": "yes",
1214
1235
  "required": true,
1215
- "hasDynamicHelp": false,
1216
- "multiple": false,
1217
- "type": "option"
1236
+ "allowNo": false,
1237
+ "type": "boolean"
1218
1238
  }
1219
1239
  },
1220
1240
  "hasDynamicHelp": false,
1221
1241
  "hiddenAliases": [],
1222
- "id": "paywalls:create",
1242
+ "id": "migrations:close",
1223
1243
  "pluginAlias": "adapty",
1224
1244
  "pluginName": "adapty",
1225
1245
  "pluginType": "core",
1226
1246
  "strict": true,
1227
- "enableJsonFlag": true,
1247
+ "summary": "Permanently finish or cancel a migration",
1228
1248
  "isESM": true,
1229
1249
  "relativePath": [
1230
1250
  "dist",
1231
1251
  "commands",
1232
- "paywalls",
1233
- "create.js"
1252
+ "migrations",
1253
+ "close.js"
1234
1254
  ]
1235
1255
  },
1236
- "paywalls:get": {
1256
+ "migrations:create": {
1237
1257
  "aliases": [],
1238
- "args": {
1239
- "paywall_id": {
1240
- "description": "Paywall ID (UUID)",
1241
- "name": "paywall_id",
1242
- "required": true
1243
- }
1244
- },
1245
- "description": "Get paywall details",
1258
+ "args": {},
1259
+ "description": "Use --name to migrate a catalog into a new Adapty app.\nFor an existing app, use --flow and --app together. Choose a flow and its app from `adapty migrations list`.\n\nCreation starts the flow and saves it as current; use `adapty migrations status` to continue.\nUse --no-select to keep the previous selection. ADAPTY_MIGRATION overrides saved selection.\nWith --json, the migration ID is in migration.id.",
1246
1260
  "examples": [
1247
- "<%= config.bin %> paywalls get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1261
+ {
1262
+ "description": "Start a catalog migration into a new app:",
1263
+ "command": "<%= config.bin %> migrations create --name \"Acme Fitness\""
1264
+ },
1265
+ {
1266
+ "description": "Start transactions for an existing app, if listed as available:",
1267
+ "command": "<%= config.bin %> migrations create --flow transactions --app 3f2ab1c4-0000-4000-8000-000000000000"
1268
+ },
1269
+ {
1270
+ "description": "Return the new migration as JSON for an agent or script:",
1271
+ "command": "<%= config.bin %> migrations create --name \"Acme Fitness\" --json"
1272
+ }
1248
1273
  ],
1249
1274
  "flags": {
1250
1275
  "json": {
@@ -1254,37 +1279,74 @@
1254
1279
  "allowNo": false,
1255
1280
  "type": "boolean"
1256
1281
  },
1282
+ "no-select": {
1283
+ "description": "Create without changing the saved migration selection",
1284
+ "name": "no-select",
1285
+ "allowNo": false,
1286
+ "type": "boolean"
1287
+ },
1288
+ "name": {
1289
+ "description": "New Adapty app name; cannot be combined with --flow or --app",
1290
+ "exclusive": [
1291
+ "app",
1292
+ "flow"
1293
+ ],
1294
+ "name": "name",
1295
+ "hasDynamicHelp": false,
1296
+ "helpValue": "APP_NAME",
1297
+ "multiple": false,
1298
+ "type": "option"
1299
+ },
1300
+ "flow": {
1301
+ "dependsOn": [
1302
+ "app"
1303
+ ],
1304
+ "description": "Available flow from `adapty migrations list`; requires --app",
1305
+ "name": "flow",
1306
+ "hasDynamicHelp": false,
1307
+ "helpValue": "FLOW",
1308
+ "multiple": false,
1309
+ "type": "option"
1310
+ },
1257
1311
  "app": {
1258
- "description": "App ID (UUID)",
1312
+ "dependsOn": [
1313
+ "flow"
1314
+ ],
1315
+ "description": "Existing Adapty app ID (UUID); requires --flow",
1259
1316
  "name": "app",
1260
- "required": true,
1261
1317
  "hasDynamicHelp": false,
1318
+ "helpValue": "APP_ID",
1262
1319
  "multiple": false,
1263
1320
  "type": "option"
1264
1321
  }
1265
1322
  },
1266
1323
  "hasDynamicHelp": false,
1267
1324
  "hiddenAliases": [],
1268
- "id": "paywalls:get",
1325
+ "id": "migrations:create",
1269
1326
  "pluginAlias": "adapty",
1270
1327
  "pluginName": "adapty",
1271
1328
  "pluginType": "core",
1272
1329
  "strict": true,
1273
- "enableJsonFlag": true,
1330
+ "summary": "Start a migration into Adapty",
1331
+ "usage": [
1332
+ "migrations create --name APP_NAME [--no-select] [--json]",
1333
+ "migrations create --flow FLOW --app APP_ID [--no-select] [--json]"
1334
+ ],
1274
1335
  "isESM": true,
1275
1336
  "relativePath": [
1276
1337
  "dist",
1277
1338
  "commands",
1278
- "paywalls",
1279
- "get.js"
1339
+ "migrations",
1340
+ "create.js"
1280
1341
  ]
1281
1342
  },
1282
- "paywalls:list": {
1343
+ "migrations:current": {
1283
1344
  "aliases": [],
1284
1345
  "args": {},
1285
- "description": "List paywalls for an app",
1346
+ "description": "ADAPTY_MIGRATION takes precedence over the saved selection for the current token.\nWith no applicable selection, returns null and exits successfully.",
1286
1347
  "examples": [
1287
- "<%= config.bin %> paywalls list --app 550e8400-..."
1348
+ "<%= config.bin %> migrations current",
1349
+ "<%= config.bin %> migrations current --json"
1288
1350
  ],
1289
1351
  "flags": {
1290
1352
  "json": {
@@ -1293,60 +1355,38 @@
1293
1355
  "name": "json",
1294
1356
  "allowNo": false,
1295
1357
  "type": "boolean"
1296
- },
1297
- "app": {
1298
- "description": "App ID (UUID)",
1299
- "name": "app",
1300
- "required": true,
1301
- "hasDynamicHelp": false,
1302
- "multiple": false,
1303
- "type": "option"
1304
- },
1305
- "page": {
1306
- "description": "Page number",
1307
- "name": "page",
1308
- "default": 1,
1309
- "hasDynamicHelp": false,
1310
- "multiple": false,
1311
- "type": "option"
1312
- },
1313
- "page-size": {
1314
- "description": "Items per page (max 100)",
1315
- "name": "page-size",
1316
- "default": 20,
1317
- "hasDynamicHelp": false,
1318
- "multiple": false,
1319
- "type": "option"
1320
1358
  }
1321
1359
  },
1322
1360
  "hasDynamicHelp": false,
1323
1361
  "hiddenAliases": [],
1324
- "id": "paywalls:list",
1362
+ "id": "migrations:current",
1325
1363
  "pluginAlias": "adapty",
1326
1364
  "pluginName": "adapty",
1327
1365
  "pluginType": "core",
1328
1366
  "strict": true,
1367
+ "summary": "Show the effective migration selection and its source (no network)",
1329
1368
  "enableJsonFlag": true,
1330
1369
  "isESM": true,
1331
1370
  "relativePath": [
1332
1371
  "dist",
1333
1372
  "commands",
1334
- "paywalls",
1335
- "list.js"
1373
+ "migrations",
1374
+ "current.js"
1336
1375
  ]
1337
1376
  },
1338
- "paywalls:placements": {
1377
+ "migrations:list": {
1339
1378
  "aliases": [],
1340
- "args": {
1341
- "paywall_id": {
1342
- "description": "Paywall ID (UUID)",
1343
- "name": "paywall_id",
1344
- "required": true
1345
- }
1346
- },
1347
- "description": "List placements that currently use this paywall",
1379
+ "args": {},
1380
+ "description": "Use a migration ID with `adapty migrations status -m ID` to continue an existing flow.\nStart an available flow with `adapty migrations create --flow FLOW --app APP_ID`.\n\nWith --json, items contains migrations and available contains flows with their target apps.",
1348
1381
  "examples": [
1349
- "<%= config.bin %> paywalls placements --app UUID 770e8400-e29b-41d4-a716-446655440002"
1382
+ {
1383
+ "description": "Find migrations and available flows, grouped by app:",
1384
+ "command": "<%= config.bin %> migrations list"
1385
+ },
1386
+ {
1387
+ "description": "Read migration IDs and available flows as JSON:",
1388
+ "command": "<%= config.bin %> migrations list --json"
1389
+ }
1350
1390
  ],
1351
1391
  "flags": {
1352
1392
  "json": {
@@ -1355,44 +1395,59 @@
1355
1395
  "name": "json",
1356
1396
  "allowNo": false,
1357
1397
  "type": "boolean"
1358
- },
1359
- "app": {
1360
- "description": "App ID (UUID)",
1361
- "name": "app",
1362
- "required": true,
1363
- "hasDynamicHelp": false,
1364
- "multiple": false,
1365
- "type": "option"
1366
1398
  }
1367
1399
  },
1368
1400
  "hasDynamicHelp": false,
1369
1401
  "hiddenAliases": [],
1370
- "id": "paywalls:placements",
1402
+ "id": "migrations:list",
1371
1403
  "pluginAlias": "adapty",
1372
1404
  "pluginName": "adapty",
1373
1405
  "pluginType": "core",
1374
1406
  "strict": true,
1375
- "enableJsonFlag": true,
1407
+ "summary": "List migrations and the flows you can start",
1376
1408
  "isESM": true,
1377
1409
  "relativePath": [
1378
1410
  "dist",
1379
1411
  "commands",
1380
- "paywalls",
1381
- "placements.js"
1412
+ "migrations",
1413
+ "list.js"
1382
1414
  ]
1383
1415
  },
1384
- "paywalls:update": {
1416
+ "migrations:run": {
1385
1417
  "aliases": [],
1386
1418
  "args": {
1387
- "paywall_id": {
1388
- "description": "Paywall ID (UUID)",
1389
- "name": "paywall_id",
1419
+ "action_id": {
1420
+ "description": "Offered action ID from `adapty migrations status`",
1421
+ "name": "action_id",
1390
1422
  "required": true
1391
1423
  }
1392
1424
  },
1393
- "description": "Update a paywall",
1425
+ "description": "Choose an action ID from next_actions or available_actions in `adapty migrations status -m ID --json`.\nReplace ACTION_ID in the examples with an offered action ID.\nFor input actions, read the resources in reads and prepare a JSON object matching input_schema.\nOmitting input sends {}. Review confirm before passing --yes.\nWithout --yes, actions requiring confirmation exit with code 6. No confirmation prompt is shown.\n\nExternal actions print a link and open it in an interactive terminal. Complete the browser step, then check status.\nExternal actions reject --input and --input-file, including stdin.\nPipes and --json require --open to launch a browser; BROWSER=none disables it.\nFile uploads are not supported; use the dashboard or an offered Cloud Export action.\n\nAn agent action writes the resources in reads to .git/adapty/<migration ID>/ in the app's git repository and\nprints what a coding agent needs to do it. Run it from the agent, or paste its output into one. The agent\nreports the result by running the action again with --input.\n\nWith --json, returns the full migration response (before the browser step for external actions). For an agent\naction without --input, returns { action_id, files, instructions }: the files written and the text for the agent.\nAfter a revision_conflict error, read status and review the action before retrying.",
1394
1426
  "examples": [
1395
- "<%= config.bin %> paywalls update --app UUID 550e8400-... --title \"Default Paywall\" --product-id UUID1 --product-id UUID2"
1427
+ {
1428
+ "description": "Run an offered action on the saved migration after reviewing confirm:",
1429
+ "command": "<%= config.bin %> migrations run ACTION_ID --yes"
1430
+ },
1431
+ {
1432
+ "description": "Read current action IDs and input schemas first:",
1433
+ "command": "<%= config.bin %> migrations status -m mig_7x2 --json"
1434
+ },
1435
+ {
1436
+ "description": "Submit an empty JSON object, if the action input_schema allows it:",
1437
+ "command": "<%= config.bin %> migrations run ACTION_ID -m mig_7x2 --input '{}'"
1438
+ },
1439
+ {
1440
+ "description": "Submit a file matching input_schema, after reviewing confirm:",
1441
+ "command": "<%= config.bin %> migrations run ACTION_ID -m mig_7x2 --input-file ./decisions.json --yes --json"
1442
+ },
1443
+ {
1444
+ "description": "Read the same prepared input from stdin:",
1445
+ "command": "<%= config.bin %> migrations run ACTION_ID -m mig_7x2 --input-file - --yes --json < ./decisions.json"
1446
+ },
1447
+ {
1448
+ "description": "Get an external action link without opening a browser:",
1449
+ "command": "<%= config.bin %> migrations run ACTION_ID -m mig_7x2 --no-browser"
1450
+ }
1396
1451
  ],
1397
1452
  "flags": {
1398
1453
  "json": {
@@ -1402,55 +1457,105 @@
1402
1457
  "allowNo": false,
1403
1458
  "type": "boolean"
1404
1459
  },
1405
- "app": {
1406
- "description": "App ID (UUID)",
1407
- "name": "app",
1408
- "required": true,
1460
+ "migration": {
1461
+ "char": "m",
1462
+ "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
1463
+ "name": "migration",
1409
1464
  "hasDynamicHelp": false,
1465
+ "helpValue": "ID",
1410
1466
  "multiple": false,
1411
1467
  "type": "option"
1412
1468
  },
1413
- "product-id": {
1414
- "description": "Product ID (UUID). Repeat for multiple.",
1415
- "name": "product-id",
1416
- "required": true,
1469
+ "input": {
1470
+ "description": "Input action data as a JSON object matching input_schema",
1471
+ "exclusive": [
1472
+ "input-file"
1473
+ ],
1474
+ "name": "input",
1417
1475
  "hasDynamicHelp": false,
1418
- "multiple": true,
1476
+ "helpValue": "JSON",
1477
+ "multiple": false,
1419
1478
  "type": "option"
1420
1479
  },
1421
- "title": {
1422
- "description": "Paywall title",
1423
- "name": "title",
1424
- "required": true,
1480
+ "input-file": {
1481
+ "description": "Read an input action's JSON object from a file; use - for stdin",
1482
+ "exclusive": [
1483
+ "input"
1484
+ ],
1485
+ "name": "input-file",
1425
1486
  "hasDynamicHelp": false,
1487
+ "helpValue": "PATH",
1426
1488
  "multiple": false,
1427
1489
  "type": "option"
1490
+ },
1491
+ "yes": {
1492
+ "char": "y",
1493
+ "description": "Confirm the input action after reviewing its confirmation text",
1494
+ "name": "yes",
1495
+ "allowNo": false,
1496
+ "type": "boolean"
1497
+ },
1498
+ "open": {
1499
+ "description": "Open an external action's HTTPS link, including with pipes or --json",
1500
+ "exclusive": [
1501
+ "no-browser"
1502
+ ],
1503
+ "name": "open",
1504
+ "allowNo": false,
1505
+ "type": "boolean"
1506
+ },
1507
+ "no-browser": {
1508
+ "description": "Show the external action without opening a browser",
1509
+ "exclusive": [
1510
+ "open"
1511
+ ],
1512
+ "name": "no-browser",
1513
+ "allowNo": false,
1514
+ "type": "boolean"
1428
1515
  }
1429
1516
  },
1430
1517
  "hasDynamicHelp": false,
1431
1518
  "hiddenAliases": [],
1432
- "id": "paywalls:update",
1519
+ "id": "migrations:run",
1433
1520
  "pluginAlias": "adapty",
1434
1521
  "pluginName": "adapty",
1435
1522
  "pluginType": "core",
1436
1523
  "strict": true,
1437
- "enableJsonFlag": true,
1524
+ "summary": "Run an input action, open an external action link, or hand an agent action to a coding agent",
1438
1525
  "isESM": true,
1439
1526
  "relativePath": [
1440
1527
  "dist",
1441
1528
  "commands",
1442
- "paywalls",
1443
- "update.js"
1529
+ "migrations",
1530
+ "run.js"
1444
1531
  ]
1445
1532
  },
1446
- "placements:create": {
1533
+ "migrations:show": {
1447
1534
  "aliases": [],
1448
- "args": {},
1449
- "description": "Create a placement with a paywall",
1535
+ "args": {
1536
+ "resource": {
1537
+ "description": "Resource name; omit to list what can be read now",
1538
+ "name": "resource"
1539
+ }
1540
+ },
1541
+ "description": "Omit RESOURCE to list what can be read now. Use a name from that list, such as apps or mapping.\n\nReading a resource prints its data as JSON. With --json, returns the full migration response.\nResource data is in result (null if no data is available yet).",
1450
1542
  "examples": [
1451
- "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"paywall\",\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1452
- "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"flow\",\"segment_ids\":[],\"flow_id\":\"FLOW_UUID\",\"priority\":0}]'",
1453
- "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
1543
+ {
1544
+ "description": "Read the RevenueCat apps of the selected migration:",
1545
+ "command": "<%= config.bin %> migrations show apps"
1546
+ },
1547
+ {
1548
+ "description": "List resource names available now:",
1549
+ "command": "<%= config.bin %> migrations show -m mig_7x2"
1550
+ },
1551
+ {
1552
+ "description": "Read mapping data, if listed as available:",
1553
+ "command": "<%= config.bin %> migrations show mapping -m mig_7x2"
1554
+ },
1555
+ {
1556
+ "description": "Extract only the resource data (requires jq):",
1557
+ "command": "<%= config.bin %> migrations show mapping -m mig_7x2 --json | jq '.result'"
1558
+ }
1454
1559
  ],
1455
1560
  "flags": {
1456
1561
  "json": {
@@ -1460,73 +1565,53 @@
1460
1565
  "allowNo": false,
1461
1566
  "type": "boolean"
1462
1567
  },
1463
- "app": {
1464
- "description": "App ID (UUID)",
1465
- "name": "app",
1466
- "required": true,
1467
- "hasDynamicHelp": false,
1468
- "multiple": false,
1469
- "type": "option"
1470
- },
1471
- "audiences": {
1472
- "description": "JSON array of audience entries. Every entry needs an explicit content_type. Paywall: {content_type:\"paywall\", segment_ids, paywall_id, priority}. Flow: {content_type:\"flow\", segment_ids, flow_id, priority}. A flow must be published first (flows publish) — attaching a draft flow returns 400.",
1473
- "name": "audiences",
1474
- "hasDynamicHelp": false,
1475
- "multiple": false,
1476
- "type": "option"
1477
- },
1478
- "developer-id": {
1479
- "description": "Developer ID for the placement",
1480
- "name": "developer-id",
1481
- "required": true,
1482
- "hasDynamicHelp": false,
1483
- "multiple": false,
1484
- "type": "option"
1485
- },
1486
- "paywall-id": {
1487
- "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
1488
- "name": "paywall-id",
1489
- "hasDynamicHelp": false,
1490
- "multiple": false,
1491
- "type": "option"
1492
- },
1493
- "title": {
1494
- "description": "Placement title",
1495
- "name": "title",
1496
- "required": true,
1568
+ "migration": {
1569
+ "char": "m",
1570
+ "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
1571
+ "name": "migration",
1497
1572
  "hasDynamicHelp": false,
1573
+ "helpValue": "ID",
1498
1574
  "multiple": false,
1499
1575
  "type": "option"
1500
1576
  }
1501
1577
  },
1502
1578
  "hasDynamicHelp": false,
1503
1579
  "hiddenAliases": [],
1504
- "id": "placements:create",
1580
+ "id": "migrations:show",
1505
1581
  "pluginAlias": "adapty",
1506
1582
  "pluginName": "adapty",
1507
1583
  "pluginType": "core",
1508
1584
  "strict": true,
1509
- "enableJsonFlag": true,
1585
+ "summary": "List migration resources or read one resource",
1510
1586
  "isESM": true,
1511
1587
  "relativePath": [
1512
1588
  "dist",
1513
1589
  "commands",
1514
- "placements",
1515
- "create.js"
1590
+ "migrations",
1591
+ "show.js"
1516
1592
  ]
1517
1593
  },
1518
- "placements:get": {
1594
+ "migrations:status": {
1519
1595
  "aliases": [],
1520
- "args": {
1521
- "placement_id": {
1522
- "description": "Placement ID (UUID)",
1523
- "name": "placement_id",
1524
- "required": true
1525
- }
1526
- },
1527
- "description": "Get placement details",
1596
+ "args": {},
1597
+ "description": "Read next_actions for the next steps and available_actions for optional actions.\nUse --json to read each action's input_schema, reads, and confirmation text.\n\n--wait returns when the revision changes, the state leaves running, or the polling budget runs out.\nExit 0 means the request succeeded, even if the migration is still running or has failed.\nCheck migration.state in JSON output. Progress goes to stderr. Ctrl+C exits with code 130.",
1528
1598
  "examples": [
1529
- "<%= config.bin %> placements get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1599
+ {
1600
+ "description": "Inspect the saved migration:",
1601
+ "command": "<%= config.bin %> migrations status"
1602
+ },
1603
+ {
1604
+ "description": "See the current state and what to do next:",
1605
+ "command": "<%= config.bin %> migrations status -m mig_7x2"
1606
+ },
1607
+ {
1608
+ "description": "Read action IDs, input schemas, and confirmation text as JSON:",
1609
+ "command": "<%= config.bin %> migrations status -m mig_7x2 --json"
1610
+ },
1611
+ {
1612
+ "description": "Wait for a change with a five-minute polling budget:",
1613
+ "command": "<%= config.bin %> migrations status -m mig_7x2 --wait --timeout 5m --json"
1614
+ }
1530
1615
  ],
1531
1616
  "flags": {
1532
1617
  "json": {
@@ -1536,37 +1621,66 @@
1536
1621
  "allowNo": false,
1537
1622
  "type": "boolean"
1538
1623
  },
1539
- "app": {
1540
- "description": "App ID (UUID)",
1541
- "name": "app",
1542
- "required": true,
1624
+ "migration": {
1625
+ "char": "m",
1626
+ "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
1627
+ "name": "migration",
1628
+ "hasDynamicHelp": false,
1629
+ "helpValue": "ID",
1630
+ "multiple": false,
1631
+ "type": "option"
1632
+ },
1633
+ "timeout": {
1634
+ "dependsOn": [
1635
+ "wait"
1636
+ ],
1637
+ "description": "Polling budget with --wait: 1-600s, default 120s (e.g. 300, 300s, 5m); in-flight requests may take longer",
1638
+ "name": "timeout",
1543
1639
  "hasDynamicHelp": false,
1640
+ "helpValue": "DURATION",
1544
1641
  "multiple": false,
1545
1642
  "type": "option"
1643
+ },
1644
+ "wait": {
1645
+ "description": "Poll for a revision or state change, then return the latest response",
1646
+ "name": "wait",
1647
+ "allowNo": false,
1648
+ "type": "boolean"
1546
1649
  }
1547
1650
  },
1548
1651
  "hasDynamicHelp": false,
1549
1652
  "hiddenAliases": [],
1550
- "id": "placements:get",
1653
+ "id": "migrations:status",
1551
1654
  "pluginAlias": "adapty",
1552
1655
  "pluginName": "adapty",
1553
1656
  "pluginType": "core",
1554
1657
  "strict": true,
1555
- "enableJsonFlag": true,
1658
+ "summary": "Show migration state, issues, and available actions",
1556
1659
  "isESM": true,
1557
1660
  "relativePath": [
1558
1661
  "dist",
1559
1662
  "commands",
1560
- "placements",
1561
- "get.js"
1663
+ "migrations",
1664
+ "status.js"
1562
1665
  ]
1563
1666
  },
1564
- "placements:list": {
1667
+ "migrations:steps": {
1565
1668
  "aliases": [],
1566
1669
  "args": {},
1567
- "description": "List placements for an app",
1670
+ "description": "Shows done, active, and locked steps in migration order.\nTo find actions you can run, use `adapty migrations status -m ID`.\n\nWith --json, the full migration response is returned; the checklist is in steps.",
1568
1671
  "examples": [
1569
- "<%= config.bin %> placements list --app 550e8400-..."
1672
+ {
1673
+ "description": "View the saved migration checklist:",
1674
+ "command": "<%= config.bin %> migrations steps"
1675
+ },
1676
+ {
1677
+ "description": "View the checklist:",
1678
+ "command": "<%= config.bin %> migrations steps -m mig_7x2"
1679
+ },
1680
+ {
1681
+ "description": "Extract the checklist as JSON (requires jq):",
1682
+ "command": "<%= config.bin %> migrations steps -m mig_7x2 --json | jq '.steps'"
1683
+ }
1570
1684
  ],
1571
1685
  "flags": {
1572
1686
  "json": {
@@ -1576,61 +1690,38 @@
1576
1690
  "allowNo": false,
1577
1691
  "type": "boolean"
1578
1692
  },
1579
- "app": {
1580
- "description": "App ID (UUID)",
1581
- "name": "app",
1582
- "required": true,
1583
- "hasDynamicHelp": false,
1584
- "multiple": false,
1585
- "type": "option"
1586
- },
1587
- "page": {
1588
- "description": "Page number",
1589
- "name": "page",
1590
- "default": 1,
1591
- "hasDynamicHelp": false,
1592
- "multiple": false,
1593
- "type": "option"
1594
- },
1595
- "page-size": {
1596
- "description": "Items per page (max 100)",
1597
- "name": "page-size",
1598
- "default": 20,
1693
+ "migration": {
1694
+ "char": "m",
1695
+ "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
1696
+ "name": "migration",
1599
1697
  "hasDynamicHelp": false,
1698
+ "helpValue": "ID",
1600
1699
  "multiple": false,
1601
1700
  "type": "option"
1602
1701
  }
1603
1702
  },
1604
1703
  "hasDynamicHelp": false,
1605
1704
  "hiddenAliases": [],
1606
- "id": "placements:list",
1705
+ "id": "migrations:steps",
1607
1706
  "pluginAlias": "adapty",
1608
1707
  "pluginName": "adapty",
1609
1708
  "pluginType": "core",
1610
1709
  "strict": true,
1611
- "enableJsonFlag": true,
1710
+ "summary": "Show the migration checklist and step statuses",
1612
1711
  "isESM": true,
1613
1712
  "relativePath": [
1614
1713
  "dist",
1615
1714
  "commands",
1616
- "placements",
1617
- "list.js"
1715
+ "migrations",
1716
+ "steps.js"
1618
1717
  ]
1619
1718
  },
1620
- "placements:update": {
1719
+ "migrations:unuse": {
1621
1720
  "aliases": [],
1622
- "args": {
1623
- "placement_id": {
1624
- "description": "Placement ID (UUID)",
1625
- "name": "placement_id",
1626
- "required": true
1627
- }
1628
- },
1629
- "description": "Update a placement",
1721
+ "args": {},
1722
+ "description": "Works without authentication, including when the saved context is malformed.\nADAPTY_MIGRATION remains active until you unset it in your shell.",
1630
1723
  "examples": [
1631
- "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"paywall\",\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
1632
- "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"flow\",\"segment_ids\":[],\"flow_id\":\"FLOW_UUID\",\"priority\":0}]'",
1633
- "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
1724
+ "<%= config.bin %> migrations unuse"
1634
1725
  ],
1635
1726
  "flags": {
1636
1727
  "json": {
@@ -1639,68 +1730,69 @@
1639
1730
  "name": "json",
1640
1731
  "allowNo": false,
1641
1732
  "type": "boolean"
1642
- },
1643
- "app": {
1644
- "description": "App ID (UUID)",
1645
- "name": "app",
1646
- "required": true,
1647
- "hasDynamicHelp": false,
1648
- "multiple": false,
1649
- "type": "option"
1650
- },
1651
- "audiences": {
1652
- "description": "JSON array of audience entries. Every entry needs an explicit content_type. Paywall: {content_type:\"paywall\", segment_ids, paywall_id, priority}. Flow: {content_type:\"flow\", segment_ids, flow_id, priority}. A flow must be published first (flows publish) — attaching a draft flow returns 400.",
1653
- "name": "audiences",
1654
- "hasDynamicHelp": false,
1655
- "multiple": false,
1656
- "type": "option"
1657
- },
1658
- "developer-id": {
1659
- "description": "Developer ID for the placement",
1660
- "name": "developer-id",
1661
- "required": true,
1662
- "hasDynamicHelp": false,
1663
- "multiple": false,
1664
- "type": "option"
1665
- },
1666
- "paywall-id": {
1667
- "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
1668
- "name": "paywall-id",
1669
- "hasDynamicHelp": false,
1670
- "multiple": false,
1671
- "type": "option"
1672
- },
1673
- "title": {
1674
- "description": "Placement title",
1675
- "name": "title",
1676
- "required": true,
1677
- "hasDynamicHelp": false,
1678
- "multiple": false,
1679
- "type": "option"
1680
1733
  }
1681
1734
  },
1682
1735
  "hasDynamicHelp": false,
1683
1736
  "hiddenAliases": [],
1684
- "id": "placements:update",
1737
+ "id": "migrations:unuse",
1685
1738
  "pluginAlias": "adapty",
1686
1739
  "pluginName": "adapty",
1687
1740
  "pluginType": "core",
1688
1741
  "strict": true,
1742
+ "summary": "Clear the saved migration selection (no network)",
1689
1743
  "enableJsonFlag": true,
1690
1744
  "isESM": true,
1691
1745
  "relativePath": [
1692
1746
  "dist",
1693
1747
  "commands",
1694
- "placements",
1695
- "update.js"
1748
+ "migrations",
1749
+ "unuse.js"
1696
1750
  ]
1697
1751
  },
1698
- "products:create": {
1752
+ "migrations:use": {
1753
+ "aliases": [],
1754
+ "args": {
1755
+ "id": {
1756
+ "description": "Migration ID from `adapty migrations list`",
1757
+ "name": "id",
1758
+ "required": true
1759
+ }
1760
+ },
1761
+ "description": "Select a migration for the current token. This does not start or modify the migration.\nCompleted, canceled and failed migrations can also be selected for inspection.\nADAPTY_MIGRATION overrides the saved selection until you unset it in your shell.",
1762
+ "examples": [
1763
+ "<%= config.bin %> migrations use mig_7x2"
1764
+ ],
1765
+ "flags": {
1766
+ "json": {
1767
+ "description": "Format output as json.",
1768
+ "helpGroup": "GLOBAL",
1769
+ "name": "json",
1770
+ "allowNo": false,
1771
+ "type": "boolean"
1772
+ }
1773
+ },
1774
+ "hasDynamicHelp": false,
1775
+ "hiddenAliases": [],
1776
+ "id": "migrations:use",
1777
+ "pluginAlias": "adapty",
1778
+ "pluginName": "adapty",
1779
+ "pluginType": "core",
1780
+ "strict": true,
1781
+ "summary": "Save the current migration after verifying access",
1782
+ "isESM": true,
1783
+ "relativePath": [
1784
+ "dist",
1785
+ "commands",
1786
+ "migrations",
1787
+ "use.js"
1788
+ ]
1789
+ },
1790
+ "paywalls:create": {
1699
1791
  "aliases": [],
1700
1792
  "args": {},
1701
- "description": "Create a product with vendor products per platform",
1793
+ "description": "Create a paywall with products",
1702
1794
  "examples": [
1703
- "<%= config.bin %> products create --app UUID --title \"Monthly\" --access-level-id UUID --period monthly --ios-product-id com.example.monthly"
1795
+ "<%= config.bin %> paywalls create --app UUID --title \"Default Paywall\" --product-id UUID1 --product-id UUID2"
1704
1796
  ],
1705
1797
  "flags": {
1706
1798
  "json": {
@@ -1718,80 +1810,16 @@
1718
1810
  "multiple": false,
1719
1811
  "type": "option"
1720
1812
  },
1721
- "access-level-id": {
1722
- "description": "Access level ID (UUID)",
1723
- "name": "access-level-id",
1724
- "required": true,
1725
- "hasDynamicHelp": false,
1726
- "multiple": false,
1727
- "type": "option"
1728
- },
1729
- "android-base-plan-id": {
1730
- "description": "Android base plan ID",
1731
- "helpGroup": "STORE BINDINGS",
1732
- "name": "android-base-plan-id",
1733
- "hasDynamicHelp": false,
1734
- "multiple": false,
1735
- "type": "option"
1736
- },
1737
- "android-product-id": {
1738
- "description": "Android product ID",
1739
- "helpGroup": "STORE BINDINGS",
1740
- "name": "android-product-id",
1741
- "hasDynamicHelp": false,
1742
- "multiple": false,
1743
- "type": "option"
1744
- },
1745
- "ios-product-id": {
1746
- "description": "iOS product ID",
1747
- "helpGroup": "STORE BINDINGS",
1748
- "name": "ios-product-id",
1749
- "hasDynamicHelp": false,
1750
- "multiple": false,
1751
- "type": "option"
1752
- },
1753
- "paddle-price-id": {
1754
- "description": "Paddle price ID (requires --paddle-product-id)",
1755
- "helpGroup": "STORE BINDINGS",
1756
- "name": "paddle-price-id",
1757
- "hasDynamicHelp": false,
1758
- "multiple": false,
1759
- "type": "option"
1760
- },
1761
- "paddle-product-id": {
1762
- "description": "Paddle product ID (requires --paddle-price-id)",
1763
- "helpGroup": "STORE BINDINGS",
1764
- "name": "paddle-product-id",
1765
- "hasDynamicHelp": false,
1766
- "multiple": false,
1767
- "type": "option"
1768
- },
1769
- "period": {
1770
- "description": "Subscription period (weekly, monthly, two_months, trimonthly, semiannual, annual, lifetime)",
1771
- "name": "period",
1813
+ "product-id": {
1814
+ "description": "Product ID (UUID). Repeat for multiple.",
1815
+ "name": "product-id",
1772
1816
  "required": true,
1773
1817
  "hasDynamicHelp": false,
1774
- "multiple": false,
1775
- "type": "option"
1776
- },
1777
- "stripe-price-id": {
1778
- "description": "Stripe price ID (requires --stripe-product-id)",
1779
- "helpGroup": "STORE BINDINGS",
1780
- "name": "stripe-price-id",
1781
- "hasDynamicHelp": false,
1782
- "multiple": false,
1783
- "type": "option"
1784
- },
1785
- "stripe-product-id": {
1786
- "description": "Stripe product ID (requires --stripe-price-id)",
1787
- "helpGroup": "STORE BINDINGS",
1788
- "name": "stripe-product-id",
1789
- "hasDynamicHelp": false,
1790
- "multiple": false,
1818
+ "multiple": true,
1791
1819
  "type": "option"
1792
1820
  },
1793
1821
  "title": {
1794
- "description": "Product title",
1822
+ "description": "Paywall title",
1795
1823
  "name": "title",
1796
1824
  "required": true,
1797
1825
  "hasDynamicHelp": false,
@@ -1801,7 +1829,7 @@
1801
1829
  },
1802
1830
  "hasDynamicHelp": false,
1803
1831
  "hiddenAliases": [],
1804
- "id": "products:create",
1832
+ "id": "paywalls:create",
1805
1833
  "pluginAlias": "adapty",
1806
1834
  "pluginName": "adapty",
1807
1835
  "pluginType": "core",
@@ -1811,22 +1839,22 @@
1811
1839
  "relativePath": [
1812
1840
  "dist",
1813
1841
  "commands",
1814
- "products",
1842
+ "paywalls",
1815
1843
  "create.js"
1816
1844
  ]
1817
1845
  },
1818
- "products:get": {
1846
+ "paywalls:get": {
1819
1847
  "aliases": [],
1820
1848
  "args": {
1821
- "product_id": {
1822
- "description": "Product ID (UUID)",
1823
- "name": "product_id",
1849
+ "paywall_id": {
1850
+ "description": "Paywall ID (UUID)",
1851
+ "name": "paywall_id",
1824
1852
  "required": true
1825
1853
  }
1826
1854
  },
1827
- "description": "Get product details",
1855
+ "description": "Get paywall details",
1828
1856
  "examples": [
1829
- "<%= config.bin %> products get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1857
+ "<%= config.bin %> paywalls get --app UUID 550e8400-e29b-41d4-a716-446655440000"
1830
1858
  ],
1831
1859
  "flags": {
1832
1860
  "json": {
@@ -1847,7 +1875,7 @@
1847
1875
  },
1848
1876
  "hasDynamicHelp": false,
1849
1877
  "hiddenAliases": [],
1850
- "id": "products:get",
1878
+ "id": "paywalls:get",
1851
1879
  "pluginAlias": "adapty",
1852
1880
  "pluginName": "adapty",
1853
1881
  "pluginType": "core",
@@ -1857,16 +1885,16 @@
1857
1885
  "relativePath": [
1858
1886
  "dist",
1859
1887
  "commands",
1860
- "products",
1888
+ "paywalls",
1861
1889
  "get.js"
1862
1890
  ]
1863
1891
  },
1864
- "products:list": {
1892
+ "paywalls:list": {
1865
1893
  "aliases": [],
1866
1894
  "args": {},
1867
- "description": "List products for an app",
1895
+ "description": "List paywalls for an app",
1868
1896
  "examples": [
1869
- "<%= config.bin %> products list --app 550e8400-..."
1897
+ "<%= config.bin %> paywalls list --app 550e8400-..."
1870
1898
  ],
1871
1899
  "flags": {
1872
1900
  "json": {
@@ -1903,7 +1931,7 @@
1903
1931
  },
1904
1932
  "hasDynamicHelp": false,
1905
1933
  "hiddenAliases": [],
1906
- "id": "products:list",
1934
+ "id": "paywalls:list",
1907
1935
  "pluginAlias": "adapty",
1908
1936
  "pluginName": "adapty",
1909
1937
  "pluginType": "core",
@@ -1913,22 +1941,22 @@
1913
1941
  "relativePath": [
1914
1942
  "dist",
1915
1943
  "commands",
1916
- "products",
1944
+ "paywalls",
1917
1945
  "list.js"
1918
1946
  ]
1919
1947
  },
1920
- "products:update": {
1948
+ "paywalls:placements": {
1921
1949
  "aliases": [],
1922
1950
  "args": {
1923
- "product_id": {
1924
- "description": "Product ID (UUID)",
1925
- "name": "product_id",
1951
+ "paywall_id": {
1952
+ "description": "Paywall ID (UUID)",
1953
+ "name": "paywall_id",
1926
1954
  "required": true
1927
1955
  }
1928
1956
  },
1929
- "description": "Update a product (title and access level only)",
1957
+ "description": "List placements that currently use this paywall",
1930
1958
  "examples": [
1931
- "<%= config.bin %> products update --app UUID 550e8400-... --title \"Monthly\" --access-level-id UUID"
1959
+ "<%= config.bin %> paywalls placements --app UUID 770e8400-e29b-41d4-a716-446655440002"
1932
1960
  ],
1933
1961
  "flags": {
1934
1962
  "json": {
@@ -1945,27 +1973,11 @@
1945
1973
  "hasDynamicHelp": false,
1946
1974
  "multiple": false,
1947
1975
  "type": "option"
1948
- },
1949
- "access-level-id": {
1950
- "description": "Access level ID (UUID)",
1951
- "name": "access-level-id",
1952
- "required": true,
1953
- "hasDynamicHelp": false,
1954
- "multiple": false,
1955
- "type": "option"
1956
- },
1957
- "title": {
1958
- "description": "Product title",
1959
- "name": "title",
1960
- "required": true,
1961
- "hasDynamicHelp": false,
1962
- "multiple": false,
1963
- "type": "option"
1964
1976
  }
1965
1977
  },
1966
1978
  "hasDynamicHelp": false,
1967
1979
  "hiddenAliases": [],
1968
- "id": "products:update",
1980
+ "id": "paywalls:placements",
1969
1981
  "pluginAlias": "adapty",
1970
1982
  "pluginName": "adapty",
1971
1983
  "pluginType": "core",
@@ -1975,22 +1987,22 @@
1975
1987
  "relativePath": [
1976
1988
  "dist",
1977
1989
  "commands",
1978
- "products",
1979
- "update.js"
1990
+ "paywalls",
1991
+ "placements.js"
1980
1992
  ]
1981
1993
  },
1982
- "segments:get": {
1994
+ "paywalls:update": {
1983
1995
  "aliases": [],
1984
1996
  "args": {
1985
- "segment_id": {
1986
- "description": "Segment ID (UUID)",
1987
- "name": "segment_id",
1997
+ "paywall_id": {
1998
+ "description": "Paywall ID (UUID)",
1999
+ "name": "paywall_id",
1988
2000
  "required": true
1989
2001
  }
1990
2002
  },
1991
- "description": "Get segment details",
2003
+ "description": "Update a paywall",
1992
2004
  "examples": [
1993
- "<%= config.bin %> segments get --app UUID 550e8400-e29b-41d4-a716-446655440000"
2005
+ "<%= config.bin %> paywalls update --app UUID 550e8400-... --title \"Default Paywall\" --product-id UUID1 --product-id UUID2"
1994
2006
  ],
1995
2007
  "flags": {
1996
2008
  "json": {
@@ -2007,30 +2019,48 @@
2007
2019
  "hasDynamicHelp": false,
2008
2020
  "multiple": false,
2009
2021
  "type": "option"
2010
- }
2011
- },
2012
- "hasDynamicHelp": false,
2013
- "hiddenAliases": [],
2014
- "id": "segments:get",
2015
- "pluginAlias": "adapty",
2016
- "pluginName": "adapty",
2017
- "pluginType": "core",
2018
- "strict": true,
2019
- "enableJsonFlag": true,
2020
- "isESM": true,
2021
- "relativePath": [
2022
- "dist",
2023
- "commands",
2024
- "segments",
2025
- "get.js"
2022
+ },
2023
+ "product-id": {
2024
+ "description": "Product ID (UUID). Repeat for multiple.",
2025
+ "name": "product-id",
2026
+ "required": true,
2027
+ "hasDynamicHelp": false,
2028
+ "multiple": true,
2029
+ "type": "option"
2030
+ },
2031
+ "title": {
2032
+ "description": "Paywall title",
2033
+ "name": "title",
2034
+ "required": true,
2035
+ "hasDynamicHelp": false,
2036
+ "multiple": false,
2037
+ "type": "option"
2038
+ }
2039
+ },
2040
+ "hasDynamicHelp": false,
2041
+ "hiddenAliases": [],
2042
+ "id": "paywalls:update",
2043
+ "pluginAlias": "adapty",
2044
+ "pluginName": "adapty",
2045
+ "pluginType": "core",
2046
+ "strict": true,
2047
+ "enableJsonFlag": true,
2048
+ "isESM": true,
2049
+ "relativePath": [
2050
+ "dist",
2051
+ "commands",
2052
+ "paywalls",
2053
+ "update.js"
2026
2054
  ]
2027
2055
  },
2028
- "segments:list": {
2056
+ "placements:create": {
2029
2057
  "aliases": [],
2030
2058
  "args": {},
2031
- "description": "List segments for an app",
2059
+ "description": "Create a placement with a paywall",
2032
2060
  "examples": [
2033
- "<%= config.bin %> segments list --app 550e8400-..."
2061
+ "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"paywall\",\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
2062
+ "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"flow\",\"segment_ids\":[],\"flow_id\":\"FLOW_UUID\",\"priority\":0}]'",
2063
+ "<%= config.bin %> placements create --app UUID --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
2034
2064
  ],
2035
2065
  "flags": {
2036
2066
  "json": {
@@ -2048,18 +2078,32 @@
2048
2078
  "multiple": false,
2049
2079
  "type": "option"
2050
2080
  },
2051
- "page": {
2052
- "description": "Page number",
2053
- "name": "page",
2054
- "default": 1,
2081
+ "audiences": {
2082
+ "description": "JSON array of audience entries. Every entry needs an explicit content_type. Paywall: {content_type:\"paywall\", segment_ids, paywall_id, priority}. Flow: {content_type:\"flow\", segment_ids, flow_id, priority}. A flow must be published first (flows publish) — attaching a draft flow returns 400.",
2083
+ "name": "audiences",
2055
2084
  "hasDynamicHelp": false,
2056
2085
  "multiple": false,
2057
2086
  "type": "option"
2058
2087
  },
2059
- "page-size": {
2060
- "description": "Items per page (max 100)",
2061
- "name": "page-size",
2062
- "default": 20,
2088
+ "developer-id": {
2089
+ "description": "Developer ID for the placement",
2090
+ "name": "developer-id",
2091
+ "required": true,
2092
+ "hasDynamicHelp": false,
2093
+ "multiple": false,
2094
+ "type": "option"
2095
+ },
2096
+ "paywall-id": {
2097
+ "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
2098
+ "name": "paywall-id",
2099
+ "hasDynamicHelp": false,
2100
+ "multiple": false,
2101
+ "type": "option"
2102
+ },
2103
+ "title": {
2104
+ "description": "Placement title",
2105
+ "name": "title",
2106
+ "required": true,
2063
2107
  "hasDynamicHelp": false,
2064
2108
  "multiple": false,
2065
2109
  "type": "option"
@@ -2067,7 +2111,7 @@
2067
2111
  },
2068
2112
  "hasDynamicHelp": false,
2069
2113
  "hiddenAliases": [],
2070
- "id": "segments:list",
2114
+ "id": "placements:create",
2071
2115
  "pluginAlias": "adapty",
2072
2116
  "pluginName": "adapty",
2073
2117
  "pluginType": "core",
@@ -2077,31 +2121,22 @@
2077
2121
  "relativePath": [
2078
2122
  "dist",
2079
2123
  "commands",
2080
- "segments",
2081
- "list.js"
2124
+ "placements",
2125
+ "create.js"
2082
2126
  ]
2083
2127
  },
2084
- "migrations:close": {
2128
+ "placements:get": {
2085
2129
  "aliases": [],
2086
- "args": {},
2087
- "description": "Choose finish to mark the migration as completed, or cancel to abandon it.\nBoth outcomes permanently close the migration and require --yes. No confirmation prompt is shown.\n\nWith --json, returns the full migration response after closing.",
2088
- "examples": [
2089
- {
2090
- "description": "Finish the saved migration:",
2091
- "command": "<%= config.bin %> migrations close --outcome finish --yes"
2092
- },
2093
- {
2094
- "description": "Mark the migration as finished:",
2095
- "command": "<%= config.bin %> migrations close -m mig_7x2 --outcome finish --yes"
2096
- },
2097
- {
2098
- "description": "Abandon the migration:",
2099
- "command": "<%= config.bin %> migrations close -m mig_7x2 --outcome cancel --yes"
2100
- },
2101
- {
2102
- "description": "Finish and return the final state as JSON:",
2103
- "command": "<%= config.bin %> migrations close -m mig_7x2 --outcome finish --yes --json"
2130
+ "args": {
2131
+ "placement_id": {
2132
+ "description": "Placement ID (UUID)",
2133
+ "name": "placement_id",
2134
+ "required": true
2104
2135
  }
2136
+ },
2137
+ "description": "Get placement details",
2138
+ "examples": [
2139
+ "<%= config.bin %> placements get --app UUID 550e8400-e29b-41d4-a716-446655440000"
2105
2140
  ],
2106
2141
  "flags": {
2107
2142
  "json": {
@@ -2111,69 +2146,37 @@
2111
2146
  "allowNo": false,
2112
2147
  "type": "boolean"
2113
2148
  },
2114
- "migration": {
2115
- "char": "m",
2116
- "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
2117
- "name": "migration",
2118
- "hasDynamicHelp": false,
2119
- "helpValue": "ID",
2120
- "multiple": false,
2121
- "type": "option"
2122
- },
2123
- "outcome": {
2124
- "description": "finish: mark completed; cancel: abandon the migration",
2125
- "name": "outcome",
2149
+ "app": {
2150
+ "description": "App ID (UUID)",
2151
+ "name": "app",
2126
2152
  "required": true,
2127
2153
  "hasDynamicHelp": false,
2128
2154
  "multiple": false,
2129
- "options": [
2130
- "finish",
2131
- "cancel"
2132
- ],
2133
2155
  "type": "option"
2134
- },
2135
- "yes": {
2136
- "char": "y",
2137
- "description": "Confirm permanent closure of this migration",
2138
- "name": "yes",
2139
- "required": true,
2140
- "allowNo": false,
2141
- "type": "boolean"
2142
2156
  }
2143
2157
  },
2144
2158
  "hasDynamicHelp": false,
2145
2159
  "hiddenAliases": [],
2146
- "id": "migrations:close",
2160
+ "id": "placements:get",
2147
2161
  "pluginAlias": "adapty",
2148
2162
  "pluginName": "adapty",
2149
2163
  "pluginType": "core",
2150
2164
  "strict": true,
2151
- "summary": "Permanently finish or cancel a migration",
2165
+ "enableJsonFlag": true,
2152
2166
  "isESM": true,
2153
2167
  "relativePath": [
2154
2168
  "dist",
2155
2169
  "commands",
2156
- "migrations",
2157
- "close.js"
2170
+ "placements",
2171
+ "get.js"
2158
2172
  ]
2159
2173
  },
2160
- "migrations:create": {
2174
+ "placements:list": {
2161
2175
  "aliases": [],
2162
2176
  "args": {},
2163
- "description": "Use --name to migrate a catalog into a new Adapty app.\nFor an existing app, use --flow and --app together. Choose a flow and its app from `adapty migrations list`.\n\nCreation starts the flow and saves it as current; use `adapty migrations status` to continue.\nUse --no-select to keep the previous selection. ADAPTY_MIGRATION overrides saved selection.\nWith --json, the migration ID is in migration.id.",
2177
+ "description": "List placements for an app",
2164
2178
  "examples": [
2165
- {
2166
- "description": "Start a catalog migration into a new app:",
2167
- "command": "<%= config.bin %> migrations create --name \"Acme Fitness\""
2168
- },
2169
- {
2170
- "description": "Start transactions for an existing app, if listed as available:",
2171
- "command": "<%= config.bin %> migrations create --flow transactions --app 3f2ab1c4-0000-4000-8000-000000000000"
2172
- },
2173
- {
2174
- "description": "Return the new migration as JSON for an agent or script:",
2175
- "command": "<%= config.bin %> migrations create --name \"Acme Fitness\" --json"
2176
- }
2179
+ "<%= config.bin %> placements list --app 550e8400-..."
2177
2180
  ],
2178
2181
  "flags": {
2179
2182
  "json": {
@@ -2183,74 +2186,61 @@
2183
2186
  "allowNo": false,
2184
2187
  "type": "boolean"
2185
2188
  },
2186
- "no-select": {
2187
- "description": "Create without changing the saved migration selection",
2188
- "name": "no-select",
2189
- "allowNo": false,
2190
- "type": "boolean"
2191
- },
2192
- "name": {
2193
- "description": "New Adapty app name; cannot be combined with --flow or --app",
2194
- "exclusive": [
2195
- "app",
2196
- "flow"
2197
- ],
2198
- "name": "name",
2189
+ "app": {
2190
+ "description": "App ID (UUID)",
2191
+ "name": "app",
2192
+ "required": true,
2199
2193
  "hasDynamicHelp": false,
2200
- "helpValue": "APP_NAME",
2201
2194
  "multiple": false,
2202
2195
  "type": "option"
2203
2196
  },
2204
- "flow": {
2205
- "dependsOn": [
2206
- "app"
2207
- ],
2208
- "description": "Available flow from `adapty migrations list`; requires --app",
2209
- "name": "flow",
2197
+ "page": {
2198
+ "description": "Page number",
2199
+ "name": "page",
2200
+ "default": 1,
2210
2201
  "hasDynamicHelp": false,
2211
- "helpValue": "FLOW",
2212
2202
  "multiple": false,
2213
2203
  "type": "option"
2214
2204
  },
2215
- "app": {
2216
- "dependsOn": [
2217
- "flow"
2218
- ],
2219
- "description": "Existing Adapty app ID (UUID); requires --flow",
2220
- "name": "app",
2205
+ "page-size": {
2206
+ "description": "Items per page (max 100)",
2207
+ "name": "page-size",
2208
+ "default": 20,
2221
2209
  "hasDynamicHelp": false,
2222
- "helpValue": "APP_ID",
2223
2210
  "multiple": false,
2224
2211
  "type": "option"
2225
2212
  }
2226
2213
  },
2227
2214
  "hasDynamicHelp": false,
2228
2215
  "hiddenAliases": [],
2229
- "id": "migrations:create",
2216
+ "id": "placements:list",
2230
2217
  "pluginAlias": "adapty",
2231
2218
  "pluginName": "adapty",
2232
2219
  "pluginType": "core",
2233
2220
  "strict": true,
2234
- "summary": "Start a migration into Adapty",
2235
- "usage": [
2236
- "migrations create --name APP_NAME [--no-select] [--json]",
2237
- "migrations create --flow FLOW --app APP_ID [--no-select] [--json]"
2238
- ],
2221
+ "enableJsonFlag": true,
2239
2222
  "isESM": true,
2240
2223
  "relativePath": [
2241
2224
  "dist",
2242
2225
  "commands",
2243
- "migrations",
2244
- "create.js"
2226
+ "placements",
2227
+ "list.js"
2245
2228
  ]
2246
2229
  },
2247
- "migrations:current": {
2230
+ "placements:update": {
2248
2231
  "aliases": [],
2249
- "args": {},
2250
- "description": "ADAPTY_MIGRATION takes precedence over the saved selection for the current token.\nWith no applicable selection, returns null and exits successfully.",
2232
+ "args": {
2233
+ "placement_id": {
2234
+ "description": "Placement ID (UUID)",
2235
+ "name": "placement_id",
2236
+ "required": true
2237
+ }
2238
+ },
2239
+ "description": "Update a placement",
2251
2240
  "examples": [
2252
- "<%= config.bin %> migrations current",
2253
- "<%= config.bin %> migrations current --json"
2241
+ "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"paywall\",\"segment_ids\":[],\"paywall_id\":\"PAYWALL_UUID\",\"priority\":0}]'",
2242
+ "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --audiences '[{\"content_type\":\"flow\",\"segment_ids\":[],\"flow_id\":\"FLOW_UUID\",\"priority\":0}]'",
2243
+ "<%= config.bin %> placements update --app UUID 550e8400-... --title \"Default\" --developer-id default --paywall-id PAYWALL_UUID"
2254
2244
  ],
2255
2245
  "flags": {
2256
2246
  "json": {
@@ -2259,99 +2249,68 @@
2259
2249
  "name": "json",
2260
2250
  "allowNo": false,
2261
2251
  "type": "boolean"
2262
- }
2263
- },
2264
- "hasDynamicHelp": false,
2265
- "hiddenAliases": [],
2266
- "id": "migrations:current",
2267
- "pluginAlias": "adapty",
2268
- "pluginName": "adapty",
2269
- "pluginType": "core",
2270
- "strict": true,
2271
- "summary": "Show the effective migration selection and its source (no network)",
2272
- "enableJsonFlag": true,
2273
- "isESM": true,
2274
- "relativePath": [
2275
- "dist",
2276
- "commands",
2277
- "migrations",
2278
- "current.js"
2279
- ]
2280
- },
2281
- "migrations:list": {
2282
- "aliases": [],
2283
- "args": {},
2284
- "description": "Use a migration ID with `adapty migrations status -m ID` to continue an existing flow.\nStart an available flow with `adapty migrations create --flow FLOW --app APP_ID`.\n\nWith --json, items contains migrations and available contains flows with their target apps.",
2285
- "examples": [
2286
- {
2287
- "description": "Find migrations and available flows, grouped by app:",
2288
- "command": "<%= config.bin %> migrations list"
2289
2252
  },
2290
- {
2291
- "description": "Read migration IDs and available flows as JSON:",
2292
- "command": "<%= config.bin %> migrations list --json"
2293
- }
2294
- ],
2295
- "flags": {
2296
- "json": {
2297
- "description": "Format output as json.",
2298
- "helpGroup": "GLOBAL",
2299
- "name": "json",
2300
- "allowNo": false,
2301
- "type": "boolean"
2253
+ "app": {
2254
+ "description": "App ID (UUID)",
2255
+ "name": "app",
2256
+ "required": true,
2257
+ "hasDynamicHelp": false,
2258
+ "multiple": false,
2259
+ "type": "option"
2260
+ },
2261
+ "audiences": {
2262
+ "description": "JSON array of audience entries. Every entry needs an explicit content_type. Paywall: {content_type:\"paywall\", segment_ids, paywall_id, priority}. Flow: {content_type:\"flow\", segment_ids, flow_id, priority}. A flow must be published first (flows publish) — attaching a draft flow returns 400.",
2263
+ "name": "audiences",
2264
+ "hasDynamicHelp": false,
2265
+ "multiple": false,
2266
+ "type": "option"
2267
+ },
2268
+ "developer-id": {
2269
+ "description": "Developer ID for the placement",
2270
+ "name": "developer-id",
2271
+ "required": true,
2272
+ "hasDynamicHelp": false,
2273
+ "multiple": false,
2274
+ "type": "option"
2275
+ },
2276
+ "paywall-id": {
2277
+ "description": "Paywall ID (UUID). DEPRECATED: use --audiences.",
2278
+ "name": "paywall-id",
2279
+ "hasDynamicHelp": false,
2280
+ "multiple": false,
2281
+ "type": "option"
2282
+ },
2283
+ "title": {
2284
+ "description": "Placement title",
2285
+ "name": "title",
2286
+ "required": true,
2287
+ "hasDynamicHelp": false,
2288
+ "multiple": false,
2289
+ "type": "option"
2302
2290
  }
2303
2291
  },
2304
2292
  "hasDynamicHelp": false,
2305
2293
  "hiddenAliases": [],
2306
- "id": "migrations:list",
2294
+ "id": "placements:update",
2307
2295
  "pluginAlias": "adapty",
2308
2296
  "pluginName": "adapty",
2309
2297
  "pluginType": "core",
2310
2298
  "strict": true,
2311
- "summary": "List migrations and the flows you can start",
2299
+ "enableJsonFlag": true,
2312
2300
  "isESM": true,
2313
2301
  "relativePath": [
2314
2302
  "dist",
2315
2303
  "commands",
2316
- "migrations",
2317
- "list.js"
2304
+ "placements",
2305
+ "update.js"
2318
2306
  ]
2319
2307
  },
2320
- "migrations:run": {
2308
+ "products:create": {
2321
2309
  "aliases": [],
2322
- "args": {
2323
- "action_id": {
2324
- "description": "Offered action ID from `adapty migrations status`",
2325
- "name": "action_id",
2326
- "required": true
2327
- }
2328
- },
2329
- "description": "Choose an action ID from next_actions or available_actions in `adapty migrations status -m ID --json`.\nReplace ACTION_ID in the examples with an offered action ID.\nFor input actions, read the resources in reads and prepare a JSON object matching input_schema.\nOmitting input sends {}. Review confirm before passing --yes.\nWithout --yes, actions requiring confirmation exit with code 6. No confirmation prompt is shown.\n\nExternal actions print a link and open it in an interactive terminal. Complete the browser step, then check status.\nExternal actions reject --input and --input-file, including stdin.\nPipes and --json require --open to launch a browser; BROWSER=none disables it.\nFile uploads are not supported; use the dashboard or an offered Cloud Export action.\n\nWith --json, returns the full migration response (before the browser step for external actions).\nAfter a revision_conflict error, read status and review the action before retrying.",
2310
+ "args": {},
2311
+ "description": "Create a product with vendor products per platform",
2330
2312
  "examples": [
2331
- {
2332
- "description": "Run an offered action on the saved migration after reviewing confirm:",
2333
- "command": "<%= config.bin %> migrations run ACTION_ID --yes"
2334
- },
2335
- {
2336
- "description": "Read current action IDs and input schemas first:",
2337
- "command": "<%= config.bin %> migrations status -m mig_7x2 --json"
2338
- },
2339
- {
2340
- "description": "Submit an empty JSON object, if the action input_schema allows it:",
2341
- "command": "<%= config.bin %> migrations run ACTION_ID -m mig_7x2 --input '{}'"
2342
- },
2343
- {
2344
- "description": "Submit a file matching input_schema, after reviewing confirm:",
2345
- "command": "<%= config.bin %> migrations run ACTION_ID -m mig_7x2 --input-file ./decisions.json --yes --json"
2346
- },
2347
- {
2348
- "description": "Read the same prepared input from stdin:",
2349
- "command": "<%= config.bin %> migrations run ACTION_ID -m mig_7x2 --input-file - --yes --json < ./decisions.json"
2350
- },
2351
- {
2352
- "description": "Get an external action link without opening a browser:",
2353
- "command": "<%= config.bin %> migrations run ACTION_ID -m mig_7x2 --no-browser"
2354
- }
2313
+ "<%= config.bin %> products create --app UUID --title \"Monthly\" --access-level-id UUID --period monthly --ios-product-id com.example.monthly"
2355
2314
  ],
2356
2315
  "flags": {
2357
2316
  "json": {
@@ -2361,105 +2320,123 @@
2361
2320
  "allowNo": false,
2362
2321
  "type": "boolean"
2363
2322
  },
2364
- "migration": {
2365
- "char": "m",
2366
- "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
2367
- "name": "migration",
2323
+ "app": {
2324
+ "description": "App ID (UUID)",
2325
+ "name": "app",
2326
+ "required": true,
2368
2327
  "hasDynamicHelp": false,
2369
- "helpValue": "ID",
2370
2328
  "multiple": false,
2371
2329
  "type": "option"
2372
2330
  },
2373
- "input": {
2374
- "description": "Input action data as a JSON object matching input_schema",
2375
- "exclusive": [
2376
- "input-file"
2377
- ],
2378
- "name": "input",
2331
+ "access-level-id": {
2332
+ "description": "Access level ID (UUID)",
2333
+ "name": "access-level-id",
2334
+ "required": true,
2379
2335
  "hasDynamicHelp": false,
2380
- "helpValue": "JSON",
2381
2336
  "multiple": false,
2382
2337
  "type": "option"
2383
2338
  },
2384
- "input-file": {
2385
- "description": "Read an input action's JSON object from a file; use - for stdin",
2386
- "exclusive": [
2387
- "input"
2388
- ],
2389
- "name": "input-file",
2339
+ "android-base-plan-id": {
2340
+ "description": "Android base plan ID",
2341
+ "helpGroup": "STORE BINDINGS",
2342
+ "name": "android-base-plan-id",
2390
2343
  "hasDynamicHelp": false,
2391
- "helpValue": "PATH",
2392
2344
  "multiple": false,
2393
2345
  "type": "option"
2394
2346
  },
2395
- "yes": {
2396
- "char": "y",
2397
- "description": "Confirm the input action after reviewing its confirmation text",
2398
- "name": "yes",
2399
- "allowNo": false,
2400
- "type": "boolean"
2347
+ "android-product-id": {
2348
+ "description": "Android product ID",
2349
+ "helpGroup": "STORE BINDINGS",
2350
+ "name": "android-product-id",
2351
+ "hasDynamicHelp": false,
2352
+ "multiple": false,
2353
+ "type": "option"
2401
2354
  },
2402
- "open": {
2403
- "description": "Open an external action's HTTPS link, including with pipes or --json",
2404
- "exclusive": [
2405
- "no-browser"
2406
- ],
2407
- "name": "open",
2408
- "allowNo": false,
2409
- "type": "boolean"
2355
+ "ios-product-id": {
2356
+ "description": "iOS product ID",
2357
+ "helpGroup": "STORE BINDINGS",
2358
+ "name": "ios-product-id",
2359
+ "hasDynamicHelp": false,
2360
+ "multiple": false,
2361
+ "type": "option"
2410
2362
  },
2411
- "no-browser": {
2412
- "description": "Show the external action without opening a browser",
2413
- "exclusive": [
2414
- "open"
2415
- ],
2416
- "name": "no-browser",
2417
- "allowNo": false,
2418
- "type": "boolean"
2363
+ "paddle-price-id": {
2364
+ "description": "Paddle price ID (requires --paddle-product-id)",
2365
+ "helpGroup": "STORE BINDINGS",
2366
+ "name": "paddle-price-id",
2367
+ "hasDynamicHelp": false,
2368
+ "multiple": false,
2369
+ "type": "option"
2370
+ },
2371
+ "paddle-product-id": {
2372
+ "description": "Paddle product ID (requires --paddle-price-id)",
2373
+ "helpGroup": "STORE BINDINGS",
2374
+ "name": "paddle-product-id",
2375
+ "hasDynamicHelp": false,
2376
+ "multiple": false,
2377
+ "type": "option"
2378
+ },
2379
+ "period": {
2380
+ "description": "Subscription period (weekly, monthly, two_months, trimonthly, semiannual, annual, lifetime)",
2381
+ "name": "period",
2382
+ "required": true,
2383
+ "hasDynamicHelp": false,
2384
+ "multiple": false,
2385
+ "type": "option"
2386
+ },
2387
+ "stripe-price-id": {
2388
+ "description": "Stripe price ID (requires --stripe-product-id)",
2389
+ "helpGroup": "STORE BINDINGS",
2390
+ "name": "stripe-price-id",
2391
+ "hasDynamicHelp": false,
2392
+ "multiple": false,
2393
+ "type": "option"
2394
+ },
2395
+ "stripe-product-id": {
2396
+ "description": "Stripe product ID (requires --stripe-price-id)",
2397
+ "helpGroup": "STORE BINDINGS",
2398
+ "name": "stripe-product-id",
2399
+ "hasDynamicHelp": false,
2400
+ "multiple": false,
2401
+ "type": "option"
2402
+ },
2403
+ "title": {
2404
+ "description": "Product title",
2405
+ "name": "title",
2406
+ "required": true,
2407
+ "hasDynamicHelp": false,
2408
+ "multiple": false,
2409
+ "type": "option"
2419
2410
  }
2420
2411
  },
2421
2412
  "hasDynamicHelp": false,
2422
2413
  "hiddenAliases": [],
2423
- "id": "migrations:run",
2414
+ "id": "products:create",
2424
2415
  "pluginAlias": "adapty",
2425
2416
  "pluginName": "adapty",
2426
2417
  "pluginType": "core",
2427
2418
  "strict": true,
2428
- "summary": "Run an input action or open an external action link",
2419
+ "enableJsonFlag": true,
2429
2420
  "isESM": true,
2430
2421
  "relativePath": [
2431
2422
  "dist",
2432
2423
  "commands",
2433
- "migrations",
2434
- "run.js"
2424
+ "products",
2425
+ "create.js"
2435
2426
  ]
2436
2427
  },
2437
- "migrations:show": {
2428
+ "products:get": {
2438
2429
  "aliases": [],
2439
2430
  "args": {
2440
- "resource": {
2441
- "description": "Resource name; omit to list what can be read now",
2442
- "name": "resource"
2431
+ "product_id": {
2432
+ "description": "Product ID (UUID)",
2433
+ "name": "product_id",
2434
+ "required": true
2443
2435
  }
2444
2436
  },
2445
- "description": "Omit RESOURCE to list what can be read now. Use a name from that list, such as apps or mapping.\n\nReading a resource prints its data as JSON. With --json, returns the full migration response.\nResource data is in result (null if no data is available yet).",
2437
+ "description": "Get product details",
2446
2438
  "examples": [
2447
- {
2448
- "description": "Read the RevenueCat apps of the selected migration:",
2449
- "command": "<%= config.bin %> migrations show apps"
2450
- },
2451
- {
2452
- "description": "List resource names available now:",
2453
- "command": "<%= config.bin %> migrations show -m mig_7x2"
2454
- },
2455
- {
2456
- "description": "Read mapping data, if listed as available:",
2457
- "command": "<%= config.bin %> migrations show mapping -m mig_7x2"
2458
- },
2459
- {
2460
- "description": "Extract only the resource data (requires jq):",
2461
- "command": "<%= config.bin %> migrations show mapping -m mig_7x2 --json | jq '.result'"
2462
- }
2439
+ "<%= config.bin %> products get --app UUID 550e8400-e29b-41d4-a716-446655440000"
2463
2440
  ],
2464
2441
  "flags": {
2465
2442
  "json": {
@@ -2469,53 +2446,37 @@
2469
2446
  "allowNo": false,
2470
2447
  "type": "boolean"
2471
2448
  },
2472
- "migration": {
2473
- "char": "m",
2474
- "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
2475
- "name": "migration",
2449
+ "app": {
2450
+ "description": "App ID (UUID)",
2451
+ "name": "app",
2452
+ "required": true,
2476
2453
  "hasDynamicHelp": false,
2477
- "helpValue": "ID",
2478
2454
  "multiple": false,
2479
2455
  "type": "option"
2480
2456
  }
2481
2457
  },
2482
2458
  "hasDynamicHelp": false,
2483
2459
  "hiddenAliases": [],
2484
- "id": "migrations:show",
2460
+ "id": "products:get",
2485
2461
  "pluginAlias": "adapty",
2486
2462
  "pluginName": "adapty",
2487
2463
  "pluginType": "core",
2488
2464
  "strict": true,
2489
- "summary": "List migration resources or read one resource",
2465
+ "enableJsonFlag": true,
2490
2466
  "isESM": true,
2491
2467
  "relativePath": [
2492
2468
  "dist",
2493
2469
  "commands",
2494
- "migrations",
2495
- "show.js"
2470
+ "products",
2471
+ "get.js"
2496
2472
  ]
2497
2473
  },
2498
- "migrations:status": {
2474
+ "products:list": {
2499
2475
  "aliases": [],
2500
2476
  "args": {},
2501
- "description": "Read next_actions for the next steps and available_actions for optional actions.\nUse --json to read each action's input_schema, reads, and confirmation text.\n\n--wait returns when the revision changes, the state leaves running, or the polling budget runs out.\nExit 0 means the request succeeded, even if the migration is still running or has failed.\nCheck migration.state in JSON output. Progress goes to stderr. Ctrl+C exits with code 130.",
2477
+ "description": "List products for an app",
2502
2478
  "examples": [
2503
- {
2504
- "description": "Inspect the saved migration:",
2505
- "command": "<%= config.bin %> migrations status"
2506
- },
2507
- {
2508
- "description": "See the current state and what to do next:",
2509
- "command": "<%= config.bin %> migrations status -m mig_7x2"
2510
- },
2511
- {
2512
- "description": "Read action IDs, input schemas, and confirmation text as JSON:",
2513
- "command": "<%= config.bin %> migrations status -m mig_7x2 --json"
2514
- },
2515
- {
2516
- "description": "Wait for a change with a five-minute polling budget:",
2517
- "command": "<%= config.bin %> migrations status -m mig_7x2 --wait --timeout 5m --json"
2518
- }
2479
+ "<%= config.bin %> products list --app 550e8400-..."
2519
2480
  ],
2520
2481
  "flags": {
2521
2482
  "json": {
@@ -2525,66 +2486,121 @@
2525
2486
  "allowNo": false,
2526
2487
  "type": "boolean"
2527
2488
  },
2528
- "migration": {
2529
- "char": "m",
2530
- "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
2531
- "name": "migration",
2489
+ "app": {
2490
+ "description": "App ID (UUID)",
2491
+ "name": "app",
2492
+ "required": true,
2532
2493
  "hasDynamicHelp": false,
2533
- "helpValue": "ID",
2534
2494
  "multiple": false,
2535
2495
  "type": "option"
2536
2496
  },
2537
- "timeout": {
2538
- "dependsOn": [
2539
- "wait"
2540
- ],
2541
- "description": "Polling budget with --wait: 1-600s, default 120s (e.g. 300, 300s, 5m); in-flight requests may take longer",
2542
- "name": "timeout",
2497
+ "page": {
2498
+ "description": "Page number",
2499
+ "name": "page",
2500
+ "default": 1,
2543
2501
  "hasDynamicHelp": false,
2544
- "helpValue": "DURATION",
2545
2502
  "multiple": false,
2546
2503
  "type": "option"
2547
2504
  },
2548
- "wait": {
2549
- "description": "Poll for a revision or state change, then return the latest response",
2550
- "name": "wait",
2551
- "allowNo": false,
2552
- "type": "boolean"
2505
+ "page-size": {
2506
+ "description": "Items per page (max 100)",
2507
+ "name": "page-size",
2508
+ "default": 20,
2509
+ "hasDynamicHelp": false,
2510
+ "multiple": false,
2511
+ "type": "option"
2553
2512
  }
2554
2513
  },
2555
2514
  "hasDynamicHelp": false,
2556
2515
  "hiddenAliases": [],
2557
- "id": "migrations:status",
2516
+ "id": "products:list",
2558
2517
  "pluginAlias": "adapty",
2559
2518
  "pluginName": "adapty",
2560
2519
  "pluginType": "core",
2561
2520
  "strict": true,
2562
- "summary": "Show migration state, issues, and available actions",
2521
+ "enableJsonFlag": true,
2563
2522
  "isESM": true,
2564
2523
  "relativePath": [
2565
2524
  "dist",
2566
2525
  "commands",
2567
- "migrations",
2568
- "status.js"
2526
+ "products",
2527
+ "list.js"
2569
2528
  ]
2570
2529
  },
2571
- "migrations:steps": {
2530
+ "products:update": {
2572
2531
  "aliases": [],
2573
- "args": {},
2574
- "description": "Shows done, active, and locked steps in migration order.\nTo find actions you can run, use `adapty migrations status -m ID`.\n\nWith --json, the full migration response is returned; the checklist is in steps.",
2532
+ "args": {
2533
+ "product_id": {
2534
+ "description": "Product ID (UUID)",
2535
+ "name": "product_id",
2536
+ "required": true
2537
+ }
2538
+ },
2539
+ "description": "Update a product (title and access level only)",
2575
2540
  "examples": [
2576
- {
2577
- "description": "View the saved migration checklist:",
2578
- "command": "<%= config.bin %> migrations steps"
2541
+ "<%= config.bin %> products update --app UUID 550e8400-... --title \"Monthly\" --access-level-id UUID"
2542
+ ],
2543
+ "flags": {
2544
+ "json": {
2545
+ "description": "Format output as json.",
2546
+ "helpGroup": "GLOBAL",
2547
+ "name": "json",
2548
+ "allowNo": false,
2549
+ "type": "boolean"
2579
2550
  },
2580
- {
2581
- "description": "View the checklist:",
2582
- "command": "<%= config.bin %> migrations steps -m mig_7x2"
2551
+ "app": {
2552
+ "description": "App ID (UUID)",
2553
+ "name": "app",
2554
+ "required": true,
2555
+ "hasDynamicHelp": false,
2556
+ "multiple": false,
2557
+ "type": "option"
2583
2558
  },
2584
- {
2585
- "description": "Extract the checklist as JSON (requires jq):",
2586
- "command": "<%= config.bin %> migrations steps -m mig_7x2 --json | jq '.steps'"
2559
+ "access-level-id": {
2560
+ "description": "Access level ID (UUID)",
2561
+ "name": "access-level-id",
2562
+ "required": true,
2563
+ "hasDynamicHelp": false,
2564
+ "multiple": false,
2565
+ "type": "option"
2566
+ },
2567
+ "title": {
2568
+ "description": "Product title",
2569
+ "name": "title",
2570
+ "required": true,
2571
+ "hasDynamicHelp": false,
2572
+ "multiple": false,
2573
+ "type": "option"
2574
+ }
2575
+ },
2576
+ "hasDynamicHelp": false,
2577
+ "hiddenAliases": [],
2578
+ "id": "products:update",
2579
+ "pluginAlias": "adapty",
2580
+ "pluginName": "adapty",
2581
+ "pluginType": "core",
2582
+ "strict": true,
2583
+ "enableJsonFlag": true,
2584
+ "isESM": true,
2585
+ "relativePath": [
2586
+ "dist",
2587
+ "commands",
2588
+ "products",
2589
+ "update.js"
2590
+ ]
2591
+ },
2592
+ "segments:get": {
2593
+ "aliases": [],
2594
+ "args": {
2595
+ "segment_id": {
2596
+ "description": "Segment ID (UUID)",
2597
+ "name": "segment_id",
2598
+ "required": true
2587
2599
  }
2600
+ },
2601
+ "description": "Get segment details",
2602
+ "examples": [
2603
+ "<%= config.bin %> segments get --app UUID 550e8400-e29b-41d4-a716-446655440000"
2588
2604
  ],
2589
2605
  "flags": {
2590
2606
  "json": {
@@ -2594,38 +2610,37 @@
2594
2610
  "allowNo": false,
2595
2611
  "type": "boolean"
2596
2612
  },
2597
- "migration": {
2598
- "char": "m",
2599
- "description": "Migration ID; overrides ADAPTY_MIGRATION and the saved selection from migrations use/create",
2600
- "name": "migration",
2613
+ "app": {
2614
+ "description": "App ID (UUID)",
2615
+ "name": "app",
2616
+ "required": true,
2601
2617
  "hasDynamicHelp": false,
2602
- "helpValue": "ID",
2603
2618
  "multiple": false,
2604
2619
  "type": "option"
2605
2620
  }
2606
2621
  },
2607
2622
  "hasDynamicHelp": false,
2608
2623
  "hiddenAliases": [],
2609
- "id": "migrations:steps",
2624
+ "id": "segments:get",
2610
2625
  "pluginAlias": "adapty",
2611
2626
  "pluginName": "adapty",
2612
2627
  "pluginType": "core",
2613
2628
  "strict": true,
2614
- "summary": "Show the migration checklist and step statuses",
2629
+ "enableJsonFlag": true,
2615
2630
  "isESM": true,
2616
2631
  "relativePath": [
2617
2632
  "dist",
2618
2633
  "commands",
2619
- "migrations",
2620
- "steps.js"
2634
+ "segments",
2635
+ "get.js"
2621
2636
  ]
2622
2637
  },
2623
- "migrations:unuse": {
2638
+ "segments:list": {
2624
2639
  "aliases": [],
2625
2640
  "args": {},
2626
- "description": "Works without authentication, including when the saved context is malformed.\nADAPTY_MIGRATION remains active until you unset it in your shell.",
2641
+ "description": "List segments for an app",
2627
2642
  "examples": [
2628
- "<%= config.bin %> migrations unuse"
2643
+ "<%= config.bin %> segments list --app 550e8400-..."
2629
2644
  ],
2630
2645
  "flags": {
2631
2646
  "json": {
@@ -2634,37 +2649,56 @@
2634
2649
  "name": "json",
2635
2650
  "allowNo": false,
2636
2651
  "type": "boolean"
2652
+ },
2653
+ "app": {
2654
+ "description": "App ID (UUID)",
2655
+ "name": "app",
2656
+ "required": true,
2657
+ "hasDynamicHelp": false,
2658
+ "multiple": false,
2659
+ "type": "option"
2660
+ },
2661
+ "page": {
2662
+ "description": "Page number",
2663
+ "name": "page",
2664
+ "default": 1,
2665
+ "hasDynamicHelp": false,
2666
+ "multiple": false,
2667
+ "type": "option"
2668
+ },
2669
+ "page-size": {
2670
+ "description": "Items per page (max 100)",
2671
+ "name": "page-size",
2672
+ "default": 20,
2673
+ "hasDynamicHelp": false,
2674
+ "multiple": false,
2675
+ "type": "option"
2637
2676
  }
2638
2677
  },
2639
2678
  "hasDynamicHelp": false,
2640
2679
  "hiddenAliases": [],
2641
- "id": "migrations:unuse",
2680
+ "id": "segments:list",
2642
2681
  "pluginAlias": "adapty",
2643
2682
  "pluginName": "adapty",
2644
2683
  "pluginType": "core",
2645
2684
  "strict": true,
2646
- "summary": "Clear the saved migration selection (no network)",
2647
2685
  "enableJsonFlag": true,
2648
2686
  "isESM": true,
2649
2687
  "relativePath": [
2650
2688
  "dist",
2651
2689
  "commands",
2652
- "migrations",
2653
- "unuse.js"
2690
+ "segments",
2691
+ "list.js"
2654
2692
  ]
2655
2693
  },
2656
- "migrations:use": {
2694
+ "skills:install": {
2657
2695
  "aliases": [],
2658
- "args": {
2659
- "id": {
2660
- "description": "Migration ID from `adapty migrations list`",
2661
- "name": "id",
2662
- "required": true
2663
- }
2664
- },
2665
- "description": "Select a migration for the current token. This does not start or modify the migration.\nCompleted, canceled and failed migrations can also be selected for inspection.\nADAPTY_MIGRATION overrides the saved selection until you unset it in your shell.",
2696
+ "args": {},
2697
+ "description": "Install the Adapty skills into the coding agents on this machine",
2666
2698
  "examples": [
2667
- "<%= config.bin %> migrations use mig_7x2"
2699
+ "<%= config.bin %> skills install",
2700
+ "<%= config.bin %> skills install --agent claude-code",
2701
+ "<%= config.bin %> skills install --yes"
2668
2702
  ],
2669
2703
  "flags": {
2670
2704
  "json": {
@@ -2673,22 +2707,41 @@
2673
2707
  "name": "json",
2674
2708
  "allowNo": false,
2675
2709
  "type": "boolean"
2710
+ },
2711
+ "agent": {
2712
+ "description": "Install into this agent only. Repeat for several.",
2713
+ "name": "agent",
2714
+ "hasDynamicHelp": false,
2715
+ "multiple": true,
2716
+ "options": [
2717
+ "claude-code",
2718
+ "codex",
2719
+ "gemini-cli"
2720
+ ],
2721
+ "type": "option"
2722
+ },
2723
+ "yes": {
2724
+ "char": "y",
2725
+ "description": "Install into every agent found without asking; required when several are found and no one can answer. Never runs the npx fallback, which is always asked for",
2726
+ "name": "yes",
2727
+ "allowNo": false,
2728
+ "type": "boolean"
2676
2729
  }
2677
2730
  },
2678
2731
  "hasDynamicHelp": false,
2679
2732
  "hiddenAliases": [],
2680
- "id": "migrations:use",
2733
+ "id": "skills:install",
2681
2734
  "pluginAlias": "adapty",
2682
2735
  "pluginName": "adapty",
2683
2736
  "pluginType": "core",
2684
2737
  "strict": true,
2685
- "summary": "Save the current migration after verifying access",
2738
+ "enableJsonFlag": true,
2686
2739
  "isESM": true,
2687
2740
  "relativePath": [
2688
2741
  "dist",
2689
2742
  "commands",
2690
- "migrations",
2691
- "use.js"
2743
+ "skills",
2744
+ "install.js"
2692
2745
  ]
2693
2746
  },
2694
2747
  "asa:ads:create": {
@@ -4176,42 +4229,245 @@
4176
4229
  "multiple": true,
4177
4230
  "type": "option"
4178
4231
  },
4179
- "daily-budget": {
4180
- "description": "Daily budget (amount, e.g. 50 or 12.50)",
4181
- "name": "daily-budget",
4232
+ "daily-budget": {
4233
+ "description": "Daily budget (amount, e.g. 50 or 12.50)",
4234
+ "name": "daily-budget",
4235
+ "hasDynamicHelp": false,
4236
+ "multiple": false,
4237
+ "type": "option"
4238
+ },
4239
+ "name": {
4240
+ "description": "Campaign name",
4241
+ "name": "name",
4242
+ "hasDynamicHelp": false,
4243
+ "multiple": false,
4244
+ "type": "option"
4245
+ },
4246
+ "status": {
4247
+ "description": "Campaign status",
4248
+ "name": "status",
4249
+ "hasDynamicHelp": false,
4250
+ "multiple": false,
4251
+ "options": [
4252
+ "ENABLED",
4253
+ "PAUSED"
4254
+ ],
4255
+ "type": "option"
4256
+ },
4257
+ "target-cpa": {
4258
+ "description": "Target CPA (amount, e.g. 50 or 12.50)",
4259
+ "name": "target-cpa",
4260
+ "hasDynamicHelp": false,
4261
+ "multiple": false,
4262
+ "type": "option"
4263
+ }
4264
+ },
4265
+ "hasDynamicHelp": false,
4266
+ "hiddenAliases": [],
4267
+ "id": "asa:campaigns:update",
4268
+ "pluginAlias": "adapty",
4269
+ "pluginName": "adapty",
4270
+ "pluginType": "core",
4271
+ "strict": true,
4272
+ "enableJsonFlag": true,
4273
+ "isESM": true,
4274
+ "relativePath": [
4275
+ "dist",
4276
+ "commands",
4277
+ "asa",
4278
+ "campaigns",
4279
+ "update.js"
4280
+ ]
4281
+ },
4282
+ "asa:change-history:get": {
4283
+ "aliases": [],
4284
+ "args": {
4285
+ "detail_id": {
4286
+ "description": "Detail ID from asa change-history list (EntityType.entityId.txnId)",
4287
+ "name": "detail_id",
4288
+ "required": true
4289
+ }
4290
+ },
4291
+ "description": "Field-level before/after of one change (proxied from the Apple Ads Platform API)",
4292
+ "examples": [
4293
+ "<%= config.bin %> asa change-history get Campaign.444555666.TXN_ID --campaign-group <uuid>"
4294
+ ],
4295
+ "flags": {
4296
+ "json": {
4297
+ "description": "Format output as json.",
4298
+ "helpGroup": "GLOBAL",
4299
+ "name": "json",
4300
+ "allowNo": false,
4301
+ "type": "boolean"
4302
+ },
4303
+ "campaign-group": {
4304
+ "description": "Organization the change belongs to (UUID; take campaign_group_id from the list row)",
4305
+ "name": "campaign-group",
4306
+ "required": true,
4307
+ "hasDynamicHelp": false,
4308
+ "multiple": false,
4309
+ "type": "option"
4310
+ }
4311
+ },
4312
+ "hasDynamicHelp": false,
4313
+ "hiddenAliases": [],
4314
+ "id": "asa:change-history:get",
4315
+ "pluginAlias": "adapty",
4316
+ "pluginName": "adapty",
4317
+ "pluginType": "core",
4318
+ "strict": true,
4319
+ "enableJsonFlag": true,
4320
+ "isESM": true,
4321
+ "relativePath": [
4322
+ "dist",
4323
+ "commands",
4324
+ "asa",
4325
+ "change-history",
4326
+ "get.js"
4327
+ ]
4328
+ },
4329
+ "asa:change-history:list": {
4330
+ "aliases": [],
4331
+ "args": {},
4332
+ "description": "Apple Ads change history of one organization, read live from Apple (proxied from the Apple Ads Platform API)",
4333
+ "examples": [
4334
+ "<%= config.bin %> asa change-history list --campaign-group <uuid>",
4335
+ "<%= config.bin %> asa change-history list --campaign-group <uuid> --date-from 2026-09-01 --entity-type Campaign --event-type UPDATE",
4336
+ "<%= config.bin %> asa change-history list --campaign-group <uuid> --fields"
4337
+ ],
4338
+ "flags": {
4339
+ "json": {
4340
+ "description": "Format output as json.",
4341
+ "helpGroup": "GLOBAL",
4342
+ "name": "json",
4343
+ "allowNo": false,
4344
+ "type": "boolean"
4345
+ },
4346
+ "page": {
4347
+ "description": "Page number",
4348
+ "name": "page",
4349
+ "default": 1,
4350
+ "hasDynamicHelp": false,
4351
+ "multiple": false,
4352
+ "type": "option"
4353
+ },
4354
+ "page-size": {
4355
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
4356
+ "name": "page-size",
4357
+ "default": 100,
4358
+ "hasDynamicHelp": false,
4359
+ "multiple": false,
4360
+ "type": "option"
4361
+ },
4362
+ "ad-group": {
4363
+ "description": "Keep only changes inside these Apple ad group ids (not UUIDs); repeatable",
4364
+ "name": "ad-group",
4365
+ "hasDynamicHelp": false,
4366
+ "multiple": true,
4367
+ "type": "option"
4368
+ },
4369
+ "campaign": {
4370
+ "description": "Keep only changes inside these Apple campaign ids (not UUIDs); repeatable",
4371
+ "name": "campaign",
4372
+ "hasDynamicHelp": false,
4373
+ "multiple": true,
4374
+ "type": "option"
4375
+ },
4376
+ "campaign-group": {
4377
+ "description": "Organization to read (UUID from asa orgs list); one organization per call",
4378
+ "name": "campaign-group",
4379
+ "required": true,
4380
+ "hasDynamicHelp": false,
4381
+ "multiple": false,
4382
+ "type": "option"
4383
+ },
4384
+ "date-from": {
4385
+ "description": "Start of the period (YYYY-MM-DD), defaults to 7 days ago; at most 14 days per call, Apple keeps 6 months",
4386
+ "name": "date-from",
4387
+ "hasDynamicHelp": false,
4388
+ "multiple": false,
4389
+ "type": "option"
4390
+ },
4391
+ "date-to": {
4392
+ "description": "End of the period (YYYY-MM-DD), defaults to today",
4393
+ "name": "date-to",
4394
+ "hasDynamicHelp": false,
4395
+ "multiple": false,
4396
+ "type": "option"
4397
+ },
4398
+ "entity-id": {
4399
+ "description": "Keep only changes of these Apple entity ids (not UUIDs); repeatable",
4400
+ "name": "entity-id",
4401
+ "hasDynamicHelp": false,
4402
+ "multiple": true,
4403
+ "type": "option"
4404
+ },
4405
+ "entity-type": {
4406
+ "description": "Keep only changes of this entity type; repeatable. Default is the campaign domain (Campaign, AdGroup, Keyword, NegativeKeyword, Ad, Creative, LocationGroup); Org and AdAccount cannot be mixed with it",
4407
+ "name": "entity-type",
4408
+ "hasDynamicHelp": false,
4409
+ "multiple": true,
4410
+ "options": [
4411
+ "Ad",
4412
+ "AdAccount",
4413
+ "AdGroup",
4414
+ "Campaign",
4415
+ "Creative",
4416
+ "Keyword",
4417
+ "LocationGroup",
4418
+ "NegativeKeyword",
4419
+ "Org"
4420
+ ],
4421
+ "type": "option"
4422
+ },
4423
+ "event-type": {
4424
+ "description": "Keep only this operation; repeatable",
4425
+ "name": "event-type",
4426
+ "hasDynamicHelp": false,
4427
+ "multiple": true,
4428
+ "options": [
4429
+ "CREATE",
4430
+ "DELETE",
4431
+ "UPDATE"
4432
+ ],
4433
+ "type": "option"
4434
+ },
4435
+ "fields": {
4436
+ "description": "Expand into flat field-level rows (field, old values, new values); page size defaults to 10 and may not exceed it",
4437
+ "name": "fields",
4438
+ "allowNo": false,
4439
+ "type": "boolean"
4440
+ },
4441
+ "txn": {
4442
+ "description": "Keep only these Apple transaction ids; repeatable",
4443
+ "name": "txn",
4182
4444
  "hasDynamicHelp": false,
4183
- "multiple": false,
4445
+ "multiple": true,
4184
4446
  "type": "option"
4185
4447
  },
4186
- "name": {
4187
- "description": "Campaign name",
4188
- "name": "name",
4448
+ "user": {
4449
+ "description": "Keep only changes made by these Apple user ids (not emails); repeatable",
4450
+ "name": "user",
4189
4451
  "hasDynamicHelp": false,
4190
- "multiple": false,
4452
+ "multiple": true,
4191
4453
  "type": "option"
4192
4454
  },
4193
- "status": {
4194
- "description": "Campaign status",
4195
- "name": "status",
4455
+ "user-type": {
4456
+ "description": "Keep only changes by this actor category; repeatable",
4457
+ "name": "user-type",
4196
4458
  "hasDynamicHelp": false,
4197
- "multiple": false,
4459
+ "multiple": true,
4198
4460
  "options": [
4199
- "ENABLED",
4200
- "PAUSED"
4461
+ "APPLE_SUPPORT",
4462
+ "CUSTOMER",
4463
+ "CUSTOMER_API"
4201
4464
  ],
4202
4465
  "type": "option"
4203
- },
4204
- "target-cpa": {
4205
- "description": "Target CPA (amount, e.g. 50 or 12.50)",
4206
- "name": "target-cpa",
4207
- "hasDynamicHelp": false,
4208
- "multiple": false,
4209
- "type": "option"
4210
4466
  }
4211
4467
  },
4212
4468
  "hasDynamicHelp": false,
4213
4469
  "hiddenAliases": [],
4214
- "id": "asa:campaigns:update",
4470
+ "id": "asa:change-history:list",
4215
4471
  "pluginAlias": "adapty",
4216
4472
  "pluginName": "adapty",
4217
4473
  "pluginType": "core",
@@ -4222,8 +4478,8 @@
4222
4478
  "dist",
4223
4479
  "commands",
4224
4480
  "asa",
4225
- "campaigns",
4226
- "update.js"
4481
+ "change-history",
4482
+ "list.js"
4227
4483
  ]
4228
4484
  },
4229
4485
  "asa:competitors:summary": {
@@ -5419,18 +5675,14 @@
5419
5675
  "list.js"
5420
5676
  ]
5421
5677
  },
5422
- "flows:config:get": {
5678
+ "asa:ad-groups:create": {
5423
5679
  "aliases": [],
5424
- "args": {
5425
- "flow_id": {
5426
- "description": "Flow ID (UUID)",
5427
- "name": "flow_id",
5428
- "required": true
5429
- }
5430
- },
5431
- "description": "Read the flow builder config (404 until the config has been written at least once). On a failed publish, `publication_status`, `transform_error` and `publication_error` show why.",
5680
+ "args": {},
5681
+ "description": "Create an ad group inside a campaign; --automated creates the automated ad group a Max Conversions campaign needs to run",
5432
5682
  "examples": [
5433
- "<%= config.bin %> flows config get --app UUID 550e8400-e29b-41d4-a716-446655440000"
5683
+ "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Brand terms\" --default-bid 1.20",
5684
+ "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Brand terms\" --default-bid 1.20 --start-time 2026-09-01 --pricing-model CPM",
5685
+ "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Automated Max Conv\" --automated"
5434
5686
  ],
5435
5687
  "flags": {
5436
5688
  "json": {
@@ -5440,18 +5692,114 @@
5440
5692
  "allowNo": false,
5441
5693
  "type": "boolean"
5442
5694
  },
5443
- "app": {
5444
- "description": "App ID (UUID)",
5445
- "name": "app",
5695
+ "currency": {
5696
+ "description": "Currency code for the amounts in this call",
5697
+ "name": "currency",
5698
+ "default": "USD",
5699
+ "hasDynamicHelp": false,
5700
+ "multiple": false,
5701
+ "type": "option"
5702
+ },
5703
+ "end-time": {
5704
+ "description": "Schedule end (YYYY-MM-DD)",
5705
+ "name": "end-time",
5706
+ "hasDynamicHelp": false,
5707
+ "multiple": false,
5708
+ "type": "option"
5709
+ },
5710
+ "start-time": {
5711
+ "description": "Schedule start (YYYY-MM-DD), defaults to today",
5712
+ "name": "start-time",
5713
+ "hasDynamicHelp": false,
5714
+ "multiple": false,
5715
+ "type": "option"
5716
+ },
5717
+ "pricing-model": {
5718
+ "description": "Pricing model; Apple requires one on every ad group",
5719
+ "name": "pricing-model",
5720
+ "default": "CPC",
5721
+ "hasDynamicHelp": false,
5722
+ "multiple": false,
5723
+ "options": [
5724
+ "CPC",
5725
+ "CPM"
5726
+ ],
5727
+ "type": "option"
5728
+ },
5729
+ "yes": {
5730
+ "char": "y",
5731
+ "description": "Apply without asking; required when the output is piped or --json is used",
5732
+ "name": "yes",
5733
+ "allowNo": false,
5734
+ "type": "boolean"
5735
+ },
5736
+ "idempotency-key": {
5737
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
5738
+ "name": "idempotency-key",
5739
+ "hasDynamicHelp": false,
5740
+ "multiple": false,
5741
+ "type": "option"
5742
+ },
5743
+ "automated": {
5744
+ "description": "Create the automated ad group a Max Conversions campaign needs (no bid, no schedule, always ENABLED)",
5745
+ "exclusive": [
5746
+ "automated-keywords"
5747
+ ],
5748
+ "name": "automated",
5749
+ "allowNo": false,
5750
+ "type": "boolean"
5751
+ },
5752
+ "automated-keywords": {
5753
+ "description": "Let Apple add keywords automatically",
5754
+ "name": "automated-keywords",
5755
+ "allowNo": true,
5756
+ "type": "boolean"
5757
+ },
5758
+ "campaign": {
5759
+ "description": "Campaign ID (UUID)",
5760
+ "name": "campaign",
5761
+ "required": true,
5762
+ "hasDynamicHelp": false,
5763
+ "multiple": false,
5764
+ "type": "option"
5765
+ },
5766
+ "cpa-goal": {
5767
+ "description": "CPA goal (amount, e.g. 50 or 12.50)",
5768
+ "name": "cpa-goal",
5769
+ "hasDynamicHelp": false,
5770
+ "multiple": false,
5771
+ "type": "option"
5772
+ },
5773
+ "default-bid": {
5774
+ "description": "Default bid; required unless --automated is set (amount, e.g. 50 or 12.50)",
5775
+ "name": "default-bid",
5776
+ "hasDynamicHelp": false,
5777
+ "multiple": false,
5778
+ "type": "option"
5779
+ },
5780
+ "name": {
5781
+ "description": "Ad group name",
5782
+ "name": "name",
5446
5783
  "required": true,
5447
5784
  "hasDynamicHelp": false,
5448
5785
  "multiple": false,
5449
5786
  "type": "option"
5787
+ },
5788
+ "status": {
5789
+ "description": "Initial status",
5790
+ "name": "status",
5791
+ "hasDynamicHelp": false,
5792
+ "multiple": false,
5793
+ "options": [
5794
+ "ENABLED",
5795
+ "PAUSED"
5796
+ ],
5797
+ "type": "option"
5450
5798
  }
5451
5799
  },
5452
5800
  "hasDynamicHelp": false,
5453
5801
  "hiddenAliases": [],
5454
- "id": "flows:config:get",
5802
+ "id": "asa:ad-groups:create",
5455
5803
  "pluginAlias": "adapty",
5456
5804
  "pluginName": "adapty",
5457
5805
  "pluginType": "core",
@@ -5461,26 +5809,23 @@
5461
5809
  "relativePath": [
5462
5810
  "dist",
5463
5811
  "commands",
5464
- "flows",
5465
- "config",
5466
- "get.js"
5812
+ "asa",
5813
+ "ad-groups",
5814
+ "create.js"
5467
5815
  ]
5468
5816
  },
5469
- "flows:config:preview": {
5817
+ "asa:ad-groups:get": {
5470
5818
  "aliases": [],
5471
5819
  "args": {
5472
- "config_file": {
5473
- "description": "Path to a local flow config JSON file",
5474
- "name": "config_file",
5820
+ "ad_group_id": {
5821
+ "description": "Ad group ID (UUID)",
5822
+ "name": "ad_group_id",
5475
5823
  "required": true
5476
5824
  }
5477
5825
  },
5478
- "description": "Build a render URL for a local flow config and open it. A quick-look escape hatch for small configs: the whole config rides in the URL fragment, and past roughly 32KB of pretty-printed JSON the render page gets slow and unreliable. Opens the browser on a TTY; when piped or with --json, prints the URL alone — and that URL is long (~113K characters for a 668KB flow), so pipe it into whatever takes the screenshot (\"| node capture.mjs\") or pass it with --url and command substitution. Never print or read it: agents burn context for zero information. The render host comes from $ADAPTY_APP_URL.",
5826
+ "description": "Show one ad group; read numbers with asa metrics",
5479
5827
  "examples": [
5480
- "<%= config.bin %> flows config preview ./config.json",
5481
- "<%= config.bin %> flows config preview ./config.json --screen welcome --device ipad-pro --orientation landscape",
5482
- "# pipe the URL straight into a screenshot tool, never print it\n<%= config.bin %> flows config preview ./config.json | node capture.mjs --out shot.png",
5483
- "# or pass it as an argument, for tools that want a flag\nnode capture.mjs --url \"$(<%= config.bin %> flows config preview ./config.json)\" --out shot.png"
5828
+ "<%= config.bin %> asa ad-groups get 550e8400-e29b-41d4-a716-446655440000"
5484
5829
  ],
5485
5830
  "flags": {
5486
5831
  "json": {
@@ -5489,38 +5834,11 @@
5489
5834
  "name": "json",
5490
5835
  "allowNo": false,
5491
5836
  "type": "boolean"
5492
- },
5493
- "device": {
5494
- "description": "Device frame to render in",
5495
- "name": "device",
5496
- "default": "iphone-14",
5497
- "hasDynamicHelp": false,
5498
- "multiple": false,
5499
- "type": "option"
5500
- },
5501
- "orientation": {
5502
- "description": "Device orientation to render in",
5503
- "name": "orientation",
5504
- "default": "portrait",
5505
- "hasDynamicHelp": false,
5506
- "multiple": false,
5507
- "options": [
5508
- "landscape",
5509
- "portrait"
5510
- ],
5511
- "type": "option"
5512
- },
5513
- "screen": {
5514
- "description": "Screen ID to render (default: the flow's first screen)",
5515
- "name": "screen",
5516
- "hasDynamicHelp": false,
5517
- "multiple": false,
5518
- "type": "option"
5519
5837
  }
5520
5838
  },
5521
5839
  "hasDynamicHelp": false,
5522
5840
  "hiddenAliases": [],
5523
- "id": "flows:config:preview",
5841
+ "id": "asa:ad-groups:get",
5524
5842
  "pluginAlias": "adapty",
5525
5843
  "pluginName": "adapty",
5526
5844
  "pluginType": "core",
@@ -5530,25 +5848,18 @@
5530
5848
  "relativePath": [
5531
5849
  "dist",
5532
5850
  "commands",
5533
- "flows",
5534
- "config",
5535
- "preview.js"
5851
+ "asa",
5852
+ "ad-groups",
5853
+ "get.js"
5536
5854
  ]
5537
5855
  },
5538
- "flows:config:update": {
5856
+ "asa:ad-groups:list": {
5539
5857
  "aliases": [],
5540
- "args": {
5541
- "flow_id": {
5542
- "description": "Flow ID (UUID)",
5543
- "name": "flow_id",
5544
- "required": true
5545
- }
5546
- },
5547
- "description": "Write the flow builder config (creates the first version, or edits/forks the current one)",
5858
+ "args": {},
5859
+ "description": "List ad groups; read numbers with asa metrics",
5548
5860
  "examples": [
5549
- "<%= config.bin %> flows config update --app UUID FLOW_UUID --config-file config.json",
5550
- "cat config.json | <%= config.bin %> flows config update --app UUID FLOW_UUID --config-file -",
5551
- "<%= config.bin %> flows config update --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}' --expected-updated-at 1755001800000"
5861
+ "<%= config.bin %> asa ad-groups list",
5862
+ "<%= config.bin %> asa ad-groups list --campaign CAMPAIGN_UUID"
5552
5863
  ],
5553
5864
  "flags": {
5554
5865
  "json": {
@@ -5558,46 +5869,65 @@
5558
5869
  "allowNo": false,
5559
5870
  "type": "boolean"
5560
5871
  },
5561
- "app": {
5562
- "description": "App ID (UUID)",
5563
- "name": "app",
5564
- "required": true,
5872
+ "page": {
5873
+ "description": "Page number",
5874
+ "name": "page",
5875
+ "default": 1,
5565
5876
  "hasDynamicHelp": false,
5566
5877
  "multiple": false,
5567
5878
  "type": "option"
5568
5879
  },
5569
- "config": {
5570
- "description": "Builder config as a JSON string",
5571
- "name": "config",
5880
+ "page-size": {
5881
+ "description": "Items per page (max 1000); prefer one big page over a pagination loop",
5882
+ "name": "page-size",
5883
+ "default": 100,
5572
5884
  "hasDynamicHelp": false,
5573
5885
  "multiple": false,
5574
5886
  "type": "option"
5575
5887
  },
5576
- "config-file": {
5577
- "description": "JSON file with the builder config, or - to read stdin",
5578
- "name": "config-file",
5888
+ "app": {
5889
+ "description": "Keep only rows in this app; repeatable",
5890
+ "name": "app",
5891
+ "hasDynamicHelp": false,
5892
+ "multiple": true,
5893
+ "type": "option"
5894
+ },
5895
+ "campaign-group": {
5896
+ "description": "Keep only rows in this campaign group; repeatable",
5897
+ "name": "campaign-group",
5898
+ "hasDynamicHelp": false,
5899
+ "multiple": true,
5900
+ "type": "option"
5901
+ },
5902
+ "search": {
5903
+ "description": "Case-insensitive substring match on the name",
5904
+ "name": "search",
5579
5905
  "hasDynamicHelp": false,
5580
5906
  "multiple": false,
5581
5907
  "type": "option"
5582
5908
  },
5583
- "expected-updated-at": {
5584
- "description": "Optimistic lock: the `updated_at` from a prior config read. Omit for last-write-wins.",
5585
- "name": "expected-updated-at",
5909
+ "campaign": {
5910
+ "description": "Keep only rows in this campaign; repeatable",
5911
+ "name": "campaign",
5586
5912
  "hasDynamicHelp": false,
5587
- "multiple": false,
5913
+ "multiple": true,
5588
5914
  "type": "option"
5589
5915
  },
5590
- "remote-configs": {
5591
- "description": "JSON array of remote config entries: [{locale, data}]",
5592
- "name": "remote-configs",
5916
+ "status": {
5917
+ "description": "Keep only rows in this state",
5918
+ "name": "status",
5593
5919
  "hasDynamicHelp": false,
5594
5920
  "multiple": false,
5921
+ "options": [
5922
+ "ENABLED",
5923
+ "PAUSED"
5924
+ ],
5595
5925
  "type": "option"
5596
5926
  }
5597
5927
  },
5598
5928
  "hasDynamicHelp": false,
5599
5929
  "hiddenAliases": [],
5600
- "id": "flows:config:update",
5930
+ "id": "asa:ad-groups:list",
5601
5931
  "pluginAlias": "adapty",
5602
5932
  "pluginName": "adapty",
5603
5933
  "pluginType": "core",
@@ -5607,25 +5937,24 @@
5607
5937
  "relativePath": [
5608
5938
  "dist",
5609
5939
  "commands",
5610
- "flows",
5611
- "config",
5612
- "update.js"
5940
+ "asa",
5941
+ "ad-groups",
5942
+ "list.js"
5613
5943
  ]
5614
5944
  },
5615
- "flows:config:validate": {
5945
+ "asa:ad-groups:update": {
5616
5946
  "aliases": [],
5617
5947
  "args": {
5618
- "flow_id": {
5619
- "description": "Flow ID (UUID)",
5620
- "name": "flow_id",
5948
+ "ad_group_id": {
5949
+ "description": "Ad group ID (UUID)",
5950
+ "name": "ad_group_id",
5621
5951
  "required": true
5622
5952
  }
5623
5953
  },
5624
- "description": "Check whether a builder config is publishable (advisory; does not save). Exits non-zero when the config is not publishable.",
5954
+ "description": "Change an ad group: bid, CPA goal, status or schedule",
5625
5955
  "examples": [
5626
- "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file config.json",
5627
- "cat config.json | <%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file -",
5628
- "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}'"
5956
+ "<%= config.bin %> asa ad-groups update UUID --default-bid 1.50",
5957
+ "<%= config.bin %> asa ad-groups update UUID --status PAUSED"
5629
5958
  ],
5630
5959
  "flags": {
5631
5960
  "json": {
@@ -5635,32 +5964,84 @@
5635
5964
  "allowNo": false,
5636
5965
  "type": "boolean"
5637
5966
  },
5638
- "app": {
5639
- "description": "App ID (UUID)",
5640
- "name": "app",
5641
- "required": true,
5967
+ "currency": {
5968
+ "description": "Currency code for the amounts in this call",
5969
+ "name": "currency",
5970
+ "default": "USD",
5642
5971
  "hasDynamicHelp": false,
5643
5972
  "multiple": false,
5644
5973
  "type": "option"
5645
5974
  },
5646
- "config": {
5647
- "description": "Builder config as a JSON string",
5648
- "name": "config",
5975
+ "end-time": {
5976
+ "description": "Schedule end (YYYY-MM-DD)",
5977
+ "name": "end-time",
5649
5978
  "hasDynamicHelp": false,
5650
5979
  "multiple": false,
5651
5980
  "type": "option"
5652
5981
  },
5653
- "config-file": {
5654
- "description": "JSON file with the builder config, or - to read stdin",
5655
- "name": "config-file",
5982
+ "start-time": {
5983
+ "description": "Schedule start (YYYY-MM-DD), defaults to today",
5984
+ "name": "start-time",
5985
+ "hasDynamicHelp": false,
5986
+ "multiple": false,
5987
+ "type": "option"
5988
+ },
5989
+ "yes": {
5990
+ "char": "y",
5991
+ "description": "Apply without asking; required when the output is piped or --json is used",
5992
+ "name": "yes",
5993
+ "allowNo": false,
5994
+ "type": "boolean"
5995
+ },
5996
+ "idempotency-key": {
5997
+ "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
5998
+ "name": "idempotency-key",
5999
+ "hasDynamicHelp": false,
6000
+ "multiple": false,
6001
+ "type": "option"
6002
+ },
6003
+ "automated-keywords": {
6004
+ "description": "Let Apple add keywords automatically",
6005
+ "name": "automated-keywords",
6006
+ "allowNo": true,
6007
+ "type": "boolean"
6008
+ },
6009
+ "cpa-goal": {
6010
+ "description": "CPA goal (amount, e.g. 50 or 12.50)",
6011
+ "name": "cpa-goal",
6012
+ "hasDynamicHelp": false,
6013
+ "multiple": false,
6014
+ "type": "option"
6015
+ },
6016
+ "default-bid": {
6017
+ "description": "Default bid (amount, e.g. 50 or 12.50)",
6018
+ "name": "default-bid",
6019
+ "hasDynamicHelp": false,
6020
+ "multiple": false,
6021
+ "type": "option"
6022
+ },
6023
+ "name": {
6024
+ "description": "Ad group name",
6025
+ "name": "name",
6026
+ "hasDynamicHelp": false,
6027
+ "multiple": false,
6028
+ "type": "option"
6029
+ },
6030
+ "status": {
6031
+ "description": "Ad group status",
6032
+ "name": "status",
5656
6033
  "hasDynamicHelp": false,
5657
6034
  "multiple": false,
6035
+ "options": [
6036
+ "ENABLED",
6037
+ "PAUSED"
6038
+ ],
5658
6039
  "type": "option"
5659
6040
  }
5660
6041
  },
5661
6042
  "hasDynamicHelp": false,
5662
6043
  "hiddenAliases": [],
5663
- "id": "flows:config:validate",
6044
+ "id": "asa:ad-groups:update",
5664
6045
  "pluginAlias": "adapty",
5665
6046
  "pluginName": "adapty",
5666
6047
  "pluginType": "core",
@@ -5670,23 +6051,23 @@
5670
6051
  "relativePath": [
5671
6052
  "dist",
5672
6053
  "commands",
5673
- "flows",
5674
- "config",
5675
- "validate.js"
6054
+ "asa",
6055
+ "ad-groups",
6056
+ "update.js"
5676
6057
  ]
5677
6058
  },
5678
- "flows:media:upload": {
6059
+ "flows:config:get": {
5679
6060
  "aliases": [],
5680
6061
  "args": {
5681
- "file": {
5682
- "description": "Path to the image file to upload",
5683
- "name": "file",
6062
+ "flow_id": {
6063
+ "description": "Flow ID (UUID)",
6064
+ "name": "flow_id",
5684
6065
  "required": true
5685
6066
  }
5686
6067
  },
5687
- "description": "Upload an image as a flow builder asset; prints the CDN URL to reference from a flow config",
6068
+ "description": "Read the flow builder config (404 until the config has been written at least once). On a failed publish, `publication_status`, `transform_error` and `publication_error` show why.",
5688
6069
  "examples": [
5689
- "<%= config.bin %> flows media upload --app UUID ./onboarding-hero.png"
6070
+ "<%= config.bin %> flows config get --app UUID 550e8400-e29b-41d4-a716-446655440000"
5690
6071
  ],
5691
6072
  "flags": {
5692
6073
  "json": {
@@ -5707,7 +6088,7 @@
5707
6088
  },
5708
6089
  "hasDynamicHelp": false,
5709
6090
  "hiddenAliases": [],
5710
- "id": "flows:media:upload",
6091
+ "id": "flows:config:get",
5711
6092
  "pluginAlias": "adapty",
5712
6093
  "pluginName": "adapty",
5713
6094
  "pluginType": "core",
@@ -5718,18 +6099,25 @@
5718
6099
  "dist",
5719
6100
  "commands",
5720
6101
  "flows",
5721
- "media",
5722
- "upload.js"
6102
+ "config",
6103
+ "get.js"
5723
6104
  ]
5724
6105
  },
5725
- "asa:ad-groups:create": {
6106
+ "flows:config:preview": {
5726
6107
  "aliases": [],
5727
- "args": {},
5728
- "description": "Create an ad group inside a campaign; --automated creates the automated ad group a Max Conversions campaign needs to run",
6108
+ "args": {
6109
+ "config_file": {
6110
+ "description": "Path to a local flow config JSON file",
6111
+ "name": "config_file",
6112
+ "required": true
6113
+ }
6114
+ },
6115
+ "description": "Build a render URL for a local flow config and open it. A quick-look escape hatch for small configs: the whole config rides in the URL fragment, and past roughly 32KB of pretty-printed JSON the render page gets slow and unreliable. Opens the browser on a TTY; when piped or with --json, prints the URL alone — and that URL is long (~113K characters for a 668KB flow), so pipe it into whatever takes the screenshot (\"| node capture.mjs\") or pass it with --url and command substitution. Never print or read it: agents burn context for zero information. The render host comes from $ADAPTY_APP_URL.",
5729
6116
  "examples": [
5730
- "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Brand terms\" --default-bid 1.20",
5731
- "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Brand terms\" --default-bid 1.20 --start-time 2026-09-01 --pricing-model CPM",
5732
- "<%= config.bin %> asa ad-groups create --campaign UUID --name \"Automated Max Conv\" --automated"
6117
+ "<%= config.bin %> flows config preview ./config.json",
6118
+ "<%= config.bin %> flows config preview ./config.json --screen welcome --device ipad-pro --orientation landscape",
6119
+ "# pipe the URL straight into a screenshot tool, never print it\n<%= config.bin %> flows config preview ./config.json | node capture.mjs --out shot.png",
6120
+ "# or pass it as an argument, for tools that want a flag\nnode capture.mjs --url \"$(<%= config.bin %> flows config preview ./config.json)\" --out shot.png"
5733
6121
  ],
5734
6122
  "flags": {
5735
6123
  "json": {
@@ -5739,114 +6127,37 @@
5739
6127
  "allowNo": false,
5740
6128
  "type": "boolean"
5741
6129
  },
5742
- "currency": {
5743
- "description": "Currency code for the amounts in this call",
5744
- "name": "currency",
5745
- "default": "USD",
5746
- "hasDynamicHelp": false,
5747
- "multiple": false,
5748
- "type": "option"
5749
- },
5750
- "end-time": {
5751
- "description": "Schedule end (YYYY-MM-DD)",
5752
- "name": "end-time",
5753
- "hasDynamicHelp": false,
5754
- "multiple": false,
5755
- "type": "option"
5756
- },
5757
- "start-time": {
5758
- "description": "Schedule start (YYYY-MM-DD), defaults to today",
5759
- "name": "start-time",
5760
- "hasDynamicHelp": false,
5761
- "multiple": false,
5762
- "type": "option"
5763
- },
5764
- "pricing-model": {
5765
- "description": "Pricing model; Apple requires one on every ad group",
5766
- "name": "pricing-model",
5767
- "default": "CPC",
5768
- "hasDynamicHelp": false,
5769
- "multiple": false,
5770
- "options": [
5771
- "CPC",
5772
- "CPM"
5773
- ],
5774
- "type": "option"
5775
- },
5776
- "yes": {
5777
- "char": "y",
5778
- "description": "Apply without asking; required when the output is piped or --json is used",
5779
- "name": "yes",
5780
- "allowNo": false,
5781
- "type": "boolean"
5782
- },
5783
- "idempotency-key": {
5784
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
5785
- "name": "idempotency-key",
5786
- "hasDynamicHelp": false,
5787
- "multiple": false,
5788
- "type": "option"
5789
- },
5790
- "automated": {
5791
- "description": "Create the automated ad group a Max Conversions campaign needs (no bid, no schedule, always ENABLED)",
5792
- "exclusive": [
5793
- "automated-keywords"
5794
- ],
5795
- "name": "automated",
5796
- "allowNo": false,
5797
- "type": "boolean"
5798
- },
5799
- "automated-keywords": {
5800
- "description": "Let Apple add keywords automatically",
5801
- "name": "automated-keywords",
5802
- "allowNo": true,
5803
- "type": "boolean"
5804
- },
5805
- "campaign": {
5806
- "description": "Campaign ID (UUID)",
5807
- "name": "campaign",
5808
- "required": true,
5809
- "hasDynamicHelp": false,
5810
- "multiple": false,
5811
- "type": "option"
5812
- },
5813
- "cpa-goal": {
5814
- "description": "CPA goal (amount, e.g. 50 or 12.50)",
5815
- "name": "cpa-goal",
5816
- "hasDynamicHelp": false,
5817
- "multiple": false,
5818
- "type": "option"
5819
- },
5820
- "default-bid": {
5821
- "description": "Default bid; required unless --automated is set (amount, e.g. 50 or 12.50)",
5822
- "name": "default-bid",
5823
- "hasDynamicHelp": false,
5824
- "multiple": false,
5825
- "type": "option"
5826
- },
5827
- "name": {
5828
- "description": "Ad group name",
5829
- "name": "name",
5830
- "required": true,
6130
+ "device": {
6131
+ "description": "Device frame to render in",
6132
+ "name": "device",
6133
+ "default": "iphone-14",
5831
6134
  "hasDynamicHelp": false,
5832
6135
  "multiple": false,
5833
6136
  "type": "option"
5834
6137
  },
5835
- "status": {
5836
- "description": "Initial status",
5837
- "name": "status",
6138
+ "orientation": {
6139
+ "description": "Device orientation to render in",
6140
+ "name": "orientation",
6141
+ "default": "portrait",
5838
6142
  "hasDynamicHelp": false,
5839
6143
  "multiple": false,
5840
6144
  "options": [
5841
- "ENABLED",
5842
- "PAUSED"
6145
+ "landscape",
6146
+ "portrait"
5843
6147
  ],
5844
6148
  "type": "option"
6149
+ },
6150
+ "screen": {
6151
+ "description": "Screen ID to render (default: the flow's first screen)",
6152
+ "name": "screen",
6153
+ "hasDynamicHelp": false,
6154
+ "multiple": false,
6155
+ "type": "option"
5845
6156
  }
5846
6157
  },
5847
6158
  "hasDynamicHelp": false,
5848
6159
  "hiddenAliases": [],
5849
- "id": "asa:ad-groups:create",
6160
+ "id": "flows:config:preview",
5850
6161
  "pluginAlias": "adapty",
5851
6162
  "pluginName": "adapty",
5852
6163
  "pluginType": "core",
@@ -5856,23 +6167,25 @@
5856
6167
  "relativePath": [
5857
6168
  "dist",
5858
6169
  "commands",
5859
- "asa",
5860
- "ad-groups",
5861
- "create.js"
6170
+ "flows",
6171
+ "config",
6172
+ "preview.js"
5862
6173
  ]
5863
6174
  },
5864
- "asa:ad-groups:get": {
6175
+ "flows:config:update": {
5865
6176
  "aliases": [],
5866
6177
  "args": {
5867
- "ad_group_id": {
5868
- "description": "Ad group ID (UUID)",
5869
- "name": "ad_group_id",
6178
+ "flow_id": {
6179
+ "description": "Flow ID (UUID)",
6180
+ "name": "flow_id",
5870
6181
  "required": true
5871
6182
  }
5872
6183
  },
5873
- "description": "Show one ad group; read numbers with asa metrics",
6184
+ "description": "Write the flow builder config (creates the first version, or edits/forks the current one)",
5874
6185
  "examples": [
5875
- "<%= config.bin %> asa ad-groups get 550e8400-e29b-41d4-a716-446655440000"
6186
+ "<%= config.bin %> flows config update --app UUID FLOW_UUID --config-file config.json",
6187
+ "cat config.json | <%= config.bin %> flows config update --app UUID FLOW_UUID --config-file -",
6188
+ "<%= config.bin %> flows config update --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}' --expected-updated-at 1755001800000"
5876
6189
  ],
5877
6190
  "flags": {
5878
6191
  "json": {
@@ -5881,11 +6194,47 @@
5881
6194
  "name": "json",
5882
6195
  "allowNo": false,
5883
6196
  "type": "boolean"
6197
+ },
6198
+ "app": {
6199
+ "description": "App ID (UUID)",
6200
+ "name": "app",
6201
+ "required": true,
6202
+ "hasDynamicHelp": false,
6203
+ "multiple": false,
6204
+ "type": "option"
6205
+ },
6206
+ "config": {
6207
+ "description": "Builder config as a JSON string",
6208
+ "name": "config",
6209
+ "hasDynamicHelp": false,
6210
+ "multiple": false,
6211
+ "type": "option"
6212
+ },
6213
+ "config-file": {
6214
+ "description": "JSON file with the builder config, or - to read stdin",
6215
+ "name": "config-file",
6216
+ "hasDynamicHelp": false,
6217
+ "multiple": false,
6218
+ "type": "option"
6219
+ },
6220
+ "expected-updated-at": {
6221
+ "description": "Optimistic lock: the `updated_at` from a prior config read. Omit for last-write-wins.",
6222
+ "name": "expected-updated-at",
6223
+ "hasDynamicHelp": false,
6224
+ "multiple": false,
6225
+ "type": "option"
6226
+ },
6227
+ "remote-configs": {
6228
+ "description": "JSON array of remote config entries: [{locale, data}]",
6229
+ "name": "remote-configs",
6230
+ "hasDynamicHelp": false,
6231
+ "multiple": false,
6232
+ "type": "option"
5884
6233
  }
5885
6234
  },
5886
6235
  "hasDynamicHelp": false,
5887
6236
  "hiddenAliases": [],
5888
- "id": "asa:ad-groups:get",
6237
+ "id": "flows:config:update",
5889
6238
  "pluginAlias": "adapty",
5890
6239
  "pluginName": "adapty",
5891
6240
  "pluginType": "core",
@@ -5895,18 +6244,25 @@
5895
6244
  "relativePath": [
5896
6245
  "dist",
5897
6246
  "commands",
5898
- "asa",
5899
- "ad-groups",
5900
- "get.js"
6247
+ "flows",
6248
+ "config",
6249
+ "update.js"
5901
6250
  ]
5902
6251
  },
5903
- "asa:ad-groups:list": {
6252
+ "flows:config:validate": {
5904
6253
  "aliases": [],
5905
- "args": {},
5906
- "description": "List ad groups; read numbers with asa metrics",
6254
+ "args": {
6255
+ "flow_id": {
6256
+ "description": "Flow ID (UUID)",
6257
+ "name": "flow_id",
6258
+ "required": true
6259
+ }
6260
+ },
6261
+ "description": "Check whether a builder config is publishable (advisory; does not save). Exits non-zero when the config is not publishable.",
5907
6262
  "examples": [
5908
- "<%= config.bin %> asa ad-groups list",
5909
- "<%= config.bin %> asa ad-groups list --campaign CAMPAIGN_UUID"
6263
+ "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file config.json",
6264
+ "cat config.json | <%= config.bin %> flows config validate --app UUID FLOW_UUID --config-file -",
6265
+ "<%= config.bin %> flows config validate --app UUID FLOW_UUID --config '{\"screens\":[],\"locales\":[]}'"
5910
6266
  ],
5911
6267
  "flags": {
5912
6268
  "json": {
@@ -5916,65 +6272,32 @@
5916
6272
  "allowNo": false,
5917
6273
  "type": "boolean"
5918
6274
  },
5919
- "page": {
5920
- "description": "Page number",
5921
- "name": "page",
5922
- "default": 1,
5923
- "hasDynamicHelp": false,
5924
- "multiple": false,
5925
- "type": "option"
5926
- },
5927
- "page-size": {
5928
- "description": "Items per page (max 1000); prefer one big page over a pagination loop",
5929
- "name": "page-size",
5930
- "default": 100,
5931
- "hasDynamicHelp": false,
5932
- "multiple": false,
5933
- "type": "option"
5934
- },
5935
6275
  "app": {
5936
- "description": "Keep only rows in this app; repeatable",
6276
+ "description": "App ID (UUID)",
5937
6277
  "name": "app",
5938
- "hasDynamicHelp": false,
5939
- "multiple": true,
5940
- "type": "option"
5941
- },
5942
- "campaign-group": {
5943
- "description": "Keep only rows in this campaign group; repeatable",
5944
- "name": "campaign-group",
5945
- "hasDynamicHelp": false,
5946
- "multiple": true,
5947
- "type": "option"
5948
- },
5949
- "search": {
5950
- "description": "Case-insensitive substring match on the name",
5951
- "name": "search",
6278
+ "required": true,
5952
6279
  "hasDynamicHelp": false,
5953
6280
  "multiple": false,
5954
6281
  "type": "option"
5955
6282
  },
5956
- "campaign": {
5957
- "description": "Keep only rows in this campaign; repeatable",
5958
- "name": "campaign",
6283
+ "config": {
6284
+ "description": "Builder config as a JSON string",
6285
+ "name": "config",
5959
6286
  "hasDynamicHelp": false,
5960
- "multiple": true,
6287
+ "multiple": false,
5961
6288
  "type": "option"
5962
6289
  },
5963
- "status": {
5964
- "description": "Keep only rows in this state",
5965
- "name": "status",
6290
+ "config-file": {
6291
+ "description": "JSON file with the builder config, or - to read stdin",
6292
+ "name": "config-file",
5966
6293
  "hasDynamicHelp": false,
5967
6294
  "multiple": false,
5968
- "options": [
5969
- "ENABLED",
5970
- "PAUSED"
5971
- ],
5972
6295
  "type": "option"
5973
6296
  }
5974
6297
  },
5975
6298
  "hasDynamicHelp": false,
5976
6299
  "hiddenAliases": [],
5977
- "id": "asa:ad-groups:list",
6300
+ "id": "flows:config:validate",
5978
6301
  "pluginAlias": "adapty",
5979
6302
  "pluginName": "adapty",
5980
6303
  "pluginType": "core",
@@ -5984,24 +6307,23 @@
5984
6307
  "relativePath": [
5985
6308
  "dist",
5986
6309
  "commands",
5987
- "asa",
5988
- "ad-groups",
5989
- "list.js"
6310
+ "flows",
6311
+ "config",
6312
+ "validate.js"
5990
6313
  ]
5991
6314
  },
5992
- "asa:ad-groups:update": {
6315
+ "flows:media:upload": {
5993
6316
  "aliases": [],
5994
6317
  "args": {
5995
- "ad_group_id": {
5996
- "description": "Ad group ID (UUID)",
5997
- "name": "ad_group_id",
6318
+ "file": {
6319
+ "description": "Path to the image file to upload",
6320
+ "name": "file",
5998
6321
  "required": true
5999
6322
  }
6000
6323
  },
6001
- "description": "Change an ad group: bid, CPA goal, status or schedule",
6324
+ "description": "Upload an image as a flow builder asset; prints the CDN URL to reference from a flow config",
6002
6325
  "examples": [
6003
- "<%= config.bin %> asa ad-groups update UUID --default-bid 1.50",
6004
- "<%= config.bin %> asa ad-groups update UUID --status PAUSED"
6326
+ "<%= config.bin %> flows media upload --app UUID ./onboarding-hero.png"
6005
6327
  ],
6006
6328
  "flags": {
6007
6329
  "json": {
@@ -6011,84 +6333,18 @@
6011
6333
  "allowNo": false,
6012
6334
  "type": "boolean"
6013
6335
  },
6014
- "currency": {
6015
- "description": "Currency code for the amounts in this call",
6016
- "name": "currency",
6017
- "default": "USD",
6018
- "hasDynamicHelp": false,
6019
- "multiple": false,
6020
- "type": "option"
6021
- },
6022
- "end-time": {
6023
- "description": "Schedule end (YYYY-MM-DD)",
6024
- "name": "end-time",
6025
- "hasDynamicHelp": false,
6026
- "multiple": false,
6027
- "type": "option"
6028
- },
6029
- "start-time": {
6030
- "description": "Schedule start (YYYY-MM-DD), defaults to today",
6031
- "name": "start-time",
6032
- "hasDynamicHelp": false,
6033
- "multiple": false,
6034
- "type": "option"
6035
- },
6036
- "yes": {
6037
- "char": "y",
6038
- "description": "Apply without asking; required when the output is piped or --json is used",
6039
- "name": "yes",
6040
- "allowNo": false,
6041
- "type": "boolean"
6042
- },
6043
- "idempotency-key": {
6044
- "description": "Idempotency key for this write; re-running with the same key replays the stored result instead of applying twice",
6045
- "name": "idempotency-key",
6046
- "hasDynamicHelp": false,
6047
- "multiple": false,
6048
- "type": "option"
6049
- },
6050
- "automated-keywords": {
6051
- "description": "Let Apple add keywords automatically",
6052
- "name": "automated-keywords",
6053
- "allowNo": true,
6054
- "type": "boolean"
6055
- },
6056
- "cpa-goal": {
6057
- "description": "CPA goal (amount, e.g. 50 or 12.50)",
6058
- "name": "cpa-goal",
6059
- "hasDynamicHelp": false,
6060
- "multiple": false,
6061
- "type": "option"
6062
- },
6063
- "default-bid": {
6064
- "description": "Default bid (amount, e.g. 50 or 12.50)",
6065
- "name": "default-bid",
6066
- "hasDynamicHelp": false,
6067
- "multiple": false,
6068
- "type": "option"
6069
- },
6070
- "name": {
6071
- "description": "Ad group name",
6072
- "name": "name",
6073
- "hasDynamicHelp": false,
6074
- "multiple": false,
6075
- "type": "option"
6076
- },
6077
- "status": {
6078
- "description": "Ad group status",
6079
- "name": "status",
6336
+ "app": {
6337
+ "description": "App ID (UUID)",
6338
+ "name": "app",
6339
+ "required": true,
6080
6340
  "hasDynamicHelp": false,
6081
6341
  "multiple": false,
6082
- "options": [
6083
- "ENABLED",
6084
- "PAUSED"
6085
- ],
6086
6342
  "type": "option"
6087
6343
  }
6088
6344
  },
6089
6345
  "hasDynamicHelp": false,
6090
6346
  "hiddenAliases": [],
6091
- "id": "asa:ad-groups:update",
6347
+ "id": "flows:media:upload",
6092
6348
  "pluginAlias": "adapty",
6093
6349
  "pluginName": "adapty",
6094
6350
  "pluginType": "core",
@@ -6098,11 +6354,11 @@
6098
6354
  "relativePath": [
6099
6355
  "dist",
6100
6356
  "commands",
6101
- "asa",
6102
- "ad-groups",
6103
- "update.js"
6357
+ "flows",
6358
+ "media",
6359
+ "upload.js"
6104
6360
  ]
6105
6361
  }
6106
6362
  },
6107
- "version": "0.9.2"
6363
+ "version": "0.9.4"
6108
6364
  }