unaltraweb 0.3.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 (444) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/Makefile +412 -0
  4. data/README.md +226 -0
  5. data/_config.yml +842 -0
  6. data/_data/i18n/ca.yml +278 -0
  7. data/_data/i18n/en.yml +278 -0
  8. data/_data/i18n/es.yml +278 -0
  9. data/_includes/audio.liquid +30 -0
  10. data/_includes/bib_search.liquid +5 -0
  11. data/_includes/blog-list.liquid +66 -0
  12. data/_includes/book-citation.liquid +33 -0
  13. data/_includes/citation.liquid +26 -0
  14. data/_includes/custom_head.liquid +3 -0
  15. data/_includes/custom_scripts.liquid +5 -0
  16. data/_includes/cv/list.liquid +5 -0
  17. data/_includes/cv/list_groups.liquid +51 -0
  18. data/_includes/cv/map.liquid +29 -0
  19. data/_includes/cv/nested_list.liquid +16 -0
  20. data/_includes/cv/time_table.liquid +118 -0
  21. data/_includes/cv-download-card.liquid +26 -0
  22. data/_includes/developer-mode-switcher.liquid +24 -0
  23. data/_includes/disqus.liquid +13 -0
  24. data/_includes/distill_scripts.liquid +298 -0
  25. data/_includes/documentation-download-detail.liquid +76 -0
  26. data/_includes/documentation-downloads.liquid +71 -0
  27. data/_includes/documentation-profile-attributes.liquid +4 -0
  28. data/_includes/documentation-section-toc.liquid +9 -0
  29. data/_includes/documentation-sidebar.liquid +112 -0
  30. data/_includes/figure.liquid +87 -0
  31. data/_includes/footer.liquid +66 -0
  32. data/_includes/giscus.liquid +25 -0
  33. data/_includes/head.liquid +220 -0
  34. data/_includes/header.liquid +544 -0
  35. data/_includes/latest_posts.liquid +61 -0
  36. data/_includes/localized-date.liquid +5 -0
  37. data/_includes/manual-bibliography.liquid +2 -0
  38. data/_includes/manual-featured-readings.liquid +12 -0
  39. data/_includes/manual-other-readings.liquid +12 -0
  40. data/_includes/manual-page-toc.liquid +11 -0
  41. data/_includes/manual-sidebar.liquid +58 -0
  42. data/_includes/manual-teachers.liquid +74 -0
  43. data/_includes/metadata.liquid +278 -0
  44. data/_includes/news.liquid +48 -0
  45. data/_includes/newsletter.liquid +68 -0
  46. data/_includes/page-hero.liquid +96 -0
  47. data/_includes/page-link.liquid +8 -0
  48. data/_includes/pagination.liquid +22 -0
  49. data/_includes/post-reading-time.liquid +29 -0
  50. data/_includes/previous-next.liquid +37 -0
  51. data/_includes/profile-card.liquid +49 -0
  52. data/_includes/profile-feature-matrix.liquid +75 -0
  53. data/_includes/profile-highlights.liquid +122 -0
  54. data/_includes/project-grid.liquid +26 -0
  55. data/_includes/project-resource-link.liquid +45 -0
  56. data/_includes/project-resources.liquid +21 -0
  57. data/_includes/projects.liquid +38 -0
  58. data/_includes/projects_horizontal.liquid +37 -0
  59. data/_includes/publications-metrics-summary.liquid +69 -0
  60. data/_includes/publications-summary.liquid +127 -0
  61. data/_includes/reading-biblio-controls.liquid +65 -0
  62. data/_includes/reading-cover-card.liquid +93 -0
  63. data/_includes/reading-rating.liquid +11 -0
  64. data/_includes/recommended-readings.liquid +30 -0
  65. data/_includes/related_posts.liquid +39 -0
  66. data/_includes/repository/repo.liquid +48 -0
  67. data/_includes/repository/repo_trophies.liquid +44 -0
  68. data/_includes/repository/repo_user.liquid +35 -0
  69. data/_includes/resume/awards.liquid +19 -0
  70. data/_includes/resume/basics.liquid +28 -0
  71. data/_includes/resume/certificates.liquid +35 -0
  72. data/_includes/resume/education.liquid +54 -0
  73. data/_includes/resume/interests.liquid +34 -0
  74. data/_includes/resume/languages.liquid +31 -0
  75. data/_includes/resume/projects.liquid +32 -0
  76. data/_includes/resume/publications.liquid +28 -0
  77. data/_includes/resume/references.liquid +31 -0
  78. data/_includes/resume/skills.liquid +33 -0
  79. data/_includes/resume/volunteer.liquid +52 -0
  80. data/_includes/resume/work.liquid +52 -0
  81. data/_includes/scripts.liquid +364 -0
  82. data/_includes/search-data.js.liquid +341 -0
  83. data/_includes/selected_papers.liquid +3 -0
  84. data/_includes/t.liquid +31 -0
  85. data/_includes/team-grid.liquid +172 -0
  86. data/_includes/video.liquid +97 -0
  87. data/_layouts/about.liquid +93 -0
  88. data/_layouts/archive.liquid +45 -0
  89. data/_layouts/bib.liquid +677 -0
  90. data/_layouts/book-review.liquid +225 -0
  91. data/_layouts/book-shelf.liquid +66 -0
  92. data/_layouts/cv.liquid +127 -0
  93. data/_layouts/default.liquid +70 -0
  94. data/_layouts/distill.liquid +132 -0
  95. data/_layouts/documentation-download-detail.liquid +5 -0
  96. data/_layouts/documentation-home.liquid +100 -0
  97. data/_layouts/documentation-page.liquid +45 -0
  98. data/_layouts/manual-bib.liquid +73 -0
  99. data/_layouts/manual-chapter.liquid +99 -0
  100. data/_layouts/manual-featured-bib.liquid +100 -0
  101. data/_layouts/manual-home.liquid +120 -0
  102. data/_layouts/none.liquid +1 -0
  103. data/_layouts/outputs.liquid +29 -0
  104. data/_layouts/page.liquid +52 -0
  105. data/_layouts/post.liquid +95 -0
  106. data/_layouts/profile.liquid +36 -0
  107. data/_layouts/profiles.liquid +36 -0
  108. data/_layouts/project.liquid +7 -0
  109. data/_layouts/repositories.liquid +58 -0
  110. data/_layouts/theses.liquid +126 -0
  111. data/_plugins/bibliography_profiles.rb +164 -0
  112. data/_plugins/callouts.rb +104 -0
  113. data/_plugins/code_blocks.rb +277 -0
  114. data/_plugins/computation_figure_images.rb +266 -0
  115. data/_plugins/computation_sources.rb +42 -0
  116. data/_plugins/content_search_index.rb +210 -0
  117. data/_plugins/details.rb +23 -0
  118. data/_plugins/external-posts.rb +124 -0
  119. data/_plugins/figure_captions.rb +800 -0
  120. data/_plugins/file-exists.rb +22 -0
  121. data/_plugins/google-scholar-citations.rb +86 -0
  122. data/_plugins/hide-custom-bibtex.rb +18 -0
  123. data/_plugins/inspirehep-citations.rb +57 -0
  124. data/_plugins/localized_visual_sources.rb +145 -0
  125. data/_plugins/manual_release_metadata.rb +47 -0
  126. data/_plugins/mermaid_mmd_images.rb +233 -0
  127. data/_plugins/profile-pages.rb +28 -0
  128. data/_plugins/remove-accents.rb +32 -0
  129. data/_plugins/reproducible_build_time.rb +55 -0
  130. data/_plugins/search-data.rb +83 -0
  131. data/_plugins/theme-cache-bust.rb +56 -0
  132. data/_plugins/vega_visual_images.rb +290 -0
  133. data/_plugins/web_capture_images.rb +154 -0
  134. data/_sass/_base.scss +2133 -0
  135. data/_sass/_blog.scss +67 -0
  136. data/_sass/_callouts.scss +100 -0
  137. data/_sass/_custom.scss +437 -0
  138. data/_sass/_cv.scss +274 -0
  139. data/_sass/_developer.scss +97 -0
  140. data/_sass/_distill.scss +185 -0
  141. data/_sass/_documentation.scss +2220 -0
  142. data/_sass/_layout.scss +218 -0
  143. data/_sass/_manual.scss +2691 -0
  144. data/_sass/_profile.scss +323 -0
  145. data/_sass/_projects.scss +163 -0
  146. data/_sass/_reading.scss +465 -0
  147. data/_sass/_site-custom.scss +3 -0
  148. data/_sass/_tabs.scss +48 -0
  149. data/_sass/_team.scss +230 -0
  150. data/_sass/_themes.scss +254 -0
  151. data/_sass/_typograms.scss +132 -0
  152. data/_sass/_variables.scss +52 -0
  153. data/_sass/font-awesome/_animated.scss +152 -0
  154. data/_sass/font-awesome/_bordered-pulled.scss +20 -0
  155. data/_sass/font-awesome/_core.scss +49 -0
  156. data/_sass/font-awesome/_fixed-width.scss +7 -0
  157. data/_sass/font-awesome/_functions.scss +57 -0
  158. data/_sass/font-awesome/_icons.scss +13 -0
  159. data/_sass/font-awesome/_list.scss +18 -0
  160. data/_sass/font-awesome/_mixins.scss +65 -0
  161. data/_sass/font-awesome/_rotated-flipped.scss +31 -0
  162. data/_sass/font-awesome/_screen-reader.scss +14 -0
  163. data/_sass/font-awesome/_shims.scss +1578 -0
  164. data/_sass/font-awesome/_sizing.scss +16 -0
  165. data/_sass/font-awesome/_stacked.scss +32 -0
  166. data/_sass/font-awesome/_variables.scss +5044 -0
  167. data/_sass/font-awesome/brands.scss +30 -0
  168. data/_sass/font-awesome/fontawesome.scss +21 -0
  169. data/_sass/font-awesome/regular.scss +27 -0
  170. data/_sass/font-awesome/solid.scss +27 -0
  171. data/_sass/font-awesome/v4-shims.scss +11 -0
  172. data/_sass/tabler-icons/tabler-icons-filled.scss +1646 -0
  173. data/_sass/tabler-icons/tabler-icons-outline.scss +9859 -0
  174. data/_sass/tabler-icons/tabler-icons.scss +11463 -0
  175. data/_scripts/cronitor-analytics-setup.js +9 -0
  176. data/_scripts/giscus-setup.js +48 -0
  177. data/_scripts/google-analytics-setup.js +9 -0
  178. data/_scripts/open-panel-analytics-setup.js +14 -0
  179. data/_scripts/photoswipe-setup.js +11 -0
  180. data/assets/audio/epicaly-short-113909.mp3 +0 -0
  181. data/assets/bibliography/2018-12-22-distill.bib +7 -0
  182. data/assets/css/academicons.min.css +1 -0
  183. data/assets/css/bootstrap-toc.min.css +4 -0
  184. data/assets/css/bootstrap.min.css +7 -0
  185. data/assets/css/bootstrap.min.css.map +1 -0
  186. data/assets/css/jekyll-pygments-themes-github.css +209 -0
  187. data/assets/css/jekyll-pygments-themes-native.css +232 -0
  188. data/assets/css/jupyter-grade3.css +3758 -0
  189. data/assets/css/jupyter-monokai.css +3758 -0
  190. data/assets/css/jupyter.css +383 -0
  191. data/assets/css/main.scss +36 -0
  192. data/assets/css/mdb.min.css +48 -0
  193. data/assets/css/mdb.min.css.map +1 -0
  194. data/assets/css/scholar-icons.css +386 -0
  195. data/assets/fonts/academicons.ttf +0 -0
  196. data/assets/fonts/academicons.woff +0 -0
  197. data/assets/fonts/scholar-icons.ttf +0 -0
  198. data/assets/fonts/scholar-icons.woff +0 -0
  199. data/assets/fonts/tabler-icons-filled.ttf +0 -0
  200. data/assets/fonts/tabler-icons-filled.woff +0 -0
  201. data/assets/fonts/tabler-icons-filled.woff2 +0 -0
  202. data/assets/fonts/tabler-icons-outline.ttf +0 -0
  203. data/assets/fonts/tabler-icons-outline.woff +0 -0
  204. data/assets/fonts/tabler-icons-outline.woff2 +0 -0
  205. data/assets/fonts/tabler-icons.ttf +0 -0
  206. data/assets/fonts/tabler-icons.woff +0 -0
  207. data/assets/fonts/tabler-icons.woff2 +0 -0
  208. data/assets/html/relativity.html +15 -0
  209. data/assets/img/1.jpg +0 -0
  210. data/assets/img/10.jpg +0 -0
  211. data/assets/img/11.jpg +0 -0
  212. data/assets/img/12.jpg +0 -0
  213. data/assets/img/2.jpg +0 -0
  214. data/assets/img/3.jpg +0 -0
  215. data/assets/img/4.jpg +0 -0
  216. data/assets/img/5.jpg +0 -0
  217. data/assets/img/6.jpg +0 -0
  218. data/assets/img/7.jpg +0 -0
  219. data/assets/img/8.jpg +0 -0
  220. data/assets/img/9.jpg +0 -0
  221. data/assets/img/book_covers/the_godfather.jpg +0 -0
  222. data/assets/img/brand/dosquartsdedocs-logo-cafe.svg +31 -0
  223. data/assets/img/brand/dosquartsdedocs-logo-footer-cafe.svg +31 -0
  224. data/assets/img/brand/dosquartsdedocs-logo-white.svg +31 -0
  225. data/assets/img/brand/dosquartsdedocs-logo.svg +31 -0
  226. data/assets/img/prof_pic.jpg +0 -0
  227. data/assets/img/prof_pic_color.png +0 -0
  228. data/assets/img/profile-placeholder.svg +8 -0
  229. data/assets/img/publication_preview/brownian-motion.gif +0 -0
  230. data/assets/img/publication_preview/goodchild1992-gis-cover.jpg +0 -0
  231. data/assets/img/publication_preview/gutierrez2020-jtrg-preview.jpg +0 -0
  232. data/assets/img/publication_preview/harvey1989-postmodernity-cover.jpg +0 -0
  233. data/assets/img/publication_preview/tobler1970-economic-geography-cover.jpg +0 -0
  234. data/assets/img/publication_preview/tuan1977-space-place-cover.jpg +0 -0
  235. data/assets/img/publication_preview/wave-mechanics.gif +0 -0
  236. data/assets/img/publication_preview/zaragozi2025-rooftop-pv-preview.jpg +0 -0
  237. data/assets/img/rhino.png +0 -0
  238. data/assets/img/team/aaron-gutierrez.png +0 -0
  239. data/assets/img/team/alba-font.png +0 -0
  240. data/assets/img/team/alba-viana.png +0 -0
  241. data/assets/img/team/alejandro-gonzalez.png +0 -0
  242. data/assets/img/team/ana-pastor.png +0 -0
  243. data/assets/img/team/antoni-domenech.png +0 -0
  244. data/assets/img/team/benito-zaragozi.png +0 -0
  245. data/assets/img/team/cinta-sanz.png +0 -0
  246. data/assets/img/team/daniel-miravet.png +0 -0
  247. data/assets/img/team/eugenia-altamirano.png +0 -0
  248. data/assets/img/team/fiammetta-brandajs.png +0 -0
  249. data/assets/img/team/francesc-gonzalez.png +0 -0
  250. data/assets/img/team/isabel-paulino.png +0 -0
  251. data/assets/img/team/joan-borras.png +0 -0
  252. data/assets/img/team/julie-wilson.png +0 -0
  253. data/assets/img/team/liliana-sole.png +0 -0
  254. data/assets/img/team/maria-casado.png +0 -0
  255. data/assets/img/team/maria-medina.png +0 -0
  256. data/assets/img/team/marta-nello.png +0 -0
  257. data/assets/img/team/mogrify +1 -0
  258. data/assets/img/team/oscar-saladie.png +0 -0
  259. data/assets/img/team/paolo-russo.png +0 -0
  260. data/assets/img/team/raquel-santos.png +0 -0
  261. data/assets/img/team/salvador-anton.png +0 -0
  262. data/assets/img/team/sunsi-huertas.png +0 -0
  263. data/assets/img/team/user-placeholder.png +0 -0
  264. data/assets/img/team/wilbert-den-hoed.png +0 -0
  265. data/assets/img/team/xavier-delclos.png +0 -0
  266. data/assets/img/template_error.png +0 -0
  267. data/assets/js/bibsearch.js +70 -0
  268. data/assets/js/bootstrap-toc.min.js +5 -0
  269. data/assets/js/bootstrap.bundle.min.js +7 -0
  270. data/assets/js/bootstrap.bundle.min.js.map +1 -0
  271. data/assets/js/callouts.js +115 -0
  272. data/assets/js/chartjs-setup.js +14 -0
  273. data/assets/js/common.js +117 -0
  274. data/assets/js/content-search-match.js +159 -0
  275. data/assets/js/content-search.js +441 -0
  276. data/assets/js/copy_code.js +60 -0
  277. data/assets/js/custom.js +6 -0
  278. data/assets/js/developer-mode.js +103 -0
  279. data/assets/js/diff2html-setup.js +20 -0
  280. data/assets/js/distillpub/overrides.js +27 -0
  281. data/assets/js/distillpub/template.v2.js +9616 -0
  282. data/assets/js/distillpub/template.v2.js.map +1 -0
  283. data/assets/js/distillpub/transforms.v2.js +14557 -0
  284. data/assets/js/distillpub/transforms.v2.js.map +1 -0
  285. data/assets/js/documentation.js +435 -0
  286. data/assets/js/echarts-setup.js +29 -0
  287. data/assets/js/highlight-search-term.js +110 -0
  288. data/assets/js/jupyter_new_tab.js +18 -0
  289. data/assets/js/leaflet-setup.js +22 -0
  290. data/assets/js/manual.js +308 -0
  291. data/assets/js/masonry.js +12 -0
  292. data/assets/js/mathjax-setup.js +46 -0
  293. data/assets/js/mermaid-setup.js +37 -0
  294. data/assets/js/newsletter.js +105 -0
  295. data/assets/js/no_defer.js +24 -0
  296. data/assets/js/plotly-setup.js +52 -0
  297. data/assets/js/profile-nav.js +92 -0
  298. data/assets/js/progress-bar.js +73 -0
  299. data/assets/js/pseudocode-setup.js +18 -0
  300. data/assets/js/search/base-styles.min.js +286 -0
  301. data/assets/js/search/command-score.min.js +7 -0
  302. data/assets/js/search/hotkeys-js/hotkeys.esm.min.js +18 -0
  303. data/assets/js/search/lit/decorators.min.js +7 -0
  304. data/assets/js/search/lit/directives/class-map.min.js +7 -0
  305. data/assets/js/search/lit/directives/join.min.js +7 -0
  306. data/assets/js/search/lit/directives/live.min.js +7 -0
  307. data/assets/js/search/lit/directives/ref.min.js +7 -0
  308. data/assets/js/search/lit/directives/repeat.min.js +7 -0
  309. data/assets/js/search/lit/directives/unsafe-html.min.js +7 -0
  310. data/assets/js/search/lit/index.min.js +7 -0
  311. data/assets/js/search/lit-element/lit-element.min.js +12 -0
  312. data/assets/js/search/lit-html/directives/class-map.min.js +22 -0
  313. data/assets/js/search/lit-html/directives/join.min.js +12 -0
  314. data/assets/js/search/lit-html/directives/live.min.js +28 -0
  315. data/assets/js/search/lit-html/directives/ref.min.js +32 -0
  316. data/assets/js/search/lit-html/directives/repeat.min.js +27 -0
  317. data/assets/js/search/lit-html/directives/unsafe-html.min.js +22 -0
  318. data/assets/js/search/lit-html/is-server.min.js +12 -0
  319. data/assets/js/search/lit-html/lit-html.min.js +12 -0
  320. data/assets/js/search/ninja-action.min.js +101 -0
  321. data/assets/js/search/ninja-footer.min.js +62 -0
  322. data/assets/js/search/ninja-header.min.js +78 -0
  323. data/assets/js/search/ninja-keys.min.js +39 -0
  324. data/assets/js/search/reactive-element/decorators/custom-element.min.js +12 -0
  325. data/assets/js/search/reactive-element/decorators/event-options.min.js +12 -0
  326. data/assets/js/search/reactive-element/decorators/property.min.js +22 -0
  327. data/assets/js/search/reactive-element/decorators/query-all.min.js +17 -0
  328. data/assets/js/search/reactive-element/decorators/query-assigned-elements.min.js +17 -0
  329. data/assets/js/search/reactive-element/decorators/query-assigned-nodes.min.js +17 -0
  330. data/assets/js/search/reactive-element/decorators/query-async.min.js +17 -0
  331. data/assets/js/search/reactive-element/decorators/query.min.js +17 -0
  332. data/assets/js/search/reactive-element/decorators/state.min.js +27 -0
  333. data/assets/js/search/reactive-element/reactive-element.min.js +17 -0
  334. data/assets/js/search-setup.js +17 -0
  335. data/assets/js/shortcut-key.js +11 -0
  336. data/assets/js/tabs.min.js +5 -0
  337. data/assets/js/theme.js +314 -0
  338. data/assets/js/tooltips-setup.js +3 -0
  339. data/assets/js/typograms.js +1341 -0
  340. data/assets/js/vanilla-back-to-top.min.js +1 -0
  341. data/assets/js/vega-setup.js +24 -0
  342. data/assets/js/venobox-setup.js +5 -0
  343. data/assets/js/wechat.js +14 -0
  344. data/assets/js/zoom.js +15 -0
  345. data/assets/json/resume.json +98 -0
  346. data/assets/json/table_data.json +128 -0
  347. data/assets/jupyter/blog.ipynb +48 -0
  348. data/assets/pdf/example_pdf.pdf +0 -0
  349. data/assets/plotly/demo.html +72 -0
  350. data/assets/video/pexels-engin-akyurt-6069112-960x540-30fps.mp4 +0 -0
  351. data/assets/webfonts/fa-brands-400.ttf +0 -0
  352. data/assets/webfonts/fa-brands-400.woff2 +0 -0
  353. data/assets/webfonts/fa-regular-400.ttf +0 -0
  354. data/assets/webfonts/fa-regular-400.woff2 +0 -0
  355. data/assets/webfonts/fa-solid-900.ttf +0 -0
  356. data/assets/webfonts/fa-solid-900.woff2 +0 -0
  357. data/assets/webfonts/fa-v4compatibility.ttf +0 -0
  358. data/assets/webfonts/fa-v4compatibility.woff2 +0 -0
  359. data/docs/Gemfile +5 -0
  360. data/docs/_config.yml +83 -0
  361. data/docs/_documentation/en/01-quick-start.md +115 -0
  362. data/docs/_documentation/en/02-tools.md +146 -0
  363. data/docs/_documentation/en/03-usage.md +107 -0
  364. data/docs/_documentation/en/04-jekyll-basics.md +51 -0
  365. data/docs/_documentation/en/05-pages-collections.md +68 -0
  366. data/docs/_documentation/en/06-github-web-editing.md +92 -0
  367. data/docs/_documentation/en/10-profiles.md +125 -0
  368. data/docs/_documentation/en/11-unaltreselfie.md +39 -0
  369. data/docs/_documentation/en/12-unaltreprojecte.md +38 -0
  370. data/docs/_documentation/en/13-unaltremanual.md +237 -0
  371. data/docs/_documentation/en/14-unaltredocs.md +92 -0
  372. data/docs/_documentation/en/15-profile-checklist.md +39 -0
  373. data/docs/_documentation/en/20-syntax.md +353 -0
  374. data/docs/_documentation/en/21-themes.md +103 -0
  375. data/docs/_documentation/en/22-feature-reference.md +56 -0
  376. data/docs/_documentation/en/23-front-matter.md +51 -0
  377. data/docs/_documentation/en/24-data-files.md +28 -0
  378. data/docs/_documentation/en/30-customization.md +448 -0
  379. data/docs/_documentation/en/31-template.md +55 -0
  380. data/docs/_documentation/en/32-development.md +108 -0
  381. data/docs/_documentation/en/33-reusable-workflows.md +136 -0
  382. data/docs/_documentation/en/40-distribution.md +164 -0
  383. data/docs/_documentation/en/41-bibliometrics.md +137 -0
  384. data/docs/_documentation/en/42-docker-image.md +185 -0
  385. data/docs/_documentation/en/50-faq.md +33 -0
  386. data/docs/_pages/ca/index.md +35 -0
  387. data/docs/_pages/en/index.md +35 -0
  388. data/docs/_pages/es/index.md +35 -0
  389. data/docs/agents/action-prompts/00-start-site-session.txt +10 -0
  390. data/docs/agents/action-prompts/05-create-new-web.txt +5 -0
  391. data/docs/agents/action-prompts/10-content-update.txt +9 -0
  392. data/docs/agents/action-prompts/15-edit-default-content.txt +8 -0
  393. data/docs/agents/action-prompts/20-manual-teaching-materials.txt +18 -0
  394. data/docs/agents/action-prompts/22-manual-style-audit.txt +14 -0
  395. data/docs/agents/action-prompts/23-manual-structure-audit.txt +17 -0
  396. data/docs/agents/action-prompts/25-translation-prepublish.txt +8 -0
  397. data/docs/agents/action-prompts/30-project-site-update.txt +7 -0
  398. data/docs/agents/action-prompts/40-documentation-update.txt +7 -0
  399. data/docs/agents/action-prompts/50-bibliography-entry.txt +7 -0
  400. data/docs/agents/action-prompts/60-bibliometrics-refresh.txt +7 -0
  401. data/docs/agents/action-prompts/70-build-and-review.txt +12 -0
  402. data/docs/agents/manual-authoring-components.md +255 -0
  403. data/docs/agents/mcp-contract.md +162 -0
  404. data/docs/agents/quarto-computation-adoption.md +102 -0
  405. data/docs/assets/img/unaltraweb-docs-hero.svg +36 -0
  406. data/lib/unaltraweb/version.rb +8 -0
  407. data/lib/unaltraweb.rb +31 -0
  408. data/requirements.txt +5 -0
  409. data/scripts/biblio/fetch_scimago_csv.sh +126 -0
  410. data/scripts/biblio/metrics_common.py +154 -0
  411. data/scripts/biblio/metrics_merge_meta.py +73 -0
  412. data/scripts/biblio/metrics_update.py +826 -0
  413. data/scripts/computations/python/Dockerfile +37 -0
  414. data/scripts/computations/r/Dockerfile +31 -0
  415. data/scripts/computations/render.py +1267 -0
  416. data/scripts/cv/render_pdf_preview.sh +36 -0
  417. data/scripts/deploy/publish_branch.sh +80 -0
  418. data/scripts/generate_logo_variants.py +47 -0
  419. data/scripts/manual/Dockerfile +31 -0
  420. data/scripts/manual/build_pdf.py +1780 -0
  421. data/scripts/manual/filters/bibliography.lua +164 -0
  422. data/scripts/manual/filters/code-blocks.lua +102 -0
  423. data/scripts/manual/filters/figure-captions.lua +35 -0
  424. data/scripts/manual/publish_release.sh +281 -0
  425. data/scripts/manual/templates/manual.tex +494 -0
  426. data/scripts/manual/verify_release_assets.py +650 -0
  427. data/scripts/test_gem_build.py +128 -0
  428. data/scripts/test_reproducible_jekyll_build.py +191 -0
  429. data/scripts/test_wheel_install.py +282 -0
  430. data/scripts/unaltraweb-docker-mount.sh +36 -0
  431. data/scripts/unaltraweb-mcp-bootstrap.sh +105 -0
  432. data/scripts/unaltraweb-mcp-cleanup.sh +73 -0
  433. data/scripts/unaltraweb-mcp-project-id.sh +34 -0
  434. data/scripts/validate_distribution.py +563 -0
  435. data/scripts/validate_workflows.py +1285 -0
  436. data/scripts/web_captures/Dockerfile +31 -0
  437. data/scripts/web_captures/capture.mjs +157 -0
  438. data/scripts/web_captures/package-lock.json +56 -0
  439. data/scripts/web_captures/package.json +9 -0
  440. data/scripts/web_captures/render.py +867 -0
  441. data/src/unaltraweb_mcp/component-contract.json +153 -0
  442. data/src/unaltraweb_mcp/component-contract.schema.json +87 -0
  443. data/src/unaltraweb_mcp/docker_mount.py +19 -0
  444. metadata +861 -0
@@ -0,0 +1,448 @@
1
+ ---
2
+ title: Customize A Child Site
3
+ description: Local customization points for unaltraweb child sites.
4
+ lang: en
5
+ ref: customization
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - local-authors
10
+ - site-designers
11
+ - contributors
12
+ - core-developers
13
+ section: Design And Customize
14
+ weight: 330
15
+ permalink: "/customization/"
16
+ nav_title: Customization
17
+ ---
18
+ `unaltraweb` is intended to be customized from the site repository, not by editing the core theme files.
19
+
20
+ ## Local Styles
21
+
22
+ Create `_sass/_site-custom.scss` in your site repository. It is imported after the core styles, so local rules can override CSS custom properties or add small components while still receiving upstream `unaltraweb` updates.
23
+
24
+ ```scss
25
+ :root {
26
+ --global-theme-color: #2f6f5e;
27
+ --global-hover-color: #2f6f5e;
28
+ }
29
+
30
+ html[data-theme="cafe"] {
31
+ --global-theme-color: #6f4e1f;
32
+ }
33
+ ```
34
+
35
+ The built-in coffee mode uses `data-theme="cafe"`. Override CSS custom properties in that selector when you want a different brown palette without changing light or dark mode.
36
+
37
+ For larger local style changes, keep selectors scoped by profile or theme:
38
+
39
+ ```scss
40
+ html[data-site-profile="unaltredocs"] .documentation-sidebar {
41
+ --documentation-toc-line: color-mix(in srgb, var(--global-theme-color) 42%, var(--global-divider-color));
42
+ }
43
+
44
+ html[data-theme="dark"] .my-local-card {
45
+ background: #1f2935;
46
+ }
47
+ ```
48
+
49
+ Do not copy `_sass/` files from `unaltraweb` into a child site. Override tokens and small selectors locally so future gem updates still apply.
50
+
51
+ ## Multilingual Hyphenation
52
+
53
+ Text hyphenation is enabled globally in the main content area. Browsers use the page language from `lang` (`en`, `es`, `ca`, or another configured language) to choose the hyphenation dictionary.
54
+
55
+ Use `.no-hyphenate` when a specific word, brand, code-like label or compact block should not be split:
56
+
57
+ ```html
58
+ <span class="no-hyphenate">dosquartsdedocs</span>
59
+ ```
60
+
61
+ For mixed-language passages, set the appropriate `lang` attribute on the local element so the browser can switch dictionaries.
62
+
63
+ ## Local Layouts
64
+
65
+ Create a layout in `_layouts/` inside the site repository and reference it from page front matter.
66
+
67
+ ```liquid
68
+ ---
69
+ layout: page
70
+ ---
71
+
72
+ <div class="my-local-layout">
73
+ {{ content }}
74
+ </div>
75
+ ```
76
+
77
+ ```yaml
78
+ ---
79
+ layout: my-local-layout
80
+ title: Custom Page
81
+ ---
82
+ ```
83
+
84
+ Jekyll resolves site files before theme files, so local layouts can extend or override core layouts without forking `unaltraweb`.
85
+
86
+ ## Site Profiles And Features
87
+
88
+ Use `site.unaltraweb.site_profile` to select the prepared website profile and `site.unaltraweb.features` to enable or hide standard sections. A site profile is a high-level preset for the kind of website being built; it is not a Jekyll layout or include.
89
+
90
+ ```yaml
91
+ unaltraweb:
92
+ site_profile: unaltreselfie
93
+ features:
94
+ blog: true
95
+ cv: true
96
+ projects: true
97
+ publications: true
98
+ metrics: true
99
+ ```
100
+
101
+ Navigation pages can opt into a feature gate with front matter:
102
+
103
+ ```yaml
104
+ ---
105
+ title: Projects
106
+ ref: projects
107
+ feature: projects
108
+ nav: true
109
+ ---
110
+ ```
111
+
112
+ If `unaltraweb.features.projects` is `false`, that page is hidden from the navigation. The page still exists if it is published, so users can keep drafts or direct links while changing presets.
113
+
114
+ ## Standard Section Layouts
115
+
116
+ Several reusable sections are layouts. Child sites should prefer these layouts over copying Liquid loops into their pages:
117
+
118
+ ```yaml
119
+ ---
120
+ layout: outputs
121
+ title: Outputs
122
+ ref: outputs
123
+ permalink: /en/outputs/
124
+ ---
125
+ ```
126
+
127
+ ```yaml
128
+ ---
129
+ layout: repositories
130
+ title: Repositories
131
+ ref: repositories
132
+ permalink: /en/repositories/
133
+ ---
134
+ ```
135
+
136
+ ```yaml
137
+ ---
138
+ layout: theses
139
+ title: Theses
140
+ ref: theses
141
+ permalink: /en/theses/
142
+ ---
143
+ ```
144
+
145
+ ```yaml
146
+ ---
147
+ layout: book-shelf
148
+ title: Readings
149
+ ref: books
150
+ collection: books
151
+ permalink: /en/readings/
152
+ ---
153
+ ```
154
+
155
+ The content lives in the site repository: `_outputs/` for output cards, `_data/repositories.yml` for repository cards, `_theses/` for thesis records, and `_books/` for reading notes. The rendering logic stays in `unaltraweb`.
156
+
157
+ ## Callout Shorthand
158
+
159
+ Use nested Markdown blockquotes for lightweight teaching callouts. A single `>` remains a normal quotation; deeper levels become callouts:
160
+
161
+ ```markdown
162
+ >> A note or tip.
163
+
164
+ >>> A worked example.
165
+
166
+ >>>> A warning.
167
+
168
+ >>>>> Learning objectives.
169
+
170
+ >>>>>> A caution or danger note.
171
+ ```
172
+
173
+ The labels are localized through `_data/i18n/*.yml` under `callouts`, and the colors follow the active light, coffee, or dark theme.
174
+
175
+ ## Manual Profile
176
+
177
+ Use the `unaltremanual` site profile for academic handbooks, course manuals and book-like teaching material. The core profile provides a cover page, a sticky contents sidebar, a right-hand chapter table of contents, multilingual chapter routing, teacher blocks, automatic figure captions for chapters, a full-text manual search index, navbar reader font-size controls and a bibliography section without bibliometric badges.
178
+
179
+ ```yaml
180
+ unaltraweb:
181
+ site_profile: unaltremanual
182
+ manual:
183
+ collection: chapters
184
+ cover_image: /assets/img/manual-cover.svg
185
+ logo: /assets/img/brand/dosquartsdedocs-logo.svg
186
+ logo_inverse: /assets/img/brand/dosquartsdedocs-logo-white.svg
187
+ figure_captions:
188
+ enabled: true
189
+ collections: [chapters]
190
+
191
+ scholar:
192
+ # Optional formatting override; profile ordering remains alphabetical.
193
+ style: apa
194
+ ```
195
+
196
+ `unaltremanual` uses `_bibliography/manual.bib` by default. Web reference cards suppress the trailing DOI/URL text while preserving DOI/LINK buttons and citation/BibTeX panels; the PDF retains printable access links. Personal and project profiles instead keep curriculum-style reverse chronological ordering.
197
+
198
+ Create one localized home page per language with `layout: manual-home` and `ref: home`, then add chapters to `_chapters/<lang>/`:
199
+
200
+ ```yaml
201
+ ---
202
+ layout: manual-chapter
203
+ title: Reading Spatial Data
204
+ lang: en
205
+ ref: reading-spatial-data
206
+ weight: 20
207
+ permalink: /en/chapters/reading-spatial-data/
208
+ manual_references: true
209
+ mermaid:
210
+ enabled: true
211
+ zoomable: true
212
+ ---
213
+ ```
214
+
215
+ Markdown images inside configured chapter collections are wrapped in `<figure>` elements and get localized labels. Use the optional image title as the caption:
216
+
217
+ ```markdown
218
+ ![Digitizing workflow]({{ site.baseurl }}/assets/img/workflow.svg "Main editing steps")
219
+ ```
220
+
221
+ For multi-panel teaching figures, use a compact subfigure block. The layout string uses `/` for rows and `+` for columns, inspired by patchwork-style composition:
222
+
223
+ ```markdown
224
+ ::: subfigures a+b/c "Three views of the same exercise"
225
+ ![Interface]({{ site.baseurl }}/assets/img/interface.svg "Interface")
226
+ ![Map]({{ site.baseurl }}/assets/img/map.svg "Map")
227
+ ![Diagram]({{ site.baseurl }}/assets/img/diagram.svg "Diagram")
228
+ :::
229
+ ```
230
+
231
+ This renders one numbered figure with panel labels `a`, `b`, `c`; the contained images remain ordinary Markdown image declarations.
232
+ Multi-panel figures work best for direct before/after comparisons, controlled alternatives, short sequences, or complementary views. Prefer compact layouts such as `a+b` and `a+b/c`, keep panel captions specific, and use the device selectively rather than grouping every set of related images.
233
+
234
+ Manual chapters can also number teaching tables with the same localized counter style. Wrap a regular Markdown table in a table block and put the caption in the opening line:
235
+
236
+ ```markdown
237
+ ::: table "Weekly work rhythm"
238
+ | Week | Focus | Output |
239
+ | --- | --- | --- |
240
+ | 1 | Orientation | Reading notes |
241
+ | 2 | Data setup | Working project folder |
242
+ :::
243
+ ```
244
+
245
+ This renders a numbered table with localized labels such as `Table 1.`, `Taula 1.` or `Tabla 1.`. Tables and figures keep separate counters.
246
+
247
+ Use a listing block to give one fenced code block a numbered caption on the web and in the PDF:
248
+
249
+ ````markdown
250
+ ::: listing "Inspect the roads layer"
251
+ ```bash
252
+ ogrinfo data/raw/roads.gpkg -so roads
253
+ ```
254
+ :::
255
+ ````
256
+
257
+ The wrapper requires one non-empty double-quoted caption and exactly one fence. Captioned code examples use a counter separate from figures and tables and appear in the PDF list of code examples. Unwrapped fences remain valid and unindexed.
258
+
259
+ Use fenced code blocks for programming examples and semantic technical notation. Recognized languages show a language header, line numbers, syntax highlighting, and alternating line backgrounds. The web uses Rouge for common TIG languages; the PDF guarantees the complete treatment for Bash/Linux shell, SQL/PostGIS, Python, R, URLs (`url`), spreadsheet formulas (`spreadsheet`), and file listings (`filetree`). The three semantic fences use localized headers. Use `text` or omit the language for unnumbered verbatim without a header. A language unsupported by one renderer also falls back to that plain presentation:
260
+
261
+ ````markdown
262
+ Inline code like `ST_Transform` stays inside the paragraph.
263
+
264
+ ```sql
265
+ SELECT ST_Area(geom::geography) AS area_m2
266
+ FROM protected_areas;
267
+ ```
268
+
269
+ ```bash
270
+ ogrinfo data/raw/roads.gpkg -so roads
271
+ ```
272
+
273
+ ```powershell
274
+ ogrinfo data\raw\roads.gpkg -so roads
275
+ ```
276
+
277
+ ```python
278
+ import geopandas as gpd
279
+ ```
280
+
281
+ ```r
282
+ library(sf)
283
+ ```
284
+
285
+ ```haskell
286
+ manhattan :: Int -> Int -> Int
287
+ ```
288
+ ````
289
+
290
+ Every site profile writes `assets/js/content-search-index.json` during the build. Content search returns repeated whole-word occurrences separately, ignores diacritics when matching, and adds previous/next occurrence navigation to the destination page. Set `search_exclude: true` in a page or document's front matter when published content should remain outside that public index. The `search_enabled` setting only controls the separate Ninja Keys navigation and metadata palette.
291
+
292
+ Mermaid and PlantUML source references are rewritten to SVG outputs. When a
293
+ matching `*.edited.svg` exists it wins; otherwise the build targets the generated
294
+ `*.svg` file and asks `diavisuals` to render it when the shared renderer is
295
+ available. Manual diagram figures also receive diagram surfaces tuned for light,
296
+ dark and coffee themes. This keeps generated diagrams and hand-edited diagrams
297
+ readable in the same Markdown:
298
+
299
+ ```markdown
300
+ ![Vector workflow]({{ site.baseurl }}/assets/diagrams/vector-workflow.mmd "Vector workflow")
301
+ ```
302
+
303
+ SVG is the first-choice output so authors can edit the figure after generation.
304
+ If an agent is asked to change a diagram source while `*.edited.svg` exists, it
305
+ should ask whether to preserve that edited SVG or replace it with a new generated
306
+ SVG.
307
+
308
+ ## Page Hero Images
309
+
310
+ Any page that uses `layout: page` or `layout: about` can define a hero image in front matter. The compact form keeps compatibility with older pages:
311
+
312
+ ```yaml
313
+ ---
314
+ layout: page
315
+ title: Example Page
316
+ hero_image: /assets/img/example-hero.jpg
317
+ hero_image_alt: Short accessible description
318
+ hero_caption: Optional caption
319
+ hero_source: Optional source name
320
+ hero_source_url: https://example.org/source
321
+ ---
322
+ ```
323
+
324
+ For new pages, use the grouped `hero` form:
325
+
326
+ ```yaml
327
+ ---
328
+ layout: page
329
+ title: Example Page
330
+ hero:
331
+ image: /assets/img/example-hero.jpg
332
+ alt: Short accessible description
333
+ caption: Optional caption
334
+ source: Optional source name
335
+ source_url: https://example.org/source
336
+ position: center
337
+ ---
338
+ ```
339
+
340
+ ## Blog Pagination
341
+
342
+ Child sites can enable blog pagination without changing the core defaults. Set pagination in the site config and enable it on the blog page that includes `blog-list.liquid`.
343
+
344
+ ```yaml
345
+ pagination:
346
+ enabled: true
347
+ collection: posts
348
+ per_page: 4
349
+ permalink: /page/:num/
350
+ title: ":title"
351
+ sort_field: date
352
+ sort_reverse: true
353
+ ```
354
+
355
+ ```yaml
356
+ ---
357
+ title: Blog
358
+ pagination:
359
+ enabled: true
360
+ locale: en
361
+ ---
362
+ ```
363
+
364
+ `blog-list.liquid` uses `paginator.posts` when Jekyll generates paginated pages and falls back to the localized post archive otherwise. For multilingual sites, set the page-level `pagination.locale` and the same `locale` value in each post front matter.
365
+
366
+ ## Project Card Images
367
+
368
+ Project entries can define a main image with `hero`. In project cards, that image is used as a very light degraded background for the card.
369
+
370
+ ```yaml
371
+ ---
372
+ title: Example Project
373
+ description: Short project summary.
374
+ hero: /assets/img/projects/example.jpg
375
+ ---
376
+ ```
377
+
378
+ ## Project Resources
379
+
380
+ Project entries can also define `resources`. These links are rendered as icon badges on the project card and in a resources panel inside pages that use `layout: project`.
381
+
382
+ ```yaml
383
+ ---
384
+ layout: project
385
+ title: Example Project
386
+ resources:
387
+ - type: zenodo
388
+ label: Zenodo dataset
389
+ url: https://zenodo.org/records/1000001
390
+ doi: 10.5281/zenodo.1000001
391
+ - type: dataset
392
+ label: Harmonized data layers
393
+ url: https://example.org/datasets/example
394
+ - type: documentation
395
+ label: Technical notes
396
+ url: https://example.org/docs/example
397
+ ---
398
+ ```
399
+
400
+ Supported built-in icon types include `zenodo`, `doi`, `dataset`, `data`, `code`, `github`, `repository`, `documentation`, `docs`, `unaltremanual`, `map`, `publication`, `paper`, `report`, `website`, and `link`. A resource can override the icon with an explicit class, for example `icon: fa-solid fa-chart-line`.
401
+
402
+ ## CV Preview Cards
403
+
404
+ Use `cv-download-card.liquid` on CV pages when the PDF is the source of truth and the page should show a first-page preview plus a download button.
405
+
406
+ ```yaml
407
+ ---
408
+ cv_pdf: /assets/pdf/cv.pdf
409
+ cv_preview: /assets/img/cv-preview.jpg
410
+ ---
411
+ ```
412
+
413
+ ```liquid
414
+ {% raw %}{% include cv-download-card.liquid pdf=page.cv_pdf preview=page.cv_preview title="CV" %}{% endraw %}
415
+ ```
416
+
417
+ Child sites can generate the preview with their template `Makefile` target:
418
+
419
+ ```bash
420
+ make cv-preview CV_PDF=assets/pdf/cv.pdf CV_PREVIEW=assets/img/cv-preview.jpg
421
+ ```
422
+
423
+ ## Theme Modes
424
+
425
+ The built-in theme switch supports `system`, `light`, `cafe`, and `dark` settings. `system` follows the browser preference and resolves to light or dark; `cafe` is an explicit coffee reading mode for warm long-form pages.
426
+
427
+ Theme changes are observable from JavaScript through the `unaltraweb:themechange` event:
428
+
429
+ ```js
430
+ document.addEventListener("unaltraweb:themechange", (event) => {
431
+ console.log(event.detail.theme, event.detail.themeSetting);
432
+ });
433
+ ```
434
+
435
+ The active values are also available on `<html>` as `data-theme`, `data-theme-setting`, `data-theme-integration`, and `data-site-profile`. These attributes are stable enough for local styles and automated browser tests.
436
+
437
+ ## Developer Mode
438
+
439
+ `unaltraweb-template` can enable `unaltraweb.developer_mode` in a development-only config file. When `JEKYLL_ENV` is not `production`, this displays a floating indicator showing the real profile used by the current build.
440
+
441
+ ```yaml
442
+ unaltraweb:
443
+ developer_mode: true
444
+ ```
445
+
446
+ Keep this setting out of production builds. The template `Makefile` writes it to `tmp/_config.development.yml` for `make serve` only when working directly in the `unaltraweb-template` checkout, while child sites keep it disabled unless `DEVELOPER_MODE=true` is passed explicitly. `make build` uses the normal production config.
447
+
448
+ Do not rely on client-side preview shells for alternate profiles. Jekyll renders one real configuration per build, so profiles should be tested by rebuilding with a config overlay, for example `make serve SITE_PROFILE=unaltreprojecte` in the template. Pages can declare `profiles: [unaltreselfie]` or `profiles: [unaltreprojecte]`; the core filters non-matching pages before writing the site.
@@ -0,0 +1,55 @@
1
+ ---
2
+ title: Understand Core And Template Roles
3
+ description: Why unaltraweb-template is the primary integration demo.
4
+ lang: en
5
+ ref: template_role
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - local-authors
10
+ - contributors
11
+ - core-developers
12
+ section: Contribute
13
+ weight: 510
14
+ permalink: "/template/"
15
+ nav_title: Core And Template
16
+ ---
17
+ <p class="lede"><code>unaltraweb-template</code> is the full-profile demo and integration fixture. It should stay thin, but it is the best place to prove that the gem works for real child sites. Clean sites come from the package-owned <code>new_web</code> scaffolds.</p>
18
+
19
+ ## Why The Template Matters
20
+
21
+ - It consumes `unaltraweb` as an external dependency.
22
+ - It contains realistic demo content for `unaltreselfie`, `unaltreprojecte`, `unaltremanual` and `unaltredocs` profiles.
23
+ - It exercises richer local Docker and browser-test orchestration than the clean package scaffolds.
24
+ - It uses the selected `ghcr.io/dosquartsdedocs/unaltraweb:0.3.0` runtime image by default; mutable `main` is reserved for maintainer testing.
25
+ - It runs Playwright smoke tests and screenshots across profiles, themes and responsive layouts.
26
+ - It keeps rich demo content out of clean profile scaffolds.
27
+
28
+ The core `docs/` site is different: it is an `unaltredocs`-style documentation site for explaining `unaltraweb` itself. The template is the place where richer examples of all four profiles are shown together.
29
+
30
+ ## What Should Stay In The Core
31
+
32
+ - Shared layouts and includes.
33
+ - Sass and static assets that every child site can reuse.
34
+ - Jekyll plugins and Liquid helpers.
35
+ - Bibliometric, CV and documentation tooling.
36
+ - Reusable GitHub Actions workflows.
37
+ - The `unaltraweb` reference site under `docs/`.
38
+
39
+ ## What Should Stay In The Template
40
+
41
+ - Editable `_config.yml` defaults.
42
+ - Demo pages, posts, projects, chapters and bibliography records.
43
+ - Local `_sass/_site-custom.scss` examples.
44
+ - Local Makefile and Docker wrapper for child-site workflows.
45
+ - Render smoke tests and screenshots.
46
+
47
+ ## Local Core Validation
48
+
49
+ ```bash
50
+ cd ../unaltraweb-template
51
+ make build LOCAL_CORE=../unaltraweb
52
+ make test LOCAL_CORE=../unaltraweb SITE_PROFILE=unaltreprojecte
53
+ ```
54
+
55
+ On constrained machines, prefer `make build` first and run only the profile-specific browser test needed for the change.
@@ -0,0 +1,108 @@
1
+ ---
2
+ title: Develop The Core
3
+ description: Safe development and verification workflow for unaltraweb.
4
+ lang: en
5
+ ref: development_workflow
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - contributors
10
+ - core-developers
11
+ section: Core Development
12
+ weight: 610
13
+ permalink: "/development/"
14
+ nav_title: Core Development
15
+ ---
16
+ <p class="lede">Validate core changes in layers. Use lightweight checks while editing, then run heavier Docker or Playwright checks only when the machine can handle them.</p>
17
+
18
+ ## Lightweight Checks
19
+
20
+ ```bash
21
+ git status --short --branch
22
+ git diff --check
23
+ ```
24
+
25
+ Use these for documentation-only changes or before deciding whether a heavier build is worth running.
26
+
27
+ ## Docs Deploy
28
+
29
+ The core repository can publish the `unaltraweb` reference site from `docs/` with the manual `.github/workflows/deploy.yml` workflow and GitHub Pages Actions. This workflow does not need Node/npm and does not build the full inherited core demo site.
30
+
31
+ The reference site is a real child site of the local `unaltraweb` gem. It uses `theme: unaltraweb`, the shared layouts/includes/Sass, and `unaltraweb.site_profile: unaltredocs`.
32
+
33
+ ```bash
34
+ make docs-serve DOCKER_IMAGE=unaltraweb:dev
35
+ make docs-build DOCKER_IMAGE=unaltraweb:dev
36
+ make docs-publish DOCKER_IMAGE=unaltraweb:dev
37
+ ```
38
+
39
+ After the selected versioned Docker image is available, omit `DOCKER_IMAGE=unaltraweb:dev`.
40
+
41
+ Docs deploys, link checks, publication metrics and all publication workflows remain manual. CodeQL and the repository CI workflow run automatically; neither deploys or publishes anything.
42
+
43
+ ## Automatic CI
44
+
45
+ `.github/workflows/ci.yml` runs on pull requests and pushes. Its bounded jobs cover Python 3.10/3.13 compile and unit checks, `git diff --check`, workflow policy, structural `distribution-check`, clean wheel and gem checks, and cached Docker builds followed by MCP smoke and docs builds. CodeQL analyzes JavaScript/TypeScript, Python and Ruby for pull requests, default-branch pushes and its weekly schedule.
46
+
47
+ Automatic CI deliberately uses the structural gate. It verifies that pending component releases are represented truthfully but does not require them to be published, so normal feature work can remain green before a coordinated release.
48
+
49
+ `make distribution-release-check` is stricter: it exits nonzero while any selected component is `pending` or `unavailable`. After the final source and release intent are reviewed, mark the selected components `ready` and commit that state. Core artifact workflows use credential-free preflights. For runtime, MCP, and manual PDF, a signing/package-write job builds each SHA-only candidate once without running it; a read-only job verifies its GitHub-signed, registry-stored provenance and revision, removes GHCR credentials, and tests only exact digests; and a final package-write job that executes no candidate assigns and verifies `sha-*`, `main`, and `latest`. The registry absence check is best-effort because GHCR tag writes are not compare-and-swap operations, so signed and tested digests remain the trust anchor. Record those image digests and package checksums in `release-candidates.json`; its commit must be an immediate child that changes no other path. The strict gate validates that receipt before the release tag is created on the receipt commit. Tag workflows require the SHA tag, signed attestation, and revision label to bind the recorded digest to the receipt's `source_commit`, promote only those manifests to semver aliases, and never rebuild or execute them. Components already published elsewhere may be `released`; released containers other than the self-describing MCP must be digest-pinned. Starting any manual workflow is still an explicit approval, and package preparation does not publish to RubyGems/PyPI or create a GitHub release.
50
+
51
+ ## Core Build
52
+
53
+ The local port convention for working with both repositories is:
54
+
55
+ - `unaltraweb` core/docs: `http://localhost:4000/unaltraweb/`.
56
+ - `unaltreselfie`: `http://localhost:4001/unaltraweb-template/en/`.
57
+ - `unaltreprojecte`: `http://localhost:4002/unaltraweb-template/en/`.
58
+ - `unaltremanual`: `http://localhost:4003/unaltraweb-template/en/`.
59
+ - `unaltredocs`: `http://localhost:4004/unaltraweb-template/en/`.
60
+
61
+ ```bash
62
+ docker compose -f docker-compose.yml run --rm --entrypoint "bash -lc '(bundle check || bundle install) && bundle exec jekyll build --trace'" jekyll
63
+ docker compose -f docker-compose.yml down --remove-orphans
64
+ ```
65
+
66
+ This can be resource-heavy because the inherited demo build minifies JavaScript and can generate many responsive WebP images.
67
+
68
+ The same Dockerfile is published manually. Consumers select `ghcr.io/dosquartsdedocs/unaltraweb:0.3.0`; the mutable `ghcr.io/dosquartsdedocs/unaltraweb:main` channel and local `unaltraweb:dev` name are explicit maintainer paths. The `unaltraweb` gem remains the source of theme files and plugins.
69
+
70
+ The root core build excludes `docs/`. The reference site is published from the `docs/` folder through a dedicated workflow so its root-relative permalinks do not collide with the inherited core demo build.
71
+
72
+ ## Template Consumer Checks
73
+
74
+ ```bash
75
+ cd ../unaltraweb-template
76
+ make build LOCAL_CORE=../unaltraweb
77
+ make test LOCAL_CORE=../unaltraweb SITE_PROFILE=unaltreselfie PORT=4018
78
+ make test LOCAL_CORE=../unaltraweb SITE_PROFILE=unaltreprojecte PORT=4019
79
+ make test LOCAL_CORE=../unaltraweb SITE_PROFILE=unaltremanual PORT=4020
80
+ make down
81
+ ```
82
+
83
+ Run the smallest relevant profile when resources are limited.
84
+
85
+ ## Static Builds
86
+
87
+ Normal Jekyll builds must not fetch external services. Metrics updates are explicit pre-build tasks that write local data files.
88
+
89
+ ```bash
90
+ make metrics-scimago-fetch
91
+ make metrics-update
92
+ make metrics-check
93
+ ```
94
+
95
+ Local metrics commands accept the same safety checks used in CI:
96
+
97
+ ```bash
98
+ make metrics-update METRICS_ARGS="--strict-external --require-scimago"
99
+ make metrics-scimago-fetch SCIMAGO_INPUT=path/to/scimagojr.csv
100
+ ```
101
+
102
+ Publication metrics can also run through the manual/reusable `.github/workflows/metrics-update.yml` workflow. By default it uploads diagnostics and does not open a pull request. Set `create_pull_request: true` when you want GitHub to propose generated metrics changes. Generated Scimago caches and diagnostics stay out of PRs; `_bibliography/**/*.bib` and `_data/metrics.yml` are the versionable outputs.
103
+
104
+ ## Formatting Lockfile
105
+
106
+ `package.json` declares Prettier and the Liquid plugin. Regenerate `package-lock.json` with `npm install` on a machine with Node/npm available. Do not hand-edit dependency integrity data.
107
+
108
+ `npm` is development tooling rather than Jekyll runtime. If containerized npm commands become necessary, use a small dedicated Node tooling image or a GitHub Action instead of adding npm to every Jekyll build path.