@loopress/cli 0.24.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +716 -98
  2. package/dist/commands/acf/push.d.ts +1 -0
  3. package/dist/commands/acf/push.js +25 -2
  4. package/dist/commands/acf/rollback.d.ts +2 -0
  5. package/dist/commands/acf/rollback.js +5 -0
  6. package/dist/commands/api/rm.d.ts +2 -0
  7. package/dist/commands/api/rm.js +2 -0
  8. package/dist/commands/api/rollback.d.ts +2 -0
  9. package/dist/commands/api/rollback.js +5 -0
  10. package/dist/commands/composer/push.d.ts +3 -0
  11. package/dist/commands/composer/push.js +24 -7
  12. package/dist/commands/diff.js +1 -1
  13. package/dist/commands/doctor.d.ts +17 -1
  14. package/dist/commands/doctor.js +55 -38
  15. package/dist/commands/form/pull.js +4 -1
  16. package/dist/commands/form/push.d.ts +3 -0
  17. package/dist/commands/form/push.js +39 -6
  18. package/dist/commands/form/rollback.d.ts +2 -0
  19. package/dist/commands/form/rollback.js +5 -0
  20. package/dist/commands/hook/rm.d.ts +2 -0
  21. package/dist/commands/hook/rm.js +2 -0
  22. package/dist/commands/hook/rollback.d.ts +2 -0
  23. package/dist/commands/hook/rollback.js +5 -0
  24. package/dist/commands/init.js +1 -0
  25. package/dist/commands/login.js +3 -2
  26. package/dist/commands/menu/diff.d.ts +2 -0
  27. package/dist/commands/menu/diff.js +5 -0
  28. package/dist/commands/menu/list.d.ts +13 -0
  29. package/dist/commands/menu/list.js +32 -0
  30. package/dist/commands/menu/pull.d.ts +15 -0
  31. package/dist/commands/menu/pull.js +72 -0
  32. package/dist/commands/menu/push.d.ts +17 -0
  33. package/dist/commands/menu/push.js +120 -0
  34. package/dist/commands/menu/rollback.d.ts +2 -0
  35. package/dist/commands/menu/rollback.js +5 -0
  36. package/dist/commands/option/add.js +1 -1
  37. package/dist/commands/option/push.d.ts +1 -0
  38. package/dist/commands/option/push.js +26 -1
  39. package/dist/commands/option/rollback.d.ts +2 -0
  40. package/dist/commands/option/rollback.js +5 -0
  41. package/dist/commands/plugin/push.d.ts +1 -0
  42. package/dist/commands/plugin/push.js +14 -0
  43. package/dist/commands/promote.d.ts +8 -1
  44. package/dist/commands/promote.js +2 -0
  45. package/dist/commands/pull.d.ts +11 -1
  46. package/dist/commands/pull.js +9 -2
  47. package/dist/commands/push.d.ts +11 -1
  48. package/dist/commands/push.js +9 -2
  49. package/dist/commands/seo/pull.js +6 -2
  50. package/dist/commands/seo/push.d.ts +3 -0
  51. package/dist/commands/seo/push.js +49 -7
  52. package/dist/commands/seo/rollback.d.ts +2 -0
  53. package/dist/commands/seo/rollback.js +5 -0
  54. package/dist/commands/snippet/push.d.ts +1 -0
  55. package/dist/commands/snippet/push.js +31 -1
  56. package/dist/commands/snippet/rollback.d.ts +2 -0
  57. package/dist/commands/snippet/rollback.js +5 -0
  58. package/dist/commands/theme-styles/diff.d.ts +2 -0
  59. package/dist/commands/theme-styles/diff.js +5 -0
  60. package/dist/commands/theme-styles/pull.d.ts +12 -0
  61. package/dist/commands/theme-styles/pull.js +31 -0
  62. package/dist/commands/theme-styles/push.d.ts +12 -0
  63. package/dist/commands/theme-styles/push.js +45 -0
  64. package/dist/commands/theme-styles/rollback.d.ts +2 -0
  65. package/dist/commands/theme-styles/rollback.js +5 -0
  66. package/dist/hooks/finally.js +4 -1
  67. package/dist/lib/app-manifest.js +4 -27
  68. package/dist/lib/base.d.ts +2 -0
  69. package/dist/lib/base.js +6 -0
  70. package/dist/lib/find-orphaned-files.js +5 -47
  71. package/dist/lib/load-files.js +4 -42
  72. package/dist/lib/local-callback-server.d.ts +14 -1
  73. package/dist/lib/local-callback-server.js +40 -1
  74. package/dist/lib/php-files-command.d.ts +17 -3
  75. package/dist/lib/php-files-command.js +196 -37
  76. package/dist/lib/push-command.d.ts +4 -0
  77. package/dist/lib/push-command.js +49 -0
  78. package/dist/lib/readdir-tolerant.d.ts +1 -0
  79. package/dist/lib/readdir-tolerant.js +12 -0
  80. package/dist/lib/resource-state.js +92 -3
  81. package/dist/lib/rollback-command.d.ts +21 -0
  82. package/dist/lib/rollback-command.js +180 -0
  83. package/dist/lib/rollback-materialize.d.ts +1 -0
  84. package/dist/lib/rollback-materialize.js +121 -0
  85. package/dist/lib/sentry.d.ts +3 -0
  86. package/dist/lib/sentry.js +30 -0
  87. package/dist/lib/snapshot-store.d.ts +30 -0
  88. package/dist/lib/snapshot-store.js +133 -0
  89. package/dist/lib/validate-local.js +2 -1
  90. package/dist/lib/wp-authorize-flow.d.ts +4 -0
  91. package/dist/lib/wp-authorize-flow.js +10 -8
  92. package/dist/types/project-config.generated.d.ts +8 -0
  93. package/dist/utils/acf-format.d.ts +1 -0
  94. package/dist/utils/acf-format.js +6 -0
  95. package/dist/utils/form-format.d.ts +4 -0
  96. package/dist/utils/form-format.js +3 -7
  97. package/dist/utils/menu-format.d.ts +24 -0
  98. package/dist/utils/menu-format.js +8 -0
  99. package/dist/utils/option-format.d.ts +2 -1
  100. package/dist/utils/option-format.js +22 -4
  101. package/dist/utils/plugin-sync.d.ts +6 -0
  102. package/dist/utils/resource-dirs.d.ts +2 -0
  103. package/dist/utils/resource-dirs.js +4 -0
  104. package/dist/utils/seo-format.d.ts +8 -0
  105. package/dist/utils/seo-format.js +3 -0
  106. package/dist/utils/snippet-format.d.ts +1 -0
  107. package/dist/utils/snippet-format.js +1 -0
  108. package/dist/utils/theme-styles-format.d.ts +26 -0
  109. package/dist/utils/theme-styles-format.js +55 -0
  110. package/oclif.manifest.json +1837 -386
  111. package/package.json +5 -3
  112. package/schemas/project-config.schema.json +10 -0
@@ -43,7 +43,7 @@
43
43
  "diff": {
44
44
  "aliases": [],
45
45
  "args": {},
46
- "description": "Show what differs between your local tracked files and a WordPress environment, or between two environments. Covers snippets, forms, ACF, API routes, Hooks, SEO, and Composer. Plugins and themes have their own `lps plugin status` / `lps theme status`. Exit code: 0 in sync, 1 on drift, 2 when a resource could not be compared, so it doubles as a CI drift gate.",
46
+ "description": "Show what differs between your local tracked files and a WordPress environment, or between two environments. Covers snippets, forms, ACF, API routes, Hooks, SEO, Options, Menus, Theme styles, and Composer. Plugins and themes have their own `lps plugin status` / `lps theme status`. Exit code: 0 in sync, 1 on drift, 2 when a resource could not be compared, so it doubles as a CI drift gate.",
47
47
  "examples": [
48
48
  "$ lps diff",
49
49
  "$ lps diff --env staging",
@@ -85,7 +85,9 @@
85
85
  "api",
86
86
  "hook",
87
87
  "seo",
88
+ "menu",
88
89
  "option",
90
+ "theme-styles",
89
91
  "composer"
90
92
  ],
91
93
  "type": "option"
@@ -102,7 +104,9 @@
102
104
  "api",
103
105
  "hook",
104
106
  "seo",
107
+ "menu",
105
108
  "option",
109
+ "theme-styles",
106
110
  "composer"
107
111
  ],
108
112
  "type": "option"
@@ -156,6 +160,13 @@
156
160
  "$ lps doctor --env production"
157
161
  ],
158
162
  "flags": {
163
+ "json": {
164
+ "description": "Format output as json.",
165
+ "helpGroup": "GLOBAL",
166
+ "name": "json",
167
+ "allowNo": false,
168
+ "type": "boolean"
169
+ },
159
170
  "env": {
160
171
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
161
172
  "name": "env",
@@ -171,7 +182,7 @@
171
182
  "pluginName": "@loopress/cli",
172
183
  "pluginType": "core",
173
184
  "strict": true,
174
- "enableJsonFlag": false,
185
+ "enableJsonFlag": true,
175
186
  "dryRunFlag": {
176
187
  "dry-run": {
177
188
  "char": "d",
@@ -284,6 +295,13 @@
284
295
  "$ lps promote production staging --dry-run"
285
296
  ],
286
297
  "flags": {
298
+ "json": {
299
+ "description": "Format output as json.",
300
+ "helpGroup": "GLOBAL",
301
+ "name": "json",
302
+ "allowNo": false,
303
+ "type": "boolean"
304
+ },
287
305
  "dry-run": {
288
306
  "char": "d",
289
307
  "description": "Show what would change without making changes",
@@ -306,7 +324,7 @@
306
324
  "pluginName": "@loopress/cli",
307
325
  "pluginType": "core",
308
326
  "strict": true,
309
- "enableJsonFlag": false,
327
+ "enableJsonFlag": true,
310
328
  "isESM": true,
311
329
  "relativePath": [
312
330
  "dist",
@@ -317,13 +335,20 @@
317
335
  "pull": {
318
336
  "aliases": [],
319
337
  "args": {},
320
- "description": "Pull all content, plugins, composer dependencies, ACF, API routes, hooks, forms, SEO, options, and snippets, from WordPress",
338
+ "description": "Pull all content, plugins, composer dependencies, ACF, API routes, hooks, forms, SEO, menus, options, and snippets, from WordPress",
321
339
  "examples": [
322
340
  "$ lps pull",
323
341
  "$ lps pull --env staging",
324
342
  "$ lps pull --dry-run"
325
343
  ],
326
344
  "flags": {
345
+ "json": {
346
+ "description": "Format output as json.",
347
+ "helpGroup": "GLOBAL",
348
+ "name": "json",
349
+ "allowNo": false,
350
+ "type": "boolean"
351
+ },
327
352
  "env": {
328
353
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
329
354
  "name": "env",
@@ -353,7 +378,7 @@
353
378
  "pluginName": "@loopress/cli",
354
379
  "pluginType": "core",
355
380
  "strict": true,
356
- "enableJsonFlag": false,
381
+ "enableJsonFlag": true,
357
382
  "dryRunFlag": {
358
383
  "dry-run": {
359
384
  "char": "d",
@@ -380,13 +405,20 @@
380
405
  "push": {
381
406
  "aliases": [],
382
407
  "args": {},
383
- "description": "Push all local content, plugins, composer dependencies, ACF, API routes, hooks, forms, SEO, options, and snippets, to WordPress",
408
+ "description": "Push all local content, plugins, composer dependencies, ACF, API routes, hooks, forms, SEO, menus, options, and snippets, to WordPress",
384
409
  "examples": [
385
410
  "$ lps push",
386
411
  "$ lps push --env staging",
387
412
  "$ lps push --dry-run"
388
413
  ],
389
414
  "flags": {
415
+ "json": {
416
+ "description": "Format output as json.",
417
+ "helpGroup": "GLOBAL",
418
+ "name": "json",
419
+ "allowNo": false,
420
+ "type": "boolean"
421
+ },
390
422
  "env": {
391
423
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
392
424
  "name": "env",
@@ -416,7 +448,7 @@
416
448
  "pluginName": "@loopress/cli",
417
449
  "pluginType": "core",
418
450
  "strict": true,
419
- "enableJsonFlag": false,
451
+ "enableJsonFlag": true,
420
452
  "dryRunFlag": {
421
453
  "dry-run": {
422
454
  "char": "d",
@@ -822,6 +854,96 @@
822
854
  "push.js"
823
855
  ]
824
856
  },
857
+ "acf:rollback": {
858
+ "aliases": [],
859
+ "args": {
860
+ "path": {
861
+ "description": "Path to ACF directory (overrides project config)",
862
+ "name": "path"
863
+ }
864
+ },
865
+ "description": "Restore ACF field groups, post types, taxonomies, and options pages to a snapshot taken automatically before an earlier `lps acf push`",
866
+ "examples": [
867
+ "$ lps acf rollback",
868
+ "$ lps acf rollback --list",
869
+ "$ lps acf rollback --to 1732000000000",
870
+ "$ lps acf rollback --dry-run"
871
+ ],
872
+ "flags": {
873
+ "json": {
874
+ "description": "Format output as json.",
875
+ "helpGroup": "GLOBAL",
876
+ "name": "json",
877
+ "allowNo": false,
878
+ "type": "boolean"
879
+ },
880
+ "env": {
881
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
882
+ "name": "env",
883
+ "hasDynamicHelp": false,
884
+ "multiple": false,
885
+ "type": "option"
886
+ },
887
+ "dry-run": {
888
+ "char": "d",
889
+ "description": "Show what would change without making changes",
890
+ "name": "dry-run",
891
+ "allowNo": false,
892
+ "type": "boolean"
893
+ },
894
+ "yes": {
895
+ "char": "y",
896
+ "description": "Answer yes to confirmation prompts",
897
+ "name": "yes",
898
+ "allowNo": false,
899
+ "type": "boolean"
900
+ },
901
+ "list": {
902
+ "description": "List available snapshots instead of rolling back",
903
+ "name": "list",
904
+ "allowNo": false,
905
+ "type": "boolean"
906
+ },
907
+ "to": {
908
+ "description": "Roll back to this snapshot id instead of the most recent one",
909
+ "name": "to",
910
+ "hasDynamicHelp": false,
911
+ "multiple": false,
912
+ "type": "option"
913
+ }
914
+ },
915
+ "hasDynamicHelp": false,
916
+ "hiddenAliases": [],
917
+ "id": "acf:rollback",
918
+ "pluginAlias": "@loopress/cli",
919
+ "pluginName": "@loopress/cli",
920
+ "pluginType": "core",
921
+ "strict": true,
922
+ "enableJsonFlag": true,
923
+ "dryRunFlag": {
924
+ "dry-run": {
925
+ "char": "d",
926
+ "description": "Show what would change without making changes",
927
+ "allowNo": false,
928
+ "type": "boolean"
929
+ }
930
+ },
931
+ "yesFlag": {
932
+ "yes": {
933
+ "char": "y",
934
+ "description": "Answer yes to confirmation prompts",
935
+ "allowNo": false,
936
+ "type": "boolean"
937
+ }
938
+ },
939
+ "isESM": true,
940
+ "relativePath": [
941
+ "dist",
942
+ "commands",
943
+ "acf",
944
+ "rollback.js"
945
+ ]
946
+ },
825
947
  "api:diff": {
826
948
  "aliases": [],
827
949
  "args": {
@@ -1070,7 +1192,8 @@
1070
1192
  "description": "Push custom API route files to WordPress",
1071
1193
  "examples": [
1072
1194
  "$ lps api push",
1073
- "$ lps api push --path ./api"
1195
+ "$ lps api push --path ./api",
1196
+ "$ lps api push --prune"
1074
1197
  ],
1075
1198
  "flags": {
1076
1199
  "json": {
@@ -1100,6 +1223,12 @@
1100
1223
  "name": "yes",
1101
1224
  "allowNo": false,
1102
1225
  "type": "boolean"
1226
+ },
1227
+ "prune": {
1228
+ "description": "Delete server-side route files not present locally after pushing",
1229
+ "name": "prune",
1230
+ "allowNo": false,
1231
+ "type": "boolean"
1103
1232
  }
1104
1233
  },
1105
1234
  "hasDynamicHelp": false,
@@ -1118,12 +1247,19 @@
1118
1247
  "push.js"
1119
1248
  ]
1120
1249
  },
1121
- "app:list": {
1250
+ "api:rm": {
1122
1251
  "aliases": [],
1123
- "args": {},
1124
- "description": "List single-page apps deployed to WordPress",
1252
+ "args": {
1253
+ "filename": {
1254
+ "description": "The route file to remove, its slug without the .php extension (e.g. \"hello\" or \"invoice-pdf/[order_id]\")",
1255
+ "name": "filename",
1256
+ "required": true
1257
+ }
1258
+ },
1259
+ "description": "Remove a custom API route file from WordPress",
1125
1260
  "examples": [
1126
- "$ lps app list"
1261
+ "$ lps api rm hello",
1262
+ "$ lps api rm hello --yes"
1127
1263
  ],
1128
1264
  "flags": {
1129
1265
  "json": {
@@ -1139,11 +1275,25 @@
1139
1275
  "hasDynamicHelp": false,
1140
1276
  "multiple": false,
1141
1277
  "type": "option"
1278
+ },
1279
+ "dry-run": {
1280
+ "char": "d",
1281
+ "description": "Show what would change without making changes",
1282
+ "name": "dry-run",
1283
+ "allowNo": false,
1284
+ "type": "boolean"
1285
+ },
1286
+ "yes": {
1287
+ "char": "y",
1288
+ "description": "Answer yes to confirmation prompts",
1289
+ "name": "yes",
1290
+ "allowNo": false,
1291
+ "type": "boolean"
1142
1292
  }
1143
1293
  },
1144
1294
  "hasDynamicHelp": false,
1145
1295
  "hiddenAliases": [],
1146
- "id": "app:list",
1296
+ "id": "api:rm",
1147
1297
  "pluginAlias": "@loopress/cli",
1148
1298
  "pluginName": "@loopress/cli",
1149
1299
  "pluginType": "core",
@@ -1169,21 +1319,24 @@
1169
1319
  "relativePath": [
1170
1320
  "dist",
1171
1321
  "commands",
1172
- "app",
1173
- "list.js"
1322
+ "api",
1323
+ "rm.js"
1174
1324
  ]
1175
1325
  },
1176
- "app:pull": {
1326
+ "api:rollback": {
1177
1327
  "aliases": [],
1178
1328
  "args": {
1179
1329
  "path": {
1180
- "description": "Path to apps directory (overrides project config)",
1330
+ "description": "Path to api directory (overrides project config)",
1181
1331
  "name": "path"
1182
1332
  }
1183
1333
  },
1184
- "description": "Pull single-page app bundles from WordPress into local files",
1334
+ "description": "Restore API route files to a snapshot taken automatically before an earlier `lps api push`",
1185
1335
  "examples": [
1186
- "$ lps app pull"
1336
+ "$ lps api rollback",
1337
+ "$ lps api rollback --list",
1338
+ "$ lps api rollback --to 1732000000000",
1339
+ "$ lps api rollback --dry-run"
1187
1340
  ],
1188
1341
  "flags": {
1189
1342
  "json": {
@@ -1213,11 +1366,24 @@
1213
1366
  "name": "yes",
1214
1367
  "allowNo": false,
1215
1368
  "type": "boolean"
1369
+ },
1370
+ "list": {
1371
+ "description": "List available snapshots instead of rolling back",
1372
+ "name": "list",
1373
+ "allowNo": false,
1374
+ "type": "boolean"
1375
+ },
1376
+ "to": {
1377
+ "description": "Roll back to this snapshot id instead of the most recent one",
1378
+ "name": "to",
1379
+ "hasDynamicHelp": false,
1380
+ "multiple": false,
1381
+ "type": "option"
1216
1382
  }
1217
1383
  },
1218
1384
  "hasDynamicHelp": false,
1219
1385
  "hiddenAliases": [],
1220
- "id": "app:pull",
1386
+ "id": "api:rollback",
1221
1387
  "pluginAlias": "@loopress/cli",
1222
1388
  "pluginName": "@loopress/cli",
1223
1389
  "pluginType": "core",
@@ -1243,22 +1409,16 @@
1243
1409
  "relativePath": [
1244
1410
  "dist",
1245
1411
  "commands",
1246
- "app",
1247
- "pull.js"
1412
+ "api",
1413
+ "rollback.js"
1248
1414
  ]
1249
1415
  },
1250
- "app:push": {
1416
+ "app:list": {
1251
1417
  "aliases": [],
1252
- "args": {
1253
- "name": {
1254
- "description": "Push only this app (defaults to every app in the directory)",
1255
- "name": "name"
1256
- }
1257
- },
1258
- "description": "Push built single-page app bundles to WordPress. Each app is an `apps/<name>/` directory holding a loopress.app.json and a built dist/ folder. Only files whose content changed are uploaded.",
1418
+ "args": {},
1419
+ "description": "List single-page apps deployed to WordPress",
1259
1420
  "examples": [
1260
- "$ lps app push",
1261
- "$ lps app push search"
1421
+ "$ lps app list"
1262
1422
  ],
1263
1423
  "flags": {
1264
1424
  "json": {
@@ -1274,50 +1434,51 @@
1274
1434
  "hasDynamicHelp": false,
1275
1435
  "multiple": false,
1276
1436
  "type": "option"
1277
- },
1437
+ }
1438
+ },
1439
+ "hasDynamicHelp": false,
1440
+ "hiddenAliases": [],
1441
+ "id": "app:list",
1442
+ "pluginAlias": "@loopress/cli",
1443
+ "pluginName": "@loopress/cli",
1444
+ "pluginType": "core",
1445
+ "strict": true,
1446
+ "enableJsonFlag": true,
1447
+ "dryRunFlag": {
1278
1448
  "dry-run": {
1279
1449
  "char": "d",
1280
1450
  "description": "Show what would change without making changes",
1281
- "name": "dry-run",
1282
1451
  "allowNo": false,
1283
1452
  "type": "boolean"
1284
- },
1453
+ }
1454
+ },
1455
+ "yesFlag": {
1285
1456
  "yes": {
1286
1457
  "char": "y",
1287
1458
  "description": "Answer yes to confirmation prompts",
1288
- "name": "yes",
1289
1459
  "allowNo": false,
1290
1460
  "type": "boolean"
1291
1461
  }
1292
1462
  },
1293
- "hasDynamicHelp": false,
1294
- "hiddenAliases": [],
1295
- "id": "app:push",
1296
- "pluginAlias": "@loopress/cli",
1297
- "pluginName": "@loopress/cli",
1298
- "pluginType": "core",
1299
- "strict": true,
1300
- "enableJsonFlag": true,
1301
1463
  "isESM": true,
1302
1464
  "relativePath": [
1303
1465
  "dist",
1304
1466
  "commands",
1305
1467
  "app",
1306
- "push.js"
1468
+ "list.js"
1307
1469
  ]
1308
1470
  },
1309
- "app:remove": {
1471
+ "app:pull": {
1310
1472
  "aliases": [],
1311
1473
  "args": {
1312
- "name": {
1313
- "description": "App to remove from WordPress",
1314
- "name": "name",
1315
- "required": true
1474
+ "path": {
1475
+ "description": "Path to apps directory (overrides project config)",
1476
+ "name": "path"
1316
1477
  }
1317
1478
  },
1318
- "description": "Remove a single-page app from WordPress: deletes its bundle from wp-content/loopress/apps/ and unregisters the shortcode. Local files are left untouched.",
1479
+ "description": "Pull single-page app bundles from WordPress into local files",
1319
1480
  "examples": [
1320
- "$ lps app remove search"
1481
+ "$ lps app pull"
1321
1482
  ],
1322
1483
  "flags": {
1323
1484
  "json": {
@@ -1351,7 +1512,7 @@
1351
1512
  },
1352
1513
  "hasDynamicHelp": false,
1353
1514
  "hiddenAliases": [],
1354
- "id": "app:remove",
1515
+ "id": "app:pull",
1355
1516
  "pluginAlias": "@loopress/cli",
1356
1517
  "pluginName": "@loopress/cli",
1357
1518
  "pluginType": "core",
@@ -1378,18 +1539,30 @@
1378
1539
  "dist",
1379
1540
  "commands",
1380
1541
  "app",
1381
- "remove.js"
1542
+ "pull.js"
1382
1543
  ]
1383
1544
  },
1384
- "composer:init": {
1545
+ "app:push": {
1385
1546
  "aliases": [],
1386
- "args": {},
1387
- "description": "Create a composer.json wired to WPackagist for installing WordPress.org plugins and themes",
1547
+ "args": {
1548
+ "name": {
1549
+ "description": "Push only this app (defaults to every app in the directory)",
1550
+ "name": "name"
1551
+ }
1552
+ },
1553
+ "description": "Push built single-page app bundles to WordPress. Each app is an `apps/<name>/` directory holding a loopress.app.json and a built dist/ folder. Only files whose content changed are uploaded.",
1388
1554
  "examples": [
1389
- "$ lps composer init",
1390
- "$ lps composer init --dry-run"
1555
+ "$ lps app push",
1556
+ "$ lps app push search"
1391
1557
  ],
1392
1558
  "flags": {
1559
+ "json": {
1560
+ "description": "Format output as json.",
1561
+ "helpGroup": "GLOBAL",
1562
+ "name": "json",
1563
+ "allowNo": false,
1564
+ "type": "boolean"
1565
+ },
1393
1566
  "env": {
1394
1567
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
1395
1568
  "name": "env",
@@ -1403,47 +1576,43 @@
1403
1576
  "name": "dry-run",
1404
1577
  "allowNo": false,
1405
1578
  "type": "boolean"
1579
+ },
1580
+ "yes": {
1581
+ "char": "y",
1582
+ "description": "Answer yes to confirmation prompts",
1583
+ "name": "yes",
1584
+ "allowNo": false,
1585
+ "type": "boolean"
1406
1586
  }
1407
1587
  },
1408
1588
  "hasDynamicHelp": false,
1409
1589
  "hiddenAliases": [],
1410
- "id": "composer:init",
1590
+ "id": "app:push",
1411
1591
  "pluginAlias": "@loopress/cli",
1412
1592
  "pluginName": "@loopress/cli",
1413
1593
  "pluginType": "core",
1414
1594
  "strict": true,
1415
- "enableJsonFlag": false,
1416
- "dryRunFlag": {
1417
- "dry-run": {
1418
- "char": "d",
1419
- "description": "Show what would change without making changes",
1420
- "allowNo": false,
1421
- "type": "boolean"
1422
- }
1423
- },
1424
- "yesFlag": {
1425
- "yes": {
1426
- "char": "y",
1427
- "description": "Answer yes to confirmation prompts",
1428
- "allowNo": false,
1429
- "type": "boolean"
1430
- }
1431
- },
1595
+ "enableJsonFlag": true,
1432
1596
  "isESM": true,
1433
1597
  "relativePath": [
1434
1598
  "dist",
1435
1599
  "commands",
1436
- "composer",
1437
- "init.js"
1600
+ "app",
1601
+ "push.js"
1438
1602
  ]
1439
1603
  },
1440
- "composer:pull": {
1604
+ "app:remove": {
1441
1605
  "aliases": [],
1442
- "args": {},
1443
- "description": "Pull composer.json and composer.lock from WordPress",
1606
+ "args": {
1607
+ "name": {
1608
+ "description": "App to remove from WordPress",
1609
+ "name": "name",
1610
+ "required": true
1611
+ }
1612
+ },
1613
+ "description": "Remove a single-page app from WordPress: deletes its bundle from wp-content/loopress/apps/ and unregisters the shortcode. Local files are left untouched.",
1444
1614
  "examples": [
1445
- "$ lps composer pull",
1446
- "$ lps composer pull --dry-run"
1615
+ "$ lps app remove search"
1447
1616
  ],
1448
1617
  "flags": {
1449
1618
  "json": {
@@ -1466,11 +1635,18 @@
1466
1635
  "name": "dry-run",
1467
1636
  "allowNo": false,
1468
1637
  "type": "boolean"
1638
+ },
1639
+ "yes": {
1640
+ "char": "y",
1641
+ "description": "Answer yes to confirmation prompts",
1642
+ "name": "yes",
1643
+ "allowNo": false,
1644
+ "type": "boolean"
1469
1645
  }
1470
1646
  },
1471
1647
  "hasDynamicHelp": false,
1472
1648
  "hiddenAliases": [],
1473
- "id": "composer:pull",
1649
+ "id": "app:remove",
1474
1650
  "pluginAlias": "@loopress/cli",
1475
1651
  "pluginName": "@loopress/cli",
1476
1652
  "pluginType": "core",
@@ -1496,26 +1672,19 @@
1496
1672
  "relativePath": [
1497
1673
  "dist",
1498
1674
  "commands",
1499
- "composer",
1500
- "pull.js"
1675
+ "app",
1676
+ "remove.js"
1501
1677
  ]
1502
1678
  },
1503
- "composer:push": {
1679
+ "composer:init": {
1504
1680
  "aliases": [],
1505
1681
  "args": {},
1506
- "description": "Push composer.json (and composer.lock, if present) to WordPress and run Composer",
1682
+ "description": "Create a composer.json wired to WPackagist for installing WordPress.org plugins and themes",
1507
1683
  "examples": [
1508
- "$ lps composer push",
1509
- "$ lps composer push --dry-run"
1684
+ "$ lps composer init",
1685
+ "$ lps composer init --dry-run"
1510
1686
  ],
1511
1687
  "flags": {
1512
- "json": {
1513
- "description": "Format output as json.",
1514
- "helpGroup": "GLOBAL",
1515
- "name": "json",
1516
- "allowNo": false,
1517
- "type": "boolean"
1518
- },
1519
1688
  "env": {
1520
1689
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
1521
1690
  "name": "env",
@@ -1529,82 +1698,16 @@
1529
1698
  "name": "dry-run",
1530
1699
  "allowNo": false,
1531
1700
  "type": "boolean"
1532
- },
1533
- "yes": {
1534
- "char": "y",
1535
- "description": "Answer yes to confirmation prompts",
1536
- "name": "yes",
1537
- "allowNo": false,
1538
- "type": "boolean"
1539
- },
1540
- "force": {
1541
- "description": "Allow downgrades and take over plugins/themes installed outside Loopress",
1542
- "name": "force",
1543
- "allowNo": false,
1544
- "type": "boolean"
1545
- }
1546
- },
1547
- "hasDynamicHelp": false,
1548
- "hiddenAliases": [],
1549
- "id": "composer:push",
1550
- "pluginAlias": "@loopress/cli",
1551
- "pluginName": "@loopress/cli",
1552
- "pluginType": "core",
1553
- "strict": true,
1554
- "enableJsonFlag": true,
1555
- "isESM": true,
1556
- "relativePath": [
1557
- "dist",
1558
- "commands",
1559
- "composer",
1560
- "push.js"
1561
- ]
1562
- },
1563
- "form:diff": {
1564
- "aliases": [],
1565
- "args": {
1566
- "path": {
1567
- "description": "Path to forms directory (overrides project config)",
1568
- "name": "path"
1569
- }
1570
- },
1571
- "description": "Show what differs in forms between your local files and a WordPress environment, or between two environments",
1572
- "examples": [
1573
- "$ lps form diff",
1574
- "$ lps form diff --env staging",
1575
- "$ lps form diff --env staging --against production"
1576
- ],
1577
- "flags": {
1578
- "json": {
1579
- "description": "Format output as json.",
1580
- "helpGroup": "GLOBAL",
1581
- "name": "json",
1582
- "allowNo": false,
1583
- "type": "boolean"
1584
- },
1585
- "env": {
1586
- "description": "Target environment by name, overriding the globally active one (lps project switch)",
1587
- "name": "env",
1588
- "hasDynamicHelp": false,
1589
- "multiple": false,
1590
- "type": "option"
1591
- },
1592
- "against": {
1593
- "description": "Compare the primary environment against this second environment instead of against local files",
1594
- "name": "against",
1595
- "hasDynamicHelp": false,
1596
- "multiple": false,
1597
- "type": "option"
1598
1701
  }
1599
1702
  },
1600
1703
  "hasDynamicHelp": false,
1601
1704
  "hiddenAliases": [],
1602
- "id": "form:diff",
1705
+ "id": "composer:init",
1603
1706
  "pluginAlias": "@loopress/cli",
1604
1707
  "pluginName": "@loopress/cli",
1605
1708
  "pluginType": "core",
1606
1709
  "strict": true,
1607
- "enableJsonFlag": true,
1710
+ "enableJsonFlag": false,
1608
1711
  "dryRunFlag": {
1609
1712
  "dry-run": {
1610
1713
  "char": "d",
@@ -1621,28 +1724,21 @@
1621
1724
  "type": "boolean"
1622
1725
  }
1623
1726
  },
1624
- "againstFlag": {
1625
- "against": {
1626
- "description": "Compare the primary environment against this second environment instead of against local files",
1627
- "input": [],
1628
- "multiple": false,
1629
- "type": "option"
1630
- }
1631
- },
1632
1727
  "isESM": true,
1633
1728
  "relativePath": [
1634
1729
  "dist",
1635
1730
  "commands",
1636
- "form",
1637
- "diff.js"
1731
+ "composer",
1732
+ "init.js"
1638
1733
  ]
1639
1734
  },
1640
- "form:list": {
1735
+ "composer:pull": {
1641
1736
  "aliases": [],
1642
1737
  "args": {},
1643
- "description": "List forms from WordPress",
1738
+ "description": "Pull composer.json and composer.lock from WordPress",
1644
1739
  "examples": [
1645
- "$ lps form list"
1740
+ "$ lps composer pull",
1741
+ "$ lps composer pull --dry-run"
1646
1742
  ],
1647
1743
  "flags": {
1648
1744
  "json": {
@@ -1652,59 +1748,6 @@
1652
1748
  "allowNo": false,
1653
1749
  "type": "boolean"
1654
1750
  },
1655
- "env": {
1656
- "description": "Target environment by name, overriding the globally active one (lps project switch)",
1657
- "name": "env",
1658
- "hasDynamicHelp": false,
1659
- "multiple": false,
1660
- "type": "option"
1661
- }
1662
- },
1663
- "hasDynamicHelp": false,
1664
- "hiddenAliases": [],
1665
- "id": "form:list",
1666
- "pluginAlias": "@loopress/cli",
1667
- "pluginName": "@loopress/cli",
1668
- "pluginType": "core",
1669
- "strict": true,
1670
- "enableJsonFlag": true,
1671
- "dryRunFlag": {
1672
- "dry-run": {
1673
- "char": "d",
1674
- "description": "Show what would change without making changes",
1675
- "allowNo": false,
1676
- "type": "boolean"
1677
- }
1678
- },
1679
- "yesFlag": {
1680
- "yes": {
1681
- "char": "y",
1682
- "description": "Answer yes to confirmation prompts",
1683
- "allowNo": false,
1684
- "type": "boolean"
1685
- }
1686
- },
1687
- "isESM": true,
1688
- "relativePath": [
1689
- "dist",
1690
- "commands",
1691
- "form",
1692
- "list.js"
1693
- ]
1694
- },
1695
- "form:pull": {
1696
- "aliases": [],
1697
- "args": {
1698
- "path": {
1699
- "description": "Path to forms directory (overrides project config)",
1700
- "name": "path"
1701
- }
1702
- },
1703
- "description": "Pull forms from WordPress",
1704
- "examples": [
1705
- "$ lps form pull"
1706
- ],
1707
- "flags": {
1708
1751
  "env": {
1709
1752
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
1710
1753
  "name": "env",
@@ -1718,23 +1761,16 @@
1718
1761
  "name": "dry-run",
1719
1762
  "allowNo": false,
1720
1763
  "type": "boolean"
1721
- },
1722
- "yes": {
1723
- "char": "y",
1724
- "description": "Answer yes to confirmation prompts",
1725
- "name": "yes",
1726
- "allowNo": false,
1727
- "type": "boolean"
1728
1764
  }
1729
1765
  },
1730
1766
  "hasDynamicHelp": false,
1731
1767
  "hiddenAliases": [],
1732
- "id": "form:pull",
1768
+ "id": "composer:pull",
1733
1769
  "pluginAlias": "@loopress/cli",
1734
1770
  "pluginName": "@loopress/cli",
1735
1771
  "pluginType": "core",
1736
1772
  "strict": true,
1737
- "enableJsonFlag": false,
1773
+ "enableJsonFlag": true,
1738
1774
  "dryRunFlag": {
1739
1775
  "dry-run": {
1740
1776
  "char": "d",
@@ -1755,23 +1791,26 @@
1755
1791
  "relativePath": [
1756
1792
  "dist",
1757
1793
  "commands",
1758
- "form",
1794
+ "composer",
1759
1795
  "pull.js"
1760
1796
  ]
1761
1797
  },
1762
- "form:push": {
1798
+ "composer:push": {
1763
1799
  "aliases": [],
1764
- "args": {
1765
- "path": {
1766
- "description": "Path to forms directory (overrides project config)",
1767
- "name": "path"
1768
- }
1769
- },
1770
- "description": "Push forms to WordPress. Local files created or updated remotely are renamed on disk to the `<id>-<slug>.json` convention.",
1800
+ "args": {},
1801
+ "description": "Push composer.json to WordPress and run Composer to resolve and install dependencies",
1771
1802
  "examples": [
1772
- "$ lps form push"
1803
+ "$ lps composer push",
1804
+ "$ lps composer push --dry-run"
1773
1805
  ],
1774
1806
  "flags": {
1807
+ "json": {
1808
+ "description": "Format output as json.",
1809
+ "helpGroup": "GLOBAL",
1810
+ "name": "json",
1811
+ "allowNo": false,
1812
+ "type": "boolean"
1813
+ },
1775
1814
  "env": {
1776
1815
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
1777
1816
  "name": "env",
@@ -1792,20 +1831,27 @@
1792
1831
  "name": "yes",
1793
1832
  "allowNo": false,
1794
1833
  "type": "boolean"
1834
+ },
1835
+ "force": {
1836
+ "description": "Allow downgrades and take over plugins/themes installed outside Loopress",
1837
+ "name": "force",
1838
+ "allowNo": false,
1839
+ "type": "boolean"
1795
1840
  }
1796
1841
  },
1797
1842
  "hasDynamicHelp": false,
1798
1843
  "hiddenAliases": [],
1799
- "id": "form:push",
1844
+ "id": "composer:push",
1800
1845
  "pluginAlias": "@loopress/cli",
1801
1846
  "pluginName": "@loopress/cli",
1802
1847
  "pluginType": "core",
1803
1848
  "strict": true,
1849
+ "enableJsonFlag": true,
1804
1850
  "isESM": true,
1805
1851
  "relativePath": [
1806
1852
  "dist",
1807
1853
  "commands",
1808
- "form",
1854
+ "composer",
1809
1855
  "push.js"
1810
1856
  ]
1811
1857
  },
@@ -2027,7 +2073,8 @@
2027
2073
  "description": "Push hook files (actions, filters, cron) to WordPress",
2028
2074
  "examples": [
2029
2075
  "$ lps hook push",
2030
- "$ lps hook push --path ./hooks"
2076
+ "$ lps hook push --path ./hooks",
2077
+ "$ lps hook push --prune"
2031
2078
  ],
2032
2079
  "flags": {
2033
2080
  "json": {
@@ -2057,6 +2104,12 @@
2057
2104
  "name": "yes",
2058
2105
  "allowNo": false,
2059
2106
  "type": "boolean"
2107
+ },
2108
+ "prune": {
2109
+ "description": "Delete server-side hook files not present locally after pushing",
2110
+ "name": "prune",
2111
+ "allowNo": false,
2112
+ "type": "boolean"
2060
2113
  }
2061
2114
  },
2062
2115
  "hasDynamicHelp": false,
@@ -2075,19 +2128,19 @@
2075
2128
  "push.js"
2076
2129
  ]
2077
2130
  },
2078
- "option:add": {
2131
+ "hook:rm": {
2079
2132
  "aliases": [],
2080
2133
  "args": {
2081
- "name": {
2082
- "description": "Option name to start tracking (see `lps option list`)",
2083
- "name": "name",
2134
+ "filename": {
2135
+ "description": "The hook file to remove, its slug without the .php extension (e.g. \"hello\" or \"invoice-pdf/[order_id]\")",
2136
+ "name": "filename",
2084
2137
  "required": true
2085
2138
  }
2086
2139
  },
2087
- "description": "Fetch a WordPress option by name and start tracking it locally. Run `lps option list` first to find the name: this copies a raw value across environments, verify it does not embed post/user IDs before pushing it elsewhere.",
2140
+ "description": "Remove a hook file (action, filter, cron) from WordPress",
2088
2141
  "examples": [
2089
- "$ lps option add wpseo_titles",
2090
- "$ lps option add siteurl"
2142
+ "$ lps hook rm hello",
2143
+ "$ lps hook rm hello --yes"
2091
2144
  ],
2092
2145
  "flags": {
2093
2146
  "json": {
@@ -2111,9 +2164,99 @@
2111
2164
  "allowNo": false,
2112
2165
  "type": "boolean"
2113
2166
  },
2167
+ "yes": {
2168
+ "char": "y",
2169
+ "description": "Answer yes to confirmation prompts",
2170
+ "name": "yes",
2171
+ "allowNo": false,
2172
+ "type": "boolean"
2173
+ }
2174
+ },
2175
+ "hasDynamicHelp": false,
2176
+ "hiddenAliases": [],
2177
+ "id": "hook:rm",
2178
+ "pluginAlias": "@loopress/cli",
2179
+ "pluginName": "@loopress/cli",
2180
+ "pluginType": "core",
2181
+ "strict": true,
2182
+ "enableJsonFlag": true,
2183
+ "dryRunFlag": {
2184
+ "dry-run": {
2185
+ "char": "d",
2186
+ "description": "Show what would change without making changes",
2187
+ "allowNo": false,
2188
+ "type": "boolean"
2189
+ }
2190
+ },
2191
+ "yesFlag": {
2192
+ "yes": {
2193
+ "char": "y",
2194
+ "description": "Answer yes to confirmation prompts",
2195
+ "allowNo": false,
2196
+ "type": "boolean"
2197
+ }
2198
+ },
2199
+ "isESM": true,
2200
+ "relativePath": [
2201
+ "dist",
2202
+ "commands",
2203
+ "hook",
2204
+ "rm.js"
2205
+ ]
2206
+ },
2207
+ "hook:rollback": {
2208
+ "aliases": [],
2209
+ "args": {
2114
2210
  "path": {
2115
- "description": "Path to options directory (overrides project config)",
2116
- "name": "path",
2211
+ "description": "Path to hooks directory (overrides project config)",
2212
+ "name": "path"
2213
+ }
2214
+ },
2215
+ "description": "Restore hook files to a snapshot taken automatically before an earlier `lps hook push`",
2216
+ "examples": [
2217
+ "$ lps hook rollback",
2218
+ "$ lps hook rollback --list",
2219
+ "$ lps hook rollback --to 1732000000000",
2220
+ "$ lps hook rollback --dry-run"
2221
+ ],
2222
+ "flags": {
2223
+ "json": {
2224
+ "description": "Format output as json.",
2225
+ "helpGroup": "GLOBAL",
2226
+ "name": "json",
2227
+ "allowNo": false,
2228
+ "type": "boolean"
2229
+ },
2230
+ "env": {
2231
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
2232
+ "name": "env",
2233
+ "hasDynamicHelp": false,
2234
+ "multiple": false,
2235
+ "type": "option"
2236
+ },
2237
+ "dry-run": {
2238
+ "char": "d",
2239
+ "description": "Show what would change without making changes",
2240
+ "name": "dry-run",
2241
+ "allowNo": false,
2242
+ "type": "boolean"
2243
+ },
2244
+ "yes": {
2245
+ "char": "y",
2246
+ "description": "Answer yes to confirmation prompts",
2247
+ "name": "yes",
2248
+ "allowNo": false,
2249
+ "type": "boolean"
2250
+ },
2251
+ "list": {
2252
+ "description": "List available snapshots instead of rolling back",
2253
+ "name": "list",
2254
+ "allowNo": false,
2255
+ "type": "boolean"
2256
+ },
2257
+ "to": {
2258
+ "description": "Roll back to this snapshot id instead of the most recent one",
2259
+ "name": "to",
2117
2260
  "hasDynamicHelp": false,
2118
2261
  "multiple": false,
2119
2262
  "type": "option"
@@ -2121,7 +2264,7 @@
2121
2264
  },
2122
2265
  "hasDynamicHelp": false,
2123
2266
  "hiddenAliases": [],
2124
- "id": "option:add",
2267
+ "id": "hook:rollback",
2125
2268
  "pluginAlias": "@loopress/cli",
2126
2269
  "pluginName": "@loopress/cli",
2127
2270
  "pluginType": "core",
@@ -2147,23 +2290,23 @@
2147
2290
  "relativePath": [
2148
2291
  "dist",
2149
2292
  "commands",
2150
- "option",
2151
- "add.js"
2293
+ "hook",
2294
+ "rollback.js"
2152
2295
  ]
2153
2296
  },
2154
- "option:diff": {
2297
+ "form:diff": {
2155
2298
  "aliases": [],
2156
2299
  "args": {
2157
2300
  "path": {
2158
- "description": "Path to options directory (overrides project config)",
2301
+ "description": "Path to forms directory (overrides project config)",
2159
2302
  "name": "path"
2160
2303
  }
2161
2304
  },
2162
- "description": "Show what differs, for locally tracked options, between your local files and a WordPress environment, or between two environments",
2305
+ "description": "Show what differs in forms between your local files and a WordPress environment, or between two environments",
2163
2306
  "examples": [
2164
- "$ lps option diff",
2165
- "$ lps option diff --env staging",
2166
- "$ lps option diff --env staging --against production"
2307
+ "$ lps form diff",
2308
+ "$ lps form diff --env staging",
2309
+ "$ lps form diff --env staging --against production"
2167
2310
  ],
2168
2311
  "flags": {
2169
2312
  "json": {
@@ -2190,7 +2333,7 @@
2190
2333
  },
2191
2334
  "hasDynamicHelp": false,
2192
2335
  "hiddenAliases": [],
2193
- "id": "option:diff",
2336
+ "id": "form:diff",
2194
2337
  "pluginAlias": "@loopress/cli",
2195
2338
  "pluginName": "@loopress/cli",
2196
2339
  "pluginType": "core",
@@ -2224,17 +2367,16 @@
2224
2367
  "relativePath": [
2225
2368
  "dist",
2226
2369
  "commands",
2227
- "option",
2370
+ "form",
2228
2371
  "diff.js"
2229
2372
  ]
2230
2373
  },
2231
- "option:list": {
2374
+ "form:list": {
2232
2375
  "aliases": [],
2233
2376
  "args": {},
2234
- "description": "List WordPress option names currently on the site (names and autoload only, never values). CORE flags a WordPress-native default (certain); SOURCE? is a best-effort guessed plugin slug, found by name or by scanning active plugins' own PHP source (uncertain unless confirmed, occasionally wrong or blank, never trust it over CORE); PLUGIN is that slug's own declared display name, a label only, no confidence of its own. Use this to find the name of the option you want, then `lps option add <name>` to track it.",
2377
+ "description": "List forms from WordPress",
2235
2378
  "examples": [
2236
- "$ lps option list",
2237
- "$ lps option list --no-core"
2379
+ "$ lps form list"
2238
2380
  ],
2239
2381
  "flags": {
2240
2382
  "json": {
@@ -2250,17 +2392,11 @@
2250
2392
  "hasDynamicHelp": false,
2251
2393
  "multiple": false,
2252
2394
  "type": "option"
2253
- },
2254
- "no-core": {
2255
- "description": "Exclude WordPress-native default options and the CORE column from the output, including --json",
2256
- "name": "no-core",
2257
- "allowNo": false,
2258
- "type": "boolean"
2259
2395
  }
2260
2396
  },
2261
2397
  "hasDynamicHelp": false,
2262
2398
  "hiddenAliases": [],
2263
- "id": "option:list",
2399
+ "id": "form:list",
2264
2400
  "pluginAlias": "@loopress/cli",
2265
2401
  "pluginName": "@loopress/cli",
2266
2402
  "pluginType": "core",
@@ -2286,30 +2422,23 @@
2286
2422
  "relativePath": [
2287
2423
  "dist",
2288
2424
  "commands",
2289
- "option",
2425
+ "form",
2290
2426
  "list.js"
2291
2427
  ]
2292
2428
  },
2293
- "option:pull": {
2429
+ "form:pull": {
2294
2430
  "aliases": [],
2295
2431
  "args": {
2296
2432
  "path": {
2297
- "description": "Path to options directory (overrides project config)",
2433
+ "description": "Path to forms directory (overrides project config)",
2298
2434
  "name": "path"
2299
2435
  }
2300
2436
  },
2301
- "description": "Refresh locally tracked options from WordPress. Options not yet tracked are never pulled, run `lps option add <name>` for those first.",
2437
+ "description": "Pull forms from WordPress",
2302
2438
  "examples": [
2303
- "$ lps option pull"
2439
+ "$ lps form pull"
2304
2440
  ],
2305
2441
  "flags": {
2306
- "json": {
2307
- "description": "Format output as json.",
2308
- "helpGroup": "GLOBAL",
2309
- "name": "json",
2310
- "allowNo": false,
2311
- "type": "boolean"
2312
- },
2313
2442
  "env": {
2314
2443
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
2315
2444
  "name": "env",
@@ -2334,12 +2463,12 @@
2334
2463
  },
2335
2464
  "hasDynamicHelp": false,
2336
2465
  "hiddenAliases": [],
2337
- "id": "option:pull",
2466
+ "id": "form:pull",
2338
2467
  "pluginAlias": "@loopress/cli",
2339
2468
  "pluginName": "@loopress/cli",
2340
2469
  "pluginType": "core",
2341
2470
  "strict": true,
2342
- "enableJsonFlag": true,
2471
+ "enableJsonFlag": false,
2343
2472
  "dryRunFlag": {
2344
2473
  "dry-run": {
2345
2474
  "char": "d",
@@ -2360,30 +2489,24 @@
2360
2489
  "relativePath": [
2361
2490
  "dist",
2362
2491
  "commands",
2363
- "option",
2492
+ "form",
2364
2493
  "pull.js"
2365
2494
  ]
2366
2495
  },
2367
- "option:push": {
2496
+ "form:push": {
2368
2497
  "aliases": [],
2369
2498
  "args": {
2370
2499
  "path": {
2371
- "description": "Path to options directory (overrides project config)",
2500
+ "description": "Path to forms directory (overrides project config)",
2372
2501
  "name": "path"
2373
2502
  }
2374
2503
  },
2375
- "description": "Push locally tracked, non-readonly options to WordPress (upsert only, never deletes an untracked option). Options marked \"readonly\": true in their local file are skipped, edit the file to override.",
2504
+ "description": "Push forms to WordPress. Local files created or updated remotely are renamed on disk to the `<id>-<slug>.json` convention.",
2376
2505
  "examples": [
2377
- "$ lps option push"
2506
+ "$ lps form push",
2507
+ "$ lps form push --allow-notifications"
2378
2508
  ],
2379
2509
  "flags": {
2380
- "json": {
2381
- "description": "Format output as json.",
2382
- "helpGroup": "GLOBAL",
2383
- "name": "json",
2384
- "allowNo": false,
2385
- "type": "boolean"
2386
- },
2387
2510
  "env": {
2388
2511
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
2389
2512
  "name": "env",
@@ -2404,37 +2527,43 @@
2404
2527
  "name": "yes",
2405
2528
  "allowNo": false,
2406
2529
  "type": "boolean"
2530
+ },
2531
+ "allow-notifications": {
2532
+ "description": "Also push each form's notification and confirmation settings (recipients, sender, messages). Off by default: the server keeps its own so a stray push can't redirect submissions.",
2533
+ "name": "allow-notifications",
2534
+ "allowNo": false,
2535
+ "type": "boolean"
2407
2536
  }
2408
2537
  },
2409
2538
  "hasDynamicHelp": false,
2410
2539
  "hiddenAliases": [],
2411
- "id": "option:push",
2540
+ "id": "form:push",
2412
2541
  "pluginAlias": "@loopress/cli",
2413
2542
  "pluginName": "@loopress/cli",
2414
2543
  "pluginType": "core",
2415
2544
  "strict": true,
2416
- "enableJsonFlag": true,
2417
2545
  "isESM": true,
2418
2546
  "relativePath": [
2419
2547
  "dist",
2420
2548
  "commands",
2421
- "option",
2549
+ "form",
2422
2550
  "push.js"
2423
2551
  ]
2424
2552
  },
2425
- "option:remove": {
2553
+ "form:rollback": {
2426
2554
  "aliases": [],
2427
2555
  "args": {
2428
- "name": {
2429
- "description": "Option name to stop tracking",
2430
- "name": "name",
2431
- "required": true
2556
+ "path": {
2557
+ "description": "Path to forms directory (overrides project config)",
2558
+ "name": "path"
2432
2559
  }
2433
2560
  },
2434
- "description": "Stop tracking an option locally and delete it from WordPress. Local untracking always happens (git-reversible); pass --local-only to skip the WordPress delete and only stop tracking.",
2561
+ "description": "Restore forms to a snapshot taken automatically before an earlier `lps form push`",
2435
2562
  "examples": [
2436
- "$ lps option remove wpseo_titles",
2437
- "$ lps option remove wpseo_titles --local-only"
2563
+ "$ lps form rollback",
2564
+ "$ lps form rollback --list",
2565
+ "$ lps form rollback --to 1732000000000",
2566
+ "$ lps form rollback --dry-run"
2438
2567
  ],
2439
2568
  "flags": {
2440
2569
  "json": {
@@ -2465,15 +2594,15 @@
2465
2594
  "allowNo": false,
2466
2595
  "type": "boolean"
2467
2596
  },
2468
- "local-only": {
2469
- "description": "Untrack locally without deleting the option on WordPress",
2470
- "name": "local-only",
2597
+ "list": {
2598
+ "description": "List available snapshots instead of rolling back",
2599
+ "name": "list",
2471
2600
  "allowNo": false,
2472
2601
  "type": "boolean"
2473
2602
  },
2474
- "path": {
2475
- "description": "Path to options directory (overrides project config)",
2476
- "name": "path",
2603
+ "to": {
2604
+ "description": "Roll back to this snapshot id instead of the most recent one",
2605
+ "name": "to",
2477
2606
  "hasDynamicHelp": false,
2478
2607
  "multiple": false,
2479
2608
  "type": "option"
@@ -2481,7 +2610,7 @@
2481
2610
  },
2482
2611
  "hasDynamicHelp": false,
2483
2612
  "hiddenAliases": [],
2484
- "id": "option:remove",
2613
+ "id": "form:rollback",
2485
2614
  "pluginAlias": "@loopress/cli",
2486
2615
  "pluginName": "@loopress/cli",
2487
2616
  "pluginType": "core",
@@ -2507,26 +2636,32 @@
2507
2636
  "relativePath": [
2508
2637
  "dist",
2509
2638
  "commands",
2510
- "option",
2511
- "remove.js"
2639
+ "form",
2640
+ "rollback.js"
2512
2641
  ]
2513
2642
  },
2514
- "plugin:add": {
2643
+ "menu:diff": {
2515
2644
  "aliases": [],
2516
2645
  "args": {
2517
- "slug": {
2518
- "description": "Plugin slug on WordPress.org",
2519
- "name": "slug",
2520
- "required": true
2646
+ "path": {
2647
+ "description": "Path to menus directory (overrides project config)",
2648
+ "name": "path"
2521
2649
  }
2522
2650
  },
2523
- "description": "Add a WordPress.org plugin to loopress.json",
2651
+ "description": "Show what differs in nav menus and the active theme menu locations between your local files and a WordPress environment, or between two environments",
2524
2652
  "examples": [
2525
- "$ lps plugin add woocommerce",
2526
- "$ lps plugin add woocommerce --version 9.4.2",
2527
- "$ lps plugin add contact-form-7 --dry-run"
2653
+ "$ lps menu diff",
2654
+ "$ lps menu diff --env staging",
2655
+ "$ lps menu diff --env staging --against production"
2528
2656
  ],
2529
2657
  "flags": {
2658
+ "json": {
2659
+ "description": "Format output as json.",
2660
+ "helpGroup": "GLOBAL",
2661
+ "name": "json",
2662
+ "allowNo": false,
2663
+ "type": "boolean"
2664
+ },
2530
2665
  "env": {
2531
2666
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
2532
2667
  "name": "env",
@@ -2534,16 +2669,9 @@
2534
2669
  "multiple": false,
2535
2670
  "type": "option"
2536
2671
  },
2537
- "dry-run": {
2538
- "char": "d",
2539
- "description": "Show what would change without making changes",
2540
- "name": "dry-run",
2541
- "allowNo": false,
2542
- "type": "boolean"
2543
- },
2544
- "version": {
2545
- "description": "Exact version to pin (default: \"latest\", tracked on every push)",
2546
- "name": "version",
2672
+ "against": {
2673
+ "description": "Compare the primary environment against this second environment instead of against local files",
2674
+ "name": "against",
2547
2675
  "hasDynamicHelp": false,
2548
2676
  "multiple": false,
2549
2677
  "type": "option"
@@ -2551,12 +2679,12 @@
2551
2679
  },
2552
2680
  "hasDynamicHelp": false,
2553
2681
  "hiddenAliases": [],
2554
- "id": "plugin:add",
2682
+ "id": "menu:diff",
2555
2683
  "pluginAlias": "@loopress/cli",
2556
2684
  "pluginName": "@loopress/cli",
2557
2685
  "pluginType": "core",
2558
2686
  "strict": true,
2559
- "enableJsonFlag": false,
2687
+ "enableJsonFlag": true,
2560
2688
  "dryRunFlag": {
2561
2689
  "dry-run": {
2562
2690
  "char": "d",
@@ -2573,20 +2701,28 @@
2573
2701
  "type": "boolean"
2574
2702
  }
2575
2703
  },
2704
+ "againstFlag": {
2705
+ "against": {
2706
+ "description": "Compare the primary environment against this second environment instead of against local files",
2707
+ "input": [],
2708
+ "multiple": false,
2709
+ "type": "option"
2710
+ }
2711
+ },
2576
2712
  "isESM": true,
2577
2713
  "relativePath": [
2578
2714
  "dist",
2579
2715
  "commands",
2580
- "plugin",
2581
- "add.js"
2716
+ "menu",
2717
+ "diff.js"
2582
2718
  ]
2583
2719
  },
2584
- "plugin:audit": {
2720
+ "menu:list": {
2585
2721
  "aliases": [],
2586
2722
  "args": {},
2587
- "description": "Check the plugins in loopress.json for known vulnerabilities and health issues",
2723
+ "description": "List nav menus and the active theme menu locations on WordPress",
2588
2724
  "examples": [
2589
- "$ lps plugin audit"
2725
+ "$ lps menu list"
2590
2726
  ],
2591
2727
  "flags": {
2592
2728
  "json": {
@@ -2606,7 +2742,7 @@
2606
2742
  },
2607
2743
  "hasDynamicHelp": false,
2608
2744
  "hiddenAliases": [],
2609
- "id": "plugin:audit",
2745
+ "id": "menu:list",
2610
2746
  "pluginAlias": "@loopress/cli",
2611
2747
  "pluginName": "@loopress/cli",
2612
2748
  "pluginType": "core",
@@ -2632,26 +2768,884 @@
2632
2768
  "relativePath": [
2633
2769
  "dist",
2634
2770
  "commands",
2635
- "plugin",
2636
- "audit.js"
2771
+ "menu",
2772
+ "list.js"
2637
2773
  ]
2638
2774
  },
2639
- "plugin:pull": {
2775
+ "menu:pull": {
2640
2776
  "aliases": [],
2641
- "args": {},
2642
- "description": "Pull installed plugins from WordPress into loopress.json, pinned to their live versions",
2777
+ "args": {
2778
+ "path": {
2779
+ "description": "Path to menus directory (overrides project config)",
2780
+ "name": "path"
2781
+ }
2782
+ },
2783
+ "description": "Pull nav menus and the active theme menu locations from WordPress",
2643
2784
  "examples": [
2644
- "$ lps plugin pull",
2645
- "$ lps plugin pull --dry-run"
2785
+ "$ lps menu pull"
2646
2786
  ],
2647
2787
  "flags": {
2648
- "json": {
2649
- "description": "Format output as json.",
2650
- "helpGroup": "GLOBAL",
2651
- "name": "json",
2652
- "allowNo": false,
2653
- "type": "boolean"
2654
- },
2788
+ "env": {
2789
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
2790
+ "name": "env",
2791
+ "hasDynamicHelp": false,
2792
+ "multiple": false,
2793
+ "type": "option"
2794
+ },
2795
+ "dry-run": {
2796
+ "char": "d",
2797
+ "description": "Show what would change without making changes",
2798
+ "name": "dry-run",
2799
+ "allowNo": false,
2800
+ "type": "boolean"
2801
+ },
2802
+ "yes": {
2803
+ "char": "y",
2804
+ "description": "Answer yes to confirmation prompts",
2805
+ "name": "yes",
2806
+ "allowNo": false,
2807
+ "type": "boolean"
2808
+ }
2809
+ },
2810
+ "hasDynamicHelp": false,
2811
+ "hiddenAliases": [],
2812
+ "id": "menu:pull",
2813
+ "pluginAlias": "@loopress/cli",
2814
+ "pluginName": "@loopress/cli",
2815
+ "pluginType": "core",
2816
+ "strict": true,
2817
+ "enableJsonFlag": false,
2818
+ "dryRunFlag": {
2819
+ "dry-run": {
2820
+ "char": "d",
2821
+ "description": "Show what would change without making changes",
2822
+ "allowNo": false,
2823
+ "type": "boolean"
2824
+ }
2825
+ },
2826
+ "yesFlag": {
2827
+ "yes": {
2828
+ "char": "y",
2829
+ "description": "Answer yes to confirmation prompts",
2830
+ "allowNo": false,
2831
+ "type": "boolean"
2832
+ }
2833
+ },
2834
+ "isESM": true,
2835
+ "relativePath": [
2836
+ "dist",
2837
+ "commands",
2838
+ "menu",
2839
+ "pull.js"
2840
+ ]
2841
+ },
2842
+ "menu:push": {
2843
+ "aliases": [],
2844
+ "args": {
2845
+ "path": {
2846
+ "description": "Path to menus directory (overrides project config)",
2847
+ "name": "path"
2848
+ }
2849
+ },
2850
+ "description": "Push local nav menus and the active theme menu locations to WordPress. Each menu's post_type/taxonomy items are resolved by slug on the target environment, never by a raw id; an item whose target does not exist there fails the whole menu rather than guessing.",
2851
+ "examples": [
2852
+ "$ lps menu push"
2853
+ ],
2854
+ "flags": {
2855
+ "env": {
2856
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
2857
+ "name": "env",
2858
+ "hasDynamicHelp": false,
2859
+ "multiple": false,
2860
+ "type": "option"
2861
+ },
2862
+ "dry-run": {
2863
+ "char": "d",
2864
+ "description": "Show what would change without making changes",
2865
+ "name": "dry-run",
2866
+ "allowNo": false,
2867
+ "type": "boolean"
2868
+ },
2869
+ "yes": {
2870
+ "char": "y",
2871
+ "description": "Answer yes to confirmation prompts",
2872
+ "name": "yes",
2873
+ "allowNo": false,
2874
+ "type": "boolean"
2875
+ }
2876
+ },
2877
+ "hasDynamicHelp": false,
2878
+ "hiddenAliases": [],
2879
+ "id": "menu:push",
2880
+ "pluginAlias": "@loopress/cli",
2881
+ "pluginName": "@loopress/cli",
2882
+ "pluginType": "core",
2883
+ "strict": true,
2884
+ "isESM": true,
2885
+ "relativePath": [
2886
+ "dist",
2887
+ "commands",
2888
+ "menu",
2889
+ "push.js"
2890
+ ]
2891
+ },
2892
+ "menu:rollback": {
2893
+ "aliases": [],
2894
+ "args": {
2895
+ "path": {
2896
+ "description": "Path to menus directory (overrides project config)",
2897
+ "name": "path"
2898
+ }
2899
+ },
2900
+ "description": "Restore nav menus and menu locations to a snapshot taken automatically before an earlier `lps menu push`",
2901
+ "examples": [
2902
+ "$ lps menu rollback",
2903
+ "$ lps menu rollback --list",
2904
+ "$ lps menu rollback --to 1732000000000",
2905
+ "$ lps menu rollback --dry-run"
2906
+ ],
2907
+ "flags": {
2908
+ "json": {
2909
+ "description": "Format output as json.",
2910
+ "helpGroup": "GLOBAL",
2911
+ "name": "json",
2912
+ "allowNo": false,
2913
+ "type": "boolean"
2914
+ },
2915
+ "env": {
2916
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
2917
+ "name": "env",
2918
+ "hasDynamicHelp": false,
2919
+ "multiple": false,
2920
+ "type": "option"
2921
+ },
2922
+ "dry-run": {
2923
+ "char": "d",
2924
+ "description": "Show what would change without making changes",
2925
+ "name": "dry-run",
2926
+ "allowNo": false,
2927
+ "type": "boolean"
2928
+ },
2929
+ "yes": {
2930
+ "char": "y",
2931
+ "description": "Answer yes to confirmation prompts",
2932
+ "name": "yes",
2933
+ "allowNo": false,
2934
+ "type": "boolean"
2935
+ },
2936
+ "list": {
2937
+ "description": "List available snapshots instead of rolling back",
2938
+ "name": "list",
2939
+ "allowNo": false,
2940
+ "type": "boolean"
2941
+ },
2942
+ "to": {
2943
+ "description": "Roll back to this snapshot id instead of the most recent one",
2944
+ "name": "to",
2945
+ "hasDynamicHelp": false,
2946
+ "multiple": false,
2947
+ "type": "option"
2948
+ }
2949
+ },
2950
+ "hasDynamicHelp": false,
2951
+ "hiddenAliases": [],
2952
+ "id": "menu:rollback",
2953
+ "pluginAlias": "@loopress/cli",
2954
+ "pluginName": "@loopress/cli",
2955
+ "pluginType": "core",
2956
+ "strict": true,
2957
+ "enableJsonFlag": true,
2958
+ "dryRunFlag": {
2959
+ "dry-run": {
2960
+ "char": "d",
2961
+ "description": "Show what would change without making changes",
2962
+ "allowNo": false,
2963
+ "type": "boolean"
2964
+ }
2965
+ },
2966
+ "yesFlag": {
2967
+ "yes": {
2968
+ "char": "y",
2969
+ "description": "Answer yes to confirmation prompts",
2970
+ "allowNo": false,
2971
+ "type": "boolean"
2972
+ }
2973
+ },
2974
+ "isESM": true,
2975
+ "relativePath": [
2976
+ "dist",
2977
+ "commands",
2978
+ "menu",
2979
+ "rollback.js"
2980
+ ]
2981
+ },
2982
+ "option:add": {
2983
+ "aliases": [],
2984
+ "args": {
2985
+ "name": {
2986
+ "description": "Option name to start tracking (see `lps option list`)",
2987
+ "name": "name",
2988
+ "required": true
2989
+ }
2990
+ },
2991
+ "description": "Fetch a WordPress option by name and start tracking it locally. Run `lps option list` first to find the name: this copies a raw value across environments, verify it does not embed post/user IDs before pushing it elsewhere.",
2992
+ "examples": [
2993
+ "$ lps option add wpseo_titles",
2994
+ "$ lps option add siteurl"
2995
+ ],
2996
+ "flags": {
2997
+ "json": {
2998
+ "description": "Format output as json.",
2999
+ "helpGroup": "GLOBAL",
3000
+ "name": "json",
3001
+ "allowNo": false,
3002
+ "type": "boolean"
3003
+ },
3004
+ "env": {
3005
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3006
+ "name": "env",
3007
+ "hasDynamicHelp": false,
3008
+ "multiple": false,
3009
+ "type": "option"
3010
+ },
3011
+ "dry-run": {
3012
+ "char": "d",
3013
+ "description": "Show what would change without making changes",
3014
+ "name": "dry-run",
3015
+ "allowNo": false,
3016
+ "type": "boolean"
3017
+ },
3018
+ "path": {
3019
+ "description": "Path to options directory (overrides project config)",
3020
+ "name": "path",
3021
+ "hasDynamicHelp": false,
3022
+ "multiple": false,
3023
+ "type": "option"
3024
+ }
3025
+ },
3026
+ "hasDynamicHelp": false,
3027
+ "hiddenAliases": [],
3028
+ "id": "option:add",
3029
+ "pluginAlias": "@loopress/cli",
3030
+ "pluginName": "@loopress/cli",
3031
+ "pluginType": "core",
3032
+ "strict": true,
3033
+ "enableJsonFlag": true,
3034
+ "dryRunFlag": {
3035
+ "dry-run": {
3036
+ "char": "d",
3037
+ "description": "Show what would change without making changes",
3038
+ "allowNo": false,
3039
+ "type": "boolean"
3040
+ }
3041
+ },
3042
+ "yesFlag": {
3043
+ "yes": {
3044
+ "char": "y",
3045
+ "description": "Answer yes to confirmation prompts",
3046
+ "allowNo": false,
3047
+ "type": "boolean"
3048
+ }
3049
+ },
3050
+ "isESM": true,
3051
+ "relativePath": [
3052
+ "dist",
3053
+ "commands",
3054
+ "option",
3055
+ "add.js"
3056
+ ]
3057
+ },
3058
+ "option:diff": {
3059
+ "aliases": [],
3060
+ "args": {
3061
+ "path": {
3062
+ "description": "Path to options directory (overrides project config)",
3063
+ "name": "path"
3064
+ }
3065
+ },
3066
+ "description": "Show what differs, for locally tracked options, between your local files and a WordPress environment, or between two environments",
3067
+ "examples": [
3068
+ "$ lps option diff",
3069
+ "$ lps option diff --env staging",
3070
+ "$ lps option diff --env staging --against production"
3071
+ ],
3072
+ "flags": {
3073
+ "json": {
3074
+ "description": "Format output as json.",
3075
+ "helpGroup": "GLOBAL",
3076
+ "name": "json",
3077
+ "allowNo": false,
3078
+ "type": "boolean"
3079
+ },
3080
+ "env": {
3081
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3082
+ "name": "env",
3083
+ "hasDynamicHelp": false,
3084
+ "multiple": false,
3085
+ "type": "option"
3086
+ },
3087
+ "against": {
3088
+ "description": "Compare the primary environment against this second environment instead of against local files",
3089
+ "name": "against",
3090
+ "hasDynamicHelp": false,
3091
+ "multiple": false,
3092
+ "type": "option"
3093
+ }
3094
+ },
3095
+ "hasDynamicHelp": false,
3096
+ "hiddenAliases": [],
3097
+ "id": "option:diff",
3098
+ "pluginAlias": "@loopress/cli",
3099
+ "pluginName": "@loopress/cli",
3100
+ "pluginType": "core",
3101
+ "strict": true,
3102
+ "enableJsonFlag": true,
3103
+ "dryRunFlag": {
3104
+ "dry-run": {
3105
+ "char": "d",
3106
+ "description": "Show what would change without making changes",
3107
+ "allowNo": false,
3108
+ "type": "boolean"
3109
+ }
3110
+ },
3111
+ "yesFlag": {
3112
+ "yes": {
3113
+ "char": "y",
3114
+ "description": "Answer yes to confirmation prompts",
3115
+ "allowNo": false,
3116
+ "type": "boolean"
3117
+ }
3118
+ },
3119
+ "againstFlag": {
3120
+ "against": {
3121
+ "description": "Compare the primary environment against this second environment instead of against local files",
3122
+ "input": [],
3123
+ "multiple": false,
3124
+ "type": "option"
3125
+ }
3126
+ },
3127
+ "isESM": true,
3128
+ "relativePath": [
3129
+ "dist",
3130
+ "commands",
3131
+ "option",
3132
+ "diff.js"
3133
+ ]
3134
+ },
3135
+ "option:list": {
3136
+ "aliases": [],
3137
+ "args": {},
3138
+ "description": "List WordPress option names currently on the site (names and autoload only, never values). CORE flags a WordPress-native default (certain); SOURCE? is a best-effort guessed plugin slug, found by name or by scanning active plugins' own PHP source (uncertain unless confirmed, occasionally wrong or blank, never trust it over CORE); PLUGIN is that slug's own declared display name, a label only, no confidence of its own. Use this to find the name of the option you want, then `lps option add <name>` to track it.",
3139
+ "examples": [
3140
+ "$ lps option list",
3141
+ "$ lps option list --no-core"
3142
+ ],
3143
+ "flags": {
3144
+ "json": {
3145
+ "description": "Format output as json.",
3146
+ "helpGroup": "GLOBAL",
3147
+ "name": "json",
3148
+ "allowNo": false,
3149
+ "type": "boolean"
3150
+ },
3151
+ "env": {
3152
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3153
+ "name": "env",
3154
+ "hasDynamicHelp": false,
3155
+ "multiple": false,
3156
+ "type": "option"
3157
+ },
3158
+ "no-core": {
3159
+ "description": "Exclude WordPress-native default options and the CORE column from the output, including --json",
3160
+ "name": "no-core",
3161
+ "allowNo": false,
3162
+ "type": "boolean"
3163
+ }
3164
+ },
3165
+ "hasDynamicHelp": false,
3166
+ "hiddenAliases": [],
3167
+ "id": "option:list",
3168
+ "pluginAlias": "@loopress/cli",
3169
+ "pluginName": "@loopress/cli",
3170
+ "pluginType": "core",
3171
+ "strict": true,
3172
+ "enableJsonFlag": true,
3173
+ "dryRunFlag": {
3174
+ "dry-run": {
3175
+ "char": "d",
3176
+ "description": "Show what would change without making changes",
3177
+ "allowNo": false,
3178
+ "type": "boolean"
3179
+ }
3180
+ },
3181
+ "yesFlag": {
3182
+ "yes": {
3183
+ "char": "y",
3184
+ "description": "Answer yes to confirmation prompts",
3185
+ "allowNo": false,
3186
+ "type": "boolean"
3187
+ }
3188
+ },
3189
+ "isESM": true,
3190
+ "relativePath": [
3191
+ "dist",
3192
+ "commands",
3193
+ "option",
3194
+ "list.js"
3195
+ ]
3196
+ },
3197
+ "option:pull": {
3198
+ "aliases": [],
3199
+ "args": {
3200
+ "path": {
3201
+ "description": "Path to options directory (overrides project config)",
3202
+ "name": "path"
3203
+ }
3204
+ },
3205
+ "description": "Refresh locally tracked options from WordPress. Options not yet tracked are never pulled, run `lps option add <name>` for those first.",
3206
+ "examples": [
3207
+ "$ lps option pull"
3208
+ ],
3209
+ "flags": {
3210
+ "json": {
3211
+ "description": "Format output as json.",
3212
+ "helpGroup": "GLOBAL",
3213
+ "name": "json",
3214
+ "allowNo": false,
3215
+ "type": "boolean"
3216
+ },
3217
+ "env": {
3218
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3219
+ "name": "env",
3220
+ "hasDynamicHelp": false,
3221
+ "multiple": false,
3222
+ "type": "option"
3223
+ },
3224
+ "dry-run": {
3225
+ "char": "d",
3226
+ "description": "Show what would change without making changes",
3227
+ "name": "dry-run",
3228
+ "allowNo": false,
3229
+ "type": "boolean"
3230
+ },
3231
+ "yes": {
3232
+ "char": "y",
3233
+ "description": "Answer yes to confirmation prompts",
3234
+ "name": "yes",
3235
+ "allowNo": false,
3236
+ "type": "boolean"
3237
+ }
3238
+ },
3239
+ "hasDynamicHelp": false,
3240
+ "hiddenAliases": [],
3241
+ "id": "option:pull",
3242
+ "pluginAlias": "@loopress/cli",
3243
+ "pluginName": "@loopress/cli",
3244
+ "pluginType": "core",
3245
+ "strict": true,
3246
+ "enableJsonFlag": true,
3247
+ "dryRunFlag": {
3248
+ "dry-run": {
3249
+ "char": "d",
3250
+ "description": "Show what would change without making changes",
3251
+ "allowNo": false,
3252
+ "type": "boolean"
3253
+ }
3254
+ },
3255
+ "yesFlag": {
3256
+ "yes": {
3257
+ "char": "y",
3258
+ "description": "Answer yes to confirmation prompts",
3259
+ "allowNo": false,
3260
+ "type": "boolean"
3261
+ }
3262
+ },
3263
+ "isESM": true,
3264
+ "relativePath": [
3265
+ "dist",
3266
+ "commands",
3267
+ "option",
3268
+ "pull.js"
3269
+ ]
3270
+ },
3271
+ "option:push": {
3272
+ "aliases": [],
3273
+ "args": {
3274
+ "path": {
3275
+ "description": "Path to options directory (overrides project config)",
3276
+ "name": "path"
3277
+ }
3278
+ },
3279
+ "description": "Push locally tracked, non-readonly options to WordPress (upsert only, never deletes an untracked option). Options marked \"readonly\": true in their local file are skipped, edit the file to override.",
3280
+ "examples": [
3281
+ "$ lps option push"
3282
+ ],
3283
+ "flags": {
3284
+ "json": {
3285
+ "description": "Format output as json.",
3286
+ "helpGroup": "GLOBAL",
3287
+ "name": "json",
3288
+ "allowNo": false,
3289
+ "type": "boolean"
3290
+ },
3291
+ "env": {
3292
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3293
+ "name": "env",
3294
+ "hasDynamicHelp": false,
3295
+ "multiple": false,
3296
+ "type": "option"
3297
+ },
3298
+ "dry-run": {
3299
+ "char": "d",
3300
+ "description": "Show what would change without making changes",
3301
+ "name": "dry-run",
3302
+ "allowNo": false,
3303
+ "type": "boolean"
3304
+ },
3305
+ "yes": {
3306
+ "char": "y",
3307
+ "description": "Answer yes to confirmation prompts",
3308
+ "name": "yes",
3309
+ "allowNo": false,
3310
+ "type": "boolean"
3311
+ }
3312
+ },
3313
+ "hasDynamicHelp": false,
3314
+ "hiddenAliases": [],
3315
+ "id": "option:push",
3316
+ "pluginAlias": "@loopress/cli",
3317
+ "pluginName": "@loopress/cli",
3318
+ "pluginType": "core",
3319
+ "strict": true,
3320
+ "enableJsonFlag": true,
3321
+ "isESM": true,
3322
+ "relativePath": [
3323
+ "dist",
3324
+ "commands",
3325
+ "option",
3326
+ "push.js"
3327
+ ]
3328
+ },
3329
+ "option:remove": {
3330
+ "aliases": [],
3331
+ "args": {
3332
+ "name": {
3333
+ "description": "Option name to stop tracking",
3334
+ "name": "name",
3335
+ "required": true
3336
+ }
3337
+ },
3338
+ "description": "Stop tracking an option locally and delete it from WordPress. Local untracking always happens (git-reversible); pass --local-only to skip the WordPress delete and only stop tracking.",
3339
+ "examples": [
3340
+ "$ lps option remove wpseo_titles",
3341
+ "$ lps option remove wpseo_titles --local-only"
3342
+ ],
3343
+ "flags": {
3344
+ "json": {
3345
+ "description": "Format output as json.",
3346
+ "helpGroup": "GLOBAL",
3347
+ "name": "json",
3348
+ "allowNo": false,
3349
+ "type": "boolean"
3350
+ },
3351
+ "env": {
3352
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3353
+ "name": "env",
3354
+ "hasDynamicHelp": false,
3355
+ "multiple": false,
3356
+ "type": "option"
3357
+ },
3358
+ "dry-run": {
3359
+ "char": "d",
3360
+ "description": "Show what would change without making changes",
3361
+ "name": "dry-run",
3362
+ "allowNo": false,
3363
+ "type": "boolean"
3364
+ },
3365
+ "yes": {
3366
+ "char": "y",
3367
+ "description": "Answer yes to confirmation prompts",
3368
+ "name": "yes",
3369
+ "allowNo": false,
3370
+ "type": "boolean"
3371
+ },
3372
+ "local-only": {
3373
+ "description": "Untrack locally without deleting the option on WordPress",
3374
+ "name": "local-only",
3375
+ "allowNo": false,
3376
+ "type": "boolean"
3377
+ },
3378
+ "path": {
3379
+ "description": "Path to options directory (overrides project config)",
3380
+ "name": "path",
3381
+ "hasDynamicHelp": false,
3382
+ "multiple": false,
3383
+ "type": "option"
3384
+ }
3385
+ },
3386
+ "hasDynamicHelp": false,
3387
+ "hiddenAliases": [],
3388
+ "id": "option:remove",
3389
+ "pluginAlias": "@loopress/cli",
3390
+ "pluginName": "@loopress/cli",
3391
+ "pluginType": "core",
3392
+ "strict": true,
3393
+ "enableJsonFlag": true,
3394
+ "dryRunFlag": {
3395
+ "dry-run": {
3396
+ "char": "d",
3397
+ "description": "Show what would change without making changes",
3398
+ "allowNo": false,
3399
+ "type": "boolean"
3400
+ }
3401
+ },
3402
+ "yesFlag": {
3403
+ "yes": {
3404
+ "char": "y",
3405
+ "description": "Answer yes to confirmation prompts",
3406
+ "allowNo": false,
3407
+ "type": "boolean"
3408
+ }
3409
+ },
3410
+ "isESM": true,
3411
+ "relativePath": [
3412
+ "dist",
3413
+ "commands",
3414
+ "option",
3415
+ "remove.js"
3416
+ ]
3417
+ },
3418
+ "option:rollback": {
3419
+ "aliases": [],
3420
+ "args": {
3421
+ "path": {
3422
+ "description": "Path to options directory (overrides project config)",
3423
+ "name": "path"
3424
+ }
3425
+ },
3426
+ "description": "Restore tracked options to a snapshot taken automatically before an earlier `lps option push`",
3427
+ "examples": [
3428
+ "$ lps option rollback",
3429
+ "$ lps option rollback --list",
3430
+ "$ lps option rollback --to 1732000000000",
3431
+ "$ lps option rollback --dry-run"
3432
+ ],
3433
+ "flags": {
3434
+ "json": {
3435
+ "description": "Format output as json.",
3436
+ "helpGroup": "GLOBAL",
3437
+ "name": "json",
3438
+ "allowNo": false,
3439
+ "type": "boolean"
3440
+ },
3441
+ "env": {
3442
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3443
+ "name": "env",
3444
+ "hasDynamicHelp": false,
3445
+ "multiple": false,
3446
+ "type": "option"
3447
+ },
3448
+ "dry-run": {
3449
+ "char": "d",
3450
+ "description": "Show what would change without making changes",
3451
+ "name": "dry-run",
3452
+ "allowNo": false,
3453
+ "type": "boolean"
3454
+ },
3455
+ "yes": {
3456
+ "char": "y",
3457
+ "description": "Answer yes to confirmation prompts",
3458
+ "name": "yes",
3459
+ "allowNo": false,
3460
+ "type": "boolean"
3461
+ },
3462
+ "list": {
3463
+ "description": "List available snapshots instead of rolling back",
3464
+ "name": "list",
3465
+ "allowNo": false,
3466
+ "type": "boolean"
3467
+ },
3468
+ "to": {
3469
+ "description": "Roll back to this snapshot id instead of the most recent one",
3470
+ "name": "to",
3471
+ "hasDynamicHelp": false,
3472
+ "multiple": false,
3473
+ "type": "option"
3474
+ }
3475
+ },
3476
+ "hasDynamicHelp": false,
3477
+ "hiddenAliases": [],
3478
+ "id": "option:rollback",
3479
+ "pluginAlias": "@loopress/cli",
3480
+ "pluginName": "@loopress/cli",
3481
+ "pluginType": "core",
3482
+ "strict": true,
3483
+ "enableJsonFlag": true,
3484
+ "dryRunFlag": {
3485
+ "dry-run": {
3486
+ "char": "d",
3487
+ "description": "Show what would change without making changes",
3488
+ "allowNo": false,
3489
+ "type": "boolean"
3490
+ }
3491
+ },
3492
+ "yesFlag": {
3493
+ "yes": {
3494
+ "char": "y",
3495
+ "description": "Answer yes to confirmation prompts",
3496
+ "allowNo": false,
3497
+ "type": "boolean"
3498
+ }
3499
+ },
3500
+ "isESM": true,
3501
+ "relativePath": [
3502
+ "dist",
3503
+ "commands",
3504
+ "option",
3505
+ "rollback.js"
3506
+ ]
3507
+ },
3508
+ "plugin:add": {
3509
+ "aliases": [],
3510
+ "args": {
3511
+ "slug": {
3512
+ "description": "Plugin slug on WordPress.org",
3513
+ "name": "slug",
3514
+ "required": true
3515
+ }
3516
+ },
3517
+ "description": "Add a WordPress.org plugin to loopress.json",
3518
+ "examples": [
3519
+ "$ lps plugin add woocommerce",
3520
+ "$ lps plugin add woocommerce --version 9.4.2",
3521
+ "$ lps plugin add contact-form-7 --dry-run"
3522
+ ],
3523
+ "flags": {
3524
+ "env": {
3525
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3526
+ "name": "env",
3527
+ "hasDynamicHelp": false,
3528
+ "multiple": false,
3529
+ "type": "option"
3530
+ },
3531
+ "dry-run": {
3532
+ "char": "d",
3533
+ "description": "Show what would change without making changes",
3534
+ "name": "dry-run",
3535
+ "allowNo": false,
3536
+ "type": "boolean"
3537
+ },
3538
+ "version": {
3539
+ "description": "Exact version to pin (default: \"latest\", tracked on every push)",
3540
+ "name": "version",
3541
+ "hasDynamicHelp": false,
3542
+ "multiple": false,
3543
+ "type": "option"
3544
+ }
3545
+ },
3546
+ "hasDynamicHelp": false,
3547
+ "hiddenAliases": [],
3548
+ "id": "plugin:add",
3549
+ "pluginAlias": "@loopress/cli",
3550
+ "pluginName": "@loopress/cli",
3551
+ "pluginType": "core",
3552
+ "strict": true,
3553
+ "enableJsonFlag": false,
3554
+ "dryRunFlag": {
3555
+ "dry-run": {
3556
+ "char": "d",
3557
+ "description": "Show what would change without making changes",
3558
+ "allowNo": false,
3559
+ "type": "boolean"
3560
+ }
3561
+ },
3562
+ "yesFlag": {
3563
+ "yes": {
3564
+ "char": "y",
3565
+ "description": "Answer yes to confirmation prompts",
3566
+ "allowNo": false,
3567
+ "type": "boolean"
3568
+ }
3569
+ },
3570
+ "isESM": true,
3571
+ "relativePath": [
3572
+ "dist",
3573
+ "commands",
3574
+ "plugin",
3575
+ "add.js"
3576
+ ]
3577
+ },
3578
+ "plugin:audit": {
3579
+ "aliases": [],
3580
+ "args": {},
3581
+ "description": "Check the plugins in loopress.json for known vulnerabilities and health issues",
3582
+ "examples": [
3583
+ "$ lps plugin audit"
3584
+ ],
3585
+ "flags": {
3586
+ "json": {
3587
+ "description": "Format output as json.",
3588
+ "helpGroup": "GLOBAL",
3589
+ "name": "json",
3590
+ "allowNo": false,
3591
+ "type": "boolean"
3592
+ },
3593
+ "env": {
3594
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
3595
+ "name": "env",
3596
+ "hasDynamicHelp": false,
3597
+ "multiple": false,
3598
+ "type": "option"
3599
+ }
3600
+ },
3601
+ "hasDynamicHelp": false,
3602
+ "hiddenAliases": [],
3603
+ "id": "plugin:audit",
3604
+ "pluginAlias": "@loopress/cli",
3605
+ "pluginName": "@loopress/cli",
3606
+ "pluginType": "core",
3607
+ "strict": true,
3608
+ "enableJsonFlag": true,
3609
+ "dryRunFlag": {
3610
+ "dry-run": {
3611
+ "char": "d",
3612
+ "description": "Show what would change without making changes",
3613
+ "allowNo": false,
3614
+ "type": "boolean"
3615
+ }
3616
+ },
3617
+ "yesFlag": {
3618
+ "yes": {
3619
+ "char": "y",
3620
+ "description": "Answer yes to confirmation prompts",
3621
+ "allowNo": false,
3622
+ "type": "boolean"
3623
+ }
3624
+ },
3625
+ "isESM": true,
3626
+ "relativePath": [
3627
+ "dist",
3628
+ "commands",
3629
+ "plugin",
3630
+ "audit.js"
3631
+ ]
3632
+ },
3633
+ "plugin:pull": {
3634
+ "aliases": [],
3635
+ "args": {},
3636
+ "description": "Pull installed plugins from WordPress into loopress.json, pinned to their live versions",
3637
+ "examples": [
3638
+ "$ lps plugin pull",
3639
+ "$ lps plugin pull --dry-run"
3640
+ ],
3641
+ "flags": {
3642
+ "json": {
3643
+ "description": "Format output as json.",
3644
+ "helpGroup": "GLOBAL",
3645
+ "name": "json",
3646
+ "allowNo": false,
3647
+ "type": "boolean"
3648
+ },
2655
3649
  "env": {
2656
3650
  "description": "Target environment by name, overriding the globally active one (lps project switch)",
2657
3651
  "name": "env",
@@ -3255,7 +4249,8 @@
3255
4249
  },
3256
4250
  "description": "Push SEO settings, post meta, and redirects to WordPress. Local redirect files created remotely are renamed on disk to the `<id>-<slug>` convention. Fails clearly per file if the active SEO plugin does not support redirects.",
3257
4251
  "examples": [
3258
- "$ lps seo push"
4252
+ "$ lps seo push",
4253
+ "$ lps seo push --allow-external-redirects"
3259
4254
  ],
3260
4255
  "flags": {
3261
4256
  "env": {
@@ -3278,6 +4273,12 @@
3278
4273
  "name": "yes",
3279
4274
  "allowNo": false,
3280
4275
  "type": "boolean"
4276
+ },
4277
+ "allow-external-redirects": {
4278
+ "description": "Allow pushing a redirect whose target points off this site. Off by default: the server rejects an off-site `urlTo` so a stray push can't 301 traffic away.",
4279
+ "name": "allow-external-redirects",
4280
+ "allowNo": false,
4281
+ "type": "boolean"
3281
4282
  }
3282
4283
  },
3283
4284
  "hasDynamicHelp": false,
@@ -3295,6 +4296,96 @@
3295
4296
  "push.js"
3296
4297
  ]
3297
4298
  },
4299
+ "seo:rollback": {
4300
+ "aliases": [],
4301
+ "args": {
4302
+ "path": {
4303
+ "description": "Path to SEO directory (overrides project config)",
4304
+ "name": "path"
4305
+ }
4306
+ },
4307
+ "description": "Restore SEO settings, post meta, and redirects to a snapshot taken automatically before an earlier `lps seo push`",
4308
+ "examples": [
4309
+ "$ lps seo rollback",
4310
+ "$ lps seo rollback --list",
4311
+ "$ lps seo rollback --to 1732000000000",
4312
+ "$ lps seo rollback --dry-run"
4313
+ ],
4314
+ "flags": {
4315
+ "json": {
4316
+ "description": "Format output as json.",
4317
+ "helpGroup": "GLOBAL",
4318
+ "name": "json",
4319
+ "allowNo": false,
4320
+ "type": "boolean"
4321
+ },
4322
+ "env": {
4323
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
4324
+ "name": "env",
4325
+ "hasDynamicHelp": false,
4326
+ "multiple": false,
4327
+ "type": "option"
4328
+ },
4329
+ "dry-run": {
4330
+ "char": "d",
4331
+ "description": "Show what would change without making changes",
4332
+ "name": "dry-run",
4333
+ "allowNo": false,
4334
+ "type": "boolean"
4335
+ },
4336
+ "yes": {
4337
+ "char": "y",
4338
+ "description": "Answer yes to confirmation prompts",
4339
+ "name": "yes",
4340
+ "allowNo": false,
4341
+ "type": "boolean"
4342
+ },
4343
+ "list": {
4344
+ "description": "List available snapshots instead of rolling back",
4345
+ "name": "list",
4346
+ "allowNo": false,
4347
+ "type": "boolean"
4348
+ },
4349
+ "to": {
4350
+ "description": "Roll back to this snapshot id instead of the most recent one",
4351
+ "name": "to",
4352
+ "hasDynamicHelp": false,
4353
+ "multiple": false,
4354
+ "type": "option"
4355
+ }
4356
+ },
4357
+ "hasDynamicHelp": false,
4358
+ "hiddenAliases": [],
4359
+ "id": "seo:rollback",
4360
+ "pluginAlias": "@loopress/cli",
4361
+ "pluginName": "@loopress/cli",
4362
+ "pluginType": "core",
4363
+ "strict": true,
4364
+ "enableJsonFlag": true,
4365
+ "dryRunFlag": {
4366
+ "dry-run": {
4367
+ "char": "d",
4368
+ "description": "Show what would change without making changes",
4369
+ "allowNo": false,
4370
+ "type": "boolean"
4371
+ }
4372
+ },
4373
+ "yesFlag": {
4374
+ "yes": {
4375
+ "char": "y",
4376
+ "description": "Answer yes to confirmation prompts",
4377
+ "allowNo": false,
4378
+ "type": "boolean"
4379
+ }
4380
+ },
4381
+ "isESM": true,
4382
+ "relativePath": [
4383
+ "dist",
4384
+ "commands",
4385
+ "seo",
4386
+ "rollback.js"
4387
+ ]
4388
+ },
3298
4389
  "snippet:diff": {
3299
4390
  "aliases": [],
3300
4391
  "args": {
@@ -3563,32 +4654,122 @@
3563
4654
  "dry-run": {
3564
4655
  "char": "d",
3565
4656
  "description": "Show what would change without making changes",
3566
- "name": "dry-run",
4657
+ "name": "dry-run",
4658
+ "allowNo": false,
4659
+ "type": "boolean"
4660
+ },
4661
+ "yes": {
4662
+ "char": "y",
4663
+ "description": "Answer yes to confirmation prompts",
4664
+ "name": "yes",
4665
+ "allowNo": false,
4666
+ "type": "boolean"
4667
+ }
4668
+ },
4669
+ "hasDynamicHelp": false,
4670
+ "hiddenAliases": [],
4671
+ "id": "snippet:push",
4672
+ "pluginAlias": "@loopress/cli",
4673
+ "pluginName": "@loopress/cli",
4674
+ "pluginType": "core",
4675
+ "strict": true,
4676
+ "enableJsonFlag": true,
4677
+ "isESM": true,
4678
+ "relativePath": [
4679
+ "dist",
4680
+ "commands",
4681
+ "snippet",
4682
+ "push.js"
4683
+ ]
4684
+ },
4685
+ "snippet:rollback": {
4686
+ "aliases": [],
4687
+ "args": {
4688
+ "path": {
4689
+ "description": "Path to snippets directory (overrides project config)",
4690
+ "name": "path"
4691
+ }
4692
+ },
4693
+ "description": "Restore snippets to a snapshot taken automatically before an earlier `lps snippet push`",
4694
+ "examples": [
4695
+ "$ lps snippet rollback",
4696
+ "$ lps snippet rollback --list",
4697
+ "$ lps snippet rollback --to 1732000000000",
4698
+ "$ lps snippet rollback --dry-run"
4699
+ ],
4700
+ "flags": {
4701
+ "json": {
4702
+ "description": "Format output as json.",
4703
+ "helpGroup": "GLOBAL",
4704
+ "name": "json",
4705
+ "allowNo": false,
4706
+ "type": "boolean"
4707
+ },
4708
+ "env": {
4709
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
4710
+ "name": "env",
4711
+ "hasDynamicHelp": false,
4712
+ "multiple": false,
4713
+ "type": "option"
4714
+ },
4715
+ "dry-run": {
4716
+ "char": "d",
4717
+ "description": "Show what would change without making changes",
4718
+ "name": "dry-run",
4719
+ "allowNo": false,
4720
+ "type": "boolean"
4721
+ },
4722
+ "yes": {
4723
+ "char": "y",
4724
+ "description": "Answer yes to confirmation prompts",
4725
+ "name": "yes",
4726
+ "allowNo": false,
4727
+ "type": "boolean"
4728
+ },
4729
+ "list": {
4730
+ "description": "List available snapshots instead of rolling back",
4731
+ "name": "list",
4732
+ "allowNo": false,
4733
+ "type": "boolean"
4734
+ },
4735
+ "to": {
4736
+ "description": "Roll back to this snapshot id instead of the most recent one",
4737
+ "name": "to",
4738
+ "hasDynamicHelp": false,
4739
+ "multiple": false,
4740
+ "type": "option"
4741
+ }
4742
+ },
4743
+ "hasDynamicHelp": false,
4744
+ "hiddenAliases": [],
4745
+ "id": "snippet:rollback",
4746
+ "pluginAlias": "@loopress/cli",
4747
+ "pluginName": "@loopress/cli",
4748
+ "pluginType": "core",
4749
+ "strict": true,
4750
+ "enableJsonFlag": true,
4751
+ "dryRunFlag": {
4752
+ "dry-run": {
4753
+ "char": "d",
4754
+ "description": "Show what would change without making changes",
3567
4755
  "allowNo": false,
3568
4756
  "type": "boolean"
3569
- },
4757
+ }
4758
+ },
4759
+ "yesFlag": {
3570
4760
  "yes": {
3571
4761
  "char": "y",
3572
4762
  "description": "Answer yes to confirmation prompts",
3573
- "name": "yes",
3574
4763
  "allowNo": false,
3575
4764
  "type": "boolean"
3576
4765
  }
3577
4766
  },
3578
- "hasDynamicHelp": false,
3579
- "hiddenAliases": [],
3580
- "id": "snippet:push",
3581
- "pluginAlias": "@loopress/cli",
3582
- "pluginName": "@loopress/cli",
3583
- "pluginType": "core",
3584
- "strict": true,
3585
- "enableJsonFlag": true,
3586
4767
  "isESM": true,
3587
4768
  "relativePath": [
3588
4769
  "dist",
3589
4770
  "commands",
3590
4771
  "snippet",
3591
- "push.js"
4772
+ "rollback.js"
3592
4773
  ]
3593
4774
  },
3594
4775
  "telemetry:disable": {
@@ -3884,7 +5065,277 @@
3884
5065
  "theme",
3885
5066
  "status.js"
3886
5067
  ]
5068
+ },
5069
+ "theme-styles:diff": {
5070
+ "aliases": [],
5071
+ "args": {
5072
+ "path": {
5073
+ "description": "Path to theme styles directory (overrides project config)",
5074
+ "name": "path"
5075
+ }
5076
+ },
5077
+ "description": "Show what differs in the active block theme's Global Styles (Site Editor > Styles) between your local file and a WordPress environment, or between two environments",
5078
+ "examples": [
5079
+ "$ lps theme-styles diff",
5080
+ "$ lps theme-styles diff --env staging",
5081
+ "$ lps theme-styles diff --env staging --against production"
5082
+ ],
5083
+ "flags": {
5084
+ "json": {
5085
+ "description": "Format output as json.",
5086
+ "helpGroup": "GLOBAL",
5087
+ "name": "json",
5088
+ "allowNo": false,
5089
+ "type": "boolean"
5090
+ },
5091
+ "env": {
5092
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
5093
+ "name": "env",
5094
+ "hasDynamicHelp": false,
5095
+ "multiple": false,
5096
+ "type": "option"
5097
+ },
5098
+ "against": {
5099
+ "description": "Compare the primary environment against this second environment instead of against local files",
5100
+ "name": "against",
5101
+ "hasDynamicHelp": false,
5102
+ "multiple": false,
5103
+ "type": "option"
5104
+ }
5105
+ },
5106
+ "hasDynamicHelp": false,
5107
+ "hiddenAliases": [],
5108
+ "id": "theme-styles:diff",
5109
+ "pluginAlias": "@loopress/cli",
5110
+ "pluginName": "@loopress/cli",
5111
+ "pluginType": "core",
5112
+ "strict": true,
5113
+ "enableJsonFlag": true,
5114
+ "dryRunFlag": {
5115
+ "dry-run": {
5116
+ "char": "d",
5117
+ "description": "Show what would change without making changes",
5118
+ "allowNo": false,
5119
+ "type": "boolean"
5120
+ }
5121
+ },
5122
+ "yesFlag": {
5123
+ "yes": {
5124
+ "char": "y",
5125
+ "description": "Answer yes to confirmation prompts",
5126
+ "allowNo": false,
5127
+ "type": "boolean"
5128
+ }
5129
+ },
5130
+ "againstFlag": {
5131
+ "against": {
5132
+ "description": "Compare the primary environment against this second environment instead of against local files",
5133
+ "input": [],
5134
+ "multiple": false,
5135
+ "type": "option"
5136
+ }
5137
+ },
5138
+ "isESM": true,
5139
+ "relativePath": [
5140
+ "dist",
5141
+ "commands",
5142
+ "theme-styles",
5143
+ "diff.js"
5144
+ ]
5145
+ },
5146
+ "theme-styles:pull": {
5147
+ "aliases": [],
5148
+ "args": {
5149
+ "path": {
5150
+ "description": "Path to theme styles directory (overrides project config)",
5151
+ "name": "path"
5152
+ }
5153
+ },
5154
+ "description": "Pull the active block theme's Global Styles customizations (Site Editor > Styles) from WordPress into a local file",
5155
+ "examples": [
5156
+ "$ lps theme-styles pull"
5157
+ ],
5158
+ "flags": {
5159
+ "env": {
5160
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
5161
+ "name": "env",
5162
+ "hasDynamicHelp": false,
5163
+ "multiple": false,
5164
+ "type": "option"
5165
+ },
5166
+ "dry-run": {
5167
+ "char": "d",
5168
+ "description": "Show what would change without making changes",
5169
+ "name": "dry-run",
5170
+ "allowNo": false,
5171
+ "type": "boolean"
5172
+ }
5173
+ },
5174
+ "hasDynamicHelp": false,
5175
+ "hiddenAliases": [],
5176
+ "id": "theme-styles:pull",
5177
+ "pluginAlias": "@loopress/cli",
5178
+ "pluginName": "@loopress/cli",
5179
+ "pluginType": "core",
5180
+ "strict": true,
5181
+ "enableJsonFlag": false,
5182
+ "dryRunFlag": {
5183
+ "dry-run": {
5184
+ "char": "d",
5185
+ "description": "Show what would change without making changes",
5186
+ "allowNo": false,
5187
+ "type": "boolean"
5188
+ }
5189
+ },
5190
+ "yesFlag": {
5191
+ "yes": {
5192
+ "char": "y",
5193
+ "description": "Answer yes to confirmation prompts",
5194
+ "allowNo": false,
5195
+ "type": "boolean"
5196
+ }
5197
+ },
5198
+ "isESM": true,
5199
+ "relativePath": [
5200
+ "dist",
5201
+ "commands",
5202
+ "theme-styles",
5203
+ "pull.js"
5204
+ ]
5205
+ },
5206
+ "theme-styles:push": {
5207
+ "aliases": [],
5208
+ "args": {
5209
+ "path": {
5210
+ "description": "Path to theme styles directory (overrides project config)",
5211
+ "name": "path"
5212
+ }
5213
+ },
5214
+ "description": "Push the local Global Styles file to the active block theme's Site Editor > Styles on WordPress",
5215
+ "examples": [
5216
+ "$ lps theme-styles push"
5217
+ ],
5218
+ "flags": {
5219
+ "env": {
5220
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
5221
+ "name": "env",
5222
+ "hasDynamicHelp": false,
5223
+ "multiple": false,
5224
+ "type": "option"
5225
+ },
5226
+ "dry-run": {
5227
+ "char": "d",
5228
+ "description": "Show what would change without making changes",
5229
+ "name": "dry-run",
5230
+ "allowNo": false,
5231
+ "type": "boolean"
5232
+ }
5233
+ },
5234
+ "hasDynamicHelp": false,
5235
+ "hiddenAliases": [],
5236
+ "id": "theme-styles:push",
5237
+ "pluginAlias": "@loopress/cli",
5238
+ "pluginName": "@loopress/cli",
5239
+ "pluginType": "core",
5240
+ "strict": true,
5241
+ "isESM": true,
5242
+ "relativePath": [
5243
+ "dist",
5244
+ "commands",
5245
+ "theme-styles",
5246
+ "push.js"
5247
+ ]
5248
+ },
5249
+ "theme-styles:rollback": {
5250
+ "aliases": [],
5251
+ "args": {
5252
+ "path": {
5253
+ "description": "Path to theme styles directory (overrides project config)",
5254
+ "name": "path"
5255
+ }
5256
+ },
5257
+ "description": "Restore the active theme’s Global Styles to a snapshot taken automatically before an earlier `lps theme-styles push`",
5258
+ "examples": [
5259
+ "$ lps theme-styles rollback",
5260
+ "$ lps theme-styles rollback --list",
5261
+ "$ lps theme-styles rollback --to 1732000000000",
5262
+ "$ lps theme-styles rollback --dry-run"
5263
+ ],
5264
+ "flags": {
5265
+ "json": {
5266
+ "description": "Format output as json.",
5267
+ "helpGroup": "GLOBAL",
5268
+ "name": "json",
5269
+ "allowNo": false,
5270
+ "type": "boolean"
5271
+ },
5272
+ "env": {
5273
+ "description": "Target environment by name, overriding the globally active one (lps project switch)",
5274
+ "name": "env",
5275
+ "hasDynamicHelp": false,
5276
+ "multiple": false,
5277
+ "type": "option"
5278
+ },
5279
+ "dry-run": {
5280
+ "char": "d",
5281
+ "description": "Show what would change without making changes",
5282
+ "name": "dry-run",
5283
+ "allowNo": false,
5284
+ "type": "boolean"
5285
+ },
5286
+ "yes": {
5287
+ "char": "y",
5288
+ "description": "Answer yes to confirmation prompts",
5289
+ "name": "yes",
5290
+ "allowNo": false,
5291
+ "type": "boolean"
5292
+ },
5293
+ "list": {
5294
+ "description": "List available snapshots instead of rolling back",
5295
+ "name": "list",
5296
+ "allowNo": false,
5297
+ "type": "boolean"
5298
+ },
5299
+ "to": {
5300
+ "description": "Roll back to this snapshot id instead of the most recent one",
5301
+ "name": "to",
5302
+ "hasDynamicHelp": false,
5303
+ "multiple": false,
5304
+ "type": "option"
5305
+ }
5306
+ },
5307
+ "hasDynamicHelp": false,
5308
+ "hiddenAliases": [],
5309
+ "id": "theme-styles:rollback",
5310
+ "pluginAlias": "@loopress/cli",
5311
+ "pluginName": "@loopress/cli",
5312
+ "pluginType": "core",
5313
+ "strict": true,
5314
+ "enableJsonFlag": true,
5315
+ "dryRunFlag": {
5316
+ "dry-run": {
5317
+ "char": "d",
5318
+ "description": "Show what would change without making changes",
5319
+ "allowNo": false,
5320
+ "type": "boolean"
5321
+ }
5322
+ },
5323
+ "yesFlag": {
5324
+ "yes": {
5325
+ "char": "y",
5326
+ "description": "Answer yes to confirmation prompts",
5327
+ "allowNo": false,
5328
+ "type": "boolean"
5329
+ }
5330
+ },
5331
+ "isESM": true,
5332
+ "relativePath": [
5333
+ "dist",
5334
+ "commands",
5335
+ "theme-styles",
5336
+ "rollback.js"
5337
+ ]
3887
5338
  }
3888
5339
  },
3889
- "version": "0.24.0"
5340
+ "version": "0.25.0"
3890
5341
  }