You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* docs(ci): document every workflow, drop the hand-maintained count, pin the reverse direction
`ci-cd-pipeline.md` opened with "11 GitHub Actions workflows" against a
directory that held 13, and three of them had never been documented at all:
`lint.yml` (a real PR gate), `cross-repo-issue-closer.yml`, and
`changeset-guard.yml`. The `ci.yml` section listed five jobs, of which three
(Lint, Build Core, and an unsharded Test) do not exist.
- Replace the count with an enumerated inventory table: file, the name each
workflow appears under in the checks list, its trigger, and whether it can
block a merge. The number is gone on purpose — it was wrong three times.
- Drop the ASCII overview box; it was a second hand-maintained copy of the
same set and the older of the two drifted first.
- Rewrite the `ci.yml` section against the real job keys (`changeset-check`,
`type-check`, `test` as a 4-shard PR-only matrix, `test-coverage` on push
only, `e2e`, `docs`, `dev-server`), plus an explicit "what is not in
ci.yml" for the two jobs readers were sent to look for.
- Add sections for `lint.yml` (errors gate, warnings do not) and
`cross-repo-issue-closer.yml`, and its `CROSS_REPO_ISSUE_TOKEN` secret.
#3197 pinned only the forward direction (every workflow the page names must
exist); the reverse was left out because it would have gone red on exactly
these omissions. It is added here: every file in `.github/workflows/` must be
named in a heading on the page, with a failure message that tells the next
author what to write. `changeset-guard.yml` landing between #3212 being filed
and being fixed is why the snapshot alone is not enough.
Fixes#3212
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NVPjPzmmAJ2Ngtvgg5MSRa
* docs(ci): the fence-stripping comment no longer points at a deleted diagram
The previous commit removed the ASCII overview box the comment cited as the
sole reason for excluding fenced blocks. The exclusion is still right — the
"Adding a New Workflow" section shows YAML for workflows that do not exist —
so say that instead.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NVPjPzmmAJ2Ngtvgg5MSRa
---------
Co-authored-by: Claude <noreply@anthropic.com>
@@ -5,72 +5,96 @@ description: Overview of the ObjectUI continuous integration and deployment work
5
5
6
6
# CI/CD Pipeline
7
7
8
-
ObjectUI uses **11 GitHub Actions workflows** to automate testing, quality checks, security scanning, releases, and repository maintenance. All workflow files live in `.github/workflows/`.
8
+
ObjectUI automates testing, quality checks, releases, and repository maintenance with GitHub Actions. All workflow files live in `.github/workflows/`.
9
+
10
+
This page deliberately states **no workflow count**. It used to open with "11 GitHub Actions
11
+
workflows"; the directory held 12 when [#3212](https://github.com/objectstack-ai/objectui/issues/3212)
12
+
was filed and 13 by the time it was fixed. A hand-maintained number drifts by construction, and a
13
+
stale one still reads as authoritative. What is pinned instead is the *set*:
14
+
`scripts/__tests__/ci-cd-pipeline-doc.test.ts` fails `pnpm test` when a file in
15
+
`.github/workflows/` has no section on this page, **and** when this page names a `.yml` that is not
16
+
in that directory. Adding a workflow without documenting it is a red test, not a silent omission.
17
+
18
+
## Workflow Inventory
19
+
20
+
Every workflow, the name it appears under in the checks list (they are not the same string —
21
+
`performance-budget.yml` shows up as **Bundle Analysis**), and whether it can block a merge. Each
22
+
one has its own section below.
23
+
24
+
| Workflow file | Appears as | Runs on | Blocks a PR? |
25
+
|---|---|---|---|
26
+
|`ci.yml`| CI | Push / PR to `main`, `develop`|**Yes** — 6 of its 7 jobs run on PRs |
27
+
|`lint.yml`| Lint | Push / PR to `main`, `develop`; manual |**Yes** — ESLint **errors** only |
**Triggers:** Push and PR to `main` and `develop`, unless the change touches only `**/*.md`,
51
+
`content/**`, `docs/**`, `apps/site/**` or `.changeset/**` (`paths-ignore`).
58
52
59
-
## Core CI Workflow (`ci.yml`)
53
+
Seven jobs, all parallel — there are no `needs:` edges between them:
54
+
55
+
| Job key | Appears as | What it runs | When |
56
+
|---|---|---|---|
57
+
|`changeset-check`| Changeset Fixed Group Check |`scripts/check-changeset-fixed.mjs` — every workspace package must be in the changeset `fixed` group or explicitly ignored. It checks group *membership*; it does **not** check whether the PR added a changeset. | Every run |
58
+
|`type-check`| Type Check |`scripts/check-type-check-coverage.mjs`, then `pnpm check:spec-symbols`, then `pnpm type-check`. The coverage guard runs first because turbo silently skips packages that have no `type-check` script, so a package without one would otherwise read as passing (#2911). | Every run |
59
+
|`test`| Test (shard N/4) |`pnpm test --shard=N/4` across a 4-runner matrix with `fail-fast: false`, so every shard reports its own failures. No coverage instrumentation — v8 adds 40–100% overhead. |**Pull requests only**|
60
+
|`test-coverage`| Test (coverage) | One unsharded `pnpm test:coverage`, uploaded to Codecov. Nothing blocks on it, which is why it is not sharded. |**Push only**|
61
+
|`e2e`| Build & E2E | Builds the console with `vite build` (`VITE_BASE_PATH=/console/`), verifies the artifact, then `pnpm test:e2e --project=chromium`. Uploads the Playwright report on failure. | Every run |
62
+
|`docs`| Build Docs |`turbo run build --filter='@object-ui/site'`. On a PR it first diffs against the base and skips the build when nothing under `apps/site/` or `content/` changed. | Every run (build itself conditional) |
63
+
|`dev-server`| Dev-server fixture build |`pnpm --filter @object-ui/dev-server build` — guards `apps/dev-server`'s `objectstack.config.ts` against fixture / `@objectstack/spec` drift. | Every run |
64
+
65
+
Uses: Node 22.x, pnpm via `corepack`, `actions/cache` over `.turbo/cache`.
66
+
67
+
### What is *not* in `ci.yml`
68
+
69
+
Two jobs this page used to list have never existed under those names, and looking for them in
70
+
`ci.yml` is a dead end:
71
+
72
+
-**Lint** is not a `ci.yml` job. ESLint runs in its own workflow, `lint.yml` (next section), and
73
+
shows up as a separate **Lint** check on the PR.
74
+
-**Build Core** does not exist. `ci.yml` builds only the console SPA that Playwright consumes;
75
+
building the packages and measuring their size belongs to the Bundle Analysis workflow
76
+
(`performance-budget.yml`), as the comment on the `e2e` job states.
77
+
78
+
## Lint (`lint.yml`)
60
79
61
-
**Triggers:** Push and PR to `main` and `develop` branches.
80
+
**Triggers:** Push and PR to `main`/`develop` (same `paths-ignore` as `ci.yml`, minus
81
+
`apps/site/**`), plus manual dispatch.
62
82
63
-
Runs five parallel jobs:
83
+
This is a **real PR gate**, and it is easy to miss because it is not part of CI — it is its own
84
+
**Lint** entry in the checks list.
64
85
65
-
| Job | Description |
66
-
|-----|-------------|
67
-
|**Test**| Runs `vitest` across all packages with Turbo caching. Uploads coverage to Codecov. |
68
-
|**Lint**| Runs ESLint via `eslint.config.js` (flat config) and TypeScript type-checking. |
69
-
|**Build Core**| Builds all packages using `turbo run build`. |
70
-
|**E2E Tests**| Runs Playwright end-to-end tests from the `e2e/` directory. |
71
-
|**Build Docs**| Builds the documentation site (`apps/site`). |
86
+
-`scripts/check-lint-coverage.mjs` runs first: every package must run ESLint or be declared a
87
+
known gap. turbo skips scriptless packages silently, so without this guard a package reads as
| `CROSS_REPO_ISSUE_TOKEN` | `cross-repo-issue-closer.yml` | Closing issues in sibling repositories. `GITHUB_TOKEN` cannot do this — it is scoped to the repository running the workflow. When absent the workflow reports instead of closing. |
0 commit comments