fluncle 0.199.0 → 0.201.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 +40 -25
  2. 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.199.0".trim() ? "0.199.0".trim() : "0.1.0";
564
+ currentVersion = "0.201.0".trim() ? "0.201.0".trim() : "0.1.0";
565
565
  });
566
566
 
567
567
  // src/update-notifier.ts
@@ -797,7 +797,7 @@ var init_env = __esm(() => {
797
797
  });
798
798
 
799
799
  // src/user-token.ts
800
- import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
800
+ import { chmodSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
801
801
  import { homedir as homedir3 } from "node:os";
802
802
  import { dirname as dirname2, join as join3 } from "node:path";
803
803
  function activeProfile() {
@@ -824,9 +824,14 @@ function readUserToken() {
824
824
  }
825
825
  function writeUserToken(value) {
826
826
  const path2 = userTokenPath();
827
- mkdirSync(dirname2(path2), { recursive: true });
827
+ const dir = dirname2(path2);
828
+ mkdirSync(dir, { mode: 448, recursive: true });
829
+ try {
830
+ chmodSync(dir, 448);
831
+ } catch {}
828
832
  writeFileSync(path2, `${JSON.stringify(value, null, 2)}
829
833
  `, { mode: 384 });
834
+ chmodSync(path2, 384);
830
835
  }
831
836
  function clearUserToken() {
832
837
  const path2 = userTokenPath();
@@ -1395,10 +1400,12 @@ async function resyncYoutube(mixtapeId) {
1395
1400
  }
1396
1401
  async function authYoutubeCommand() {
1397
1402
  const response = await adminApiGet("/api/v1/admin/youtube/auth/start");
1398
- console.log(`Open this YouTube authorization URL:
1403
+ console.log(`Open this link in the browser you're logged into /admin with:
1399
1404
 
1400
1405
  ${response.authUrl}
1401
1406
 
1407
+ It hands you off to Google. Signed out? Log in there and it resumes on its own.
1408
+ The link is good for 10 minutes; run this again if it expires.
1402
1409
  After approving access, Google returns to the Fluncle admin callback and stores the refresh token server-side.`);
1403
1410
  }
1404
1411
  async function initiate(mixtapeId, contentLength, contentType) {
@@ -1566,10 +1573,12 @@ async function resyncMixcloud(mixtapeId) {
1566
1573
  }
1567
1574
  async function authMixcloudCommand() {
1568
1575
  const response = await adminApiGet("/api/v1/admin/mixcloud/auth/start");
1569
- console.log(`Open this Mixcloud authorization URL:
1576
+ console.log(`Open this link in the browser you're logged into /admin with:
1570
1577
 
1571
1578
  ${response.authUrl}
1572
1579
 
1580
+ It hands you off to Mixcloud. Signed out? Log in there and it resumes on its own.
1581
+ The link is good for 10 minutes; run this again if it expires.
1573
1582
  After approving access, Mixcloud returns to the Fluncle admin callback and stores the access token server-side.`);
1574
1583
  }
1575
1584
  function mixtapeDescription(note, logId) {
@@ -2443,7 +2452,7 @@ function parseVersion2(version) {
2443
2452
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2444
2453
  var init_version2 = __esm(() => {
2445
2454
  init_output();
2446
- currentVersion2 = "0.199.0".trim() ? "0.199.0".trim() : "0.1.0";
2455
+ currentVersion2 = "0.201.0".trim() ? "0.201.0".trim() : "0.1.0";
2447
2456
  });
2448
2457
 
2449
2458
  // ../../packages/registry/src/index.ts
@@ -2512,18 +2521,6 @@ var init_src = __esm(() => {
2512
2521
  url: `${SITE}/mix`,
2513
2522
  weights: { web: "secondary" }
2514
2523
  },
2515
- {
2516
- exposedContent: [
2517
- "the feed-first Stories surface — full-bleed findings",
2518
- "/stories/:logId — one finding as a Story"
2519
- ],
2520
- kind: "web_route",
2521
- name: "web.stories",
2522
- probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
2523
- route: "/stories",
2524
- url: `${SITE}/stories`,
2525
- weights: { web: "secondary" }
2526
- },
2527
2524
  {
2528
2525
  exposedContent: ["who Fluncle is, what the Galaxy is, how to read a Log ID"],
2529
2526
  kind: "web_route",
@@ -3108,7 +3105,7 @@ var init_src = __esm(() => {
3108
3105
  exposedContent: ["the XML sitemap index of every public page"],
3109
3106
  kind: "discovery",
3110
3107
  name: "discovery.sitemap",
3111
- operatorNotes: "A sitemap INDEX, not a flat urlset: the URLs live in children at /sitemap/<kind>-<n>.xml, ONE CHILD PER ENTITY TYPE (pages/findings/artists/labels/albums/galaxies/logbook), each auto-paged under Google's 50,000-URL ceiling so a breach cannot happen rather than merely not having happened yet. robots.txt still names this one URL — a crawler discovers the children from here. Splitting per entity type is also the diagnostic: Search Console reports coverage PER sitemap, so each entity type gets its own submitted/indexed count.",
3108
+ operatorNotes: "A sitemap INDEX, not a flat urlset: the URLs live in children at /sitemap/<kind>-<n>.xml, ONE CHILD PER ENTITY TYPE (pages/findings/artists/labels/albums/galaxies/logbook/docs), each auto-paged under Google's 50,000-URL ceiling so a breach cannot happen rather than merely not having happened yet. robots.txt still names this one URL — a crawler discovers the children from here. Splitting per entity type is also the diagnostic: Search Console reports coverage PER sitemap, so each entity type gets its own submitted/indexed count.",
3112
3109
  probeConfig: { cadenceMs: PROBE_CADENCE_MS, kind: "http", timeoutMs: PROBE_TIMEOUT_MS },
3113
3110
  route: "/sitemap.xml",
3114
3111
  url: `${SITE}/sitemap.xml`,
@@ -3117,7 +3114,7 @@ var init_src = __esm(() => {
3117
3114
  {
3118
3115
  apiFormat: "application/xml",
3119
3116
  exposedContent: [
3120
- "one child sitemap, per entity type: the pages / findings / artists / labels / albums / galaxies / logbook URLs, auto-paged"
3117
+ "one child sitemap, per entity type: the pages / findings / artists / labels / albums / galaxies / logbook / docs URLs, auto-paged"
3121
3118
  ],
3122
3119
  kind: "discovery",
3123
3120
  name: "discovery.sitemap-shard",
@@ -3148,6 +3145,16 @@ var init_src = __esm(() => {
3148
3145
  url: `${SITE}/llms.txt`,
3149
3146
  weights: { web: "primary" }
3150
3147
  },
3148
+ {
3149
+ apiFormat: "text/markdown",
3150
+ exposedContent: ["one developer-doc page as clean Markdown, at `/docs.md/<slug>`"],
3151
+ kind: "discovery",
3152
+ name: "discovery.docs-markdown",
3153
+ operatorNotes: 'The Markdown twin of every /docs page — front-matter-free, the title as the H1, the description as the lede, then the precompiled body (`includeProcessedMarkdown` in source.config.ts → `page.data.getText("processed")`). It is the endpoint behind the page-actions affordance ("View as Markdown", "Copy page", and the Open in ChatGPT/Claude/Cursor links, which carry this URL so the assistant pulls the clean Markdown), and each /docs page advertises it as `<link rel="alternate" type="text/markdown">` (routes/-docs-head.ts). A machine-FETCHED document rather than a page, so it is catalogued as `discovery` next to llms.txt. No probeConfig: the route is slug-parameterized, so there is no fixed URL to GET-probe (the `discovery.oembed` / `web.artist` precedent) — the post-deploy probe skips it for the same reason it skips /artist/:slug/fresh.xml. Source: apps/web/src/routes/docs[.]md.$.ts (a pure splat, mounted at /docs.md/$).',
3154
+ route: "/docs.md/:slug",
3155
+ url: `${SITE}/docs.md/cli`,
3156
+ weights: { web: "tertiary" }
3157
+ },
3151
3158
  {
3152
3159
  apiFormat: "text/markdown",
3153
3160
  exposedContent: ["the entire archive in one ingestible markdown document, every finding"],
@@ -5049,10 +5056,12 @@ async function resyncYoutube2(mixtapeId) {
5049
5056
  }
5050
5057
  async function authYoutubeCommand2() {
5051
5058
  const response = await adminApiGet("/api/v1/admin/youtube/auth/start");
5052
- console.log(`Open this YouTube authorization URL:
5059
+ console.log(`Open this link in the browser you're logged into /admin with:
5053
5060
 
5054
5061
  ${response.authUrl}
5055
5062
 
5063
+ It hands you off to Google. Signed out? Log in there and it resumes on its own.
5064
+ The link is good for 10 minutes; run this again if it expires.
5056
5065
  After approving access, Google returns to the Fluncle admin callback and stores the refresh token server-side.`);
5057
5066
  }
5058
5067
  async function initiate2(mixtapeId, contentLength, contentType) {
@@ -6389,11 +6398,13 @@ __export(exports_auth, {
6389
6398
  });
6390
6399
  async function authSpotifyCommand() {
6391
6400
  const response = await adminApiGet("/api/v1/admin/spotify/auth/start");
6392
- console.log(`Open this Spotify authorization URL:
6401
+ console.log(`Open this link in the browser you're logged into /admin with:
6393
6402
 
6394
6403
  ${response.authUrl}
6395
6404
 
6396
- After approving access, Spotify will return to the Fluncle admin callback and store auth server-side.`);
6405
+ It hands you off to Spotify. Signed out? Log in there and it resumes on its own.
6406
+ The link is good for 10 minutes; run this again if it expires.
6407
+ After approving access, Spotify returns to the Fluncle admin callback and stores auth server-side.`);
6397
6408
  }
6398
6409
  var init_auth = __esm(() => {
6399
6410
  init_api();
@@ -6470,10 +6481,12 @@ async function resyncMixcloud2(mixtapeId) {
6470
6481
  }
6471
6482
  async function authMixcloudCommand2() {
6472
6483
  const response = await adminApiGet("/api/v1/admin/mixcloud/auth/start");
6473
- console.log(`Open this Mixcloud authorization URL:
6484
+ console.log(`Open this link in the browser you're logged into /admin with:
6474
6485
 
6475
6486
  ${response.authUrl}
6476
6487
 
6488
+ It hands you off to Mixcloud. Signed out? Log in there and it resumes on its own.
6489
+ The link is good for 10 minutes; run this again if it expires.
6477
6490
  After approving access, Mixcloud returns to the Fluncle admin callback and stores the access token server-side.`);
6478
6491
  }
6479
6492
  function mixtapeDescription2(note, logId) {
@@ -6549,10 +6562,12 @@ __export(exports_auth_tiktok, {
6549
6562
  });
6550
6563
  async function authTikTokCommand() {
6551
6564
  const response = await adminApiGet("/api/v1/admin/tiktok/auth/start");
6552
- console.log(`Open this TikTok authorization URL:
6565
+ console.log(`Open this link in the browser you're logged into /admin with:
6553
6566
 
6554
6567
  ${response.authUrl}
6555
6568
 
6569
+ It hands you off to TikTok. Signed out? Log in there and it resumes on its own.
6570
+ The link is good for 10 minutes; run this again if it expires.
6556
6571
  After approving access, TikTok returns to the Fluncle admin callback and stores the refresh token server-side.`);
6557
6572
  }
6558
6573
  var init_auth_tiktok = __esm(() => {
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.199.0"
34
+ "version": "0.201.0"
35
35
  }