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
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,29 @@ release with no note is a permanent gap every copy has to step over.
is tagged `X.Y.Z`, with no per-plugin prefix — so "which analytics do I have" and "which kit
release was it proved against" have one answer each.

## 3.8.1 — 2026-11-03

**analytics** — `GET /api/analytics/facts/status` reports only the caller's organisation. It used to read `MAX()` across every tenant, so an organisation's admin saw when any other organisation last had activity, and a busy tenant could hide another's stale fact table.
[Porting note](plugins/analytics/docs/upgrades/3.8.1.md).

**connectors** — No change to connectors. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.
[Porting note](plugins/connectors/docs/upgrades/3.8.1.md).

**freeagent** — No change to freeagent. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.
[Porting note](plugins/freeagent/docs/upgrades/3.8.1.md).

**inbox** — No change to inbox. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.
[Porting note](plugins/inbox/docs/upgrades/3.8.1.md).

**issue-reports** — No change to issue-reports. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.
[Porting note](plugins/issue-reports/docs/upgrades/3.8.1.md).

**m365** — No change to m365. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.
[Porting note](plugins/m365/docs/upgrades/3.8.1.md).

**web-knowledge** — No change to web-knowledge. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.
[Porting note](plugins/web-knowledge/docs/upgrades/3.8.1.md).

## 3.8.0 — 2026-11-03

**analytics** — analytics now compiles on React 19 with React Router 7 as well as on React 18 with Router 6, so a host can move to either. Imports stay on `react-router-dom`. drizzle-cube moves from 0.8.3 to 0.12.2, which declares React 19 and fixes a stored XSS in markdown portlets (GHSA-g3qv-p2w6-c95h).
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ sees what and its known gaps. They are also published at

```bash
# Read the plan first — it always prints and stops.
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/analytics
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/analytics
# Then install it.
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/analytics --apply
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/analytics --apply
# The HOST generates the migration. Always.
pnpm db:generate --name plugin-analytics-<version> && pnpm db:migrate
```
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "rocketflare-plugins",
"version": "3.8.0",
"version": "3.8.1",
"private": true,
"description": "The first-party plugins for Rocketflare — copied into an app, never installed from npm.",
"type": "module",
Expand Down
4 changes: 2 additions & 2 deletions plugins/analytics/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ A fresh copy of the kit already has it. To add it yourself — the first command
stops, the second applies it:

```bash
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/analytics
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/analytics --apply
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/analytics
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/analytics --apply
pnpm db:generate --name plugin-analytics-3.4.0 && pnpm db:migrate
```

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "analytics",
"label": "Analytics",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"minKit": "0.17.1",
"skills": ["analytics", "analytics-cubes", "analytics-queries", "analytics-dashboards"],
Expand Down
36 changes: 36 additions & 0 deletions plugins/analytics/docs/upgrades/3.8.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
---
version: 3.8.1
previous: 3.8.0
date: 2026-11-03
breaking: false
migrations: []
areas: [api, tests]
touches_surfaces: []
requires_surfaces: []
manual: false
---

## What changed

`GET /api/analytics/facts/status` reports only the caller's organisation. It used to read `MAX()` across every tenant, so an organisation's admin saw when any other organisation last had activity, and a busy tenant could hide another's stale fact table.

- `services/fact-tables/freshness.ts`: `checkFactTableFreshness(db, tenantId, now?)` filters both the fact table and its source on `tenant_id`.
- `api/routes/analytics-pages.ts`: the route passes `ctx.tenantId`.
- `services/fact-tables/registry.ts`: a fact table's `source.table` must carry `tenant_id`, as the fact table already does.
- `tests/api/`: freshness and the route are each tested against a second organisation's newer activity.
- `rocketflare analytics check-facts` reads the same route, so it now reports the signed-in organisation only.

## How to apply

1. Run `pnpm plugin upgrade analytics --apply`. It replaces the three source files, the two test files and `services/fact-tables/CLAUDE.md`.
2. If app code calls `checkFactTableFreshness` itself, pass the tenant id as the second argument.
3. If the app contributes a fact table through `analyticsExtensions({ factTables })`, check its `source.table` has a `tenant_id` column. Without one, `/facts/status` fails with `column "tenant_id" does not exist`.

## Conflicts to expect

None.

## Verify

1. `pnpm gate` passes, including `tests/api/fact-table-refresh.test.ts` and `tests/api/analytics-pages.test.ts`.
2. As one organisation's admin, `GET /api/analytics/facts/status` reports no lag when only another organisation has unbuilt activity.
22 changes: 4 additions & 18 deletions plugins/analytics/docs/upgrades/unreleased.md
Original file line number Diff line number Diff line change
@@ -1,36 +1,22 @@
---
version: unreleased
previous: 3.8.0
previous: 3.8.1
date: null
breaking: false
migrations: []
areas: [api, tests]
areas: []
touches_surfaces: []
requires_surfaces: []
manual: false
---

## What changed

`GET /api/analytics/facts/status` reports only the caller's organisation. It used to read `MAX()` across every tenant, so an organisation's admin saw when any other organisation last had activity, and a busy tenant could hide another's stale fact table.

- `services/fact-tables/freshness.ts`: `checkFactTableFreshness(db, tenantId, now?)` filters both the fact table and its source on `tenant_id`.
- `api/routes/analytics-pages.ts`: the route passes `ctx.tenantId`.
- `services/fact-tables/registry.ts`: a fact table's `source.table` must carry `tenant_id`, as the fact table already does.
- `tests/api/`: freshness and the route are each tested against a second organisation's newer activity.
- `rocketflare analytics check-facts` reads the same route, so it now reports the signed-in organisation only.
_Nothing yet. Add an entry here in the same pull request as the change — see `README.md` beside this
file for the fields and for what "How to apply" has to say._

## How to apply

1. Run `pnpm plugin upgrade analytics --apply`. It replaces the three source files, the two test files and `services/fact-tables/CLAUDE.md`.
2. If app code calls `checkFactTableFreshness` itself, pass the tenant id as the second argument.
3. If the app contributes a fact table through `analyticsExtensions({ factTables })`, check its `source.table` has a `tenant_id` column. Without one, `/facts/status` fails with `column "tenant_id" does not exist`.

## Conflicts to expect

None.

## Verify

1. `pnpm gate` passes, including `tests/api/fact-table-refresh.test.ts` and `tests/api/analytics-pages.test.ts`.
2. As one organisation's admin, `GET /api/analytics/facts/status` reports no lag when only another organisation has unbuilt activity.
2 changes: 1 addition & 1 deletion plugins/analytics/rocketflare-plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "analytics",
"label": "Analytics",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"minKit": "0.17.1",
"skills": ["analytics", "analytics-cubes", "analytics-queries", "analytics-dashboards"],
Expand Down
4 changes: 2 additions & 2 deletions plugins/connectors/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ Google Workspace is next. **Install a provider too** — on its own, this plugin
`connectors` first, then the provider; generate a migration after each:

```bash
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/connectors --apply
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/connectors --apply
pnpm db:generate --name plugin-connectors-3.4.0
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/m365 --apply
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/m365 --apply
pnpm db:migrate
```

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "connectors",
"label": "Connectors",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"minKit": "0.13.0",
"anchor": "apps/web/src/plugins/connectors/plugin.json",
Expand Down
29 changes: 29 additions & 0 deletions plugins/connectors/docs/upgrades/3.8.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
version: 3.8.1
previous: 3.8.0
date: 2026-11-03
breaking: false
migrations: []
areas: []
touches_surfaces: []
requires_surfaces: []
manual: false
---

## What changed

No change to connectors. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.

- Version stamps only (`rocketflare-plugin.json` and its anchor copy). No code, schema or behaviour change.

## How to apply

1. Run `pnpm plugin upgrade connectors --apply`. It changes only the version stamps.

## Conflicts to expect

None.

## Verify

1. `pnpm plugin check` reports `connectors` checks out at the new version.
2 changes: 1 addition & 1 deletion plugins/connectors/docs/upgrades/unreleased.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
version: unreleased
previous: 3.8.0
previous: 3.8.1
date: null
breaking: false
migrations: []
Expand Down
2 changes: 1 addition & 1 deletion plugins/connectors/rocketflare-plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "connectors",
"label": "Connectors",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"minKit": "0.13.0",
"anchor": "apps/web/src/plugins/connectors/plugin.json",
Expand Down
4 changes: 2 additions & 2 deletions plugins/freeagent/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ the `freeagent:sync-listeners` extension.
## Install

```bash
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/freeagent
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/freeagent --apply
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/freeagent
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/freeagent --apply
pnpm db:generate --name plugin-freeagent-<version> && pnpm db:migrate
```

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "freeagent",
"label": "FreeAgent",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"minKit": "0.21.0",
"anchor": "apps/web/src/plugins/freeagent/plugin.json",
Expand Down
29 changes: 29 additions & 0 deletions plugins/freeagent/docs/upgrades/3.8.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
version: 3.8.1
previous: 3.8.0
date: 2026-11-03
breaking: false
migrations: []
areas: []
touches_surfaces: []
requires_surfaces: []
manual: false
---

## What changed

No change to freeagent. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.

- Version stamps only (`rocketflare-plugin.json` and its anchor copy). No code, schema or behaviour change.

## How to apply

1. Run `pnpm plugin upgrade freeagent --apply`. It changes only the version stamps.

## Conflicts to expect

None.

## Verify

1. `pnpm plugin check` reports `freeagent` checks out at the new version.
2 changes: 1 addition & 1 deletion plugins/freeagent/docs/upgrades/unreleased.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
version: unreleased
previous: 3.8.0
previous: 3.8.1
date: null
breaking: false
migrations: []
Expand Down
2 changes: 1 addition & 1 deletion plugins/freeagent/rocketflare-plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "freeagent",
"label": "FreeAgent",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"minKit": "0.21.0",
"anchor": "apps/web/src/plugins/freeagent/plugin.json",
Expand Down
4 changes: 2 additions & 2 deletions plugins/inbox/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ job. Other plugins subscribe to parsed messages through the `inbox:consumers` ex
## Install

```bash
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/inbox
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/inbox --apply
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/inbox
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/inbox --apply
pnpm db:generate --name plugin-inbox-<version> && pnpm db:migrate
```

Expand Down
2 changes: 1 addition & 1 deletion plugins/inbox/apps/web/src/plugins/inbox/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "inbox",
"label": "Inbox",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"minKit": "0.22.0",
"anchor": "apps/web/src/plugins/inbox/plugin.json",
Expand Down
29 changes: 29 additions & 0 deletions plugins/inbox/docs/upgrades/3.8.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
version: 3.8.1
previous: 3.8.0
date: 2026-11-03
breaking: false
migrations: []
areas: []
touches_surfaces: []
requires_surfaces: []
manual: false
---

## What changed

No change to inbox. This release exists because `analytics` scopes `GET /api/analytics/facts/status` to the caller's organisation, and every plugin here ships at the repository's version.

- Version stamps only (`rocketflare-plugin.json` and its anchor copy). No code, schema or behaviour change.

## How to apply

1. Run `pnpm plugin upgrade inbox --apply`. It changes only the version stamps.

## Conflicts to expect

None.

## Verify

1. `pnpm plugin check` reports `inbox` checks out at the new version.
2 changes: 1 addition & 1 deletion plugins/inbox/docs/upgrades/unreleased.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
version: unreleased
previous: 3.8.0
previous: 3.8.1
date: null
breaking: false
migrations: []
Expand Down
2 changes: 1 addition & 1 deletion plugins/inbox/rocketflare-plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "inbox",
"label": "Inbox",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"minKit": "0.22.0",
"anchor": "apps/web/src/plugins/inbox/plugin.json",
Expand Down
4 changes: 2 additions & 2 deletions plugins/issue-reports/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ that issue instead of opening a new one.
## Install

```bash
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/issue-reports
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.0 --subdir plugins/issue-reports --apply
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/issue-reports
pnpm plugin add https://github.com/rocketflare-dev/rocketflare-plugins.git@3.8.1 --subdir plugins/issue-reports --apply
pnpm install
```

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "issue-reports",
"label": "Issue reports",
"version": "3.8.0",
"version": "3.8.1",
"repo": "https://github.com/rocketflare-dev/rocketflare-plugins.git",
"subdir": "plugins/issue-reports",
"anchor": "apps/web/src/plugins/issue-reports/plugin.json",
Expand Down
Loading
Loading