@alisio/plugin-thesis 0.1.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 (547) hide show
  1. package/.agents/agents/thesis-architect.md +38 -0
  2. package/.agents/agents/thesis-coordinator.md +39 -0
  3. package/.agents/agents/thesis-editor.md +35 -0
  4. package/.agents/agents/thesis-evidence-auditor.md +37 -0
  5. package/.agents/agents/thesis-librarian.md +38 -0
  6. package/.agents/agents/thesis-methodologist.md +39 -0
  7. package/.agents/agents/thesis-reviewer.md +36 -0
  8. package/.agents/agents/thesis-writer.md +38 -0
  9. package/.agents/skills/thesis-build/SKILL.md +48 -0
  10. package/.agents/skills/thesis-citations/SKILL.md +49 -0
  11. package/.agents/skills/thesis-csl-authoring/SKILL.md +48 -0
  12. package/.agents/skills/thesis-editing/SKILL.md +49 -0
  13. package/.agents/skills/thesis-evidence/SKILL.md +48 -0
  14. package/.agents/skills/thesis-figures/SKILL.md +50 -0
  15. package/.agents/skills/thesis-institution-norms/SKILL.md +50 -0
  16. package/.agents/skills/thesis-intake/SKILL.md +48 -0
  17. package/.agents/skills/thesis-math/SKILL.md +48 -0
  18. package/.agents/skills/thesis-methodology/SKILL.md +49 -0
  19. package/.agents/skills/thesis-outline/SKILL.md +48 -0
  20. package/.agents/skills/thesis-policy/SKILL.md +48 -0
  21. package/.agents/skills/thesis-review/SKILL.md +49 -0
  22. package/.agents/skills/thesis-search/SKILL.md +47 -0
  23. package/.agents/skills/thesis-writing/SKILL.md +52 -0
  24. package/LICENSE +21 -0
  25. package/README.es.md +242 -0
  26. package/README.md +235 -0
  27. package/THIRD_PARTY_NOTICES.md +94 -0
  28. package/assets/architecture.svg +1 -0
  29. package/assets/evidence-pipeline.svg +1 -0
  30. package/assets/lifecycle.svg +1 -0
  31. package/assets/policy-resolution.svg +1 -0
  32. package/cover.webp +0 -0
  33. package/dist/authoring.d.ts +30 -0
  34. package/dist/authoring.d.ts.map +1 -0
  35. package/dist/authoring.js +681 -0
  36. package/dist/authoring.js.map +1 -0
  37. package/dist/brief.d.ts +40 -0
  38. package/dist/brief.d.ts.map +1 -0
  39. package/dist/brief.js +566 -0
  40. package/dist/brief.js.map +1 -0
  41. package/dist/cache.d.ts +8 -0
  42. package/dist/cache.d.ts.map +1 -0
  43. package/dist/cache.js +20 -0
  44. package/dist/cache.js.map +1 -0
  45. package/dist/checks/brief.d.ts +5 -0
  46. package/dist/checks/brief.d.ts.map +1 -0
  47. package/dist/checks/brief.js +38 -0
  48. package/dist/checks/brief.js.map +1 -0
  49. package/dist/checks/citations.d.ts +14 -0
  50. package/dist/checks/citations.d.ts.map +1 -0
  51. package/dist/checks/citations.js +87 -0
  52. package/dist/checks/citations.js.map +1 -0
  53. package/dist/checks/claims.d.ts +16 -0
  54. package/dist/checks/claims.d.ts.map +1 -0
  55. package/dist/checks/claims.js +147 -0
  56. package/dist/checks/claims.js.map +1 -0
  57. package/dist/checks/closing.d.ts +20 -0
  58. package/dist/checks/closing.d.ts.map +1 -0
  59. package/dist/checks/closing.js +168 -0
  60. package/dist/checks/closing.js.map +1 -0
  61. package/dist/checks/design.d.ts +5 -0
  62. package/dist/checks/design.d.ts.map +1 -0
  63. package/dist/checks/design.js +107 -0
  64. package/dist/checks/design.js.map +1 -0
  65. package/dist/checks/document.d.ts +17 -0
  66. package/dist/checks/document.d.ts.map +1 -0
  67. package/dist/checks/document.js +213 -0
  68. package/dist/checks/document.js.map +1 -0
  69. package/dist/checks/evidence.d.ts +7 -0
  70. package/dist/checks/evidence.d.ts.map +1 -0
  71. package/dist/checks/evidence.js +133 -0
  72. package/dist/checks/evidence.js.map +1 -0
  73. package/dist/checks/hygiene.d.ts +5 -0
  74. package/dist/checks/hygiene.d.ts.map +1 -0
  75. package/dist/checks/hygiene.js +37 -0
  76. package/dist/checks/hygiene.js.map +1 -0
  77. package/dist/checks/index.d.ts +21 -0
  78. package/dist/checks/index.d.ts.map +1 -0
  79. package/dist/checks/index.js +98 -0
  80. package/dist/checks/index.js.map +1 -0
  81. package/dist/checks/language.d.ts +14 -0
  82. package/dist/checks/language.d.ts.map +1 -0
  83. package/dist/checks/language.js +73 -0
  84. package/dist/checks/language.js.map +1 -0
  85. package/dist/checks/outline.d.ts +25 -0
  86. package/dist/checks/outline.d.ts.map +1 -0
  87. package/dist/checks/outline.js +214 -0
  88. package/dist/checks/outline.js.map +1 -0
  89. package/dist/checks/policy.d.ts +5 -0
  90. package/dist/checks/policy.d.ts.map +1 -0
  91. package/dist/checks/policy.js +129 -0
  92. package/dist/checks/policy.js.map +1 -0
  93. package/dist/checks/project.d.ts +65 -0
  94. package/dist/checks/project.d.ts.map +1 -0
  95. package/dist/checks/project.js +203 -0
  96. package/dist/checks/project.js.map +1 -0
  97. package/dist/checks/styles.d.ts +12 -0
  98. package/dist/checks/styles.d.ts.map +1 -0
  99. package/dist/checks/styles.js +67 -0
  100. package/dist/checks/styles.js.map +1 -0
  101. package/dist/checks/writing.d.ts +6 -0
  102. package/dist/checks/writing.d.ts.map +1 -0
  103. package/dist/checks/writing.js +115 -0
  104. package/dist/checks/writing.js.map +1 -0
  105. package/dist/chrome/detect.d.ts +19 -0
  106. package/dist/chrome/detect.d.ts.map +1 -0
  107. package/dist/chrome/detect.js +116 -0
  108. package/dist/chrome/detect.js.map +1 -0
  109. package/dist/claims.d.ts +19 -0
  110. package/dist/claims.d.ts.map +1 -0
  111. package/dist/claims.js +99 -0
  112. package/dist/claims.js.map +1 -0
  113. package/dist/cli.d.ts +11 -0
  114. package/dist/cli.d.ts.map +1 -0
  115. package/dist/cli.js +262 -0
  116. package/dist/cli.js.map +1 -0
  117. package/dist/context.d.ts +55 -0
  118. package/dist/context.d.ts.map +1 -0
  119. package/dist/context.js +62 -0
  120. package/dist/context.js.map +1 -0
  121. package/dist/coordinator.d.ts +139 -0
  122. package/dist/coordinator.d.ts.map +1 -0
  123. package/dist/coordinator.js +710 -0
  124. package/dist/coordinator.js.map +1 -0
  125. package/dist/delegate.d.ts +34 -0
  126. package/dist/delegate.d.ts.map +1 -0
  127. package/dist/delegate.js +105 -0
  128. package/dist/delegate.js.map +1 -0
  129. package/dist/diffguard.d.ts +24 -0
  130. package/dist/diffguard.d.ts.map +1 -0
  131. package/dist/diffguard.js +92 -0
  132. package/dist/diffguard.js.map +1 -0
  133. package/dist/doctor.d.ts +34 -0
  134. package/dist/doctor.d.ts.map +1 -0
  135. package/dist/doctor.js +155 -0
  136. package/dist/doctor.js.map +1 -0
  137. package/dist/draft.d.ts +64 -0
  138. package/dist/draft.d.ts.map +1 -0
  139. package/dist/draft.js +801 -0
  140. package/dist/draft.js.map +1 -0
  141. package/dist/figure.d.ts +13 -0
  142. package/dist/figure.d.ts.map +1 -0
  143. package/dist/figure.js +143 -0
  144. package/dist/figure.js.map +1 -0
  145. package/dist/finalize.d.ts +29 -0
  146. package/dist/finalize.d.ts.map +1 -0
  147. package/dist/finalize.js +230 -0
  148. package/dist/finalize.js.map +1 -0
  149. package/dist/index.d.ts +33 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +206 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/intake.d.ts +57 -0
  154. package/dist/intake.d.ts.map +1 -0
  155. package/dist/intake.js +772 -0
  156. package/dist/intake.js.map +1 -0
  157. package/dist/labels.d.ts +50 -0
  158. package/dist/labels.d.ts.map +1 -0
  159. package/dist/labels.js +98 -0
  160. package/dist/labels.js.map +1 -0
  161. package/dist/outline.d.ts +45 -0
  162. package/dist/outline.d.ts.map +1 -0
  163. package/dist/outline.js +148 -0
  164. package/dist/outline.js.map +1 -0
  165. package/dist/pack-commands.d.ts +18 -0
  166. package/dist/pack-commands.d.ts.map +1 -0
  167. package/dist/pack-commands.js +397 -0
  168. package/dist/pack-commands.js.map +1 -0
  169. package/dist/package-paths.d.ts +8 -0
  170. package/dist/package-paths.d.ts.map +1 -0
  171. package/dist/package-paths.js +13 -0
  172. package/dist/package-paths.js.map +1 -0
  173. package/dist/policy/context.d.ts +19 -0
  174. package/dist/policy/context.d.ts.map +1 -0
  175. package/dist/policy/context.js +62 -0
  176. package/dist/policy/context.js.map +1 -0
  177. package/dist/policy/ethics.d.ts +59 -0
  178. package/dist/policy/ethics.d.ts.map +1 -0
  179. package/dist/policy/ethics.js +106 -0
  180. package/dist/policy/ethics.js.map +1 -0
  181. package/dist/policy/kinds.d.ts +9 -0
  182. package/dist/policy/kinds.d.ts.map +1 -0
  183. package/dist/policy/kinds.js +68 -0
  184. package/dist/policy/kinds.js.map +1 -0
  185. package/dist/policy/packs.d.ts +53 -0
  186. package/dist/policy/packs.d.ts.map +1 -0
  187. package/dist/policy/packs.js +336 -0
  188. package/dist/policy/packs.js.map +1 -0
  189. package/dist/policy/resolver.d.ts +87 -0
  190. package/dist/policy/resolver.d.ts.map +1 -0
  191. package/dist/policy/resolver.js +337 -0
  192. package/dist/policy/resolver.js.map +1 -0
  193. package/dist/policy/rules.d.ts +65 -0
  194. package/dist/policy/rules.d.ts.map +1 -0
  195. package/dist/policy/rules.js +194 -0
  196. package/dist/policy/rules.js.map +1 -0
  197. package/dist/protocol.d.ts +46 -0
  198. package/dist/protocol.d.ts.map +1 -0
  199. package/dist/protocol.js +86 -0
  200. package/dist/protocol.js.map +1 -0
  201. package/dist/render/adapters/chrome-pdf/cdp.d.ts +36 -0
  202. package/dist/render/adapters/chrome-pdf/cdp.d.ts.map +1 -0
  203. package/dist/render/adapters/chrome-pdf/cdp.js +291 -0
  204. package/dist/render/adapters/chrome-pdf/cdp.js.map +1 -0
  205. package/dist/render/adapters/chrome-pdf/index.d.ts +10 -0
  206. package/dist/render/adapters/chrome-pdf/index.d.ts.map +1 -0
  207. package/dist/render/adapters/chrome-pdf/index.js +139 -0
  208. package/dist/render/adapters/chrome-pdf/index.js.map +1 -0
  209. package/dist/render/adapters/chrome-pdf/network.d.ts +7 -0
  210. package/dist/render/adapters/chrome-pdf/network.d.ts.map +1 -0
  211. package/dist/render/adapters/chrome-pdf/network.js +33 -0
  212. package/dist/render/adapters/chrome-pdf/network.js.map +1 -0
  213. package/dist/render/adapters/html-preview/index.d.ts +8 -0
  214. package/dist/render/adapters/html-preview/index.d.ts.map +1 -0
  215. package/dist/render/adapters/html-preview/index.js +62 -0
  216. package/dist/render/adapters/html-preview/index.js.map +1 -0
  217. package/dist/render/adapters/test-json/index.d.ts +8 -0
  218. package/dist/render/adapters/test-json/index.d.ts.map +1 -0
  219. package/dist/render/adapters/test-json/index.js +62 -0
  220. package/dist/render/adapters/test-json/index.js.map +1 -0
  221. package/dist/render/adapters/typst-pdf/emitter.d.ts +21 -0
  222. package/dist/render/adapters/typst-pdf/emitter.d.ts.map +1 -0
  223. package/dist/render/adapters/typst-pdf/emitter.js +259 -0
  224. package/dist/render/adapters/typst-pdf/emitter.js.map +1 -0
  225. package/dist/render/adapters/typst-pdf/escape.d.ts +14 -0
  226. package/dist/render/adapters/typst-pdf/escape.d.ts.map +1 -0
  227. package/dist/render/adapters/typst-pdf/escape.js +56 -0
  228. package/dist/render/adapters/typst-pdf/escape.js.map +1 -0
  229. package/dist/render/adapters/typst-pdf/index.d.ts +9 -0
  230. package/dist/render/adapters/typst-pdf/index.d.ts.map +1 -0
  231. package/dist/render/adapters/typst-pdf/index.js +154 -0
  232. package/dist/render/adapters/typst-pdf/index.js.map +1 -0
  233. package/dist/render/adapters/typst-pdf/profile.d.ts +3 -0
  234. package/dist/render/adapters/typst-pdf/profile.d.ts.map +1 -0
  235. package/dist/render/adapters/typst-pdf/profile.js +55 -0
  236. package/dist/render/adapters/typst-pdf/profile.js.map +1 -0
  237. package/dist/render/adapters/typst-pdf/runner.d.ts +52 -0
  238. package/dist/render/adapters/typst-pdf/runner.d.ts.map +1 -0
  239. package/dist/render/adapters/typst-pdf/runner.js +209 -0
  240. package/dist/render/adapters/typst-pdf/runner.js.map +1 -0
  241. package/dist/render/adapters/typst-pdf/setup.d.ts +30 -0
  242. package/dist/render/adapters/typst-pdf/setup.d.ts.map +1 -0
  243. package/dist/render/adapters/typst-pdf/setup.js +183 -0
  244. package/dist/render/adapters/typst-pdf/setup.js.map +1 -0
  245. package/dist/render/adapters/typst-pdf/version.d.ts +8 -0
  246. package/dist/render/adapters/typst-pdf/version.d.ts.map +1 -0
  247. package/dist/render/adapters/typst-pdf/version.js +14 -0
  248. package/dist/render/adapters/typst-pdf/version.js.map +1 -0
  249. package/dist/render/assemble.d.ts +28 -0
  250. package/dist/render/assemble.d.ts.map +1 -0
  251. package/dist/render/assemble.js +309 -0
  252. package/dist/render/assemble.js.map +1 -0
  253. package/dist/render/assets.d.ts +27 -0
  254. package/dist/render/assets.d.ts.map +1 -0
  255. package/dist/render/assets.js +232 -0
  256. package/dist/render/assets.js.map +1 -0
  257. package/dist/render/build.d.ts +43 -0
  258. package/dist/render/build.d.ts.map +1 -0
  259. package/dist/render/build.js +187 -0
  260. package/dist/render/build.js.map +1 -0
  261. package/dist/render/charts.d.ts +83 -0
  262. package/dist/render/charts.d.ts.map +1 -0
  263. package/dist/render/charts.js +633 -0
  264. package/dist/render/charts.js.map +1 -0
  265. package/dist/render/default-registry.d.ts +7 -0
  266. package/dist/render/default-registry.d.ts.map +1 -0
  267. package/dist/render/default-registry.js +15 -0
  268. package/dist/render/default-registry.js.map +1 -0
  269. package/dist/render/diagram-theme.d.ts +7 -0
  270. package/dist/render/diagram-theme.d.ts.map +1 -0
  271. package/dist/render/diagram-theme.js +50 -0
  272. package/dist/render/diagram-theme.js.map +1 -0
  273. package/dist/render/dialect.d.ts +23 -0
  274. package/dist/render/dialect.d.ts.map +1 -0
  275. package/dist/render/dialect.js +188 -0
  276. package/dist/render/dialect.js.map +1 -0
  277. package/dist/render/html/citations.d.ts +70 -0
  278. package/dist/render/html/citations.d.ts.map +1 -0
  279. package/dist/render/html/citations.js +371 -0
  280. package/dist/render/html/citations.js.map +1 -0
  281. package/dist/render/html/css.d.ts +14 -0
  282. package/dist/render/html/css.d.ts.map +1 -0
  283. package/dist/render/html/css.js +113 -0
  284. package/dist/render/html/css.js.map +1 -0
  285. package/dist/render/html/emitter.d.ts +20 -0
  286. package/dist/render/html/emitter.d.ts.map +1 -0
  287. package/dist/render/html/emitter.js +652 -0
  288. package/dist/render/html/emitter.js.map +1 -0
  289. package/dist/render/html/escape.d.ts +11 -0
  290. package/dist/render/html/escape.d.ts.map +1 -0
  291. package/dist/render/html/escape.js +32 -0
  292. package/dist/render/html/escape.js.map +1 -0
  293. package/dist/render/html/katex.d.ts +9 -0
  294. package/dist/render/html/katex.d.ts.map +1 -0
  295. package/dist/render/html/katex.js +39 -0
  296. package/dist/render/html/katex.js.map +1 -0
  297. package/dist/render/html/stage.d.ts +12 -0
  298. package/dist/render/html/stage.d.ts.map +1 -0
  299. package/dist/render/html/stage.js +30 -0
  300. package/dist/render/html/stage.js.map +1 -0
  301. package/dist/render/index.d.ts +5 -0
  302. package/dist/render/index.d.ts.map +1 -0
  303. package/dist/render/index.js +5 -0
  304. package/dist/render/index.js.map +1 -0
  305. package/dist/render/math.d.ts +9 -0
  306. package/dist/render/math.d.ts.map +1 -0
  307. package/dist/render/math.js +60 -0
  308. package/dist/render/math.js.map +1 -0
  309. package/dist/render/model.d.ts +233 -0
  310. package/dist/render/model.d.ts.map +1 -0
  311. package/dist/render/model.js +2 -0
  312. package/dist/render/model.js.map +1 -0
  313. package/dist/render/numbering.d.ts +51 -0
  314. package/dist/render/numbering.d.ts.map +1 -0
  315. package/dist/render/numbering.js +155 -0
  316. package/dist/render/numbering.js.map +1 -0
  317. package/dist/render/output-name.d.ts +4 -0
  318. package/dist/render/output-name.d.ts.map +1 -0
  319. package/dist/render/output-name.js +11 -0
  320. package/dist/render/output-name.js.map +1 -0
  321. package/dist/render/palettes.d.ts +22 -0
  322. package/dist/render/palettes.d.ts.map +1 -0
  323. package/dist/render/palettes.js +46 -0
  324. package/dist/render/palettes.js.map +1 -0
  325. package/dist/render/parse.d.ts +15 -0
  326. package/dist/render/parse.d.ts.map +1 -0
  327. package/dist/render/parse.js +637 -0
  328. package/dist/render/parse.js.map +1 -0
  329. package/dist/render/port.d.ts +79 -0
  330. package/dist/render/port.d.ts.map +1 -0
  331. package/dist/render/port.js +2 -0
  332. package/dist/render/port.js.map +1 -0
  333. package/dist/render/registry.d.ts +11 -0
  334. package/dist/render/registry.d.ts.map +1 -0
  335. package/dist/render/registry.js +21 -0
  336. package/dist/render/registry.js.map +1 -0
  337. package/dist/render/text.d.ts +13 -0
  338. package/dist/render/text.d.ts.map +1 -0
  339. package/dist/render/text.js +65 -0
  340. package/dist/render/text.js.map +1 -0
  341. package/dist/render/walk.d.ts +13 -0
  342. package/dist/render/walk.d.ts.map +1 -0
  343. package/dist/render/walk.js +69 -0
  344. package/dist/render/walk.js.map +1 -0
  345. package/dist/research/bibtex.d.ts +12 -0
  346. package/dist/research/bibtex.d.ts.map +1 -0
  347. package/dist/research/bibtex.js +99 -0
  348. package/dist/research/bibtex.js.map +1 -0
  349. package/dist/research/client.d.ts +112 -0
  350. package/dist/research/client.d.ts.map +1 -0
  351. package/dist/research/client.js +661 -0
  352. package/dist/research/client.js.map +1 -0
  353. package/dist/research/dossier.d.ts +31 -0
  354. package/dist/research/dossier.d.ts.map +1 -0
  355. package/dist/research/dossier.js +54 -0
  356. package/dist/research/dossier.js.map +1 -0
  357. package/dist/research/flow.d.ts +31 -0
  358. package/dist/research/flow.d.ts.map +1 -0
  359. package/dist/research/flow.js +635 -0
  360. package/dist/research/flow.js.map +1 -0
  361. package/dist/research/library.d.ts +79 -0
  362. package/dist/research/library.d.ts.map +1 -0
  363. package/dist/research/library.js +319 -0
  364. package/dist/research/library.js.map +1 -0
  365. package/dist/research/verify.d.ts +80 -0
  366. package/dist/research/verify.d.ts.map +1 -0
  367. package/dist/research/verify.js +307 -0
  368. package/dist/research/verify.js.map +1 -0
  369. package/dist/resources.d.ts +15 -0
  370. package/dist/resources.d.ts.map +1 -0
  371. package/dist/resources.js +148 -0
  372. package/dist/resources.js.map +1 -0
  373. package/dist/review.d.ts +22 -0
  374. package/dist/review.d.ts.map +1 -0
  375. package/dist/review.js +355 -0
  376. package/dist/review.js.map +1 -0
  377. package/dist/schemas.d.ts +252 -0
  378. package/dist/schemas.d.ts.map +1 -0
  379. package/dist/schemas.js +1020 -0
  380. package/dist/schemas.js.map +1 -0
  381. package/dist/sections.d.ts +30 -0
  382. package/dist/sections.d.ts.map +1 -0
  383. package/dist/sections.js +62 -0
  384. package/dist/sections.js.map +1 -0
  385. package/dist/storage.d.ts +21 -0
  386. package/dist/storage.d.ts.map +1 -0
  387. package/dist/storage.js +296 -0
  388. package/dist/storage.js.map +1 -0
  389. package/dist/style-commands.d.ts +15 -0
  390. package/dist/style-commands.d.ts.map +1 -0
  391. package/dist/style-commands.js +54 -0
  392. package/dist/style-commands.js.map +1 -0
  393. package/dist/styles/csl.d.ts +58 -0
  394. package/dist/styles/csl.d.ts.map +1 -0
  395. package/dist/styles/csl.js +112 -0
  396. package/dist/styles/csl.js.map +1 -0
  397. package/dist/styles/discovery.d.ts +45 -0
  398. package/dist/styles/discovery.d.ts.map +1 -0
  399. package/dist/styles/discovery.js +99 -0
  400. package/dist/styles/discovery.js.map +1 -0
  401. package/dist/styles/golden.d.ts +52 -0
  402. package/dist/styles/golden.d.ts.map +1 -0
  403. package/dist/styles/golden.js +216 -0
  404. package/dist/styles/golden.js.map +1 -0
  405. package/dist/styles/profile.d.ts +126 -0
  406. package/dist/styles/profile.d.ts.map +1 -0
  407. package/dist/styles/profile.js +582 -0
  408. package/dist/styles/profile.js.map +1 -0
  409. package/dist/styles/xml.d.ts +22 -0
  410. package/dist/styles/xml.d.ts.map +1 -0
  411. package/dist/styles/xml.js +179 -0
  412. package/dist/styles/xml.js.map +1 -0
  413. package/dist/types.d.ts +285 -0
  414. package/dist/types.d.ts.map +1 -0
  415. package/dist/types.js +155 -0
  416. package/dist/types.js.map +1 -0
  417. package/dist/typst-pins.d.ts +16 -0
  418. package/dist/typst-pins.d.ts.map +1 -0
  419. package/dist/typst-pins.js +39 -0
  420. package/dist/typst-pins.js.map +1 -0
  421. package/dist/version.d.ts +2 -0
  422. package/dist/version.d.ts.map +1 -0
  423. package/dist/version.js +3 -0
  424. package/dist/version.js.map +1 -0
  425. package/dist/workflow.d.ts +49 -0
  426. package/dist/workflow.d.ts.map +1 -0
  427. package/dist/workflow.js +722 -0
  428. package/dist/workflow.js.map +1 -0
  429. package/dist/workspace.d.ts +12 -0
  430. package/dist/workspace.d.ts.map +1 -0
  431. package/dist/workspace.js +71 -0
  432. package/dist/workspace.js.map +1 -0
  433. package/package.json +70 -0
  434. package/policy-packs/countries/CO/academic-standards/ntc-1486-2022.yaml +188 -0
  435. package/policy-packs/countries/CO/copyright/decision-andina-351.yaml +61 -0
  436. package/policy-packs/countries/CO/copyright/ley-1915-2018.yaml +25 -0
  437. package/policy-packs/countries/CO/copyright/ley-23-1982.yaml +64 -0
  438. package/policy-packs/countries/CO/domains/health/resolucion-8430-1993.yaml +219 -0
  439. package/policy-packs/countries/CO/higher-education/ley-30-1992.yaml +61 -0
  440. package/policy-packs/countries/CO/manifest.yaml +42 -0
  441. package/policy-packs/countries/CO/official-domains.yaml +90 -0
  442. package/policy-packs/countries/CO/privacy/ley-1581-2012.yaml +197 -0
  443. package/policy-packs/countries/CO/research-integrity/minciencias-res-0314-2018.yaml +64 -0
  444. package/policy-packs/global/academic-integrity.yaml +45 -0
  445. package/policy-packs/global/academic-writing.yaml +70 -0
  446. package/policy-packs/global/evidence-quality.yaml +81 -0
  447. package/policy-packs/global/manifest.yaml +54 -0
  448. package/policy-packs/global/objective-verbs.yaml +245 -0
  449. package/policy-packs/global/reporting-guidelines.yaml +392 -0
  450. package/policy-packs/global/work-types.yaml +195 -0
  451. package/styles/LICENSE-CSL +375 -0
  452. package/styles/apa.csl +2283 -0
  453. package/styles/catalog.json +43 -0
  454. package/styles/fixtures/apa-7.expected.json +25 -0
  455. package/styles/fixtures/icontec-ntc1486-2022.expected.json +25 -0
  456. package/styles/fixtures/ieee.expected.json +25 -0
  457. package/styles/fixtures/references.jsonl +8 -0
  458. package/styles/icontec-ntc1486-2022.csl +388 -0
  459. package/styles/ieee.csl +519 -0
  460. package/templates/html/runtime.js +159 -0
  461. package/templates/html/thesis.css +98 -0
  462. package/templates/html/vendor/katex/LICENSE +21 -0
  463. package/templates/html/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  464. package/templates/html/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  465. package/templates/html/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  466. package/templates/html/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  467. package/templates/html/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  468. package/templates/html/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  469. package/templates/html/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  470. package/templates/html/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  471. package/templates/html/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  472. package/templates/html/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  473. package/templates/html/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  474. package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  475. package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  476. package/templates/html/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  477. package/templates/html/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  478. package/templates/html/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  479. package/templates/html/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  480. package/templates/html/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  481. package/templates/html/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  482. package/templates/html/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  483. package/templates/html/vendor/katex/katex.min.css +1 -0
  484. package/templates/html/vendor/katex/katex.min.js +1 -0
  485. package/templates/html/vendor/mermaid/LICENSE +21 -0
  486. package/templates/html/vendor/mermaid/mermaid.min.js +3587 -0
  487. package/templates/html/vendor/pagedjs/LICENSE +21 -0
  488. package/templates/html/vendor/pagedjs/paged.polyfill.min.js +4 -0
  489. package/templates/palettes.json +57 -0
  490. package/templates/profiles/apa-7.profile.yaml +15 -0
  491. package/templates/profiles/generic.profile.yaml +20 -0
  492. package/templates/profiles/icontec-ntc1486-2022.profile.yaml +36 -0
  493. package/templates/profiles/ieee.profile.yaml +14 -0
  494. package/templates/typst/i18n/en.yaml +31 -0
  495. package/templates/typst/i18n/es.yaml +31 -0
  496. package/templates/typst/i18n/pt.yaml +31 -0
  497. package/templates/typst/thesis.typ +276 -0
  498. package/typst-packages/preview/merman/0.3.0/LICENSE +231 -0
  499. package/typst-packages/preview/merman/0.3.0/README.md +388 -0
  500. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cose-base-v1/LICENSE +21 -0
  501. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cose-base-v2/LICENSE +21 -0
  502. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape/LICENSE +19 -0
  503. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape-cose-bilkent/LICENSE +21 -0
  504. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/cytoscape-fcose/LICENSE +19 -0
  505. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/d3-shape/LICENSE +13 -0
  506. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/dagre/LICENSE +19 -0
  507. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/dompurify/LICENSE +202 -0
  508. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/eclipse-elk/LICENSE.md +264 -0
  509. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/elkjs/LICENSE.md +264 -0
  510. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/fmin/LICENSE +27 -0
  511. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/graphlib/LICENSE +19 -0
  512. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/layout-base-v1/LICENSE +21 -0
  513. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/layout-base-v2/LICENSE +21 -0
  514. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/mermaid/LICENSE +21 -0
  515. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/rough-rs/LICENSE +21 -0
  516. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/roughjs/LICENSE +21 -0
  517. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/sanitize-url/LICENSE +21 -0
  518. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/venn-js/LICENSE +22 -0
  519. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/wasm-minimal-protocol/LICENSE +24 -0
  520. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_LICENSES/zenuml-core/LICENSE +21 -0
  521. package/typst-packages/preview/merman/0.3.0/THIRD_PARTY_NOTICES.md +265 -0
  522. package/typst-packages/preview/merman/0.3.0/lib.typ +1 -0
  523. package/typst-packages/preview/merman/0.3.0/merman_typst_plugin.wasm +0 -0
  524. package/typst-packages/preview/merman/0.3.0/src/capabilities.typ +5 -0
  525. package/typst-packages/preview/merman/0.3.0/src/context.typ +1 -0
  526. package/typst-packages/preview/merman/0.3.0/src/errors.typ +33 -0
  527. package/typst-packages/preview/merman/0.3.0/src/exports.typ +5 -0
  528. package/typst-packages/preview/merman/0.3.0/src/figure.typ +143 -0
  529. package/typst-packages/preview/merman/0.3.0/src/image.typ +50 -0
  530. package/typst-packages/preview/merman/0.3.0/src/options.typ +566 -0
  531. package/typst-packages/preview/merman/0.3.0/src/plugin.typ +1 -0
  532. package/typst-packages/preview/merman/0.3.0/src/raw.typ +22 -0
  533. package/typst-packages/preview/merman/0.3.0/src/render.typ +137 -0
  534. package/typst-packages/preview/merman/0.3.0/src/source.typ +7 -0
  535. package/typst-packages/preview/merman/0.3.0/src/units.typ +51 -0
  536. package/typst-packages/preview/merman/0.3.0/typst.toml +12 -0
  537. package/typst-packages/preview/mitex/0.2.7/CHANGELOG.md +69 -0
  538. package/typst-packages/preview/mitex/0.2.7/LICENSE +176 -0
  539. package/typst-packages/preview/mitex/0.2.7/README.md +154 -0
  540. package/typst-packages/preview/mitex/0.2.7/lib.typ +1 -0
  541. package/typst-packages/preview/mitex/0.2.7/mitex.typ +45 -0
  542. package/typst-packages/preview/mitex/0.2.7/mitex.wasm +0 -0
  543. package/typst-packages/preview/mitex/0.2.7/specs/README.md +250 -0
  544. package/typst-packages/preview/mitex/0.2.7/specs/latex/standard.typ +1187 -0
  545. package/typst-packages/preview/mitex/0.2.7/specs/mod.typ +12 -0
  546. package/typst-packages/preview/mitex/0.2.7/specs/prelude.typ +230 -0
  547. package/typst-packages/preview/mitex/0.2.7/typst.toml +12 -0
@@ -0,0 +1,107 @@
1
+ import { parseProtocol } from "../protocol.js";
2
+ import { fold } from "../research/verify.js";
3
+ const file = "research/protocol.md";
4
+ const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
5
+ const filled = (value) => typeof value === "string" && value.trim().length > 0;
6
+ const error = (message, hint) => ({
7
+ code: "DSN-001",
8
+ gate: "G1",
9
+ severity: "error",
10
+ file,
11
+ message,
12
+ ...(hint ? { hint } : {}),
13
+ });
14
+ function strings(value) {
15
+ return Array.isArray(value)
16
+ ? value
17
+ .filter((entry) => typeof entry === "string")
18
+ .map((entry) => fold(entry).trim())
19
+ : [];
20
+ }
21
+ /** G1: the protocol is complete (DSN-001) and its objective verbs are verifiable (DSN-002). */
22
+ export function checkDesign(project) {
23
+ if (project.protocolText === undefined)
24
+ return [];
25
+ const parsed = parseProtocol(project.protocolText);
26
+ if (!parsed.data)
27
+ return [error(parsed.error ?? "protocol.md cannot be read")];
28
+ const data = parsed.data;
29
+ const findings = [];
30
+ const hint = "Run /thesis:design again, or fix the front matter of research/protocol.md.";
31
+ if (!filled(data.problem))
32
+ findings.push(error("The protocol has no problem statement", hint));
33
+ if (!Array.isArray(data.researchQuestions) || !data.researchQuestions.some(filled)) {
34
+ findings.push(error("The protocol has no research question", hint));
35
+ }
36
+ const general = data.generalObjective;
37
+ if (!isObject(general) || !filled(general.text)) {
38
+ findings.push(error("The protocol has no general objective", hint));
39
+ }
40
+ const objectives = Array.isArray(data.specificObjectives) ? data.specificObjectives : [];
41
+ if (objectives.length < 2 || objectives.length > 6) {
42
+ findings.push(error(`The protocol must have 2 to 6 specific objectives (found ${objectives.length})`, hint));
43
+ }
44
+ objectives.forEach((objective, index) => {
45
+ if (!isObject(objective) ||
46
+ !filled(objective.id) ||
47
+ !filled(objective.verb) ||
48
+ !filled(objective.object) ||
49
+ !filled(objective.deliverable)) {
50
+ findings.push(error(`Specific objective ${index + 1} needs an id, a verb, an object and a deliverable`, hint));
51
+ }
52
+ });
53
+ const justification = data.justification;
54
+ if (!isObject(justification) ||
55
+ !["relevance", "novelty", "feasibility", "beneficiaries"].every((key) => filled(justification[key]))) {
56
+ findings.push(error("The justification must state relevance, novelty, feasibility and beneficiaries", hint));
57
+ }
58
+ const methodology = data.methodology;
59
+ if (!isObject(methodology) || !filled(methodology.design) || !filled(methodology.analysisPlan)) {
60
+ findings.push(error("The methodology needs at least a design and an analysis plan", hint));
61
+ }
62
+ // DSN-002: verbs against the approved list of the thesis language (warning, never blocking).
63
+ const profile = project.profile;
64
+ const rule = profile?.rules.find((entry) => entry.kind === "objective_verbs");
65
+ if (profile && !rule) {
66
+ findings.push({
67
+ code: "DSN-002",
68
+ gate: "G1",
69
+ severity: "info",
70
+ file,
71
+ message: `No approved objective-verb list exists for language ${profile.inputs.language}; verbs were not checked`,
72
+ });
73
+ }
74
+ else if (profile && rule) {
75
+ const recommended = new Set(Object.values(isObject(rule.values.recommendedByLevel) ? rule.values.recommendedByLevel : {}).flatMap(strings));
76
+ const unverifiable = new Set([
77
+ ...strings(rule.values.avoid),
78
+ ...strings(rule.values.ambiguous),
79
+ ]);
80
+ const downgrade = isObject(rule.values.qualitativeDowngrade)
81
+ ? rule.values.qualitativeDowngrade
82
+ : undefined;
83
+ const downgraded = new Set(strings(downgrade?.verbs));
84
+ const qualitative = profile.inputs.approach === "qualitative";
85
+ for (const objective of objectives) {
86
+ if (!isObject(objective) || !filled(objective.verb))
87
+ continue;
88
+ const verb = fold(String(objective.verb)).trim();
89
+ const id = filled(objective.id) ? String(objective.id) : "objective";
90
+ if (recommended.has(verb) && !unverifiable.has(verb))
91
+ continue;
92
+ const soft = qualitative && downgraded.has(verb);
93
+ findings.push({
94
+ code: "DSN-002",
95
+ gate: "G1",
96
+ severity: soft ? "info" : "warning",
97
+ file,
98
+ message: unverifiable.has(verb)
99
+ ? `${id}: the verb "${String(objective.verb)}" is not verifiable; use a measurable action verb`
100
+ : `${id}: the verb "${String(objective.verb)}" is not in the approved list for ${profile.inputs.language}`,
101
+ hint: `Approved verbs come from ${rule.ruleId}; see /thesis:pack explain ${rule.ruleId}.`,
102
+ });
103
+ }
104
+ }
105
+ return findings;
106
+ }
107
+ //# sourceMappingURL=design.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design.js","sourceRoot":"","sources":["../../src/checks/design.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type Assembled } from "../render/assemble.js";
2
+ import type { ThesisDocument } from "../render/model.js";
3
+ import type { Finding } from "../types.js";
4
+ import type { LoadedProject } from "./project.js";
5
+ /** The full-scope document of a project, parsed once per loaded project. */
6
+ export declare function documentOf(project: LoadedProject): Assembled | undefined;
7
+ /** XRF-001, XRF-002 and MTH-001. */
8
+ export declare function modelFindings(doc: ThesisDocument): Finding[];
9
+ /** G7: HYG-001 from the dialect (raw HTML, raw Typst, placeholders, unknown attributes) and label notes. */
10
+ export declare function checkDocumentHygiene(project: LoadedProject): Finding[];
11
+ /** G8: cross-references and math. */
12
+ export declare function checkDocumentModel(project: LoadedProject): Finding[];
13
+ /** G8 BLD-001: the last recorded build must have succeeded (nothing is reported before a first build). */
14
+ export declare function checkBuildReport(project: LoadedProject): Finding[];
15
+ /** FIG-001 to FIG-003: every chart spec under figures/ against the supported subset (G8). */
16
+ export declare function checkCharts(project: LoadedProject): Finding[];
17
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/checks/document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,uBAAuB,CAAC;AAGzE,OAAO,KAAK,EAAS,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMlD,4EAA4E;AAC5E,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,SAAS,CAQxE;AAOD,oCAAoC;AACpC,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,EAAE,CAsI5D;AAED,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAGtE;AAED,qCAAqC;AACrC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAIpE;AAED,0GAA0G;AAC1G,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CA2BlE;AAED,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAgB7D"}
@@ -0,0 +1,213 @@
1
+ import { assembleDocument } from "../render/assemble.js";
2
+ import { checkChartSpec } from "../render/charts.js";
3
+ import { validateLatex } from "../render/math.js";
4
+ import { allBlockLists, walkBlocks, walkInlines } from "../render/walk.js";
5
+ /** Checks over the renderer-neutral document model (spec 10.0): no output format is involved. */
6
+ const cache = new WeakMap();
7
+ /** The full-scope document of a project, parsed once per loaded project. */
8
+ export function documentOf(project) {
9
+ if (!cache.has(project)) {
10
+ cache.set(project, assembleDocument(project, { scope: "full", sections: project.sections ?? {} }));
11
+ }
12
+ return cache.get(project);
13
+ }
14
+ const at = (file, block) => ({
15
+ ...(file === undefined ? {} : { file }),
16
+ ...(block.line === undefined ? {} : { line: block.line }),
17
+ });
18
+ /** XRF-001, XRF-002 and MTH-001. */
19
+ export function modelFindings(doc) {
20
+ const findings = [];
21
+ const lists = allBlockLists(doc);
22
+ const defined = new Map();
23
+ for (const { file, blocks } of lists) {
24
+ walkBlocks(blocks, (block) => {
25
+ if (!("label" in block) || !block.label)
26
+ return;
27
+ const previous = defined.get(block.label);
28
+ if (previous) {
29
+ findings.push({
30
+ code: "XRF-001",
31
+ gate: "G8",
32
+ severity: "error",
33
+ ...at(file, block),
34
+ message: `Label ${block.label} is defined more than once (first at ${previous.file ?? "unknown"}${previous.line ? `:${previous.line}` : ""})`,
35
+ });
36
+ }
37
+ else
38
+ defined.set(block.label, { file, line: block.line });
39
+ });
40
+ }
41
+ const referenced = new Set();
42
+ for (const { file, blocks } of lists) {
43
+ walkInlines(blocks, (inline, owner) => {
44
+ if (inline.kind === "crossref") {
45
+ referenced.add(inline.label);
46
+ if (!defined.has(inline.label)) {
47
+ findings.push({
48
+ code: "XRF-001",
49
+ gate: "G8",
50
+ severity: "error",
51
+ ...at(file, owner),
52
+ message: `Reference @${inline.label} does not match any label`,
53
+ hint: "Label figures, tables, equations and headings with {#fig-x}, {#tbl-x}, {#eq-x} and {#sec-x}.",
54
+ });
55
+ }
56
+ }
57
+ if (inline.kind === "math") {
58
+ const problem = validateLatex(inline.latex);
59
+ if (problem) {
60
+ findings.push({
61
+ code: "MTH-001",
62
+ gate: "G8",
63
+ severity: "error",
64
+ ...at(file, owner),
65
+ message: problem,
66
+ });
67
+ }
68
+ }
69
+ });
70
+ walkBlocks(blocks, (block) => {
71
+ if (block.kind === "equation") {
72
+ const problem = validateLatex(block.latex);
73
+ if (problem) {
74
+ findings.push({
75
+ code: "MTH-001",
76
+ gate: "G8",
77
+ severity: "error",
78
+ ...at(file, block),
79
+ message: problem,
80
+ });
81
+ }
82
+ }
83
+ });
84
+ }
85
+ // FIG-004: a chart needs a caption and a source line.
86
+ for (const { file, blocks } of lists) {
87
+ walkBlocks(blocks, (block) => {
88
+ if (block.kind !== "figure" || block.asset.kind !== "chart")
89
+ return;
90
+ if (block.caption.length === 0) {
91
+ findings.push({
92
+ code: "FIG-004",
93
+ gate: "G8",
94
+ severity: "error",
95
+ ...at(file, block),
96
+ message: `Chart ${block.asset.path} has no caption`,
97
+ hint: "Write the caption as the figure's alt text: ![Caption. Source: ...](chart.vl.json).",
98
+ });
99
+ }
100
+ if (!block.source) {
101
+ findings.push({
102
+ code: "FIG-004",
103
+ gate: "G8",
104
+ severity: "error",
105
+ ...at(file, block),
106
+ message: `Chart ${block.asset.path} has no source line`,
107
+ hint: 'End the caption with "Source: ..." (Fuente: / Fonte:), for example "Source: own elaboration."',
108
+ });
109
+ }
110
+ });
111
+ }
112
+ // XRF-003: a heading level may not skip a level (for example # followed by ###).
113
+ let previous = 0;
114
+ for (const section of [...doc.body, ...doc.annexes]) {
115
+ walkBlocks(section.blocks, (block) => {
116
+ if (block.kind !== "heading")
117
+ return;
118
+ if (block.level > previous + 1) {
119
+ findings.push({
120
+ code: "XRF-003",
121
+ gate: "G8",
122
+ severity: "warning",
123
+ ...at(section.path, block),
124
+ message: previous === 0
125
+ ? `The first heading is level ${block.level}; start with a level 1 heading`
126
+ : `Heading level jumps from ${previous} to ${block.level}`,
127
+ hint: "Use consecutive heading levels so the table of contents and numbering stay meaningful.",
128
+ });
129
+ }
130
+ previous = block.level;
131
+ });
132
+ }
133
+ for (const { file, blocks } of lists) {
134
+ walkBlocks(blocks, (block) => {
135
+ if ((block.kind === "figure" || block.kind === "table") &&
136
+ block.label &&
137
+ !referenced.has(block.label)) {
138
+ findings.push({
139
+ code: "XRF-002",
140
+ gate: "G8",
141
+ severity: "warning",
142
+ ...at(file, block),
143
+ message: `${block.kind === "figure" ? "Figure" : "Table"} ${block.label} is never referenced in the text`,
144
+ hint: `Mention it with @${block.label}.`,
145
+ });
146
+ }
147
+ });
148
+ }
149
+ return findings;
150
+ }
151
+ /** G7: HYG-001 from the dialect (raw HTML, raw Typst, placeholders, unknown attributes) and label notes. */
152
+ export function checkDocumentHygiene(project) {
153
+ const assembled = documentOf(project);
154
+ return assembled ? assembled.findings.filter((finding) => finding.gate === "G7") : [];
155
+ }
156
+ /** G8: cross-references and math. */
157
+ export function checkDocumentModel(project) {
158
+ const assembled = documentOf(project);
159
+ if (!assembled)
160
+ return [];
161
+ return modelFindings(assembled.document);
162
+ }
163
+ /** G8 BLD-001: the last recorded build must have succeeded (nothing is reported before a first build). */
164
+ export function checkBuildReport(project) {
165
+ if (project.buildReportText === undefined)
166
+ return [];
167
+ let report;
168
+ try {
169
+ report = JSON.parse(project.buildReportText);
170
+ }
171
+ catch {
172
+ return [
173
+ {
174
+ code: "BLD-001",
175
+ gate: "G8",
176
+ severity: "error",
177
+ file: "build/build-report.json",
178
+ message: "The build report is unreadable; run /thesis:build again",
179
+ },
180
+ ];
181
+ }
182
+ if (report.ok === true)
183
+ return [];
184
+ return [
185
+ {
186
+ code: "BLD-001",
187
+ gate: "G8",
188
+ severity: "error",
189
+ file: "build/build-report.json",
190
+ message: `The last build (${typeof report.scope === "string" ? report.scope : "unknown scope"}) failed with ${typeof report.errors === "number" ? report.errors : "some"} error(s)`,
191
+ hint: "Run /thesis:build and fix the reported errors.",
192
+ },
193
+ ];
194
+ }
195
+ /** FIG-001 to FIG-003: every chart spec under figures/ against the supported subset (G8). */
196
+ export function checkCharts(project) {
197
+ const dataFiles = new Set(project.dataFiles);
198
+ const findings = [];
199
+ for (const spec of project.chartSpecs) {
200
+ for (const issue of checkChartSpec(spec.content, { dataFiles }).issues) {
201
+ findings.push({
202
+ code: issue.code,
203
+ gate: "G8",
204
+ severity: "error",
205
+ file: spec.path,
206
+ message: issue.message,
207
+ ...(issue.hint ? { hint: issue.hint } : {}),
208
+ });
209
+ }
210
+ }
211
+ return findings;
212
+ }
213
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/checks/document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type Finding } from "../types.js";
2
+ import type { LoadedProject } from "./project.js";
3
+ /** G2: the evidence library (EVD-*). */
4
+ export declare function checkEvidence(project: LoadedProject): Finding[];
5
+ /** G5 (partial): references.bib is byte-identical to a fresh generation (CIT-004). */
6
+ export declare function checkBibliography(project: LoadedProject): Finding[];
7
+ //# sourceMappingURL=evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/checks/evidence.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,OAAO,EAEb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAqDlD,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAiI/D;AAED,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAiBnE"}
@@ -0,0 +1,133 @@
1
+ import { flattenOutline, parseOutline } from "../outline.js";
2
+ import { generateBibtex } from "../research/bibtex.js";
3
+ import { citableForSection, parseLibraryText } from "../research/library.js";
4
+ import { classifyHost, officialDomainsFromProfile, primaryTypes, similarityThreshold, } from "../research/verify.js";
5
+ import { citableStatuses, } from "../types.js";
6
+ const libraryFile = "evidence/library.jsonl";
7
+ const bibliographyFile = "bibliography/references.bib";
8
+ const finding = (code, gate, severity, file, message, extra = {}) => ({ code, gate, severity, file, message, ...extra });
9
+ /** Why a citable status is not justified by the record's own verification data (spec 8.4). */
10
+ function statusProblem(record, domains) {
11
+ const { method, metadataMatch } = record.verification;
12
+ const viaApi = method === "crossref" || method === "openalex";
13
+ switch (record.status) {
14
+ case "VERIFIED_PEER_REVIEWED":
15
+ if (!viaApi)
16
+ return "peer-reviewed status needs Crossref or OpenAlex verification";
17
+ if (record.type !== "journal_article" && record.type !== "conference_paper")
18
+ return `peer-reviewed status needs a journal article or conference paper, not ${record.type}`;
19
+ if (metadataMatch < similarityThreshold)
20
+ return `metadata match ${metadataMatch} is below ${similarityThreshold}`;
21
+ return undefined;
22
+ case "VERIFIED_AUTHORITATIVE_GREY":
23
+ if (!viaApi)
24
+ return "authoritative grey status needs Crossref or OpenAlex verification";
25
+ if (metadataMatch < similarityThreshold)
26
+ return `metadata match ${metadataMatch} is below ${similarityThreshold}`;
27
+ return undefined;
28
+ case "VERIFIED_PRIMARY":
29
+ if (!primaryTypes.includes(record.type))
30
+ return `primary status needs a law, standard, report or dataset, not ${record.type}`;
31
+ if (classifyHost(record.url, record.type, domains).tier !== "primary")
32
+ return "primary status needs a URL on an official domain of the policy";
33
+ return undefined;
34
+ default:
35
+ return undefined;
36
+ }
37
+ }
38
+ const evidenceStarted = [
39
+ "research_approved",
40
+ "drafting",
41
+ "draft_review",
42
+ "approved",
43
+ "revising",
44
+ ];
45
+ /** G2: the evidence library (EVD-*). */
46
+ export function checkEvidence(project) {
47
+ if (project.libraryText === undefined)
48
+ return [];
49
+ const findings = [];
50
+ const { records, errors } = parseLibraryText(project.libraryText);
51
+ for (const error of errors) {
52
+ findings.push(finding("EVD-001", "G2", "error", libraryFile, error.message, { line: error.line }));
53
+ }
54
+ const domains = officialDomainsFromProfile(project.profile);
55
+ const ids = new Map();
56
+ const keys = new Map();
57
+ const dois = new Map();
58
+ for (const record of records) {
59
+ ids.set(record.id, (ids.get(record.id) ?? 0) + 1);
60
+ keys.set(record.citeKey, (keys.get(record.citeKey) ?? 0) + 1);
61
+ if (record.doi) {
62
+ const doi = record.doi.toLowerCase();
63
+ const first = dois.get(doi);
64
+ if (first)
65
+ findings.push(finding("EVD-002", "G2", "error", libraryFile, `DOI ${doi} appears in both ${first} and ${record.id}`, { hint: "Duplicates merge into the oldest evidence id; re-run /thesis:research." }));
66
+ else
67
+ dois.set(doi, record.id);
68
+ }
69
+ if (citableStatuses.includes(record.status)) {
70
+ const problem = statusProblem(record, domains);
71
+ if (problem)
72
+ findings.push(finding("EVD-003", "G2", "error", libraryFile, `${record.id} is ${record.status} but ${problem}`, { hint: "Citable statuses come only from code verification (spec 8.4)." }));
73
+ if (record.verification.retracted)
74
+ findings.push(finding("EVD-004", "G2", "error", libraryFile, `${record.id} is marked retracted but still has the citable status ${record.status}`));
75
+ }
76
+ }
77
+ for (const [id, count] of ids)
78
+ if (count > 1)
79
+ findings.push(finding("EVD-001", "G2", "error", libraryFile, `Evidence id ${id} appears ${count} times`));
80
+ for (const [key, count] of keys)
81
+ if (count > 1)
82
+ findings.push(finding("EVD-001", "G2", "error", libraryFile, `Citation key ${key} appears ${count} times`));
83
+ // Contextual approvals must point at real records.
84
+ for (const [sectionId, section] of Object.entries(project.sections ?? {})) {
85
+ for (const id of section.contextualApprovals ?? []) {
86
+ if (!ids.has(id))
87
+ findings.push(finding("EVD-005", "G2", "error", libraryFile, `${sectionId} approves unknown evidence ${id} for contextual use`));
88
+ }
89
+ }
90
+ // EVD-010: evidence minimums (warning). The policy sources give a minimum for the theoretical
91
+ // framework as a whole, so it applies to the section(s) marked as that framework.
92
+ const profile = project.profile;
93
+ if (profile && project.outlineText !== undefined && project.sections) {
94
+ const outline = parseOutline(project.outlineText).outline;
95
+ const frameworks = outline
96
+ ? flattenOutline(outline.sections).filter((node) => node.requiredKey === "marco_teorico" || node.requiredKey === "estado_del_arte")
97
+ : [];
98
+ for (const rule of profile.rules.filter((entry) => entry.kind === "evidence_minimum")) {
99
+ const minimum = rule.values.minCitable;
100
+ if (rule.values.scope !== "theoretical_framework" || typeof minimum !== "number")
101
+ continue;
102
+ for (const node of frameworks) {
103
+ const section = project.sections[node.id];
104
+ if (!section || !evidenceStarted.includes(section.status))
105
+ continue;
106
+ const citable = records.filter((record) => record.sections.includes(node.id) &&
107
+ citableForSection(record, section.contextualApprovals)).length;
108
+ if (citable < minimum) {
109
+ findings.push(finding("EVD-010", "G2", rule.values.severity === "error" ? "error" : "warning", libraryFile, `${node.id} has ${citable} citable record(s); ${rule.ruleId} suggests at least ${minimum} for this work type`, {
110
+ hint: "A suggestion from the policy, not a standard; search more or override the rule with an institutional one.",
111
+ }));
112
+ }
113
+ }
114
+ }
115
+ }
116
+ return findings;
117
+ }
118
+ /** G5 (partial): references.bib is byte-identical to a fresh generation (CIT-004). */
119
+ export function checkBibliography(project) {
120
+ if (project.libraryText === undefined && project.bibliographyText === undefined)
121
+ return [];
122
+ const { records, errors } = parseLibraryText(project.libraryText);
123
+ if (errors.length > 0)
124
+ return [];
125
+ if (project.bibliographyText === generateBibtex(records))
126
+ return [];
127
+ return [
128
+ finding("CIT-004", "G5", "error", bibliographyFile, "references.bib differs from a fresh generation of the evidence library", {
129
+ hint: "references.bib is generated and never hand-edited; delete it and run /thesis:research for any section to rebuild it.",
130
+ }),
131
+ ];
132
+ }
133
+ //# sourceMappingURL=evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/checks/evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Finding } from "../types.js";
2
+ import type { LoadedProject } from "./project.js";
3
+ /** G7 (path-leak part of HYG-001): no absolute local paths in the brief or the chapters. */
4
+ export declare function checkHygiene(project: LoadedProject): Finding[];
5
+ //# sourceMappingURL=hygiene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hygiene.d.ts","sourceRoot":"","sources":["../../src/checks/hygiene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA+BlD,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAK9D"}
@@ -0,0 +1,37 @@
1
+ // Absolute local-machine paths: POSIX home/temp roots and Windows drive paths.
2
+ const pathPatterns = [
3
+ /(?<![\w.:/-])\/(?:home|Users|root|tmp|private\/var|var\/folders)\/[^\s"'`)\]}<>,;]+/g,
4
+ /(?<![A-Za-z0-9])[A-Za-z]:\\[^\s"'`)\]}<>,;]+/g,
5
+ /(?<![A-Za-z0-9])[A-Za-z]:\/(?:Users|Documents and Settings)\/[^\s"'`)\]}<>,;]+/g,
6
+ ];
7
+ function scan(file, text) {
8
+ const findings = [];
9
+ text.split(/\r?\n/).forEach((line, index) => {
10
+ for (const pattern of pathPatterns) {
11
+ pattern.lastIndex = 0;
12
+ if (pattern.test(line)) {
13
+ findings.push({
14
+ code: "HYG-001",
15
+ gate: "G7",
16
+ severity: "error",
17
+ file,
18
+ line: index + 1,
19
+ message: "Absolute local path found; it leaks the author's machine layout",
20
+ hint: "Use workspace-relative paths such as figures/charts/x.vl.json.",
21
+ });
22
+ break;
23
+ }
24
+ }
25
+ });
26
+ return findings;
27
+ }
28
+ /** G7 (path-leak part of HYG-001): no absolute local paths in the brief or the chapters. */
29
+ export function checkHygiene(project) {
30
+ const findings = [];
31
+ if (project.briefText !== undefined)
32
+ findings.push(...scan("thesis.yaml", project.briefText));
33
+ for (const chapter of project.chapters)
34
+ findings.push(...scan(chapter.path, chapter.content));
35
+ return findings;
36
+ }
37
+ //# sourceMappingURL=hygiene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hygiene.js","sourceRoot":"","sources":["../../src/checks/hygiene.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,MAAM,YAAY,GAAG;IACnB,sFAAsF;IACtF,+CAA+C;IAC/C,iFAAiF;CAClF,CAAC;AAEF,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY;IACtC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC1C,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,IAAI;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI;oBACJ,IAAI,EAAE,KAAK,GAAG,CAAC;oBACf,OAAO,EAAE,iEAAiE;oBAC1E,IAAI,EAAE,gEAAgE;iBACvE,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type CheckReport, type Finding, type Gate } from "../types.js";
2
+ import type { LoadedProject } from "./project.js";
3
+ export { type LoadedProject, type LoadProjectOptions, loadProject } from "./project.js";
4
+ /** Each check is a pure function over the loaded project. */
5
+ export interface CheckDefinition {
6
+ id: string;
7
+ gate: Gate;
8
+ run(project: LoadedProject): Finding[];
9
+ }
10
+ export declare const checkRegistry: readonly CheckDefinition[];
11
+ export declare function parseGates(values: readonly string[]): Gate[];
12
+ export interface RunOptions {
13
+ gates?: readonly Gate[];
14
+ now?: () => Date;
15
+ /** Keep only the findings of one section (and the files of it), as `thesis_check` offers. */
16
+ section?: string;
17
+ }
18
+ export declare function runChecks(project: LoadedProject, options?: RunOptions): CheckReport;
19
+ /** Plain-text rendering shared by the command, the tool summary and the CLI. */
20
+ export declare function formatReport(report: CheckReport): string;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAS,MAAM,aAAa,CAAC;AAkB/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExF,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,EAAE,CAAC;CACxC;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,eAAe,EAsBnD,CAAC;AAEF,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,EAAE,CAU5D;AAKD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,GAAE,UAAe,GAAG,WAAW,CAsCvF;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAaxD"}