gutterpress 0.11.9-alpha.1 → 0.11.9-alpha.3

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 (27) hide show
  1. package/README.md +2 -2
  2. package/dist/api/index.js +2 -2
  3. package/dist/{audit-ydxsev28.js → audit-z6hp3dep.js} +4 -4
  4. package/dist/{build-xd4bjtbv.js → build-9ze0fcgq.js} +4 -4
  5. package/dist/{cli-h91e69hm.js → cli-d8rdk1y7.js} +1 -1
  6. package/dist/{cli-b4ramtgc.js → cli-edn2tver.js} +81 -32
  7. package/dist/{cli-cfymymkv.js → cli-ervhbr00.js} +1 -1
  8. package/dist/{cli-9a5eacxd.js → cli-nc752ryp.js} +1 -1
  9. package/dist/cli.js +14 -14
  10. package/dist/{doctor-b097943h.js → doctor-yk3ah4yk.js} +2 -2
  11. package/dist/{engine-w2m1jp4p.js → engine-qtfrfbpk.js} +1 -1
  12. package/dist/{engine-s6240qap.js → engine-trte2tg2.js} +2 -2
  13. package/dist/{ext-ft6h0qn9.js → ext-8hrf9n6f.js} +4 -4
  14. package/dist/{index-91k91awj.js → index-27xa2tfd.js} +80 -31
  15. package/dist/{index-71pn94g1.js → index-kqftehgy.js} +1 -1
  16. package/dist/{index-mks8j9av.js → index-t43k5rq1.js} +1 -1
  17. package/dist/index.js +3 -3
  18. package/dist/lib/publish/providers/local-folder.d.ts +6 -0
  19. package/dist/lib/publish/types.d.ts +1 -1
  20. package/dist/{lint-exc3w24c.js → lint-qxcpd3ry.js} +4 -4
  21. package/dist/{manifest.schema-hsn8rsgr.json → manifest.schema-61bsspsb.json} +9 -0
  22. package/dist/{new-6nz32v7c.js → new-3a5ng8yv.js} +4 -4
  23. package/dist/{preflight-5kq978aq.js → preflight-qwbkp4pq.js} +4 -4
  24. package/dist/{preview-8dcs83k4.js → preview-aska26g4.js} +4 -4
  25. package/dist/{publish-2ks819pa.js → publish-jam8mqes.js} +4 -4
  26. package/dist/{validate-e8qneem9.js → validate-3cwwe0d5.js} +4 -4
  27. package/package.json +1 -1
package/README.md CHANGED
@@ -237,12 +237,12 @@ plus the PDF from the second — the pdf build never overwrites `book.html`.
237
237
 
238
238
  ### `gutterpress publish`
239
239
 
240
- Push a built PDF/HTML artifact to a publishing platform (itch.io, DriveThruRPG, Amazon KDP, Azure Static Web Apps, Shopify, Google Drive), headlessly and CI-safely. Credentials live in a 0600 user-config store (never in the project); provider env vars override it for CI. Most providers connect with a pasted API key; Google Drive connects through your browser instead (`--connect` opens the sign-in page — nothing to paste).
240
+ Push a built PDF/HTML artifact to a publishing platform (itch.io, DriveThruRPG, Amazon KDP, Azure Static Web Apps, Shopify, Google Drive) or copy it to a local folder (`local`, the desktop's default first destination), headlessly and CI-safely. Credentials live in a 0600 user-config store (never in the project); provider env vars override it for CI. Most providers connect with a pasted API key; Google Drive connects through your browser instead (`--connect` opens the sign-in page — nothing to paste).
241
241
 
242
242
  ```sh
243
243
  gutterpress publish [project] [options]
244
244
 
245
- --provider <id> itch | drivethrurpg | kdp | azure-swa | shopify | gdrive
245
+ --provider <id> local | itch | drivethrurpg | kdp | azure-swa | shopify | gdrive
246
246
  --list List providers and connection status
247
247
  --connect Store an API key for --provider (from --token, the provider's env var, or piped stdin) — or, for gdrive, open the browser to connect
248
248
  --disconnect Forget the stored key for --provider
package/dist/api/index.js CHANGED
@@ -124,12 +124,12 @@ import {
124
124
  syncProject,
125
125
  testRemoteAccess,
126
126
  validateProjectExtensions
127
- } from "../index-91k91awj.js";
127
+ } from "../index-27xa2tfd.js";
128
128
  import {
129
129
  BuildError,
130
130
  DEFAULT_PRINT_OPTS,
131
131
  readyProbeExpr
132
- } from "../index-mks8j9av.js";
132
+ } from "../index-t43k5rq1.js";
133
133
  import {
134
134
  AUTO_SNAPSHOT_MESSAGE,
135
135
  DEFAULT_NPM_REGISTRY,
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  executeAndReport
3
- } from "./cli-b4ramtgc.js";
3
+ } from "./cli-edn2tver.js";
4
4
  import {
5
5
  log
6
- } from "./cli-9a5eacxd.js";
6
+ } from "./cli-nc752ryp.js";
7
7
  import {
8
8
  UsageError,
9
9
  rejectExtraPositionals,
10
10
  rejectUnknownFlags
11
- } from "./cli-cfymymkv.js";
12
- import"./cli-h91e69hm.js";
11
+ } from "./cli-ervhbr00.js";
12
+ import"./cli-d8rdk1y7.js";
13
13
  import"./cli-c41yr7he.js";
14
14
  import {
15
15
  EXIT_CODES
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  runBuild,
3
3
  splitOutPath
4
- } from "./cli-b4ramtgc.js";
4
+ } from "./cli-edn2tver.js";
5
5
  import {
6
6
  log
7
- } from "./cli-9a5eacxd.js";
7
+ } from "./cli-nc752ryp.js";
8
8
  import {
9
9
  UsageError,
10
10
  parseFormat,
11
11
  parsePdfxFlavor,
12
12
  rejectExtraPositionals,
13
13
  rejectUnknownFlags
14
- } from "./cli-cfymymkv.js";
15
- import"./cli-h91e69hm.js";
14
+ } from "./cli-ervhbr00.js";
15
+ import"./cli-d8rdk1y7.js";
16
16
  import"./cli-c41yr7he.js";
17
17
  import {
18
18
  BuildError
@@ -1430,7 +1430,7 @@ import { fileURLToPath } from "node:url";
1430
1430
  var favicon_default = "./favicon-wkbm9cjn.ico";
1431
1431
 
1432
1432
  // src/assets/manifest.schema.json
1433
- var manifest_schema_default = "./manifest.schema-hsn8rsgr.json";
1433
+ var manifest_schema_default = "./manifest.schema-61bsspsb.json";
1434
1434
 
1435
1435
  // src/assets/preview/scripts/preview-interface.js
1436
1436
  var preview_interface_default = "./preview-interface-9rwz21yw.js";
@@ -13,12 +13,12 @@ import {
13
13
  stampCreator,
14
14
  stripAnnotations,
15
15
  warn
16
- } from "./cli-9a5eacxd.js";
16
+ } from "./cli-nc752ryp.js";
17
17
  import {
18
18
  DEBOUNCE,
19
19
  UsageError,
20
20
  resolvePort
21
- } from "./cli-cfymymkv.js";
21
+ } from "./cli-ervhbr00.js";
22
22
  import {
23
23
  MARGIN_BOX_IGNORED_PROPERTIES,
24
24
  RENDER_TIMEOUT_MS,
@@ -28,7 +28,7 @@ import {
28
28
  getAssetsDir,
29
29
  getBrowser,
30
30
  prewarmBrowser
31
- } from "./cli-h91e69hm.js";
31
+ } from "./cli-d8rdk1y7.js";
32
32
  import {
33
33
  INSTALL_HINTS,
34
34
  execCapture,
@@ -8193,7 +8193,7 @@ class PdfOutput {
8193
8193
  const rawPdf = pdfxMode ? path8.join(stage, "raw.pdf") : path8.resolve(pdfFile);
8194
8194
  await fsp2.mkdir(path8.dirname(path8.resolve(pdfFile)), { recursive: true });
8195
8195
  log.info("Rendering HTML to PDF via the Gutterpress engine (native Chromium pagination)");
8196
- const { buildNativePdf } = await import("./engine-w2m1jp4p.js");
8196
+ const { buildNativePdf } = await import("./engine-qtfrfbpk.js");
8197
8197
  const engineDiagnostics = await buildNativePdf(htmlFile, rawPdf, {
8198
8198
  title: config.title,
8199
8199
  author: config.authors.length > 0 ? config.authors.join(", ") : undefined,
@@ -12989,6 +12989,54 @@ var kdpProvider = {
12989
12989
  }
12990
12990
  };
12991
12991
 
12992
+ // src/lib/publish/providers/local-folder.ts
12993
+ import { cp as cp5, mkdir as mkdir13, stat as stat9 } from "node:fs/promises";
12994
+ import path22 from "node:path";
12995
+ var LOCAL_PUBLISH_DEFAULT_DIR = "dist";
12996
+ var info7 = {
12997
+ id: "local",
12998
+ label: "A folder on this computer",
12999
+ kind: "api",
13000
+ format: "pdf",
13001
+ formats: ["pdf", "html"],
13002
+ description: "Save the finished file to a folder you choose.",
13003
+ configFields: [
13004
+ { key: "dir", label: "Folder", placeholder: LOCAL_PUBLISH_DEFAULT_DIR }
13005
+ ],
13006
+ credential: { required: false, host: "" }
13007
+ };
13008
+ function localPublishDir(req) {
13009
+ const dir = typeof req.config.dir === "string" && req.config.dir.trim() ? req.config.dir.trim() : LOCAL_PUBLISH_DEFAULT_DIR;
13010
+ return path22.resolve(req.project.projectDir, dir);
13011
+ }
13012
+ var localFolderProvider = {
13013
+ info: info7,
13014
+ async authenticate() {
13015
+ return { ok: true };
13016
+ },
13017
+ async preflight(req) {
13018
+ const dir = localPublishDir(req);
13019
+ try {
13020
+ const s = await stat9(dir);
13021
+ if (!s.isDirectory()) {
13022
+ return [
13023
+ { severity: "error", id: "local/not-a-folder", message: `${dir} exists but is not a folder.` }
13024
+ ];
13025
+ }
13026
+ } catch {}
13027
+ return [];
13028
+ },
13029
+ async upload(req) {
13030
+ const dir = localPublishDir(req);
13031
+ await mkdir13(dir, { recursive: true });
13032
+ const dest = req.artifact.format === "html" ? dir : path22.join(dir, path22.basename(req.artifact.path));
13033
+ if (path22.resolve(dest) !== path22.resolve(req.artifact.path)) {
13034
+ await cp5(req.artifact.path, dest, { recursive: true });
13035
+ }
13036
+ return { kind: "published", detail: `Saved to ${dest}` };
13037
+ }
13038
+ };
13039
+
12992
13040
  // src/lib/publish/providers/shopify.ts
12993
13041
  var SHOPIFY_HOST = "shopify";
12994
13042
  var DEFAULT_API_VERSION = "2026-04";
@@ -13003,7 +13051,7 @@ function requireValidShop(shop) {
13003
13051
  }
13004
13052
  return shop;
13005
13053
  }
13006
- var info7 = {
13054
+ var info8 = {
13007
13055
  id: "shopify",
13008
13056
  label: "Shopify",
13009
13057
  kind: "api",
@@ -13037,7 +13085,7 @@ function readConfig3(req) {
13037
13085
  async function adminGraphQL(req, query, variables = {}) {
13038
13086
  const { shop: rawShop, apiVersion } = readConfig3(req);
13039
13087
  const shop = requireValidShop(rawShop);
13040
- const resolved = await resolvePublishCredential(info7, req.deps);
13088
+ const resolved = await resolvePublishCredential(info8, req.deps);
13041
13089
  if (!resolved) {
13042
13090
  throw new Error("No Shopify access token found. Connect Shopify (or set SHOPIFY_ADMIN_TOKEN) first.");
13043
13091
  }
@@ -13088,9 +13136,9 @@ function userErrorsToMessage(result) {
13088
13136
  return errs?.length ? errs[0].message : null;
13089
13137
  }
13090
13138
  var shopifyProvider = {
13091
- info: info7,
13139
+ info: info8,
13092
13140
  async authenticate(req) {
13093
- const resolved = await resolvePublishCredential(info7, req.deps);
13141
+ const resolved = await resolvePublishCredential(info8, req.deps);
13094
13142
  if (!resolved) {
13095
13143
  return {
13096
13144
  ok: false,
@@ -13203,6 +13251,7 @@ var shopifyProvider = {
13203
13251
 
13204
13252
  // src/lib/publish/registry.ts
13205
13253
  var PROVIDERS = {
13254
+ local: localFolderProvider,
13206
13255
  itch: itchProvider,
13207
13256
  drivethrurpg: drivethrurpgProvider,
13208
13257
  kdp: kdpProvider,
@@ -13223,16 +13272,16 @@ function publishProviderFor(id) {
13223
13272
  }
13224
13273
 
13225
13274
  // src/lib/publish/run-publish.ts
13226
- import { readdir as readdir6, stat as stat9 } from "node:fs/promises";
13227
- import path22 from "node:path";
13228
- function resolvePublishFormat(info8, providerConfig) {
13229
- if (info8.formats && info8.formats.length > 0) {
13275
+ import { readdir as readdir6, stat as stat10 } from "node:fs/promises";
13276
+ import path23 from "node:path";
13277
+ function resolvePublishFormat(info9, providerConfig) {
13278
+ if (info9.formats && info9.formats.length > 0) {
13230
13279
  const configured = typeof providerConfig.format === "string" ? providerConfig.format.trim() : "";
13231
- if (configured && info8.formats.includes(configured)) {
13280
+ if (configured && info9.formats.includes(configured)) {
13232
13281
  return configured;
13233
13282
  }
13234
13283
  }
13235
- return info8.format;
13284
+ return info9.format;
13236
13285
  }
13237
13286
  async function resolvePublishRequest(options, deps) {
13238
13287
  const provider = publishProviderFor(options.providerId);
@@ -13245,9 +13294,9 @@ async function resolvePublishRequest(options, deps) {
13245
13294
  const effectiveDeps = effectiveAccount ? { ...deps, credentialAccount: effectiveAccount } : deps;
13246
13295
  const outDir = resolveOutputDir(manifestDir, config.title);
13247
13296
  const effectiveFormat = resolvePublishFormat(provider.info, providerConfig);
13248
- const defaultArtifact = effectiveFormat === "pdf" ? path22.join(outDir, artifactName(config.title, "pdf")) : outDir;
13297
+ const defaultArtifact = effectiveFormat === "pdf" ? path23.join(outDir, artifactName(config.title, "pdf")) : outDir;
13249
13298
  const artifact = {
13250
- path: options.artifactPath ? path22.resolve(options.projectDir, options.artifactPath) : defaultArtifact,
13299
+ path: options.artifactPath ? path23.resolve(options.projectDir, options.artifactPath) : defaultArtifact,
13251
13300
  format: effectiveFormat
13252
13301
  };
13253
13302
  return {
@@ -13265,7 +13314,7 @@ var PDF_HINT = "Build the PDF first (gutterpress build, or export it from the ap
13265
13314
  var HTML_HINT = "Build the website export first (gutterpress build --format html).";
13266
13315
  async function artifactIssues(artifact) {
13267
13316
  try {
13268
- const s = await stat9(artifact.path);
13317
+ const s = await stat10(artifact.path);
13269
13318
  if (artifact.format === "pdf" && !s.isFile()) {
13270
13319
  return [
13271
13320
  {
@@ -13311,7 +13360,7 @@ async function artifactIssues(artifact) {
13311
13360
  var BUILD_FINGERPRINT_FILENAME = "build-fingerprint.json";
13312
13361
  async function htmlDirIssues(dir) {
13313
13362
  const issues = [];
13314
- const isThere = async (rel) => stat9(path22.join(dir, rel)).then(() => true, () => false);
13363
+ const isThere = async (rel) => stat10(path23.join(dir, rel)).then(() => true, () => false);
13315
13364
  if (!await isThere(BOOK_HTML)) {
13316
13365
  issues.push({
13317
13366
  severity: "error",
@@ -13382,17 +13431,17 @@ function overlayStore(inner, key, candidate) {
13382
13431
  }
13383
13432
  async function connectPublishProvider(options, deps) {
13384
13433
  const provider = publishProviderFor(options.providerId);
13385
- const info8 = provider.info;
13386
- if (!info8.credential.required) {
13387
- throw new Error(`${info8.label} needs no API key — just publish when you're ready.`);
13434
+ const info9 = provider.info;
13435
+ if (!info9.credential.required) {
13436
+ throw new Error(`${info9.label} needs no API key — just publish when you're ready.`);
13388
13437
  }
13389
- if (info8.credential.connect === "oauth") {
13390
- throw new Error(`${info8.label} connects through your browser, not a pasted key — run ` + `"gutterpress publish --provider ${info8.id} --connect" or use the desktop app's Connect button.`);
13438
+ if (info9.credential.connect === "oauth") {
13439
+ throw new Error(`${info9.label} connects through your browser, not a pasted key — run ` + `"gutterpress publish --provider ${info9.id} --connect" or use the desktop app's Connect button.`);
13391
13440
  }
13392
13441
  const token = options.token.trim();
13393
13442
  if (!token)
13394
13443
  throw new Error("Paste an API key first.");
13395
- const host = info8.credential.host;
13444
+ const host = info9.credential.host;
13396
13445
  const account = (options.account ?? "").trim();
13397
13446
  const key = publishCredentialKey(host, account);
13398
13447
  const candidate = {
@@ -13400,12 +13449,12 @@ async function connectPublishProvider(options, deps) {
13400
13449
  kind: "token",
13401
13450
  token,
13402
13451
  ...account ? { username: account } : {},
13403
- label: account || info8.label,
13452
+ label: account || info9.label,
13404
13453
  createdAt: Date.now()
13405
13454
  };
13406
13455
  const req = await resolvePublishRequest({
13407
13456
  projectDir: options.projectDir,
13408
- providerId: info8.id,
13457
+ providerId: info9.id,
13409
13458
  ...options.manifestPath ? { manifestPath: options.manifestPath } : {}
13410
13459
  }, deps);
13411
13460
  const trialDeps = {
@@ -13416,10 +13465,10 @@ async function connectPublishProvider(options, deps) {
13416
13465
  };
13417
13466
  const auth = await provider.authenticate({ ...req, deps: trialDeps });
13418
13467
  if (!auth.ok) {
13419
- throw new Error(auth.message ?? `${info8.label} didn't accept that key.`);
13468
+ throw new Error(auth.message ?? `${info9.label} didn't accept that key.`);
13420
13469
  }
13421
13470
  await deps.tokenStore.set(key, candidate);
13422
- return { connected: true, providerId: info8.id };
13471
+ return { connected: true, providerId: info9.id };
13423
13472
  }
13424
13473
  async function disconnectPublishCredential(key, deps, options = {}) {
13425
13474
  const existing = await deps.tokenStore.get(key);
@@ -13544,13 +13593,13 @@ import diff3Merge from "diff3";
13544
13593
  // src/lib/remote-auth/repair.ts
13545
13594
  import git7 from "isomorphic-git";
13546
13595
  // src/lib/publish/selections.ts
13547
- import { chmod as chmod2, mkdir as mkdir13, readFile as readFile30, writeFile as writeFile12 } from "node:fs/promises";
13548
- import path23 from "node:path";
13596
+ import { chmod as chmod2, mkdir as mkdir14, readFile as readFile30, writeFile as writeFile12 } from "node:fs/promises";
13597
+ import path24 from "node:path";
13549
13598
  class PublishSelectionsStore {
13550
13599
  filePath;
13551
13600
  queue = Promise.resolve();
13552
13601
  constructor(filePath) {
13553
- this.filePath = filePath ?? path23.join(defaultConfigDir(), "publish-selections.json");
13602
+ this.filePath = filePath ?? path24.join(defaultConfigDir(), "publish-selections.json");
13554
13603
  }
13555
13604
  async read() {
13556
13605
  try {
@@ -13567,7 +13616,7 @@ class PublishSelectionsStore {
13567
13616
  return { version: 1, global: {}, projects: {} };
13568
13617
  }
13569
13618
  async write(data) {
13570
- await mkdir13(path23.dirname(this.filePath), { recursive: true });
13619
+ await mkdir14(path24.dirname(this.filePath), { recursive: true });
13571
13620
  await writeFile12(this.filePath, JSON.stringify(data, null, 2), {
13572
13621
  encoding: "utf8",
13573
13622
  mode: 384
@@ -4,7 +4,7 @@ import {
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "gutterpress",
7
- version: "0.11.9-alpha.1",
7
+ version: "0.11.9-alpha.3",
8
8
  description: "Markdown-to-PDF converter for professional print layout using a native Chromium print engine and Ghostscript.",
9
9
  author: "itlackey",
10
10
  license: "MPL-2.0",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  package_default
3
- } from "./cli-cfymymkv.js";
3
+ } from "./cli-ervhbr00.js";
4
4
  import {
5
5
  execCapture,
6
6
  findTool,
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  UsageError,
7
7
  package_default,
8
8
  rejectUnknownFlags
9
- } from "./cli-cfymymkv.js";
9
+ } from "./cli-ervhbr00.js";
10
10
  import {
11
11
  EXIT_CODES
12
12
  } from "./cli-46ycxe6r.js";
@@ -18,16 +18,16 @@ import {
18
18
  import { defineCommand, parseArgs, runMain } from "citty";
19
19
  import { statSync } from "node:fs";
20
20
  var SUBCOMMANDS = {
21
- new: () => import("./new-6nz32v7c.js").then((m) => m.default),
22
- preview: () => import("./preview-8dcs83k4.js").then((m) => m.default),
23
- build: () => import("./build-xd4bjtbv.js").then((m) => m.default),
24
- publish: () => import("./publish-2ks819pa.js").then((m) => m.default),
25
- lint: () => import("./lint-exc3w24c.js").then((m) => m.default),
26
- validate: () => import("./validate-e8qneem9.js").then((m) => m.default),
27
- audit: () => import("./audit-ydxsev28.js").then((m) => m.default),
28
- preflight: () => import("./preflight-5kq978aq.js").then((m) => m.default),
29
- doctor: () => import("./doctor-b097943h.js").then((m) => m.default),
30
- ext: () => import("./ext-ft6h0qn9.js").then((m) => m.default)
21
+ new: () => import("./new-3a5ng8yv.js").then((m) => m.default),
22
+ preview: () => import("./preview-aska26g4.js").then((m) => m.default),
23
+ build: () => import("./build-9ze0fcgq.js").then((m) => m.default),
24
+ publish: () => import("./publish-jam8mqes.js").then((m) => m.default),
25
+ lint: () => import("./lint-qxcpd3ry.js").then((m) => m.default),
26
+ validate: () => import("./validate-3cwwe0d5.js").then((m) => m.default),
27
+ audit: () => import("./audit-z6hp3dep.js").then((m) => m.default),
28
+ preflight: () => import("./preflight-qwbkp4pq.js").then((m) => m.default),
29
+ doctor: () => import("./doctor-yk3ah4yk.js").then((m) => m.default),
30
+ ext: () => import("./ext-8hrf9n6f.js").then((m) => m.default)
31
31
  };
32
32
  var VERSION = package_default.version;
33
33
  var main = defineCommand({
@@ -52,7 +52,7 @@ async function preflightRequiredInvocations(rawArgs) {
52
52
  const [command, ...commandArgs] = rawArgs;
53
53
  try {
54
54
  if (command === "new") {
55
- const { newArgs } = await import("./new-6nz32v7c.js");
55
+ const { newArgs } = await import("./new-3a5ng8yv.js");
56
56
  rejectUnknownFlags(commandArgs, newArgs, "new");
57
57
  const parsed = parseArgs(commandArgs, {
58
58
  ...newArgs,
@@ -64,7 +64,7 @@ async function preflightRequiredInvocations(rawArgs) {
64
64
  return;
65
65
  }
66
66
  if (command === "preflight") {
67
- const { preflightArgs } = await import("./preflight-5kq978aq.js");
67
+ const { preflightArgs } = await import("./preflight-qwbkp4pq.js");
68
68
  rejectUnknownFlags(commandArgs, preflightArgs, "preflight");
69
69
  const parsed = parseArgs(commandArgs, {
70
70
  ...preflightArgs,
@@ -84,7 +84,7 @@ async function preflightRequiredInvocations(rawArgs) {
84
84
  }
85
85
  if (subcommand.startsWith("-"))
86
86
  return;
87
- const { EXT_SUBCOMMANDS, extAddArgs, extRemoveArgs, extEnableArgs, extDisableArgs } = await import("./ext-ft6h0qn9.js");
87
+ const { EXT_SUBCOMMANDS, extAddArgs, extRemoveArgs, extEnableArgs, extDisableArgs } = await import("./ext-8hrf9n6f.js");
88
88
  if (!EXT_SUBCOMMANDS.includes(subcommand)) {
89
89
  throw new UsageError(`gutterpress ext: unknown command "${subcommand}"`);
90
90
  }
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  getSystemDiagnostics,
3
3
  log
4
- } from "./cli-9a5eacxd.js";
4
+ } from "./cli-nc752ryp.js";
5
5
  import {
6
6
  UsageError,
7
7
  rejectExtraPositionals,
8
8
  rejectUnknownFlags
9
- } from "./cli-cfymymkv.js";
9
+ } from "./cli-ervhbr00.js";
10
10
  import"./cli-c41yr7he.js";
11
11
  import"./cli-46ycxe6r.js";
12
12
  import"./cli-37x76zdn.js";
@@ -4,7 +4,7 @@ import {
4
4
  build,
5
5
  connectChromium,
6
6
  getBrowser
7
- } from "./cli-h91e69hm.js";
7
+ } from "./cli-d8rdk1y7.js";
8
8
  import"./cli-c41yr7he.js";
9
9
  import {
10
10
  BuildError
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  build
3
- } from "./index-71pn94g1.js";
3
+ } from "./index-kqftehgy.js";
4
4
  import {
5
5
  BuildError,
6
6
  RENDER_TIMEOUT_MS,
7
7
  assertMilestone,
8
8
  connectChromium,
9
9
  getBrowser
10
- } from "./index-mks8j9av.js";
10
+ } from "./index-t43k5rq1.js";
11
11
  import"./index-37x76zdn.js";
12
12
 
13
13
  // src/lib/engine.ts
@@ -10,16 +10,16 @@ import {
10
10
  removeExtension,
11
11
  searchNpmExtensions,
12
12
  setExtensionEnabled
13
- } from "./cli-b4ramtgc.js";
14
- import"./cli-9a5eacxd.js";
13
+ } from "./cli-edn2tver.js";
14
+ import"./cli-nc752ryp.js";
15
15
  import {
16
16
  UsageError,
17
17
  exitForUsage,
18
18
  rejectExtraPositionals,
19
19
  rejectUnknownFlags,
20
20
  resolveProjectDir
21
- } from "./cli-cfymymkv.js";
22
- import"./cli-h91e69hm.js";
21
+ } from "./cli-ervhbr00.js";
22
+ import"./cli-d8rdk1y7.js";
23
23
  import"./cli-c41yr7he.js";
24
24
  import {
25
25
  EXIT_CODES
@@ -18,7 +18,7 @@ import {
18
18
  resolveChromiumExecutable,
19
19
  run,
20
20
  spawnCapture
21
- } from "./index-mks8j9av.js";
21
+ } from "./index-t43k5rq1.js";
22
22
  import {
23
23
  PLUGINS_DIR,
24
24
  VENDORED_NPM_DIR,
@@ -4301,7 +4301,7 @@ import git from "isomorphic-git";
4301
4301
  // package.json
4302
4302
  var package_default = {
4303
4303
  name: "gutterpress",
4304
- version: "0.11.9-alpha.1",
4304
+ version: "0.11.9-alpha.3",
4305
4305
  description: "Markdown-to-PDF converter for professional print layout using a native Chromium print engine and Ghostscript.",
4306
4306
  author: "itlackey",
4307
4307
  license: "MPL-2.0",
@@ -8684,7 +8684,7 @@ class PdfOutput {
8684
8684
  const rawPdf = pdfxMode ? path8.join(stage, "raw.pdf") : path8.resolve(pdfFile);
8685
8685
  await fsp2.mkdir(path8.dirname(path8.resolve(pdfFile)), { recursive: true });
8686
8686
  log.info("Rendering HTML to PDF via the Gutterpress engine (native Chromium pagination)");
8687
- const { buildNativePdf } = await import("./engine-s6240qap.js");
8687
+ const { buildNativePdf } = await import("./engine-trte2tg2.js");
8688
8688
  const engineDiagnostics = await buildNativePdf(htmlFile, rawPdf, {
8689
8689
  title: config.title,
8690
8690
  author: config.authors.length > 0 ? config.authors.join(", ") : undefined,
@@ -14794,8 +14794,8 @@ async function repairOnlineBackup(options) {
14794
14794
  return { outcome, movedGitTo, restoredFiles };
14795
14795
  }
14796
14796
  // src/lib/publish/run-publish.ts
14797
- import { readdir as readdir10, stat as stat11 } from "node:fs/promises";
14798
- import path28 from "node:path";
14797
+ import { readdir as readdir10, stat as stat12 } from "node:fs/promises";
14798
+ import path29 from "node:path";
14799
14799
 
14800
14800
  // src/lib/publish/command-runner.ts
14801
14801
  var CAPTURE_LIMIT = 64 * 1024;
@@ -15800,6 +15800,54 @@ var kdpProvider = {
15800
15800
  }
15801
15801
  };
15802
15802
 
15803
+ // src/lib/publish/providers/local-folder.ts
15804
+ import { cp as cp7, mkdir as mkdir19, stat as stat11 } from "node:fs/promises";
15805
+ import path28 from "node:path";
15806
+ var LOCAL_PUBLISH_DEFAULT_DIR = "dist";
15807
+ var info7 = {
15808
+ id: "local",
15809
+ label: "A folder on this computer",
15810
+ kind: "api",
15811
+ format: "pdf",
15812
+ formats: ["pdf", "html"],
15813
+ description: "Save the finished file to a folder you choose.",
15814
+ configFields: [
15815
+ { key: "dir", label: "Folder", placeholder: LOCAL_PUBLISH_DEFAULT_DIR }
15816
+ ],
15817
+ credential: { required: false, host: "" }
15818
+ };
15819
+ function localPublishDir(req) {
15820
+ const dir = typeof req.config.dir === "string" && req.config.dir.trim() ? req.config.dir.trim() : LOCAL_PUBLISH_DEFAULT_DIR;
15821
+ return path28.resolve(req.project.projectDir, dir);
15822
+ }
15823
+ var localFolderProvider = {
15824
+ info: info7,
15825
+ async authenticate() {
15826
+ return { ok: true };
15827
+ },
15828
+ async preflight(req) {
15829
+ const dir = localPublishDir(req);
15830
+ try {
15831
+ const s = await stat11(dir);
15832
+ if (!s.isDirectory()) {
15833
+ return [
15834
+ { severity: "error", id: "local/not-a-folder", message: `${dir} exists but is not a folder.` }
15835
+ ];
15836
+ }
15837
+ } catch {}
15838
+ return [];
15839
+ },
15840
+ async upload(req) {
15841
+ const dir = localPublishDir(req);
15842
+ await mkdir19(dir, { recursive: true });
15843
+ const dest = req.artifact.format === "html" ? dir : path28.join(dir, path28.basename(req.artifact.path));
15844
+ if (path28.resolve(dest) !== path28.resolve(req.artifact.path)) {
15845
+ await cp7(req.artifact.path, dest, { recursive: true });
15846
+ }
15847
+ return { kind: "published", detail: `Saved to ${dest}` };
15848
+ }
15849
+ };
15850
+
15803
15851
  // src/lib/publish/providers/shopify.ts
15804
15852
  var SHOPIFY_HOST = "shopify";
15805
15853
  var DEFAULT_API_VERSION = "2026-04";
@@ -15814,7 +15862,7 @@ function requireValidShop(shop) {
15814
15862
  }
15815
15863
  return shop;
15816
15864
  }
15817
- var info7 = {
15865
+ var info8 = {
15818
15866
  id: "shopify",
15819
15867
  label: "Shopify",
15820
15868
  kind: "api",
@@ -15848,7 +15896,7 @@ function readConfig3(req) {
15848
15896
  async function adminGraphQL(req, query, variables = {}) {
15849
15897
  const { shop: rawShop, apiVersion } = readConfig3(req);
15850
15898
  const shop = requireValidShop(rawShop);
15851
- const resolved = await resolvePublishCredential(info7, req.deps);
15899
+ const resolved = await resolvePublishCredential(info8, req.deps);
15852
15900
  if (!resolved) {
15853
15901
  throw new Error("No Shopify access token found. Connect Shopify (or set SHOPIFY_ADMIN_TOKEN) first.");
15854
15902
  }
@@ -15899,9 +15947,9 @@ function userErrorsToMessage(result) {
15899
15947
  return errs?.length ? errs[0].message : null;
15900
15948
  }
15901
15949
  var shopifyProvider = {
15902
- info: info7,
15950
+ info: info8,
15903
15951
  async authenticate(req) {
15904
- const resolved = await resolvePublishCredential(info7, req.deps);
15952
+ const resolved = await resolvePublishCredential(info8, req.deps);
15905
15953
  if (!resolved) {
15906
15954
  return {
15907
15955
  ok: false,
@@ -16014,6 +16062,7 @@ var shopifyProvider = {
16014
16062
 
16015
16063
  // src/lib/publish/registry.ts
16016
16064
  var PROVIDERS = {
16065
+ local: localFolderProvider,
16017
16066
  itch: itchProvider,
16018
16067
  drivethrurpg: drivethrurpgProvider,
16019
16068
  kdp: kdpProvider,
@@ -16034,14 +16083,14 @@ function publishProviderFor(id) {
16034
16083
  }
16035
16084
 
16036
16085
  // src/lib/publish/run-publish.ts
16037
- function resolvePublishFormat(info8, providerConfig) {
16038
- if (info8.formats && info8.formats.length > 0) {
16086
+ function resolvePublishFormat(info9, providerConfig) {
16087
+ if (info9.formats && info9.formats.length > 0) {
16039
16088
  const configured = typeof providerConfig.format === "string" ? providerConfig.format.trim() : "";
16040
- if (configured && info8.formats.includes(configured)) {
16089
+ if (configured && info9.formats.includes(configured)) {
16041
16090
  return configured;
16042
16091
  }
16043
16092
  }
16044
- return info8.format;
16093
+ return info9.format;
16045
16094
  }
16046
16095
  async function resolvePublishRequest(options, deps) {
16047
16096
  const provider = publishProviderFor(options.providerId);
@@ -16054,9 +16103,9 @@ async function resolvePublishRequest(options, deps) {
16054
16103
  const effectiveDeps = effectiveAccount ? { ...deps, credentialAccount: effectiveAccount } : deps;
16055
16104
  const outDir = resolveOutputDir(manifestDir, config.title);
16056
16105
  const effectiveFormat = resolvePublishFormat(provider.info, providerConfig);
16057
- const defaultArtifact = effectiveFormat === "pdf" ? path28.join(outDir, artifactName(config.title, "pdf")) : outDir;
16106
+ const defaultArtifact = effectiveFormat === "pdf" ? path29.join(outDir, artifactName(config.title, "pdf")) : outDir;
16058
16107
  const artifact = {
16059
- path: options.artifactPath ? path28.resolve(options.projectDir, options.artifactPath) : defaultArtifact,
16108
+ path: options.artifactPath ? path29.resolve(options.projectDir, options.artifactPath) : defaultArtifact,
16060
16109
  format: effectiveFormat
16061
16110
  };
16062
16111
  return {
@@ -16074,7 +16123,7 @@ var PDF_HINT = "Build the PDF first (gutterpress build, or export it from the ap
16074
16123
  var HTML_HINT = "Build the website export first (gutterpress build --format html).";
16075
16124
  async function artifactIssues(artifact) {
16076
16125
  try {
16077
- const s = await stat11(artifact.path);
16126
+ const s = await stat12(artifact.path);
16078
16127
  if (artifact.format === "pdf" && !s.isFile()) {
16079
16128
  return [
16080
16129
  {
@@ -16120,7 +16169,7 @@ async function artifactIssues(artifact) {
16120
16169
  var BUILD_FINGERPRINT_FILENAME = "build-fingerprint.json";
16121
16170
  async function htmlDirIssues(dir) {
16122
16171
  const issues = [];
16123
- const isThere = async (rel) => stat11(path28.join(dir, rel)).then(() => true, () => false);
16172
+ const isThere = async (rel) => stat12(path29.join(dir, rel)).then(() => true, () => false);
16124
16173
  if (!await isThere(BOOK_HTML)) {
16125
16174
  issues.push({
16126
16175
  severity: "error",
@@ -16190,17 +16239,17 @@ function overlayStore(inner, key, candidate) {
16190
16239
  }
16191
16240
  async function connectPublishProvider(options, deps) {
16192
16241
  const provider = publishProviderFor(options.providerId);
16193
- const info8 = provider.info;
16194
- if (!info8.credential.required) {
16195
- throw new Error(`${info8.label} needs no API key — just publish when you're ready.`);
16242
+ const info9 = provider.info;
16243
+ if (!info9.credential.required) {
16244
+ throw new Error(`${info9.label} needs no API key — just publish when you're ready.`);
16196
16245
  }
16197
- if (info8.credential.connect === "oauth") {
16198
- throw new Error(`${info8.label} connects through your browser, not a pasted key — run ` + `"gutterpress publish --provider ${info8.id} --connect" or use the desktop app's Connect button.`);
16246
+ if (info9.credential.connect === "oauth") {
16247
+ throw new Error(`${info9.label} connects through your browser, not a pasted key — run ` + `"gutterpress publish --provider ${info9.id} --connect" or use the desktop app's Connect button.`);
16199
16248
  }
16200
16249
  const token = options.token.trim();
16201
16250
  if (!token)
16202
16251
  throw new Error("Paste an API key first.");
16203
- const host = info8.credential.host;
16252
+ const host = info9.credential.host;
16204
16253
  const account = (options.account ?? "").trim();
16205
16254
  const key = publishCredentialKey(host, account);
16206
16255
  const candidate = {
@@ -16208,12 +16257,12 @@ async function connectPublishProvider(options, deps) {
16208
16257
  kind: "token",
16209
16258
  token,
16210
16259
  ...account ? { username: account } : {},
16211
- label: account || info8.label,
16260
+ label: account || info9.label,
16212
16261
  createdAt: Date.now()
16213
16262
  };
16214
16263
  const req = await resolvePublishRequest({
16215
16264
  projectDir: options.projectDir,
16216
- providerId: info8.id,
16265
+ providerId: info9.id,
16217
16266
  ...options.manifestPath ? { manifestPath: options.manifestPath } : {}
16218
16267
  }, deps);
16219
16268
  const trialDeps = {
@@ -16224,10 +16273,10 @@ async function connectPublishProvider(options, deps) {
16224
16273
  };
16225
16274
  const auth = await provider.authenticate({ ...req, deps: trialDeps });
16226
16275
  if (!auth.ok) {
16227
- throw new Error(auth.message ?? `${info8.label} didn't accept that key.`);
16276
+ throw new Error(auth.message ?? `${info9.label} didn't accept that key.`);
16228
16277
  }
16229
16278
  await deps.tokenStore.set(key, candidate);
16230
- return { connected: true, providerId: info8.id };
16279
+ return { connected: true, providerId: info9.id };
16231
16280
  }
16232
16281
  async function disconnectPublishCredential(key, deps, options = {}) {
16233
16282
  const existing = await deps.tokenStore.get(key);
@@ -16239,13 +16288,13 @@ async function disconnectPublishCredential(key, deps, options = {}) {
16239
16288
  }
16240
16289
  }
16241
16290
  // src/lib/publish/selections.ts
16242
- import { chmod as chmod3, mkdir as mkdir19, readFile as readFile34, writeFile as writeFile17 } from "node:fs/promises";
16243
- import path29 from "node:path";
16291
+ import { chmod as chmod3, mkdir as mkdir20, readFile as readFile34, writeFile as writeFile17 } from "node:fs/promises";
16292
+ import path30 from "node:path";
16244
16293
  class PublishSelectionsStore {
16245
16294
  filePath;
16246
16295
  queue = Promise.resolve();
16247
16296
  constructor(filePath) {
16248
- this.filePath = filePath ?? path29.join(defaultConfigDir(), "publish-selections.json");
16297
+ this.filePath = filePath ?? path30.join(defaultConfigDir(), "publish-selections.json");
16249
16298
  }
16250
16299
  async read() {
16251
16300
  try {
@@ -16262,7 +16311,7 @@ class PublishSelectionsStore {
16262
16311
  return { version: 1, global: {}, projects: {} };
16263
16312
  }
16264
16313
  async write(data) {
16265
- await mkdir19(path29.dirname(this.filePath), { recursive: true });
16314
+ await mkdir20(path30.dirname(this.filePath), { recursive: true });
16266
16315
  await writeFile17(this.filePath, JSON.stringify(data, null, 2), {
16267
16316
  encoding: "utf8",
16268
16317
  mode: 384
@@ -4,7 +4,7 @@ import {
4
4
  launchChromium,
5
5
  marginBoxAlign,
6
6
  marginBoxRectPt
7
- } from "./index-mks8j9av.js";
7
+ } from "./index-t43k5rq1.js";
8
8
 
9
9
  // src/engine/compiler/build.ts
10
10
  import { readFile } from "node:fs/promises";
@@ -593,7 +593,7 @@ import { fileURLToPath } from "node:url";
593
593
  var favicon_default = "./favicon-wkbm9cjn.ico";
594
594
 
595
595
  // src/assets/manifest.schema.json
596
- var manifest_schema_default = "./manifest.schema-hsn8rsgr.json";
596
+ var manifest_schema_default = "./manifest.schema-61bsspsb.json";
597
597
 
598
598
  // src/assets/preview/scripts/preview-interface.js
599
599
  var preview_interface_default = "./preview-interface-9rwz21yw.js";
package/dist/index.js CHANGED
@@ -143,15 +143,15 @@ import {
143
143
  syncProject,
144
144
  testRemoteAccess,
145
145
  validateProjectExtensions
146
- } from "./index-91k91awj.js";
146
+ } from "./index-27xa2tfd.js";
147
147
  import {
148
148
  BUILD_DIAGNOSTIC_CODES
149
- } from "./index-71pn94g1.js";
149
+ } from "./index-kqftehgy.js";
150
150
  import {
151
151
  BuildError,
152
152
  DEFAULT_PRINT_OPTS,
153
153
  readyProbeExpr
154
- } from "./index-mks8j9av.js";
154
+ } from "./index-t43k5rq1.js";
155
155
  import {
156
156
  AUTO_SNAPSHOT_MESSAGE,
157
157
  DEFAULT_NPM_REGISTRY,
@@ -0,0 +1,6 @@
1
+ import type { PublishProvider, PublishRequest } from "../types.ts";
2
+ /** The folder used when `publish.local.dir` is unset — inside the book. */
3
+ export declare const LOCAL_PUBLISH_DEFAULT_DIR = "dist";
4
+ /** The absolute folder for a request: `publish.local.dir` (relative to the book) or the default. */
5
+ export declare function localPublishDir(req: Pick<PublishRequest, "project" | "config">): string;
6
+ export declare const localFolderProvider: PublishProvider;
@@ -33,7 +33,7 @@ export interface PublishConfigField {
33
33
  }
34
34
  /** Stable provider identifiers: the `--provider` values AND the manifest
35
35
  * `publish.<id>` keys — one spelling everywhere. */
36
- export type PublishProviderId = "itch" | "drivethrurpg" | "kdp" | "azure-swa" | "shopify" | "gdrive";
36
+ export type PublishProviderId = "local" | "itch" | "drivethrurpg" | "kdp" | "azure-swa" | "shopify" | "gdrive";
37
37
  /**
38
38
  * How the provider integrates:
39
39
  * - "api" — real programmatic upload (itch.io, Azure SWA, Shopify)
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  MANIFEST_FILENAMES,
3
3
  runLint
4
- } from "./cli-b4ramtgc.js";
4
+ } from "./cli-edn2tver.js";
5
5
  import {
6
6
  log
7
- } from "./cli-9a5eacxd.js";
7
+ } from "./cli-nc752ryp.js";
8
8
  import {
9
9
  UsageError,
10
10
  rejectExtraPositionals,
11
11
  rejectUnknownFlags
12
- } from "./cli-cfymymkv.js";
13
- import"./cli-h91e69hm.js";
12
+ } from "./cli-ervhbr00.js";
13
+ import"./cli-d8rdk1y7.js";
14
14
  import"./cli-c41yr7he.js";
15
15
  import {
16
16
  EXIT_CODES
@@ -424,6 +424,15 @@
424
424
  "type": "object",
425
425
  "description": "Publish provider settings, keyed by the same provider id `gutterpress publish --provider <id>` takes. Non-secret configuration only — API keys and tokens are stored in the host credential store, never in this file.",
426
426
  "properties": {
427
+ "local": {
428
+ "type": "object",
429
+ "description": "A folder on this computer — where the desktop's Publish builds the book before sending it anywhere else (default: `dist` inside the book)",
430
+ "properties": {
431
+ "dir": { "type": "string", "description": "Output folder, relative to the book or absolute. Default: dist" },
432
+ "format": { "type": "string", "enum": ["pdf", "html"], "description": "Which build to save (default: pdf)" }
433
+ },
434
+ "additionalProperties": true
435
+ },
427
436
  "itch": {
428
437
  "type": "object",
429
438
  "description": "itch.io publishing (uploaded with butler)",
@@ -7,16 +7,16 @@ import {
7
7
  TARGET_IDS,
8
8
  scaffoldExtension,
9
9
  scaffoldProject
10
- } from "./cli-b4ramtgc.js";
10
+ } from "./cli-edn2tver.js";
11
11
  import {
12
12
  resolveGhostscript
13
- } from "./cli-9a5eacxd.js";
13
+ } from "./cli-nc752ryp.js";
14
14
  import {
15
15
  UsageError,
16
16
  rejectExtraPositionals,
17
17
  rejectUnknownFlags
18
- } from "./cli-cfymymkv.js";
19
- import"./cli-h91e69hm.js";
18
+ } from "./cli-ervhbr00.js";
19
+ import"./cli-d8rdk1y7.js";
20
20
  import {
21
21
  isToolAvailable
22
22
  } from "./cli-c41yr7he.js";
@@ -2,16 +2,16 @@ import {
2
2
  executeValidation,
3
3
  publishTargetFor,
4
4
  reportMissingTools
5
- } from "./cli-b4ramtgc.js";
5
+ } from "./cli-edn2tver.js";
6
6
  import {
7
7
  log
8
- } from "./cli-9a5eacxd.js";
8
+ } from "./cli-nc752ryp.js";
9
9
  import {
10
10
  UsageError,
11
11
  rejectExtraPositionals,
12
12
  rejectUnknownFlags
13
- } from "./cli-cfymymkv.js";
14
- import"./cli-h91e69hm.js";
13
+ } from "./cli-ervhbr00.js";
14
+ import"./cli-d8rdk1y7.js";
15
15
  import"./cli-c41yr7he.js";
16
16
  import {
17
17
  EXIT_CODES
@@ -6,10 +6,10 @@ import {
6
6
  runBuild,
7
7
  splitOutPath,
8
8
  startPreviewServer
9
- } from "./cli-b4ramtgc.js";
9
+ } from "./cli-edn2tver.js";
10
10
  import {
11
11
  log
12
- } from "./cli-9a5eacxd.js";
12
+ } from "./cli-nc752ryp.js";
13
13
  import {
14
14
  UsageError,
15
15
  parseFormat,
@@ -17,8 +17,8 @@ import {
17
17
  rejectExtraPositionals,
18
18
  rejectUnknownFlags,
19
19
  resolvePort
20
- } from "./cli-cfymymkv.js";
21
- import"./cli-h91e69hm.js";
20
+ } from "./cli-ervhbr00.js";
21
+ import"./cli-d8rdk1y7.js";
22
22
  import"./cli-c41yr7he.js";
23
23
  import {
24
24
  BuildError
@@ -11,17 +11,17 @@ import {
11
11
  publishProviderFor,
12
12
  resolvePublishFormat,
13
13
  runPublish
14
- } from "./cli-b4ramtgc.js";
14
+ } from "./cli-edn2tver.js";
15
15
  import {
16
16
  FileTokenStore,
17
17
  log
18
- } from "./cli-9a5eacxd.js";
18
+ } from "./cli-nc752ryp.js";
19
19
  import {
20
20
  UsageError,
21
21
  rejectExtraPositionals,
22
22
  rejectUnknownFlags
23
- } from "./cli-cfymymkv.js";
24
- import"./cli-h91e69hm.js";
23
+ } from "./cli-ervhbr00.js";
24
+ import"./cli-d8rdk1y7.js";
25
25
  import"./cli-c41yr7he.js";
26
26
  import {
27
27
  EXIT_CODES
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  executeAndReport
3
- } from "./cli-b4ramtgc.js";
3
+ } from "./cli-edn2tver.js";
4
4
  import {
5
5
  log
6
- } from "./cli-9a5eacxd.js";
6
+ } from "./cli-nc752ryp.js";
7
7
  import {
8
8
  UsageError,
9
9
  rejectExtraPositionals,
10
10
  rejectUnknownFlags
11
- } from "./cli-cfymymkv.js";
12
- import"./cli-h91e69hm.js";
11
+ } from "./cli-ervhbr00.js";
12
+ import"./cli-d8rdk1y7.js";
13
13
  import"./cli-c41yr7he.js";
14
14
  import {
15
15
  EXIT_CODES
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gutterpress",
3
- "version": "0.11.9-alpha.1",
3
+ "version": "0.11.9-alpha.3",
4
4
  "description": "Markdown-to-PDF converter for professional print layout using a native Chromium print engine and Ghostscript.",
5
5
  "author": "itlackey",
6
6
  "license": "MPL-2.0",