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.
- package/bin/fluncle.mjs +26 -12
- 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.
|
|
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.
|
|
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)
|
|
3443
|
-
|
|
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: [
|
|
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
|
|
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