Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
7fd9e31
automated: docs preview for patch 26.07.02
github-actions[bot] Jul 9, 2026
dfc63af
automated: docs preview for library 2.13.5
github-actions[bot] Jul 10, 2026
7e10dc6
Optimize automated release notes previews
cachafla Jul 14, 2026
57b412a
Test optimized library preview path
cachafla Jul 14, 2026
bfdce81
Resolve generated API link in targeted renders
cachafla Jul 14, 2026
84534cc
Remove temporary release preview test ref
cachafla Jul 14, 2026
68562fd
Preserve staging homepage in targeted previews
cachafla Jul 14, 2026
d844d93
Remove temporary homepage fix test ref
cachafla Jul 14, 2026
48fd324
Remove Claude workflows
cachafla Jul 14, 2026
124531f
Merge pull request #1407 from validmind/codex/optimize-docs-preview-v…
cachafla Jul 14, 2026
47976fd
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 14, 2026
40f1827
Merge pull request #1408 from validmind/update-staging-29310365249
github-actions[bot] Jul 14, 2026
8eeab55
Promote prebuilt docs artifacts to production
cachafla Jul 14, 2026
1af20d1
Merge pull request #1409 from validmind/codex/promote-staging-docs-ar…
cachafla Jul 14, 2026
69da6f9
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 14, 2026
85dada4
Merge pull request #1410 from validmind/update-staging-29312165654
github-actions[bot] Jul 14, 2026
8020d7d
Fetch branch history for production artifact merge
cachafla Jul 14, 2026
438d1ba
Add full documentation merge gate
cachafla Jul 14, 2026
59fa211
Merge pull request #1412 from validmind/codex/add-full-docs-merge-gate
cachafla Jul 14, 2026
0788838
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 14, 2026
6e16819
Merge pull request #1413 from validmind/update-staging-29344059353
github-actions[bot] Jul 14, 2026
da56ec4
Merge remote-tracking branch 'origin/main' into codex/fix-production-…
cachafla Jul 14, 2026
cee8c7b
Merge pull request #1411 from validmind/codex/fix-production-artifact…
cachafla Jul 14, 2026
79d3b52
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 14, 2026
431d30f
Merge pull request #1414 from validmind/update-staging-29351227512
github-actions[bot] Jul 14, 2026
0010a27
Use targeted renders for docs PR previews
cachafla Jul 14, 2026
d9b47cb
Isolate full validation label concurrency
cachafla Jul 14, 2026
a5560f7
Avoid full-history checkout for preview scope
cachafla Jul 14, 2026
5dec66e
Gate production deploys on validated artifacts
cachafla Jul 14, 2026
c1dcb6f
Bridge targeted validation into merge queue
cachafla Jul 14, 2026
16ed68d
Merge pull request #1415 from validmind/codex/fast-docs-pr-validation
cachafla Jul 14, 2026
9818b90
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 14, 2026
cb98b19
Merge pull request #1416 from validmind/update-staging-29354664729
github-actions[bot] Jul 14, 2026
0a5e8c4
Document docs CI and deployment invariants
cachafla Jul 14, 2026
800e7ac
Merge pull request #1417 from validmind/codex/document-ci-guidance
cachafla Jul 14, 2026
55cfde2
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 14, 2026
47cb5e8
Merge pull request #1418 from validmind/update-staging-29358242042
github-actions[bot] Jul 14, 2026
665e740
Merge branch 'main' of github.com:validmind/documentation into automa…
cachafla Jul 14, 2026
5ee968e
chore: use release-notes main for v2.13.5 preview
cachafla Jul 14, 2026
18b53bf
Merge pull request #1401 from validmind/automated/preview-library-v2.…
cachafla Jul 14, 2026
50ca1f4
Merge branch 'main' into automated/preview-patch-26.07.02
cachafla Jul 14, 2026
312262d
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 14, 2026
a6c7be3
Merge pull request #1419 from validmind/update-staging-29373437704
github-actions[bot] Jul 14, 2026
412b957
Merge branch 'main' into automated/preview-patch-26.07.02
cachafla Jul 14, 2026
d63968b
Merge pull request #1396 from validmind/automated/preview-patch-26.07.02
cachafla Jul 15, 2026
e85e66d
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 15, 2026
bb19f0f
Merge pull request #1420 from validmind/update-staging-29379235790
github-actions[bot] Jul 15, 2026
7464866
ci: add reusable release notes preview workflow
cachafla Jul 15, 2026
1e4ef61
fix: remove stale release notes preview ref
cachafla Jul 15, 2026
8728011
Merge pull request #1421 from validmind/codex/reusable-release-preview
cachafla Jul 15, 2026
4eceedf
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 15, 2026
d3d92b6
Merge pull request #1422 from validmind/update-staging-29382348130
github-actions[bot] Jul 15, 2026
e60aa79
ci: deploy staging for published release notes
cachafla Jul 15, 2026
a9b37e1
ci: preserve main-to-staging publication chain
cachafla Jul 15, 2026
764d5b3
Merge pull request #1423 from validmind/codex/release-notes-staging-d…
cachafla Jul 15, 2026
949a505
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 15, 2026
3ce5a2b
Merge pull request #1424 from validmind/update-staging-29390189885
github-actions[bot] Jul 15, 2026
9b9f95a
Add risk tiering user guide
juanmleng Jul 22, 2026
14a95d9
chore: refresh chatbot product map
github-actions[bot] Jul 22, 2026
e1afebe
Render release-note planning previews
cachafla Jul 23, 2026
f55abbe
Merge pull request #1426 from validmind/codex/release-notes-previews
cachafla Jul 23, 2026
71af57c
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 23, 2026
5e1c6c1
Merge pull request #1427 from validmind/update-staging-29973013744
github-actions[bot] Jul 23, 2026
ce72242
Merge branch 'main' into juan/sc-16822/documentation-risk-tiering
juanmleng Jul 23, 2026
c4d0875
Merge pull request #1425 from validmind/juan/sc-16822/documentation-r…
juanmleng Jul 23, 2026
140944e
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 23, 2026
d840ecc
Merge pull request #1428 from validmind/update-staging-30002919424
github-actions[bot] Jul 23, 2026
f3a6954
Document configurable attachment upload limit
cachafla Jul 23, 2026
edda3ec
Merge pull request #1429 from validmind/codex/sc-15827-attachment-upl…
cachafla Jul 23, 2026
f438a2a
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 23, 2026
a54bd1e
Merge pull request #1430 from validmind/update-staging-30035819935
github-actions[bot] Jul 23, 2026
ebd152e
docs: add entra connect guide
nibalizer Jul 23, 2026
e0c0766
chore: refresh chatbot product map
github-actions[bot] Jul 23, 2026
8e01a77
Document artifact field-change workflow triggers
cachafla Jul 23, 2026
6a1c589
Remove ai_explain workflows
cachafla Jul 23, 2026
b97e919
Add documentation coverage agent guidance
cachafla Jul 23, 2026
bee3189
Expose agent skills to Claude
cachafla Jul 23, 2026
259397f
Merge pull request #1432 from validmind/codex/sc-16429-artifact-field…
cachafla Jul 23, 2026
5688ab0
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 23, 2026
ac9e17e
Merge pull request #1433 from validmind/update-staging-30053776311
github-actions[bot] Jul 23, 2026
ced370c
[SC-16823] Document Document Checker runs, publishing, and artifacts
panchicore Jul 24, 2026
a97ea5f
[SC-16959] Document execution taken path and Step Detail panels
panchicore Jul 24, 2026
56234a3
Refine validmind-docs-coverage skill per issue #1435
panchicore Jul 24, 2026
08f88c9
Merge pull request #1436 from validmind/panchicore/sc-16959-execution…
cachafla Jul 24, 2026
4fc8321
Merge branch 'main' into panchicore/issue-1435-skill-refinements
cachafla Jul 24, 2026
dd0afdd
Merge pull request #1437 from validmind/panchicore/issue-1435-skill-r…
cachafla Jul 24, 2026
c3f8b77
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 24, 2026
b101eb0
Merge pull request #1438 from validmind/update-staging-30125602464
github-actions[bot] Jul 24, 2026
29c49bb
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 24, 2026
e7d2c47
Merge pull request #1439 from validmind/update-staging-30125643959
github-actions[bot] Jul 24, 2026
1c99f67
Merge branch 'main' into panchicore/sc-16823-document-checker-runs
cachafla Jul 24, 2026
66644e7
Merge pull request #1434 from validmind/panchicore/sc-16823-document-…
cachafla Jul 24, 2026
e309676
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 24, 2026
2ba7bb6
Merge pull request #1440 from validmind/update-staging-30125809141
github-actions[bot] Jul 24, 2026
f7e31f6
chore: updates from review
nibalizer Jul 27, 2026
d56e587
Merge branch 'main' into nibz/entra_connect_guide
nibalizer Jul 27, 2026
8c95039
chore: feedback from review
nibalizer Jul 27, 2026
ce1a95b
Merge pull request #1431 from validmind/nibz/entra_connect_guide
nibalizer Jul 27, 2026
615cd5d
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 27, 2026
248cdc8
Merge pull request #1441 from validmind/update-staging-30280307846
github-actions[bot] Jul 27, 2026
423f5a5
[SC-16747] Document Record Intake experience
jamadriz Jul 27, 2026
cf4541f
chore: refresh chatbot product map
github-actions[bot] Jul 27, 2026
b025f51
Document risk tier assessment activity in the record Activity feed
juanmleng Jul 29, 2026
a107293
docs: remove Beta label from Map Evidence panel screenshot [sc-17354]
Jul 29, 2026
cc822cd
docs: shrink Map Evidence panel screenshot to prior width [sc-17354]
Jul 29, 2026
3a6f973
[SC-16747] Align Record Intake docs with is_intake create flow
jamadriz Jul 29, 2026
f5b595b
[SC-16747] Clarify automated vs manual Record Type Change method
jamadriz Jul 29, 2026
0b76725
Merge pull request #1444 from validmind/emma/sc-17354/docs-for-sc-17290
emmavdh Jul 29, 2026
4164b51
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 29, 2026
a26ed65
Merge pull request #1445 from validmind/update-staging-30496877767
github-actions[bot] Jul 29, 2026
98d60e0
Merge branch 'main' into jamadriz/sc-16747-record-intake
jamadriz Jul 29, 2026
26b50c7
docs: document artifact field change activity with before/after value…
cachafla Jul 29, 2026
8b704ca
Merge pull request #1446 from validmind/andres/sc-16552-artifact-acti…
cachafla Jul 29, 2026
197da97
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 29, 2026
3a97e20
Merge pull request #1447 from validmind/update-staging-30500470054
github-actions[bot] Jul 29, 2026
9442b34
[SC-16747] Drop field-derived target from Record Type Change docs
jamadriz Jul 30, 2026
bd670ba
Merge branch 'main' into jamadriz/sc-16747-record-intake
jamadriz Jul 30, 2026
5457070
Merge branch 'main' into juan/sc-17292/document-risk-tier-assessment-…
juanmleng Jul 30, 2026
5fc51f8
docs: document Databricks OAuth connect flow [sc-17636]
Jul 30, 2026
c1947e4
docs: refresh Databricks OAuth connection screenshot [sc-17636]
Jul 30, 2026
ae985b1
Merge pull request #1443 from validmind/juan/sc-17292/document-risk-t…
juanmleng Jul 30, 2026
c013773
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 30, 2026
6469025
Merge pull request #1449 from validmind/update-staging-30551488544
github-actions[bot] Jul 30, 2026
1a8b4b3
Merge pull request #1448 from validmind/emma/sc-17636/databricks-oaut…
emmavdh Jul 30, 2026
afe962d
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 30, 2026
aa25c87
Merge pull request #1451 from validmind/update-staging-30558231551
github-actions[bot] Jul 30, 2026
986c994
Merge pull request #1442 from validmind/jamadriz/sc-16747-record-intake
jamadriz Jul 30, 2026
6bc8afb
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 30, 2026
fae7ec4
Merge pull request #1452 from validmind/update-staging-30562833093
github-actions[bot] Jul 30, 2026
3b6d67b
docs: document create template and PDF outline upload [sc-17034]
emmavdh Jul 30, 2026
79cee2e
docs: document org-wide record activity views and filters [sc-17354]
emmavdh Jul 30, 2026
3d4b31e
chore: refresh chatbot product map
github-actions[bot] Jul 30, 2026
92a4ac1
docs: update Settings Activity filters and tracked categories [sc-17354]
emmavdh Jul 30, 2026
125a0cf
docs: refine Settings Activity tracked categories wording [sc-17354]
emmavdh Jul 30, 2026
483a882
Merge pull request #1450 from validmind/emma/sc-17354/docs-for-sc-16807
emmavdh Jul 30, 2026
14a37ff
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 30, 2026
437541b
Merge pull request #1454 from validmind/update-staging-30578368817
github-actions[bot] Jul 30, 2026
d251b71
docs: align MCP guide with current inventory tool surface [sc-17040]
emmavdh Jul 30, 2026
e3a2ed3
docs: surface in-app assistant page under Integrations [sc-17040]
emmavdh Jul 30, 2026
01b7f1c
Merge pull request #1455 from validmind/emma/sc-17040-documentation-m…
emmavdh Jul 30, 2026
3919e50
Merge pull request #1453 from validmind/emma/sc-17034/documentation-n…
emmavdh Jul 30, 2026
6a88ed4
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 30, 2026
50b8fc3
Merge pull request #1456 from validmind/update-staging-30586374565
github-actions[bot] Jul 30, 2026
b72c3f3
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 30, 2026
4c68d82
Merge pull request #1457 from validmind/update-staging-30586408449
github-actions[bot] Jul 30, 2026
1738218
docs: document ValidMind Library OIDC device-flow auth [sc-17043]
emmavdh Jul 30, 2026
b1f5461
docs: document Public REST API OIDC bearer auth [sc-17043]
emmavdh Jul 30, 2026
a12478b
fix: avoid nested panel-tabset in credentials guide [sc-17043]
emmavdh Jul 30, 2026
947e209
Merge pull request #1458 from validmind/emma/sc-17043-documentation-l…
emmavdh Jul 31, 2026
e8a0994
Merge remote-tracking branch 'origin/main' into staging
github-actions[bot] Jul 31, 2026
a33a4c9
Merge pull request #1459 from validmind/update-staging-30596550662
github-actions[bot] Jul 31, 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
1 change: 1 addition & 0 deletions .claude/skills
114 changes: 114 additions & 0 deletions .github/actions/build-docs-site/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
name: Build docs site
description: Populate generated sources and render a complete documentation site

inputs:
profile:
description: Quarto profile to render
required: true
docs_ci_ro_pat:
description: Read-only token for private source repositories
required: true
quarto_version:
description: Quarto version to install
required: true
library_ref:
description: validmind-library revision to build
required: true
installation_ref:
description: installation revision to build
required: true
release_notes_ref:
description: release-notes revision to build
required: true
backend_ref:
description: backend revision to build
required: true

runs:
using: composite
steps:
- name: Check out validmind-library repository
uses: actions/checkout@v4
with:
repository: validmind/validmind-library
ref: ${{ inputs.library_ref }}
path: site/_source/validmind-library
token: ${{ inputs.docs_ci_ro_pat }}

- name: Check out installation repository
uses: actions/checkout@v4
with:
repository: validmind/installation
ref: ${{ inputs.installation_ref }}
path: site/_source/installation
token: ${{ inputs.docs_ci_ro_pat }}
sparse-checkout: |
site/installation
sparse-checkout-cone-mode: true

- name: Check out release-notes repository
uses: actions/checkout@v4
with:
repository: validmind/release-notes
ref: ${{ inputs.release_notes_ref }}
path: site/_source/release-notes
token: ${{ inputs.docs_ci_ro_pat }}
sparse-checkout: |
releases
sparse-checkout-cone-mode: true

- name: Check out backend repository
uses: actions/checkout@v4
with:
repository: validmind/backend
ref: ${{ inputs.backend_ref }}
path: site/_source/backend
token: ${{ inputs.docs_ci_ro_pat }}
sparse-checkout: |
src/backend/templates/documentation/model_documentation
sparse-checkout-cone-mode: true

- name: Set up Quarto
uses: quarto-dev/quarto-actions/setup@v2
with:
version: ${{ inputs.quarto_version }}

- name: Set up uv
uses: astral-sh/setup-uv@v5

- name: Generate Python library docs
shell: bash
run: |
cd site/_source/validmind-library
make install && make quarto-docs
cd ../../
rm -rf validmind
mkdir -p validmind
rsync -av --exclude '_build' --exclude 'templates' _source/validmind-library/docs/ validmind/

- name: Generate template schema docs
shell: bash
run: BACKEND_ROOT=site/_source/backend uv run --with json-schema-for-humans python scripts/generate_template_schema_docs.py

- name: Populate installation
shell: bash
run: cp -r site/_source/installation/site/installation site/installation

- name: Populate release notes
shell: bash
run: |
cp -r site/_source/release-notes/releases site
rm -f site/releases/backend-releases.qmd site/releases/cmvm-releases.qmd

- name: Render docs site
shell: bash
env:
QUARTO_PROFILE: ${{ inputs.profile }}
run: |
cd site
quarto render --profile "$QUARTO_PROFILE" &> render_errors.log || {
echo "Quarto render failed immediately"
cat render_errors.log
exit 1
}
make generate-sitemap
51 changes: 51 additions & 0 deletions .github/scripts/merge_quarto_indexes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env python3
# Copyright © 2023-2026 ValidMind Inc. All rights reserved.
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial

"""Merge Quarto indexes from a partial render into full-site indexes."""

from __future__ import annotations

import argparse
import json
from pathlib import Path
from typing import Any


def merge_items(
base: list[dict[str, Any]], partial: list[dict[str, Any]], key: str
) -> list[dict[str, Any]]:
"""Return base items with partial items replacing entries with the same key."""
merged: dict[str, dict[str, Any]] = {}
for item in [*base, *partial]:
value = item.get(key)
if not isinstance(value, str) or not value:
raise ValueError(f"Every index item must have a non-empty {key!r}")
merged[value] = item
return list(merged.values())


def merge_file(base_path: Path, partial_path: Path, key: str) -> None:
base = json.loads(base_path.read_text())
partial = json.loads(partial_path.read_text())
if not isinstance(base, list) or not isinstance(partial, list):
raise ValueError("Quarto indexes must contain JSON arrays")
partial_path.write_text(
json.dumps(merge_items(base, partial, key), separators=(",", ":"))
)


def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--base-search", type=Path, required=True)
parser.add_argument("--partial-search", type=Path, required=True)
parser.add_argument("--base-listings", type=Path, required=True)
parser.add_argument("--partial-listings", type=Path, required=True)
args = parser.parse_args()

merge_file(args.base_search, args.partial_search, "objectID")
merge_file(args.base_listings, args.partial_listings, "listing")


if __name__ == "__main__":
main()
121 changes: 121 additions & 0 deletions .github/scripts/select_docs_preview_targets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
#!/usr/bin/env python3
# Copyright © 2023-2026 ValidMind Inc. All rights reserved.
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial

"""Select pages that are safe to render incrementally for a PR preview."""

from __future__ import annotations

import argparse
import sys
from dataclasses import dataclass
from pathlib import Path, PurePosixPath


PAGE_SUFFIXES = {".qmd", ".md", ".ipynb"}
ASSET_SUFFIXES = {".avif", ".gif", ".jpeg", ".jpg", ".pdf", ".png", ".svg", ".webp"}
UNSAFE_TOP_LEVEL = {
"_extensions",
"_freeze",
"_source",
"environments",
"llm",
"scripts",
}
STATUS_MAP = {
"added": "A",
"modified": "M",
"removed": "D",
"renamed": "R",
"copied": "C",
"changed": "T",
}


@dataclass(frozen=True)
class Selection:
targets: tuple[str, ...] = ()
assets: tuple[str, ...] = ()
fallback_reason: str | None = None

@property
def is_targeted(self) -> bool:
return self.fallback_reason is None


def select(changes: list[tuple[str, tuple[str, ...]]]) -> Selection:
targets: set[str] = set()
assets: set[str] = set()

for status, paths in changes:
if status not in {"A", "M"} or len(paths) != 1:
return Selection(fallback_reason=f"{status} change requires a full render")

path = PurePosixPath(paths[0])
if not path.parts or path.parts[0] != "site" or len(path.parts) < 2:
return Selection(fallback_reason=f"{path} is outside targetable site content")

relative = PurePosixPath(*path.parts[1:])
if relative.parts[0] in UNSAFE_TOP_LEVEL:
return Selection(fallback_reason=f"{path} can affect generated or global content")
if any(part.startswith("_") for part in relative.parts):
return Selection(fallback_reason=f"{path} is Quarto metadata or shared content")

suffix = relative.suffix.lower()
if suffix in PAGE_SUFFIXES:
targets.add(relative.as_posix())
elif suffix in ASSET_SUFFIXES:
assets.add(relative.as_posix())
else:
return Selection(fallback_reason=f"{path} is not a targetable page or asset")

if not targets:
return Selection(fallback_reason="no changed renderable pages were found")

return Selection(tuple(sorted(targets)), tuple(sorted(assets)))


def parse_changed_files(output: str) -> list[tuple[str, tuple[str, ...]]]:
changes: list[tuple[str, tuple[str, ...]]] = []
for line in output.splitlines():
fields = line.split("\t")
if len(fields) < 2:
raise ValueError(f"Unexpected changed-file line: {line!r}")
status = STATUS_MAP.get(fields[0], fields[0][0].upper())
changes.append((status, tuple(field for field in fields[1:] if field)))
return changes


def write_lines(path: Path, values: tuple[str, ...]) -> None:
path.write_text("".join(f"{value}\n" for value in values))


def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--changes", default="-")
parser.add_argument("--targets", type=Path, required=True)
parser.add_argument("--assets", type=Path, required=True)
args = parser.parse_args()

if args.changes == "-":
changed_files = sys.stdin.read()
else:
changed_files = Path(args.changes).read_text()

selection = select(parse_changed_files(changed_files))
if not selection.is_targeted:
print(f"Full render required: {selection.fallback_reason}")
return 3

write_lines(args.targets, selection.targets)
write_lines(args.assets, selection.assets)
print("Targeted render pages:")
print("\n".join(selection.targets))
if selection.assets:
print("Targeted preview assets:")
print("\n".join(selection.assets))
return 0


if __name__ == "__main__":
raise SystemExit(main())
49 changes: 49 additions & 0 deletions .github/scripts/test_merge_quarto_indexes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Copyright © 2023-2026 ValidMind Inc. All rights reserved.
# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial

import json
import tempfile
import unittest
from pathlib import Path

from merge_quarto_indexes import merge_file, merge_items


class MergeQuartoIndexesTest(unittest.TestCase):
def test_partial_items_replace_matching_base_items(self):
base = [{"objectID": "old", "text": "keep"}, {"objectID": "changed", "text": "old"}]
partial = [{"objectID": "changed", "text": "new"}, {"objectID": "new", "text": "add"}]

self.assertEqual(
merge_items(base, partial, "objectID"),
[
{"objectID": "old", "text": "keep"},
{"objectID": "changed", "text": "new"},
{"objectID": "new", "text": "add"},
],
)

def test_merge_file_updates_partial_path(self):
with tempfile.TemporaryDirectory() as directory:
base_path = Path(directory) / "base.json"
partial_path = Path(directory) / "partial.json"
base_path.write_text(json.dumps([{"listing": "/old", "items": ["a"]}]))
partial_path.write_text(json.dumps([{"listing": "/new", "items": ["b"]}]))

merge_file(base_path, partial_path, "listing")

self.assertEqual(
json.loads(partial_path.read_text()),
[
{"listing": "/old", "items": ["a"]},
{"listing": "/new", "items": ["b"]},
],
)

def test_missing_key_is_rejected(self):
with self.assertRaises(ValueError):
merge_items([], [{"text": "missing object id"}], "objectID")


if __name__ == "__main__":
unittest.main()
Loading
Loading