Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
70ddf74
chore: add textrefs/.github as submodule at github-profile/
maehr Jun 7, 2026
5f63ebe
docs: revise get-started prose and document staging deploy flow
maehr Jun 7, 2026
30a12a0
fix(ci): repair URL extraction in link-check workflow
maehr Jun 7, 2026
6dd6e0d
chore(deps): bump astro 6.4.4 and migrate to zod 4
maehr Jun 7, 2026
74bce51
docs(association): sync statutes board size and review tracks with do…
maehr Jun 9, 2026
6b0f0e8
docs(spec): tighten dereferenceable-location guidance to should (#7)
maehr Jun 9, 2026
da48c31
docs(spec): self-contained §13 example with @context (#8)
maehr Jun 9, 2026
56eb064
chore(data): bump submodule with second resolvers on single-resolver …
maehr Jun 9, 2026
e9b09d4
feat(spec)!: replace target_kind with dcterms:conformsTo (#6)
maehr Jun 9, 2026
e54b883
chore(data): bump submodule to registry main (36cae56)
maehr Jun 9, 2026
666dc78
fix(404): mark docs/404.mdx as draft to drop catch-all route conflict
maehr Jun 9, 2026
d3ae0d7
fix(ci): repair link-check workflow + bump deps to zod 4 (#5)
maehr Jun 9, 2026
24b2e36
docs: add ORCID for Luz Christopher Seiberth (#19)
maehr Jun 26, 2026
9c9f2b5
feat(spec)!: seed CanonicalReference UUIDs from the semantic identity…
maehr Jul 5, 2026
82bc899
feat(spec): draft lifecycle with retractable pre-promotion identity (…
maehr Jul 5, 2026
1952650
chore(data): bump submodule to registry main (40af385)
maehr Jul 5, 2026
a765770
feat(spec): require explicit canonical ASCII digit and case forms in …
maehr Jul 5, 2026
37d1481
fix(spec): erratum batch and spec-consistency fixes (#10, #11, #12, #…
maehr Jul 5, 2026
29c15e4
feat(site): flag draft records and exclude them from search indexing …
maehr Jul 5, 2026
59a1c54
chore(deps): astro 6.4.8, dompurify 3.4.11, actions/checkout v7
maehr Jul 5, 2026
3455674
chore(release): v0.1.0 — version bump, changelog, roadmap (#28)
maehr Jul 5, 2026
dd1038d
feat(deps)!: upgrade to Astro 7 / Starlight 0.41, all dependencies to…
maehr Jul 6, 2026
238490e
feat(site)!: minimal static templates for reference pages (#30)
maehr Jul 6, 2026
c4b623a
chore(release): regenerate changelog with Astro 7 and slim ref pages
maehr Jul 6, 2026
3dcff6f
chore(data): bump submodule to registry main (c0a3275, ORCID docs)
maehr Jul 6, 2026
fbe8196
chore(deps): Astro 7.1 + dependency refresh (#39) (#43)
maehr Jul 26, 2026
e68c8f7
fix(spec): resolve normative contradictions before the v0.1.0 tag (#44)
maehr Jul 26, 2026
e0b6ef1
fix(site): add explicit whitespace between inline elements (#53) (#54)
maehr Jul 31, 2026
03cee88
fix(site): list works instead of references on CitationSystem pages (…
maehr Jul 31, 2026
b365cfc
feat(standard)!: collapse record lifecycle to draft → active (ADR-000…
maehr Aug 4, 2026
5c2a6f3
feat(standard)!: preferred citation system and qualified /cite/ alias…
maehr Aug 12, 2026
7a94c0e
feat(standard)!: replace SKOS mapping relations with alternateOf and …
maehr Aug 12, 2026
0e9c824
chore(data): bump registry pin to the ADR-0006 reclassification
maehr Aug 12, 2026
aba818d
feat(compile): map locator variables into a provider's own vocabulary…
maehr Aug 12, 2026
a958928
chore(data): bump registry pin to the resolver review
maehr Aug 12, 2026
d2390c9
chore(deps): refresh all dependencies before v0.1.0 (#73)
maehr Aug 12, 2026
71dd92a
fix: release hardening before v0.1.0 (#46, #47, #49, #50) (#75)
maehr Aug 12, 2026
0df2b27
chore(release): v0.1.0 metadata — CITATION.cff, changelog, checklist …
maehr Aug 12, 2026
fa78eb9
ci: bump actions/setup-node to v7 (#32) (#77)
maehr Aug 12, 2026
37faf37
ci(deps): point Dependabot version updates at staging (#78)
maehr Aug 12, 2026
3f6670e
docs: resolve the consistency audit before v0.1.0 (#79) (#80)
maehr Aug 13, 2026
f5a037f
fix(compile): stop projecting retired mapping assertions onto Work (#…
maehr Aug 24, 2026
a4a3b85
feat(api): add works and systems collection endpoints (#83) (#87)
maehr Aug 24, 2026
8bcfdca
feat(api): resolve a reference by work and locator without its UUID (…
maehr Aug 24, 2026
cd9aae3
feat(standard): name works by abbreviation and translated title (#85)…
maehr Aug 25, 2026
8bc25ce
feat(find): resolve a familiar citation to a canonical reference (#90)
maehr Aug 25, 2026
6c31d8f
chore(data): bump the registry pointer to 455bb27f (#95)
maehr Aug 25, 2026
a5764fb
chore(data): bump the registry pointer to 7d109195 (#96)
maehr Aug 26, 2026
1c827f1
fix: pre-release cleanup — link check, deprecated tombstones, orphan …
maehr Aug 27, 2026
5bdb5e0
docs(decisions): refresh the ADR follow-up checklists before the v0.1…
maehr Aug 27, 2026
5914e26
fix(api): publish the contract and correct the 404 declaration (#113,…
maehr Aug 31, 2026
cf3a416
feat(site): add the /dump/ index and robots.txt (#116, #114) (#119)
maehr Aug 31, 2026
0607ec6
feat(standard): publish the generated JSON Schema at /schemas/v1/ (#1…
maehr Aug 31, 2026
56cab1b
fix: address PR #4 review findings before v0.1.0 (#120) (#121)
maehr Aug 31, 2026
c41a230
chore(deps): update dependencies before v0.1.0 (#102)
maehr Sep 2, 2026
c9605b5
fix(site): suppress the draft banner on the 404 page (#111) (#126)
maehr Sep 2, 2026
819fcb9
docs(association): finalise the founding documents and limit Board me…
maehr Sep 2, 2026
d9239bd
fix(site): let a whole-query label beat a split match in /find/ (#138)
maehr Sep 2, 2026
990fc4f
docs(standard): state the tombstone projection rule correctly (#140)
maehr Sep 2, 2026
257f17e
fix(site): keep redirects and untranslated fallbacks out of the sitem…
maehr Sep 2, 2026
4d1c708
perf(site): compile the registry once per build, not twice (#139)
maehr Sep 2, 2026
2d71119
feat(standard): publish the TextRefs ontology (#127)
maehr Sep 2, 2026
c360c02
fix(standard): publish license_url as dcterms:rights, not dcterms:lic…
maehr Sep 2, 2026
41f2d31
chore(agents): track CLAUDE.md and document the GitHub workflow (#141)
maehr Sep 2, 2026
bdd1d60
docs(blog): announce the founding of the association (#142)
maehr Sep 3, 2026
ba908c7
fix(site): render the resolver-target licence and rights correctly (#…
maehr Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/conformance_failure.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ body:
id: failing-cases
attributes:
label: Failing test cases
description: List the conformance test IDs that fail and what your implementation produces instead.
description: Describe the failing case and what your implementation produces instead. Include conformance test IDs if the conformance suite is available.
validations:
required: true
required: false
- type: textarea
id: analysis
attributes:
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/docs.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: 📚 Documentation issue
description: Something on the site or in the README is missing, wrong, or unclear.
title: 'docs: '
labels: [docs, triage]
labels: [documentation, triage]
body:
- type: input
id: url
Expand Down
2 changes: 1 addition & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
Re-minting changes a record's IRI. The old IRI must continue to resolve as a tombstone. See the [tombstones section in versioning.md](https://textrefs.org/standard/versioning/#tombstones-and-re-minted-records).

- [ ] Old record retained with `status: withdrawn`
- [ ] A new `MappingAssertion` with `relation: exactMatch`, `subject: <old IRI>`, `target: <new IRI>` links the old record to its successor (omit if there is no successor)
- [ ] The old record's `superseded_by` field (`dcterms:isReplacedBy`) links it to its successor's IRI (omit if there is no successor)
- [ ] All other records that reference the old IRI have been audited (re-targeted to the new IRI, or themselves marked `withdrawn`)
- [ ] Commit message uses `feat!:` / `fix!:` or `feat(scope)!:` / `fix(scope)!:` to signal the breaking IRI change

Expand Down
30 changes: 30 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,40 @@
# Version updates target `staging`, not the default branch.
#
# `main` only moves at release time, by squash-merging `staging`. A bump landed
# on `main` alone is therefore reverted by the next release: the squash applies
# staging's tree against a merge base that predates the bump. Everything that
# should survive a release has to reach `main` through `staging`.
#
# Note that `target-branch` governs version updates only — Dependabot security
# updates are always raised against the default branch, so advisory-driven PRs
# will still appear against `main` and still need folding into `staging` by
# hand.
version: 2
updates:
- package-ecosystem: github-actions
directory: /
target-branch: staging
schedule:
interval: weekly
groups:
github-actions:
patterns:
- '*'

- package-ecosystem: npm
directory: /
target-branch: staging
schedule:
interval: weekly
groups:
# Astro, Starlight and their plugins move in lockstep and are upgraded
# together or not at all; a lone bump here usually fails to resolve.
astro:
patterns:
- 'astro'
- '@astrojs/*'
- 'starlight*'
# First match wins, so this picks up everything else in one PR.
npm:
patterns:
- '*'
34 changes: 31 additions & 3 deletions .github/workflows/links.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
if: github.repository == 'textrefs/textrefs.org'
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
submodules: recursive

Expand All @@ -28,8 +28,36 @@ jobs:
- name: Collect external URLs from sources
run: |
mkdir -p lychee
grep -rhoE 'https?://[^"'\''<>) ]+' data/ src/content/docs/ \
| sed -E 's/[.,;:]+$//' \
# A URL may legitimately contain `(` and `)`, because Wikipedia and
# Wikisource put disambiguation titles there. The match therefore
# keeps parentheses and the trailing markup is trimmed afterwards.
#
# The trim runs as one loop, not as a fixed sequence. A URL at the
# end of a markdown link, a bold run, or a sentence carries several
# layers of trailing markup at once — `…/4.0/).`, `…/arks.org/)**`,
# `…/rfc3987))` — so each pass strips punctuation, then one
# unbalanced `)`, until the string stops changing. Doing this in a
# single pass leaves a `)` behind whenever punctuation follows it,
# which is what produced the false 404s in #3.
#
# Resolver templates are dropped: `{placeholder}` literally, and
# `%7B`/`%7D` for the percent-encoded spelling.
#
# Restrict to YAML/MD, and skip node_modules, so lockfiles and
# dependency READMEs inside data/ are not scanned.
grep -rhoE --include='*.yaml' --include='*.yml' --include='*.md' --include='*.mdx' \
--exclude-dir=node_modules \
'https?://[^]["'\''<>[:space:]]+' data/ src/content/docs/ \
| awk '{
do {
changed = 0
if (sub(/[.,;:!?*_`]+$/, "")) changed = 1
n = gsub(/\(/, "&"); m = gsub(/\)/, "&")
if (m > n && sub(/\)$/, "")) changed = 1
} while (changed)
if (length($0) > 0) print
}' \
| grep -viE '[{}]|%7b|%7d' \
| sort -u > lychee/urls.txt
echo "Collected $(wc -l < lychee/urls.txt) unique URLs"

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
submodules: recursive

- uses: actions/setup-node@v6
- uses: actions/setup-node@v7
with:
node-version: 24
cache: npm
Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ jobs:
publish-dump:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
submodules: recursive

- uses: actions/setup-node@v6
- uses: actions/setup-node@v7
with:
node-version: 24
cache: npm
Expand All @@ -34,6 +34,7 @@ jobs:
with:
files: |
dist/dump/*.jsonl
dist/dump/aliases.json
dist/dump/datapackage.json
fail_on_unmatched_files: true
generate_release_notes: true
4 changes: 2 additions & 2 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
if: github.repository == 'textrefs/textrefs.org'
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
submodules: recursive
- name: Verify data/ pin is on registry main
Expand All @@ -25,7 +25,7 @@ jobs:
echo "::error::data/ pointer $(git rev-parse HEAD) is not an ancestor of registry/main"
exit 1
fi
- uses: actions/setup-node@v6
- uses: actions/setup-node@v7
with:
node-version: 24
cache: npm
Expand Down
3 changes: 2 additions & 1 deletion .zenodo.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
},
{
"name": "Seiberth, Luz Christopher",
"affiliation": "TextRefs"
"affiliation": "TextRefs",
"orcid": "0000-0002-5606-0964"
}
],
"keywords": [
Expand Down
27 changes: 21 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ Astro + Starlight site for textrefs.org. See [`README.md`](./README.md) for the
- `npm run build:fast` — site build against a tiny fixture registry, without compiling full data
- `npm run format` — Prettier (with `prettier-plugin-astro`)
- `npm run check` — `astro check`
- `npm run verify:fast` — fast local verification: format:check + fixture-backed check + fixture-backed build
- `npm run verify` — format:check + check + build (the CI gate)
- `npm run verify:fast` — fast local verification: format:check + fixture-backed check + tests + fixture-backed build
- `npm run verify` — format:check + check + tests + build (the CI gate)
- `npm run check:links` — build the site, then check every link with lychee (the `linkcheck` CI gate)
- `npm run validate:data` / `compile:data` / `build:data` — registry-data gates; see [`data/AGENTS.md`](./data/AGENTS.md)

Use `npm run verify:fast` by default for local validation and agent work. Only use the full `npm run verify` and/or `npm run validate:data` when changes affect registry data, release artifacts, production build behavior, or CI parity.
Expand All @@ -19,17 +20,30 @@ Use Node 24, matching CI.

Husky installs on `npm install`: Prettier runs on staged files, `commitlint` enforces Conventional Commits.

## GitHub workflow

- Sign every commit. The `main` ruleset sets `required_signatures`, so an unsigned commit blocks the merge.
- Branch from `staging` for content, documentation, and copy.
- Branch from `main` for CI, build tooling, and release work.
- Open every pull request from the `maehr` fork against the branch you started from.
- Merge with a squash merge only. `staging` reaches `main` as one conventional commit, so `git-cliff` stays clean.

Do not use the GitHub Update-branch button, and do not enable `--allow-update-branch`. Both produce an unsigned commit. Rebase on the target branch locally instead.

See [`CONTRIBUTING.md`](./CONTRIBUTING.md) for the full branching model and the release checklist.

## Layout

- `src/content/docs/{association,standard,api,community,get-started}/` — site sections (autogenerated sidebar)
- `src/content/docs/de/` — German mirror (see Localization)
- `src/pages/id/{work,system,ref,mapping}/` — canonical record pages (`/id/.../` HTML and `.json` JSON-LD siblings)
- `src/pages/reg/` — registry browser (index + paginated reference lists); does not host individual records
- `src/pages/cite/` — short-alias redirects (`/cite/{work}/{locator}` → canonical `/id/` URL)
- `src/pages/reg/` — registry browser (index + paginated reference lists), the registry-wide JSON-LD collections, and the per-work locator index (`/reg/work/{key}/aliases.json`); does not host individual records
- `src/pages/cite/` — short-alias redirects (`/cite/{work}/{system}/{locator}` always; bare `/cite/{work}/{locator}` for a work's preferred citation system, and retargetable if that preference changes) → canonical `/id/` URL
- `src/styles/brand.css` — brand tokens
- `public/{logo.svg,favicon.svg,fonts/}` — brand assets
- `data/` — git submodule pointing at [`textrefs/registry`](https://github.com/textrefs/registry); hand-authored YAML lives there. See [`data/AGENTS.md`](./data/AGENTS.md) for authoring rules and [`CONTRIBUTING.md`](./CONTRIBUTING.md) for the submodule workflow.
- `standard/`, `api/` — scaffolds reserved for future repo splits
- `standard/` — draft standard workspace: canonical Zod schemas (`standard/schema/`)
- `api/` — the OpenAPI contract (`api/openapi.yaml`)

## Conventions

Expand All @@ -47,11 +61,12 @@ Husky installs on `npm install`: Prettier runs on staged files, `commitlint` enf

## Mirrored community files

`CODE_OF_CONDUCT.md`, `CONTRIBUTING.md`, and `SECURITY.md` live at the repo root (for GitHub's Community profile) and are mirrored at `src/content/docs/community/` with Starlight frontmatter. Edit both in the same commit.
`CODE_OF_CONDUCT.md`, `CONTRIBUTING.md`, and `SECURITY.md` live at the repo root for GitHub's Community profile; `ROADMAP.md` lives there as the canonical roadmap text. All four are mirrored at `src/content/docs/community/` with Starlight frontmatter. Edit both halves of a pair in the same commit.

## Pointers

- Licences (code AGPL-3.0, docs CC BY-SA 4.0, data CC0) — [`LICENSE.md`](./LICENSE.md).
- Cross-PR decisions — [`decisions/`](./decisions/) (MADR format; template at `ADR-TEMPLATE.md`).
- Public roadmap — [`ROADMAP.md`](./ROADMAP.md).
- Issue / PR templates — `.github/`.
- Contribution workflow, branching model, release checklist — [`CONTRIBUTING.md`](./CONTRIBUTING.md).
49 changes: 48 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,51 @@

All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

Changelog tracking begins at `v0.1.0`. Pre-release history lives in the git log.
## [0.1.0] - 2026-08-12

### Added

- Replace target_kind with dcterms:conformsTo (#6)
- Seed CanonicalReference UUIDs from the semantic identity tuple (ADR-0002) (#21)
- Draft lifecycle with retractable pre-promotion identity (ADR-0003) (#23)
- Require explicit canonical ASCII digit and case forms in profiles (#24)
- Flag draft records and exclude them from search indexing (#26)
- Upgrade to Astro 7 / Starlight 0.41, all dependencies to latest (#29)
- Minimal static templates for reference pages (#30)
- Collapse record lifecycle to draft → active (ADR-0004) (#62)
- Preferred citation system and qualified /cite/ aliases (ADR-0005) (#63)
- Replace SKOS mapping relations with alternateOf and isReferencedBy (ADR-0006) (#67)
- Map locator variables into a provider's own vocabulary (#71) (#72)

### Documentation

- Revise get-started prose and document staging deploy flow
- Sync statutes board size and review tracks with dossier
- Tighten dereferenceable-location guidance to should (#7)
- Self-contained §13 example with @context (#8)
- Add ORCID for Luz Christopher Seiberth (#19)

### Fixed

- Repair URL extraction in link-check workflow
- Mark docs/404.mdx as draft to drop catch-all route conflict
- Repair link-check workflow + bump deps to zod 4 (#5)
- Erratum batch and spec-consistency fixes (#10, #11, #12, #14) (#25)
- Resolve normative contradictions before the v0.1.0 tag (#44)
- Add explicit whitespace between inline elements (#53) (#54)
- List works instead of references on CitationSystem pages (#55) (#56)
- Release hardening before v0.1.0 (#46, #47, #49, #50) (#75)

### Misc

- Add textrefs/.github as submodule at github-profile/
- Bump astro 6.4.4 and migrate to zod 4
- Bump submodule with second resolvers on single-resolver works
- Bump submodule to registry main (36cae56)
- Bump submodule to registry main (40af385)
- Astro 6.4.8, dompurify 3.4.11, actions/checkout v7
- Bump submodule to registry main (c0a3275, ORCID docs)
- Astro 7.1 + dependency refresh (#39) (#43)
- Bump registry pin to the ADR-0006 reclassification
- Bump registry pin to the resolver review
- Refresh all dependencies before v0.1.0 (#73)
4 changes: 3 additions & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
cff-version: 1.2.0
message: 'If you cite TextRefs, please cite it as below.'
title: TextRefs
version: 0.1.0
date-released: '2026-08-12'
abstract: An open, persistent, machine-readable registry for canonical text references.
type: software
authors:
Expand All @@ -13,8 +15,8 @@ authors:
- family-names: Seiberth
given-names: Luz Christopher
email: luz@seiberth.de
orcid: 'https://orcid.org/0000-0002-5606-0964'
affiliation: TextRefs
# ORCID: TBD
repository-code: 'https://github.com/textrefs/textrefs.org'
url: 'https://textrefs.org'
license:
Expand Down
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@AGENTS.md
Loading
Loading