fluncle 0.217.0 → 0.219.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 (2) hide show
  1. package/bin/fluncle.mjs +36 -15
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -610,7 +610,7 @@ function parseVersion(version) {
610
610
  var currentVersion;
611
611
  var init_version = __esm(() => {
612
612
  init_output();
613
- currentVersion = "0.217.0".trim() ? "0.217.0".trim() : "0.1.0";
613
+ currentVersion = "0.219.0".trim() ? "0.219.0".trim() : "0.1.0";
614
614
  });
615
615
 
616
616
  // src/update-notifier.ts
@@ -2452,7 +2452,7 @@ function parseVersion2(version) {
2452
2452
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2453
2453
  var init_version2 = __esm(() => {
2454
2454
  init_output();
2455
- currentVersion2 = "0.217.0".trim() ? "0.217.0".trim() : "0.1.0";
2455
+ currentVersion2 = "0.219.0".trim() ? "0.219.0".trim() : "0.1.0";
2456
2456
  });
2457
2457
 
2458
2458
  // ../../packages/registry/src/index.ts
@@ -2779,7 +2779,7 @@ var init_src = __esm(() => {
2779
2779
  },
2780
2780
  {
2781
2781
  exposedContent: [
2782
- "the R2 media zone each finding's video bundle + mixtape audio",
2782
+ "the R2 media zone: each finding's video bundle and mixtape audio",
2783
2783
  "the /cdn-cgi/media transform base (same zone, no cross-origin)"
2784
2784
  ],
2785
2785
  kind: "subdomain",
@@ -2810,7 +2810,7 @@ var init_src = __esm(() => {
2810
2810
  },
2811
2811
  {
2812
2812
  exposedContent: [
2813
- "the Tor onion mirror of www.fluncle.com the archive, API, RSS, and MCP over Tor"
2813
+ "the Tor onion mirror of www.fluncle.com: the archive, API, RSS, and MCP over Tor"
2814
2814
  ],
2815
2815
  kind: "subdomain",
2816
2816
  name: "subdomain.onion",
@@ -7114,13 +7114,16 @@ async function mergeLabelCommand(losingSlug, canonicalSlug) {
7114
7114
  const response = await adminApiPost(`/api/v1/admin/labels/${encodeURIComponent(losingSlug)}/merge`, { canonicalSlug });
7115
7115
  return response.result;
7116
7116
  }
7117
- async function updateLabelCommand(slugOrId, seedState) {
7117
+ async function updateLabelCommand(slugOrId, seedState, rewalk = false) {
7118
7118
  const { labels } = await adminApiGet("/api/v1/admin/labels");
7119
7119
  const match = labels.find((label) => label.slug === slugOrId || label.id === slugOrId);
7120
7120
  if (!match) {
7121
7121
  throw new Error(`No label with slug or id '${slugOrId}' — check \`fluncle labels\``);
7122
7122
  }
7123
- const response = await adminApiPatch(`/api/v1/admin/labels/${encodeURIComponent(match.id)}`, { seedState });
7123
+ const response = await adminApiPatch(`/api/v1/admin/labels/${encodeURIComponent(match.id)}`, {
7124
+ ...rewalk ? { rewalk: true } : {},
7125
+ ...seedState === undefined ? {} : { seedState }
7126
+ });
7124
7127
  return response.label;
7125
7128
  }
7126
7129
  async function describeLabelCommand(slug, options) {
@@ -9678,6 +9681,18 @@ function toJsonFailure(error) {
9678
9681
  init_util();
9679
9682
 
9680
9683
  // src/cli.ts
9684
+ function labelUpdateLines(label, options) {
9685
+ const lines = [];
9686
+ if (options.seedState !== undefined) {
9687
+ lines.push(`${label.name} (${label.slug}) \u2192 ${label.seedState}.`);
9688
+ lines.push(label.seedState === "enabled" ? " The next crawl seeds from it and stores its releases." : " The next crawl will not seed from it; nothing already stored is touched.");
9689
+ }
9690
+ if (options.rewalk) {
9691
+ lines.push(`${label.name} (${label.slug}) \u2192 scoped re-walk armed.`);
9692
+ lines.push(" The next crawl rechecks its MusicBrainz releases.");
9693
+ }
9694
+ return lines;
9695
+ }
9681
9696
  function createProgram() {
9682
9697
  const program2 = configureCommand(new Command);
9683
9698
  program2.name("fluncle").description(fluncleTagline.toLowerCase()).option("--env <local|production>", "Config profile to load (default: production)").showSuggestionAfterError(false).addHelpCommand("help [command]", "display help for command").hook("preAction", (_thisCommand, actionCommand) => {
@@ -10471,14 +10486,15 @@ JSON field reference:
10471
10486
  });
10472
10487
  reach.command("collect").description("Collect + record one daily reach snapshot across every platform").option("--json", "Print JSON", false).action(async (options) => {
10473
10488
  const { reachCollectCommand: reachCollectCommand2 } = await Promise.resolve().then(() => (init_admin_reach(), exports_admin_reach));
10474
- const { collected, inserted, skipped } = await reachCollectCommand2();
10489
+ const { collected, failed, inserted, skipped } = await reachCollectCommand2();
10475
10490
  if (options.json) {
10476
- printJson({ collected, inserted, ok: true, skipped });
10491
+ printJson({ collected, failed, inserted, ok: true, skipped });
10477
10492
  return;
10478
10493
  }
10479
10494
  const landed = collected.map((entry) => `${entry.platform} (${entry.metrics.join(", ")})`).join("; ");
10480
- const missed = skipped.map((entry) => `${entry.platform}: ${entry.reason}`).join("; ");
10481
- console.log(`Collected ${collected.length} platform(s), wrote ${inserted} new row(s).${landed ? ` Landed: ${landed}.` : ""}${missed ? ` Skipped: ${missed}.` : ""}`);
10495
+ const missed = skipped.map((entry) => `${entry.platform} (${entry.kind}): ${entry.reason}`).join("; ");
10496
+ const faults = failed.map((entry) => `${entry.platform}: ${entry.reason}`).join("; ");
10497
+ console.log(`Collected ${collected.length} platform(s), wrote ${inserted} new row(s).${landed ? ` Landed: ${landed}.` : ""}${missed ? ` Skipped: ${missed}.` : ""}${faults ? ` Failed: ${faults}.` : ""}`);
10482
10498
  });
10483
10499
  const backfill = configureCommand(admin.command("backfills").description("Backfill operator-only archives"));
10484
10500
  backfill.action(() => {
@@ -10591,19 +10607,23 @@ JSON field reference:
10591
10607
  const { draftLabelBioCommand: draftLabelBioCommand2 } = await Promise.resolve().then(() => (init_admin_labels(), exports_admin_labels));
10592
10608
  await runEntityBioDraft("label", slug, options, draftLabelBioCommand2);
10593
10609
  });
10594
- labels.command("update").description("Rule on a label's crawl-seed state (operator; next crawl only, never storage)").argument("<slug>", "The label's slug (an exact lbl_\u2026 id also works)").option("--seed-state <state>", "The ruling: enabled, disabled, or undecided").option("--json", "Print JSON", false).action(async (slug, options) => {
10610
+ labels.command("update").description("Rule on a label's crawl scope or arm a scoped re-walk (operator)").argument("<slug>", "The label's slug (an exact lbl_\u2026 id also works)").option("--seed-state <state>", "The ruling: enabled, disabled, or undecided").option("--rewalk", "Arm a scoped re-walk without changing the ruling", false).option("--json", "Print JSON", false).action(async (slug, options) => {
10595
10611
  const seedState = options.seedState;
10596
- if (seedState !== "enabled" && seedState !== "disabled" && seedState !== "undecided") {
10612
+ if (seedState !== undefined && seedState !== "enabled" && seedState !== "disabled" && seedState !== "undecided") {
10597
10613
  throw new Error("Pass --seed-state enabled|disabled|undecided");
10598
10614
  }
10615
+ if (seedState === undefined && !options.rewalk) {
10616
+ throw new Error("Pass --seed-state enabled|disabled|undecided or --rewalk");
10617
+ }
10599
10618
  const { updateLabelCommand: updateLabelCommand2 } = await Promise.resolve().then(() => (init_admin_labels(), exports_admin_labels));
10600
- const label = await updateLabelCommand2(slug, seedState);
10619
+ const label = await updateLabelCommand2(slug, seedState, options.rewalk);
10601
10620
  if (options.json) {
10602
10621
  printJson({ label, ok: true });
10603
10622
  return;
10604
10623
  }
10605
- console.log(`${label.name} (${label.slug}) \u2192 ${label.seedState}.`);
10606
- console.log(label.seedState === "enabled" ? " The next crawl seeds from it and stores its releases." : " The next crawl will not seed from it; nothing already stored is touched.");
10624
+ for (const line of labelUpdateLines(label, options)) {
10625
+ console.log(line);
10626
+ }
10607
10627
  });
10608
10628
  labels.command("merge").description("Merge a slug-split label into its canonical row (operator; re-points + redirects)").argument("<losingSlug>", "The duplicate label to fold away").argument("<canonicalSlug>", "The label to keep \u2014 everything re-points onto it").option("--json", "Print JSON", false).action(async (losingSlug, canonicalSlug, options) => {
10609
10629
  const { mergeLabelCommand: mergeLabelCommand2 } = await Promise.resolve().then(() => (init_admin_labels(), exports_admin_labels));
@@ -13614,5 +13634,6 @@ if (__require.main == __require.module) {
13614
13634
  }
13615
13635
  export {
13616
13636
  parseTelemetryTimestamp,
13637
+ labelUpdateLines,
13617
13638
  createProgram
13618
13639
  };
package/package.json CHANGED
@@ -31,5 +31,5 @@
31
31
  "url": "git+https://github.com/mauricekleine/fluncle.git"
32
32
  },
33
33
  "type": "module",
34
- "version": "0.217.0"
34
+ "version": "0.219.0"
35
35
  }