oaktree-sapling 0.0.1
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.
- package/LICENSE +28 -0
- package/README.md +66 -0
- package/ci/run.sh +64 -0
- package/dist/cli.cjs +1230 -0
- package/package.json +50 -0
- package/paper-base.yml +29 -0
- package/plugins/gallery.mjs +224 -0
- package/templates/instance/brand/brand.yml +15 -0
- package/templates/instance/brand/logo.svg +4 -0
- package/templates/instance/editions/edition.yml +14 -0
- package/templates/instance/journal.yml +58 -0
- package/templates/instance/registry/papers.yml +20 -0
- package/templates/paper/.github/actions/engine/action.yml +59 -0
- package/templates/paper/.github/actions/engine/pins.yml +16 -0
- package/templates/paper/.github/workflows/check-post.yml +79 -0
- package/templates/paper/.github/workflows/check.yml +72 -0
- package/templates/paper/.github/workflows/ci.yml +64 -0
- package/templates/paper/.github/workflows/prepare.yml +34 -0
- package/templates/paper/.github/workflows/preview-deploy.yml +52 -0
- package/templates/paper/.github/workflows/publish.yml +33 -0
- package/templates/paper/.github/workflows/version-bump.yml +29 -0
- package/templates/paper/CODEOWNERS +9 -0
- package/templates/paper/bib.bib +6 -0
- package/templates/paper/gitignore +8 -0
- package/templates/paper/index.md +12 -0
- package/templates/paper/myst.yml +37 -0
- package/templates/site/.github/workflows/site.yml +73 -0
- package/templates/site/gitignore +5 -0
- package/templates/site/myst.yml +32 -0
- package/templates/site/package.json +9 -0
- package/templates/site/pages/index.md +25 -0
- package/templates/typst/LICENSE +21 -0
- package/templates/typst/frontmatter.typ +244 -0
- package/templates/typst/lapreprint.typ +310 -0
- package/templates/typst/template.typ +112 -0
- package/templates/typst/template.yml +82 -0
- package/typst.version +1 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
name: Paper CI
|
|
2
|
+
|
|
3
|
+
# Stage 1 of the always-split preview (design §6a, dec. 13). Builds on every PR + push
|
|
4
|
+
# with NO secrets and a read-only token, so fork PRs get full validation + a build. The
|
|
5
|
+
# preview DEPLOY happens in preview-deploy.yml (workflow_run, base context) because forks
|
|
6
|
+
# never receive secrets. Pages deploy (push to main) rides here behind a job-scoped token.
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
pull_request:
|
|
10
|
+
push:
|
|
11
|
+
branches: [main]
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read # the untrusted build job never holds pages/id-token ([R13])
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: ${{ github.event_name == 'pull_request' && format('ci-{0}', github.head_ref) || 'ci-main' }}
|
|
19
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
build: # NO secrets, read-only token — safe for fork PRs
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
|
+
- uses: ./.github/actions/engine
|
|
27
|
+
with:
|
|
28
|
+
args: build
|
|
29
|
+
# upload-artifact follows symlinks and stores their TARGET content as a regular file.
|
|
30
|
+
# Author content is untrusted, so a planted symlink (e.g. to .git/config or any
|
|
31
|
+
# runner-readable file) would ride into the artifact and be served on the public preview.
|
|
32
|
+
# Strip symlinks so the artifact carries only files the build actually produced.
|
|
33
|
+
- name: Drop symlinks from the build output
|
|
34
|
+
run: find _build/html -type l -delete
|
|
35
|
+
- name: Stash PR number # workflow_run.pull_requests is EMPTY for forks (§6a)
|
|
36
|
+
if: ${{ github.event_name == 'pull_request' }}
|
|
37
|
+
run: echo "${{ github.event.pull_request.number }}" > _build/html/.pr-number
|
|
38
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
39
|
+
with:
|
|
40
|
+
name: paper-build
|
|
41
|
+
path: _build/html
|
|
42
|
+
if-no-files-found: error
|
|
43
|
+
include-hidden-files: true
|
|
44
|
+
|
|
45
|
+
deploy-pages:
|
|
46
|
+
if: ${{ github.event_name != 'pull_request' }}
|
|
47
|
+
needs: build
|
|
48
|
+
permissions: # deploy perms live HERE, not on the untrusted build job ([R13])
|
|
49
|
+
pages: write
|
|
50
|
+
id-token: write
|
|
51
|
+
environment:
|
|
52
|
+
name: github-pages
|
|
53
|
+
url: ${{ steps.d.outputs.page_url }}
|
|
54
|
+
runs-on: ubuntu-latest
|
|
55
|
+
steps:
|
|
56
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
57
|
+
with:
|
|
58
|
+
name: paper-build
|
|
59
|
+
path: site
|
|
60
|
+
- uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
|
|
61
|
+
with:
|
|
62
|
+
path: site
|
|
63
|
+
- id: d
|
|
64
|
+
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: Prepare Zenodo deposit
|
|
2
|
+
|
|
3
|
+
# Editor dispatches DOI reservation (design §1d). Reserves/reuses a draft and opens the
|
|
4
|
+
# one-file myst.yml PR writing project.doi/github/date ([R22]) — the CLI opens that PR
|
|
5
|
+
# itself via GH_TOKEN (no peter-evans action; the write is a YAML round-trip, [R3]).
|
|
6
|
+
# `--sandbox` is an explicit human choice here ([R4]); a prod prepare may replace a
|
|
7
|
+
# committed sandbox DOI ([R29]).
|
|
8
|
+
#
|
|
9
|
+
# No `version` input: prepare is version-agnostic — it only reserves the concept DOI. The
|
|
10
|
+
# version is the tag, and it enters the deposit at publish time (publish.yml → `oak release`).
|
|
11
|
+
|
|
12
|
+
on:
|
|
13
|
+
workflow_dispatch:
|
|
14
|
+
inputs:
|
|
15
|
+
sandbox:
|
|
16
|
+
description: "Use the Zenodo sandbox (rehearsal) instead of production"
|
|
17
|
+
type: boolean
|
|
18
|
+
default: true
|
|
19
|
+
|
|
20
|
+
permissions:
|
|
21
|
+
contents: write # commit the DOI PR branch
|
|
22
|
+
pull-requests: write # open the DOI PR
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
prepare:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
29
|
+
- uses: ./.github/actions/engine
|
|
30
|
+
with:
|
|
31
|
+
args: deposit prepare ${{ inputs.sandbox && '--sandbox' || '' }}
|
|
32
|
+
env:
|
|
33
|
+
GH_TOKEN: ${{ github.token }}
|
|
34
|
+
ZENODO_TOKEN: ${{ inputs.sandbox && secrets.ZENODO_TOKEN_SANDBOX || secrets.ZENODO_TOKEN }}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: Preview deploy
|
|
2
|
+
|
|
3
|
+
# Stage 2 of the always-split preview (design §6a, dec. 13, [R16]). Runs in BASE-repo
|
|
4
|
+
# context after Paper CI completes, so it holds the preview secret that fork PRs never
|
|
5
|
+
# get. It ONLY downloads Stage 1's inert artifact and deploys it — it never rebuilds fork
|
|
6
|
+
# content (that would reopen the injection hole through the shim's back door). The engine
|
|
7
|
+
# ref + action code come from the BASE default branch (guaranteed by workflow_run).
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
workflow_run:
|
|
11
|
+
workflows: ["Paper CI"]
|
|
12
|
+
types: [completed]
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
actions: read # download the cross-run artifact
|
|
17
|
+
pull-requests: write # sticky preview comment + new-version reminder ([R16])
|
|
18
|
+
|
|
19
|
+
concurrency:
|
|
20
|
+
# head_branch alone collides across forks (two forks PRing from `main` would cancel each
|
|
21
|
+
# other's previews) — key on head repo too ([R15]).
|
|
22
|
+
group: preview-${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}
|
|
23
|
+
cancel-in-progress: true
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
deploy:
|
|
27
|
+
if: >-
|
|
28
|
+
${{ github.event.workflow_run.event == 'pull_request' &&
|
|
29
|
+
github.event.workflow_run.conclusion == 'success' }}
|
|
30
|
+
runs-on: ubuntu-latest
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 — BASE default branch ⇒ engine ref AND action code from base
|
|
33
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
34
|
+
with:
|
|
35
|
+
name: paper-build
|
|
36
|
+
path: site
|
|
37
|
+
run-id: ${{ github.event.workflow_run.id }}
|
|
38
|
+
github-token: ${{ github.token }}
|
|
39
|
+
# deploys the inert artifact (deletes .pr-number first — [R26]); if no Cloudflare
|
|
40
|
+
# secrets are present, `oak deploy-preview` degrades to an artifact-link comment
|
|
41
|
+
# instead of failing ([R6]). It also posts the new-version reminder here, where it
|
|
42
|
+
# has pull-requests: write (fork Stage-1 runs never do) — [R16].
|
|
43
|
+
- uses: ./.github/actions/engine
|
|
44
|
+
with:
|
|
45
|
+
args: deploy-preview site
|
|
46
|
+
env:
|
|
47
|
+
GH_TOKEN: ${{ github.token }}
|
|
48
|
+
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
|
49
|
+
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
|
50
|
+
# The Paper CI run that holds the paper-build artifact — lets the CLI deep-link the
|
|
51
|
+
# artifact-degrade comment straight to that run (not the whole Actions tab).
|
|
52
|
+
PAPER_BUILD_RUN_ID: ${{ github.event.workflow_run.id }}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Publish Zenodo deposit
|
|
2
|
+
|
|
3
|
+
# Tag push populates the Zenodo draft (design §1e). `oak release` builds, deposits
|
|
4
|
+
# (env DERIVED from the committed project.doi prefix — kills the awk sniff, [R4]/[R8]),
|
|
5
|
+
# attaches the debug bundle to the tag's GitHub Release ([R24]), and posts the commit
|
|
6
|
+
# comment / failure issue via gh — all behind the version knob. The required-reviewer
|
|
7
|
+
# environment is the human gate before any token-bearing run; the actual public DOI is
|
|
8
|
+
# still minted by a human clicking Publish on Zenodo (design §8). Both tokens are passed;
|
|
9
|
+
# the CLI selects by DOI prefix.
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
push:
|
|
13
|
+
tags: ["v*"]
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: write # attach the Release bundle + commit comment
|
|
17
|
+
issues: write # open the editor-action issue on failure
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
publish:
|
|
21
|
+
environment: zenodo-publish # required-reviewer gate — provisioned by bootstrap ([R10])
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
25
|
+
with:
|
|
26
|
+
fetch-depth: 0 # git archive + PR discovery need history
|
|
27
|
+
- uses: ./.github/actions/engine
|
|
28
|
+
with:
|
|
29
|
+
args: release --tag ${{ github.ref_name }}
|
|
30
|
+
env:
|
|
31
|
+
GH_TOKEN: ${{ github.token }}
|
|
32
|
+
ZENODO_TOKEN: ${{ secrets.ZENODO_TOKEN }}
|
|
33
|
+
ZENODO_TOKEN_SANDBOX: ${{ secrets.ZENODO_TOKEN_SANDBOX }}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Engine version bump
|
|
2
|
+
|
|
3
|
+
# Scheduled logic-ref bump (design §6b-left, dec. 17). Floats
|
|
4
|
+
# project.options.oaktree-sapling.version to the latest engine release and opens a one-line
|
|
5
|
+
# PR. The bump is DATA (myst.yml, not CODEOWNERS-gated), so an editor merges it after the
|
|
6
|
+
# preview build shows the result; it touches no secret. Runs `oak upgrade --version-only`,
|
|
7
|
+
# which reads the engine repo from pins.yml, resolves the latest release, writes myst.yml via
|
|
8
|
+
# a YAML round-trip (never sed), and opens the PR. The frequent logic-ref cadence's automated
|
|
9
|
+
# home; the rare frozen-file resync is the manual `oak upgrade --files-only` path.
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
schedule:
|
|
13
|
+
- cron: "17 4 * * 1" # weekly, Monday 04:17 UTC
|
|
14
|
+
workflow_dispatch:
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: write # commit the bump branch
|
|
18
|
+
pull-requests: write # open the bump PR
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
bump:
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
25
|
+
- uses: ./.github/actions/engine
|
|
26
|
+
with:
|
|
27
|
+
args: upgrade --paper . --version-only --yes
|
|
28
|
+
env:
|
|
29
|
+
GH_TOKEN: ${{ github.token }}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# The frozen shim is the trust boundary (design §6a): action.yml runs engine code at a
|
|
2
|
+
# ref, and pins.yml names the engine + instance repos (code-adjacent). Gate everything
|
|
3
|
+
# under .github/ — including pins.yml and CODEOWNERS itself — behind the editors, so an
|
|
4
|
+
# author PR can float the engine *ref* (data) but cannot redirect a token-bearing run to
|
|
5
|
+
# unreviewed code. copier replaces the owner below at bootstrap. NB a personal-account repo
|
|
6
|
+
# (the interim/lab tier) has no org team, so it names the user directly ([R56]); an org
|
|
7
|
+
# tenant uses a team like @your-org/editors.
|
|
8
|
+
/.github/ @pollomarzo
|
|
9
|
+
/CODEOWNERS @pollomarzo
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Engine-generated build config ([R71]). `oak build` composes your myst.yml with the
|
|
2
|
+
# engine/edition/brand chain and writes the result here; your myst.yml is never modified.
|
|
3
|
+
# Not auto-deleted: myst's HTML build process.exit(0)s on success, so no cleanup hook can
|
|
4
|
+
# reliably run. Safe to delete by hand at any time.
|
|
5
|
+
myst.oak.yml
|
|
6
|
+
|
|
7
|
+
# MyST build outputs
|
|
8
|
+
_build/
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# A Starter Paper
|
|
2
|
+
|
|
3
|
+
+++ {"part": "abstract"}
|
|
4
|
+
|
|
5
|
+
Replace this with your abstract. The `abstract` part is lifted into the site, the merged
|
|
6
|
+
PDF cover page, and the Zenodo deposit description, so keep it self-contained.
|
|
7
|
+
|
|
8
|
+
+++
|
|
9
|
+
|
|
10
|
+
## Introduction
|
|
11
|
+
|
|
12
|
+
Your paper content goes here. Cite your bibliography like this [@example2026].
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
|
|
3
|
+
# Starter paper — stamped by `oak bootstrap`. NEW-MODEL committed paper: NO `extends:`
|
|
4
|
+
# (compose injects the engine/edition/brand chain at build time), and the single engine
|
|
5
|
+
# coordinate rides myst's untyped `options` passthrough. `oak bootstrap` / `oak upgrade`
|
|
6
|
+
# fill `version`/`edition` below.
|
|
7
|
+
#
|
|
8
|
+
# The `authors:`/`keywords:` templates below are COMMENTED OUT: uncomment and fill them with
|
|
9
|
+
# your real metadata. They show exactly the fields the journal's editorial checks expect
|
|
10
|
+
# (authors + ORCID + CRediT roles, keywords, and an `abstract` part in index.md), so you don't
|
|
11
|
+
# have to guess — but they stay inert until you fill them, so nothing fake ships by accident.
|
|
12
|
+
project:
|
|
13
|
+
# Set a FRESH, UNIQUE id that matches the journal's `id_pattern`. Until you do, the build's
|
|
14
|
+
# pre-flight rejects this placeholder — that safeguard (not a bug) is why a fresh repo is red.
|
|
15
|
+
id: CHANGE-ME-template-placeholder
|
|
16
|
+
title: CHANGE-ME — your paper title
|
|
17
|
+
# authors:
|
|
18
|
+
# - name: Ada Lovelace
|
|
19
|
+
# orcid: 0000-0000-0000-0000 # the journal checks for a valid ORCID
|
|
20
|
+
# affiliations:
|
|
21
|
+
# - Your Institution
|
|
22
|
+
# email: you@example.org
|
|
23
|
+
# corresponding: true # at least one corresponding author
|
|
24
|
+
# roles: # CRediT taxonomy terms
|
|
25
|
+
# - conceptualization
|
|
26
|
+
# - writing - original draft
|
|
27
|
+
# keywords:
|
|
28
|
+
# - keyword one
|
|
29
|
+
# - keyword two
|
|
30
|
+
bibliography:
|
|
31
|
+
- bib.bib
|
|
32
|
+
options:
|
|
33
|
+
# The ONE engine knob (design §6). `oak bootstrap` / `oak upgrade` write these; only the
|
|
34
|
+
# `version` ref floats (a released engine tag — never a branch tip; CI runs releases).
|
|
35
|
+
oaktree-sapling:
|
|
36
|
+
version: CHANGE-ME-engine-version
|
|
37
|
+
edition: CHANGE-ME-edition
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
name: Journal site
|
|
2
|
+
|
|
3
|
+
# Builds + deploys the journal site to GitHub Pages. Plain MyST — no engine, no shim, no
|
|
4
|
+
# secrets ([S1]). The editorial PR that adds a registry entry lands in THIS repo, so it is
|
|
5
|
+
# also the deploy trigger: publish → visible, one act, one repo ([S8]).
|
|
6
|
+
#
|
|
7
|
+
# Actions are pinned by full commit SHA at a close-to-latest major ([R75]) — the same SHAs
|
|
8
|
+
# the frozen paper shim uses.
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
push:
|
|
12
|
+
branches: [main]
|
|
13
|
+
workflow_dispatch:
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
pages: write
|
|
18
|
+
id-token: write
|
|
19
|
+
|
|
20
|
+
concurrency:
|
|
21
|
+
group: pages
|
|
22
|
+
cancel-in-progress: false
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
build-deploy:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
environment:
|
|
28
|
+
name: github-pages
|
|
29
|
+
url: ${{ steps.d.outputs.page_url }}
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
32
|
+
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
33
|
+
with:
|
|
34
|
+
node-version: '22'
|
|
35
|
+
# Resolves where Pages actually serves this repo. `base_path` is `/<repo>` for a project
|
|
36
|
+
# site and EMPTY for a user/org site or a custom domain — which is exactly MyST's
|
|
37
|
+
# BASE_URL contract. Without it MyST emits root-absolute asset URLs (`/build/…`) and
|
|
38
|
+
# every image, stylesheet and script 404s on the subpath this tier deploys to. Asking
|
|
39
|
+
# GitHub rather than hardcoding `/<repo>` is what keeps the vanity-URL routes working.
|
|
40
|
+
- id: pages
|
|
41
|
+
uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0
|
|
42
|
+
# Installs BOTH MyST and the gallery plugin's own dependency (js-yaml), which are
|
|
43
|
+
# pinned together in package.json — the one place this site's versions live.
|
|
44
|
+
#
|
|
45
|
+
# The install is not optional: MyST downloads a remote plugin into `_build/cache/`
|
|
46
|
+
# and imports it FROM THERE, so the plugin's bare imports resolve upward from this
|
|
47
|
+
# repo's node_modules. A package fetched by `npx` lands outside that resolution path.
|
|
48
|
+
- run: npm install --no-audit --no-fund
|
|
49
|
+
# `--strict` is LOAD-BEARING, not hygiene. Without it `myst build` logs errors and
|
|
50
|
+
# exits 0 (`cli/options.ts:98-102`), and a remote plugin that fails to load degrades
|
|
51
|
+
# QUIETLY: the page would deploy with `paper-cards` as an unknown directive — no
|
|
52
|
+
# gallery at all — over a perfectly good previous deploy. Only `--strict` catches that.
|
|
53
|
+
# `--strict` catches errors raised while BUILDING a page (a bad DOI, a missing image).
|
|
54
|
+
# It does NOT catch a plugin that never loaded: myst logs "Unknown plugin" and
|
|
55
|
+
# "unknown directive: paper-cards", then exits 0 — and the gallery-less page deploys
|
|
56
|
+
# over a perfectly good one. Verified live, not assumed ([R80]). So we also require a
|
|
57
|
+
# POSITIVE signal: myst prints the plugin's own name when it loads, and that name is
|
|
58
|
+
# ours, not a myst log format we don't control.
|
|
59
|
+
- name: Build (and prove the gallery plugin loaded)
|
|
60
|
+
env:
|
|
61
|
+
BASE_URL: ${{ steps.pages.outputs.base_path }}
|
|
62
|
+
run: |
|
|
63
|
+
set -o pipefail
|
|
64
|
+
npx myst build --html --strict 2>&1 | tee /tmp/myst-build.log
|
|
65
|
+
if ! grep -q "Paper Gallery.*loaded" /tmp/myst-build.log; then
|
|
66
|
+
echo "::error::the gallery plugin did not load — check the pinned plugin URL in myst.yml (a bad tag 404s silently)"
|
|
67
|
+
exit 1
|
|
68
|
+
fi
|
|
69
|
+
- uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
|
|
70
|
+
with:
|
|
71
|
+
path: _build/html
|
|
72
|
+
- id: d
|
|
73
|
+
uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
|
|
3
|
+
# The JOURNAL SITE — the page a reader lands on ([S1]/[S8]). It is a plain MyST project
|
|
4
|
+
# living in this instance-config repo: `myst build --html`, no engine, no `oak`. This file
|
|
5
|
+
# and `plugins/gallery.mjs` are the only bytes the engine owns here; everything else in the
|
|
6
|
+
# site scaffold is yours to rewrite. `oak upgrade` does not touch it.
|
|
7
|
+
#
|
|
8
|
+
# THREE PINS live in this repo, all stamped once at bootstrap and all bumped by hand:
|
|
9
|
+
# 1. the gallery plugin URL below (the engine tag),
|
|
10
|
+
# 2. `site.template` below (the theme release this engine version pins),
|
|
11
|
+
# 3. `mystmd` in package.json — beside `js-yaml`, which the gallery plugin imports.
|
|
12
|
+
# Both live there so this site has ONE dependency list; the workflow just installs it.
|
|
13
|
+
|
|
14
|
+
extends:
|
|
15
|
+
# Your journal's brand, right here in this repo. A LOCAL path: no network, no cache
|
|
16
|
+
# staleness, and a single-entry chain has no siblings to race ([R72]).
|
|
17
|
+
- ./brand/brand.yml
|
|
18
|
+
|
|
19
|
+
project:
|
|
20
|
+
title: CHANGE-ME Journal
|
|
21
|
+
plugins:
|
|
22
|
+
# The `paper-cards` directive, pinned to the engine tag this repo was bootstrapped with.
|
|
23
|
+
# Bump the tag to take engine updates. It must be remote because it is CODE — a `.mjs`
|
|
24
|
+
# body cannot be stamped into YAML, and vendoring a copy is exactly the copy-rot the
|
|
25
|
+
# engine exists to kill.
|
|
26
|
+
- STAMPED-AT-BOOTSTRAP
|
|
27
|
+
toc:
|
|
28
|
+
- file: pages/index.md
|
|
29
|
+
|
|
30
|
+
site:
|
|
31
|
+
# The myst-theme fork release this engine version pins (design §7).
|
|
32
|
+
template: STAMPED-AT-BOOTSTRAP
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "journal-site",
|
|
3
|
+
"private": true,
|
|
4
|
+
"description": "The journal site's build toolchain and plugin dependencies. MyST is pinned HERE, not in the workflow, so this file is the one place site versions live.",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"js-yaml": "^4.1.0",
|
|
7
|
+
"mystmd": "{{myst_version}}"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# {{journal_name}}
|
|
2
|
+
|
|
3
|
+
Welcome. Rewrite this paragraph: say what the journal publishes, who it is for, and how to
|
|
4
|
+
submit. This page is yours — the engine stamps it once and never touches it again.
|
|
5
|
+
|
|
6
|
+
## Papers
|
|
7
|
+
|
|
8
|
+
:::{paper-cards}
|
|
9
|
+
:::
|
|
10
|
+
|
|
11
|
+
<!--
|
|
12
|
+
The `paper-cards` directive above lists EVERY paper in `registry/papers.yml`, in file order.
|
|
13
|
+
That is the right shape for a journal with one edition.
|
|
14
|
+
|
|
15
|
+
When you grow a second edition, split this into per-edition pages: add
|
|
16
|
+
`pages/editions/<edition>.md` with its own title and blurb, filter it with
|
|
17
|
+
|
|
18
|
+
:::{paper-cards}
|
|
19
|
+
:edition: <edition>
|
|
20
|
+
:::
|
|
21
|
+
|
|
22
|
+
and add the file to `toc:` in myst.yml. The edition's display title and blurb live in that
|
|
23
|
+
page, deliberately: `editions/<edition>.yml` is a MyST config layer, so a non-MyST key there
|
|
24
|
+
is silently ignored and misattributed to a paper's generated config ([R79]).
|
|
25
|
+
-->
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Rowan Cockett
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|