Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 10 additions & 0 deletions .github/ISSUE_TEMPLATE/project-inventory-ci-alert.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
## Project inventory scheduled check failed

The scheduled `check-project-inventory` workflow failed.

- Workflow: `check-project-inventory.yml`
- Trigger: `schedule`
- Repository: `${{ github.repository }}`
- Run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}

Please investigate the failure and push a fix. This issue is auto-created once and auto-closed when the scheduled check succeeds again.
70 changes: 70 additions & 0 deletions .github/workflows/check-project-inventory.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Check project inventory

on:
pull_request:
paths:
- project-inventory.yml
- project-inventory.schema.yml
- PROJECT_STATUS.md
- scripts/check-project-inventory.js
- package.json
- package-lock.json
- .github/workflows/check-project-inventory.yml
schedule:
- cron: '0 12 * * 1'
workflow_dispatch:

permissions:
contents: read
issues: write

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: node scripts/check-project-inventory.js
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_ORG: vega

- name: Create failure alert issue (scheduled runs)
if: failure() && github.event_name == 'schedule'
uses: peter-evans/create-issue-from-file@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
title: "CI alert: project-inventory scheduled check failing"
labels: ci-alert,project-inventory
content-filepath: .github/ISSUE_TEMPLATE/project-inventory-ci-alert.md
search-existing: open

- name: Close failure alert issue on recovery (scheduled runs)
if: success() && github.event_name == 'schedule'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const title = "CI alert: project-inventory scheduled check failing";
const { data: issues } = await github.rest.issues.listForRepo({
owner,
repo,
state: "open",
labels: "ci-alert,project-inventory",
per_page: 100
});
for (const issue of issues) {
if (issue.title === title) {
await github.rest.issues.update({
owner,
repo,
issue_number: issue.number,
state: "closed"
});
}
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules/
51 changes: 51 additions & 0 deletions PROJECT_STATUS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Project Status Definitions

This document defines public metadata values used by [`project-inventory.yml`](./project-inventory.yml).

Field usage:

- `support_level` is optional; default inference is `active -> full`, `experimental -> best_effort`, `maintenance -> best_effort`, `deprecated -> none`, `archived -> none`.
- `replacement` is optional; include when a clear migration target exists.
- `notes` is optional; use sparingly for exceptions not captured by enum fields.
- `uncategorized_repos` holds known public repos not yet fully classified (often lightly maintained, historical, or low-signal).
- `core_maintainers` is optional; use when a repository has clear, consistent maintainer leadership.
- `research_prototypes` groups research repositories sharing common lifecycle/support/ownership defaults.
- `archived_repos` is a flat list of historical repositories; entries map to `lifecycle_status: archived`, `project_role: historical`, `owner_model: unowned`, and `support_level: none`.

## `lifecycle_status`

| Value | Meaning |
| --- | --- |
| `active` | Normal development. Issues, pull requests, and releases are expected. |
| `experimental` | Exploratory work. APIs, scope, or long-term maintenance may change. |
| `maintenance` | Kept working, but limited new feature development. |
| `deprecated` | Users should migrate elsewhere; list a replacement where possible. |
| `archived` | Historical or read-only. No support expected. |

## `support_level`

| Value | Meaning |
| --- | --- |
| `full` | Maintainers review issues/security reports and publish releases as appropriate. |
| `best_effort` | Maintained when time allows; no strong response commitment. |
| `none` | Unsupported; no maintainer response expected. |

## `project_role`

| Value | Meaning |
| --- | --- |
| `primary` | Main Vega/Altair library, runtime, grammar, service, schema, editor, or public-facing site. |
| `ecosystem` | Important package, helper, extension, dataset, or ecosystem utility. |
| `integration` | Framework, platform, package-manager, documentation, or external-system integration. |
| `example` | Tutorial, demo, sample, benchmark, or teaching material. |
| `research` | Research prototype, exploratory system, proposal, or academic project. |
| `infrastructure` | Build, deployment, governance, CI, org metadata, or operational tooling. |
| `historical` | Superseded, archived, version-specific, or retained for historical reference. |

## `owner_model`

| Value | Meaning |
| --- | --- |
| `org_shared` | The Vega maintainer group collectively owns the repository. |
| `named_lead` | We have a primary maintainer for triage, release, or review leadership |
| `unowned` | No active maintainer; reserved for archived or unsupported repositories. |
Loading
Loading