mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2026-03-06 04:32:24 +00:00
Compare commits
2 Commits
master
...
copilot/or
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a9bd7adcb | ||
|
|
2680344850 |
38
.github/CODEOWNERS
vendored
Normal file
38
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
# CODEOWNERS
|
||||
# Defines code ownership for automatic review assignment.
|
||||
# The last matching pattern takes precedence.
|
||||
# See: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
|
||||
|
||||
# Global default — core maintainers review everything
|
||||
* @XRPLF/docs-maintainers
|
||||
|
||||
# Concepts and narrative docs
|
||||
/docs/concepts/ @XRPLF/docs-maintainers
|
||||
|
||||
# Tutorials
|
||||
/docs/tutorials/ @XRPLF/docs-maintainers
|
||||
|
||||
# API reference
|
||||
/docs/references/ @XRPLF/docs-maintainers
|
||||
|
||||
# Infrastructure / node docs
|
||||
/docs/infrastructure/ @XRPLF/docs-maintainers
|
||||
|
||||
# Code samples — require technical review
|
||||
/_code-samples/ @XRPLF/docs-maintainers
|
||||
|
||||
# API examples
|
||||
/_api-examples/ @XRPLF/docs-maintainers
|
||||
|
||||
# Site theme and web tooling
|
||||
/@theme/ @XRPLF/docs-maintainers
|
||||
/styles/ @XRPLF/docs-maintainers
|
||||
|
||||
# Localization files
|
||||
/@l10n/ @XRPLF/docs-maintainers
|
||||
|
||||
# CI/CD and project configuration — maintainer-only
|
||||
/.github/ @XRPLF/docs-maintainers
|
||||
/redocly.yaml @XRPLF/docs-maintainers
|
||||
/package.json @XRPLF/docs-maintainers
|
||||
/package-lock.json @XRPLF/docs-maintainers
|
||||
67
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
67
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
name: "Bug Report"
|
||||
description: Report a typo, broken link, incorrect information, or other documentation error
|
||||
title: "[Bug]: "
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for helping improve the XRP Ledger documentation! Please fill out this form as completely as possible.
|
||||
|
||||
- type: input
|
||||
id: page-url
|
||||
attributes:
|
||||
label: Affected Page URL
|
||||
description: The URL of the page with the issue (e.g. https://xrpl.org/docs/...)
|
||||
placeholder: "https://xrpl.org/docs/..."
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: bug-type
|
||||
attributes:
|
||||
label: Type of Issue
|
||||
description: What kind of problem did you find?
|
||||
options:
|
||||
- Typo or grammar error
|
||||
- Broken or incorrect link
|
||||
- Incorrect technical information
|
||||
- Outdated content
|
||||
- Missing content
|
||||
- Formatting or display issue
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: Describe the problem clearly. Include what is wrong and what it should say instead.
|
||||
placeholder: "The page states X, but it should say Y because..."
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: Expected Content
|
||||
description: What should the correct content say?
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: input
|
||||
id: source-reference
|
||||
attributes:
|
||||
label: Source Reference (optional)
|
||||
description: Link to source code, specification, or other reference that confirms the correct information
|
||||
placeholder: "https://github.com/XRPLF/rippled/..."
|
||||
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: Checklist
|
||||
options:
|
||||
- label: I have searched existing issues to confirm this has not already been reported
|
||||
required: true
|
||||
- label: I have verified this issue exists on the live site (not just locally)
|
||||
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: XRP Ledger Developer Discord
|
||||
url: https://discord.gg/xrpl
|
||||
about: Ask questions and discuss XRP Ledger development with the community
|
||||
- name: XRPL.org Feedback
|
||||
url: https://xrpl.org/about/contact
|
||||
about: General feedback about the XRP Ledger portal
|
||||
86
.github/ISSUE_TEMPLATE/content_update.yml
vendored
Normal file
86
.github/ISSUE_TEMPLATE/content_update.yml
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
name: "Content Update"
|
||||
description: Request an update, addition, or improvement to existing documentation
|
||||
title: "[Content]: "
|
||||
labels: ["content updates"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Use this template to request changes to existing documentation content — for example, adding new details, updating outdated information, or improving clarity.
|
||||
|
||||
- type: input
|
||||
id: page-url
|
||||
attributes:
|
||||
label: Affected Page URL
|
||||
description: URL of the page that needs updating (if applicable)
|
||||
placeholder: "https://xrpl.org/docs/..."
|
||||
|
||||
- type: dropdown
|
||||
id: update-type
|
||||
attributes:
|
||||
label: Type of Update
|
||||
options:
|
||||
- Add missing information
|
||||
- Update outdated content
|
||||
- Improve clarity or readability
|
||||
- Reorganize or restructure content
|
||||
- Add examples or code samples
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
id: content-area
|
||||
attributes:
|
||||
label: Content Area
|
||||
description: Which area of the documentation does this affect?
|
||||
options:
|
||||
- Concepts
|
||||
- Tutorials
|
||||
- References / API
|
||||
- Infrastructure / Nodes
|
||||
- Tokenization / NFTs
|
||||
- DEX / AMM
|
||||
- Payment Channels / Escrow
|
||||
- Accounts / Wallets
|
||||
- Localization / Translation
|
||||
- Site tooling
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
description: Describe what needs to be changed and why. Be as specific as possible.
|
||||
placeholder: "The documentation for X needs to be updated because..."
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: source-reference
|
||||
attributes:
|
||||
label: Source / Reference
|
||||
description: Link to the rippled source, amendment details, XLS proposal, or other authoritative reference
|
||||
placeholder: "https://github.com/XRPLF/rippled/..."
|
||||
|
||||
- type: dropdown
|
||||
id: amendment-status
|
||||
attributes:
|
||||
label: Amendment Status (if applicable)
|
||||
description: If this relates to a protocol amendment, what is its status?
|
||||
options:
|
||||
- "N/A"
|
||||
- In development (not yet proposed)
|
||||
- Proposed (in open voting)
|
||||
- Enabled on Mainnet
|
||||
- Enabled on Devnet/Testnet only
|
||||
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: Checklist
|
||||
options:
|
||||
- label: I have searched existing issues to avoid duplicates
|
||||
required: true
|
||||
66
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
66
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
name: "Feature Request"
|
||||
description: Suggest a new page, section, tool, or site feature
|
||||
title: "[Feature]: "
|
||||
labels: ["enhancement"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Use this template to suggest a new documentation page, site feature, or tooling improvement for the XRP Ledger Developer Portal.
|
||||
|
||||
- type: dropdown
|
||||
id: feature-type
|
||||
attributes:
|
||||
label: Feature Type
|
||||
options:
|
||||
- New documentation page or section
|
||||
- New interactive tool or code sample
|
||||
- Site navigation or UX improvement
|
||||
- Developer tooling or CI/CD improvement
|
||||
- Localization support
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: Problem to Solve
|
||||
description: Describe the problem or gap this feature would address. Who would benefit?
|
||||
placeholder: "As a developer building on the XRP Ledger, I need..."
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: solution
|
||||
attributes:
|
||||
label: Proposed Solution
|
||||
description: Describe what you'd like to see added or changed.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: Alternatives Considered
|
||||
description: Have you considered any alternative approaches?
|
||||
|
||||
- type: dropdown
|
||||
id: priority
|
||||
attributes:
|
||||
label: Priority (your assessment)
|
||||
options:
|
||||
- Low – nice to have
|
||||
- Medium – would significantly improve the docs
|
||||
- High – blocks common developer workflows
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: checklist
|
||||
attributes:
|
||||
label: Checklist
|
||||
options:
|
||||
- label: I have searched existing issues to avoid duplicates
|
||||
required: true
|
||||
- label: I am willing to contribute a PR for this feature
|
||||
52
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
52
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
## Description
|
||||
|
||||
<!-- Provide a clear, concise description of what this PR does. -->
|
||||
|
||||
Fixes #<!-- issue number -->
|
||||
|
||||
## Type of Change
|
||||
|
||||
<!-- Check all that apply -->
|
||||
- [ ] Bug fix (documentation typo, broken link, incorrect information)
|
||||
- [ ] Content update (new information, updated existing docs)
|
||||
- [ ] New page or section
|
||||
- [ ] Site feature / tooling change
|
||||
- [ ] Localization / translation
|
||||
- [ ] Refactoring (no functional change)
|
||||
|
||||
## RACI Confirmation
|
||||
|
||||
This project follows a RACI model for contributions. Please confirm the following:
|
||||
|
||||
| Role | Description | Confirmed |
|
||||
|------|-------------|-----------|
|
||||
| **R – Responsible** | I am the author of these changes and have completed the work described above | - [ ] |
|
||||
| **A – Accountable** | I understand that a maintainer must approve this PR before it can be merged | - [ ] |
|
||||
| **C – Consulted** | I have tagged relevant subject-matter experts as reviewers (if applicable) | - [ ] |
|
||||
| **I – Informed** | The linked issue keeps stakeholders informed of this change | - [ ] |
|
||||
|
||||
> See [RACI Model](.github/project-management/RACI.md) for full role definitions.
|
||||
|
||||
## Review Checklist
|
||||
|
||||
**Author (Responsible)**
|
||||
- [ ] PR is linked to an open issue
|
||||
- [ ] Changes are accurate and technically correct
|
||||
- [ ] Content follows the [style guide](https://xrpl.org/resources/contribute-documentation/)
|
||||
- [ ] All links work and point to correct targets
|
||||
- [ ] Code samples (if any) have been tested
|
||||
- [ ] Localization impact considered (does this need translation updates?)
|
||||
|
||||
**Reviewer (Accountable / Consulted)**
|
||||
- [ ] Technical accuracy verified
|
||||
- [ ] Writing is clear and follows style guidelines
|
||||
- [ ] No broken links or missing references
|
||||
- [ ] No security-sensitive information inadvertently exposed
|
||||
|
||||
## Screenshots (if applicable)
|
||||
|
||||
<!-- Add before/after screenshots for UI or formatting changes -->
|
||||
|
||||
## Additional Notes
|
||||
|
||||
<!-- Any context, decisions made, or follow-up items -->
|
||||
80
.github/labeler.yml
vendored
Normal file
80
.github/labeler.yml
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
# Auto-labeler configuration for pull_request_target events.
|
||||
# Labels are applied based on which files are changed in the PR.
|
||||
# See: https://github.com/actions/labeler
|
||||
|
||||
"content updates":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "docs/**/*.md"
|
||||
- "docs/**/*.mdx"
|
||||
- "docs/**/*.page.tsx"
|
||||
|
||||
"web dev":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "@theme/**"
|
||||
- "styles/**"
|
||||
- "*.tsx"
|
||||
- "*.ts"
|
||||
- "shared/**"
|
||||
|
||||
"docs-tooling":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- ".github/**"
|
||||
- "redocly.yaml"
|
||||
- "package.json"
|
||||
- "package-lock.json"
|
||||
- "tsconfig.json"
|
||||
- "sidebars.yaml"
|
||||
- "redirects.yaml"
|
||||
|
||||
"localization":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "@l10n/**"
|
||||
- "translations.yaml"
|
||||
- "**/*.ja.md"
|
||||
- "**/*.es-ES.md"
|
||||
|
||||
"javascript":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "_code-samples/**/*.js"
|
||||
- "_code-samples/**/*.mjs"
|
||||
- "_code-samples/**/*.cjs"
|
||||
- "docs/tutorials/**/*javascript*"
|
||||
- "docs/tutorials/**/*js*"
|
||||
|
||||
"python":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "_code-samples/**/*.py"
|
||||
- "docs/tutorials/**/*python*"
|
||||
|
||||
"java":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "_code-samples/**/*.java"
|
||||
- "docs/tutorials/**/*java*"
|
||||
|
||||
"tokenization":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "docs/**/*nft*"
|
||||
- "docs/**/*token*"
|
||||
- "docs/**/*fungible*"
|
||||
- "docs/tutorials/nfts/**"
|
||||
- "docs/concepts/tokens/**"
|
||||
|
||||
"infra":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "docs/infrastructure/**"
|
||||
|
||||
"organization":
|
||||
- changed-files:
|
||||
- any-glob-to-any-file:
|
||||
- "sidebars.yaml"
|
||||
- "top-nav.yaml"
|
||||
- "redirects.yaml"
|
||||
179
.github/project-management/RACI.md
vendored
Normal file
179
.github/project-management/RACI.md
vendored
Normal file
@@ -0,0 +1,179 @@
|
||||
# RACI Model — XRP Ledger Developer Portal
|
||||
|
||||
This document defines the **RACI model** used to manage contributions to the XRP Ledger Developer Portal. RACI ensures every task has clear ownership, appropriate oversight, and proper communication for all stakeholders.
|
||||
|
||||
---
|
||||
|
||||
## What is RACI?
|
||||
|
||||
| Letter | Role | Description |
|
||||
|--------|------|-------------|
|
||||
| **R** | **Responsible** | The person who does the work. Every issue and PR must have exactly one responsible party. |
|
||||
| **A** | **Accountable** | The person ultimately answerable for the outcome. Must approve work before it is merged. There is always exactly one accountable person per change. |
|
||||
| **C** | **Consulted** | Subject-matter experts whose input is needed before or during the work. Two-way communication. |
|
||||
| **I** | **Informed** | Stakeholders kept up to date on decisions and outcomes. One-way communication. |
|
||||
|
||||
---
|
||||
|
||||
## Role Mapping for This Project
|
||||
|
||||
### R – Responsible (Contributors)
|
||||
|
||||
- **Community contributors** — anyone opening issues or submitting PRs
|
||||
- **Assigned issue owners** — maintainers or contributors assigned to an issue
|
||||
- Responsible parties create PRs, write content, and address review feedback
|
||||
- A single contributor should be assigned `Responsible` per issue/PR
|
||||
|
||||
### A – Accountable (Maintainers / CODEOWNERS)
|
||||
|
||||
- The **`@XRPLF/docs-maintainers`** team is accountable for all merged changes
|
||||
- Enforced via [CODEOWNERS](../CODEOWNERS): every PR requires at least **one approval** from a code owner before it can be merged
|
||||
- Maintainers may delegate review to subject-matter experts (Consulted) but remain accountable for the final merge decision
|
||||
- Branch protection rules require:
|
||||
- ✅ At least **1 approving review** from a CODEOWNER
|
||||
- ✅ All **status checks pass** (CI workflows)
|
||||
- ✅ **No unresolved conversations**
|
||||
|
||||
### C – Consulted (Subject-Matter Experts)
|
||||
|
||||
Depending on the content area, the relevant experts should be tagged as reviewers:
|
||||
|
||||
| Content Area | Who to Consult |
|
||||
|---|---|
|
||||
| Protocol / core XRP Ledger mechanics | Protocol engineers (`@XRPLF/rippled` team members) |
|
||||
| Smart contracts / Hooks | Hooks developers |
|
||||
| NFT / tokenization | Tokenization working group |
|
||||
| AMM / DeFi | DeFi working group |
|
||||
| Client libraries (xrpl.js, xrpl-py, xrpl4j) | Respective library maintainers |
|
||||
| Localization | Translation contributors for the target language |
|
||||
| Site tooling / Redocly | Redocly configuration owners |
|
||||
|
||||
Tag SMEs using `@username` in PR descriptions or inline review comments.
|
||||
|
||||
### I – Informed (Stakeholders)
|
||||
|
||||
The following parties are automatically informed via GitHub notifications:
|
||||
|
||||
- **Issue reporters** — notified of comments and resolution
|
||||
- **PR watchers** — subscribed to PR updates
|
||||
- **Repository watchers** — receive notifications for all activity
|
||||
- **Linked issues** — cross-referenced via `Fixes #<number>` in PR descriptions
|
||||
|
||||
---
|
||||
|
||||
## RACI by Activity Type
|
||||
|
||||
| Activity | R (Does the Work) | A (Approves) | C (Consulted) | I (Informed) |
|
||||
|---|---|---|---|---|
|
||||
| Report a bug or issue | Community contributor | Maintainer (triage) | — | Repo watchers |
|
||||
| Fix a documentation bug | Community contributor / Maintainer | CODEOWNER | SME if technical | Issue reporter |
|
||||
| Write a new doc page | Assigned contributor | CODEOWNER | Protocol SME + Tech writer | Community |
|
||||
| Update API reference | Assigned contributor | CODEOWNER | Protocol engineer | Developers |
|
||||
| Add/update code sample | Contributor | CODEOWNER | Library maintainer | Developers |
|
||||
| Merge a PR | — | CODEOWNER | — | PR author, watchers |
|
||||
| Triage issues | Maintainer | Lead maintainer | — | Issue reporter |
|
||||
| Release / deploy | CI/CD (automated) | Lead maintainer | — | Stakeholders |
|
||||
| Update site tooling | Maintainer | CODEOWNER | Redocly config owner | All contributors |
|
||||
|
||||
---
|
||||
|
||||
## Workflow Summary
|
||||
|
||||
```
|
||||
Community Contributor (R)
|
||||
│
|
||||
├─ Opens Issue ──────────────────────► Auto-triage labels applied
|
||||
│ Maintainer triages & prioritizes
|
||||
│
|
||||
└─ Opens Pull Request ────────────────► PR Validation check runs
|
||||
│ Auto-labels applied
|
||||
│ Greeting for new contributors
|
||||
│
|
||||
├─ Tags SME reviewers (C) ───────► SMEs leave review comments
|
||||
│
|
||||
└─ Maintainer reviews (A) ───────► Approves or requests changes
|
||||
│
|
||||
└─ All checks pass ─────────► PR merged by Accountable maintainer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Project Board
|
||||
|
||||
The XRP Ledger Developer Portal uses a **GitHub Project board** to track issue and PR status. The board has the following columns:
|
||||
|
||||
| Column | Description |
|
||||
|---|---|
|
||||
| **📋 Backlog** | Issues that are accepted but not yet scheduled |
|
||||
| **🔍 Needs Triage** | New issues awaiting maintainer review |
|
||||
| **📅 Planned** | Issues scheduled for an upcoming milestone |
|
||||
| **🚧 In Progress** | Issues with a linked open PR or active assignee |
|
||||
| **👀 In Review** | PRs awaiting review or with pending change requests |
|
||||
| **✅ Done** | Merged PRs and closed issues |
|
||||
|
||||
> **Setup**: Maintainers can create and configure the board at:
|
||||
> [organization-level project](https://github.com/orgs/XRPLF/projects)
|
||||
> or
|
||||
> [repository-level project](https://github.com/XRPLF/xrpl-dev-portal/projects)
|
||||
|
||||
### Automation Rules (configure in GitHub Projects)
|
||||
|
||||
- **Issue opened** → Move to _Needs Triage_
|
||||
- **Label `stale` added** → Move to _Backlog_
|
||||
- **PR opened / linked to issue** → Move issue to _In Progress_
|
||||
- **PR review requested** → Move PR to _In Review_
|
||||
- **PR merged** → Move to _Done_ and close linked issue
|
||||
- **Issue closed** → Move to _Done_
|
||||
|
||||
---
|
||||
|
||||
## Branch Protection Requirements
|
||||
|
||||
To enforce the "at least one human review" requirement, configure branch protection on `master`:
|
||||
|
||||
1. Go to **Settings → Branches → Branch protection rules**
|
||||
2. Add a rule for `master` (or your default branch)
|
||||
3. Enable:
|
||||
- ✅ **Require a pull request before merging**
|
||||
- ✅ **Require approvals** — set to **1** (minimum)
|
||||
- ✅ **Require review from Code Owners** (enforces CODEOWNERS file)
|
||||
- ✅ **Require status checks to pass before merging**
|
||||
- Add: `validate-pr` (from `pr-check.yml`)
|
||||
- ✅ **Require conversation resolution before merging**
|
||||
- ✅ **Do not allow bypassing the above settings** (for non-admins)
|
||||
|
||||
---
|
||||
|
||||
## Labels Reference
|
||||
|
||||
| Label | Description | Who Applies |
|
||||
|---|---|---|
|
||||
| `bug` | Typo, broken link, or incorrect info | Auto-triage / contributor |
|
||||
| `content updates` | Updates to existing documentation | Auto-triage / maintainer |
|
||||
| `enhancement` | New pages or features | Auto-triage / maintainer |
|
||||
| `good first issue` | Suitable for new contributors | Maintainer |
|
||||
| `help wanted` | Community contributions welcome | Maintainer |
|
||||
| `needs triage` | Awaiting maintainer review | Auto-triage |
|
||||
| `stale` | No activity for 90+ days | Stale bot |
|
||||
| `wip` | Work in progress, not ready for review | Contributor |
|
||||
| `tokenization` | NFT/token-related content | Auto-triage |
|
||||
| `infra` | Validator/node/server content | Auto-triage |
|
||||
| `web dev` | Site tooling, styles, templates | Auto-triage |
|
||||
| `organization` | Navigation, structure, architecture | Auto-triage |
|
||||
| `docs-tooling` | CI/CD, build tooling | Auto-triage |
|
||||
| `localization` | Translation and i18n | Auto-triage |
|
||||
| `javascript` | JavaScript code samples/tutorials | Auto-triage |
|
||||
| `python` | Python code samples/tutorials | Auto-triage |
|
||||
|
||||
---
|
||||
|
||||
## Contributing Quick Reference
|
||||
|
||||
1. **Find an issue** — Browse the [project board](https://github.com/XRPLF/xrpl-dev-portal/issues) or open a new one using a template
|
||||
2. **Assign yourself** — Comment "I'll work on this" or ask a maintainer to assign you
|
||||
3. **Fork & branch** — Create a branch from `master`
|
||||
4. **Make changes** — Follow the [style guide](https://xrpl.org/resources/contribute-documentation/)
|
||||
5. **Open a PR** — Fill out the PR template completely, including RACI confirmation
|
||||
6. **Tag reviewers** — Add SMEs as reviewers for technical accuracy
|
||||
7. **Address feedback** — Respond to review comments and push updates
|
||||
8. **Merge** — A maintainer (Accountable) will merge once all checks pass
|
||||
19
.github/workflows/auto-label.yml
vendored
Normal file
19
.github/workflows/auto-label.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
name: Auto-Label Pull Requests
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
label:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@v5
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
configuration-path: .github/labeler.yml
|
||||
sync-labels: true
|
||||
92
.github/workflows/greet-contributor.yml
vendored
Normal file
92
.github/workflows/greet-contributor.yml
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
name: Greet New Contributors
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
greet:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Greet first-time issue reporter
|
||||
if: github.event_name == 'issues'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const creator = context.payload.issue.user.login;
|
||||
|
||||
// Check if this is their first issue in the repo
|
||||
const { data: issues } = await github.rest.issues.listForRepo({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
creator: creator,
|
||||
state: 'all',
|
||||
});
|
||||
|
||||
// If only 1 issue exists, it's the one they just opened
|
||||
if (issues.length <= 1) {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.payload.issue.number,
|
||||
body: [
|
||||
`👋 Welcome to the XRP Ledger Developer Portal, @${creator}! Thanks for opening your first issue.`,
|
||||
'',
|
||||
'Here are a few things to know:',
|
||||
'- A maintainer will triage this issue and add appropriate labels',
|
||||
'- If you\'d like to fix this yourself, check out our [Contributing Guide](https://xrpl.org/resources/contribute-documentation/)',
|
||||
'- Join the conversation on [XRPL Discord](https://discord.gg/xrpl) if you have questions',
|
||||
'',
|
||||
'We appreciate your contribution to the XRP Ledger community! 🚀',
|
||||
].join('\n'),
|
||||
});
|
||||
}
|
||||
|
||||
- name: Greet first-time PR contributor
|
||||
if: github.event_name == 'pull_request_target'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const creator = context.payload.pull_request.user.login;
|
||||
|
||||
// Check previous merged PRs from this user
|
||||
const { data: prs } = await github.rest.pulls.list({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
state: 'all',
|
||||
});
|
||||
|
||||
const userPRs = prs.filter(pr => pr.user.login === creator);
|
||||
|
||||
// If this is their first PR
|
||||
if (userPRs.length <= 1) {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.payload.pull_request.number,
|
||||
body: [
|
||||
`🎉 Welcome, @${creator}! Thanks for submitting your first pull request to the XRP Ledger Developer Portal.`,
|
||||
'',
|
||||
'Here\'s what happens next:',
|
||||
'1. 🔍 Automated checks will run on your PR',
|
||||
'2. 👀 A maintainer will review your changes (this may take a few days)',
|
||||
'3. 💬 You may receive feedback or requests for changes',
|
||||
'4. ✅ Once approved by a maintainer, your PR will be merged',
|
||||
'',
|
||||
'Please make sure your PR:',
|
||||
'- Has a clear description of what was changed and why',
|
||||
'- Is linked to an open issue (e.g. `Fixes #123`)',
|
||||
'- Follows our [style guide](https://xrpl.org/resources/contribute-documentation/)',
|
||||
'',
|
||||
'Thank you for contributing to the XRP Ledger community! 🙏',
|
||||
].join('\n'),
|
||||
});
|
||||
}
|
||||
97
.github/workflows/issue-triage.yml
vendored
Normal file
97
.github/workflows/issue-triage.yml
vendored
Normal file
@@ -0,0 +1,97 @@
|
||||
name: Issue Triage
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened, reopened]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
jobs:
|
||||
triage:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Auto-label based on issue title and body
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const issue = context.payload.issue;
|
||||
const title = (issue.title || '').toLowerCase();
|
||||
const body = (issue.body || '').toLowerCase();
|
||||
const text = title + ' ' + body;
|
||||
const labelsToAdd = new Set();
|
||||
|
||||
// --- keyword → label mapping ---
|
||||
const rules = [
|
||||
// Content areas
|
||||
{ patterns: ['nft', 'nonfungible', 'non-fungible', 'token', 'mpt', 'fungible'], label: 'tokenization' },
|
||||
{ patterns: ['amm', 'dex', 'offer', 'liquidity', 'pool'], label: 'defi' },
|
||||
{ patterns: ['escrow', 'payment channel', 'check'], label: 'content updates' },
|
||||
{ patterns: ['tutorial', 'how to', 'how-to', 'walkthrough', 'guide'], label: 'content updates' },
|
||||
{ patterns: ['api', 'rpc', 'websocket', 'method', 'command', 'response field'], label: 'content updates' },
|
||||
{ patterns: ['amendment', 'feature flag'], label: 'content updates' },
|
||||
{ patterns: ['rippled', 'validator', 'node', 'server', 'peer'], label: 'infra' },
|
||||
{ patterns: ['javascript', 'js ', 'node.js', 'typescript'], label: 'javascript' },
|
||||
{ patterns: ['python'], label: 'python' },
|
||||
{ patterns: ['java', 'xrpl4j'], label: 'java' },
|
||||
{ patterns: ['navigate', 'menu', 'sidebar', 'landing page', 'homepage'], label: 'organization' },
|
||||
{ patterns: ['style', 'css', 'layout', 'theme', 'mobile', 'responsive'], label: 'web dev' },
|
||||
{ patterns: ['translate', 'translation', 'locali', 'japanese', 'spanish'], label: 'localization' },
|
||||
{ patterns: ['broken link', 'dead link', '404 error', 'page not found', 'typo', 'grammar', 'spelling'], label: 'bug' },
|
||||
{ patterns: ['redocly', 'build', 'ci ', 'ci/', 'workflow', 'lint', 'tooling'], label: 'docs-tooling' },
|
||||
];
|
||||
|
||||
for (const rule of rules) {
|
||||
if (rule.patterns.some(p => text.includes(p))) {
|
||||
labelsToAdd.add(rule.label);
|
||||
}
|
||||
}
|
||||
|
||||
// If no labels matched, add 'needs triage' so maintainers notice it
|
||||
if (labelsToAdd.size === 0) {
|
||||
labelsToAdd.add('needs triage');
|
||||
}
|
||||
|
||||
const existingLabels = (issue.labels || []).map(l => l.name);
|
||||
const newLabels = [...labelsToAdd].filter(l => !existingLabels.includes(l));
|
||||
|
||||
if (newLabels.length > 0) {
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
labels: newLabels,
|
||||
});
|
||||
console.log(`Added labels: ${newLabels.join(', ')}`);
|
||||
} else {
|
||||
console.log('No new labels to add.');
|
||||
}
|
||||
|
||||
- name: Request triage for unlabeled issues
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const issue = context.payload.issue;
|
||||
const labels = (issue.labels || []).map(l => l.name);
|
||||
|
||||
// If the only label is 'needs triage', add a comment directing maintainers
|
||||
if (labels.length === 1 && labels[0] === 'needs triage') {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
body: [
|
||||
'👋 Thanks for opening this issue!',
|
||||
'',
|
||||
'This issue has been flagged for **maintainer triage** because it could not be automatically categorized.',
|
||||
'A maintainer will review it shortly to add labels and assess priority.',
|
||||
'',
|
||||
'In the meantime, you can help by:',
|
||||
'- Making sure the issue title clearly describes the problem',
|
||||
'- Adding a link to the affected page (for documentation issues)',
|
||||
'- Providing a reference to source code or specs (for technical accuracy issues)',
|
||||
].join('\n'),
|
||||
});
|
||||
}
|
||||
95
.github/workflows/pr-check.yml
vendored
Normal file
95
.github/workflows/pr-check.yml
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
name: PR Validation
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, edited, synchronize, reopened]
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
issues: read
|
||||
|
||||
jobs:
|
||||
validate-pr:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Validate PR description and linked issue
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const pr = context.payload.pull_request;
|
||||
const body = pr.body || '';
|
||||
const title = pr.title || '';
|
||||
const warnings = [];
|
||||
const errors = [];
|
||||
|
||||
// 1. PR must have a non-trivial description
|
||||
const descriptionSection = body.replace(/<!--[\s\S]*?-->/g, '').trim();
|
||||
if (descriptionSection.length < 30) {
|
||||
errors.push('❌ **Missing description**: Please provide a clear description of what this PR changes and why.');
|
||||
}
|
||||
|
||||
// 2. PR should reference an issue (Fixes/Closes/Resolves #N or mention #N)
|
||||
const issueRef = /(?:fix(?:es|ed)?|close[sd]?|resolve[sd]?)\s+#\d+|#\d+/i.test(body);
|
||||
if (!issueRef) {
|
||||
warnings.push('⚠️ **No linked issue detected**: Consider linking this PR to an issue using `Fixes #<number>` so progress is tracked on the project board.');
|
||||
}
|
||||
|
||||
// 3. RACI table must have at least Responsible checked
|
||||
// Simple check: if the RACI section exists, at least one checkbox should be filled
|
||||
if (body.includes('RACI') && !/- \[x\]/i.test(body)) {
|
||||
warnings.push('⚠️ **RACI checklist incomplete**: Please tick the checkboxes in the RACI Confirmation table.');
|
||||
}
|
||||
|
||||
// 4. Draft PRs skip hard errors
|
||||
const isDraft = pr.draft;
|
||||
|
||||
// Post a review comment only if there are issues
|
||||
if (errors.length > 0 || warnings.length > 0) {
|
||||
const lines = [
|
||||
'## 🤖 PR Validation Report',
|
||||
'',
|
||||
...errors,
|
||||
...warnings,
|
||||
'',
|
||||
isDraft ? '_This is a draft PR — errors above will need to be resolved before requesting review._'
|
||||
: '_Please address the items above before requesting a maintainer review._',
|
||||
'',
|
||||
'---',
|
||||
'_This comment is generated automatically. See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines._',
|
||||
];
|
||||
|
||||
// Check if we already posted a validation comment so we update rather than duplicate
|
||||
const { data: comments } = await github.rest.issues.listComments({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: pr.number,
|
||||
});
|
||||
|
||||
const botComment = comments.find(c =>
|
||||
c.user.type === 'Bot' && c.body.includes('PR Validation Report')
|
||||
);
|
||||
|
||||
const commentBody = lines.join('\n');
|
||||
|
||||
if (botComment) {
|
||||
await github.rest.issues.updateComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
comment_id: botComment.id,
|
||||
body: commentBody,
|
||||
});
|
||||
} else {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: pr.number,
|
||||
body: commentBody,
|
||||
});
|
||||
}
|
||||
|
||||
// Fail the check if there are hard errors and this is not a draft
|
||||
if (errors.length > 0 && !isDraft) {
|
||||
core.setFailed(`PR validation failed: ${errors.join(' | ')}`);
|
||||
}
|
||||
}
|
||||
73
.github/workflows/stale.yml
vendored
Normal file
73
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
name: Stale Issue & PR Management
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Runs daily at 01:00 UTC
|
||||
- cron: "0 1 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# ── Issues ────────────────────────────────────────────────────────
|
||||
days-before-issue-stale: 90
|
||||
days-before-issue-close: 14
|
||||
stale-issue-label: "stale"
|
||||
stale-issue-message: >
|
||||
This issue has been open for 90 days with no recent activity.
|
||||
It will be closed in 14 days unless someone comments or removes
|
||||
the `stale` label.
|
||||
|
||||
If this issue is still relevant, please:
|
||||
- Leave a comment with an update
|
||||
- Remove the `stale` label if you plan to work on it
|
||||
- Link it to an open PR if work is already in progress
|
||||
|
||||
close-issue-message: >
|
||||
This issue was closed due to inactivity (90 + 14 days).
|
||||
If you believe it is still relevant, please open a new issue
|
||||
and reference this one.
|
||||
|
||||
# Issues with these labels are never marked stale
|
||||
exempt-issue-labels: >
|
||||
pinned,
|
||||
security,
|
||||
good first issue,
|
||||
help wanted
|
||||
|
||||
# ── Pull Requests ─────────────────────────────────────────────────
|
||||
days-before-pr-stale: 30
|
||||
days-before-pr-close: 7
|
||||
stale-pr-label: "stale"
|
||||
stale-pr-message: >
|
||||
This pull request has been open for 30 days with no recent activity.
|
||||
It will be closed in 7 days unless there is new activity.
|
||||
|
||||
If this PR is still in progress:
|
||||
- Push an update or leave a comment
|
||||
- Remove the `stale` label to reset the timer
|
||||
|
||||
close-pr-message: >
|
||||
This pull request was closed due to inactivity (30 + 7 days).
|
||||
The branch has been preserved. Please open a new PR if you
|
||||
wish to continue this work.
|
||||
|
||||
exempt-pr-labels: >
|
||||
pinned,
|
||||
security,
|
||||
work in progress,
|
||||
wip
|
||||
|
||||
# Keep the stale label when the issue/PR becomes active again
|
||||
remove-stale-when-updated: true
|
||||
# Only count non-bot comments as activity
|
||||
operations-per-run: 100
|
||||
@@ -1,3 +1,32 @@
|
||||
# Contributing
|
||||
|
||||
For information about how to contribute to this repository, see [Contribute Documentation (XRPL.org)](https://xrpl.org/resources/contribute-documentation/).
|
||||
For information about how to contribute to this repository, see [Contribute Documentation (XRPL.org)](https://xrpl.org/resources/contribute-documentation/).
|
||||
|
||||
## Quick Start
|
||||
|
||||
1. **Report an issue** — Use one of the [issue templates](.github/ISSUE_TEMPLATE/) to report bugs, request content updates, or suggest new features.
|
||||
2. **Work on an issue** — Browse [open issues](https://github.com/XRPLF/xrpl-dev-portal/issues) with the `good first issue` or `help wanted` labels.
|
||||
3. **Submit a pull request** — Fill out the [PR template](.github/PULL_REQUEST_TEMPLATE.md) completely, including linking to the issue you are addressing.
|
||||
|
||||
## Review Process (RACI Model)
|
||||
|
||||
This project follows a [RACI model](.github/project-management/RACI.md) to manage contributions:
|
||||
|
||||
- **R – Responsible**: The contributor who authors the change
|
||||
- **A – Accountable**: A maintainer from `@XRPLF/docs-maintainers` who approves and merges
|
||||
- **C – Consulted**: Subject-matter experts tagged as reviewers for technical accuracy
|
||||
- **I – Informed**: Stakeholders notified via linked issues and PR comments
|
||||
|
||||
**At least one maintainer approval is required before any PR can be merged.**
|
||||
|
||||
## Automated Workflows
|
||||
|
||||
The following GitHub Actions workflows run automatically:
|
||||
|
||||
| Workflow | Trigger | Purpose |
|
||||
|---|---|---|
|
||||
| Issue Triage | New issue opened | Applies labels based on content |
|
||||
| PR Validation | PR opened/updated | Validates description and linked issue |
|
||||
| Auto-Label | PR opened/updated | Labels PRs based on changed file paths |
|
||||
| Stale Management | Daily | Marks and closes inactive issues/PRs |
|
||||
| Greet Contributor | First issue/PR | Welcomes new contributors |
|
||||
Reference in New Issue
Block a user