create-thally-docs 0.10.114 → 0.10.116

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.
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-J7255UQA.js";
10
10
  import {
11
11
  downloadStarter
12
- } from "./chunk-I76ZBI6N.js";
12
+ } from "./chunk-P6WAKVEG.js";
13
13
  import {
14
14
  terminal
15
15
  } from "./chunk-L2YCVQBR.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  STABLE_SCAFFOLD_RELEASE
4
- } from "./chunk-E5S66IZP.js";
4
+ } from "./chunk-IE7TTBLT.js";
5
5
 
6
6
  // src/starter-sync.ts
7
7
  import { createHash } from "crypto";
@@ -8,7 +8,7 @@ import {
8
8
  installDeps,
9
9
  runProjectCommand,
10
10
  scaffold
11
- } from "./chunk-USCYCNUQ.js";
11
+ } from "./chunk-6DRDKMRW.js";
12
12
  import {
13
13
  pruneMissingSiteLinks
14
14
  } from "./chunk-UG3OXVLE.js";
@@ -68,13 +68,16 @@ function parseDocReference(raw) {
68
68
  }
69
69
  var canonicalRef = (value) => value.trim().replace(/\\/g, "/").replace(/^(?:\.\/)+/, "").replace(/^\/+/, "").replace(/^[a-z][a-z0-9+.-]*:\/\/[^/?#]*/i, (origin) => origin.toLowerCase());
70
70
  var baseName = (value) => canonicalRef(value).split(/[?#]/, 1)[0].split("/").filter(Boolean).pop() ?? "";
71
+ function pinnedSpec(specRef, specs) {
72
+ const wanted = canonicalRef(specRef);
73
+ if (!wanted) return void 0;
74
+ const wantedBase = baseName(specRef);
75
+ return specs.find((entry) => canonicalRef(entry.source) === wanted) ?? specs.find((entry) => canonicalRef(entry.source).toLowerCase() === wanted.toLowerCase()) ?? (wantedBase ? specs.find((entry) => baseName(entry.source) === wantedBase) : void 0) ?? (wantedBase ? specs.find((entry) => baseName(entry.source).toLowerCase() === wantedBase.toLowerCase()) : void 0);
76
+ }
71
77
  function pageState(ref, specs) {
72
78
  const judge = (spec) => spec.document === void 0 ? "unknown" : ref.webhook ? webhookState(spec.document, ref.path, spec.overrides) : operationState(spec.document, ref.method, ref.path, spec.overrides);
73
79
  if (ref.specRef) {
74
- const wanted = canonicalRef(ref.specRef);
75
- if (!wanted) return "unknown";
76
- const wantedBase = baseName(ref.specRef);
77
- const spec = specs.find((entry) => canonicalRef(entry.source) === wanted) ?? specs.find((entry) => canonicalRef(entry.source).toLowerCase() === wanted.toLowerCase()) ?? (wantedBase ? specs.find((entry) => baseName(entry.source) === wantedBase) : void 0) ?? (wantedBase ? specs.find((entry) => baseName(entry.source).toLowerCase() === wantedBase.toLowerCase()) : void 0);
80
+ const spec = pinnedSpec(ref.specRef, specs);
78
81
  return spec ? judge(spec) : "unknown";
79
82
  }
80
83
  const states = specs.map(judge);
@@ -82,6 +85,39 @@ function pageState(ref, specs) {
82
85
  if (specs.some((spec) => spec.document === void 0)) return "unknown";
83
86
  return states.find((state) => state === "hidden" || state === "excluded") ?? "unknown";
84
87
  }
88
+ var firstSet = (...values) => values.find((value) => value !== void 0 && value !== null);
89
+ function listedOperations(ref, spec) {
90
+ const document = spec?.document;
91
+ if (!isObj(document)) return [];
92
+ const entries = ref.webhook ? document.webhooks : document.paths;
93
+ const entry = isObj(entries) && Object.hasOwn(entries, ref.path) ? entries[ref.path] : void 0;
94
+ if (!isObj(entry)) return [];
95
+ const { chain, item } = viewEntry(document, entry);
96
+ const overrides = isObj(spec?.overrides) ? spec.overrides : {};
97
+ return METHODS.flatMap((verb) => {
98
+ const operation = item[verb];
99
+ if (!isObj(operation) || !ref.webhook && verb !== ref.method.toLowerCase()) return [];
100
+ const override = overrides[`${ref.webhook ? "WEBHOOK " : ""}${verb.toUpperCase()} ${ref.path}`];
101
+ return visibility(chain, operation, override) === "visible" ? [{ verb, operation, override: isObj(override) ? override : {} }] : [];
102
+ });
103
+ }
104
+ function operationDescription(ref, specs) {
105
+ for (const spec of ref.specRef ? [pinnedSpec(ref.specRef, specs)] : specs) {
106
+ const listed = listedOperations(ref, spec);
107
+ if (listed.length === 0) continue;
108
+ const rank = ({ verb, operation, override }) => ({
109
+ group: String(override.group || spec?.webhookGroup || "Webhooks"),
110
+ title: String(firstSet(override.title, operation.summary, operation.operationId) ?? `${verb.toUpperCase()} ${ref.path}`)
111
+ });
112
+ const [first] = ref.webhook ? listed.sort((a, b) => {
113
+ const [left, right] = [rank(a), rank(b)];
114
+ return left.group === right.group ? left.title.localeCompare(right.title) : left.group.localeCompare(right.group);
115
+ }) : listed;
116
+ const description = firstSet(first.override.description, first.operation.description, first.operation.summary);
117
+ return typeof description === "string" && description.trim() ? description : void 0;
118
+ }
119
+ return void 0;
120
+ }
85
121
  function resolveLocalRef(document, ref) {
86
122
  if (ref !== "#" && !ref.startsWith("#/")) return void 0;
87
123
  let node = document;
@@ -268,7 +304,7 @@ function manualApiProblems(file, data, hasOpenApiReference, mdx, docsApi) {
268
304
 
269
305
  // src/check.ts
270
306
  import { projectNavigationContract } from "@thallylabs/core/navigation";
271
- import { slugify } from "@thallylabs/core/slugify";
307
+ import { plainInlineText, slugify } from "@thallylabs/core/slugify";
272
308
  import { validateIntegrations } from "@thallylabs/migrate";
273
309
 
274
310
  // src/external-links.ts
@@ -542,7 +578,7 @@ function extractStepHeadings(content) {
542
578
  const title = stringAttribute(node, "title")?.trim();
543
579
  if (title && size && ["h2", "h3", "h4"].includes(size)) {
544
580
  const id = stringAttribute(node, "id")?.trim();
545
- steps.push({ line: node.position?.start.line ?? 0, base: id || slugify(title), explicit: !!id });
581
+ steps.push({ line: node.position?.start.line ?? 0, base: id || slugify(plainInlineText(title)), explicit: !!id });
546
582
  }
547
583
  }
548
584
  }
@@ -662,6 +698,7 @@ function resolveDynamicRedirectDestination(redirect, match) {
662
698
  });
663
699
  }
664
700
  var MAX_REDIRECT_HOPS = 20;
701
+ var MISSING_DESCRIPTION = 'Missing "description" in frontmatter';
665
702
  function resolveLink(target, redirects, dynamicRedirects = []) {
666
703
  let current = target;
667
704
  let anchor;
@@ -771,12 +808,16 @@ function checkTabApiGroups(projectDir, tab, locale, versions, issues) {
771
808
  });
772
809
  }
773
810
  }
774
- function checkUnpublishedOperationPages(projectDir, tabs, pages, issues) {
811
+ function checkOperationPages(projectDir, tabs, pages, issues) {
775
812
  if (pages.length === 0) return;
776
- const specs = tabs.filter((tab) => !tab.hidden && typeof tab.api?.source === "string").map((tab) => loadCheckSpec(projectDir, tab.api.source, tab.api.overrides));
777
- if (specs.length === 0) return;
778
- for (const { file, reference } of pages) {
779
- const state = pageState(reference, specs);
813
+ const load = (hidden) => tabs.filter((tab) => Boolean(tab.hidden) === hidden && typeof tab.api?.source === "string").map((tab) => {
814
+ const api = tab.api;
815
+ return { ...loadCheckSpec(projectDir, api.source, api.overrides), ...typeof api.webhookGroup === "string" ? { webhookGroup: api.webhookGroup } : {} };
816
+ });
817
+ const specs = load(false);
818
+ const described = pages.some((page) => !page.hasDescription) ? [...specs, ...load(true)] : specs;
819
+ for (const { file, reference, hasDescription } of pages) {
820
+ const state = specs.length > 0 ? pageState(reference, specs) : "unknown";
780
821
  if (state === "hidden" || state === "excluded") {
781
822
  const operation = `${reference.specRef ? `${reference.specRef} ` : ""}${reference.method} ${reference.path}`;
782
823
  issues.push({
@@ -784,6 +825,8 @@ function checkUnpublishedOperationPages(projectDir, tabs, pages, issues) {
784
825
  file,
785
826
  message: `page ${file} points at ${state} operation ${operation} and is not published: it returns 404 and is left out of navigation, search, sitemap and llms.txt. Publish the operation or point the page at another one`
786
827
  });
828
+ } else if (!hasDescription && operationDescription(reference, described) === void 0) {
829
+ issues.push({ severity: "warning", message: MISSING_DESCRIPTION, file });
787
830
  }
788
831
  }
789
832
  }
@@ -916,12 +959,12 @@ async function runCheck(projectDir, options) {
916
959
  }
917
960
  const rel2 = relative(projectDir, filePath);
918
961
  if (!data.title) issues.push({ severity: "warning", message: `Missing "title" in frontmatter`, file: rel2 });
919
- if (!data.description) issues.push({ severity: "warning", message: `Missing "description" in frontmatter`, file: rel2 });
962
+ const reference = parseDocReference(data.openapi);
963
+ if (!data.description && !reference) issues.push({ severity: "warning", message: MISSING_DESCRIPTION, file: rel2 });
920
964
  if (typeof data.openapi !== "string" && content.trim().length < 50) {
921
965
  issues.push({ severity: "warning", message: `Very short body (${content.trim().length} chars) \u2014 page may be empty`, file: rel2 });
922
966
  }
923
- const reference = parseDocReference(data.openapi);
924
- if (reference) operationPages.push({ file: rel2, reference });
967
+ if (reference) operationPages.push({ file: rel2, reference, hasDescription: Boolean(data.description) });
925
968
  for (const message of manualApiProblems(rel2, data, Boolean(reference), content, config.api)) {
926
969
  issues.push({ severity: "warning", file: rel2, message });
927
970
  }
@@ -994,7 +1037,7 @@ async function runCheck(projectDir, options) {
994
1037
  if (tab.api?.source) validateOpenApi(projectDir, tab.api.source, issues, tab.api.overrides);
995
1038
  }
996
1039
  checkPublicSpecs(projectDir, config.tabs, issues);
997
- checkUnpublishedOperationPages(projectDir, config.tabs, operationPages, issues);
1040
+ checkOperationPages(projectDir, config.tabs, operationPages, issues);
998
1041
  checkApiGroupKeys(projectDir, config, issues);
999
1042
  if (options.external && externalLinks.length > 0) {
1000
1043
  issues.push(...await checkExternalLinks(externalLinks, options.externalLinkOptions));
@@ -3,19 +3,19 @@
3
3
  // src/stable-scaffold-release.json
4
4
  var stable_scaffold_release_default = {
5
5
  schemaVersion: 1,
6
- id: "2026-10-19.9100bd61.ea27128c",
6
+ id: "2026-10-19.08f775a3.6184037a",
7
7
  source: {
8
8
  repository: "thallylabs/starter",
9
- commitSha: "9100bd61e8e233a06fbf22d16099c9b484b0f838",
10
- treeSha: "2de0fb03cc532bcfaa92eeee7800221d2acc0481",
11
- archiveUrl: "https://codeload.github.com/thallylabs/starter/tar.gz/9100bd61e8e233a06fbf22d16099c9b484b0f838",
9
+ commitSha: "08f775a3625a2e915c8f642ebdcb89de8b83c037",
10
+ treeSha: "634ceac37f7d617c12b31ec27ca929290f9e76e7",
11
+ archiveUrl: "https://codeload.github.com/thallylabs/starter/tar.gz/08f775a3625a2e915c8f642ebdcb89de8b83c037",
12
12
  manifestPath: "starter-release.json",
13
- manifestSha256: "9ec344f05fd9c150c2f0c76492811e33fb50f851a85ac68aed3b3a7b2fe2d855"
13
+ manifestSha256: "b3602f7a3e82d9c394e4fa70949fe2dde03e2a0afa6454a15ad60ec193ad3ebb"
14
14
  },
15
15
  runtime: {
16
16
  repository: "thallylabs/thally",
17
- commitSha: "ea27128cc1008c956f09c7a0a9f6f7b5a6028c60",
18
- treeSha: "340167ae32614a43b28abac6a954dddbd95c23c6",
17
+ commitSha: "6184037a97e007962e569d51b52d95829f3b29db",
18
+ treeSha: "05622ff5fd9dcaf4bfca3b8dc0eb2ff68c94a08d",
19
19
  contentSource: "assets",
20
20
  identityContractVersion: 1
21
21
  },
@@ -24,6 +24,26 @@ var stable_scaffold_release_default = {
24
24
 
25
25
  // src/previous-scaffold-releases.json
26
26
  var previous_scaffold_releases_default = [
27
+ {
28
+ schemaVersion: 1,
29
+ id: "2026-10-19.9100bd61.ea27128c",
30
+ source: {
31
+ repository: "thallylabs/starter",
32
+ commitSha: "9100bd61e8e233a06fbf22d16099c9b484b0f838",
33
+ treeSha: "2de0fb03cc532bcfaa92eeee7800221d2acc0481",
34
+ archiveUrl: "https://codeload.github.com/thallylabs/starter/tar.gz/9100bd61e8e233a06fbf22d16099c9b484b0f838",
35
+ manifestPath: "starter-release.json",
36
+ manifestSha256: "9ec344f05fd9c150c2f0c76492811e33fb50f851a85ac68aed3b3a7b2fe2d855"
37
+ },
38
+ runtime: {
39
+ repository: "thallylabs/thally",
40
+ commitSha: "ea27128cc1008c956f09c7a0a9f6f7b5a6028c60",
41
+ treeSha: "340167ae32614a43b28abac6a954dddbd95c23c6",
42
+ contentSource: "assets",
43
+ identityContractVersion: 1
44
+ },
45
+ starterVersion: 2
46
+ },
27
47
  {
28
48
  schemaVersion: 1,
29
49
  id: "2026-10-18.30d852d3.fb0a562c",
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-L2YCVQBR.js";
5
5
  import {
6
6
  readStarterReleaseManifest
7
- } from "./chunk-AVEUYAJV.js";
7
+ } from "./chunk-BCULZEV4.js";
8
8
  import {
9
9
  STABLE_SCAFFOLD_RELEASE
10
- } from "./chunk-E5S66IZP.js";
10
+ } from "./chunk-IE7TTBLT.js";
11
11
 
12
12
  // src/download.ts
13
13
  import { Readable, Transform, pipeline } from "stream";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  downloadStarter
4
- } from "./chunk-I76ZBI6N.js";
4
+ } from "./chunk-P6WAKVEG.js";
5
5
  import {
6
6
  applyStarterRuntimeSyncPlan,
7
7
  captureTargetPrecondition,
@@ -10,11 +10,11 @@ import {
10
10
  planStarterRuntimeSync,
11
11
  readStarterReleaseManifest,
12
12
  starterManifestSha256
13
- } from "./chunk-AVEUYAJV.js";
13
+ } from "./chunk-BCULZEV4.js";
14
14
  import {
15
15
  STABLE_SCAFFOLD_RELEASE,
16
16
  SUPPORTED_SCAFFOLD_RELEASES
17
- } from "./chunk-E5S66IZP.js";
17
+ } from "./chunk-IE7TTBLT.js";
18
18
 
19
19
  // src/starter-update.ts
20
20
  import {
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  migrateDocs
4
- } from "./chunk-ID64VO5R.js";
4
+ } from "./chunk-BWMPANPL.js";
5
5
  import {
6
6
  parseFrontmatter,
7
7
  runCheck
8
- } from "./chunk-3XHWWST2.js";
8
+ } from "./chunk-HSPM676Z.js";
9
9
  import "./chunk-KDLP27DS.js";
10
10
  import {
11
11
  logo,
@@ -13,17 +13,17 @@ import {
13
13
  scaffold,
14
14
  slugify,
15
15
  success
16
- } from "./chunk-USCYCNUQ.js";
16
+ } from "./chunk-6DRDKMRW.js";
17
17
  import "./chunk-UG3OXVLE.js";
18
18
  import "./chunk-J7255UQA.js";
19
- import "./chunk-I76ZBI6N.js";
19
+ import "./chunk-P6WAKVEG.js";
20
20
  import {
21
21
  acquireTerminalAccent,
22
22
  formatHelp,
23
23
  terminal
24
24
  } from "./chunk-L2YCVQBR.js";
25
- import "./chunk-AVEUYAJV.js";
26
- import "./chunk-E5S66IZP.js";
25
+ import "./chunk-BCULZEV4.js";
26
+ import "./chunk-IE7TTBLT.js";
27
27
 
28
28
  // src/index.ts
29
29
  import { existsSync as existsSync2, readdirSync } from "fs";
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  migrateDocs
4
- } from "../chunk-ID64VO5R.js";
4
+ } from "../chunk-BWMPANPL.js";
5
5
  import "../chunk-KDLP27DS.js";
6
- import "../chunk-USCYCNUQ.js";
6
+ import "../chunk-6DRDKMRW.js";
7
7
  import "../chunk-UG3OXVLE.js";
8
8
  import "../chunk-J7255UQA.js";
9
- import "../chunk-I76ZBI6N.js";
9
+ import "../chunk-P6WAKVEG.js";
10
10
  import "../chunk-L2YCVQBR.js";
11
- import "../chunk-AVEUYAJV.js";
12
- import "../chunk-E5S66IZP.js";
11
+ import "../chunk-BCULZEV4.js";
12
+ import "../chunk-IE7TTBLT.js";
13
13
  export {
14
14
  migrateDocs
15
15
  };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runCheck
4
- } from "./chunk-3XHWWST2.js";
4
+ } from "./chunk-HSPM676Z.js";
5
5
  import "./chunk-KDLP27DS.js";
6
6
  import "./chunk-J7255UQA.js";
7
7
 
package/dist/release.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  STABLE_SCAFFOLD_RELEASE,
4
4
  SUPPORTED_SCAFFOLD_RELEASES,
5
5
  isStableScaffoldRelease
6
- } from "./chunk-E5S66IZP.js";
6
+ } from "./chunk-IE7TTBLT.js";
7
7
  export {
8
8
  STABLE_SCAFFOLD_RELEASE,
9
9
  SUPPORTED_SCAFFOLD_RELEASES,
package/dist/scaffold.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  scaffold
4
- } from "./chunk-USCYCNUQ.js";
4
+ } from "./chunk-6DRDKMRW.js";
5
5
  import "./chunk-UG3OXVLE.js";
6
6
  import "./chunk-J7255UQA.js";
7
7
  import {
@@ -9,12 +9,12 @@ import {
9
9
  STARTER_COMMIT_SHA,
10
10
  STARTER_REPOSITORY,
11
11
  validateStarterArchiveEntry
12
- } from "./chunk-I76ZBI6N.js";
12
+ } from "./chunk-P6WAKVEG.js";
13
13
  import "./chunk-L2YCVQBR.js";
14
- import "./chunk-AVEUYAJV.js";
14
+ import "./chunk-BCULZEV4.js";
15
15
  import {
16
16
  STABLE_SCAFFOLD_RELEASE
17
- } from "./chunk-E5S66IZP.js";
17
+ } from "./chunk-IE7TTBLT.js";
18
18
  export {
19
19
  STABLE_SCAFFOLD_RELEASE,
20
20
  STARTER_ARCHIVE_ROOT,
@@ -9,8 +9,8 @@ import {
9
9
  planStarterRuntimeSync,
10
10
  readStarterReleaseManifest,
11
11
  starterManifestSha256
12
- } from "./chunk-AVEUYAJV.js";
13
- import "./chunk-E5S66IZP.js";
12
+ } from "./chunk-BCULZEV4.js";
13
+ import "./chunk-IE7TTBLT.js";
14
14
  export {
15
15
  applyStarterRuntimeSyncPlan,
16
16
  captureTargetPrecondition,
@@ -6,11 +6,11 @@ import {
6
6
  resolveStarterUpdateBase,
7
7
  starterReleaseProviderError,
8
8
  updateStarterProject
9
- } from "./chunk-UVFKAZVD.js";
10
- import "./chunk-I76ZBI6N.js";
9
+ } from "./chunk-WFJCCE6I.js";
10
+ import "./chunk-P6WAKVEG.js";
11
11
  import "./chunk-L2YCVQBR.js";
12
- import "./chunk-AVEUYAJV.js";
13
- import "./chunk-E5S66IZP.js";
12
+ import "./chunk-BCULZEV4.js";
13
+ import "./chunk-IE7TTBLT.js";
14
14
  export {
15
15
  fetchStarterReleaseHint,
16
16
  resolveManualReviewMutations,
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  updateStarterProject
4
- } from "./chunk-UVFKAZVD.js";
4
+ } from "./chunk-WFJCCE6I.js";
5
5
  import {
6
6
  downloadStarter
7
- } from "./chunk-I76ZBI6N.js";
7
+ } from "./chunk-P6WAKVEG.js";
8
8
  import "./chunk-L2YCVQBR.js";
9
9
  import {
10
10
  classifyStarterPath,
11
11
  mergeStarterOwnershipContracts,
12
12
  readStarterReleaseManifest
13
- } from "./chunk-AVEUYAJV.js";
13
+ } from "./chunk-BCULZEV4.js";
14
14
  import {
15
15
  STABLE_SCAFFOLD_RELEASE,
16
16
  SUPPORTED_SCAFFOLD_RELEASES
17
- } from "./chunk-E5S66IZP.js";
17
+ } from "./chunk-IE7TTBLT.js";
18
18
 
19
19
  // src/starter-upgrade-canary.ts
20
20
  import { createHash } from "crypto";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-thally-docs",
3
- "version": "0.10.114",
3
+ "version": "0.10.116",
4
4
  "description": "Scaffold an open-source Thally docs site for people, search engines, and AI tools.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -53,8 +53,8 @@
53
53
  "@anthropic-ai/sdk": "^0.36.0",
54
54
  "@clack/prompts": "^0.11.0",
55
55
  "@inquirer/prompts": "^7.0.0",
56
- "@thallylabs/core": "0.2.16",
57
- "@thallylabs/migrate": "0.2.40",
56
+ "@thallylabs/core": "0.2.17",
57
+ "@thallylabs/migrate": "0.2.41",
58
58
  "p-limit": "^6.1.0",
59
59
  "remark-mdx": "^3.1.1",
60
60
  "remark-parse": "^11.0.0",