super-productivity/.github/workflows/wiki-sync.yml
Johannes Millan b3324e37b9
fix(ci): pin wiki-sync second checkout to actions/checkout@v5 (#7759)
* chore(plugins): re-bundle document-mode and document Stage A path

Reverts the unbundling from b0cae69ffe. Stage 0 (gzip + throttle, shipped
in 84625be849) handles size; document-mode remains opt-in per context, so
cross-context conflict risk is bounded. Stage A (keyed plugin-persistence
API, issue #7749) is the documented future path for closing the LWW gap
on different-context concurrent edits — picked up when conflicts are
observed in practice.

Design sketch with multi-reviewed phasing lives in
docs/plans/2026-05-23-stage-a-keyed-plugin-persistence.md. Predecessor
plan's "Future work" section now links to it.

* test(plugins): cover document-mode bundled load and PLUGIN_USER_DATA LWW

Follow-ups from the multi-review of 199e816479's re-bundling decision:

- E2E smoke test asserts document-mode appears in plugin management so
  a typo in BUNDLED_PLUGIN_PATHS fails loudly.
- Spec exercises PLUGIN_USER_DATA conflict resolution end-to-end, which
  previously relied on analogy to REMINDER (same array+null branch) but
  was never directly asserted after the migration off 'virtual'.
- Stage A plan risks: stale-editor-view gap surfaced by the review;
  PluginHooks.PERSISTED_DATA_UPDATE already exists in the API but is
  never dispatched host-side — wiring it is the path to a fix.
- background.ts: comment marks the known gap at the registerHook site.

* docs(plugins): plan for wiring PERSISTED_DATA_CHANGED hook

Designs the host-side wiring for the currently-dead
PluginHooks.PERSISTED_DATA_CHANGED so plugins can react to remote-driven
changes to their persisted data. Multi-reviewed twice; v4 trims scope to
host-only (no plugin adoption in this design) and preserves the
multi-review insights as seeds for the follow-up doc-mode adoption
tracked at issue #7752.

Implementation lands in a separate PR.

* fix(ci): pin wiki-sync second checkout to actions/checkout@v5

v6 stores credentials in a $RUNNER_TEMP file referenced via
includeIf.gitdir matchers; the wiki push intermittently runs without
credentials on github-hosted runners (run 26335467138 failed with
"could not read Username for 'https://github.com'"). v5 uses the
path-independent extraheader, which is stable for this second
checkout pattern.

Leaves the primary Checkout Code on v6.0.2 so Dependabot keeps it
current.

Refs: actions/checkout#2321, #2359
2026-05-23 20:41:44 +02:00

163 lines
5.3 KiB
YAML

---
name: Wiki Update
'on':
pull_request:
branches: [master, main]
paths:
- 'docs/wiki/**'
- .github/workflows/wiki-sync.yml
- .github/annotations/wiki-lint-problem-matcher.json
push:
branches: [master, main]
paths:
- 'docs/wiki/**'
- .github/workflows/wiki-sync.yml
- .github/annotations/wiki-lint-problem-matcher.json
concurrency:
group: wiki
cancel-in-progress: true
permissions:
contents: write
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
env:
GH_A9S: .github/annotations
GH_W7S: .github/workflows
steps:
- name: Checkout Code
uses: actions/checkout@v6.0.2
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.13'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install yamllint pymarkdownlnt
- name: Add Problem Matcher (for Annotations)
id: problem_matcher
run: echo "::add-matcher::${GH_A9S}/wiki-lint-problem-matcher.json"
- name: Lint with yamllint
id: yamllint
run: |
yamllint \
--format github \
"${GH_W7S}/wiki-sync.yml"
- name: Lint with pymarkdownlnt
if: >
steps.yamllint.outcome == 'success' &&
steps.problem_matcher.outcome == 'success'
run: |
pymarkdownlnt \
--disable-rules line-length,no-inline-html \
scan "docs/wiki"
sync:
name: (r)Sync
if: github.event_name == 'push'
needs: lint
runs-on: ubuntu-latest
env:
# Using [standard bot credentials](https://github.com/actions/checkout)
GIT_AUTHOR_NAME: github-actions[bot]
GIT_AUTHOR_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com
GIT_COMMITTER_NAME: github-actions[bot]
GIT_COMMITTER_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com
CODE_ROOT: code-root
WIKI_SRC: code-root/docs/wiki
WIKI_ROOT: wiki-root
steps:
- name: Checkout Code
uses: actions/checkout@v6.0.2
with:
repository: ${{ github.repository }}
path: ${{ env.CODE_ROOT }}
- name: Checkout Wiki
# Pinned to v5: v6 changed credential persistence to a path-scoped
# includeIf matcher, which intermittently leaves the wiki push without
# credentials on github-hosted runners (run 26335467138). v5 uses the
# path-independent extraheader and is stable for this second checkout.
uses: actions/checkout@v5
with:
repository: ${{ github.repository }}.wiki
path: ${{ env.WIKI_ROOT }}
- name: Verify Source and Target Git Checkouts
run: |
# --------------------------------------------------------------------
echo "::group::File and Directory Checks for ${WIKI_SRC}"
if [ ! -d "${CODE_ROOT}/.git" ]; then
echo "::error::Git directory for ${CODE_ROOT} is absent."
else
echo "Git directory for ${CODE_ROOT} is present."
fi
ls -lAh "${WIKI_SRC}"
echo "::endgroup::"
# --------------------------------------------------------------------
echo "::group::File and Directory Checks for ${WIKI_ROOT}"
if [ ! -d "${WIKI_ROOT}/.git" ]; then
echo "::error::Git directory for ${WIKI_ROOT} is absent."
else
echo "Git directory for ${WIKI_ROOT} is present."
fi
ls -lAh "${WIKI_ROOT}"
echo "::endgroup::"
# --------------------------------------------------------------------
- name: Mirror docs/wiki to GitHub Wiki
run: |
# RSYNC Options: assume that the code is always the source of truth
# RSYNC_DRY_RUN: "0"
# Hard mirror: overwrite + delete removed files and delete empty dirs
# Preserve existing '.git' in GH Wiki
# Report on changes in case dry-run debugging is needed
RSYNC_OPTIONS=(
--archive
--delete
--prune-empty-dirs
--exclude='.git'
--itemize-changes
--stats
)
# Optional dry-run for testing.
if [[ "${RSYNC_DRY_RUN:-0}" == "1" ]]; then
echo "::warning::DRY RUN --- no changes will be written"
RSYNC_OPTIONS+=(--dry-run)
fi
# Debug mode (warning: does not do a dry-run on its own!)
if [[ "${ACTIONS_STEP_DEBUG:-}" == "true" ]]; then
RSYNC_OPTIONS+=(-vv)
fi
# Mirror the code to the wiki.
rsync "${RSYNC_OPTIONS[@]}" "${WIKI_SRC}"/ "${WIKI_ROOT}"
- name: Switch, Commit, and Push
working-directory: ${{ env.WIKI_ROOT }}
run: |
git add -A # preferred over `git add .` in order to include deletions
if ! git diff-index --quiet HEAD; then
git commit -m "docs(wiki): auto-publish via wiki-sync.yml"
git push --force-with-lease # ensures edits in wiki don't block
else
# Expected if modifying only the YML and not the wiki content.
echo "::warning::No changes found to be committed."
echo "*No changes found to be committed.*" >> "$GITHUB_STEP_SUMMARY"
fi