fluncle 0.205.0 → 0.207.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 +26 -12
  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.205.0".trim() ? "0.205.0".trim() : "0.1.0";
613
+ currentVersion = "0.207.0".trim() ? "0.207.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.205.0".trim() ? "0.205.0".trim() : "0.1.0";
2455
+ currentVersion2 = "0.207.0".trim() ? "0.207.0".trim() : "0.1.0";
2456
2456
  });
2457
2457
 
2458
2458
  // ../../packages/registry/src/index.ts
@@ -3439,9 +3439,8 @@ var init_src = __esm(() => {
3439
3439
  ],
3440
3440
  kind: "app",
3441
3441
  name: "app.ios",
3442
- operatorNotes: "Fluncle for iOS (apps/mobile). PENDING App Store review DARK until approval, then flip `pending` + set the assigned listing URL. No probeConfig: a vendor store listing is not one of our own health-probeable endpoints (the box prober walks web/r2/dns/ssh + the crons, never an external GET), and Apple would bot-block or redirect a bare GET and read back as a false 'down' — the extension.lens ruling, which dropped its probeConfig on going live for the same reason.",
3443
- pending: true,
3444
- url: "https://apps.apple.com/search?term=fluncle",
3442
+ operatorNotes: "Fluncle for iOS (apps/mobile), LIVE on the App Store (approved 2026-07-29). Store listing reachability is Apple's, not ours, so it is not on the /status board the extension.lens ruling: a vendor store would bot-block or redirect a bare GET and read back as a false 'down'.",
3443
+ url: "https://apps.apple.com/app/id6790080540",
3445
3444
  weights: { web: "secondary" }
3446
3445
  },
3447
3446
  {
@@ -3768,13 +3767,15 @@ var init_src = __esm(() => {
3768
3767
  weights: { status: "hidden" }
3769
3768
  },
3770
3769
  {
3771
- command: "fluncle admin backfills discogs && fluncle admin backfills lastfm",
3772
- exposedContent: ["Discogs id + Last.fm love catalogue repair (--no-agent, Worker HTTP)"],
3770
+ command: "fluncle admin backfills discogs && fluncle admin backfills lastfm && fluncle admin backfills apple-music && fluncle admin backfills apple-catalogue",
3771
+ exposedContent: [
3772
+ "Discogs id + Last.fm love + Apple Music link repair, findings then catalogue (--no-agent, Worker HTTP)"
3773
+ ],
3773
3774
  kind: "cron",
3774
3775
  name: "cron.backfill",
3775
3776
  operatorNotes: "every 30m. Pure HTTP driving, zero LLM tokens. Agent tier.",
3776
3777
  probeConfig: { cadenceMs: 30 * MINUTE_MS, cronName: "fluncle-backfill", kind: "cron" },
3777
- statusDescription: "repairs Discogs ids and Last.fm loves",
3778
+ statusDescription: "repairs Discogs ids, Last.fm loves, and Apple Music links",
3778
3779
  title: "Metadata backfill",
3779
3780
  weights: { status: "hidden" }
3780
3781
  },
@@ -6836,6 +6837,9 @@ function buildBioBody(options) {
6836
6837
  if (options.dryRun) {
6837
6838
  body.dryRun = true;
6838
6839
  }
6840
+ if (options.finalAttempt) {
6841
+ body.finalAttempt = true;
6842
+ }
6839
6843
  if (typeof options.promptVersion === "number") {
6840
6844
  body.promptVersion = options.promptVersion;
6841
6845
  }
@@ -6890,6 +6894,9 @@ function buildBioBody2(options) {
6890
6894
  if (options.dryRun) {
6891
6895
  body.dryRun = true;
6892
6896
  }
6897
+ if (options.finalAttempt) {
6898
+ body.finalAttempt = true;
6899
+ }
6893
6900
  if (typeof options.promptVersion === "number") {
6894
6901
  body.promptVersion = options.promptVersion;
6895
6902
  }
@@ -10325,7 +10332,7 @@ function addAdminCommands(program2) {
10325
10332
  const { resolveArtistCommand: resolveArtistCommand2 } = await Promise.resolve().then(() => (init_admin_artists(), exports_admin_artists));
10326
10333
  await runArtistResolve(artistId, options, resolveArtistCommand2);
10327
10334
  });
10328
- artists.command("describe").description("Author the voiced bio for an artist (fills an empty bio only)").argument("[slug]").option("--queue", "Show the bio worklist (artists with findings but no bio), oldest first", false).option("--limit <limit>", "Number of artists to show with --queue", "50").option("--bio <text>", "The voice-gated bio paragraph").option("--bio-file <file>", "Read the bio from a file").option("--prompt-version <n>", "The prompt-registry version that authored the bio (the sweep sends this; it is the bio's provenance)").option("--dry-run", "Run the voice gate and report the verdict without storing anything", false).option("--json", "Print JSON", false).allowExcessArguments().action(async (slug, options) => {
10335
+ artists.command("describe").description("Author the voiced bio for an artist (fills an empty bio only)").argument("[slug]").option("--queue", "Show the bio worklist (artists with findings but no bio), oldest first", false).option("--limit <limit>", "Number of artists to show with --queue", "50").option("--bio <text>", "The voice-gated bio paragraph").option("--bio-file <file>", "Read the bio from a file").option("--prompt-version <n>", "The prompt-registry version that authored the bio (the sweep sends this; it is the bio's provenance)").option("--dry-run", "Run the voice gate and report the verdict without storing anything", false).option("--final-attempt", "The sweep's third and last authoring pass: store the draft even if the voice scan refuses it (the length bounds still apply, and the write is flagged for review)", false).option("--json", "Print JSON", false).allowExcessArguments().action(async (slug, options) => {
10329
10336
  if (options.queue) {
10330
10337
  const { artistsBioQueueCommand: artistsBioQueueCommand2 } = await Promise.resolve().then(() => (init_admin_artists(), exports_admin_artists));
10331
10338
  await runEntityBioQueue("artist", options, artistsBioQueueCommand2);
@@ -10346,7 +10353,7 @@ function addAdminCommands(program2) {
10346
10353
  labels.action(() => {
10347
10354
  labels.outputHelp();
10348
10355
  });
10349
- labels.command("describe").description("Author the voiced bio for a label (fills an empty bio only)").argument("[slug]").option("--queue", "Show the bio worklist (labels with findings but no bio), oldest first", false).option("--limit <limit>", "Number of labels to show with --queue", "50").option("--bio <text>", "The voice-gated bio paragraph").option("--bio-file <file>", "Read the bio from a file").option("--prompt-version <n>", "The prompt-registry version that authored the bio (the sweep sends this; it is the bio's provenance)").option("--dry-run", "Run the voice gate and report the verdict without storing anything", false).option("--json", "Print JSON", false).allowExcessArguments().action(async (slug, options) => {
10356
+ labels.command("describe").description("Author the voiced bio for a label (fills an empty bio only)").argument("[slug]").option("--queue", "Show the bio worklist (labels with findings but no bio), oldest first", false).option("--limit <limit>", "Number of labels to show with --queue", "50").option("--bio <text>", "The voice-gated bio paragraph").option("--bio-file <file>", "Read the bio from a file").option("--prompt-version <n>", "The prompt-registry version that authored the bio (the sweep sends this; it is the bio's provenance)").option("--dry-run", "Run the voice gate and report the verdict without storing anything", false).option("--final-attempt", "The sweep's third and last authoring pass: store the draft even if the voice scan refuses it (the length bounds still apply, and the write is flagged for review)", false).option("--json", "Print JSON", false).allowExcessArguments().action(async (slug, options) => {
10350
10357
  if (options.queue) {
10351
10358
  const { labelsBioQueueCommand: labelsBioQueueCommand2 } = await Promise.resolve().then(() => (init_admin_labels(), exports_admin_labels));
10352
10359
  await runEntityBioQueue("label", options, labelsBioQueueCommand2);
@@ -10398,7 +10405,7 @@ function addAdminCommands(program2) {
10398
10405
  albums.action(() => {
10399
10406
  albums.outputHelp();
10400
10407
  });
10401
- albums.command("describe").description("Author the voiced bio for an album (fills an empty bio only)").argument("[slug]").option("--queue", "Show the bio worklist (albums with findings but no bio), oldest first", false).option("--limit <limit>", "Number of albums to show with --queue", "50").option("--bio <text>", "The voice-gated bio paragraph").option("--bio-file <file>", "Read the bio from a file").option("--prompt-version <n>", "The prompt-registry version that authored the bio (the sweep sends this; it is the bio's provenance)").option("--dry-run", "Run the voice gate and report the verdict without storing anything", false).option("--json", "Print JSON", false).allowExcessArguments().action(async (slug, options) => {
10408
+ albums.command("describe").description("Author the voiced bio for an album (fills an empty bio only)").argument("[slug]").option("--queue", "Show the bio worklist (albums with findings but no bio), oldest first", false).option("--limit <limit>", "Number of albums to show with --queue", "50").option("--bio <text>", "The voice-gated bio paragraph").option("--bio-file <file>", "Read the bio from a file").option("--prompt-version <n>", "The prompt-registry version that authored the bio (the sweep sends this; it is the bio's provenance)").option("--dry-run", "Run the voice gate and report the verdict without storing anything", false).option("--final-attempt", "The sweep's third and last authoring pass: store the draft even if the voice scan refuses it (the length bounds still apply, and the write is flagged for review)", false).option("--json", "Print JSON", false).allowExcessArguments().action(async (slug, options) => {
10402
10409
  if (options.queue) {
10403
10410
  const { albumsBioQueueCommand: albumsBioQueueCommand2 } = await Promise.resolve().then(() => (init_admin_albums(), exports_admin_albums));
10404
10411
  await runEntityBioQueue("album", options, albumsBioQueueCommand2);
@@ -10535,11 +10542,12 @@ async function runTrackNote(idOrLogId, options, trackNoteCommand2) {
10535
10542
  async function runEntityDescribe(kind, slug, options, describeCommand) {
10536
10543
  const bio = options.bioFile ? readFileSync7(options.bioFile, "utf8") : options.bio;
10537
10544
  if (!slug || !bio || !bio.trim()) {
10538
- throw new Error(`Usage: fluncle admin ${kind}s describe <slug> (--bio <text> | --bio-file <file>) [--dry-run] [--json]`);
10545
+ throw new Error(`Usage: fluncle admin ${kind}s describe <slug> (--bio <text> | --bio-file <file>) [--dry-run] [--final-attempt] [--json]`);
10539
10546
  }
10540
10547
  const result = await describeCommand(slug, {
10541
10548
  bio: bio.trim(),
10542
10549
  dryRun: options.dryRun,
10550
+ finalAttempt: options.finalAttempt,
10543
10551
  promptVersion: parsePromptVersion(options.promptVersion)
10544
10552
  });
10545
10553
  if (options.json) {
@@ -10557,6 +10565,12 @@ async function runEntityDescribe(kind, slug, options, describeCommand) {
10557
10565
  }
10558
10566
  console.log(`Authored the bio for ${result.slug}:`);
10559
10567
  console.log(` ${result.bio}`);
10568
+ if (result.gateBypassed) {
10569
+ console.log(" FINAL ATTEMPT \u2014 the voice gate refused this bio and it was stored anyway:");
10570
+ for (const violation of result.voiceViolations ?? []) {
10571
+ console.log(` - ${violation}`);
10572
+ }
10573
+ }
10560
10574
  }
10561
10575
  async function runEntityBioQueue(kind, options, queueCommand2) {
10562
10576
  const limit = options.limit ? Number.parseInt(options.limit, 10) : 50;
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.205.0"
34
+ "version": "0.207.0"
35
35
  }