Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
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
20 changes: 18 additions & 2 deletions .github/workflows/gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ jobs:
with:
node-version: '22'

- uses: jdx/mise-action@v2

- name: Validate homepage query against parsed graph
run: |
npm ci --no-audit --no-fund
mise run site:query:check

- name: Scan published source for secrets and local paths
run: |
npm install --prefix "$RUNNER_TEMP/secretlint" --no-audit --no-fund secretlint@13.0.6 @secretlint/secretlint-rule-preset-recommend@13.0.6 @secretlint/secretlint-rule-pattern@13.0.6
Expand All @@ -26,15 +33,24 @@ jobs:
- uses: astral-sh/setup-uv@v6

- name: Check podcast RSS
run: uv run --no-project --with PyYAML==6.0.2 python scripts/build_rss.py --check
run: uv run --no-project python scripts/build_rss.py --check

- name: Prepare episode and asset visibility
run: uv run --no-project python scripts/prepare_site.py --output "$RUNNER_TEMP/gitp-site"

- name: Logseq Publish
uses: logseq/publish-spa@main
with:
graph-directory: gitp-garden
graph-directory: ${{ runner.temp }}/gitp-site
output-directory: www
accent-color: indigo

- name: Save website preview
uses: actions/upload-artifact@v4
with:
name: gitpa-website
path: www

- name: Add .nojekyll file
run: touch www/.nojekyll

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,6 @@ Thumbs.db
__pycache__/
*.py[cod]
.pytest_cache/

node_modules/
.nbb/
2 changes: 2 additions & 0 deletions .secretlintignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ node_modules/
**/*.mid
**/*.mfpz
**/*.mp3

.nbb/
21 changes: 13 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
# gitpa
Ghost in the Patch Alpha podcast
# Ghost in the Patch

## Podcast feed
Episode notes and media links live in [logseq-encode-garden](https://github.com/codekiln/logseq-encode-garden). Gitpa mirrors each session under its exact page name, together with its embedded audio asset page. The website and RSS read those checked-in pages.

Published episodes have an `episode.yml` under `gitp-garden/assets/Ceremony/<year>/<month>/<day>/` and a public page under `gitp-garden/pages/`. Set `published: true` only when the episode record has its permanent GUID, publication time, public page URL, and verified MP3 enclosure URL and length. Existing records without `published: true` remain drafts.
To mirror or refresh an episode, run the garden's sync task, imported into `gitp-garden/mise-tasks/`: `mise run logseq:entity:proxy:page:sync --source /path/to/logseq-encode-garden --destination gitp-garden --page 'GitP/A/Session/26/09/24-Thu' --follow-embeds --apply`. `--follow-embeds` brings the recording, artwork, preset and MIDI pages the session embeds in the same batch; leave out `--apply` to preview. The page bodies are replaced with the garden's. Properties follow the garden too, except `tags::`, `public::`, `podcast-guid::` and `podcast-published-at::`, which stay as Gitpa set them; the preview lists each property it adds, updates or removes. A destination page without a matching proxy URL stops the batch before writing. The task also brings each page's entity definitions and records what it imported in `gitp-garden/.logseq-proxy/manifest.json`. Re-running it against unchanged garden pages changes nothing except `logseq-proxy-last-sync-date::`.

Run `mise run rss:build` after editing an episode record and commit the resulting `rss.xml`. `mise run rss:check` verifies that the committed feed matches the records. The Pages workflow checks the feed and copies it to `https://codekiln.github.io/gitpa/rss.xml` after building the Logseq site.
For dependent PRs, pass the upstream worktree path explicitly with `--source`. Proxy graph links keep the registered `logseq-encode-garden` name; source links identify the worktree branch. After the upstream PR merges, re-sync from the registered checkout to update the source links to `main`.

Production notes, Ableton inspection, transcription and media preparation live in [logseq-encode-garden](https://github.com/codekiln/logseq-encode-garden). The garden's `gitpa:episode:draft` task prepares a handoff JSON file; import that file with `mise run episode:import -- '/path/to/episode-handoff.json'`.
To update the imported sync task itself, sync its entity definition: `mise run logseq:entity:proxy:page:sync --source /path/to/logseq-encode-garden --destination gitp-garden --page 'Logseq/Entity/Proxy/Page' --apply`.

The handoff contains `recorded_on` (YYYY-MM-DD), `episode_title` and `description`. Optional verified media metadata must include `audio_url`, `audio_length` and `audio_type` together. The importer creates an unpublished `episode.yml` and a Logseq draft page, preserves existing editorial copy, page content and publication identity, and rejects conflicting enclosure metadata before writing. Repeated imports leave existing copy untouched. Unknown fields, including `published`, `guid` and `page`, are rejected; `gitpa` owns the final copy, page, GUID and publication time. Review the description and verify the public MP3 before setting `published: true`.
Set `public:: true` on the episode page to release the episode on the website and RSS. The synced episode body contains direct artwork, recording and preset download links. The desktop graph hides administrative properties and displays `logseq-entity` and `date-created`. The website build also resolves older recording and artwork embeds into direct links. Proxy and storage properties remain in the checked-in garden; the exported listener view hides page properties. A `Notes` or `Production notes` heading publishes its children only when the heading carries `public:: true`. The website build derives asset-page visibility from public episodes; shared assets stay visible while any public episode links to them. The episode's `podcast-guid::` identifies its RSS item permanently; `podcast-published-at::` holds its publication time with a timezone offset. The RSS builder reads the title and description from the session's opening heading and paragraph, reads its direct MP3 recording link (or an older embedded MP3 asset page), and gets the enclosure size from the public MP3 server. `public:: false` keeps an episode out of the website and RSS.

Install the staged-file guard with `lefthook install`. It uses the machine's `mise run secrets:scan` task, including private identity patterns. GitHub Actions runs the checked-in Secretlint rules across the public source before publishing.
The November and December 2024 recordings enter the feed with this release. Their publication times record that release; their recording dates remain on the session pages. The September 2026 episodes retain their existing feed identities and publication times.

Run `mise run rss:build` and commit `rss.xml` with a publication PR. `mise run rss:check` checks the feed against the public pages and audio server; `mise run rss:test` runs offline tests. Merging a publication PR triggers the Pages workflow, which publishes the website and [podcast feed](https://codekiln.github.io/gitpa/rss.xml).

Install the staged-file guard with `lefthook install`. It uses the machine's `mise run secrets:scan` task. GitHub Actions scans the public source before publishing.

The homepage lists published episodes by publication time, newest first. Preparation normalizes publication timestamps to UTC in the temporary website graph so different timezone offsets sort chronologically. Run `mise install` and `npm ci`, then `mise run site:query:check` to test the actual query, result transform and view using the Logseq file parser. Before running the query, the check rewrites `(pull ?b [*])` the way the Logseq app does, which drops page names; the homepage query therefore pulls `?p`. The check includes false and string-valued publication fixtures. PR builds upload a `gitpa-website` artifact for browser review.
33 changes: 0 additions & 33 deletions gitp-acolyte/.gitignore

This file was deleted.

1 change: 0 additions & 1 deletion gitp-acolyte/.python-version

This file was deleted.

97 changes: 0 additions & 97 deletions gitp-acolyte/Makefile

This file was deleted.

1 change: 0 additions & 1 deletion gitp-acolyte/README.md

This file was deleted.

Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
69 changes: 0 additions & 69 deletions gitp-acolyte/gitp_acolyte/ceremonial/spells/episode_data/args.py

This file was deleted.

Loading
Loading