@heroiclands/package-build 20.3.1 → 20.5.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 (195) hide show
  1. package/CHANGELOG.md +351 -0
  2. package/CONTENT.md +322 -110
  3. package/README.md +21 -10
  4. package/bin/content-build.mjs +204 -92
  5. package/bin/package-build.mjs +48 -15
  6. package/config.mjs +6 -8
  7. package/content-config.mjs +518 -151
  8. package/docs/api.md +1352 -0
  9. package/docs/commands.md +1609 -0
  10. package/docs/configuration.md +1432 -0
  11. package/docs/content-format.md +73 -74
  12. package/docs/diagnostics.md +356 -0
  13. package/docs/getting-started.md +813 -0
  14. package/docs/project-setup.md +469 -0
  15. package/e2e.mjs +4 -4
  16. package/engine/actor-compiler.mjs +64 -61
  17. package/engine/address-charset.mjs +6 -6
  18. package/engine/address-diff.mjs +57 -52
  19. package/engine/anchored-sections.mjs +1 -1
  20. package/engine/anchors.mjs +1 -1
  21. package/engine/base-compiler.mjs +42 -38
  22. package/engine/bundle-notes.mjs +4 -4
  23. package/engine/bundles.mjs +17 -8
  24. package/engine/code-fences.mjs +3 -3
  25. package/engine/compendiums.mjs +8 -8
  26. package/engine/compile-corpus.mjs +4 -5
  27. package/engine/content-address.mjs +24 -24
  28. package/engine/content-charset.mjs +1 -1
  29. package/engine/content-format-check.mjs +24 -25
  30. package/engine/content-format.mjs +8 -8
  31. package/engine/content-html.mjs +202 -0
  32. package/engine/content-icons.mjs +196 -165
  33. package/engine/content-index.mjs +61 -40
  34. package/engine/content-links.mjs +74 -41
  35. package/engine/content-lint.mjs +64 -34
  36. package/engine/content-package.mjs +7 -9
  37. package/engine/content-slug.mjs +2 -2
  38. package/engine/content-tables.mjs +38 -34
  39. package/engine/content-tree.mjs +1 -1
  40. package/engine/derived-fields.mjs +174 -0
  41. package/engine/diagnostics.mjs +3 -4
  42. package/engine/document-subtypes.mjs +6 -7
  43. package/engine/field-reference.mjs +8 -8
  44. package/engine/field-spec.mjs +29 -30
  45. package/engine/folder-notes.mjs +18 -16
  46. package/engine/foreign-catalog.mjs +8 -9
  47. package/engine/foundry-entries.mjs +19 -20
  48. package/engine/frontmatter-lint.mjs +95 -103
  49. package/engine/frontmatter.mjs +11 -11
  50. package/engine/generate.mjs +44 -39
  51. package/engine/helpers.mjs +147 -84
  52. package/engine/homepage.mjs +20 -22
  53. package/engine/ids.mjs +15 -15
  54. package/engine/index-records.mjs +4 -4
  55. package/engine/index.mjs +26 -10
  56. package/engine/item-compiler.mjs +54 -29
  57. package/engine/item-docs.mjs +11 -13
  58. package/engine/item-registry.mjs +13 -13
  59. package/engine/journals.mjs +24 -15
  60. package/engine/macros.mjs +3 -3
  61. package/engine/map-notes.mjs +6 -6
  62. package/engine/metadata-index.mjs +5 -5
  63. package/engine/note-claims.mjs +51 -41
  64. package/engine/note-ids.mjs +5 -5
  65. package/engine/note-package.mjs +4 -4
  66. package/engine/note-renames.mjs +3 -3
  67. package/engine/note-schemas.mjs +3 -8
  68. package/engine/note-vocabulary.mjs +56 -54
  69. package/engine/pack-config.mjs +39 -25
  70. package/engine/pack-router.mjs +0 -0
  71. package/engine/pdf-build.mjs +464 -0
  72. package/engine/pdf-fonts.mjs +420 -0
  73. package/engine/pdf-render.mjs +798 -0
  74. package/engine/pdf-toc.mjs +525 -0
  75. package/engine/prose-config.mjs +9 -9
  76. package/engine/prose-lint.mjs +12 -13
  77. package/engine/region-events.mjs +2 -2
  78. package/engine/retired-fields.mjs +24 -22
  79. package/engine/runtime-only-fields.mjs +1 -1
  80. package/engine/scene-levels.mjs +1 -1
  81. package/engine/scenes.mjs +33 -25
  82. package/engine/schema-check.mjs +21 -21
  83. package/engine/schema-extract.mjs +1 -1
  84. package/engine/site-build.mjs +66 -50
  85. package/engine/site-index.mjs +17 -18
  86. package/engine/sql-tables.mjs +21 -13
  87. package/engine/subtype-registry.mjs +5 -4
  88. package/engine/system-block.mjs +18 -19
  89. package/engine/systems.mjs +2 -2
  90. package/engine/web-wikilinks.mjs +41 -38
  91. package/engine/wikilink-syntax.mjs +16 -16
  92. package/engine/wikilinks.mjs +40 -42
  93. package/hm3/actors.mjs +30 -22
  94. package/hm3/document-subtypes.mjs +5 -5
  95. package/hm3/index.mjs +2 -2
  96. package/hm3/item-builders.mjs +1 -1
  97. package/hm3/item-fields.mjs +3 -3
  98. package/hm3/items.mjs +28 -8
  99. package/hm3/template-priority.mjs +2 -2
  100. package/lang.mjs +3 -3
  101. package/manifest.mjs +17 -20
  102. package/package.json +1 -2
  103. package/release.mjs +66 -6
  104. package/sohl/actors.mjs +36 -28
  105. package/sohl/affiliation-standings.mjs +2 -2
  106. package/sohl/being-info.mjs +5 -5
  107. package/sohl/default-item-art.mjs +5 -5
  108. package/sohl/document-subtypes.mjs +5 -5
  109. package/sohl/index.mjs +3 -3
  110. package/sohl/item-builders.mjs +7 -7
  111. package/sohl/item-fields.mjs +8 -9
  112. package/sohl/items.mjs +28 -6
  113. package/sohl/kb-passes.mjs +5 -5
  114. package/sohl/note-schemas.mjs +12 -12
  115. package/sohl/skill-base.mjs +1 -1
  116. package/types/content-config.d.mts +91 -39
  117. package/types/e2e.d.mts +3 -3
  118. package/types/engine/actor-compiler.d.mts +45 -40
  119. package/types/engine/address-charset.d.mts +6 -6
  120. package/types/engine/address-diff.d.mts +60 -6
  121. package/types/engine/base-compiler.d.mts +27 -21
  122. package/types/engine/bundle-notes.d.mts +3 -3
  123. package/types/engine/bundles.d.mts +10 -1
  124. package/types/engine/code-fences.d.mts +3 -3
  125. package/types/engine/compendiums.d.mts +3 -3
  126. package/types/engine/compile-corpus.d.mts +1 -1
  127. package/types/engine/content-address.d.mts +20 -20
  128. package/types/engine/content-format-check.d.mts +6 -6
  129. package/types/engine/content-format.d.mts +2 -2
  130. package/types/engine/content-html.d.mts +78 -0
  131. package/types/engine/content-icons.d.mts +139 -92
  132. package/types/engine/content-index.d.mts +59 -15
  133. package/types/engine/content-links.d.mts +8 -8
  134. package/types/engine/content-lint.d.mts +8 -6
  135. package/types/engine/content-package.d.mts +6 -8
  136. package/types/engine/content-tables.d.mts +49 -18
  137. package/types/engine/derived-fields.d.mts +101 -0
  138. package/types/engine/diagnostics.d.mts +2 -2
  139. package/types/engine/document-subtypes.d.mts +3 -3
  140. package/types/engine/field-spec.d.mts +37 -39
  141. package/types/engine/folder-notes.d.mts +4 -5
  142. package/types/engine/foreign-catalog.d.mts +3 -3
  143. package/types/engine/foundry-entries.d.mts +6 -7
  144. package/types/engine/frontmatter-lint.d.mts +10 -9
  145. package/types/engine/frontmatter.d.mts +7 -7
  146. package/types/engine/generate.d.mts +7 -7
  147. package/types/engine/helpers.d.mts +128 -56
  148. package/types/engine/homepage.d.mts +16 -18
  149. package/types/engine/ids.d.mts +13 -13
  150. package/types/engine/index-records.d.mts +3 -3
  151. package/types/engine/index.d.mts +6 -0
  152. package/types/engine/item-compiler.d.mts +21 -5
  153. package/types/engine/item-docs.d.mts +2 -2
  154. package/types/engine/item-registry.d.mts +6 -6
  155. package/types/engine/journals.d.mts +12 -3
  156. package/types/engine/map-notes.d.mts +2 -2
  157. package/types/engine/metadata-index.d.mts +4 -4
  158. package/types/engine/note-claims.d.mts +30 -22
  159. package/types/engine/note-ids.d.mts +4 -4
  160. package/types/engine/note-package.d.mts +1 -1
  161. package/types/engine/note-renames.d.mts +3 -3
  162. package/types/engine/note-vocabulary.d.mts +31 -203
  163. package/types/engine/pack-config.d.mts +7 -7
  164. package/types/engine/pack-router.d.mts +1 -1
  165. package/types/engine/pdf-build.d.mts +42 -0
  166. package/types/engine/pdf-fonts.d.mts +30 -0
  167. package/types/engine/pdf-render.d.mts +144 -0
  168. package/types/engine/pdf-toc.d.mts +114 -0
  169. package/types/engine/prose-config.d.mts +9 -9
  170. package/types/engine/prose-lint.d.mts +3 -4
  171. package/types/engine/region-events.d.mts +2 -2
  172. package/types/engine/retired-fields.d.mts +10 -9
  173. package/types/engine/scenes.d.mts +10 -1
  174. package/types/engine/schema-check.d.mts +13 -13
  175. package/types/engine/site-build.d.mts +52 -25
  176. package/types/engine/site-index.d.mts +3 -4
  177. package/types/engine/sql-tables.d.mts +11 -5
  178. package/types/engine/subtype-registry.d.mts +3 -3
  179. package/types/engine/system-block.d.mts +3 -3
  180. package/types/engine/web-wikilinks.d.mts +7 -7
  181. package/types/engine/wikilink-syntax.d.mts +17 -17
  182. package/types/engine/wikilinks.d.mts +14 -14
  183. package/types/hm3/actors.d.mts +9 -1
  184. package/types/hm3/document-subtypes.d.mts +1 -1
  185. package/types/hm3/items.d.mts +9 -2
  186. package/types/hm3/template-priority.d.mts +1 -1
  187. package/types/manifest.d.mts +8 -8
  188. package/types/release.d.mts +15 -4
  189. package/types/sohl/actors.d.mts +12 -4
  190. package/types/sohl/affiliation-standings.d.mts +2 -2
  191. package/types/sohl/being-info.d.mts +2 -2
  192. package/types/sohl/document-subtypes.d.mts +1 -1
  193. package/types/sohl/items.d.mts +9 -2
  194. package/types/sohl/note-schemas.d.mts +1 -1
  195. package/MIGRATING.md +0 -608
@@ -27,7 +27,7 @@ export function folderAddress(pkg: string, shortcode: string): string;
27
27
  * never run this build. Deriving it twice is how the index came to publish a
28
28
  * plausible-looking id that resolved to nothing — the general id rule hashes a
29
29
  * note's address under the `document` namespace, and a folder's is hashed under
30
- * {@link FOLDER_ID_NAMESPACE} (#310).
30
+ * {@link FOLDER_ID_NAMESPACE}.
31
31
  *
32
32
  * An **authored `id` still wins**, and is applied by the caller: this is the
33
33
  * derivation, not the resolution, so the pin rule stays stated once, where
@@ -42,8 +42,7 @@ export function folderDocId(pkg: string, shortcode: string): string;
42
42
  * Collect every folder note in a content tree.
43
43
  *
44
44
  * The walk is the caller's to supply, so this stays testable without a tree on
45
- * disk and so one build cannot disagree with another about what the corpus is
46
- * (#243).
45
+ * disk and so one build cannot disagree with another about what the corpus is.
47
46
  *
48
47
  * @param {Iterable<{frontmatter: object|null, absPath: string}>} notes - As
49
48
  * yielded by `walkMarkdownTree`.
@@ -62,7 +61,7 @@ export function collectFolderNotes(notes: Iterable<{
62
61
  *
63
62
  * Three keys per folder, and no more: the canonical address, the
64
63
  * `folder-<shortcode>` short form, and the bare shortcode. They are the
65
- * suffixes of the canonical address the grammar admits (#273) — a `packFolder`
64
+ * suffixes of the canonical address the grammar admits — a `packFolder`
66
65
  * or `parent` field supplies the type itself, so a bare shortcode is a complete
67
66
  * address there.
68
67
  *
@@ -101,7 +100,7 @@ export function folderDocument(folder: FolderNote, parent: FolderNote | null, do
101
100
  * Refuse a note that declares the retired `folder:` spelling.
102
101
  *
103
102
  * `folder:` named a compendium folder by the raw Foundry id declared in a
104
- * per-pack `*-folders.yaml`. Both halves are retired together (#260): the id
103
+ * per-pack `*-folders.yaml`. Both halves are retired together: the id
105
104
  * spelling has nothing left to resolve against once the YAML is gone, and the
106
105
  * YAML has no reader once the spelling is refused.
107
106
  *
@@ -112,7 +112,7 @@ export function fetchCatalogFromPath(config: object, rel: {
112
112
  id: string;
113
113
  }, source: string): Promise<string>;
114
114
  /**
115
- * Fetch one dependency's published content index (#239).
115
+ * Fetch one dependency's published content index.
116
116
  *
117
117
  * **The chain is entirely declared.** The relationship names the dependency's
118
118
  * manifest, the manifest advertises `flags.metadataUrl`, and that URL is the
@@ -178,7 +178,7 @@ export function fetchAllCatalogs(config: object): Promise<number>;
178
178
  * Reads the cache only. A cold cache is an error naming the command that fills
179
179
  * it, rather than a download nobody asked for.
180
180
  *
181
- * **Scoped to one system when the caller compiles for one (#58)**, exactly as
181
+ * **Scoped to one system when the caller compiles for one**, exactly as
182
182
  * {@link module:engine/generate.itemPackJsonDirs} scopes the local half. The
183
183
  * two halves answer the same lookup — `loadItemsMap` merges them into one
184
184
  * address space keyed by `subType:shortcode` — so scoping only the local one
@@ -200,7 +200,7 @@ export function foreignItemCatalogDirs(config: object, system?: string | null):
200
200
  package: string;
201
201
  }>;
202
202
  /**
203
- * The file a system publishes its `system` field sets as (#60).
203
+ * The file a system publishes its `system` field sets as.
204
204
  *
205
205
  * @type {string}
206
206
  */
@@ -20,8 +20,8 @@ export function anchorsOf(entryUuid: string, entryId: string, body: string, name
20
20
  * An item note produces **two**: the item, and separately the JournalEntry its
21
21
  * prose compiles into. They are two documents with two UUIDs, so they get two
22
22
  * addresses; the item's entry points at the other by address rather than
23
- * repeating its UUID, because the doc entry owns that fact (#1499). A `macro`
24
- * note is the same arrangement (#1514), which is why the type set comes from
23
+ * repeating its UUID, because the doc entry owns that fact. A `macro`
24
+ * note is the same arrangement, which is why the type set comes from
25
25
  * {@link hasDocEntry} rather than being spelled here — the journals compiler
26
26
  * reads the same one, so a manifest cannot claim documentation nothing compiled.
27
27
  *
@@ -33,7 +33,7 @@ export function anchorsOf(entryUuid: string, entryId: string, body: string, name
33
33
  * UUID. The two are one fact — a UUID ends in the id — but only the entry knows
34
34
  * which derivation produced it: an item's is its note's `fm.id`, and its
35
35
  * documentation journal's is {@link itemDocEntryId} of that. Stating it here is
36
- * what lets the content index publish an identity it did not re-derive (#310).
36
+ * what lets the content index publish an identity it did not re-derive.
37
37
  *
38
38
  * @param {object} ctx - Resolved identities: `{ contentPackage,
39
39
  * foundryPackageId, packRouter }`.
@@ -44,12 +44,11 @@ export function entriesForNote(fm: object, name: string, address: string, body:
44
44
  * Every note this package publishes, as manifest entries.
45
45
  *
46
46
  * Every note in the tree is this package's, so nothing here selects by package:
47
- * the key's first segment is `contentPackage` (#56). A note still declaring the
47
+ * the key's first segment is `contentPackage`. A note still declaring the
48
48
  * retired `package:` or `draft:` field **throws** rather than being skipped —
49
49
  * skipping one silently is how a whole tree came to be filtered out of a
50
50
  * manifest that then claimed the package published nothing, and it is what let
51
- * a drafted note's inbound links look like links to a note that never existed
52
- * (#69).
51
+ * a drafted note's inbound links look like links to a note that never existed.
53
52
  *
54
53
  * A note that has no address is **reported, not guessed** — the finding carries
55
54
  * the file and the reason, so a caller can print it or fail on it. Inventing an
@@ -93,7 +92,7 @@ export function foundryIdentities(config?: object): {
93
92
  * {@link foundryIdentities} plus what only a *manifest* emission needs. The
94
93
  * split is what lets the content index derive the same Foundry addresses from
95
94
  * the same code without also depending on whether the package publishes pages,
96
- * which is no part of a UUID (#239).
95
+ * which is no part of a UUID.
97
96
  *
98
97
  * @param {object} [config] - A resolved configuration; loaded when omitted.
99
98
  * @returns {{contentPackage: string, foundryPackageId: string, packRouter: object,
@@ -11,13 +11,13 @@
11
11
  * than reported wholesale.
12
12
  */
13
13
  /**
14
- * Every system a configuration says its tree carries (#58).
14
+ * Every system a configuration says its tree carries.
15
15
  *
16
16
  * **Which systems a package ships for is already declared**, in three places
17
17
  * that answer different questions, so this reads all three rather than asking a
18
18
  * new one:
19
19
  *
20
- * - `systems:` (#48) declares them without requiring one, which is how a
20
+ * - `systems:` declares them without requiring one, which is how a
21
21
  * package ships for several;
22
22
  * - a **pack's** `system:` is the same statement made per pack, and it is the
23
23
  * one some trees make: `harn-ensemble` declares an `actors-sohl` and an
@@ -40,7 +40,7 @@
40
40
  export function declaredSystems(config?: object): string[];
41
41
  /**
42
42
  * The system blocks a configuration says its tree carries, and what each
43
- * accepts (#58).
43
+ * accepts.
44
44
  *
45
45
  * The lint checks the blocks its caller names, and for as long as there was one
46
46
  * system the only caller named none — so every tree took the `sohl:` of
@@ -112,10 +112,11 @@ export function matchesKind(value: unknown, kind: string): boolean;
112
112
  * @param {object} note - A note from the link index (`{fm, file, raw, type}`).
113
113
  * @param {object} opts
114
114
  * @param {Record<string, readonly object[]>} opts.schemas - Type → declaration.
115
- * @param {object} [opts.index] - The link index, for the reference check. Its
116
- * absence skips that check rather than reporting every reference as dead.
115
+ * @param {object} [opts.index] - The link index, for the reference check, which
116
+ * runs through its `referenceHit`. Its absence skips that check rather than
117
+ * reporting every reference as dead.
117
118
  * @param {Record<string, object>} [opts.vocabulary] - Type → the closed regions
118
- * it declares, as `engine/note-vocabulary.mjs` states them (#128). Supplied
119
+ * it declares, as `engine/note-vocabulary.mjs` states them. Supplied
119
120
  * by the caller for the same reason `schemas` is: this module validates a
120
121
  * note against whatever its type declares and knows no type names of its
121
122
  * own. Its absence skips the `data:` and `subType` checks rather than
@@ -125,7 +126,7 @@ export function matchesKind(value: unknown, kind: string): boolean;
125
126
  * declaration, asked through `engine/generate.mjs`'s `emittedArtFor`.
126
127
  * Supplied by the caller like `schemas`, so this module states no list of
127
128
  * iconless types of its own; absent it, an inert `img:` goes unreported
128
- * rather than every note's being (#349).
129
+ * rather than every note's being.
129
130
  * @param {Readonly<Record<string, SystemBlockSpec>>} [opts.systems]
130
131
  * The system blocks to check, and what each accepts. Supplied by the caller
131
132
  * for the same reason `schemas` is — a build derives them from its
@@ -155,7 +156,7 @@ export function lintNote(note: object, { schemas, index, vocabulary, packs, emit
155
156
  * @param {object} opts
156
157
  * @param {Record<string, readonly object[]>} opts.schemas - Type → declaration.
157
158
  * @param {Record<string, object>} [opts.vocabulary] - Type → the closed regions
158
- * it declares (#128); see {@link lintNote}.
159
+ * it declares; see {@link lintNote}.
159
160
  * @param {boolean} [opts.references=true] - Whether to check references.
160
161
  * @param {Readonly<Record<string, SystemBlockSpec>>} [opts.systems]
161
162
  * The system blocks to check; see {@link lintNote} and
@@ -191,7 +192,7 @@ export function lintFrontmatter(index: object, { schemas, vocabulary, packs, emi
191
192
  *
192
193
  * - `folder` — the compendium folder the document is filed in.
193
194
  * - `pack` — which compendium of the note's document type receives it, for a
194
- * repository shipping several (#1566).
195
+ * repository shipping several.
195
196
  * - `archetype` — the archetype flag, read for any note by the walk itself.
196
197
  * - `kbcat` — the knowledgebase category a note is grouped under.
197
198
  *
@@ -10,7 +10,7 @@ export function getFrontmatter(fm: any, key: any, defaultValue?: undefined): any
10
10
  */
11
11
  export function sohlField(fm: any, key: any, defaultValue?: undefined): any;
12
12
  /**
13
- * Read a `sohl:` field, seeing the **destination** position as well (#126).
13
+ * Read a `sohl:` field, seeing the **destination** position as well.
14
14
  *
15
15
  * Five declarations resolve their value by re-reading the note rather than by
16
16
  * taking the one {@link module:engine/system-block.resolveFieldValue} handed
@@ -29,8 +29,8 @@ export function sohlField(fm: any, key: any, defaultValue?: undefined): any;
29
29
  *
30
30
  * `legacyKey` is for the one pair whose two positions are spelled differently:
31
31
  * a projectile authors `impact.die` and stores `impactBase.die`, so the reader
32
- * has to be told both. It is the same split `FieldSpec.name`/`legacyKey` makes
33
- * (#305), for the same reason — one name cannot key two positions.
32
+ * has to be told both. It is the same split `FieldSpec.name`/`legacyKey` makes,
33
+ * for the same reason — one name cannot key two positions.
34
34
  *
35
35
  * @param {object} fm - The note's frontmatter.
36
36
  * @param {string} to - The key at the destination, dotted for a nested one.
@@ -46,7 +46,7 @@ export function sohlSystemField(fm: object, to: string, defaultValue?: any, { le
46
46
  /**
47
47
  * Resolve the `charges` block shared by Mystery and Mystical Ability items.
48
48
  *
49
- * Charge usage is carried by the **maximum** alone (#1129): a `null` max means
49
+ * Charge usage is carried by the **maximum** alone: a `null` max means
50
50
  * the item does not use charges at all, `0` means it is counted but uncapped,
51
51
  * and a positive number is a real cap. `value` is the current count, with
52
52
  * `null` meaning "infinite remaining". Both persist as nullable NumberFields,
@@ -87,7 +87,7 @@ export function resolveCharges(fm: object): {
87
87
  export function resolveSkillAptitudes(fm: object, ctx?: string): Record<string, number>;
88
88
  /**
89
89
  * Resolve an affiliation's `relation` map — the shortcode of another
90
- * affiliation → this one's standing toward it (#1404).
90
+ * affiliation → this one's standing toward it.
91
91
  *
92
92
  * An unrecognized standing would fail the schema's `choices` validation at load
93
93
  * and be dropped silently, shipping an affiliation whose authored hostility had
@@ -138,12 +138,12 @@ export function parseValueDesc(raw: any): {
138
138
  * (`folder-poisonsandtoxins`), resolved through the address index the whole
139
139
  * build shares. The `folder:` Foundry-id spelling this function once read
140
140
  * beside it, and the per-pack `*-folders.yaml` that id was resolved against,
141
- * are retired together (#260) — a note declaring `folder:` is refused by
141
+ * are retired together — a note declaring `folder:` is refused by
142
142
  * {@link module:engine/folder-notes.assertNoDeclaredFolder} rather than
143
143
  * reaching here, so there is no second source for a value to come from.
144
144
  *
145
145
  * **`packFolder` was a path for one release** (`Possessions/Misc_Gear/Cooking`)
146
- * and is an address now (#255). A path encoded the hierarchy *in the value*, so
146
+ * and is an address now. A path encoded the hierarchy *in the value*, so
147
147
  * reparenting a folder made every note naming it wrong — a structural edit
148
148
  * became a corpus-wide rewrite. An address is stable under reparenting, which
149
149
  * is exactly why a note is addressed by `(type, shortcode)` and never by
@@ -10,7 +10,7 @@
10
10
  export function compilerFor(docType: string, system?: string | null): Function | undefined;
11
11
  /**
12
12
  * The art fields a note of one content type reaches its document through, and
13
- * the document it reaches (#349).
13
+ * the document it reaches.
14
14
  *
15
15
  * **Derived, never listed.** A note's type routes to a document type
16
16
  * ({@link packForType}), a document type routes to the pass that compiles it
@@ -39,7 +39,7 @@ export function emittedArtFor(type: string): {
39
39
  * The generated JSON of **every** configured Item pack — what the actors pass
40
40
  * reads its predefined items from.
41
41
  *
42
- * All of them, not the first: a repository may ship several Item packs (#1566),
42
+ * All of them, not the first: a repository may ship several Item packs,
43
43
  * and an actor's embedded items may be sourced from any of them. Finding one
44
44
  * pack and stopping is how embedded-item resolution would silently miss every
45
45
  * item that landed in another. Returned in configured order, which is also the
@@ -47,7 +47,7 @@ export function emittedArtFor(type: string): {
47
47
  * order among packs of one type — and every one of them is written before the
48
48
  * actors pass that reads them.
49
49
  *
50
- * **Scoped to one system when the caller has one (#58).** A being addresses an
50
+ * **Scoped to one system when the caller has one.** A being addresses an
51
51
  * item by `(type, shortcode)`, and that address is unique within one system and
52
52
  * not across two: `skill:sword` is an HM3 skill *and* a SoHL skill, with
53
53
  * different data models behind them. The reference itself is unambiguous — it
@@ -65,7 +65,7 @@ export function emittedArtFor(type: string): {
65
65
  * @returns {string[]} Each Item pack's JSON directory. Empty when the
66
66
  * repository ships no items at all, which is a legitimate package: the actors
67
67
  * pass accepts an empty list and reports an item it cannot resolve per
68
- * `(type, shortcode)` instead, naming the being (#49).
68
+ * `(type, shortcode)` instead, naming the being.
69
69
  */
70
70
  export function itemPackJsonDirs(config?: object, system?: string | null): string[];
71
71
  /**
@@ -74,7 +74,7 @@ export function itemPackJsonDirs(config?: object, system?: string | null): strin
74
74
  * An `Adventure` carries **copies**, not references, so a bundle resolves its
75
75
  * `contents` against compiled output rather than against the content tree — the
76
76
  * same arrangement the actors pass has for `itemsSourceDirs`, generalised to
77
- * every document class an Adventure can hold (#259).
77
+ * every document class an Adventure can hold.
78
78
  *
79
79
  * Two kinds of pack are left out, each because it holds nothing a note
80
80
  * addresses. A **prebuilt** pack's JSON is checked in rather than compiled, so
@@ -99,7 +99,7 @@ export function bundleSourceJsonDirs(config?: object, system?: string | null): R
99
99
  /**
100
100
  * The passes to run, ordered so that each one follows the output it reads.
101
101
  *
102
- * **Declaration order is presentation, not compile order (#73).** The same
102
+ * **Declaration order is presentation, not compile order.** The same
103
103
  * `packs:` list is the manifest's `packs` array, which a consumer orders for a
104
104
  * reader browsing compendiums; the actors pass, meanwhile, resolves each
105
105
  * being's embedded items against the item passes' *output*. Making one list
@@ -149,7 +149,7 @@ export function unsatisfiedPassDependencies(running: readonly object[], config:
149
149
  *
150
150
  * A pack ships blank whenever every note in a full tree was rejected — by a
151
151
  * `selects` that claims nothing, or a `pack:` that routes everything elsewhere
152
- * — and the build then exits 0 (#1502). The empty-tree guard in
152
+ * — and the build then exits 0. The empty-tree guard in
153
153
  * {@link generatePacksJson} cannot see that: the tree is full, it is the
154
154
  * *output* that is empty.
155
155
  *