fluncle 0.182.0 → 0.184.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 +9 -8
- package/package.json +1 -1
package/bin/fluncle.mjs
CHANGED
|
@@ -561,7 +561,7 @@ function parseVersion(version) {
|
|
|
561
561
|
var currentVersion;
|
|
562
562
|
var init_version = __esm(() => {
|
|
563
563
|
init_output();
|
|
564
|
-
currentVersion = "0.
|
|
564
|
+
currentVersion = "0.184.0".trim() ? "0.184.0".trim() : "0.1.0";
|
|
565
565
|
});
|
|
566
566
|
|
|
567
567
|
// src/update-notifier.ts
|
|
@@ -2260,7 +2260,7 @@ function parseVersion2(version) {
|
|
|
2260
2260
|
var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
|
|
2261
2261
|
var init_version2 = __esm(() => {
|
|
2262
2262
|
init_output();
|
|
2263
|
-
currentVersion2 = "0.
|
|
2263
|
+
currentVersion2 = "0.184.0".trim() ? "0.184.0".trim() : "0.1.0";
|
|
2264
2264
|
});
|
|
2265
2265
|
|
|
2266
2266
|
// ../../packages/registry/src/index.ts
|
|
@@ -2421,6 +2421,7 @@ var init_src = __esm(() => {
|
|
|
2421
2421
|
{
|
|
2422
2422
|
discoveryUrl: `${SITE}/llms.txt`,
|
|
2423
2423
|
exposedContent: [
|
|
2424
|
+
"/artists — one A–Z index of every drum & bass artist Fluncle holds",
|
|
2424
2425
|
"/artist/:slug — one artist's page: its findings, its identity links, and the rest of its catalogue"
|
|
2425
2426
|
],
|
|
2426
2427
|
kind: "web_route",
|
|
@@ -2433,12 +2434,12 @@ var init_src = __esm(() => {
|
|
|
2433
2434
|
{
|
|
2434
2435
|
discoveryUrl: `${SITE}/llms.txt`,
|
|
2435
2436
|
exposedContent: [
|
|
2436
|
-
"/labels — every record label Fluncle
|
|
2437
|
+
"/labels — one A–Z index of every drum & bass record label Fluncle holds",
|
|
2437
2438
|
"/label/:slug — one label: its findings, the artists on it, and the rest of its catalogue"
|
|
2438
2439
|
],
|
|
2439
2440
|
kind: "web_route",
|
|
2440
2441
|
name: "web.labels",
|
|
2441
|
-
operatorNotes: "The label half of the graph (log ↔ artist ↔ label ↔ album). The INDEX is probeable (always 200); the slug page is not, so the probe targets /labels. A label below the renderable-track floor renders noindex + stays out of the sitemap (the ARTIST_INDEX_MIN_FINDINGS precedent). The page is BLIND to the label's crawl seed_state — that is crawl scope, never storage (docs/label-entity.md); the operator's ruling station is /admin/labels.",
|
|
2442
|
+
operatorNotes: "The label half of the graph (log ↔ artist ↔ label ↔ album). The INDEX is probeable (always 200); the slug page is not, so the probe targets /labels. /labels is ONE unified A–Z index of every label Fluncle holds (certified lit, catalogue unlit), paged behind ?page=N. A label below the renderable-track floor renders noindex + stays out of the sitemap (the ARTIST_INDEX_MIN_FINDINGS precedent). The page is BLIND to the label's crawl seed_state — that is crawl scope, never storage (docs/label-entity.md); the operator's ruling station is /admin/labels.",
|
|
2442
2443
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2443
2444
|
route: "/labels",
|
|
2444
2445
|
url: `${SITE}/labels`,
|
|
@@ -2447,12 +2448,12 @@ var init_src = __esm(() => {
|
|
|
2447
2448
|
{
|
|
2448
2449
|
discoveryUrl: `${SITE}/llms.txt`,
|
|
2449
2450
|
exposedContent: [
|
|
2450
|
-
"/albums — every
|
|
2451
|
+
"/albums — one alphabetical index of every drum & bass album Fluncle holds",
|
|
2451
2452
|
"/album/:slug — one record: its findings, its artists, its label, and the rest of its tracklist"
|
|
2452
2453
|
],
|
|
2453
2454
|
kind: "web_route",
|
|
2454
2455
|
name: "web.albums",
|
|
2455
|
-
operatorNotes: "The album half of the graph, and the node that closes it: the album page carries the album → label edge (a link, plus `albumRelease.recordLabel` in its MusicAlbum JSON-LD). The INDEX is probeable (always 200); the slug page is not.
|
|
2456
|
+
operatorNotes: "The album half of the graph, and the node that closes it: the album page carries the album → label edge (a link, plus `albumRelease.recordLabel` in its MusicAlbum JSON-LD). The INDEX is probeable (always 200); the slug page is not. /albums is ONE unified alphabetical index of every record Fluncle holds (certified lit, catalogue unlit), paged behind ?page=N; a crawl-minted findings-free album is PUBLIC on its content — a row renders its page, a below-floor page renders noindex + stays out of the sitemap, like a discovered label (docs/album-entity.md).",
|
|
2456
2457
|
probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
|
|
2457
2458
|
route: "/albums",
|
|
2458
2459
|
url: `${SITE}/albums`,
|
|
@@ -3134,7 +3135,7 @@ var init_src = __esm(() => {
|
|
|
3134
3135
|
],
|
|
3135
3136
|
kind: "cron",
|
|
3136
3137
|
name: "cron.label-releases",
|
|
3137
|
-
operatorNotes: "every 24h, run by a rave-02 HOST systemd timer (docs/agents/hermes/label-releases-timer/). The FRESHNESS TAP (D8): MusicBrainz WALKS the graph (cron.crawl) but lags a release ~2 weeks; Spotify has it day one, so this mints METADATA-ONLY catalogue rows (a `tracks` row with no `findings` row) for each ENABLED seed label's fresh releases with their real dates — closing the /fresh lag cliff.
|
|
3138
|
+
operatorNotes: "every 24h, run by a rave-02 HOST systemd timer (docs/agents/hermes/label-releases-timer/). The FRESHNESS TAP (D8): MusicBrainz WALKS the graph (cron.crawl) but lags a release ~2 weeks; Spotify has it day one, so this mints METADATA-ONLY catalogue rows (a `tracks` row with no `findings` row) for each ENABLED seed label's fresh releases with their real dates — closing the /fresh lag cliff. The WORKER does all of it (`backfill_label_releases`, agent tier): it searches the official Spotify API (`label:\"<name>\" tag:new`), reads each hit as a SINGLE `GET /albums/{id}` then `GET /tracks/{id}` (the batch endpoints are 403 at our tier), and mints. The box sweep is a thin HTTP TRIGGER that POSTs bounded passes with the agent token — no vendor token, no CLI dependency (a pinned box CLI missing a flag broke an earlier run). The gate, both required: artist-grounding (an album's Spotify artist already in `artists.spotify_artist_id` — the PRIMARY anchor that stops cross-genre homonym junk) AND an EXACT fold-match of the seed name in the ℗/© copyright; an album with no release_date is dropped outright (/fresh could never show it). BUDGET: the tap shares the official app's per-app window with the user-facing paths, so it paces itself against the shared call meter and stops at a FRACTION of the window (its own ceiling) — user write paths get the window, the tap takes only slack. Hitting that ceiling ends the pass cleanly and the durable per-label cadence stamps resume it next tick. It certifies nothing, publishes nothing, never widens the graph (no new labels, no artist hops). Deduped against the MB crawl from both directions (Spotify id/uri/ISRC + same-album title fold). No vendor spend and zero LLM tokens. Source: docs/agents/hermes/scripts/label-releases-sweep.*. See docs/catalogue-crawler.md.",
|
|
3138
3139
|
probeConfig: {
|
|
3139
3140
|
cadenceMs: 24 * 60 * MINUTE_MS,
|
|
3140
3141
|
cronName: "fluncle-label-releases",
|
|
@@ -11715,7 +11716,7 @@ async function runCatalogueList(options, catalogueListCommand2) {
|
|
|
11715
11716
|
const dupWhy = dup ? `already in the archive \u2014 ${dup.logId ? `${dup.logId} ` : ""}${dup.artists.join(", ")} \u2014 ${dup.title}` : null;
|
|
11716
11717
|
if (options.lens === "capture") {
|
|
11717
11718
|
const reason = track.captureReason;
|
|
11718
|
-
const why2 = dupWhy ?? (reason?.kind === "artist" ? `${reason.name} is already in the archive` : reason?.kind === "label" ? `${reason.name} already carries a finding` : reason?.kind === "seed-label" ? `${reason.name} is a label the crawler digs from` : reason?.kind === "skipped-label" ? `${reason.name} is not your lane \u2014 ranked last, kept anyway` : "nothing ties it to the archive yet");
|
|
11719
|
+
const why2 = dupWhy ?? (reason?.kind === "artist" ? `${reason.name} is already in the archive` : reason?.kind === "label" ? `${reason.name} already carries a finding` : reason?.kind === "seed-label" ? `${reason.name} is a label the crawler digs from` : reason?.kind === "skipped-label" ? `${reason.name} is not your lane \u2014 ranked last, kept anyway` : reason?.kind === "unauthorized" ? "no artist here has earned the spend yet \u2014 held back, kept anyway" : "nothing ties it to the archive yet");
|
|
11719
11720
|
console.log(`${String(track.capturePriority ?? 0)} ${identity.padEnd(52)} ${why2}`);
|
|
11720
11721
|
continue;
|
|
11721
11722
|
}
|
package/package.json
CHANGED