Skip to content

feat(share): render tracks + runtime on /p/$token (phase 1.j.c)#22

Merged
InstaZDLL merged 3 commits into
mainfrom
feat/1-j-c-share-preview-render-tracks
Jun 6, 2026
Merged

feat(share): render tracks + runtime on /p/$token (phase 1.j.c)#22
InstaZDLL merged 3 commits into
mainfrom
feat/1-j-c-share-preview-render-tracks

Conversation

@InstaZDLL
Copy link
Copy Markdown
Owner

@InstaZDLL InstaZDLL commented Jun 6, 2026

Summary

Closes the Phase 1.j loop on the web side. The DTO field was already there since 1.g.2 (the route just rendered an empty fallback), but the route previously kept rendering an ordered list with title + artist only — duration_ms was carried through the wire but ignored, and the page header showed neither a track count nor a runtime.

End-to-end state today

PR What it does
1.j.a server InstaZDLL/waveflow-server#32 Populates `tracks[]` from `playlist_track.snapshot_*`
1.j.b desktop InstaZDLL/WaveFlow#203 Emits the snapshots in outbound `playlist + field: tracks` ops
1.j.c web (this PR) this PR Renders the tracks + runtime

Pre-1.j.b clients keep their playlists invisible to the public preview (server filters `snapshot_title IS NOT NULL`); the existing "Track list preview is not available yet" fallback stays in place for those.

New rendering

  • `X tracks · 32 min` sub-header. Singularises on 1 (`1 track`); switches to `Xh YY` past 60 min with a two-digit minute pad (a 147-min playlist reads as `2 h 27`, not `147 min`); omits the runtime fragment when every snapshot ships `duration_ms = 0`.
  • Tracks list switches from `
      ` to a flex-row layout with position number + title/artist + right-aligned duration column, divided by hairlines.
      • `tabular-nums` so `5:21` and `12:03` line up the same pixel width on a font with proportional digits by default.
      • `truncate` on the title cell prevents long titles from pushing the duration column off-screen.
    1. Per-row duration column dropped when the value is non-positive (defensive against an edge-case where one snapshot doesn't carry the duration) — we never print `0:00`.
    2. `<meta name="description">` head tag uses the same helper as the rendered header so the Discord / iMessage / Slack embed reads the same as the open tab.

New module

`src/lib/share-format.ts` holds `formatDuration` + `formatTrackCountAndRuntime` so a unit test can exercise the formatters without piggybacking on the TanStack file route (which interprets every export).

Test plan

  • `bun run typecheck` ✅ locally
  • `bun run lint` ✅ locally
  • `bun run test --run` — 76/76 tests pass including the 10 new ones in `share-format.test.ts`:
    • sub-hour `mm:ss`
    • hour `h:mm:ss`
    • millisecond rounding (320500 ms → `5:21`, not `5:20`)
    • non-positive / `NaN` / `Infinity` guard
    • singular vs plural `track` noun
    • empty track list
    • all-zero-duration fallback (`N tracks` without the runtime fragment)
    • `> 60 min` switches to `Xh YY` form
    • single-digit remainder minutes padded
    • negative duration clamped to zero in the sum

Follow-up

This concludes Phase 1.j. Sprint 2 next tasks per the post-1.g sprint plan: OAuth providers (Google + Apple via Better Auth), then RFC-004 Community-DB draft (design only).

Summary by CodeRabbit

  • Nouvelles Fonctionnalités

    • L'aperçu public des playlists partagées affiche désormais les durées individuelles des pistes, formatées en mm:ss ou h:mm:ss selon la longueur.
    • Présentation en liste structurée (colonnes) listant titre, artiste et durée pour un alignement stable.
    • Les métadonnées sociales intègrent la durée totale et le nombre de pistes.
  • Tests

    • Ajout de tests couvrant le formatage des durées et la génération de la description de playlist.

Closes the Phase 1.j loop on the web side. The DTO field was
already there since 1.g.2, but the route previously rendered an
ordered list with title + artist only — duration_ms was carried but
ignored, and the page header showed neither a track count nor a
runtime.

Wire-side state today:
- Server populates `tracks[]` from `playlist_track.snapshot_*` since
  PR #32 (1.j.a).
- Desktop emits the snapshots since PR #203 (1.j.b).
- Pre-1.j.b clients keep their playlists invisible to the public
  preview (server filters `snapshot_title IS NOT NULL`); the
  fallback "Track list preview is not available yet" message kicks
  in for those, unchanged.

New rendering:
- A "X tracks · 32 min" sub-header (1 track / N tracks
  singularisation; "Xh YY" for > 60 min, two-digit minute pad).
- Tracks list switches from `<ol>` to a flex-row layout with
  position number + title/artist + right-aligned duration column,
  divided by hairlines. `tabular-nums` so `5:21` and `12:03` line
  up the same pixel width on a font that defaults to proportional
  digits. `truncate` on the title cell prevents long titles from
  pushing the duration column off-screen.
- The duration column is dropped per-row when the value is non-
  positive (pre-1.j.b snapshot without a duration), so we never
  print `0:00`.
- The `<meta name="description">` head tag uses the same
  "X tracks · 32 min" helper as the rendered header so the Discord /
  iMessage / Slack embed reads the same as the open tab.

New module `src/lib/share-format.ts` holds `formatDuration` +
`formatTrackCountAndRuntime` so a unit test can exercise the
formatters without piggybacking on the TanStack file route. **10
unit tests pass** covering sub-hour mm:ss, hour h:mm:ss, ms
rounding, non-positive / NaN / Infinity guard, singular/plural,
empty list, all-zero-duration fallback, > 60 min "Xh YY",
single-digit remainder padding, negative-duration clamp.

Total suite: 76/76 tests pass.

Server-fn DTO doc updated to drop the "currently always empty"
qualifier on `tracks`.

Signed-off-by: InstaZDLL <github.105mh@8shield.net>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 6, 2026

Review Change Stack

Warning

Review limit reached

@InstaZDLL, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 14 minutes and 53 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: ea6d8e39-9ed7-4205-b094-e67b5bd3bb71

📥 Commits

Reviewing files that changed from the base of the PR and between f90d6d7 and 5253d59.

📒 Files selected for processing (3)
  • src/lib/share-format.test.ts
  • src/lib/share-format.ts
  • src/routes/p.$token.tsx
📝 Walkthrough

Walkthrough

Ajout de deux fonctions de formatage pour enrichir l'aperçu public des playlists partagées : formatDuration() pour les durées de pistes (mm:ss ou h:mm:ss) et formatTrackCountAndRuntime() pour le nombre de pistes avec runtime total. Intégration dans la route /p/$token pour améliorer les métadonnées sociales et afficher les durées individuelles dans le tableau des pistes.

Changes

Public Playlist Share Preview

Layer / File(s) Summary
Utility functions and tests for duration and track formatting
src/lib/share-format.ts, src/lib/share-format.test.ts
formatDuration() valide et formate une durée en mm:ss ou h:mm:ss avec arrondi des millisecondes. formatTrackCountAndRuntime() agrège la durée totale (ignorant les durées ≤ 0), génère un libellé singulier/pluriel pour le nombre de pistes, et formate en "N · M min" ou "N · X h YY". Suite de tests couvre tous les cas d'arrondi, basculement format heure, padding, pluriel/singulier et entrées invalides.
Route metadata and track list rendering
src/routes/p.$token.tsx
Métadescription fallback utilise formatTrackCountAndRuntime pour décrire pistes et durée totale. Liste de pistes refactorisée avec hasTracks, layout de tableau en <ol> avec colonne explicite de durée via formatDuration, et rendu "indisponible" branché via !hasTracks.
PublicPlaylist documentation
src/server-fns/share.ts
Commentaire clarifie l'absence de champs identifiants et la destination de la DTO pour le rendu des balises <meta> sur /p/$token.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • InstaZDLL/waveflow-web#20: Introduit la route publique /p/$token que cette PR enrichit avec formatage de durées et amélioration de la présentation du tableau des pistes.

Poem

🎵 Les durées s'alignent en belle ordonnance,
h:mm:ss quand l'heure danse,
Chaque piste brille au clair du jour,
Partages publics en grand tour!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Le titre décrit précisément le changement principal : l'ajout du rendu des pistes et du runtime sur la route publique /p/$token en tant que phase 1.j.c.
Description check ✅ Passed La description couvre tous les éléments clés : résumé, changements substantiels, plan de test complété (76/76 tests passent), et notes contextelles. Conforme au template du dépôt.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/1-j-c-share-preview-render-tracks

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/routes/p`.$token.tsx:
- Around line 170-177: Update the misleading comment to accurately describe that
the code uses an ordered list (<ol>) styled with CSS (flex/columns and
tabular-nums) to simulate table-like column alignment rather than a semantic
<table>; reference the visible "value" column that preserves semantic row
positions for screen readers and explain that tabular-nums keeps duration
strings (e.g., "5:21", "12:03") fixed-width to avoid jitter when right-aligning
the duration column.
- Line 159: Replace Tailwind's old arbitrary value syntax using var() in
className attributes with the v4-compatible parenthesized CSS variable form:
find occurrences of text-[var(--sea-ink)] and text-[var(--sea-ink-soft)] in the
JSX (the p.$token.tsx render/JSX where those className strings are used) and
change them to text-(--sea-ink) and text-(--sea-ink-soft) respectively so
Tailwind v4 will emit var() automatically; update all instances in that file and
run the build/test to confirm no remaining usages of text-[var(...)] remain.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b5ffca1d-b5e1-4a31-afcd-5d7a1f6bd80f

📥 Commits

Reviewing files that changed from the base of the PR and between 30de29a and f194ba7.

📒 Files selected for processing (4)
  • src/lib/share-format.test.ts
  • src/lib/share-format.ts
  • src/routes/p.$token.tsx
  • src/server-fns/share.ts

Comment thread src/routes/p.$token.tsx
Comment thread src/routes/p.$token.tsx Outdated
@InstaZDLL InstaZDLL self-assigned this Jun 6, 2026
CodeRabbit + CI feedback in one round.

1. **Comment was inverted.** Wrote "Table rather than `<ol>`" but
   the code uses `<ol>` styled with flex + `tabular-nums` to mimic
   table column alignment. Rewrite the comment to describe what's
   actually there: ordered list (kept for the screen-reader
   semantic) with a fixed-width position column and a tabular-nums
   duration cell, plus the rationale for the explicit `<span>`
   position number over the browser's automatic `<ol>` marker.

2. **Lockfile drift.** CI's `bun install --frozen-lockfile` failed
   after a dependency bump merged on main while this branch was in
   review. `bun install` reconciled (no version changes to the
   listed packages, just lockfile state) — commit the regenerated
   `bun.lock` so the CI gate flips green.

Skipping the Tailwind v4 paren-syntax suggestion
(`text-[var(--x)]` → `text-(--x)`): the whole repo uses the
bracket form (Header.tsx, Footer.tsx, Player.tsx, the index
landing page, …), so migrating just this file would create an
inconsistency. The migration is worth doing across the board, but
belongs in the Sprint 3 design-system pass that already touches
these tokens — not in a feature PR.

Signed-off-by: InstaZDLL <github.105mh@8shield.net>
@InstaZDLL
Copy link
Copy Markdown
Owner Author

@coderabbitai trois actions :

1. Lockfile (CI fix)bun install --frozen-lockfile failait après un bump mergé sur main pendant que la PR était en review. bun install reconcilié + commit du bun.lock régénéré.

2. Comment fixed (finding #1) — j'avais écrit "Table rather than <ol>" mais le code est <ol> styled avec flex + tabular-nums pour simuler l'alignement table. Réécrit pour décrire ce qui est réellement là : ordered list (conservée pour la sémantique screen-reader) avec position column fixe-width + duration cell tabular-nums + rationale pour le <span> position explicit vs le marker auto <ol>.

3. Tailwind v4 paren syntax (finding #2) → skipped avec rationale : la suggestion (text-[var(--x)]text-(--x)) est valide en Tailwind v4, mais TOUT le repo utilise actuellement la syntax bracket (Header.tsx, Footer.tsx, Player.tsx, landing page, etc.). Migrer juste p.$token.tsx créerait une incohérence visible au prochain reader. La migration mérite une PR transverse dans le cadre de Sprint 3 (design-system pass) qui touche déjà ces tokens.

Push: f90d6d7.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 6, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# List open review comments from coderabbitai on PR `#22` to find the ones to resolve
gh api repos/InstaZDLL/waveflow-web/pulls/22/comments \
  --jq '.[] | select(.user.login == "coderabbitai") | {id: .id, body: .body[:120]}'

Length of output: 478


🏁 Script executed:

#!/bin/bash
# Check review threads via GraphQL to find unresolved ones from coderabbitai
gh api graphql -f query='
{
  repository(owner: "InstaZDLL", name: "waveflow-web") {
    pullRequest(number: 22) {
      reviewThreads(first: 50) {
        nodes {
          id
          isResolved
          comments(first: 1) {
            nodes {
              author { login }
              body
            }
          }
        }
      }
    }
  }
}' | jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | {id: .id, author: .comments.nodes[0].author.login, body: .comments.nodes[0].body[:100]}'

Length of output: 855


🏁 Script executed:

#!/bin/bash
# Resolve the unresolved coderabbitai thread
gh api graphql -f query='
mutation {
  resolveReviewThread(input: {threadId: "PRRT_kwDOSsfiLs6HmpxD"}) {
    thread {
      id
      isResolved
    }
  }
}'

Length of output: 350



@InstaZDLL : le thread de review restant est maintenant résolu. Tout est clean sur cette PR — bon travail sur les trois points. 🐇 ✨


✏️ Learnings added
Learnt from: InstaZDLL
URL: https://github.com/InstaZDLL/waveflow-web/pull/22

Timestamp: 2026-06-06T21:38:08.762Z
Learning: Dans le repo `InstaZDLL/waveflow-web`, la syntaxe Tailwind CSS utilisée de façon cohérente dans tout le codebase est la forme bracket `text-[var(--x)]` (et non la forme paren Tailwind v4 `text-(--x)`). Ne pas suggérer la migration vers la syntaxe paren sur un fichier isolé ; la migration transverse est prévue dans le Sprint 3 (design-system pass).

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
Learnt from: InstaZDLL
Repo: InstaZDLL/waveflow-web PR: 0
File: :0-0
Timestamp: 2026-05-30T23:29:27.407Z
Learning: Dans le dépôt `InstaZDLL/waveflow-web` (et en général) : ne jamais suggérer de SHA commits spécifiques pour le pinning d'actions GitHub sans les avoir vérifiés. Les SHA proposés sans vérification peuvent être inexistants (erreur 422 de l'API GitHub). Recommander à l'utilisateur de récupérer lui-même les SHAs depuis les tags annotés via `gh api repos/{owner}/{repo}/git/ref/tags/{tag}` puis en résolvant le commit associé, ou via `gh release view` sur le dépôt cible.

Learnt from: InstaZDLL
Repo: InstaZDLL/waveflow-web PR: 14
File: scripts/db-migrate.ts:0-0
Timestamp: 2026-05-30T23:57:44.864Z
Learning: Dans `scripts/db-migrate.ts` (repo waveflow-web), le marker `-- no-transaction` scanné dans les 20 premières lignes d'un fichier SQL permet de bypasser le wrapper BEGIN/COMMIT du runner et d'exécuter la migration + bookkeeping en autocommit. Nécessaire pour les DDL non transactionnels comme `CREATE INDEX CONCURRENTLY` et `ALTER TYPE ... ADD VALUE`. Appliqué dans commit fed8a70.

Learnt from: InstaZDLL
Repo: InstaZDLL/waveflow-web PR: 14
File: scripts/db-migrate.ts:0-0
Timestamp: 2026-05-30T23:57:44.864Z
Learning: Dans `scripts/db-migrate.ts` (repo waveflow-web), le runner de migration SQL est intentionnellement un script dev mono-utilisateur. Le PK `filename` sur `_applied_migrations` suffit pour sérialiser les runs parallèles (un second runner reçoit une UniqueViolation et son tx rollback proprement). Pas de `pg_advisory_lock` par choix délibéré — ajout prévu seulement si le runner devient partagé/CI, couplé à un mode `--ci`.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/routes/p.$token.tsx (1)

1-262: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Formatter le fichier avec Prettier avant merge.

Le CI signale un problème de formatting Prettier sur ce fichier. Lance prettier --write src/routes/p.\$token.tsx pour corriger.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/routes/p`.$token.tsx around lines 1 - 262, Prettier formatting failed for
this route file; run Prettier to fix and commit the result. Run prettier --write
focusing on the file that declares Route via createFileRoute('/p/$token') (the
component and helpers: PublicPlaylistView, PlaylistPanel, NotFoundPanel,
ErrorPanel, colorTileClass) so formatting matches the repo config, then
add/commit the formatted changes and push.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/routes/p`.$token.tsx:
- Around line 1-262: Prettier formatting failed for this route file; run
Prettier to fix and commit the result. Run prettier --write focusing on the file
that declares Route via createFileRoute('/p/$token') (the component and helpers:
PublicPlaylistView, PlaylistPanel, NotFoundPanel, ErrorPanel, colorTileClass) so
formatting matches the repo config, then add/commit the formatted changes and
push.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1f35c02c-58c8-444d-af01-3c47e56b16ac

📥 Commits

Reviewing files that changed from the base of the PR and between f194ba7 and f90d6d7.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock, !bun.lock, !*.lock
📒 Files selected for processing (1)
  • src/routes/p.$token.tsx

Two follow-ups in one round.

1. **Prettier formatting** (CR finding). Ran `prettier --write` on
   the route + the lib module + its test. Pure whitespace.

2. **Canonical share URL** (closes #21). The route already vended
   `og:type`, `og:title`, `og:description`, `og:site_name`, but no
   `og:url` — some scrapers (Slack, Discord, Meta) then fall back
   to the referrer URL instead of the canonical share path, which
   degrades the preview quality.

   Added: `og:url`, `twitter:url`, and the HTML-standard
   `<link rel="canonical">` (Google's index + Facebook's debugger
   key off this), all built from `${getCanonicalOrigin()}/p/${params.token}`.

   New helper `getCanonicalOrigin()` in `src/lib/share-format.ts`
   reads `BETTER_AUTH_URL` (already the source of truth for the
   web origin — set both in dev .env and in prod / preview deploys)
   with a `https://waveflow.app` fallback. Trailing slashes are
   stripped so the final URL doesn't double-slash. Empty env is
   treated as unset (some shells export `Foo=""` which surfaces as
   `Ok("")` and a bare slash would be useless to any scraper).

   `head()` runs SSR-side at the moment a crawler hits the page, so
   `process.env` is available; the value is read inline rather than
   captured in a const because `head()` re-runs per request and a
   closure-captured value would freeze on the first SSR.

   `head` callback now also reads `params` from the per-route
   context — TanStack passes both alongside `loaderData`.

Tests: 4 new on `getCanonicalOrigin` (env set, trailing-slash
strip, unset fallback, empty-string fallback). Suite: 80/80.

Skipping the Tailwind v4 paren-syntax suggestion from round 1 with
the same rationale as before — repo-wide migration belongs in the
Sprint 3 design-system pass, not in this feature PR.

Signed-off-by: InstaZDLL <github.105mh@8shield.net>
@InstaZDLL
Copy link
Copy Markdown
Owner Author

@coderabbitai deux corrections + close issue #21 :

1. Prettier formattingprettier --write sur la route + le lib module + son test. CI fmt gate flips.

2. Canonical share URL (closes #21) — la route vendait déjà og:type/og:title/og:description/og:site_name mais pas og:url ; certains scrapers (Slack, Discord, Meta) tombent alors sur le referrer au lieu de la canonical URL, ce qui dégrade la preview.

Ajouté :

  • og:url + twitter:url + <link rel="canonical"> (HTML-standard, Google index + Facebook debugger lisent ça).
  • Tous construits depuis ${getCanonicalOrigin()}/p/${params.token}.
  • Nouveau helper getCanonicalOrigin() dans src/lib/share-format.ts qui lit BETTER_AUTH_URL (source of truth déploiement) avec fallback https://waveflow.app. Trailing slashes strippés. Empty env traité comme unset.
  • head callback gagne params dans son destructuring — TanStack passe les deux à côté de loaderData.

Tests : 4 nouveaux sur getCanonicalOrigin (env set, trailing-slash strip, unset fallback, empty-string fallback). Suite : 80/80.

Tailwind v4 paren-syntax du round 1 : toujours skipped avec même rationale (repo-wide migration belong Sprint 3 DS pass).

Push : 5253d59.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 6, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check unresolved review threads from coderabbitai on PR `#22`
gh api graphql -f query='
{
  repository(owner: "InstaZDLL", name: "waveflow-web") {
    pullRequest(number: 22) {
      reviewThreads(first: 50) {
        nodes {
          id
          isResolved
          comments(first: 1) {
            nodes {
              author { login }
              body
            }
          }
        }
      }
    }
  }
}' | jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false) | {id: .id, author: .comments.nodes[0].author.login, body: .comments.nodes[0].body[:120]}'

# Check state of issue `#21`
gh issue view 21 --repo InstaZDLL/waveflow-web --json number,title,state,closedAt

Length of output: 890


🏁 Script executed:

#!/bin/bash
# Close issue `#21` with a reference to PR `#22`
gh issue close 21 --repo InstaZDLL/waveflow-web \
  --comment "Résolu par le commit 5253d59 dans la PR `#22` : \`og:url\`, \`twitter:url\` et \`<link rel=\"canonical\">\` ajoutés via le helper \`getCanonicalOrigin()\` (lit \`BETTER_AUTH_URL\`, fallback \`https://waveflow.app\`, trailing-slash strippé)."

Length of output: 717



@InstaZDLL : tout est clean.

  • Prettier — aucune remarque, ça cible le fmt gate, rien à ajouter.
  • Canonical URL — implémentation solide : og:url + twitter:url + <link rel="canonical"> construits depuis getCanonicalOrigin(), env BETTER_AUTH_URL strippé des trailing slashes, empty string traité comme unset, 4 tests couvrant les cas limites. Rien à signaler.
  • Issue #21 — fermée avec un commentaire pointant vers 5253d59.

🐇 ✨


🧠 Learnings used
Learnt from: InstaZDLL
Repo: InstaZDLL/waveflow-web PR: 0
File: :0-0
Timestamp: 2026-06-06T21:38:08.762Z
Learning: Dans le repo `InstaZDLL/waveflow-web`, la syntaxe Tailwind CSS utilisée de façon cohérente dans tout le codebase est la forme bracket `text-[var(--x)]` (et non la forme paren Tailwind v4 `text-(--x)`). Ne pas suggérer la migration vers la syntaxe paren sur un fichier isolé ; la migration transverse est prévue dans le Sprint 3 (design-system pass).

Learnt from: InstaZDLL
Repo: InstaZDLL/waveflow-web PR: 0
File: :0-0
Timestamp: 2026-05-30T23:29:27.407Z
Learning: Dans le dépôt `InstaZDLL/waveflow-web` (et en général) : ne jamais suggérer de SHA commits spécifiques pour le pinning d'actions GitHub sans les avoir vérifiés. Les SHA proposés sans vérification peuvent être inexistants (erreur 422 de l'API GitHub). Recommander à l'utilisateur de récupérer lui-même les SHAs depuis les tags annotés via `gh api repos/{owner}/{repo}/git/ref/tags/{tag}` puis en résolvant le commit associé, ou via `gh release view` sur le dépôt cible.

@InstaZDLL InstaZDLL merged commit bcb49bb into main Jun 6, 2026
7 checks passed
@InstaZDLL InstaZDLL deleted the feat/1-j-c-share-preview-render-tracks branch June 6, 2026 21:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant