| Title: | RLadies+ GitHub Organisation Management |
|---|---|
| Description: | GitHub App for managing the RLadies+ organisation. Handles onboarding and offboarding of global team members, chapter onboarding, PR review automation, org-wide reporting, Airtable sync, website automation, chapter monitoring, and interactive issue commands. |
| Authors: | RLadies+ [aut, cre, cph] (ROR: <https://ror.org/05wpb1k41>) |
| Maintainer: | RLadies+ <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.1.1 |
| Built: | 2026-05-25 21:11:53 UTC |
| Source: | https://github.com/rladies/jinx |
Queries the GitHub API for repository activity metrics across all non-meetup repos in the organization.
analytics_collect_chapter_activity( org = "rladies", months = 12, exclude_pattern = "^meetup-" )analytics_collect_chapter_activity( org = "rladies", months = 12, exclude_pattern = "^meetup-" )
org |
GitHub organization. |
months |
Number of months of history. |
exclude_pattern |
Regex pattern to exclude repos. |
Data frame with columns: chapter, month, commits, prs, issues.
Collect contributor growth data
analytics_collect_contributor_growth(org = "rladies", months = 12)analytics_collect_contributor_growth(org = "rladies", months = 12)
org |
GitHub organization. |
months |
Number of months of history. |
Data frame with columns: month, new_contributors, total_contributors, active_repos.
Calculates month-over-month changes and rolling averages from chapter activity data.
analytics_compute_trends(activity_data)analytics_compute_trends(activity_data)
activity_data |
Data frame from |
Data frame with trend columns added.
Format analytics as markdown
analytics_format_markdown(trends, contributor_growth)analytics_format_markdown(trends, contributor_growth)
trends |
Data frame from |
contributor_growth |
Data frame from
|
Formatted markdown string.
Orchestrates data collection, trend computation, and formatting.
analytics_generate_dashboard(org = "rladies", months = 12, output_path = NULL)analytics_generate_dashboard(org = "rladies", months = 12, output_path = NULL)
org |
GitHub organization. |
months |
Number of months of history. |
output_path |
Optional path to write JSON data. |
Named list with trends, growth, and markdown (invisibly).
Publish analytics dashboard as a GitHub issue
analytics_publish_dashboard( dashboard_data, org = "rladies", target_repo = "global-team", slack_channel = NULL )analytics_publish_dashboard( dashboard_data, org = "rladies", target_repo = "global-team", slack_channel = NULL )
dashboard_data |
Data from |
org |
GitHub organization. |
target_repo |
Repository to publish to. |
slack_channel |
Optional Slack channel to post a summary to. |
Issue URL (invisibly).
Create a formatted announcement message
announce_create_message(frontmatter, uri)announce_create_message(frontmatter, uri)
frontmatter |
Named list from YAML front matter (needs |
uri |
URL of the post. |
Formatted message string.
Reads YAML front matter from a blog post, creates an announcement message, and posts to selected platforms.
announce_post( post, platforms = c("bluesky", "linkedin", "mastodon"), newsletter = TRUE )announce_post( post, platforms = c("bluesky", "linkedin", "mastodon"), newsletter = TRUE )
post |
File path to the blog post (markdown with YAML front matter). |
platforms |
Character vector of platforms to post to.
Defaults to all: |
newsletter |
Logical, whether to also send a newsletter. Defaults
to |
Invisibly returns a named list with the posting result for each platform.
Post an announcement to Bluesky
announce_post_bluesky(text, image = NULL, image_alt = NULL)announce_post_bluesky(text, image = NULL, image_alt = NULL)
text |
Post text. |
image |
Optional file path to an image. |
image_alt |
Alt text for the image. |
Post response (invisibly).
Post an announcement to Mastodon
announce_post_mastodon(text, image = NULL, image_alt = NULL)announce_post_mastodon(text, image = NULL, image_alt = NULL)
text |
Post text. |
image |
Optional file path to an image. |
image_alt |
Alt text for the image. |
Post response (invisibly).
Posts as the authenticated user (jinx[bot] when using a GitHub App token).
announce_post_reply(owner, repo, issue_number, body)announce_post_reply(owner, repo, issue_number, body)
owner |
Repository owner. |
repo |
Repository name. |
issue_number |
Issue or PR number. |
body |
Comment body (markdown). |
The API response (invisibly).
Send a newsletter via ConvertKit
announce_send_newsletter(frontmatter, url)announce_send_newsletter(frontmatter, url)
frontmatter |
Named list with |
url |
URL of the post. |
API response (invisibly).
Check blog URLs and RSS feeds for broken links
blog_check_links(blogs_path)blog_check_links(blogs_path)
blogs_path |
Path to directory containing blog JSON files. |
A data frame with columns file, url, rss_feed,
url_status, rss_status.
Fetches OpenGraph metadata from the URL and creates a JSON entry compatible with awesome-rladies-blogs format.
blog_create_entry(url, language = "en", author_name, output_dir = ".")blog_create_entry(url, language = "en", author_name, output_dir = ".")
url |
Blog URL. |
language |
Language code. Defaults to |
author_name |
Author name. Required. |
output_dir |
Directory to write the JSON file. Defaults to |
File path of the created JSON (invisibly).
Check CFP deadlines and post reminders
cfp_check_deadlines(org = "rladies", repo = "global-team", warn_days = 7)cfp_check_deadlines(org = "rladies", repo = "global-team", warn_days = 7)
org |
GitHub organization. |
repo |
Repository where CFP issues are tracked. |
warn_days |
Number of days before deadline to warn. |
Data frame of approaching CFPs (invisibly).
Create a CFP tracking issue
cfp_create_issue( conference, deadline, url, topics = character(0), org = "rladies", repo = "global-team" )cfp_create_issue( conference, deadline, url, topics = character(0), org = "rladies", repo = "global-team" )
conference |
Conference name. |
deadline |
Submission deadline (YYYY-MM-DD). |
url |
CFP URL. |
topics |
Character vector of topic tags. |
org |
GitHub organization. |
repo |
Repository to create the issue in. |
Issue URL (invisibly).
List open CFPs tracked as GitHub issues
cfp_list_open(org = "rladies", repo = "global-team")cfp_list_open(org = "rladies", repo = "global-team")
org |
GitHub organization. |
repo |
Repository where CFP issues are tracked. |
Data frame with columns: conference, deadline, url, number, status.
Adds a speaker recommendation as a comment on the CFP tracking issue.
cfp_recommend_speaker( conference, speaker_name, speaker_github = NULL, expertise = character(0), org = "rladies", repo = "global-team" )cfp_recommend_speaker( conference, speaker_name, speaker_github = NULL, expertise = character(0), org = "rladies", repo = "global-team" )
conference |
Conference name (matched against open CFP issues). |
speaker_name |
Speaker name or GitHub username. |
speaker_github |
Optional GitHub username. |
expertise |
Character vector of expertise areas. |
org |
GitHub organization. |
repo |
Repository where CFP issues are tracked. |
Comment URL (invisibly).
Identifies chapters that have been inactive (no events) for a specified number of months.
chapter_check_health( months = 12, org = "rladies", data_repo = "meetup_archive" )chapter_check_health( months = 12, org = "rladies", data_repo = "meetup_archive" )
months |
Number of months without activity to consider inactive. Defaults to 12. |
org |
GitHub organization. Defaults to |
data_repo |
Repository containing chapter/event data.
Defaults to |
A data frame with columns chapter, last_event, status,
and months_inactive.
Generates a chapter JSON entry for the website.
chapter_create( city, country, organizers, social_media = list(), status = "prospective", output_dir = "." )chapter_create( city, country, organizers, social_media = list(), status = "prospective", output_dir = "." )
city |
City name. |
country |
Country name. |
organizers |
Character vector of organizer names. |
social_media |
Named list of social media links (e.g.
|
status |
Chapter status. Defaults to |
output_dir |
Directory to write the JSON file. |
File path of the created JSON (invisibly).
Generates the chapter JSON file and creates a PR to add it to the website.
chapter_create_pr( city, country, region = NULL, meetup_urlname, email, organizers, status = "prospective", social_media = list(), org = "rladies", website_repo = "rladies.github.io" )chapter_create_pr( city, country, region = NULL, meetup_urlname, email, organizers, status = "prospective", social_media = list(), org = "rladies", website_repo = "rladies.github.io" )
city |
Chapter city. |
country |
Chapter country. |
region |
State/region/province (optional). |
meetup_urlname |
Meetup group URL name. |
email |
Chapter email address. |
organizers |
Character vector of organizer names. |
status |
Chapter status. Defaults to |
social_media |
Named list of social media handles (optional). |
org |
GitHub organization. Defaults to |
website_repo |
Website repository name. |
PR URL (invisibly).
Opens a tracking issue in the new-chapters-onboarding repo with the full checklist for setting up a new RLadies+ chapter.
chapter_create_setup( city, country, organizers, org = "rladies", onboarding_repo = "new-chapters-onboarding" )chapter_create_setup( city, country, organizers, org = "rladies", onboarding_repo = "new-chapters-onboarding" )
city |
Chapter city name. |
country |
Chapter country. |
organizers |
Character vector of organizer names. |
org |
GitHub organization. Defaults to |
onboarding_repo |
Repository for chapter onboarding issues. |
Issue URL (invisibly).
Opens a tracking issue for updating an existing chapter's infrastructure.
chapter_create_update( city, country, org = "rladies", onboarding_repo = "new-chapters-onboarding" )chapter_create_update( city, country, org = "rladies", onboarding_repo = "new-chapters-onboarding" )
city |
Chapter city name. |
country |
Chapter country. |
org |
GitHub organization. Defaults to |
onboarding_repo |
Repository for chapter onboarding issues. |
Issue URL (invisibly).
Determines chapter status based on meetup event data. Chapters are classified as active, inactive, or unbegun based on their last event and founding date.
chapter_monitor_status(data_path = NULL, inactive_months = 6, org = "rladies")chapter_monitor_status(data_path = NULL, inactive_months = 6, org = "rladies")
data_path |
Path to a CSV export from Meetup Pro Dashboard,
or |
inactive_months |
Months without events to consider inactive. Defaults to 6. |
org |
GitHub organization. |
Data frame with chapter status information.
Analyzes chapter activity data and publishes a summary report.
chapter_report_health(months = 6, org = "rladies", target_repo = "global-team")chapter_report_health(months = 6, org = "rladies", target_repo = "global-team")
months |
Inactivity threshold in months. Defaults to 6. |
org |
GitHub organization. Defaults to |
target_repo |
Repository to publish report to.
Defaults to |
Issue URL (invisibly).
Splits a markdown document by H1/H2 sections, then packs paragraphs
into chunks of roughly target_chars characters. Returns a list of
chunk records with heading, title, and lastmod metadata.
chunk_markdown(markdown, meta, target_chars = 1800, min_chars = 200)chunk_markdown(markdown, meta, target_chars = 1800, min_chars = 200)
markdown |
Markdown text (may include YAML frontmatter). |
meta |
Named list with |
target_chars |
Approximate target chunk size. |
min_chars |
Minimum chunk size; smaller chunks are dropped. |
List of chunk records (one list per chunk).
Fails if the token has access to zero or more than one account.
cloudflare_account_id(api_token)cloudflare_account_id(api_token)
api_token |
Cloudflare API token. |
Account ID string.
Calls the Cloudflare REST endpoint
accounts/{id}/ai/run/{model} and returns the embedding vectors.
cloudflare_embed( texts, account_id, api_token, model = "@cf/baai/bge-base-en-v1.5" )cloudflare_embed( texts, account_id, api_token, model = "@cf/baai/bge-base-en-v1.5" )
texts |
Character vector of texts. |
account_id |
Cloudflare account ID. |
api_token |
Cloudflare API token. |
model |
Workers AI embedding model. |
List of numeric vectors, one per input text.
Upsert vectors into a Cloudflare Vectorize index
cloudflare_vectorize_upsert(vectors, account_id, api_token, index_name)cloudflare_vectorize_upsert(vectors, account_id, api_token, index_name)
vectors |
List of vector records, each with |
account_id |
Cloudflare account ID. |
api_token |
Cloudflare API token. |
index_name |
Vectorize index name. |
Parsed JSON response body.
Returns the response message as a character string. The caller is responsible for routing the message to the right destination (GitHub issue comment, Slack, R console, etc.).
cmd_execute(command)cmd_execute(command)
command |
Parsed command list from |
Character string with the response message.
Parses commands like:
/jinx invite @username to website
/jinx offboard @username from blog
/jinx report weekly
/jinx help
cmd_parse(body)cmd_parse(body)
body |
Character string, the comment body. |
A named list with action and action-specific fields, or NULL
if the comment is not a jinx command.
Summarizes active CFPs, speaker recommendations, and upcoming deadlines.
conference_generate_report(org = "rladies", repo = "global-team")conference_generate_report(org = "rladies", repo = "global-team")
org |
GitHub organization. |
repo |
Repository where CFP issues are tracked. |
Formatted markdown string.
List speaker recommendations for a conference
conference_list_speakers(conference, org = "rladies", repo = "global-team")conference_list_speakers(conference, org = "rladies", repo = "global-team")
conference |
Conference name. |
org |
GitHub organization. |
repo |
Repository where CFP issues are tracked. |
Data frame with columns: speaker, expertise, recommended_by.
Creates a markdown table or image grid of contributors for inclusion in README or other documents.
contributor_format(contributors, format = c("table", "grid"), cols = 7)contributor_format(contributors, format = c("table", "grid"), cols = 7)
contributors |
Data frame from |
format |
Output format: |
cols |
Number of columns for grid format. Defaults to 7. |
Character string with markdown content.
Collects all contributors from merged PRs and commits, returning a deduplicated list with contribution counts.
contributor_list(owner, repo, include_bots = FALSE)contributor_list(owner, repo, include_bots = FALSE)
owner |
Repository owner. |
repo |
Repository name. |
include_bots |
Whether to include bot accounts. Defaults to |
Data frame with login, contributions, avatar_url, and
profile_url columns, sorted by contribution count.
Aggregates contributor data across all non-meetup repos in the org.
contributor_list_org(org = "rladies", exclude_pattern = "^meetup-")contributor_list_org(org = "rladies", exclude_pattern = "^meetup-")
org |
GitHub organization. |
exclude_pattern |
Regex to exclude repos. |
Data frame with login, repos, contributions,
avatar_url, and profile_url. contributions is the sum across
all repos; repos is the count of distinct repos contributed to.
Fetches contributors and creates/updates a PR with the contributor list in a specified file.
contributor_update( owner, repo, file_path = ".github/contributors.md", format = "grid" )contributor_update( owner, repo, file_path = ".github/contributors.md", format = "grid" )
owner |
Repository owner. |
repo |
Repository name. |
file_path |
Path in the repo to update with the contributor list.
Defaults to |
format |
Format for the contributor list. |
PR URL if changes were made, NULL otherwise (invisibly).
Uses magick to crop to a square and resize for web display.
directory_crop_image( path, width = 400, height = 400, gravity = "Center", output = path )directory_crop_image( path, width = 400, height = 400, gravity = "Center", output = path )
path |
Path to the image file. |
width |
Target width in pixels. Defaults to 400. |
height |
Target height in pixels. Defaults to 400. |
gravity |
Crop gravity. Defaults to |
output |
Output path. Defaults to overwriting the input. |
Output path (invisibly).
Resizes to max width and compresses.
directory_optimize_image(path, max_width = 800, quality = 85, output = path)directory_optimize_image(path, max_width = 800, quality = 85, output = path)
path |
Path to the image file. |
max_width |
Maximum width in pixels. Defaults to 800. |
quality |
JPEG quality (1-100). Defaults to 85. |
output |
Output path. Defaults to overwriting the input. |
Output path (invisibly).
Fetches directory entries from Airtable and updates the directory repo. Creates a PR with new/updated entries for review.
directory_sync_airtable( base_id = "appM6GuE0Jl1UI9qx", api_key = Sys.getenv("AIRTABLE_API_KEY"), org = "rladies", directory_repo = "directory" )directory_sync_airtable( base_id = "appM6GuE0Jl1UI9qx", api_key = Sys.getenv("AIRTABLE_API_KEY"), org = "rladies", directory_repo = "directory" )
base_id |
Airtable base ID. |
api_key |
Airtable API key. Defaults to |
org |
GitHub organization. Defaults to |
directory_repo |
Directory repository name. |
PR URL if changes found, NULL otherwise (invisibly).
Checks that filenames follow conventions: lowercase, no hashes,
ASCII-only, .json extension.
directory_validate_filename(filename)directory_validate_filename(filename)
filename |
Filename (not full path) to validate. |
A named list with valid (logical) and issues (character
vector of problems found).
Performs HTTP HEAD requests to check if profiles resolve.
directory_verify_handles(entry)directory_verify_handles(entry)
entry |
Named list representing a directory entry, with a
|
A data frame with columns platform, handle, status,
and valid.
Create a formatted event summary
event_create_summary(events, period = c("weekly", "monthly"))event_create_summary(events, period = c("weekly", "monthly"))
events |
Data frame from |
period |
Summary period label. |
Formatted markdown string.
Queries Meetup Pro for recent events.
event_list_chapter(chapter, months = 3)event_list_chapter(chapter, months = 3)
chapter |
Chapter identifier (e.g. "rladies-berlin"). |
months |
Number of months of history. |
Data frame with columns: title, date, url, rsvp_count, source, chapter.
Publish event summary as a GitHub issue
event_publish_summary(summary, org = "rladies", target_repo = "global-team")event_publish_summary(summary, org = "rladies", target_repo = "global-team")
summary |
Formatted summary from |
org |
GitHub organization. |
target_repo |
Repository to publish to. |
Issue URL (invisibly).
Fetches events from all configured sources and writes a summary.
event_sync_chapters( org = "rladies", target_repo = "event-archive", months = 3, dry_run = TRUE )event_sync_chapters( org = "rladies", target_repo = "event-archive", months = 3, dry_run = TRUE )
org |
GitHub organization. |
target_repo |
Repository for the event archive. |
months |
Number of months of history. |
dry_run |
If |
Data frame of all events (invisibly).
Looks up gather_<type>() where <type> has dashes replaced by
underscores. Sources extend the indexer by defining a new
gather_<type>(src) function.
gather_rag_source(src)gather_rag_source(src)
src |
Source spec list (must have |
List of chunk records (with chunk_idx set per document).
Thin wrapper around gh_welcome_contributor() that fixes is_pr = TRUE for use in PR-only workflows. Reusable across any repo.
gh_greet_contributor( owner, repo, number, author, org = "rladies", extra_message = NULL )gh_greet_contributor( owner, repo, number, author, org = "rladies", extra_message = NULL )
owner |
Repository owner. |
repo |
Repository name. |
number |
PR number. |
author |
GitHub login of the author. |
org |
Organization name. |
extra_message |
Optional extra markdown to append after the standard welcome message. |
Comment URL or NULL if author is a team member (invisibly).
Posts a review checklist comment tailored for content PRs (blog posts, news posts, or any markdown-driven content). Generic across content kinds — the only difference between blog and news today is the path filter the caller workflow applies.
gh_post_checklist(owner, repo, pr_number)gh_post_checklist(owner, repo, pr_number)
owner |
Repository owner. |
repo |
Repository name. |
pr_number |
PR number. |
Comment URL (invisibly).
Posts a thank-you message tailored to whether this is their first merged PR.
gh_thank_contributor(owner, repo, pr_number, author, org = "rladies")gh_thank_contributor(owner, repo, pr_number, author, org = "rladies")
owner |
Repository owner. |
repo |
Repository name. |
pr_number |
PR number. |
author |
GitHub login of the PR author. |
org |
Organization name. |
Comment URL (invisibly).
Checks if the PR/issue author has previous contributions to the repo. If this is their first, posts a warm welcome message. If not, posts a shorter thank-you. No-op for bots and global team members.
gh_welcome_contributor( owner, repo, number, author, is_pr = TRUE, org = "rladies", extra_message = NULL )gh_welcome_contributor( owner, repo, number, author, is_pr = TRUE, org = "rladies", extra_message = NULL )
owner |
Repository owner. |
repo |
Repository name. |
number |
Issue or PR number. |
author |
GitHub login of the author. |
is_pr |
Whether this is a PR (TRUE) or issue (FALSE). |
org |
Organization name. |
extra_message |
Optional extra markdown to append after the
standard welcome message (e.g. a project-specific reminder).
Ignored when blank or |
Comment URL or NULL if author is a team member (invisibly).
Scans all non-meetup repositories in the organization, collects workflow information, and generates a JSON report.
gha_generate_dashboard( org = "rladies", exclude_pattern = "^meetup-", output_path = NULL )gha_generate_dashboard( org = "rladies", exclude_pattern = "^meetup-", output_path = NULL )
org |
GitHub organization. Defaults to |
exclude_pattern |
Regex pattern to exclude repos.
Defaults to |
output_path |
Path to write the JSON report.
If |
List of workflow data (invisibly).
Creates a summary issue with workflow status badges.
gha_publish_dashboard( dashboard_data, org = "rladies", target_repo = "global-team" )gha_publish_dashboard( dashboard_data, org = "rladies", target_repo = "global-team" )
dashboard_data |
Data from |
org |
GitHub organization. |
target_repo |
Repository to publish to. |
Issue URL (invisibly).
Lists pending invitations and triggers finalization for accepted ones.
gt_check_invitations(org = "rladies")gt_check_invitations(org = "rladies")
org |
GitHub organization. Defaults to |
Character vector of usernames that have accepted their invitation (invisibly).
Create a global team offboarding issue
gt_create_offboarding(username, team, name = username, org = "rladies")gt_create_offboarding(username, team, name = username, org = "rladies")
username |
GitHub username. |
team |
Team slug. |
name |
Full name. Defaults to the username. |
org |
GitHub organization. Defaults to |
The created issue URL (invisibly).
Finalize global team offboarding by removing user from teams
gt_finalize_offboarding(username, team, org = "rladies")gt_finalize_offboarding(username, team, org = "rladies")
username |
GitHub username. |
team |
Team slug. |
org |
GitHub organization. Defaults to |
Invisibly returns NULL. Called for its side effect of removing
the user from the specified teams.
Adds the user to their specific team and creates a tracking issue with the onboarding checklist.
gt_finalize_onboarding(username, team, name = username, org = "rladies")gt_finalize_onboarding(username, team, name = username, org = "rladies")
username |
GitHub username. |
team |
Team slug (e.g. "website"). |
name |
Full name. |
org |
GitHub organization. Defaults to |
The created issue URL (invisibly).
Sends an organization membership invitation and adds the user to the global team.
gt_invite(username, team, name = username, org = "rladies")gt_invite(username, team, name = username, org = "rladies")
username |
GitHub username (without |
team |
Team slug (e.g. "website"). |
name |
Full name (used in issue templates). |
org |
GitHub organization. Defaults to |
Invisibly returns NULL. Called for its side effect of sending
the invitation and adding the user to the specified team.
Finds open issues with onboarding or offboarding labels that haven't
been updated in days days, and posts a reminder comment.
gt_remind_stale(org = "rladies", days = 30, repo = "global-team")gt_remind_stale(org = "rladies", days = 30, repo = "global-team")
org |
GitHub organization. Defaults to |
days |
Number of days without activity before reminding. Defaults to 30. |
repo |
Repository to check. Defaults to |
Invisibly returns NULL. Called for its side effect of posting
reminder comments on stale issues.
Fetches global team member data from Airtable and updates the website repo data files.
gt_sync_airtable( base_id = "appZjaV7eM0Y9FsHZ", api_key = Sys.getenv("AIRTABLE_API_KEY"), org = "rladies", website_repo = "rladies.github.io" )gt_sync_airtable( base_id = "appZjaV7eM0Y9FsHZ", api_key = Sys.getenv("AIRTABLE_API_KEY"), org = "rladies", website_repo = "rladies.github.io" )
base_id |
Airtable base ID for the global team. |
api_key |
Airtable API key. |
org |
GitHub organization. |
website_repo |
Website repository name. |
PR URL if changes found, NULL otherwise (invisibly).
Check translation coverage across languages
i18n_check_coverage()i18n_check_coverage()
Data frame with columns: language, total_templates, translated, coverage_pct.
Looks up the chapter's language preference from its metadata. Falls back to English if not set.
i18n_get_chapter_language(chapter, org = "rladies")i18n_get_chapter_language(chapter, org = "rladies")
chapter |
Chapter slug (e.g. "rladies-berlin"). |
org |
GitHub organization. |
Language code string.
List supported languages
i18n_list_languages()i18n_list_languages()
Data frame with columns: code, name, native_name, direction.
Looks up inst/translations/{language}/{template_name}.md first,
falls back to inst/templates/{template_name}.md if the translation
is missing.
i18n_translate_template(template_name, language = "en", variables = list())i18n_translate_template(template_name, language = "en", variables = list())
template_name |
Template filename without path (e.g. "global-team-onboarding.md"). |
language |
Language code (e.g. "es", "pt", "fr"). Defaults to "en". |
variables |
Named list of placeholder values for
|
Rendered template as a single character string.
Checks that all translated templates have the same <KEY> placeholders
as the English baseline.
i18n_validate_translations(language = NULL)i18n_validate_translations(language = NULL)
language |
Language code to validate. If |
Data frame with columns: template, language, status, missing_keys, extra_keys.
Get LinkedIn API version string
li_get_version()li_get_version()
Version string in YYYYMM format.
Upload media to LinkedIn
li_media_upload(author, media)li_media_upload(author, media)
author |
LinkedIn URN of the owner. |
media |
File path to the image. |
LinkedIn image ID string.
Interactive OAuth2 flow for obtaining a LinkedIn token.
li_oauth()li_oauth()
OAuth token object.
Post to LinkedIn
li_post_write(author, text, image = NULL, image_alt = "")li_post_write(author, text, image = NULL, image_alt = "")
author |
LinkedIn URN of the author. |
text |
Post text. |
image |
Optional file path to an image. |
image_alt |
Alt text for the image. |
LinkedIn post ID (invisibly).
Create a base LinkedIn API request
li_req(endpoint_version = "rest", ...)li_req(endpoint_version = "rest", ...)
endpoint_version |
API version path. Defaults to |
... |
Passed to |
Configured httr2 request.
Get the LinkedIn URN for the authenticated user
li_urn_me()li_urn_me()
URN string like "urn:li:person:abc123".
Load file-path to label mappings
load_labels_config()load_labels_config()
Named list with label mappings.
Load the configured RAG source list
load_rag_sources()load_rag_sources()
List of source specs.
Load PR review rules
load_review_rules()load_review_rules()
Named list with defaults, rules, and naming conventions.
Load teams configuration
load_teams_config()load_teams_config()
Named list with organization, global_team_id, teams, and default_assignees.
Identifies inactive chapters and prepares warning emails for organizers.
prepare_inactivity_emails(chapters, template_path = NULL, dry_run = TRUE)prepare_inactivity_emails(chapters, template_path = NULL, dry_run = TRUE)
chapters |
Chapter status data from |
template_path |
Path to email template. |
dry_run |
If |
Data frame of prepared emails (invisibly).
Matches the JS indexer scheme: first 32 hex chars of
sha256("{repo}|{path}|{chunk_idx}").
rag_chunk_id(repo, path, chunk_idx)rag_chunk_id(repo, path, chunk_idx)
repo |
Source repo (e.g. |
path |
Path within the source (e.g. |
chunk_idx |
Zero-based chunk index within the document. |
32-character hex string.
Gathers chunks from every configured source, embeds them with
Cloudflare Workers AI, and upserts the vectors into a Vectorize
index. The source list is loaded from inst/config/rag-sources.yml
unless sources is supplied directly.
rag_index_build( sources = NULL, account_id = NULL, api_token = Sys.getenv("CLOUDFLARE_API_TOKEN"), index_name = NULL, batch_size = 50L, model = "@cf/baai/bge-base-en-v1.5" )rag_index_build( sources = NULL, account_id = NULL, api_token = Sys.getenv("CLOUDFLARE_API_TOKEN"), index_name = NULL, batch_size = 50L, model = "@cf/baai/bge-base-en-v1.5" )
sources |
Optional list of source specs (see |
account_id |
Cloudflare account ID. Falls back to env
|
api_token |
Cloudflare API token. Defaults to env
|
index_name |
Vectorize index. Defaults to env |
batch_size |
Number of chunks per embed/upsert call. |
model |
Workers AI embedding model. |
Invisibly: list with chunks (total) and upsert (API response).
Select a random emoji
random_emoji()random_emoji()
Single emoji character.
Format a report as markdown
report_format_markdown(report)report_format_markdown(report)
report |
Report data from |
Character string with markdown-formatted report.
Collects stats across org repos: commits, PRs, issues.
report_generate( type = c("weekly", "monthly"), org = "rladies", exclude_pattern = "^meetup-" )report_generate( type = c("weekly", "monthly"), org = "rladies", exclude_pattern = "^meetup-" )
type |
Report type: |
org |
GitHub organization. Defaults to |
exclude_pattern |
Regex to exclude repos. Defaults to |
A named list with report data (invisibly).
Publish a report as a GitHub issue
report_publish(report, target_repo = "global-team", org = "rladies")report_publish(report, target_repo = "global-team", org = "rladies")
report |
Report data from |
target_repo |
Repository to publish to. Defaults to |
org |
Organization. Defaults to |
Issue URL (invisibly).
Validates that changed files follow repository naming conventions.
review_check_pr_naming(owner, repo, pr_number)review_check_pr_naming(owner, repo, pr_number)
owner |
Repository owner. |
repo |
Repository name. |
pr_number |
PR number. |
Data frame with filename and valid columns.
Assigns reviewers, labels the PR, and posts a checklist comment.
review_run(owner, repo, pr_number)review_run(owner, repo, pr_number)
owner |
Repository owner. |
repo |
Repository name. |
pr_number |
Pull request number. |
Invisibly returns NULL. Called for its side effects of
assigning reviewers, labelling the PR, and posting a checklist comment.
Shorten a URL using the Short.io API
short_url(uri)short_url(uri)
uri |
URL to shorten. |
Shortened URL string.
Fetches pending invitees from Airtable and prepares invite emails with a Slack invitation link.
slack_invite_batch( invite_link, base_id = slack_invitees_base_id(), api_key = Sys.getenv("AIRTABLE_API_KEY"), sender_name = "RLadies+ Global", sender_email = "[email protected]", dry_run = TRUE )slack_invite_batch( invite_link, base_id = slack_invitees_base_id(), api_key = Sys.getenv("AIRTABLE_API_KEY"), sender_name = "RLadies+ Global", sender_email = "[email protected]", dry_run = TRUE )
invite_link |
Active Slack invite URL (valid for 30 days). |
base_id |
Airtable base ID for Slack invitees. |
api_key |
Airtable API key. |
sender_name |
Name of the sender. |
sender_email |
Sender email address. |
dry_run |
If |
Data frame of prepared emails (invisibly).
The bot cannot invite users directly (Slack admin scopes are not
available to community apps). Instead, this function posts a
message to an organisers' Slack channel with the email address and
instructions for a workspace admin to action the invite manually,
then flips the matching Airtable record's invited flag for audit.
slack_invite_request( email, channel = Sys.getenv("SLACK_INVITE_REQUEST_CHANNEL"), base_id = slack_invitees_base_id(), api_key = Sys.getenv("AIRTABLE_API_KEY"), token = Sys.getenv("SLACK_TOKEN") )slack_invite_request( email, channel = Sys.getenv("SLACK_INVITE_REQUEST_CHANNEL"), base_id = slack_invitees_base_id(), api_key = Sys.getenv("AIRTABLE_API_KEY"), token = Sys.getenv("SLACK_TOKEN") )
email |
Email address to request an invite for. |
channel |
Slack channel where the request is posted. Defaults
to |
base_id |
Airtable base ID for Slack invitees. |
api_key |
Airtable API key. If unset, the Airtable audit step is skipped. |
token |
Slack bot token ( |
A single status string suitable for posting back as a PR comment.
Sends a markdown-formatted message to the specified Slack channel using the Slack Web API.
slack_post_message(text, channel, token = Sys.getenv("SLACK_TOKEN"))slack_post_message(text, channel, token = Sys.getenv("SLACK_TOKEN"))
text |
Message text (supports Slack mrkdwn formatting). |
channel |
Slack channel name (without #). |
token |
Slack API token. Defaults to |
API response (invisibly).
Posts a /feed subscribe command to the specified Slack channel
using the Slack API.
slack_subscribe_rss( rss_url, channel = "rladiesblogs", token = Sys.getenv("SLACK_TOKEN") )slack_subscribe_rss( rss_url, channel = "rladiesblogs", token = Sys.getenv("SLACK_TOKEN") )
rss_url |
RSS feed URL to subscribe. |
channel |
Slack channel name (without #). Defaults to "rladiesblogs". |
token |
Slack API token. |
API response (invisibly).
Convert tags to hashtag string
tags2hash(tags)tags2hash(tags)
tags |
Character vector of tags. |
Single string with hashtags.
Validate blog entry JSON files against schema
validate_blog_entry( path, schema = system.file("schemas", "blog-entry.json", package = "jinx") )validate_blog_entry( path, schema = system.file("schemas", "blog-entry.json", package = "jinx") )
path |
Path to a directory containing blog JSON files, or a single JSON file path. |
schema |
Path to JSON schema file. Uses the bundled schema by default. |
A data frame with columns file, valid, and errors.
Validate directory entry JSON files against schema
validate_directory_entries( path, schema = system.file("schemas", "directory-entry.json", package = "jinx") )validate_directory_entries( path, schema = system.file("schemas", "directory-entry.json", package = "jinx") )
path |
Path to a directory containing JSON entry files, or a single JSON file path. |
schema |
Path to JSON schema file. Uses the bundled schema by default. |
A data frame with columns file, valid, and errors.
Runs all directory validations (schema, filenames, social handles) on changed files in a PR and posts a summary comment.
validate_directory_pr(owner, repo, pr_number)validate_directory_pr(owner, repo, pr_number)
owner |
Repository owner. |
repo |
Repository name. |
pr_number |
PR number. |
Invisibly returns the URL of the posted PR comment.
Queries the Plausible Analytics API for visitor and pageview metrics.
website_collect_analytics( site_id = Sys.getenv("PLAUSIBLE_SITE_ID"), api_key = Sys.getenv("PLAUSIBLE_API_KEY"), base_url = Sys.getenv("PLAUSIBLE_URL", "https://plausible.io"), period = c("30d", "7d", "month", "6mo", "12mo") )website_collect_analytics( site_id = Sys.getenv("PLAUSIBLE_SITE_ID"), api_key = Sys.getenv("PLAUSIBLE_API_KEY"), base_url = Sys.getenv("PLAUSIBLE_URL", "https://plausible.io"), period = c("30d", "7d", "month", "6mo", "12mo") )
site_id |
Plausible site ID (domain). Defaults to
|
api_key |
Plausible API key. Defaults to
|
base_url |
Plausible instance URL. Defaults to
|
period |
Time period: |
Named list with aggregate, timeseries, top_pages, and
top_sources.
Format website analytics as markdown
website_format_analytics(analytics)website_format_analytics(analytics)
analytics |
Data from |
Formatted markdown string.
Collects Plausible analytics and formats as markdown.
website_generate_report( site_id = Sys.getenv("PLAUSIBLE_SITE_ID"), api_key = Sys.getenv("PLAUSIBLE_API_KEY"), base_url = Sys.getenv("PLAUSIBLE_URL", "https://plausible.io"), period = c("30d", "7d", "month", "6mo", "12mo"), output_path = NULL )website_generate_report( site_id = Sys.getenv("PLAUSIBLE_SITE_ID"), api_key = Sys.getenv("PLAUSIBLE_API_KEY"), base_url = Sys.getenv("PLAUSIBLE_URL", "https://plausible.io"), period = c("30d", "7d", "month", "6mo", "12mo"), output_path = NULL )
site_id |
Plausible site ID (domain). Defaults to
|
api_key |
Plausible API key. Defaults to
|
base_url |
Plausible instance URL. Defaults to
|
period |
Time period: |
output_path |
Optional path to write JSON data. |
Named list with analytics and markdown (invisibly).
Checks open PRs with "pending" label in the website repo. If a blog post's date matches today, merges the PR.
website_merge_pending(org = "rladies", repo = "rladies.github.io")website_merge_pending(org = "rladies", repo = "rladies.github.io")
org |
GitHub organization. |
repo |
Repository name. |
Character vector of merged PR URLs (invisibly).
Publish website analytics as a GitHub issue
website_publish_report( report_data, org = "rladies", target_repo = "global-team", slack_channel = NULL )website_publish_report( report_data, org = "rladies", target_repo = "global-team", slack_channel = NULL )
report_data |
Data from |
org |
GitHub organization. |
target_repo |
Repository to publish to. |
slack_channel |
Optional Slack channel to post a summary to. |
Issue URL (invisibly).