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
35 changes: 12 additions & 23 deletions .github/workflows/trunk-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,22 @@ on:
workflow_dispatch: {}

permissions:
checks: write
contents: read
issues: write
pull-requests: write

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
trunk_check:
check:
name: Trunk Code Quality
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
with:
fetch-depth: 0

- name: Setup dependencies
uses: ./.trunk/setup-ci

- name: Trunk Check
uses: trunk-io/trunk-action@75699af9e26881e564e9d832ef7dc3af25ec031b # v1.2.4
with:
cache: false
# Run full link audit on schedule/dispatch, otherwise run standard incremental checks
arguments: ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && 'run lychee-audit' || '' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
permissions:
actions: read
checks: write
contents: read
uses: z-shell/.github/.github/workflows/trunk.yml@df7c51baaa966337fe5e8d15d82bc9c38486a227 # main
with:
cache: false
setup-deps: true
# Run full link audit on schedule/dispatch, otherwise run standard incremental checks.
arguments: ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && 'run lychee-audit' || '' }}
97 changes: 42 additions & 55 deletions community/00_contributing/05_project_management.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ id: project_management
title: "📋 Project Management"
sidebar_position: 5
image: /img/png/theme/z/320x320.png
description: How work is tracked and labelled across the Z-Shell organization — project tracker, views, triage workflow, and canonical labels.
description: How GitHub issues and the Z-Shell Workspace in Linear track work across the organization — workflow, labels, and triage.
keywords:
- project
- tracker
- linear
- github
- workflow
- labels
- triage
- sprint
- roadmap
- github
---

{/* @format */}
Expand All @@ -23,100 +23,87 @@ import useBaseUrl from "@docusaurus/useBaseUrl";
<img src={useBaseUrl("/img/svg/community/contributing-project-management.svg")} alt="" width="100" height="100" style={{borderRadius: "16px"}}/>
</div>

## Project Tracker
## Linear Tracker

All work across the Z-Shell organization is tracked in a single unified project:
Planned, active, and deferred work across the Z-Shell organization is
prioritized in the **Z-Shell Workspace** project in Linear:
Comment thread
ss-o marked this conversation as resolved.

<Link
className="button button--primary button--lg"
to="https://github.com/orgs/z-shell/projects/28"
to="https://linear.app/ss-o/project/z-shell-workspace-0206c6a7192d"
>
Z-Shell Tracker
Open Linear
</Link>

<br />
<br />

The project pulls issues and pull requests from every repository in the
[`z-shell`](https://github.com/z-shell) GitHub organization into one place, so
nothing slips through the cracks.

### Project Views

| View | Layout | Purpose |
| --- | --- | --- |
| **Triage** | Table | New items awaiting investigation — start here |
| **Bugs Board** | Board | Active bug work, grouped by Status |
| **Features Board** | Board | Feature and enhancement work |
| **Active Sprint** | Board | Everything in the current 2-week sprint |
| **Roadmap** | Roadmap | Planned work on a timeline |
| **By Repository** | Table | All items grouped by source repo |
GitHub issues and pull requests remain the repository-level record for
discussion, implementation, and review. Linear provides the cross-repository
planning view: priority, status, ownership, estimates, cycles, and dependencies.

### Custom Fields
### Workflow

Each item in the project can have the following fields set:
Each tracked item moves through the z-shell team's Linear workflow:

| Field | Values | Notes |
| --- | --- | --- |
| **Status** | Triage · Todo · In Progress · In Review · Done · Blocked · Won't Fix | Set by maintainers during triage |
| **Priority** | 🔴 Critical · 🟠 High · 🟡 Medium · 🔵 Low · None | |
| **Item Type** | Bug · Feature · Enhancement · Docs · Security · Performance · Chore · CI | |
| **Effort** | XS · S · M · L · XL | Rough size estimate |
| **Sprint** | Sprint 1 … Sprint N | 2-week iterations starting Mondays |
| Status | Purpose |
| --- | --- |
| **Backlog** | Accepted work that is not yet scheduled |
| **Todo** | Ready to begin |
| **In Progress** | Actively being implemented |
| **In Review** | Awaiting review, verification, or publication |
| **Done** | Completed and verified |
| **Canceled** | Deliberately removed from the plan |
| **Duplicate** | Covered by another tracked item |

### Triage Workflow

New issues and PRs are automatically added to the project with **Status = Triage**.
A maintainer reviews the item and:
When work is added to Linear, a maintainer:

1. Sets **Item Type** (Bug, Feature, etc.)
2. Sets **Priority**
3. Moves **Status** to `Todo` (or `Won't Fix` / `Blocked` if appropriate)
4. Assigns to a **Sprint** if it should be worked on soon
5. Adds the appropriate [label](#labels)
1. Links the owning GitHub issue or pull request when one exists.
2. Sets its **Priority**, **Status**, and project.
3. Adds labels and an estimate when they improve planning.
4. Records dependencies so blocked work is visible.
5. Assigns it to a cycle only when it is ready to schedule.

### Capturing Deferred Work

Do not leave postponed work only in local diffs, review notes, or memory.
Create or update an issue in the repository that owns the work so it is added to
the shared tracker automatically.
Create or update an issue in the repository that owns the work, then add or link
the corresponding Linear item when the task needs cross-repository planning.

When splitting or deferring work:

1. Create **one issue per logical task** so each item can be prioritized and completed independently.
2. Include enough context for another maintainer to resume later: the observed problem, why it matters, relevant files, and any known constraints.
3. Suggest the likely **Item Type**, **Priority**, and **Effort** during triage.
3. Suggest the likely **Priority**, estimate, and initial Linear status during triage.
4. Use the canonical labels instead of repo-local tracking conventions.

### Sprint Cadence

Sprints run for **2 weeks**, starting every other Monday.

At the end of each sprint, incomplete items are moved to the next sprint or
returned to the backlog (`Todo` without a sprint assignment).

### Priority Definitions

| Priority | Meaning |
| --- | --- |
| 🔴 **Critical** | Data loss, security vulnerability, or complete breakage with no workaround |
| 🟠 **High** | Significantly impacts users; should be in the current or next sprint |
| 🟡 **Medium** | Important but not urgent; planned within the next few sprints |
| 🟠 **High** | Significantly impacts users or blocks important work; schedule next |
| 🟡 **Medium** | Important but not urgent; prioritize against other planned work |
| 🔵 **Low** | Nice to have; no fixed timeline |
| **None** | Not yet triaged or genuinely optional |

### Automation
### GitHub and Linear

Every repository in the organization has a `.github/workflows/project-tracker.yml`
workflow that automatically adds new issues and pull requests to the project. No
manual steps are required from contributors.
Contributors should continue opening issues and pull requests in the owning
GitHub repository. Maintainers use Linear to coordinate work that spans
repositories, needs scheduling, or should remain visible after it is deferred.
Links between the two systems preserve the implementation history without
duplicating long-form technical context.

---

## Labels

All repositories in the `z-shell` organization use the same canonical label set.
Labels are applied automatically by the stale bot or manually during triage.
Labels are applied manually during triage or by approved organization
automation.

The source of truth lives in
[`z-shell/.github/.github/lib/labels.yml`](https://github.com/z-shell/.github/blob/main/.github/lib/labels.yml).
Expand Down
2 changes: 1 addition & 1 deletion community/00_contributing/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ Choose the path that matches what you want to do:
| --- | --- |
| 👥 Join the team | [Open a membership request](https://github.com/z-shell/.github/issues/new?assignees=&labels=type%3A+membership%2Carea%3A+meta&template=05_membership.yml&title=team%3A+) |
| 🌐 Translate | [translate.zshell.dev](https://translate.zshell.dev) |
| 📋 Project tracker | [Z-Shell Tracker](https://github.com/orgs/z-shell/projects/28) |
| 📋 Project tracker | [Linear](https://linear.app/ss-o/project/z-shell-workspace-0206c6a7192d) |
| 💬 Discuss | [GitHub Discussions](https://github.com/z-shell/zi/discussions) |

## General Guidelines
Expand Down
2 changes: 1 addition & 1 deletion community/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ The Z-Shell community is home to contributors, plugin authors, and Zsh enthusias
</div>

:::info[Get involved]
Join the [Z-Shell organization](https://github.com/z-shell), help [translate the wiki](https://translate.zshell.dev), or track work in the [Z-Shell Tracker](https://github.com/orgs/z-shell/projects/28).
Join the [Z-Shell organization](https://github.com/z-shell), help [translate the wiki](https://translate.zshell.dev), or track work in the [Z-Shell Workspace](https://linear.app/ss-o/project/z-shell-workspace-0206c6a7192d).
:::

## Community Sections
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
"@docusaurus/types": "3.10.1",
"@eslint/compat": "^2.0.5",
"@eslint/js": "^10.0.1",
"@types/node": "25.8.0",
"@types/node": "25.9.3",
"@types/prismjs": "^1.26.6",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
Expand All @@ -79,7 +79,7 @@
"eslint-plugin-react-hooks": "^7.0.1",
"globals": "^17.5.0",
"jiti": "^2.6.1",
"stylelint": "17.11.1",
"stylelint": "17.13.0",
"stylelint-color-format": "1.1.0",
"stylelint-config-css-modules": "4.6.0",
"stylelint-config-standard": "40.0.0",
Expand Down
Loading
Loading