Skip to content
Merged
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
5 changes: 5 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Organization issue routing guide
url: https://github.com/egohygiene/.github/blob/main/docs/issue-routing.md
about: Check ownership and routing guidance before opening organization-level work.
16 changes: 16 additions & 0 deletions .github/ISSUE_TEMPLATE/organization-work.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
name: Organization work
description: Route organization-level, cross-repository, or not-yet-owned work.
title: "[org]: "
labels:
- needs-routing
body:
- type: markdown
attributes:
Expand All @@ -24,6 +26,20 @@ body:
validations:
required: true

- type: dropdown
id: routing_state
attributes:
label: Routing state
description: Choose the current organization coordination state.
options:
- needs-routing
- routed
- cross-repo
- blocked
- ready
validations:
required: true

- type: textarea
id: scope
attributes:
Expand Down
183 changes: 183 additions & 0 deletions .github/labels/catalog.v1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
{
"$schema": "./schema/catalog.v1.schema.json",
"schema_version": 1,
"catalog_version": "1.0.0",
"owner": "egohygiene/.github",
"defaults": {
"required": true,
"removal_policy": "retain"
},
"universal": [
{
"name": "priority:p0",
"description": "Correctness, security, or data-integrity blocker.",
"color": "b60205",
"category": "priority"
},
{
"name": "priority:p1",
"description": "Required foundation or near-term release work.",
"color": "d93f0b",
"category": "priority"
},
{
"name": "priority:p2",
"description": "Important planned capability.",
"color": "fbca04",
"category": "priority"
},
{
"name": "priority:p3",
"description": "Research, exploration, or later direction.",
"color": "c5def5",
"category": "priority"
},
{
"name": "type:architecture",
"description": "Architecture, boundaries, or system-design work.",
"color": "1f4d8f",
"category": "type"
},
{
"name": "type:feature",
"description": "New or expanded user-visible capability.",
"color": "0e8a16",
"category": "type"
},
{
"name": "type:bug",
"description": "Incorrect or unexpected behavior.",
"color": "dc2626",
"category": "type"
},
{
"name": "type:documentation",
"description": "Documentation or knowledge-organization work.",
"color": "64748b",
"category": "type"
},
{
"name": "type:research",
"description": "Research, discovery, or evidence gathering.",
"color": "0f766e",
"category": "type"
},
{
"name": "type:maintenance",
"description": "Maintenance, cleanup, or dependency work.",
"color": "6b7280",
"category": "type"
},
{
"name": "area:automation",
"description": "Automation, continuous integration, and delivery.",
"color": "0369a1",
"category": "area"
},
{
"name": "area:developer-experience",
"description": "Developer workflows, tooling, and ergonomics.",
"color": "7c5c1e",
"category": "area"
},
{
"name": "area:governance",
"description": "Organization policy, contracts, and coordination.",
"color": "6d28d9",
"category": "area"
},
{
"name": "area:security",
"description": "Security, privacy, provenance, and trust boundaries.",
"color": "b91c1c",
"category": "area"
},
{
"name": "cross-repo",
"description": "Work coordinated across multiple repositories.",
"color": "5319e7",
"category": "coordination"
},
{
"name": "needs-routing",
"description": "Work that does not yet have a durable repository owner.",
"color": "d4c5f9",
"category": "coordination"
},
{
"name": "blocked",
"description": "Work waiting on an explicit dependency or decision.",
"color": "b60205",
"category": "status"
},
{
"name": "ready",
"description": "Work with sufficient scope, ownership, and acceptance criteria.",
"color": "0e8a16",
"category": "status"
}
],
"overlays": [
{
"id": "ecosystem",
"description": "Named Ego Hygiene ecosystem capabilities.",
"labels": [
{"name": "☁️ aether", "description": "Local AI, agents, prompts, skills, and workflows ☁️", "color": "4338ca"},
{"name": "🌱 mindgarden", "description": "Knowledge management, digital garden, and long-term thinking 🌱", "color": "3a7d44"},
{"name": "🎬 dreamscape", "description": "Creative operating system and AI orchestration 🎬", "color": "6d28d9"}
]
},
{
"id": "engineering",
"description": "Engineering changes, platforms, packages, and specifications.",
"labels": [
{"name": "♻️ refactor", "description": "Repository cleanup, restructuring, modernization, and technical debt ♻️", "color": "16a34a"},
{"name": "⚙️ infra", "description": "Infrastructure, repositories, tooling, and configuration ⚙️", "color": "274472"},
{"name": "⚡ dx", "description": "Developer experience, tooling, and ergonomics ⚡", "color": "7c5c1e"},
{"name": "🏗️ architecture", "description": "Architecture, foundations, and system design 🏗️", "color": "1f4d8f"},
{"name": "🐛 bug", "description": "Something isn't working 🐛", "color": "dc2626"},
{"name": "📄 documentation", "description": "Documentation improvements and knowledge organization 📄", "color": "64748b"},
{"name": "📋 backlog", "description": "Captured ideas and future work 📋", "color": "4b5563"},
{"name": "📐 schema", "description": "Schemas, specifications, contracts, and data models 📐", "color": "7c3aed"},
{"name": "📦 package", "description": "Reusable packages and shared libraries 📦", "color": "0369a1"},
{"name": "📱 flutter", "description": "Flutter application and Flutter Foundation 📱", "color": "0175c2"},
{"name": "🔄 lifecycle", "description": "Application lifecycles, managers, and orchestration 🔄", "color": "0f766e"},
{"name": "🔌 plugin", "description": "Plugin architecture, registries, and extensibility 🔌", "color": "2563eb"}
]
},
{
"id": "creative-publishing",
"description": "Creative production, publishing, design, and outreach.",
"labels": [
{"name": "✍️ writing", "description": "Writing workflow, editorial improvements, and authoring ✍️", "color": "7c3aed"},
{"name": "🌐 website", "description": "Website, documentation site, and public experience 🌐", "color": "0284c7"},
{"name": "🎥 video", "description": "Video production, animation, and cinematic content 🎥", "color": "b91c1c"},
{"name": "🎨 design", "description": "Design system, UI, UX, branding, and visuals 🎨", "color": "4e8065"},
{"name": "🎵 music", "description": "Music, albums, lyrics, and audio production 🎵", "color": "7f1d1d"},
{"name": "📖 magazine", "description": "Magazine, comic, editorial, and visual storytelling 📖", "color": "9333ea"},
{"name": "📚 article", "description": "Long-form articles and essays 📚", "color": "2563eb"},
{"name": "📝 publishing", "description": "Publishing platform, workflows, and distribution 📝", "color": "0e7490"},
{"name": "📣 marketing", "description": "Marketing, social media, SEO, and outreach 📣", "color": "15803d"}
]
},
{
"id": "human-practice",
"description": "Human domains, practices, philosophy, and journeys.",
"labels": [
{"name": "🌍 domain", "description": "Life domains, domain models, and domain-specific functionality 🌍", "color": "15803d"},
{"name": "🎯 practice", "description": "Practices, rituals, habits, and exercises 🎯", "color": "15803d"},
{"name": "🏛️ philosophy", "description": "Purpose, principles, ontology, and conceptual evolution 🏛️", "color": "6d28d9"},
{"name": "🗺️ journey", "description": "Journey modeling, progress, and timeline systems 🗺️", "color": "0891b2"}
]
},
{
"id": "research-funding",
"description": "Research and the resources that support it.",
"labels": [
{"name": "🔬 research", "description": "Research, literature, evidence, and references 🔬", "color": "0f766e"},
{"name": "💰 funding", "description": "Grants, sponsorships, partnerships, and monetization 💰", "color": "b45309"}
]
}
],
"deprecations": []
}
13 changes: 13 additions & 0 deletions .github/labels/repositories.v1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"$schema": "./schema/repositories.v1.schema.json",
"schema_version": 1,
"catalog_version": "1.0.0",
"repositories": [
{
"repository": "egohygiene/.github",
"include_universal": true,
"overlays": ["engineering"],
"additional_labels": []
}
]
}
69 changes: 69 additions & 0 deletions .github/labels/schema/catalog.v1.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://egohygiene.github.io/contracts/labels/catalog.v1.schema.json",
"title": "Ego Hygiene label catalog",
"type": "object",
"additionalProperties": false,
"required": ["$schema", "schema_version", "catalog_version", "owner", "defaults", "universal", "overlays", "deprecations"],
"properties": {
"$schema": {"type": "string"},
"schema_version": {"const": 1},
"catalog_version": {"type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"},
"owner": {"const": "egohygiene/.github"},
"defaults": {
"type": "object",
"additionalProperties": false,
"required": ["required", "removal_policy"],
"properties": {
"required": {"const": true},
"removal_policy": {"enum": ["retain"]}
}
},
"universal": {"type": "array", "items": {"$ref": "#/$defs/universalLabel"}},
"overlays": {"type": "array", "items": {"$ref": "#/$defs/overlay"}},
"deprecations": {"type": "array", "items": {"$ref": "#/$defs/deprecation"}}
},
"$defs": {
"label": {
"type": "object",
"additionalProperties": false,
"required": ["name", "description", "color"],
"properties": {
"name": {"type": "string", "minLength": 1, "maxLength": 50},
"description": {"type": "string", "minLength": 1, "maxLength": 100},
"color": {"type": "string", "pattern": "^[0-9a-f]{6}$"}
}
},
"universalLabel": {
"type": "object",
"additionalProperties": false,
"required": ["name", "description", "color", "category"],
"properties": {
"name": {"type": "string", "minLength": 1, "maxLength": 50},
"description": {"type": "string", "minLength": 1, "maxLength": 100},
"color": {"type": "string", "pattern": "^[0-9a-f]{6}$"},
"category": {"enum": ["priority", "type", "area", "coordination", "status"]}
}
},
"overlay": {
"type": "object",
"additionalProperties": false,
"required": ["id", "description", "labels"],
"properties": {
"id": {"type": "string", "pattern": "^[a-z][a-z0-9-]*$"},
"description": {"type": "string", "minLength": 1},
"labels": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/label"}}
}
},
"deprecation": {
"type": "object",
"additionalProperties": false,
"required": ["name", "replacement", "remove_after"],
"properties": {
"name": {"type": "string"},
"replacement": {"type": ["string", "null"]},
"remove_after": {"type": "string", "format": "date"}
}
}
}
}
39 changes: 39 additions & 0 deletions .github/labels/schema/repositories.v1.schema.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://egohygiene.github.io/contracts/labels/repositories.v1.schema.json",
"title": "Ego Hygiene repository label assignments",
"type": "object",
"additionalProperties": false,
"required": ["$schema", "schema_version", "catalog_version", "repositories"],
"properties": {
"$schema": {"type": "string"},
"schema_version": {"const": 1},
"catalog_version": {"type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$"},
"repositories": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["repository", "include_universal", "overlays", "additional_labels"],
"properties": {
"repository": {"type": "string", "pattern": "^egohygiene/[A-Za-z0-9._-]+$"},
"include_universal": {"const": true},
"overlays": {"type": "array", "uniqueItems": true, "items": {"type": "string"}},
"additional_labels": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["name", "description", "color"],
"properties": {
"name": {"type": "string", "minLength": 1, "maxLength": 50},
"description": {"type": "string", "minLength": 1, "maxLength": 100},
"color": {"type": "string", "pattern": "^[0-9a-f]{6}$"}
}
}
}
}
}
}
}
}
51 changes: 51 additions & 0 deletions .github/workflows/validate-label-contract.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Validate label contract

on:
pull_request:
paths:
- ".github/labels/**"
- ".github/workflows/validate-label-contract.yml"
- "fixtures/labels/**"
- "scripts/project_labels.py"
- "scripts/validate_labels.py"
- "tests/test_labels.py"
push:
branches:
- main
paths:
- ".github/labels/**"
- ".github/workflows/validate-label-contract.yml"
- "fixtures/labels/**"
- "scripts/project_labels.py"
- "scripts/validate_labels.py"
- "tests/test_labels.py"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: labels-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
validate:
name: Validate
runs-on: ubuntu-24.04
timeout-minutes: 5
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Validate governed documents
run: python scripts/validate_labels.py

- name: Run contract tests
run: python -m unittest discover --start-directory tests --verbose

- name: Prove deterministic reference projection
run: |
python scripts/project_labels.py \
--repository "egohygiene/.github" \
--output "${RUNNER_TEMP}/labels.json"
diff --unified fixtures/labels/dot-github.expected.json "${RUNNER_TEMP}/labels.json"
Loading