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
6 changes: 3 additions & 3 deletions .claude/skills/branch-name/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
---
name: branch-name
description: Use when starting a new branch or renaming an existing one — produces a branch name in the format `<type>/<work-item-id>-<short-description>` that's compatible with the create-pr skill's work item ID extraction.
description: Use when starting a new branch or renaming an existing one — produces a branch name in the format `<type>/<work-item-id>-<short-description>` that's compatible with the create-pull-request skill's work item ID extraction.
user_invocable: true
---

# Branch Naming

Create branch names that follow the convention `<type>/<work-item-id>-<short-description>`, where the work item ID can be cleanly extracted later (e.g., by the create-pr skill).
Create branch names that follow the convention `<type>/<work-item-id>-<short-description>`, where the work item ID can be cleanly extracted later (e.g., by the create-pull-request skill).

## Format

Expand Down Expand Up @@ -51,7 +51,7 @@ Create branch names that follow the convention `<type>/<work-item-id>-<short-des
```
fix/silo-1146-relative-config-urls
feat/web-1234-app-tile-visibility
chore/web-2201-bump-eslint
chore/web-2201-bump-oxlint
refactor/silo-980-extract-auth-middleware
docs/web-1500-pr-template-update
perf/silo-1310-cache-workspace-lookup
Expand Down
34 changes: 17 additions & 17 deletions .claude/skills/translate/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,11 @@ Also preserve: OAuth, OIDC, SAML, SSO, LDAP, API, REST, GraphQL, URL, URI, ID, U

## Per-Script Rules

Apply by target-language script, not by locale list. Adding a new Latin-script locale? It follows the Latin-script rules below. Adding a new Cyrillic locale? It follows the Cyrillic section. Scripts not yet shown here (Arabic, Hebrew, Thai, Greek, Hindi/Devanagari, etc.) — see **Adding a locale not documented here**.
Apply by target-language script, not by locale list. Adding a new Latin-script locale? It follows the Latin-script rules below. Adding a new Cyrillic locale? It follows the Cyrillic section. Scripts not yet shown here (Arabic, Hebrew, Thai, Greek, Hindi/Devanagari, etc.) — see **Adding a locale not documented here**. This includes `ka-ge` (Georgian, Mkhedruli script), which is already in the repo but has no section yet.

### Latin-script locales

Currently includes fr, es, it, de, pt-BR, pl, cs, sk, ro, tr-TR, vi-VN, id — and any future locale that uses the Latin alphabet (hu, nl, sv, da, nb, fi, hr, bg-using-Latin variants, etc.).
Currently includes fr, es, it, de, nl, pt-BR, pl, cs, sk, ro, tr-TR, vi-VN, id — and any future locale that uses the Latin alphabet (hu, sv, da, nb, fi, hr, bg-using-Latin variants, etc.). `nl` is not yet in the glossary tables above; follow the Latin-script rules and add its column when you next touch it.

**Translate Plane feature nouns** (Cycle, Cycles, Module, Modules, Epic, Epics, Page, Pages) using the per-locale form from the glossary above. **Keep Latin** for Plane brand marks (Plane, Plane AI, Power K, PQL, Active Cycles, Sticky, Stickies, Intake), plan tier names (Pro, Business, Enterprise), and third-party brands (GitHub, Slack, etc.).

Expand Down Expand Up @@ -187,7 +187,7 @@ For new terms not on the glossary: prefer the native Korean word where one exist

Register:

- **System and error messages** → 합니다체 (high-formal: 합니다, 됩니다, 입니다). Existing files in this register today: `ko/auth.json`, `ko/error/*.json`.
- **System and error messages** → 합니다체 (high-formal: 합니다, 됩니다, 입니다). Existing files in this register today: `ko/auth.json`.
- **Empty states, onboarding microcopy, tooltips** → 해요체 acceptable (softer: 해요, 돼요, 이에요) if the existing file uses it. Existing files in this register today: `ko/empty-state.json`, `ko/tour.json`. Always match the surrounding file rather than introducing a new register mid-namespace.
- Never casual 반말.

Expand Down Expand Up @@ -255,19 +255,19 @@ Every `{count, plural, …}` string must contain **every** keyword the target la

Below are the required keywords for locales currently in the repo. When adding a new locale, look up its categories in CLDR and add the row here.

| Locale | Required keywords | Example mapping |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| en, es, de, bg, tr-TR, vi-VN, id, ja, ko, zh-CN, zh-TW | `one, other` (single-form locales may use `other` alone, but **always emit `other`**) | 1 → one; 2+ → other |
| fr | `one, many, other` | 0, 1 → one; 1 000 000 → many; else other |
| it | `one, many, other` | 1 → one; 1 000 000 → many; else other |
| pt-BR | `one, many, other` | 0, 1 → one; 1 000 000 → many; else other |
| ro | `one, few, other` | 1 → one; 0, 2–19 → few; 20+ → other |
| pl | `one, few, many, other` | 1 → one; 2–4 (not 12–14) → few; 0, 5–20, many-digit → many; decimals → other |
| cs | `one, few, many, other` | 1 → one; 2–4 → few; decimals → many; 0, 5+ → other |
| sk | `one, few, many, other` | same pattern as cs |
| ru | `one, few, many, other` | 1, 21, 31… → one; 2–4, 22–24… → few; 0, 5–20, 25–30… → many; decimals → other |
| ua | `one, few, many, other` | same pattern as ru |
| ar (when added) | `zero, one, two, few, many, other` | Six categories — the maximum any language uses |
| Locale | Required keywords | Example mapping |
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| en, es, de, nl, bg, ka-ge, tr-TR, vi-VN, id, ja, ko, zh-CN, zh-TW | `one, other` (single-form locales may use `other` alone, but **always emit `other`**) | 1 → one; 2+ → other |
| fr | `one, many, other` | 0, 1 → one; 1 000 000 → many; else other |
| it | `one, many, other` | 1 → one; 1 000 000 → many; else other |
| pt-BR | `one, many, other` | 0, 1 → one; 1 000 000 → many; else other |
| ro | `one, few, other` | 1 → one; 0, 2–19 → few; 20+ → other |
| pl | `one, few, many, other` | 1 → one; 2–4 (not 12–14) → few; 0, 5–20, many-digit → many; decimals → other |
| cs | `one, few, many, other` | 1 → one; 2–4 → few; decimals → many; 0, 5+ → other |
| sk | `one, few, many, other` | same pattern as cs |
| ru | `one, few, many, other` | 1, 21, 31… → one; 2–4, 22–24… → few; 0, 5–20, 25–30… → many; decimals → other |
| ua | `one, few, many, other` | same pattern as ru |
| ar (when added) | `zero, one, two, few, many, other` | Six categories — the maximum any language uses |

> **Note on the consolidated row.** CLDR itself only requires `other` for `tr-TR`, `vi-VN`, `id`, `ja`, `ko`, `zh-CN`, `zh-TW` (single-form locales). Emitting both `one` and `other` with identical content is a **project convention** — it keeps tooling and linters consistent across the codebase. It is not a CLDR requirement, and `Intl.PluralRules` will return only `"other"` for these locales at runtime.

Expand Down Expand Up @@ -469,7 +469,7 @@ When reviewing a translation — yours or an AI's — score against these catego
A "namespace" is a top-level JSON file (e.g. `common.json`, `auth.json`, `epic.json`). The set of valid namespace names is a hard-coded const array — adding a JSON file alone is not enough; the runtime will not load it.

1. Add the new namespace name to the `NAMESPACES` array in `packages/i18n/src/constants/namespaces.ts`. Keep alphabetical order with the existing entries.
2. Create `<namespace>.json` in **every** locale directory under `packages/i18n/src/locales/` — start with `en/<namespace>.json` (the source of truth), then create the file in all 18 target locales. An empty `{}` is fine for the targets at this step; `sync-check` will report missing keys as you add them in step 4.
2. Create `<namespace>.json` in **every** locale directory under `packages/i18n/src/locales/` — start with `en/<namespace>.json` (the source of truth), then create the file in every target locale (21 today; `ls packages/i18n/src/locales`). An empty `{}` is fine for the targets at this step; `sync-check` will report missing keys as you add them in step 4.
3. Add at least one key in `en/<namespace>.json` so the namespace has content.
4. Translate every key from `en/<namespace>.json` into each target locale — apply every rule in this skill.
5. Run `pnpm --filter @plane/i18n run generate:types` to regenerate the `TTranslationKeys` union so component-level `t()` calls type-check.
Expand Down
3 changes: 2 additions & 1 deletion .github/ISSUE_TEMPLATE/config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
contact_links:
- name: Help and support
about: Reach out to us on our Forum or GitHub discussions.
url: https://forum.plane.so
about: Ask questions and get help from the community on our Forum.
- name: Dedicated support
url: mailto:support@plane.so
about: Write to us if you'd like dedicated support using Plane
17 changes: 14 additions & 3 deletions .github/instructions/bash.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,32 @@ This document outlines the standard tools and commands used in this monorepo.
## Package Manager

We use **pnpm** for package management.

- **Do not use `npm` or `yarn`.**
- Lockfile: `pnpm-lock.yaml`
- Workspace configuration: `pnpm-workspace.yaml`

### Common Commands

- Install dependencies: `pnpm install`
- Run a script in a specific package: `pnpm --filter <package_name> run <script>`
- Run a script in all packages: `pnpm -r run <script>`
- Run a task across the monorepo through Turbo with the root scripts: `pnpm build`, `pnpm dev`, `pnpm check`, `pnpm fix` (or `pnpm turbo run <task> --filter=<package>`), rather than `pnpm -r run <script>`

### Lint & format

- Lint with OxLint: `pnpm check:lint` / `pnpm fix:lint` (config: `.oxlintrc.json`)
- Format with oxfmt: `pnpm check:format` / `pnpm fix:format` (config: `.oxfmtrc.json`)
- `pnpm check` runs format, lint and types; lint-staged runs oxfmt and OxLint on staged files at commit time

## Monorepo Tooling

We use **Turbo** for build system orchestration.

- Configuration: `turbo.json`

## Project Structure

- `apps/`: Contains application services (admin, api, live, proxy, space, web).
- `apps/`: Contains application services (admin, api, live, proxy, space, web). `apps/api` (Django, managed with uv) and `apps/proxy` (Caddy) are excluded from the pnpm workspace.
- `packages/`: Contains shared packages and libraries.
- `deployments/`: Deployment configurations.

Expand All @@ -45,4 +54,6 @@ We use **Turbo** for build system orchestration.
## Docker

- Local development uses `docker-compose-local.yml`.
- Production/Staging uses `docker-compose.yml`.
- `docker-compose.yml` builds every service from the local Dockerfiles (for testing a full build).
- Self-hosting configs for releases live in `deployments/` (`cli`, `aio`, `swarm`, `kubernetes`).
- Backend tests run in `docker-compose-test.yml` (see `apps/api/tests/RUNNING_TESTS.md`).
Loading
Loading