diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 87e9232..3ff9d04 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,4 +7,7 @@ - [ ] ES / EN / FR kept in lock-step (`.md` + `.en.md` + `.fr.md`, or the `es:` / `en:` / `fr:` columns) - [ ] `bundle exec jekyll build` passes locally (or the **Build site** check is green) - [ ] New external links verified to open the intended page +- [ ] English text, code, comments and names use American English (see AGENTS.md) +- [ ] No e-mail addresses and no new links into `cnet.fi.uba.ar` +- [ ] New publications carry `topics = {…}` from `_data/publication_topics.yml` - [ ] Screenshots attached for visual changes diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 3b51399..4b01b58 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,6 +4,11 @@ updates: directory: "/" schedule: interval: monthly + ignore: + # Pinned to 2.x on purpose: the academicpages partials do not compile under + # dart-sass (jekyll-sass-converter 3.x). See the Gemfile and AGENTS.md. + - dependency-name: jekyll-sass-converter + update-types: ["version-update:semver-major"] groups: jekyll: patterns: ["*"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3cb409f..01151e6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,6 +24,19 @@ jobs: ruby-version: "3.3" bundler-cache: true + - name: Check publication topic ids + run: | + # Every id in a `topics = {...}` field must exist in + # _data/publication_topics.yml; an unknown id renders no chip silently. + known=$(sed -n 's/^- id: *//p' _data/publication_topics.yml | sort -u) + used=$(grep -oE '^[[:space:]]*topics[[:space:]]*=[[:space:]]*\{[^}]*\}' _bibliography/conexdat.bib \ + | sed -E 's/.*\{(.*)\}/\1/' | tr ',' '\n' | tr -d ' ' | sed '/^$/d' | sort -u) + unknown=$(comm -13 <(echo "$known") <(echo "$used")) + if [ -n "$unknown" ]; then + echo "::error::Unknown publication topic id(s): $unknown"; exit 1 + fi + echo "OK: $(echo "$used" | wc -l) topic ids used, all known" + - name: Build site (Jekyll + polyglot + scholar) env: JEKYLL_ENV: production @@ -40,4 +53,16 @@ jobs: grep -q 'href="/en/" title="English"' _site/index.html grep -q 'href="/" title="Español"' _site/en/index.html grep -q 'href="/fr/" title="Français"' _site/en/index.html + # Publication topics: chips in the bar, and space-separated ids on + # entries (the filter splits on whitespace). + grep -q 'data-topic="latam"' _site/publications/index.html + grep -Eq 'data-topics="[a-z-]+ +[a-z-]+' _site/en/publications/index.html + # Group decision: no e-mail addresses anywhere on the site. + if grep -rl 'mailto:' _site --include='*.html'; then + echo "::error::mailto: link found (the site publishes no e-mail addresses)"; exit 1 + fi + # Repository docs must not be published with the site. + for f in AGENTS.md CLAUDE.md CONTRIBUTING.md CODE_OF_CONDUCT.md SECURITY.md; do + test ! -e "_site/$f" + done echo "OK: $(find _site -name '*.html' | wc -l) HTML files" diff --git a/.gitignore b/.gitignore index c402fc6..bffd200 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ Gemfile.lock *~ node_modules/ + +# Claude Code subagent worktrees +.claude/worktrees/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..94398ac --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,120 @@ +# AGENTS.md — CoNexDat website + +Instructions for AI coding agents (Claude Code, Copilot, Codex, Cursor, ...) working in +this repository. `CLAUDE.md` includes this file. Humans: see `CONTRIBUTING.md`. + +## What this project is + +The public website of CoNexDat, the Complex Networks and Data Communication Group at +the School of Engineering of the University of Buenos Aires (FIUBA), directed by +J. Ignacio Alvarez-Hamelin. It is a static Jekyll 4 site built on the academicpages +template, trilingual (Spanish default, English, French) through jekyll-polyglot, with +publications rendered from BibTeX by jekyll-scholar. GitHub Actions builds it and +publishes `_site/` to the `gh-pages` branch, served at . +It replaces the legacy site at `cnet.fi.uba.ar`, which is being retired. + +## Layout + +``` +_config.yml site, polyglot and scholar settings; cnet.highlighted_authors +_config.dev.yml local overrides (url: http://localhost:4000); required for previews +_pages/.md Spanish page; .en.md and .fr.md are the translations +_data/ + members.yml people, by category (current, external, former-inhouse, ...) + projects.yml funded projects + research_areas.yml research areas: home cards + /research// pages + highlights.yml home-page project cards + publication_topics.yml publication topics (labels), trilingual + theses.yml, navigation.yml, ui-text.yml +_news/ one file per news item and language (inline, no pages) +_bibliography/conexdat.bib THE publication list (other .bib files are unused sources) +_layouts/bib_entry.html how one publication renders (buttons, highlighting, topic chips) +_includes/ masthead (language switcher), people/projects/theses lists, + publications-filter.html, research-area.html +assets/js/publications.js search / topic / person filter on /publications/ +_sass/_conexdat.scss all site-specific styles (colors, cards, chips, dark mode) +.github/workflows/ build.yml (PR check "Build site"), deploy.yml (push to main) +``` + +## Commands + +```bash +export PATH="/usr/local/opt/ruby@3.3/bin:$PATH" # macOS/Homebrew; Ruby 3.3 only +bundle install +bundle exec jekyll serve --livereload --config _config.yml,_config.dev.yml # preview +JEKYLL_ENV=production bundle exec jekyll build # what CI runs +``` + +Ruby 3.3 is required: the system Ruby is too old for Bundler 4, and Ruby 4 cannot +compile the `sassc` native gem. A full build takes about 30 seconds. The repeated +"Error reading file _layouts/single" warnings are a harmless polyglot quirk. To preview +a finished build without Jekyll, serve `_site/` on **port 4000**; the dev config +hard-codes that origin for CSS and assets. + +## Conventions + +- **American English everywhere** (mandatory) for English text: the `.en.md` pages, the + `en:` values in `_data/`, English news, this file, README, CONTRIBUTING, commit + messages, PR descriptions, and every code comment, identifier, CSS class and + JavaScript name (`color`, `gray`, `center`, `behavior`, `modeling`, `analyze`, + `visualize`, `normalize`, `organization`, `toward`, `inquiry`). Spanish and French + content stays in correct Spanish and French. Exceptions: proper names and published + paper titles in the bibliography are kept exactly as published. +- **Three languages in lock-step.** Every content change updates Spanish, English and + French together: the three `.md` files of a page, or the `es:` / `en:` / `fr:` keys of + the same YAML entry. Never ship a page or entry in one language only. +- **No e-mail addresses anywhere on the site** (group decision, September 2026). The + contact page points to the director and to . Do not add + `mailto:` links, and keep `author.email` in `_config.yml` empty. +- **Do not link into `cnet.fi.uba.ar`.** Unknown paths there silently serve the legacy + home page, so a link can look alive and still be wrong. Pages that still exist there + and may be linked: `netscix23/`, `SnailVis/`, `PIT/…`, `PaD/`. Otherwise use the + project's new home (TiX: , LaNet-vi: + , TMA2018: ) or a + Wayback Machine snapshot. Check with `grep -rn cnet.fi.uba.ar _data _pages _news`. +- **Verify every new external link** with `curl -sIL` and read where it lands: a 200 on + a home page, a sign-in wall or a parked domain is a broken link. +- **Publications**: add entries to `_bibliography/conexdat.bib` with a + `topics = {id1, id2}` field using ids from `_data/publication_topics.yml` (add a new + topic there, in three languages, only when no existing one fits). Two 1990s + instrumentation papers (`onditas96`, `Thermog95`) are deliberately untagged: no topic + fits them, and they only disappear while a topic filter is active. Prefer a bare DOI + (`10.xxxx/…`), `eprint` + `archiveprefix = {arXiv}` for preprints, and check the key is + not already present: the group's own exports contain duplicates. +- Internal links are written without language prefix (`/projects/`); polyglot adds + `/en/` or `/fr/`. Do not hard-code `https://conexdat.github.io/...` in content. +- Commit messages and PR descriptions in American English, imperative subject line. + +## Things that are easy to get wrong + +- **Language switcher.** Polyglot rewrites every `href="/…"` on EN and FR pages into the + current language, which breaks hand-written ES | EN | FR links. The masthead writes them + as `ferh="/en/…"`, which polyglot turns back into `href` untouched. Do not rename the + attribute. The `Build site` workflow greps the output for the expected hrefs. +- **No `//` comments inside inline `