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
18 changes: 9 additions & 9 deletions .fleet/design-review.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "fleet.design-review.v1",
"version": 1,
"project": "starboard",
"target": "projects shared app shell",
"target": "core discovery hardening and shared repository shell",
"mode": "preserve",
"register": "product",
"context": {
Expand All @@ -14,29 +14,29 @@
"probes": [],
"selected": "existing-design",
"approval": "not-required",
"before": ".fleet/evidence/projects-shell/before-1440.png"
"before": ".fleet/evidence/core-discovery-hardening/before-1440.png"
},
"evidence": {
"screenshots": [
{
"width": 390,
"path": ".fleet/evidence/projects-shell/after-390.png"
"path": ".fleet/evidence/core-discovery-hardening/after-390.png"
},
{
"width": 768,
"path": ".fleet/evidence/projects-shell/after-768.png"
"path": ".fleet/evidence/core-discovery-hardening/after-768.png"
},
{
"width": 1440,
"path": ".fleet/evidence/projects-shell/after-1440.png"
"path": ".fleet/evidence/core-discovery-hardening/after-1440.png"
}
],
"projectCheck": {
"command": "pnpm build",
"command": "pnpm build:cf",
"status": "pass"
},
"critique": {
"score": 32,
"score": 35,
"maximum": 40
},
"audit": {
Expand All @@ -53,7 +53,7 @@
}
},
"ownerFeedback": {
"decision": "keep",
"note": "Owner approved the shared-shell Projects correction on 2026-08-09."
"decision": "delegated",
"note": "Owner delegated the final implementation and testability judgment by asking to fix the full audited surface before their own test pass."
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
59 changes: 59 additions & 0 deletions .fleet/reviews/2026-08-09-projects-shared-app-shell.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
"$schema": "fleet.design-review.v1",
"version": 1,
"project": "starboard",
"target": "projects shared app shell",
"mode": "preserve",
"register": "product",
"context": {
"product": "PRODUCT.md",
"design": "src/app/globals.css"
},
"direction": {
"references": [],
"probes": [],
"selected": "existing-design",
"approval": "not-required",
"before": ".fleet/evidence/projects-shell/before-1440.png"
},
"evidence": {
"screenshots": [
{
"width": 390,
"path": ".fleet/evidence/projects-shell/after-390.png"
},
{
"width": 768,
"path": ".fleet/evidence/projects-shell/after-768.png"
},
{
"width": 1440,
"path": ".fleet/evidence/projects-shell/after-1440.png"
}
],
"projectCheck": {
"command": "pnpm build",
"status": "pass"
},
"critique": {
"score": 32,
"maximum": 40
},
"audit": {
"score": 18,
"maximum": 20
},
"unresolved": {
"p0": 0,
"p1": 0
},
"detector": {
"posture": "advisory",
"findings": []
}
},
"ownerFeedback": {
"decision": "keep",
"note": "Owner approved the shared-shell Projects correction on 2026-08-09."
}
}
6 changes: 5 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,8 @@ jobs:

- run: pnpm test:coverage

- run: pnpm build
- run: pnpm build:e2e

- run: pnpm exec playwright install --with-deps chromium

- run: pnpm test:e2e
10 changes: 10 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -244,3 +244,13 @@ S69 Starboard — migrate deployment from Vercel/Turso to Cloudflare Workers via

Access 284k tokens of past work via get_observations([IDs]) or mem-search skill.
</claude-mem-context>

<!-- BEGIN:nextjs-agent-rules -->

# This is NOT the Next.js you know

This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.

This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.

<!-- END:nextjs-agent-rules -->
37 changes: 26 additions & 11 deletions PROJECT_STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ installation, alerts, reports, digest email, and stack generation.

**Local dev:** `pnpm install && cp .env.example .env.local && pnpm dev` → http://localhost:3000

**Key checks:** `pnpm test:coverage` · `pnpm build` · `pnpm build:cf` (Cloudflare path)
**Key checks:** `pnpm test:coverage` · `pnpm test:e2e` · `pnpm build:cf` (Cloudflare path)

```
GitHub OAuth (NextAuth)
Star sync + public project connection ──► D1 (users, repos, user_repos, user_projects, lists, comments, votes)
Star sync + public project connection ──► D1 (users, repos, user_repos, user_projects, lists)
├── Full-text + facet search (GET /api/stars)
├── Semantic search: knowledgebase Worker; lexical-only when shared RAG is unavailable
Expand Down Expand Up @@ -72,6 +72,15 @@ provenance. The workflow is free and has no billing or entitlement gate.

## Timeline

- **2026-08-09 (core discovery hardening, local)** — Stabilized aborted filter
requests, added hybrid public Discover relevance with lexical fallback,
tightened peer/tool evidence thresholds, protected uncataloged previews with
the user's GitHub token, paginated Tool Intelligence evidence, moved
repository intelligence into the shared shell, and retired its discussion
controls while retaining legacy data. The production-accurate Playwright
suite now covers the Astro landing and core public journeys at desktop and
mobile widths. This work is locally testable and not yet released.

- **2026-08-09 (shared lint baseline)** — Adopted the Fleet Ultracite baseline
for core TypeScript, React, Next.js, and Vitest code. Explicit compatibility
exceptions preserve current behavior while 206 files pass with zero
Expand Down Expand Up @@ -177,7 +186,7 @@ provenance. The workflow is free and has no billing or entitlement gate.
| Phase | Milestone |
|-------|-----------|
| Foundation | GitHub OAuth (NextAuth v5), OpenNext Cloudflare deploy, core dashboard with sync, tags, collections, full-text search, virtual scroll |
| Repo intelligence | Repo detail (`/explore`), comments/votes, public shared lists, legal/marketing shell |
| Repo intelligence | Shared-shell repository detail (`/explore`), similar projects, tool evidence, public shared lists, legal/marketing shell |
| Semantic search | knowledgebase Worker integration for relevance search; README-backed sync ingest; local embeddings retained for non-RAG Starboard features |
| Connected projects | Shipped public GitHub project connections, public preview, GitHub picker, and evidence-based repository and tool recommendations |
| Discovery & tools | Public Discover, daily bounded seed/enrich/embed with manual dispatch, stored growth sorting, and Tool Intelligence |
Expand Down Expand Up @@ -212,7 +221,9 @@ provenance. The workflow is free and has no billing or entitlement gate.
- GitHub star-list ingestion via HTML scraping where no official API exists.
- Main dashboard: smart categories, custom colored tags, named collections, full-text search, language/category/tag/collection filters, sort (recently starred, most stars, recently updated, A-Z), grid/list toggle, virtual scroll for 1000+ repos.
- URL-shareable filter/sort state through nuqs.
- Repo detail (`/explore`): comments, votes, likes, similar repos, list assignment, tag picker.
- Repo detail (`/explore`): public similar repositories, detected-tool evidence,
and stored star history in the shared application shell. Legacy discussion
data is retained but has no active product controls.
- Public shared lists at `/lists/[slug]` with SSR and `list.json` export route.
- Legal/marketing shell: about, privacy, terms, sitemap, robots, OG image, security.txt, humans.txt, PWA manifest.

Expand All @@ -225,9 +236,9 @@ provenance. The workflow is free and has no billing or entitlement gate.
credentials in GitHub.

### Connected projects and public preview
- Guests can preview a public GitHub repository without sign-in or a user-data
write, then carry the normalized repository through sign-in for explicit
connection.
- Guests can preview a cataloged public GitHub repository without sign-in or a
user-data write. Uncataloged lookups require the existing GitHub session token
and preserve the repository through sign-in for explicit connection.
- Authenticated users can connect and disconnect public GitHub repositories
by URL or an on-demand public-repository picker without a broader OAuth scope.
- `user_projects` isolates project connections per user while reusing shared
Expand All @@ -238,13 +249,15 @@ provenance. The workflow is free and has no billing or entitlement gate.

### Discovery and intelligence surfaces
- Public Discover page and `/api/discover` for the seeded popular repository
corpus; authentication adds saved state and collection controls but is not
required to browse, search, sort, filter, paginate, or open repo details.
corpus; relevance search fuses bounded semantic and lexical candidates and
falls back honestly to lexical search. Authentication adds saved state and
collection controls but is not required to browse, search, sort, filter,
paginate, or open repo details.
- Discover supports paginated 30-day growth ordering and detected-tool facets from indexed local snapshot/tool tables.
- Daily bounded GitHub Actions seed/enrich popular repos in D1 and embed through
native Worker bindings; manual dispatch remains available for operator checks.
- Star history and fastest-grower APIs/surfaces: `/api/repos/[repoId]/star-history`, `/api/growth`, Discover growth sorting, and repo-detail mini history from stored `repo_star_snapshots`.
- Tool Intelligence: additive `repo_tools` index, `/api/tools`, `/api/repos/[repoId]/tools`, `/tools`, and `pnpm db:enrich-tools` for bounded SBOM/tree/manifest-based detection with source/confidence labels. Accuracy disclaimer is shown in-product because manifest/SBOM evidence is stronger than README/topic/metadata inference and C/C++ monorepos vary.
- Tool Intelligence: additive `repo_tools` index, `/api/tools`, `/api/repos/[repoId]/tools`, `/tools`, and `pnpm db:enrich-tools` for bounded SBOM/tree/manifest-based detection with source/confidence labels. Repository evidence is server-filtered and paginated in 48-item pages. Accuracy disclaimer is shown in-product because manifest/SBOM evidence is stronger than README/topic/metadata inference and C/C++ monorepos vary.
- SaaS Maker feedback widget integrated; product analytics run directly through PostHog.
- First-run UX, sample prioritized stars board, semantic search, GitHub
permission trust note, and public discovery paths remain.
Expand All @@ -253,7 +266,9 @@ provenance. The workflow is free and has no billing or entitlement gate.

- Shared Ultracite lint baseline with a clean 206-file check.
- Checked-in `.env.example` documents required local variables without secrets.
- Vitest unit tests with v8 coverage thresholds (80% lines/functions/statements, 70% branches) on `github-projects`, `project-recommendations`, `search`, and `starboard-rag-documents`; Playwright e2e path documented in README.
- Vitest unit tests with v8 coverage thresholds (80% lines/functions/statements,
70% branches) on selected core logic; production-accurate Playwright journeys
cover the Astro landing and public app at desktop and mobile widths.
- Pre-push lint hook.
- TypeScript config and Astro landing tooling made self-contained for green Cloudflare builds.

Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@ matches, and keeps personal stars searchable with tags and collections.

## Features

- **Public Project Preview** — paste a public GitHub repository and inspect a
read-only recommendation sample before sign-in
- **Public Project Preview** — inspect a read-only recommendation sample for a
cataloged repository before sign-in; uncataloged lookups use the user's
existing GitHub session
- **GitHub OAuth** — Sign in and sync your starred repos
- **Smart Categories** — Auto-categorize repos (AI/ML, Frontend, DevOps, etc.)
- **Custom Tags** — Create and assign colored tags to repos
Expand Down
3 changes: 2 additions & 1 deletion docs/architecture/data-flow.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ history and remains empty when insufficient samples exist.
```text
public GitHub URL or owner/repository
→ normalize and check the local catalog
→ resolve one public GitHub repository on a catalog miss
→ require the existing GitHub session token on a catalog miss
→ resolve one public GitHub repository with authenticated quota
→ public preview: no user-owned write
→ authenticated connection only after explicit confirmation
→ upsert shared repos row
Expand Down
1 change: 1 addition & 0 deletions docs/development/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Source of truth: `scripts` in `package.json`. This page annotates intent; run
| --- | --- |
| `pnpm cf:build` | `next build --webpack` + inline critical CSS + `opennextjs-cloudflare build --skipNextBuild` + `populateCache local` + landing-astro build + overlay |
| `pnpm build:cf` | Alias for `cf:build` |
| `pnpm build:e2e` | Credential-free OpenNext build plus Astro landing overlay for browser tests |
| `pnpm preview:cf` | `build:cf` + `opennextjs-cloudflare preview` |
| `pnpm deploy:cf` | `build:cf` + SHA-tagged `opennextjs-cloudflare deploy` (manual) |
| `pnpm cf:typegen` | `wrangler types --env-interface CloudflareEnv ./cloudflare-env.d.ts` |
Expand Down
17 changes: 14 additions & 3 deletions docs/development/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,19 @@ pnpm test:coverage # vitest run --coverage
## End-to-end (Playwright)

- **Runner:** Playwright. Config in `playwright.config.ts`. Tests in `e2e/`.
- `pnpm test:e2e` — desktop project.
- `pnpm test:e2e:mobile` — mobile project.
- `pnpm test:e2e` — runs `build:e2e` locally to produce a credential-free
OpenNext artifact, overlays the real Astro landing, then exercises landing
and mocked public-product journeys at desktop and mobile widths. CI builds
that artifact once before starting Playwright.
- Playwright starts the artifact with `wrangler.e2e.jsonc`, a local-only
binding set and applies migrations to its disposable local D1 before the
preview starts. The config omits Cloudflare AI, Vectorize, and service
bindings, so the suite needs no operator credentials and cannot call those
production resources.
- Covered journeys: public project CTA, Discover search stability, bounded Tool
Intelligence pagination, the shared repository-intelligence shell, and the
uncataloged-preview sign-in boundary.
- `pnpm test:e2e:mobile` — the mobile Next.js application journeys only.

## Smoke checks

Expand All @@ -47,7 +58,7 @@ pnpm test:coverage # vitest run --coverage
## CI

- `.github/workflows/ci.yml` — push/PR: `pnpm install --frozen-lockfile` →
`lint` → `test:coverage` → `build`.
`lint` → `test:coverage` → `build:e2e` → Chromium install → `test:e2e`.
- `.github/workflows/weekly.yml` — Mondays 09:00 UTC: lint, typecheck, test,
build (catches drift that doesn't surface on push CI).
- `.github/workflows/docs.yml` — push/PR on docs-touching paths: runs
Expand Down
6 changes: 5 additions & 1 deletion docs/operations/ci-cd.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ in [jobs.md](jobs.md); this page covers the push/PR and deploy pipelines.

- **Triggers:** push to `main`/`master`; PRs against `main`/`master`.
- **Steps:** checkout → pnpm setup → Node 22 → `pnpm install --frozen-lockfile`
→ `pnpm lint` → `pnpm test:coverage` → `pnpm build`.
→ `pnpm lint` → `pnpm test:coverage` → `pnpm build:e2e` → Chromium install
→ `pnpm test:e2e`. `build:e2e` creates the OpenNext and Astro-overlaid
artifact without Cloudflare cache population or operator credentials. CI
previews that artifact so the browser suite verifies the landing and app
together.
- **Permissions:** default.

## Deploy (`.github/workflows/deploy.yml`)
Expand Down
2 changes: 1 addition & 1 deletion docs/operations/data-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ retirement requires separate approval.
| D1 `user_repos` (starred/saved state) | irreplaceable-user | GitHub sync via `/api/stars/sync` | Re-sync from GitHub starred list (ETag + HTML scrape) | ~seconds per user | 2026-08-02 |
| D1 `user_projects` | irreplaceable-user | Project connection UI/API | Reconnect public GitHub repositories manually | ~seconds per user | 2026-08-08 |
| D1 `user_lists`, `user_repo_lists` | irreplaceable-user | User UI actions | Not reconstructable — user-curated collections | n/a — export required | 2026-08-02 |
| D1 `comments`, `likes`, `comment_votes` | irreplaceable-user | User UI actions | Not reconstructable — user-generated content | n/a — export required | 2026-08-02 |
| D1 `comments`, `likes`, `comment_votes` | historical inactive user storage | Removed discussion UI; legacy user actions | Not reconstructable — retained for export until a separately approved retention migration | n/a — export required | 2026-08-09 |
| D1 `repo_embeddings` hashes + Vectorize `starboard-repos` values | derived | Worker binding embedding jobs | Re-embed from `repos` + `repo_ai_metadata` text via Workers AI | ~minutes (Workers AI quota) | 2026-08-02 |
| D1 `repo_ai_metadata` | derived | `scripts/enrich-repos.ts` (free-ai gateway) | Re-enrich from `repos` metadata via AI | ~minutes per batch | 2026-08-02 |
| D1 `repo_tools` | derived | `scripts/enrich-tools.ts` | Re-detect from GH tree/manifest/SBOM | ~minutes per batch | 2026-08-02 |
Expand Down
19 changes: 12 additions & 7 deletions docs/product/features.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@ reasons, see [../architecture/decisions/](../architecture/decisions/).

## Project-aware discovery

- Guests can preview a public GitHub repository before sign-in. Cataloged
repositories use stored evidence; uncataloged repositories use one public
GitHub metadata lookup. Preview creates no user-owned row.
- Guests can preview a cataloged public GitHub repository before sign-in using
stored evidence. An uncataloged lookup requires the user's existing GitHub
session token so anonymous traffic cannot exhaust a shared quota. Preview
creates no user-owned row in either case.
- Authenticated users can connect a public GitHub repository by URL or
`owner/repository`, or choose from a bounded on-demand list of public GitHub
repositories, without broadening the current OAuth scope.
Expand All @@ -27,10 +28,13 @@ reasons, see [../architecture/decisions/](../architecture/decisions/).

## Public discovery and tool intelligence

- Discover is public and supports search, pagination, language facets, detected
tool facets, and stored 30-day growth ordering.
- Discover is public and supports hybrid semantic-plus-lexical relevance
search with lexical fallback, pagination, language facets, detected-tool
facets, and stored 30-day growth ordering.
- Tool Intelligence aggregates normalized `repo_tools` records across the
seeded corpus and, for authenticated users, the personal library.
- Tool evidence is paginated in bounded 48-repository pages and filtered on the
server, avoiding a 500-card initial render.
- Tool detections preserve category, confidence, and source evidence. The UI
states that detection is evidence-based but not guaranteed complete.
- Repository detail pages include tool evidence, similar repositories, and
Expand Down Expand Up @@ -59,8 +63,9 @@ reasons, see [../architecture/decisions/](../architecture/decisions/).
- Daily and manually dispatched seed, metadata-enrichment, tool-enrichment, and
embedding jobs with explicit per-run bounds.
- Additive ordered D1 migrations; raw SQL with no ORM.
- Vitest unit/integration coverage, Playwright path, Biome checks, docs
validation, and OpenNext Cloudflare builds.
- Selective core-logic Vitest coverage, Playwright journeys against the actual
Astro-overlaid Cloudflare preview, Biome checks, docs validation, and
OpenNext Cloudflare builds.

## Deliberately removed

Expand Down
Loading