Skip to content

Commit f6cf379

Browse files
committed
chore: add governance and validation workflows
1 parent bbcd90e commit f6cf379

13 files changed

Lines changed: 793 additions & 0 deletions

.github/CODEOWNERS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Default review owner
2+
* @xxg1413
3+
4+
# Release, governance, and catalog policy require maintainer review.
5+
/.github/ @xxg1413
6+
/docs/CURATION_POLICY.md @xxg1413
7+
/_data/ @xxg1413
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
name: Broken or moved link
2+
description: Report a catalog URL that is permanently unavailable or has moved.
3+
title: "[Broken link]: "
4+
labels:
5+
- broken-link
6+
body:
7+
- type: markdown
8+
attributes:
9+
value: |
10+
A single 403, 429, timeout, or transient 5xx does not prove a resource is broken. Include repeatable evidence so maintainers can distinguish blocking and rate limiting from removal.
11+
- type: input
12+
id: page
13+
attributes:
14+
label: FlyPython page or catalog ID
15+
placeholder: ai-agents / openai-agents-sdk
16+
validations:
17+
required: true
18+
- type: input
19+
id: url
20+
attributes:
21+
label: Affected URL
22+
placeholder: https://example.org/old-page
23+
validations:
24+
required: true
25+
- type: input
26+
id: observed-on
27+
attributes:
28+
label: Observation date
29+
description: Use YYYY-MM-DD.
30+
placeholder: "2026-08-31"
31+
validations:
32+
required: true
33+
- type: dropdown
34+
id: result
35+
attributes:
36+
label: Observed result
37+
options:
38+
- 404 Not Found
39+
- 410 Gone
40+
- Redirects to unrelated content
41+
- DNS or TLS failure
42+
- 403 Forbidden
43+
- 429 Too Many Requests
44+
- Timeout or 5xx
45+
- Other
46+
validations:
47+
required: true
48+
- type: textarea
49+
id: evidence
50+
attributes:
51+
label: Reproduction and evidence
52+
description: Include what you tried, whether it reproduced, and any final redirect URL. Do not include cookies, tokens, or personal data.
53+
validations:
54+
required: true
55+
- type: input
56+
id: replacement
57+
attributes:
58+
label: Official replacement URL
59+
description: Optional. Provide only a canonical replacement from the same publisher or project.
60+
- type: checkboxes
61+
id: confirmation
62+
attributes:
63+
label: Confirmation
64+
options:
65+
- label: I checked that this report does not expose a credential or security vulnerability.
66+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Python learning questions and discussion
4+
url: https://github.com/flypythoncom/python/discussions
5+
about: Ask for learning advice, compare resources, or start a general discussion.
6+
- name: Private security report
7+
url: https://github.com/flypythoncom/python/security/advisories/new
8+
about: Report vulnerabilities privately. Do not disclose them in a public issue.
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
name: Resource proposal
2+
description: Propose an official Python or AI-agent resource for the reviewed catalog.
3+
title: "[Resource]: "
4+
labels:
5+
- resource-proposal
6+
body:
7+
- type: markdown
8+
attributes:
9+
value: |
10+
Thanks for helping improve FlyPython. Read the [curation policy](https://github.com/flypythoncom/python/blob/master/docs/CURATION_POLICY.md) before submitting. General learning questions belong in Discussions.
11+
- type: input
12+
id: title
13+
attributes:
14+
label: Resource name
15+
placeholder: Python Packaging User Guide
16+
validations:
17+
required: true
18+
- type: input
19+
id: url
20+
attributes:
21+
label: Canonical URL
22+
description: Use the official publisher, standard, documentation, or project URL.
23+
placeholder: https://packaging.python.org/
24+
validations:
25+
required: true
26+
- type: dropdown
27+
id: path
28+
attributes:
29+
label: Learning path
30+
options:
31+
- foundations
32+
- web-apis
33+
- automation
34+
- ai-agents
35+
validations:
36+
required: true
37+
- type: dropdown
38+
id: source-type
39+
attributes:
40+
label: Source type
41+
options:
42+
- official-docs
43+
- official-standard
44+
- official-project
45+
validations:
46+
required: true
47+
- type: dropdown
48+
id: level
49+
attributes:
50+
label: Learner level
51+
options:
52+
- beginner
53+
- intermediate
54+
- advanced
55+
- all-levels
56+
validations:
57+
required: true
58+
- type: dropdown
59+
id: language
60+
attributes:
61+
label: Resource language
62+
description: Select the catalog's machine-readable language value.
63+
options:
64+
- en
65+
- zh
66+
- multilingual
67+
validations:
68+
required: true
69+
- type: textarea
70+
id: rationale
71+
attributes:
72+
label: Why it belongs
73+
description: Explain the reader outcome, why this source is authoritative, and where it fits. Use your own words.
74+
placeholder: This official guide helps intermediate readers...
75+
validations:
76+
required: true
77+
- type: textarea
78+
id: evidence
79+
attributes:
80+
label: Maintenance, licensing, and safety evidence
81+
description: Include the review date, ownership or license, current maintenance evidence, API-key or paid-access requirements, and material risks.
82+
validations:
83+
required: true
84+
- type: checkboxes
85+
id: confirmations
86+
attributes:
87+
label: Submission checks
88+
options:
89+
- label: I read the curation policy and verified the canonical URL.
90+
required: true
91+
- label: The rationale and classification were reviewed by a person and were not generated by an LLM or web-search API.
92+
required: true
93+
- label: I disclosed any affiliation, sponsorship, or self-promotion in the additional context below.
94+
required: true
95+
- type: textarea
96+
id: context
97+
attributes:
98+
label: Additional context or affiliation
99+
description: State whether you maintain, work for, sponsor, or receive compensation from the resource.

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
## Summary
2+
3+
Describe the problem, the change, and the reader or maintainer outcome.
4+
5+
## Change type
6+
7+
- [ ] Catalog resource or classification
8+
- [ ] Bilingual editorial content
9+
- [ ] Site or build code
10+
- [ ] Tests, tooling, or workflow
11+
- [ ] Governance or documentation
12+
13+
## Evidence and scope
14+
15+
- Related issue:
16+
- Source or maintenance evidence:
17+
- User-visible pages affected:
18+
- Intentionally out of scope:
19+
20+
For catalog changes, explain the official source, review date, license or
21+
ownership, maintenance state, API-key or payment requirements, and safety risk.
22+
Disclose any affiliation or self-promotion.
23+
24+
## Validation
25+
26+
List the actual results, not only the commands you intended to run.
27+
28+
- [ ] `python -m pytest`
29+
- [ ] `python tools/validate_catalog.py`
30+
- [ ] `bundle exec jekyll build`
31+
- [ ] English and Chinese output remain consistent
32+
- [ ] No secrets, generated reports, local build output, or analytics IDs were committed
33+
34+
External links are fetched only by the scheduled or manually dispatched
35+
workflow, not by pull-request CI.
36+
37+
## Permissions and review
38+
39+
- [ ] I have the right to submit this contribution.
40+
- [ ] I retained third-party notices and did not relicense third-party material.
41+
- [ ] Human reviewers wrote or verified all resource descriptions and classifications.
42+
- [ ] I read `CONTRIBUTING.md` and `docs/CURATION_POLICY.md`.

.github/dependabot.yml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: bundler
4+
directory: "/"
5+
schedule:
6+
interval: weekly
7+
day: monday
8+
time: "09:00"
9+
timezone: Asia/Shanghai
10+
open-pull-requests-limit: 5
11+
groups:
12+
jekyll-dependencies:
13+
patterns:
14+
- "github-pages"
15+
- "jekyll-*"
16+
17+
- package-ecosystem: pip
18+
directory: "/"
19+
schedule:
20+
interval: weekly
21+
day: monday
22+
time: "09:15"
23+
timezone: Asia/Shanghai
24+
open-pull-requests-limit: 5
25+
groups:
26+
python-dependencies:
27+
patterns:
28+
- "*"
29+
30+
- package-ecosystem: github-actions
31+
directory: "/"
32+
schedule:
33+
interval: weekly
34+
day: monday
35+
time: "09:30"
36+
timezone: Asia/Shanghai
37+
open-pull-requests-limit: 5
38+
groups:
39+
actions:
40+
patterns:
41+
- "*"

.github/workflows/link-audit.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: External link audit
2+
3+
on:
4+
schedule:
5+
- cron: "23 1 * * 1"
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
11+
concurrency:
12+
group: external-link-audit
13+
cancel-in-progress: false
14+
15+
jobs:
16+
audit:
17+
runs-on: ubuntu-latest
18+
timeout-minutes: 30
19+
steps:
20+
- name: Check out repository
21+
uses: actions/checkout@v7
22+
23+
- name: Set up Python
24+
uses: actions/setup-python@v7
25+
with:
26+
python-version: "3.12"
27+
cache: pip
28+
29+
- name: Install Python dependencies
30+
run: python -m pip install --disable-pip-version-check -r requirements.lock.txt
31+
32+
- name: Prepare report directory
33+
run: mkdir -p reports
34+
35+
- name: Check external links
36+
run: python tools/check_links.py --mode external --output reports/link-check.json
37+
38+
- name: Upload link report
39+
if: ${{ always() }}
40+
uses: actions/upload-artifact@v7
41+
with:
42+
name: external-link-report-${{ github.run_id }}
43+
path: reports/link-check.json
44+
if-no-files-found: error
45+
retention-days: 14

.github/workflows/validate.yml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: Validate
2+
3+
on:
4+
pull_request:
5+
push:
6+
branches:
7+
- master
8+
9+
permissions:
10+
contents: read
11+
12+
concurrency:
13+
group: validate-${{ github.workflow }}-${{ github.ref }}
14+
cancel-in-progress: true
15+
16+
jobs:
17+
validate:
18+
runs-on: ubuntu-latest
19+
timeout-minutes: 20
20+
steps:
21+
- name: Check out repository
22+
uses: actions/checkout@v7
23+
24+
- name: Set up Python
25+
uses: actions/setup-python@v7
26+
with:
27+
python-version: "3.12"
28+
cache: pip
29+
30+
- name: Install Python dependencies
31+
run: python -m pip install --disable-pip-version-check -r requirements-dev.lock.txt
32+
33+
- name: Run tests
34+
run: python -m pytest
35+
36+
- name: Validate catalog
37+
run: python tools/validate_catalog.py
38+
39+
- name: Set up Ruby and Bundler
40+
uses: ruby/setup-ruby@v1
41+
with:
42+
bundler-cache: true
43+
44+
- name: Build Jekyll site
45+
run: bundle exec jekyll build

CHANGELOG.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Changelog
2+
3+
This file records notable repository and catalog-process changes. The Git
4+
history remains the source for changes made before this changelog was added.
5+
6+
## [Unreleased]
7+
8+
### Added
9+
10+
- A single bilingual catalog source with 21 reviewed primary resources across
11+
Python foundations, web and APIs, automation, and AI-agent paths.
12+
- Catalog schema validation and a safe external-link auditor with tests,
13+
retry/backoff behavior, JSON reports, and SSRF/DNS-rebinding protection.
14+
- English and Chinese catalog pages generated from the same resource data,
15+
plus a 1200x630 social preview image.
16+
- Contribution, conduct, security, and resource-curation policies.
17+
- Structured issue forms and a pull request review checklist.
18+
- Dependency update configuration and validation workflows.
19+
- Scheduled, manually dispatchable external-link auditing that does not run on
20+
untrusted pull requests.
21+
22+
### Changed
23+
24+
- Reframed the repository as the broad, community-maintained catalog behind
25+
FlyPython while keeping the README files as short entry points.
26+
- Pinned the Python 3.12 and Ruby 3.3 build toolchains and their validation
27+
dependencies for reproducible local and CI checks.
28+
29+
### Fixed
30+
31+
- Corrected repository links, dynamic resource counts, bilingual metadata,
32+
canonical and hreflang output, robots rules, and duplicate heading/meta tags.
33+
34+
### Removed
35+
36+
- Removed the legacy `README_cn` site route without adding a redirect, along
37+
with unused feed, navigation, collection, theme, and inline-style config.

0 commit comments

Comments
 (0)