@hawkeyexl/manni 4.8.0 → 4.9.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 (153) hide show
  1. package/README.md +1 -1
  2. package/dist/{batch-6LJJZTT7.js → batch-W5GXL2P4.js} +10 -10
  3. package/dist/{build-QKFXKAXT.js → build-Q56FEXR6.js} +9 -9
  4. package/dist/{calibrate-UQJR3WCU.js → calibrate-XFE56P4M.js} +11 -11
  5. package/dist/{capture-HQ2PGM5Z.js → capture-GMYH4ATL.js} +10 -10
  6. package/dist/{check-BF56QRWL.js → check-HBRX4FOR.js} +9 -9
  7. package/dist/{check-NSDC5LSE.js → check-KUBELO5G.js} +13 -13
  8. package/dist/check-KUBELO5G.js.map +1 -0
  9. package/dist/{check-3DZOMJ7R.js → check-ZE5HIDOW.js} +10 -10
  10. package/dist/{chunk-GEX2HDAT.js → chunk-23UAGEKP.js} +2 -2
  11. package/dist/{chunk-KWAXJCKS.js → chunk-2EHDJ47Y.js} +4 -4
  12. package/dist/{chunk-ALAH6HNY.js → chunk-35WTFPQS.js} +2 -2
  13. package/dist/{chunk-QRAKST62.js → chunk-3CDZWY6M.js} +4 -4
  14. package/dist/{chunk-A36QDIXZ.js → chunk-3XGGF5JW.js} +809 -4
  15. package/dist/chunk-3XGGF5JW.js.map +1 -0
  16. package/dist/{chunk-ZH3VTIBL.js → chunk-3XMG4CZY.js} +7 -7
  17. package/dist/{chunk-J3IK5IGO.js → chunk-5EB6RIXJ.js} +2 -2
  18. package/dist/{chunk-G4T6SF3C.js → chunk-5LBEQ4ZU.js} +129 -26
  19. package/dist/chunk-5LBEQ4ZU.js.map +1 -0
  20. package/dist/{chunk-WZFA33SD.js → chunk-5WME4CB6.js} +6 -6
  21. package/dist/{chunk-W7RSTW55.js → chunk-76I6I5N2.js} +21 -3
  22. package/dist/{chunk-W7RSTW55.js.map → chunk-76I6I5N2.js.map} +1 -1
  23. package/dist/{chunk-TVKYNKB3.js → chunk-BSTXARMY.js} +10 -10
  24. package/dist/{chunk-UZGSFQLT.js → chunk-DTGIUMZV.js} +4 -4
  25. package/dist/{chunk-ZYRHDBVS.js → chunk-FGUXMZXO.js} +5 -5
  26. package/dist/{chunk-HYT242KI.js → chunk-FSBIPCWE.js} +6 -6
  27. package/dist/{chunk-UMGAACCP.js → chunk-GEMXGXPR.js} +3 -3
  28. package/dist/{chunk-ZJNE4BKG.js → chunk-GRILZZGS.js} +2 -2
  29. package/dist/{chunk-BP7LGVF3.js → chunk-HRXDM6H6.js} +7 -7
  30. package/dist/{chunk-AZXCL5WH.js → chunk-IN6DWNVE.js} +4 -4
  31. package/dist/{chunk-CGO5MNRD.js → chunk-KX5IYIOO.js} +2 -2
  32. package/dist/{chunk-CGO5MNRD.js.map → chunk-KX5IYIOO.js.map} +1 -1
  33. package/dist/{chunk-22G33NL2.js → chunk-M6GH3FGJ.js} +3 -3
  34. package/dist/{chunk-LRU5BK3L.js → chunk-MHAYLDBK.js} +3 -3
  35. package/dist/{chunk-EOGF6VCA.js → chunk-ND2S5BXB.js} +2 -2
  36. package/dist/{chunk-H3LM7D6K.js → chunk-OVOYKWCM.js} +4 -4
  37. package/dist/{chunk-RGB7WBFD.js → chunk-OWSNXPPX.js} +3 -3
  38. package/dist/{chunk-77WI6LJW.js → chunk-Q2H7J3FF.js} +5 -5
  39. package/dist/{chunk-2QEHLWYM.js → chunk-Q45PZX2D.js} +2 -2
  40. package/dist/{chunk-426TGC2Q.js → chunk-QAKJNPY3.js} +5 -5
  41. package/dist/{chunk-KRSLDZ7N.js → chunk-QCCAHV6A.js} +34 -7
  42. package/dist/{chunk-KRSLDZ7N.js.map → chunk-QCCAHV6A.js.map} +1 -1
  43. package/dist/{chunk-W6AZHTGB.js → chunk-QKE3XS2L.js} +2 -2
  44. package/dist/{chunk-CHDADR7F.js → chunk-RFSGKF4O.js} +35 -17
  45. package/dist/chunk-RFSGKF4O.js.map +1 -0
  46. package/dist/{chunk-GWGR7BDP.js → chunk-TKTRIZT4.js} +5 -5
  47. package/dist/{chunk-VCQOUFTZ.js → chunk-TMI2YF6D.js} +4 -4
  48. package/dist/{chunk-OA2GKJVM.js → chunk-UDUHRXJ4.js} +2 -2
  49. package/dist/{chunk-BMRZFTAD.js → chunk-VKWZCEWB.js} +3 -3
  50. package/dist/{chunk-ZDYW7XTS.js → chunk-X6WLCNKC.js} +3 -3
  51. package/dist/{chunk-JUN4DUHG.js → chunk-XHFHXOQQ.js} +6 -6
  52. package/dist/{chunk-TKVGEFMH.js → chunk-XTAHZTES.js} +3 -3
  53. package/dist/{chunk-HOE2C42K.js → chunk-YEUQ7OKT.js} +1291 -125
  54. package/dist/chunk-YEUQ7OKT.js.map +1 -0
  55. package/dist/{chunk-LXFY64QR.js → chunk-YUZ2ECZY.js} +3 -3
  56. package/dist/{cli-PNK2HTIC.js → cli-B7SFJDZA.js} +11 -11
  57. package/dist/{cli-EOSY3WVX.js → cli-BJ7JXJ2U.js} +10 -10
  58. package/dist/{cli-X24QGW6Y.js → cli-EMQXRN6E.js} +11 -11
  59. package/dist/{cli-WGONI6PJ.js → cli-J35OPSTP.js} +7 -7
  60. package/dist/{cli-CSXPJZVM.js → cli-MEPJTS2V.js} +14 -14
  61. package/dist/{cli-JER6KIUJ.js → cli-TPONWND4.js} +17 -17
  62. package/dist/{cli-IX3WSFV4.js → cli-URNPOMOH.js} +2 -2
  63. package/dist/{cli-IYC7F5OJ.js → cli-YDMMIL2U.js} +13 -13
  64. package/dist/{cli-7OIV7UXF.js → cli-ZJRHU7MO.js} +28 -28
  65. package/dist/cli.js +11 -11
  66. package/dist/docmeta.js +6 -6
  67. package/dist/{github-LL5LHQFG.js → github-63CZJGZS.js} +11 -11
  68. package/dist/{github-GFTLEZ3D.js → github-IYOVHWHG.js} +9 -9
  69. package/dist/index.d.ts +11 -1
  70. package/dist/index.js +30 -30
  71. package/dist/{json-XDV4CZEU.js → json-JIUPGOUQ.js} +9 -9
  72. package/dist/{lint-NO4GIR3Z.js → lint-TBE35CCW.js} +9 -9
  73. package/dist/{list-4GJ6KI4U.js → list-IZ4RIM72.js} +9 -9
  74. package/dist/{list-4G6F5BX2.js → list-TNEJ3J77.js} +9 -9
  75. package/dist/{page-4VJQELH5.js → page-WQ3GQF76.js} +8 -8
  76. package/dist/{prepare-TGHFPUYE.js → prepare-ZUTYXTUZ.js} +9 -9
  77. package/dist/{pretty-ZMKG3AJR.js → pretty-CBV5XSMZ.js} +9 -9
  78. package/dist/{pretty-HFA6ITJY.js → pretty-Q3C433DW.js} +10 -10
  79. package/dist/{reporters-DZTHBJEA.js → reporters-DH5HPFXJ.js} +8 -8
  80. package/dist/{reporters-FRM5BHPL.js → reporters-TTYGOUAF.js} +4 -4
  81. package/dist/{run-BRC64Y7B.js → run-LZXKVTM7.js} +9 -9
  82. package/dist/{term-PNWS7F5B.js → term-DL3YFL43.js} +278 -149
  83. package/dist/term-DL3YFL43.js.map +1 -0
  84. package/dist/{validate-ULPJI4GQ.js → validate-UVDMC5LT.js} +4 -4
  85. package/package.json +1 -1
  86. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  87. package/dist/check-NSDC5LSE.js.map +0 -1
  88. package/dist/chunk-A36QDIXZ.js.map +0 -1
  89. package/dist/chunk-CHDADR7F.js.map +0 -1
  90. package/dist/chunk-G4T6SF3C.js.map +0 -1
  91. package/dist/chunk-HOE2C42K.js.map +0 -1
  92. package/dist/term-PNWS7F5B.js.map +0 -1
  93. /package/dist/{batch-6LJJZTT7.js.map → batch-W5GXL2P4.js.map} +0 -0
  94. /package/dist/{build-QKFXKAXT.js.map → build-Q56FEXR6.js.map} +0 -0
  95. /package/dist/{calibrate-UQJR3WCU.js.map → calibrate-XFE56P4M.js.map} +0 -0
  96. /package/dist/{capture-HQ2PGM5Z.js.map → capture-GMYH4ATL.js.map} +0 -0
  97. /package/dist/{check-3DZOMJ7R.js.map → check-HBRX4FOR.js.map} +0 -0
  98. /package/dist/{check-BF56QRWL.js.map → check-ZE5HIDOW.js.map} +0 -0
  99. /package/dist/{chunk-GEX2HDAT.js.map → chunk-23UAGEKP.js.map} +0 -0
  100. /package/dist/{chunk-KWAXJCKS.js.map → chunk-2EHDJ47Y.js.map} +0 -0
  101. /package/dist/{chunk-ALAH6HNY.js.map → chunk-35WTFPQS.js.map} +0 -0
  102. /package/dist/{chunk-QRAKST62.js.map → chunk-3CDZWY6M.js.map} +0 -0
  103. /package/dist/{chunk-ZH3VTIBL.js.map → chunk-3XMG4CZY.js.map} +0 -0
  104. /package/dist/{chunk-J3IK5IGO.js.map → chunk-5EB6RIXJ.js.map} +0 -0
  105. /package/dist/{chunk-WZFA33SD.js.map → chunk-5WME4CB6.js.map} +0 -0
  106. /package/dist/{chunk-TVKYNKB3.js.map → chunk-BSTXARMY.js.map} +0 -0
  107. /package/dist/{chunk-UZGSFQLT.js.map → chunk-DTGIUMZV.js.map} +0 -0
  108. /package/dist/{chunk-ZYRHDBVS.js.map → chunk-FGUXMZXO.js.map} +0 -0
  109. /package/dist/{chunk-HYT242KI.js.map → chunk-FSBIPCWE.js.map} +0 -0
  110. /package/dist/{chunk-UMGAACCP.js.map → chunk-GEMXGXPR.js.map} +0 -0
  111. /package/dist/{chunk-ZJNE4BKG.js.map → chunk-GRILZZGS.js.map} +0 -0
  112. /package/dist/{chunk-BP7LGVF3.js.map → chunk-HRXDM6H6.js.map} +0 -0
  113. /package/dist/{chunk-AZXCL5WH.js.map → chunk-IN6DWNVE.js.map} +0 -0
  114. /package/dist/{chunk-22G33NL2.js.map → chunk-M6GH3FGJ.js.map} +0 -0
  115. /package/dist/{chunk-LRU5BK3L.js.map → chunk-MHAYLDBK.js.map} +0 -0
  116. /package/dist/{chunk-EOGF6VCA.js.map → chunk-ND2S5BXB.js.map} +0 -0
  117. /package/dist/{chunk-H3LM7D6K.js.map → chunk-OVOYKWCM.js.map} +0 -0
  118. /package/dist/{chunk-RGB7WBFD.js.map → chunk-OWSNXPPX.js.map} +0 -0
  119. /package/dist/{chunk-77WI6LJW.js.map → chunk-Q2H7J3FF.js.map} +0 -0
  120. /package/dist/{chunk-2QEHLWYM.js.map → chunk-Q45PZX2D.js.map} +0 -0
  121. /package/dist/{chunk-426TGC2Q.js.map → chunk-QAKJNPY3.js.map} +0 -0
  122. /package/dist/{chunk-W6AZHTGB.js.map → chunk-QKE3XS2L.js.map} +0 -0
  123. /package/dist/{chunk-GWGR7BDP.js.map → chunk-TKTRIZT4.js.map} +0 -0
  124. /package/dist/{chunk-VCQOUFTZ.js.map → chunk-TMI2YF6D.js.map} +0 -0
  125. /package/dist/{chunk-OA2GKJVM.js.map → chunk-UDUHRXJ4.js.map} +0 -0
  126. /package/dist/{chunk-BMRZFTAD.js.map → chunk-VKWZCEWB.js.map} +0 -0
  127. /package/dist/{chunk-ZDYW7XTS.js.map → chunk-X6WLCNKC.js.map} +0 -0
  128. /package/dist/{chunk-JUN4DUHG.js.map → chunk-XHFHXOQQ.js.map} +0 -0
  129. /package/dist/{chunk-TKVGEFMH.js.map → chunk-XTAHZTES.js.map} +0 -0
  130. /package/dist/{chunk-LXFY64QR.js.map → chunk-YUZ2ECZY.js.map} +0 -0
  131. /package/dist/{cli-PNK2HTIC.js.map → cli-B7SFJDZA.js.map} +0 -0
  132. /package/dist/{cli-EOSY3WVX.js.map → cli-BJ7JXJ2U.js.map} +0 -0
  133. /package/dist/{cli-X24QGW6Y.js.map → cli-EMQXRN6E.js.map} +0 -0
  134. /package/dist/{cli-WGONI6PJ.js.map → cli-J35OPSTP.js.map} +0 -0
  135. /package/dist/{cli-CSXPJZVM.js.map → cli-MEPJTS2V.js.map} +0 -0
  136. /package/dist/{cli-JER6KIUJ.js.map → cli-TPONWND4.js.map} +0 -0
  137. /package/dist/{cli-IX3WSFV4.js.map → cli-URNPOMOH.js.map} +0 -0
  138. /package/dist/{cli-IYC7F5OJ.js.map → cli-YDMMIL2U.js.map} +0 -0
  139. /package/dist/{cli-7OIV7UXF.js.map → cli-ZJRHU7MO.js.map} +0 -0
  140. /package/dist/{github-GFTLEZ3D.js.map → github-63CZJGZS.js.map} +0 -0
  141. /package/dist/{github-LL5LHQFG.js.map → github-IYOVHWHG.js.map} +0 -0
  142. /package/dist/{json-XDV4CZEU.js.map → json-JIUPGOUQ.js.map} +0 -0
  143. /package/dist/{lint-NO4GIR3Z.js.map → lint-TBE35CCW.js.map} +0 -0
  144. /package/dist/{list-4G6F5BX2.js.map → list-IZ4RIM72.js.map} +0 -0
  145. /package/dist/{list-4GJ6KI4U.js.map → list-TNEJ3J77.js.map} +0 -0
  146. /package/dist/{page-4VJQELH5.js.map → page-WQ3GQF76.js.map} +0 -0
  147. /package/dist/{prepare-TGHFPUYE.js.map → prepare-ZUTYXTUZ.js.map} +0 -0
  148. /package/dist/{pretty-HFA6ITJY.js.map → pretty-CBV5XSMZ.js.map} +0 -0
  149. /package/dist/{pretty-ZMKG3AJR.js.map → pretty-Q3C433DW.js.map} +0 -0
  150. /package/dist/{reporters-DZTHBJEA.js.map → reporters-DH5HPFXJ.js.map} +0 -0
  151. /package/dist/{reporters-FRM5BHPL.js.map → reporters-TTYGOUAF.js.map} +0 -0
  152. /package/dist/{run-BRC64Y7B.js.map → run-LZXKVTM7.js.map} +0 -0
  153. /package/dist/{validate-ULPJI4GQ.js.map → validate-UVDMC5LT.js.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  parseTraceFile,
4
4
  renderTrace
5
- } from "./chunk-W7RSTW55.js";
5
+ } from "./chunk-76I6I5N2.js";
6
6
  import {
7
7
  evaluateWhen,
8
8
  matchesGlob,
@@ -30,7 +30,7 @@ import {
30
30
  extractEvals,
31
31
  findManifest,
32
32
  resolveArtifacts
33
- } from "./chunk-TKVGEFMH.js";
33
+ } from "./chunk-XTAHZTES.js";
34
34
  import {
35
35
  discoverTraces
36
36
  } from "./chunk-4TSWU2SU.js";
@@ -68,7 +68,7 @@ import {
68
68
  } from "./chunk-GLP5PSXB.js";
69
69
  import {
70
70
  declaredAt
71
- } from "./chunk-22G33NL2.js";
71
+ } from "./chunk-M6GH3FGJ.js";
72
72
  import {
73
73
  PATH_JOIN,
74
74
  externalMetadataJoin,
@@ -76,15 +76,15 @@ import {
76
76
  loadExternalMetadata,
77
77
  memberOf,
78
78
  mergeWithMarks
79
- } from "./chunk-KRSLDZ7N.js";
79
+ } from "./chunk-QCCAHV6A.js";
80
80
  import {
81
81
  xmlEscape
82
- } from "./chunk-ZDYW7XTS.js";
82
+ } from "./chunk-X6WLCNKC.js";
83
83
  import {
84
84
  DocmetaError,
85
85
  classifyRef,
86
86
  extractFrontmatter
87
- } from "./chunk-A36QDIXZ.js";
87
+ } from "./chunk-3XGGF5JW.js";
88
88
  import {
89
89
  palette
90
90
  } from "./chunk-RNVYGWIC.js";
@@ -3132,4 +3132,4 @@ export {
3132
3132
  resolveBatchTraces,
3133
3133
  runBatch
3134
3134
  };
3135
- //# sourceMappingURL=chunk-ZH3VTIBL.js.map
3135
+ //# sourceMappingURL=chunk-3XMG4CZY.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  displayPath
4
- } from "./chunk-HOE2C42K.js";
4
+ } from "./chunk-YEUQ7OKT.js";
5
5
  import {
6
6
  escapeWorkflowCommandMessage,
7
7
  escapeWorkflowCommandProperty
@@ -20,4 +20,4 @@ function renderFindingsGithub(report) {
20
20
  export {
21
21
  renderFindingsGithub
22
22
  };
23
- //# sourceMappingURL=chunk-J3IK5IGO.js.map
23
+ //# sourceMappingURL=chunk-5EB6RIXJ.js.map
@@ -1,9 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ TERM_AUX_FIELDS,
4
+ TERM_DESIGNATION_FIELDS,
3
5
  TERM_FIELDS,
4
6
  displayPath,
7
+ isMultilingual,
8
+ languageOf,
5
9
  plural
6
- } from "./chunk-HOE2C42K.js";
10
+ } from "./chunk-YEUQ7OKT.js";
7
11
  import {
8
12
  palette
9
13
  } from "./chunk-RNVYGWIC.js";
@@ -46,9 +50,13 @@ function hanging(first, lines) {
46
50
  function renderListPretty(terms) {
47
51
  const idWidth = Math.max(0, ...terms.map((t) => t.id.length)) + 3;
48
52
  const labelWidth = Math.max(0, ...terms.map((t) => t.record.label.length)) + 3;
49
- const rows = terms.map(
50
- (t) => `${t.id.padEnd(idWidth)}${t.record.label.padEnd(labelWidth)}${(t.record["alt-labels"] ?? []).join(", ")}`.trimEnd()
51
- );
53
+ const multilingual = isMultilingual(terms);
54
+ const languageWidth = Math.max(0, ...terms.map((t) => languageOf(t).length)) + 3;
55
+ const rows = terms.map((t) => {
56
+ const language = multilingual ? languageOf(t).padEnd(languageWidth) : "";
57
+ const alts = (t.record["alt-labels"] ?? []).join(", ");
58
+ return `${t.id.padEnd(idWidth)}${language}${t.record.label.padEnd(labelWidth)}${alts}`.trimEnd();
59
+ });
52
60
  return [...rows, plural(terms.length, "term")].join("\n");
53
61
  }
54
62
  var GET_FIELDS = [
@@ -60,23 +68,88 @@ var GET_FIELDS = [
60
68
  "see",
61
69
  "abstract",
62
70
  "scope-note",
71
+ "subject-field",
72
+ "contexts",
73
+ "notes",
74
+ "sources",
75
+ "customer-subsets",
76
+ "project-subsets",
77
+ "cross-references",
78
+ "external-cross-references",
79
+ "graphics",
80
+ "transactions",
63
81
  "definition"
64
82
  ];
65
- var KEY_WIDTH = Math.max("language".length, ...TERM_FIELDS.map((f) => f.length)) + 2;
83
+ var SHOWN_AUX = TERM_AUX_FIELDS.filter((field) => field !== "tbx-elements");
84
+ var MIN_KEY_WIDTH = 15;
85
+ function linkText(link) {
86
+ return link.text === void 0 ? link.target : `${link.text} (${link.target})`;
87
+ }
88
+ function transactionText(transaction) {
89
+ return [transaction.type, transaction.date, transaction.responsibility].filter((part) => part !== void 0).join(" ");
90
+ }
91
+ function valueText(value) {
92
+ if (typeof value === "string") return value;
93
+ return value.map((item) => typeof item === "string" ? item : "target" in item ? linkText(item) : transactionText(item)).join(", ");
94
+ }
95
+ function designationLine(designation) {
96
+ const parts = [];
97
+ for (const key of TERM_DESIGNATION_FIELDS) {
98
+ const value = designation[key];
99
+ if (value !== void 0) parts.push(`${key} ${value}`);
100
+ }
101
+ const comments = designation["transfer-comments"];
102
+ if (comments !== void 0) parts.push(`transfer-comments ${valueText(comments)}`);
103
+ for (const key of SHOWN_AUX) {
104
+ const value = designation[key];
105
+ if (value !== void 0) parts.push(`${key} ${valueText(value)}`);
106
+ }
107
+ return parts.length === 0 ? void 0 : `${designation.term}: ${parts.join(", ")}`;
108
+ }
109
+ function passThroughText(record) {
110
+ const parts = [];
111
+ const count = (items, where) => {
112
+ if (items !== void 0) parts.push(`${String(items.length)} ${where}`);
113
+ };
114
+ count(record["tbx-elements"], "at the root");
115
+ for (const designation of record.designations ?? []) count(designation["tbx-elements"], `on ${designation.term}`);
116
+ count(record["concept-entry"]?.["tbx-elements"], "in concept-entry");
117
+ return parts.length === 0 ? void 0 : parts.join(", ");
118
+ }
66
119
  function renderGetPretty(term, opts) {
67
120
  const c = palette(opts.color);
121
+ const { record } = term;
68
122
  const where = `${displayPath(term.location.file, opts.cwd ?? process.cwd())}:${String(term.location.line)}`;
69
- const lines = [`${c.bold(term.record.label.padEnd(40))}${c.dim(where)}`];
70
- const row = (key, value) => {
71
- const prefix = ` ${key.padEnd(KEY_WIDTH)}`;
72
- lines.push(...hanging(prefix, wrapWords(value, WIDTH - prefix.length)));
73
- };
74
- row("id", term.id);
75
- if (term.language !== void 0) row("language", term.language);
123
+ const rows = [["id", [term.id]]];
124
+ if (term.language !== void 0) rows.push(["language", [term.language]]);
76
125
  for (const field of GET_FIELDS) {
77
- const value = term.record[field];
78
- if (value === void 0) continue;
79
- row(field, typeof value === "string" ? value : value.join(", "));
126
+ const value = record[field];
127
+ if (value !== void 0) rows.push([field, [valueText(value)]]);
128
+ }
129
+ const concept = record["concept-entry"];
130
+ if (concept !== void 0) {
131
+ const lines2 = SHOWN_AUX.flatMap((key) => {
132
+ const value = concept[key];
133
+ return value === void 0 ? [] : [`${key}: ${valueText(value)}`];
134
+ });
135
+ if (lines2.length > 0) rows.push(["concept-entry", lines2]);
136
+ }
137
+ const designations = (record.designations ?? []).map(designationLine).filter((line) => line !== void 0);
138
+ if (designations.length > 0) rows.push(["designations", designations]);
139
+ if (record["tbx-markup"] !== void 0) rows.push(["tbx-markup", record["tbx-markup"]]);
140
+ const passThrough = passThroughText(record);
141
+ if (passThrough !== void 0) rows.push(["tbx-elements", [passThrough]]);
142
+ const others = opts.others ?? [];
143
+ if (others.length > 0) {
144
+ rows.push(["other languages", [others.map((t) => `${languageOf(t)} (${t.record.label})`).join(", ")]]);
145
+ }
146
+ const keyWidth = Math.max(MIN_KEY_WIDTH, ...rows.map(([key]) => key.length + 2));
147
+ const lines = [`${c.bold(record.label.padEnd(40))}${c.dim(where)}`];
148
+ for (const [key, values] of rows) {
149
+ values.forEach((value, i) => {
150
+ const prefix = ` ${(i === 0 ? key : "").padEnd(keyWidth)}`;
151
+ lines.push(...hanging(prefix, wrapWords(value, WIDTH - prefix.length)));
152
+ });
80
153
  }
81
154
  return lines.join("\n");
82
155
  }
@@ -164,24 +237,53 @@ function valeLines(report) {
164
237
  }
165
238
  function droppedLine(report) {
166
239
  if (report.dropped.length === 0) return void 0;
167
- const ids = /* @__PURE__ */ new Map();
168
- for (const { id, field } of report.dropped) {
169
- const set = ids.get(field) ?? /* @__PURE__ */ new Set();
170
- set.add(id);
171
- ids.set(field, set);
172
- }
173
- const fields = [...ids.entries()].map(([field, set]) => ({ field, n: set.size })).sort((a, b) => a.n - b.n || TERM_FIELDS.indexOf(a.field) - TERM_FIELDS.indexOf(b.field));
240
+ const counts2 = /* @__PURE__ */ new Map();
241
+ for (const { field } of report.dropped) counts2.set(field, (counts2.get(field) ?? 0) + 1);
242
+ const fields = [...counts2.entries()].map(([field, n]) => ({ field, n })).sort((a, b) => a.n - b.n || TERM_FIELDS.indexOf(a.field) - TERM_FIELDS.indexOf(b.field));
174
243
  const parts = fields.map(({ field, n }, i) => `${field} on ${i === 0 ? plural(n, "term") : String(n)}`);
175
244
  return ` dropped from ${report.droppedFrom ?? report.format ?? "the render"}: ${parts.join(", ")}`;
176
245
  }
246
+ function droppedHeadersLine(report) {
247
+ const files = report.droppedHeaders ?? [];
248
+ if (files.length === 0) return void 0;
249
+ const what = files.length === 1 ? "the header of" : "the headers of";
250
+ return ` dropped from ${report.droppedFrom ?? report.format ?? "the render"}: ${what} ${files.join(", ")}`;
251
+ }
177
252
  function skippedLine(report) {
178
253
  if (report.skipped.length === 0) return void 0;
179
254
  const construct = report.droppedFrom ?? report.format ?? "the render";
180
255
  const count = plural(report.skipped.length, "term");
181
256
  return ` skipped ${count} ${construct} cannot read without a definition: ${report.skipped.join(", ")}`;
182
257
  }
258
+ function otherLanguagesLine(report) {
259
+ const other = report.otherLanguages;
260
+ if (other === void 0 || other.terms.length === 0) return void 0;
261
+ const terms = other.terms.map(({ id, language }) => `${id} (${language})`).join(", ");
262
+ return ` skipped ${plural(other.terms.length, "term")} in another language than ${other.written}: ${terms}`;
263
+ }
264
+ function conflictsLine(report) {
265
+ const conflicts = report.conflicts ?? [];
266
+ if (conflicts.length === 0) return void 0;
267
+ const ids = /* @__PURE__ */ new Map();
268
+ for (const { id, field } of conflicts) {
269
+ const set = ids.get(field) ?? /* @__PURE__ */ new Set();
270
+ set.add(id);
271
+ ids.set(field, set);
272
+ }
273
+ const fields = [...ids.entries()].map(([field, set]) => ({ field, n: set.size })).sort((a, b) => a.n - b.n);
274
+ const parts = fields.map(({ field, n }, i) => `${field} on ${i === 0 ? plural(n, "concept") : String(n)}`);
275
+ return ` kept the first language's value where languages differ: ${parts.join(", ")}`;
276
+ }
183
277
  function renderNotes(report) {
184
- return [droppedLine(report), skippedLine(report)].filter((line) => line !== void 0);
278
+ return [
279
+ droppedLine(report),
280
+ droppedHeadersLine(report),
281
+ skippedLine(report),
282
+ otherLanguagesLine(report),
283
+ conflictsLine(report)
284
+ ].filter(
285
+ (line) => line !== void 0
286
+ );
185
287
  }
186
288
  function unchangedLine(report) {
187
289
  return report.mode === "in-place" ? "Nothing to write" : `${report.target ?? ""} is up to date`;
@@ -195,10 +297,11 @@ function renderWritePretty(report) {
195
297
  return [...changes, ...renderNotes(report)].join("\n");
196
298
  }
197
299
  if (report.mode === "in-place") {
198
- return report.changes.length === 0 ? "Nothing to write" : `Wrote ${plural(report.changes.length, "file")}`;
300
+ const wrote = report.changes.length === 0 ? "Nothing to write" : `Wrote ${plural(report.changes.length, "file")}`;
301
+ return [wrote, ...renderNotes(report)].join("\n");
199
302
  }
200
303
  const each = report.shape === "directory" && report.format !== "vale" ? ", one file each" : "";
201
- const written = report.terms - report.skipped.length;
304
+ const written = report.terms - report.skipped.length - (report.otherLanguages?.terms.length ?? 0);
202
305
  const lines = [`Wrote ${plural(written, "term")} to ${report.target ?? ""}${each}`];
203
306
  if (report.format === "vale") lines.push(...valeLines(report));
204
307
  lines.push(...renderNotes(report));
@@ -227,4 +330,4 @@ export {
227
330
  renderValeWiring,
228
331
  renderFormatsPretty
229
332
  };
230
- //# sourceMappingURL=chunk-G4T6SF3C.js.map
333
+ //# sourceMappingURL=chunk-5LBEQ4ZU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/term/reporters/pretty.ts"],"sourcesContent":["/**\n * Human output for every `manni term` command, in the shapes the ladder of\n * proposal 0052 prints. Columns are padded to their widest value; prose wraps\n * to 80 columns under its own column, so a long definition or message never\n * runs back to the left edge.\n */\nimport { palette, type Colors } from \"../../shared/color.js\";\nimport type { TermReport } from \"../commands/findings.js\";\nimport type { FormatRow } from \"../commands/formats.js\";\nimport { displayPath, plural } from \"../commands/run.js\";\nimport type { ValeWiring, WriteReport } from \"../commands/write.js\";\nimport type { Severity } from \"../../shared/severity.js\";\nimport { isMultilingual, languageOf } from \"../core/writers/render-util.js\";\nimport {\n TERM_AUX_FIELDS,\n TERM_DESIGNATION_FIELDS,\n TERM_FIELDS,\n type Term,\n type TermDesignation,\n type TermField,\n type TermFinding,\n type TermLink,\n type TermRecord,\n type TermTransaction,\n} from \"../types.js\";\n\nconst WIDTH = 80;\n\n/** Words packed into lines of at most `width` characters; a longer word stands alone. */\nfunction wrapWords(text: string, width: number): string[] {\n const lines: string[] = [];\n let line = \"\";\n for (const word of text.split(/\\s+/).filter((w) => w !== \"\")) {\n if (line === \"\") line = word;\n else if (line.length + 1 + word.length <= width) line = `${line} ${word}`;\n else {\n lines.push(line);\n line = word;\n }\n }\n if (line !== \"\") lines.push(line);\n return lines.length === 0 ? [\"\"] : lines;\n}\n\n/** Sentences packed into lines of at most `width`; a message that fits stays whole. */\nfunction wrapSentences(text: string, width: number): string[] {\n if (text.length <= width) return [text];\n const lines: string[] = [];\n let line = \"\";\n for (const sentence of text.split(/(?<=\\.)\\s+(?=\\S)/)) {\n if (line === \"\") line = sentence;\n else if (line.length + 1 + sentence.length <= width) line = `${line} ${sentence}`;\n else {\n lines.push(line);\n line = sentence;\n }\n }\n if (line !== \"\") lines.push(line);\n return lines;\n}\n\nfunction hanging(first: string, lines: readonly string[]): string[] {\n const indent = \" \".repeat(first.length);\n return lines.map((line, i) => `${i === 0 ? first : indent}${line}`.trimEnd());\n}\n\n// ---------------------------------------------------------------------------\n// list\n\nexport function renderListPretty(terms: readonly Term[]): string {\n const idWidth = Math.max(0, ...terms.map((t) => t.id.length)) + 3;\n const labelWidth = Math.max(0, ...terms.map((t) => t.record.label.length)) + 3;\n // The language column appears only when it tells the rows apart.\n const multilingual = isMultilingual(terms);\n const languageWidth = Math.max(0, ...terms.map((t) => languageOf(t).length)) + 3;\n const rows = terms.map((t) => {\n const language = multilingual ? languageOf(t).padEnd(languageWidth) : \"\";\n const alts = (t.record[\"alt-labels\"] ?? []).join(\", \");\n return `${t.id.padEnd(idWidth)}${language}${t.record.label.padEnd(labelWidth)}${alts}`.trimEnd();\n });\n return [...rows, plural(terms.length, \"term\")].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// get\n\n/** A root field `get` shows as one row of text. */\ntype RowField = Exclude<TermField, \"label\" | \"concept-entry\" | \"designations\" | \"tbx-markup\" | \"tbx-elements\">;\n\n/** The order `get` shows root fields in: names first, then what they mean, the definition last. */\nconst GET_FIELDS: readonly RowField[] = [\n \"alt-labels\",\n \"hidden-labels\",\n \"broader\",\n \"narrower\",\n \"related-terms\",\n \"see\",\n \"abstract\",\n \"scope-note\",\n \"subject-field\",\n \"contexts\",\n \"notes\",\n \"sources\",\n \"customer-subsets\",\n \"project-subsets\",\n \"cross-references\",\n \"external-cross-references\",\n \"graphics\",\n \"transactions\",\n \"definition\",\n];\n\n/** The aux fields a block's line shows; its `tbx-elements` are counted on a row of their own. */\nconst SHOWN_AUX = TERM_AUX_FIELDS.filter((field) => field !== \"tbx-elements\");\n\n/** The key column's narrowest width: the widest 1.0.0 field, `related-terms`, plus two. */\nconst MIN_KEY_WIDTH = 15;\n\nfunction linkText(link: TermLink): string {\n return link.text === undefined ? link.target : `${link.text} (${link.target})`;\n}\n\nfunction transactionText(transaction: TermTransaction): string {\n return [transaction.type, transaction.date, transaction.responsibility].filter((part) => part !== undefined).join(\" \");\n}\n\n/** One value as `get` prints it: a list joined with commas, a link as its text and target, a transaction as its parts. */\nfunction valueText(value: string | readonly (string | TermLink | TermTransaction)[]): string {\n if (typeof value === \"string\") return value;\n return value\n .map((item) => (typeof item === \"string\" ? item : \"target\" in item ? linkText(item) : transactionText(item)))\n .join(\", \");\n}\n\n/** `progressive lens: part-of-speech noun, term-type fullForm`, or `undefined` when it says nothing but its term. */\nfunction designationLine(designation: TermDesignation): string | undefined {\n const parts: string[] = [];\n for (const key of TERM_DESIGNATION_FIELDS) {\n const value = designation[key];\n if (value !== undefined) parts.push(`${key} ${value}`);\n }\n const comments = designation[\"transfer-comments\"];\n if (comments !== undefined) parts.push(`transfer-comments ${valueText(comments)}`);\n for (const key of SHOWN_AUX) {\n const value = designation[key];\n if (value !== undefined) parts.push(`${key} ${valueText(value)}`);\n }\n return parts.length === 0 ? undefined : `${designation.term}: ${parts.join(\", \")}`;\n}\n\n/** `1 at the root, 1 on PAL, 1 in concept-entry`: where the record keeps elements no named field maps. */\nfunction passThroughText(record: TermRecord): string | undefined {\n const parts: string[] = [];\n const count = (items: readonly string[] | undefined, where: string): void => {\n if (items !== undefined) parts.push(`${String(items.length)} ${where}`);\n };\n count(record[\"tbx-elements\"], \"at the root\");\n for (const designation of record.designations ?? []) count(designation[\"tbx-elements\"], `on ${designation.term}`);\n count(record[\"concept-entry\"]?.[\"tbx-elements\"], \"in concept-entry\");\n return parts.length === 0 ? undefined : parts.join(\", \");\n}\n\nexport interface GetPrettyOptions {\n color: boolean;\n cwd?: string;\n /** The entry in its other languages: the set's other terms with the same id. */\n others?: readonly Term[];\n}\n\nexport function renderGetPretty(term: Term, opts: GetPrettyOptions): string {\n const c = palette(opts.color);\n const { record } = term;\n const where = `${displayPath(term.location.file, opts.cwd ?? process.cwd())}:${String(term.location.line)}`;\n\n // Each row is a key and its lines, collected first so the key column fits the widest key shown.\n const rows: [string, string[]][] = [[\"id\", [term.id]]];\n if (term.language !== undefined) rows.push([\"language\", [term.language]]);\n for (const field of GET_FIELDS) {\n const value = record[field];\n if (value !== undefined) rows.push([field, [valueText(value)]]);\n }\n const concept = record[\"concept-entry\"];\n if (concept !== undefined) {\n const lines = SHOWN_AUX.flatMap((key) => {\n const value = concept[key];\n return value === undefined ? [] : [`${key}: ${valueText(value)}`];\n });\n if (lines.length > 0) rows.push([\"concept-entry\", lines]);\n }\n const designations = (record.designations ?? []).map(designationLine).filter((line) => line !== undefined);\n if (designations.length > 0) rows.push([\"designations\", designations]);\n if (record[\"tbx-markup\"] !== undefined) rows.push([\"tbx-markup\", record[\"tbx-markup\"]]);\n const passThrough = passThroughText(record);\n if (passThrough !== undefined) rows.push([\"tbx-elements\", [passThrough]]);\n const others = opts.others ?? [];\n if (others.length > 0) {\n rows.push([\"other languages\", [others.map((t) => `${languageOf(t)} (${t.record.label})`).join(\", \")]]);\n }\n\n const keyWidth = Math.max(MIN_KEY_WIDTH, ...rows.map(([key]) => key.length + 2));\n const lines = [`${c.bold(record.label.padEnd(40))}${c.dim(where)}`];\n for (const [key, values] of rows) {\n values.forEach((value, i) => {\n const prefix = ` ${(i === 0 ? key : \"\").padEnd(keyWidth)}`;\n lines.push(...hanging(prefix, wrapWords(value, WIDTH - prefix.length)));\n });\n }\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// check and lint\n\nconst RULE_WIDTH = 32;\n\nfunction severityText(c: Colors, severity: Severity): string {\n const padded = severity.padEnd(6);\n if (severity === \"error\") return c.red(padded);\n if (severity === \"warning\") return c.yellow(padded);\n return c.cyan(padded);\n}\n\nfunction counts(findings: readonly TermFinding[]): string {\n const parts: string[] = [];\n const n = (severity: Severity): number => findings.filter((f) => f.severity === severity).length;\n if (n(\"error\") > 0) parts.push(plural(n(\"error\"), \"error\"));\n if (n(\"warning\") > 0) parts.push(plural(n(\"warning\"), \"warning\"));\n if (n(\"notice\") > 0) parts.push(plural(n(\"notice\"), \"notice\"));\n return parts.join(\", \");\n}\n\nexport interface FindingsPrettyOptions {\n color: boolean;\n /** Whether the clean line counts references: `check` reads them, `lint` does not. */\n references?: boolean;\n}\n\nexport function renderFindingsPretty(report: TermReport, opts: FindingsPrettyOptions): string {\n const c = palette(opts.color);\n const { baseline } = report;\n if (baseline?.written === true) {\n return `${c.green(\"✓\")} ${plural(report.found, \"finding\")} recorded in ${baseline.path}`;\n }\n const baselined = baseline !== undefined && baseline.suppressed > 0 ? `, ${String(baseline.suppressed)} baselined` : \"\";\n const terms = plural(report.terms, \"term\");\n\n if (report.findings.length === 0) {\n const references = opts.references === false ? \"\" : `, ${plural(report.references, \"reference\")}`;\n return `${c.green(\"✓\")} ${terms}${references}, no findings${baselined}`;\n }\n\n const ruleWidth = Math.max(RULE_WIDTH, ...report.findings.map((f) => f.ruleId.length + 2));\n const lines: string[] = [];\n let group: string | undefined;\n for (const finding of report.findings) {\n const file = displayPath(finding.file, report.cwd);\n const header = finding.line === undefined ? file : `${file}:${String(finding.line)}`;\n if (header !== group) {\n lines.push(c.bold(header));\n group = header;\n }\n const prefixWidth = 2 + 6 + 1 + ruleWidth;\n const message = wrapSentences(finding.message, WIDTH - prefixWidth);\n const indent = \" \".repeat(prefixWidth);\n message.forEach((text, i) => {\n lines.push(\n i === 0 ? ` ${severityText(c, finding.severity)} ${finding.ruleId.padEnd(ruleWidth)}${text}` : `${indent}${text}`,\n );\n });\n }\n lines.push(\"\", `${counts(report.findings)} in ${terms}${baselined}`);\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// write\n\nfunction changeLine(change: WriteReport[\"changes\"][number]): string {\n switch (change.action) {\n case \"create\":\n return `${change.path} would be created`;\n case \"change\":\n return `${change.path} would change`;\n case \"remove\":\n return `${change.path} would be removed`;\n }\n}\n\n/** A generated Vale rule file's `swap:` entries. */\nfunction swapCount(content: string): number {\n const lines = content.split(/\\r?\\n/);\n const start = lines.indexOf(\"swap:\");\n if (start === -1) return 0;\n return lines.slice(start + 1).filter((line) => line.startsWith(\" \")).length;\n}\n\nfunction baseName(path: string): string {\n return path.split(/[\\\\/]/).pop() ?? path;\n}\n\nconst CASING_RULES = new Set([\"Casing.yml\", \"Lowercase.yml\", \"SentenceStart.yml\"]);\n\n/** What each file of a Vale style holds: rule files by name, the acronym files together. */\nfunction valeLines(report: WriteReport): string[] {\n const rows: [string, string][] = [];\n const acronyms: string[] = [];\n for (const file of report.files) {\n const name = baseName(file.path);\n // A casing rule swaps each label and alt-label, so what it counts is labels.\n if (CASING_RULES.has(name)) rows.push([name, plural(swapCount(file.content), \"label\")]);\n else if (name === \"Deprecated.yml\") rows.push([name, plural(swapCount(file.content), \"swap\")]);\n else acronyms.push(name);\n }\n if (acronyms.length > 0) rows.push([acronyms.join(\", \"), plural(acronyms.length, \"acronym\")]);\n const width = Math.max(0, ...rows.map(([name]) => name.length)) + 2;\n return rows.map(([name, what]) => ` ${name.padEnd(width)}${what}`);\n}\n\n/** ` dropped from a definition list: scope-note on 3 terms, hidden-labels on 12`. */\nfunction droppedLine(report: WriteReport): string | undefined {\n if (report.dropped.length === 0) return undefined;\n // One entry per term per field, so counting entries counts terms: an id in two languages is two terms.\n const counts = new Map<TermField, number>();\n for (const { field } of report.dropped) counts.set(field, (counts.get(field) ?? 0) + 1);\n const fields = [...counts.entries()]\n .map(([field, n]) => ({ field, n }))\n .sort((a, b) => a.n - b.n || TERM_FIELDS.indexOf(a.field) - TERM_FIELDS.indexOf(b.field));\n const parts = fields.map(({ field, n }, i) => `${field} on ${i === 0 ? plural(n, \"term\") : String(n)}`);\n return ` dropped from ${report.droppedFrom ?? report.format ?? \"the render\"}: ${parts.join(\", \")}`;\n}\n\n/** ` dropped from tbx3: the headers of glossary.tbx, <stdin>`. */\nfunction droppedHeadersLine(report: WriteReport): string | undefined {\n const files = report.droppedHeaders ?? [];\n if (files.length === 0) return undefined;\n const what = files.length === 1 ? \"the header of\" : \"the headers of\";\n return ` dropped from ${report.droppedFrom ?? report.format ?? \"the render\"}: ${what} ${files.join(\", \")}`;\n}\n\n/** ` skipped 2 terms a definition list cannot read without a definition: varifocal, bifocal`. */\nfunction skippedLine(report: WriteReport): string | undefined {\n if (report.skipped.length === 0) return undefined;\n const construct = report.droppedFrom ?? report.format ?? \"the render\";\n const count = plural(report.skipped.length, \"term\");\n return ` skipped ${count} ${construct} cannot read without a definition: ${report.skipped.join(\", \")}`;\n}\n\n/** ` skipped 2 terms in another language than en: spectacle-lens (de), progressive-lens (de)`. */\nfunction otherLanguagesLine(report: WriteReport): string | undefined {\n const other = report.otherLanguages;\n if (other === undefined || other.terms.length === 0) return undefined;\n const terms = other.terms.map(({ id, language }) => `${id} (${language})`).join(\", \");\n return ` skipped ${plural(other.terms.length, \"term\")} in another language than ${other.written}: ${terms}`;\n}\n\n/**\n * ` kept the first language's value where languages differ: concept-entry.subject-field on 1 concept`.\n * Fields are counted in concepts, fewest first, as the dropped line counts terms.\n */\nfunction conflictsLine(report: WriteReport): string | undefined {\n const conflicts = report.conflicts ?? [];\n if (conflicts.length === 0) return undefined;\n const ids = new Map<string, Set<string>>();\n for (const { id, field } of conflicts) {\n const set = ids.get(field) ?? new Set<string>();\n set.add(id);\n ids.set(field, set);\n }\n // A stable sort keeps fields of one count in the order they were first reported.\n const fields = [...ids.entries()].map(([field, set]) => ({ field, n: set.size })).sort((a, b) => a.n - b.n);\n const parts = fields.map(({ field, n }, i) => `${field} on ${i === 0 ? plural(n, \"concept\") : String(n)}`);\n return ` kept the first language's value where languages differ: ${parts.join(\", \")}`;\n}\n\n/** The dropped, dropped-header, skipped and conflict lines, which a write and a dry run print alike. */\nfunction renderNotes(report: WriteReport): string[] {\n return [\n droppedLine(report),\n droppedHeadersLine(report),\n skippedLine(report),\n otherLanguagesLine(report),\n conflictsLine(report),\n ].filter(\n (line) => line !== undefined,\n );\n}\n\nfunction unchangedLine(report: WriteReport): string {\n return report.mode === \"in-place\" ? \"Nothing to write\" : `${report.target ?? \"\"} is up to date`;\n}\n\nexport function renderWritePretty(report: WriteReport): string {\n if (report.check) {\n return report.changes.length > 0 ? report.changes.map(changeLine).join(\"\\n\") : unchangedLine(report);\n }\n if (report.dryRun) {\n const changes = report.changes.length > 0 ? report.changes.map(changeLine) : [unchangedLine(report)];\n return [...changes, ...renderNotes(report)].join(\"\\n\");\n }\n if (report.mode === \"in-place\") {\n const wrote = report.changes.length === 0 ? \"Nothing to write\" : `Wrote ${plural(report.changes.length, \"file\")}`;\n return [wrote, ...renderNotes(report)].join(\"\\n\");\n }\n const each = report.shape === \"directory\" && report.format !== \"vale\" ? \", one file each\" : \"\";\n const written = report.terms - report.skipped.length - (report.otherLanguages?.terms.length ?? 0);\n const lines = [`Wrote ${plural(written, \"term\")} to ${report.target ?? \"\"}${each}`];\n if (report.format === \"vale\") lines.push(...valeLines(report));\n lines.push(...renderNotes(report));\n return lines.join(\"\\n\");\n}\n\n/** The notice `write -f vale` prints when no section of Vale's config uses the style, or there is no section. */\nexport function renderValeWiring(wiring: ValeWiring): string {\n return [\n wiring.addSection\n ? `notice: ${wiring.rootIni} has no section with BasedOnStyles. Add one that uses the Terms style:`\n : `notice: no section of ${wiring.rootIni} uses the Terms style. Add it to BasedOnStyles:`,\n ` [${wiring.section}]`,\n ` BasedOnStyles = ${wiring.styles.join(\", \")}`,\n ].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// formats\n\nexport function renderFormatsPretty(rows: readonly FormatRow[]): string {\n const formatWidth = Math.max(0, ...rows.map((r) => r.format.length)) + 3;\n const labelWidth = Math.max(0, ...rows.map((r) => r.label.length)) + 3;\n return rows\n .map((r) =>\n `${r.format.padEnd(formatWidth)}${r.label.padEnd(labelWidth)}${r.read ? \"read \" : \" \"}${r.write ? \"write\" : \"\"}`.trimEnd(),\n )\n .join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;;;;;;;AA0BA,IAAM,QAAQ;AAGd,SAAS,UAAU,MAAc,OAAyB;AACxD,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO;AACX,aAAW,QAAQ,KAAK,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE,GAAG;AAC5D,QAAI,SAAS,GAAI,QAAO;AAAA,aACf,KAAK,SAAS,IAAI,KAAK,UAAU,MAAO,QAAO,GAAG,IAAI,IAAI,IAAI;AAAA,SAClE;AACH,YAAM,KAAK,IAAI;AACf,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,SAAS,GAAI,OAAM,KAAK,IAAI;AAChC,SAAO,MAAM,WAAW,IAAI,CAAC,EAAE,IAAI;AACrC;AAGA,SAAS,cAAc,MAAc,OAAyB;AAC5D,MAAI,KAAK,UAAU,MAAO,QAAO,CAAC,IAAI;AACtC,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO;AACX,aAAW,YAAY,KAAK,MAAM,kBAAkB,GAAG;AACrD,QAAI,SAAS,GAAI,QAAO;AAAA,aACf,KAAK,SAAS,IAAI,SAAS,UAAU,MAAO,QAAO,GAAG,IAAI,IAAI,QAAQ;AAAA,SAC1E;AACH,YAAM,KAAK,IAAI;AACf,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,SAAS,GAAI,OAAM,KAAK,IAAI;AAChC,SAAO;AACT;AAEA,SAAS,QAAQ,OAAe,OAAoC;AAClE,QAAM,SAAS,IAAI,OAAO,MAAM,MAAM;AACtC,SAAO,MAAM,IAAI,CAAC,MAAM,MAAM,GAAG,MAAM,IAAI,QAAQ,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;AAC9E;AAKO,SAAS,iBAAiB,OAAgC;AAC/D,QAAM,UAAU,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI;AAChE,QAAM,aAAa,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,MAAM,MAAM,CAAC,IAAI;AAE7E,QAAM,eAAe,eAAe,KAAK;AACzC,QAAM,gBAAgB,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,WAAW,CAAC,EAAE,MAAM,CAAC,IAAI;AAC/E,QAAM,OAAO,MAAM,IAAI,CAAC,MAAM;AAC5B,UAAM,WAAW,eAAe,WAAW,CAAC,EAAE,OAAO,aAAa,IAAI;AACtE,UAAM,QAAQ,EAAE,OAAO,YAAY,KAAK,CAAC,GAAG,KAAK,IAAI;AACrD,WAAO,GAAG,EAAE,GAAG,OAAO,OAAO,CAAC,GAAG,QAAQ,GAAG,EAAE,OAAO,MAAM,OAAO,UAAU,CAAC,GAAG,IAAI,GAAG,QAAQ;AAAA,EACjG,CAAC;AACD,SAAO,CAAC,GAAG,MAAM,OAAO,MAAM,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AAC1D;AASA,IAAM,aAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,YAAY,gBAAgB,OAAO,CAAC,UAAU,UAAU,cAAc;AAG5E,IAAM,gBAAgB;AAEtB,SAAS,SAAS,MAAwB;AACxC,SAAO,KAAK,SAAS,SAAY,KAAK,SAAS,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM;AAC7E;AAEA,SAAS,gBAAgB,aAAsC;AAC7D,SAAO,CAAC,YAAY,MAAM,YAAY,MAAM,YAAY,cAAc,EAAE,OAAO,CAAC,SAAS,SAAS,MAAS,EAAE,KAAK,GAAG;AACvH;AAGA,SAAS,UAAU,OAA0E;AAC3F,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,MACJ,IAAI,CAAC,SAAU,OAAO,SAAS,WAAW,OAAO,YAAY,OAAO,SAAS,IAAI,IAAI,gBAAgB,IAAI,CAAE,EAC3G,KAAK,IAAI;AACd;AAGA,SAAS,gBAAgB,aAAkD;AACzE,QAAM,QAAkB,CAAC;AACzB,aAAW,OAAO,yBAAyB;AACzC,UAAM,QAAQ,YAAY,GAAG;AAC7B,QAAI,UAAU,OAAW,OAAM,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,EACvD;AACA,QAAM,WAAW,YAAY,mBAAmB;AAChD,MAAI,aAAa,OAAW,OAAM,KAAK,qBAAqB,UAAU,QAAQ,CAAC,EAAE;AACjF,aAAW,OAAO,WAAW;AAC3B,UAAM,QAAQ,YAAY,GAAG;AAC7B,QAAI,UAAU,OAAW,OAAM,KAAK,GAAG,GAAG,IAAI,UAAU,KAAK,CAAC,EAAE;AAAA,EAClE;AACA,SAAO,MAAM,WAAW,IAAI,SAAY,GAAG,YAAY,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC;AAClF;AAGA,SAAS,gBAAgB,QAAwC;AAC/D,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,CAAC,OAAsC,UAAwB;AAC3E,QAAI,UAAU,OAAW,OAAM,KAAK,GAAG,OAAO,MAAM,MAAM,CAAC,IAAI,KAAK,EAAE;AAAA,EACxE;AACA,QAAM,OAAO,cAAc,GAAG,aAAa;AAC3C,aAAW,eAAe,OAAO,gBAAgB,CAAC,EAAG,OAAM,YAAY,cAAc,GAAG,MAAM,YAAY,IAAI,EAAE;AAChH,QAAM,OAAO,eAAe,IAAI,cAAc,GAAG,kBAAkB;AACnE,SAAO,MAAM,WAAW,IAAI,SAAY,MAAM,KAAK,IAAI;AACzD;AASO,SAAS,gBAAgB,MAAY,MAAgC;AAC1E,QAAM,IAAI,QAAQ,KAAK,KAAK;AAC5B,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,QAAQ,GAAG,YAAY,KAAK,SAAS,MAAM,KAAK,OAAO,QAAQ,IAAI,CAAC,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC;AAGzG,QAAM,OAA6B,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACrD,MAAI,KAAK,aAAa,OAAW,MAAK,KAAK,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC;AACxE,aAAW,SAAS,YAAY;AAC9B,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,UAAU,OAAW,MAAK,KAAK,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;AAAA,EAChE;AACA,QAAM,UAAU,OAAO,eAAe;AACtC,MAAI,YAAY,QAAW;AACzB,UAAMA,SAAQ,UAAU,QAAQ,CAAC,QAAQ;AACvC,YAAM,QAAQ,QAAQ,GAAG;AACzB,aAAO,UAAU,SAAY,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IAClE,CAAC;AACD,QAAIA,OAAM,SAAS,EAAG,MAAK,KAAK,CAAC,iBAAiBA,MAAK,CAAC;AAAA,EAC1D;AACA,QAAM,gBAAgB,OAAO,gBAAgB,CAAC,GAAG,IAAI,eAAe,EAAE,OAAO,CAAC,SAAS,SAAS,MAAS;AACzG,MAAI,aAAa,SAAS,EAAG,MAAK,KAAK,CAAC,gBAAgB,YAAY,CAAC;AACrE,MAAI,OAAO,YAAY,MAAM,OAAW,MAAK,KAAK,CAAC,cAAc,OAAO,YAAY,CAAC,CAAC;AACtF,QAAM,cAAc,gBAAgB,MAAM;AAC1C,MAAI,gBAAgB,OAAW,MAAK,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;AACxE,QAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,MAAI,OAAO,SAAS,GAAG;AACrB,SAAK,KAAK,CAAC,mBAAmB,CAAC,OAAO,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,EACvG;AAEA,QAAM,WAAW,KAAK,IAAI,eAAe,GAAG,KAAK,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,SAAS,CAAC,CAAC;AAC/E,QAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,OAAO,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,EAAE;AAClE,aAAW,CAAC,KAAK,MAAM,KAAK,MAAM;AAChC,WAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,YAAM,SAAS,MAAM,MAAM,IAAI,MAAM,IAAI,OAAO,QAAQ,CAAC;AACzD,YAAM,KAAK,GAAG,QAAQ,QAAQ,UAAU,OAAO,QAAQ,OAAO,MAAM,CAAC,CAAC;AAAA,IACxE,CAAC;AAAA,EACH;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,IAAM,aAAa;AAEnB,SAAS,aAAa,GAAW,UAA4B;AAC3D,QAAM,SAAS,SAAS,OAAO,CAAC;AAChC,MAAI,aAAa,QAAS,QAAO,EAAE,IAAI,MAAM;AAC7C,MAAI,aAAa,UAAW,QAAO,EAAE,OAAO,MAAM;AAClD,SAAO,EAAE,KAAK,MAAM;AACtB;AAEA,SAAS,OAAO,UAA0C;AACxD,QAAM,QAAkB,CAAC;AACzB,QAAM,IAAI,CAAC,aAA+B,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ,EAAE;AAC1F,MAAI,EAAE,OAAO,IAAI,EAAG,OAAM,KAAK,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;AAC1D,MAAI,EAAE,SAAS,IAAI,EAAG,OAAM,KAAK,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;AAChE,MAAI,EAAE,QAAQ,IAAI,EAAG,OAAM,KAAK,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC;AAC7D,SAAO,MAAM,KAAK,IAAI;AACxB;AAQO,SAAS,qBAAqB,QAAoB,MAAqC;AAC5F,QAAM,IAAI,QAAQ,KAAK,KAAK;AAC5B,QAAM,EAAE,SAAS,IAAI;AACrB,MAAI,UAAU,YAAY,MAAM;AAC9B,WAAO,GAAG,EAAE,MAAM,QAAG,CAAC,IAAI,OAAO,OAAO,OAAO,SAAS,CAAC,gBAAgB,SAAS,IAAI;AAAA,EACxF;AACA,QAAM,YAAY,aAAa,UAAa,SAAS,aAAa,IAAI,KAAK,OAAO,SAAS,UAAU,CAAC,eAAe;AACrH,QAAM,QAAQ,OAAO,OAAO,OAAO,MAAM;AAEzC,MAAI,OAAO,SAAS,WAAW,GAAG;AAChC,UAAM,aAAa,KAAK,eAAe,QAAQ,KAAK,KAAK,OAAO,OAAO,YAAY,WAAW,CAAC;AAC/F,WAAO,GAAG,EAAE,MAAM,QAAG,CAAC,IAAI,KAAK,GAAG,UAAU,gBAAgB,SAAS;AAAA,EACvE;AAEA,QAAM,YAAY,KAAK,IAAI,YAAY,GAAG,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,CAAC;AACzF,QAAM,QAAkB,CAAC;AACzB,MAAI;AACJ,aAAW,WAAW,OAAO,UAAU;AACrC,UAAM,OAAO,YAAY,QAAQ,MAAM,OAAO,GAAG;AACjD,UAAM,SAAS,QAAQ,SAAS,SAAY,OAAO,GAAG,IAAI,IAAI,OAAO,QAAQ,IAAI,CAAC;AAClF,QAAI,WAAW,OAAO;AACpB,YAAM,KAAK,EAAE,KAAK,MAAM,CAAC;AACzB,cAAQ;AAAA,IACV;AACA,UAAM,cAAc,IAAI,IAAI,IAAI;AAChC,UAAM,UAAU,cAAc,QAAQ,SAAS,QAAQ,WAAW;AAClE,UAAM,SAAS,IAAI,OAAO,WAAW;AACrC,YAAQ,QAAQ,CAAC,MAAM,MAAM;AAC3B,YAAM;AAAA,QACJ,MAAM,IAAI,KAAK,aAAa,GAAG,QAAQ,QAAQ,CAAC,IAAI,QAAQ,OAAO,OAAO,SAAS,CAAC,GAAG,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI;AAAA,MAClH;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,KAAK,IAAI,GAAG,OAAO,OAAO,QAAQ,CAAC,OAAO,KAAK,GAAG,SAAS,EAAE;AACnE,SAAO,MAAM,KAAK,IAAI;AACxB;AAKA,SAAS,WAAW,QAAgD;AAClE,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,GAAG,OAAO,IAAI;AAAA,IACvB,KAAK;AACH,aAAO,GAAG,OAAO,IAAI;AAAA,IACvB,KAAK;AACH,aAAO,GAAG,OAAO,IAAI;AAAA,EACzB;AACF;AAGA,SAAS,UAAU,SAAyB;AAC1C,QAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,QAAM,QAAQ,MAAM,QAAQ,OAAO;AACnC,MAAI,UAAU,GAAI,QAAO;AACzB,SAAO,MAAM,MAAM,QAAQ,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,EAAE;AACxE;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,KAAK,MAAM,OAAO,EAAE,IAAI,KAAK;AACtC;AAEA,IAAM,eAAe,oBAAI,IAAI,CAAC,cAAc,iBAAiB,mBAAmB,CAAC;AAGjF,SAAS,UAAU,QAA+B;AAChD,QAAM,OAA2B,CAAC;AAClC,QAAM,WAAqB,CAAC;AAC5B,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,OAAO,SAAS,KAAK,IAAI;AAE/B,QAAI,aAAa,IAAI,IAAI,EAAG,MAAK,KAAK,CAAC,MAAM,OAAO,UAAU,KAAK,OAAO,GAAG,OAAO,CAAC,CAAC;AAAA,aAC7E,SAAS,iBAAkB,MAAK,KAAK,CAAC,MAAM,OAAO,UAAU,KAAK,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,QACxF,UAAS,KAAK,IAAI;AAAA,EACzB;AACA,MAAI,SAAS,SAAS,EAAG,MAAK,KAAK,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,SAAS,QAAQ,SAAS,CAAC,CAAC;AAC5F,QAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI;AAClE,SAAO,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,KAAK,KAAK,OAAO,KAAK,CAAC,GAAG,IAAI,EAAE;AACpE;AAGA,SAAS,YAAY,QAAyC;AAC5D,MAAI,OAAO,QAAQ,WAAW,EAAG,QAAO;AAExC,QAAMC,UAAS,oBAAI,IAAuB;AAC1C,aAAW,EAAE,MAAM,KAAK,OAAO,QAAS,CAAAA,QAAO,IAAI,QAAQA,QAAO,IAAI,KAAK,KAAK,KAAK,CAAC;AACtF,QAAM,SAAS,CAAC,GAAGA,QAAO,QAAQ,CAAC,EAChC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,YAAY,QAAQ,EAAE,KAAK,IAAI,YAAY,QAAQ,EAAE,KAAK,CAAC;AAC1F,QAAM,QAAQ,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,KAAK,OAAO,MAAM,IAAI,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE;AACtG,SAAO,kBAAkB,OAAO,eAAe,OAAO,UAAU,YAAY,KAAK,MAAM,KAAK,IAAI,CAAC;AACnG;AAGA,SAAS,mBAAmB,QAAyC;AACnE,QAAM,QAAQ,OAAO,kBAAkB,CAAC;AACxC,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,OAAO,MAAM,WAAW,IAAI,kBAAkB;AACpD,SAAO,kBAAkB,OAAO,eAAe,OAAO,UAAU,YAAY,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC;AAC3G;AAGA,SAAS,YAAY,QAAyC;AAC5D,MAAI,OAAO,QAAQ,WAAW,EAAG,QAAO;AACxC,QAAM,YAAY,OAAO,eAAe,OAAO,UAAU;AACzD,QAAM,QAAQ,OAAO,OAAO,QAAQ,QAAQ,MAAM;AAClD,SAAO,aAAa,KAAK,IAAI,SAAS,sCAAsC,OAAO,QAAQ,KAAK,IAAI,CAAC;AACvG;AAGA,SAAS,mBAAmB,QAAyC;AACnE,QAAM,QAAQ,OAAO;AACrB,MAAI,UAAU,UAAa,MAAM,MAAM,WAAW,EAAG,QAAO;AAC5D,QAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,EAAE,IAAI,SAAS,MAAM,GAAG,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK,IAAI;AACpF,SAAO,aAAa,OAAO,MAAM,MAAM,QAAQ,MAAM,CAAC,6BAA6B,MAAM,OAAO,KAAK,KAAK;AAC5G;AAMA,SAAS,cAAc,QAAyC;AAC9D,QAAM,YAAY,OAAO,aAAa,CAAC;AACvC,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,QAAM,MAAM,oBAAI,IAAyB;AACzC,aAAW,EAAE,IAAI,MAAM,KAAK,WAAW;AACrC,UAAM,MAAM,IAAI,IAAI,KAAK,KAAK,oBAAI,IAAY;AAC9C,QAAI,IAAI,EAAE;AACV,QAAI,IAAI,OAAO,GAAG;AAAA,EACpB;AAEA,QAAM,SAAS,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,EAAE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1G,QAAM,QAAQ,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,KAAK,OAAO,MAAM,IAAI,OAAO,GAAG,SAAS,IAAI,OAAO,CAAC,CAAC,EAAE;AACzG,SAAO,6DAA6D,MAAM,KAAK,IAAI,CAAC;AACtF;AAGA,SAAS,YAAY,QAA+B;AAClD,SAAO;AAAA,IACL,YAAY,MAAM;AAAA,IAClB,mBAAmB,MAAM;AAAA,IACzB,YAAY,MAAM;AAAA,IAClB,mBAAmB,MAAM;AAAA,IACzB,cAAc,MAAM;AAAA,EACtB,EAAE;AAAA,IACA,CAAC,SAAS,SAAS;AAAA,EACrB;AACF;AAEA,SAAS,cAAc,QAA6B;AAClD,SAAO,OAAO,SAAS,aAAa,qBAAqB,GAAG,OAAO,UAAU,EAAE;AACjF;AAEO,SAAS,kBAAkB,QAA6B;AAC7D,MAAI,OAAO,OAAO;AAChB,WAAO,OAAO,QAAQ,SAAS,IAAI,OAAO,QAAQ,IAAI,UAAU,EAAE,KAAK,IAAI,IAAI,cAAc,MAAM;AAAA,EACrG;AACA,MAAI,OAAO,QAAQ;AACjB,UAAM,UAAU,OAAO,QAAQ,SAAS,IAAI,OAAO,QAAQ,IAAI,UAAU,IAAI,CAAC,cAAc,MAAM,CAAC;AACnG,WAAO,CAAC,GAAG,SAAS,GAAG,YAAY,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,EACvD;AACA,MAAI,OAAO,SAAS,YAAY;AAC9B,UAAM,QAAQ,OAAO,QAAQ,WAAW,IAAI,qBAAqB,SAAS,OAAO,OAAO,QAAQ,QAAQ,MAAM,CAAC;AAC/G,WAAO,CAAC,OAAO,GAAG,YAAY,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,EAClD;AACA,QAAM,OAAO,OAAO,UAAU,eAAe,OAAO,WAAW,SAAS,oBAAoB;AAC5F,QAAM,UAAU,OAAO,QAAQ,OAAO,QAAQ,UAAU,OAAO,gBAAgB,MAAM,UAAU;AAC/F,QAAM,QAAQ,CAAC,SAAS,OAAO,SAAS,MAAM,CAAC,OAAO,OAAO,UAAU,EAAE,GAAG,IAAI,EAAE;AAClF,MAAI,OAAO,WAAW,OAAQ,OAAM,KAAK,GAAG,UAAU,MAAM,CAAC;AAC7D,QAAM,KAAK,GAAG,YAAY,MAAM,CAAC;AACjC,SAAO,MAAM,KAAK,IAAI;AACxB;AAGO,SAAS,iBAAiB,QAA4B;AAC3D,SAAO;AAAA,IACL,OAAO,aACH,WAAW,OAAO,OAAO,2EACzB,yBAAyB,OAAO,OAAO;AAAA,IAC3C,MAAM,OAAO,OAAO;AAAA,IACpB,qBAAqB,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,EAC/C,EAAE,KAAK,IAAI;AACb;AAKO,SAAS,oBAAoB,MAAoC;AACtE,QAAM,cAAc,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC,IAAI;AACvE,QAAM,aAAa,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,IAAI;AACrE,SAAO,KACJ;AAAA,IAAI,CAAC,MACJ,GAAG,EAAE,OAAO,OAAO,WAAW,CAAC,GAAG,EAAE,MAAM,OAAO,UAAU,CAAC,GAAG,EAAE,OAAO,WAAW,QAAQ,GAAG,EAAE,QAAQ,UAAU,EAAE,GAAG,QAAQ;AAAA,EACjI,EACC,KAAK,IAAI;AACd;","names":["lines","counts"]}
@@ -22,7 +22,7 @@ import {
22
22
  runRelocate,
23
23
  runVendorSchema,
24
24
  terminalConfirm
25
- } from "./chunk-AZXCL5WH.js";
25
+ } from "./chunk-IN6DWNVE.js";
26
26
  import {
27
27
  LOCATION_EXTERNAL_SCHEMA,
28
28
  LOCATION_PAGE_SCHEMA,
@@ -42,7 +42,7 @@ import {
42
42
  rowsToFindings,
43
43
  runValidate,
44
44
  splitList
45
- } from "./chunk-KRSLDZ7N.js";
45
+ } from "./chunk-QCCAHV6A.js";
46
46
  import {
47
47
  COMMON_FORMATS,
48
48
  COMMON_FORMAT_LIST,
@@ -58,7 +58,7 @@ import {
58
58
  isQueryFormat,
59
59
  isReportFormat,
60
60
  render
61
- } from "./chunk-ZDYW7XTS.js";
61
+ } from "./chunk-X6WLCNKC.js";
62
62
  import {
63
63
  DocmetaError,
64
64
  STDIN_LABEL,
@@ -68,7 +68,7 @@ import {
68
68
  schemaLoadOptions,
69
69
  supportedExtensions,
70
70
  toJsonText
71
- } from "./chunk-A36QDIXZ.js";
71
+ } from "./chunk-3XGGF5JW.js";
72
72
  import {
73
73
  fail
74
74
  } from "./chunk-YEUYKR62.js";
@@ -85,7 +85,7 @@ import {
85
85
  } from "./chunk-QCHVR4ZM.js";
86
86
  import {
87
87
  package_default
88
- } from "./chunk-CGO5MNRD.js";
88
+ } from "./chunk-KX5IYIOO.js";
89
89
  import {
90
90
  programName
91
91
  } from "./chunk-OWBRDNRZ.js";
@@ -1523,4 +1523,4 @@ export {
1523
1523
  parseQueryParams,
1524
1524
  buildProgram
1525
1525
  };
1526
- //# sourceMappingURL=chunk-WZFA33SD.js.map
1526
+ //# sourceMappingURL=chunk-5WME4CB6.js.map
@@ -8,7 +8,7 @@ import {
8
8
  newAvailability,
9
9
  newReplay,
10
10
  remapAvailability
11
- } from "./chunk-TKVGEFMH.js";
11
+ } from "./chunk-XTAHZTES.js";
12
12
  import {
13
13
  makeRedactor
14
14
  } from "./chunk-CU57HT2E.js";
@@ -718,6 +718,7 @@ var DEFAULTS = {
718
718
  };
719
719
  var MIN_TIMELINE_CHARS = 200;
720
720
  var HEADER_TRUNCATED = "\n[... header truncated ...]";
721
+ var TURN_HEADING = "## The last turn";
721
722
  var TIMELINE_SHELL = "\n\n## Timeline\n";
722
723
  function renderTrace(trace, options = {}, plan) {
723
724
  const { maxBlockChars, maxTotalChars, redact } = { ...DEFAULTS, ...options };
@@ -788,7 +789,12 @@ function renderTrace(trace, options = {}, plan) {
788
789
  }
789
790
  const lines = [];
790
791
  let branch;
792
+ let turnAt;
791
793
  for (const event of events) {
794
+ if (turnAt === void 0 && options.turnFrom !== void 0 && event.index >= options.turnFrom) {
795
+ turnAt = lines.length;
796
+ if (turnAt > 0) lines.push(TURN_HEADING);
797
+ }
792
798
  const tag = event.branchId ? `:${label(event.branchId)}` : event.sidechain ? ":sidechain" : "";
793
799
  let line;
794
800
  switch (event.kind) {
@@ -820,11 +826,23 @@ function renderTrace(trace, options = {}, plan) {
820
826
  lines.push(line);
821
827
  }
822
828
  if (branch !== void 0) lines.push(`[/subagent ${label(branch)}]`);
823
- let timeline = scrub(lines.join("\n"));
824
829
  const budget = Math.max(
825
830
  maxTotalChars - header.length - TIMELINE_SHELL.length,
826
831
  MIN_TIMELINE_CHARS
827
832
  );
833
+ if (turnAt !== void 0 && turnAt > 0) {
834
+ let size = lines.reduce((n, l) => n + l.length + 1, -1);
835
+ let cut = 0;
836
+ while (cut < turnAt && size > budget) {
837
+ size -= (lines[cut]?.length ?? 0) + 1;
838
+ cut += 1;
839
+ }
840
+ if (cut > 0) {
841
+ options.onTruncated?.();
842
+ lines.splice(0, cut, `[... ${String(cut)} earlier lines left out ...]`);
843
+ }
844
+ }
845
+ let timeline = scrub(lines.join("\n"));
828
846
  if (timeline.length > budget) {
829
847
  options.onTruncated?.();
830
848
  const marker = (omitted2) => `
@@ -846,4 +864,4 @@ export {
846
864
  parseTraceContent,
847
865
  renderTrace
848
866
  };
849
- //# sourceMappingURL=chunk-W7RSTW55.js.map
867
+ //# sourceMappingURL=chunk-76I6I5N2.js.map