本文へ移動
cccskills
無料GitHub で公開

new-api-version

Guided workflow for standing up a new Jellyfin apiVersion tier (V3, V4, …) in JellyRock when an upstream release restructures the API enough to need a new `if m.getApiVersion() >= N` dispatch level. Wraps the "Add an API tier" recipe in docs/dev/jellyfin-server-versioning.md and walks every surface that must move together (the boundary map in YAML, its BrightScript twin `resolveApiVersion()`, the `sdkVN.bs` endpoints, the dispatch branches, the device profile, the manifest tier clamp, and the validators), stopping at each step so the tier split cannot land half-built. Use when proactive RC/master triage (via `/server-upgrade <rc-or-unstable>`) shows a breaking API shift that a per-method `>= N` branch must cover. Not for routine endpoint additions inside an existing tier (those use the existing `>= 2` shape directly).

日本語の概要は準備中です。原文の説明を表示しています。

jellyrock/jellyrockスター 46(GitHub 46 + cccskills 0)

実行スコア 未検証

インストール方法を見る

含まれるファイル(1)

  • SKILL.md12.1 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

/new-api-version: stand up a new apiVersion tier (V3, V4, …)

JellyRock dispatches Jellyfin endpoints by an integer apiVersion tier, with if m.getApiVersion() >= N (V1 is server 10.7 to 10.8, V2 is 10.9 and later). When an upstream release restructures the API enough that a branch needs a new level, you stand up the next tier. This skill wraps the recipe in docs/dev/jellyfin-server-versioning.md ("Add an API tier") and walks each surface in order, so a contributor cannot land a half-built tier. Read that section first; the steps below put it in order and add the checks. Stop after each step, show the user its diff, and wait for their go-ahead.

The rule everything rests on: three twins must agree. docs/dev/jellyfin-version-boundaries.yml (what the server-upgrade tooling reads), source/utils/misc.bs resolveApiVersion() (what the app runs to pick the tier), and the sdkVN.bs filename convention the manifest generator keys off. If they disagree, the dispatch is dead code or the tooling's tier analysis is wrong. Every step keeps them in step.

Step 0: Confirm a new tier is warranted

A new tier is justified only when an endpoint JellyRock uses changes shape in a way a single new >= N branch must guard (a moved path, a restructured request or response, a moved parameter): the kind of shift V1 to V2 was, not a one-off field change. Additive fields are handled with isValid()/?? in place; a routine new endpoint uses the existing top tier's >= 2 shape directly (see source/api/CLAUDE.md). If that's all this is, stop and use that. Ask the user to name the concrete breaking change(s) and the server version X that introduces them (usually surfaced by /server-upgrade <rc-or-unstable>'s proactive triage). Do not proceed without X.

Step 1: The boundary map and its BrightScript twin, together

These are the two halves of the same fact; they ship in one change set.

  1. Boundary map: in docs/dev/jellyfin-version-boundaries.yml: the next tier N = (highest existing key) + 1. Flip the currently active tier to frozen with a concrete maxServer: the last release before X, as a full MAJOR.MINOR.PATCH version (a two-part 12.0 drops every 12.0.x patch out of its tier, because the comparison counts 12.0.3 as above 12.0); add tier N as active, minServer: X, maxServer: null. Propose the diff and wait for confirmation (two systems read this file). The loader enforces exactly one active tier and it must be the unbounded one, so flip-and-add is atomic. Example, tier 3 from 12.1.0, with 12.0.4 standing in for the last 12.0 release:

    tiers:
      2: { minServer: '10.9.0', maxServer: '12.0.4', status: frozen }   # was active, maxServer null
      3: { minServer: '12.1.0', maxServer: null, status: active }       # new
    
  2. resolveApiVersion() twin: in source/utils/misc.bs, add the new tier's check above the existing ones (highest version wins), mirroring the YAML minServer, and update the header comment:

    if versionChecker(serverVersion, "12.1.0")   ' V3 min, matches boundaries.yml tier 3
      return 3
    end if
    if versionChecker(serverVersion, "10.9.0")
      return 2
    end if
    return 1
    

Step 2: Add the dispatch branches, and a sdkVN.bs shim only if one is needed

Most tiered endpoints are written directly in source/api/ApiClient.bs, each branching on m.getApiVersion(). The version-named shim files (source/api/sdkV1.bs, source/api/sdkV2.bs) hold only users.GetImageURL(). The manifest generator's tier clamp keys off their file names (Step 4).

  1. Create source/api/sdkV<N>.bs (modeled on sdkV2.bs) only if a shim-backed call such as the user image URL changes. Otherwise add no shim.
  2. Add the if m.getApiVersion() >= N dispatch branches in source/api/ApiClient.bs: keep the existing >= 2 shape, and put the new >= N branch ahead of it. git grep -n getApiVersion -- source components lists every dispatch site, so none is missed; existing >= 2 branches keep serving the new tier until you add one. End each new branch in a return: the manifest extractor narrows the older branch's range only after a newer branch that returns, so a branch that falls through gives the older one the wrong range.
  3. You fill in each endpoint's request and response from the diff: this skill scaffolds the file and branches and points at the sites; it does not invent the new API shape. Leave a clear TODO(V<N>) marker on any branch you stub before the spec finalizes (a release candidate can still change, which is why /server-upgrade compares again).

Step 3: The device profile branch

If the new tier changes the device profile's shape, add a tier N branch to getDeviceProfile() in source/utils/deviceCapabilities.bs, keyed on getApiVersionFromGlobal() like the V1 and V2 branches. Skip this step if the profile is unchanged.

Step 4: The manifest tier clamp, then regenerate

The API-usage manifest (docs/architecture/api-usage-manifest.json) is generated from the AST, and CI fails on drift. Its cross-function dispatch clamp, in scripts/generate/api-usage-manifest.js beside the sdkV1.bs and sdkV2.bs clamps, pins endpoints by shim file name. Only if Step 2 added a sdkV<N>.bs, add the new tier there and clamp the now-frozen middle tier:

  • sdkV<N>.bs gets minApiVersion = Math.max(min, N)
  • the previously active shim (sdkV2.bs, for example) gains a maxApiVersion = Math.min(max ?? N-1, N-1) clamp, since it is now the frozen middle tier

Without a new shim, add no clamp: capping sdkV2.bs would mark its calls as not served on the new tier, though the >= 2 branch still serves them. The >= N branches from Step 2 set the ranges on their own.

Then regenerate it and commit:

npm run docs:api-manifest    # re-extracts; the >= N branches from Step 2 are picked up automatically

Step 5: The endpoint-availability ledger, if relevant

If the new tier introduces endpoints reached on older servers via a guard/sibling, register them in docs/dev/jellyfin-endpoint-availability.yml (see its header for the schema) so the floor-coverage check doesn't re-flag them every release, then validate:

npm run lint:endpoint-availability   # checks each entry's guard/sibling claim against current code

Step 6: Verify statically, with no Roku

Standing up a tier is verified entirely by static analysis of the .bs sources (the same kind of AST scan CI already runs over the API files), so you never install on a device to confirm the wiring:

  1. The twin-consistency gate, the check everything rests on: npm run lint:apiversion-consistency parses resolveApiVersion() from misc.bs with the BrighterScript AST and asserts that its versionChecker(serverVersion, "X.Y.Z") guards, each returning a tier, exactly match the boundary map (right minServer per tier, right fallback, highest-tier-first order). If Step 1's two halves drifted, this fails with the specific mismatch.
  2. Dispatch wiring: npm run docs:api-manifest re-extracts the manifest from the AST; the >= N branches from Step 2 and the sdkV<N>.bs file name now show the new tier range on the affected endpoints. A missing branch shows up as drift in the committed manifest (CI-gated).
  3. Boundary validity: npm run test:scripts runs version-boundaries.test.js (loads and validates the real committed map; a malformed Step 1 edit fails here), apiversion-consistency.test.js, and the manifest drift gate. npm run lint:docs checks the doc references.
  4. Optional, not required: extend tests/source/unit/utils/resolveApiVersion.spec.bs with a case for X returning N if you want runtime coverage too, but the static gate above already proves the twin is correct offline. Don't block the tier on a device being reachable.

Step 7: Docs and fingerprint

  1. Prose twins: add the new tier to docs/dev/jellyfin-server-versioning.md ("The API tier" table) and to the V1 and V2 line in source/api/CLAUDE.md. Also docs/user/jellyfin-server-feature-matrix.md if user-facing support changed. Other docs and comments state the two-tier set too (server-upgrade-automation.md, api-usage-manifest.md, api.md, the comments in the boundary map and the endpoint ledger): find them with git grep -n -E "V1 and V2|two tiers|2-tier" -- docs source scripts. An architecture doc you change gets its last-reviewed bumped after you re-read it.
  2. The unset default: getApiVersionFromGlobal() returns 2 when the tier is unset or 0. Ask the user whether that default should move to the new tier.
  3. Fingerprint: no new fingerprint for the RC/master that prompted this; the next acknowledged stable release commits its fingerprint via the normal /server-upgrade flow. The floor (10.7.0) never moves, so the backward/symmetry checks need no change.

Step 8: Record the decision and close out

Standing up a tier is decision-shaped (it closes off cramming the new shape into the existing tier). Offer to invoke /log decision with a slug like apiversion-v<N>-split capturing why X warranted a new tier. Summarize the surfaces touched and flag any TODO(V<N>) stubs left for when the spec finalizes. If this came from a /server-upgrade <rc> triage, remind the user to re-run that against the FINAL stable when it ships (the RC can still change).

When not to use

  • A routine new endpoint or an added field on a current-tier server: use the existing if m.getApiVersion() >= 2 shape directly; no new tier.
  • A registry-schema change for a user setting: use /new-migration.
  • You want to know what a release candidate or master build changes: use /server-upgrade <rc-or-unstable> (this skill is the follow-up when that triage says a new tier is warranted).

Sub-agent invocation

To invoke from a parent sub-agent: parent passes Read .claude/skills/new-api-version/SKILL.md and follow Steps 0-8 to stand up apiVersion tier N for server version X=<version>, wrapping the jellyfin-server-versioning.md recipe; keep jellyfin-version-boundaries.yml, resolveApiVersion() and the sdkVN.bs manifest clamp in step; scaffold the shim and dispatch branches and stop at each validator in the Agent prompt.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

コメント

ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。

まだコメントはありません。最初のコメントを書いてみませんか。

送信するとすぐに公開されます。メールアドレスや電話番号などの個人情報は書かないでください。URL は 2 つまでです。

0 / 1000 文字

このフォームは reCAPTCHA で保護されており、Google のプライバシーポリシーと利用規約が適用されます。

同じリポジトリのスキル

catchup

無料

Session-start briefing: where did I leave off, what is in flight, what needs attention. One tested script reads git, the journal (followups, running work, cadences) and tracked projects and prints every fixed-threshold check that fires; JellyRock's own aggregator adds open PRs, high-engagement bugs, recent bug reports, current-branch CI, pending handoffs, open upstream-watch issues (Jellyfin releases and release candidates, Roku OS), recent ADRs, tech debt and architecture-doc staleness. Ends with one Suggested next move that hands off to /log, /done, /issue-triage, /runtime-triage, /ci-triage or /server-upgrade. Mandated by AGENTS.md's catchup-discipline rule: run at the start of any genuine new session, after a multi-day gap, or whenever you ask what the state of the world is.

日本語の概要は準備中です。原文の説明を表示しています。

jellyrock/jellyrock462026年10月26日 更新

ci-triage

無料

Diagnose a failed CI workflow run and fix it the /snag way. A tested read-only script fetches the run, reports every failed job and step with the log region around its errors (not the post-job cleanup), and classifies each against this repo's gates.tsv, printing the banner a gate carries when its obvious fix is the wrong one. Then: re-run only what is transient, reproduce locally, find the root cause, and show one decision screen; the chosen fix is built test-first and committed on a fix branch, never pushed. Use when a CI run failed on a pull request or on the default branch.

日本語の概要は準備中です。原文の説明を表示しています。

jellyrock/jellyrock462026年10月26日 更新

DEPRECATED, replaced by the `enrich` phase built into /crash-report. The old flow filed crash issues first and enriched them one by one afterward. The new flow (stage, then enrich, then file) pulls the dashboard backtrace before filing, so issues are born complete and architectural-class crashes go to their epic instead of becoming standalone issues. Do not invoke it for new work: run /crash-report and paste the backtraces during its enrich step. It stays only as a redirect; the `enrich-issue` script subcommand still exists as a legacy escape hatch for a crash issue filed before the change.

日本語の概要は準備中です。原文の説明を表示しています。

jellyrock/jellyrock462026年10月26日 更新

Process a Roku weekly crash-report CSV (or a zip holding one or more CSVs) into tracked GitHub issues and architectural-epic evidence, enriching before filing (stage, then enrich, then file). STAGE parses and filters the CSV, groups by pkg-path signature, builds each cited app version in a temporary git worktree, maps the transpiled `.brs` line back to the source `.bs` line, runs the GitHub dedup search, and writes a local worksheet where every crash starts pending; a mechanism hint (task-launch, network, other) orders which to pull first but never authorizes a file. ENRICH folds in the per-crash backtraces you paste from Roku's dashboard (a 7-day window, one click per crash, no bulk export), extracts each `&hNN` exception code, and routes every crash to a disposition (nothing files or aggregates without a backtrace): `file` (a scoped bug becomes a new per-signature [crash] issue, born enriched), `aggregate` (a known architectural class: `&h29` big-library too-many-task-threads, `&h23` render-thread execution timeouts, the `&hec` init `m.global.constants` race; upserted as one flat record comment per `file·function·line·version` onto the class epic, never a standalone issue), or `watch` (accepted noise, a spike comment only). FILE performs the GitHub writes (create, comment or reopen for scoped bugs; the epic record upsert for architectural classes) and writes a run-summary handoff. Dedup-aware and idempotent. Use when a fresh Roku crash CSV arrives (weekly). A deep dive on one crash goes to `/issue-triage <N>` after filing.

日本語の概要は準備中です。原文の説明を表示しています。

jellyrock/jellyrock462026年10月26日 更新

Draft a GitHub issue body for the JellyRock repo from a Reddit/Discord post or free-form bug report and submit it via forge.sh. Reads the YAML form templates under .github/ISSUE_TEMPLATE/ to know which fields are required, fills them by extracting from the input, asks for any missing required fields, validates the body matches the chosen template's schema, then runs forge.sh issue create with the auto-labels the template defines. Use when you have a user report (paste from anywhere) and want to formalize it into a properly-structured GitHub issue.

日本語の概要は準備中です。原文の説明を表示しています。

jellyrock/jellyrock462026年10月26日 更新

dep-major

無料

Walk a major dependency-version bump (a Renovate major PR, possibly a grouped one carrying several deps, or a package you name) through JellyRock's major-bump SOP so the judgment steps run the same way every time. Resolves each package and its from and to versions, fetches the upstream changelog/migration guide for that range, classifies the breaking changes, greps the codebase for the call sites those breaks actually hit, runs the mechanical gate that fits the dependency's type (a runtime BrightScript lib: validate, build, lint:bs, then test:unit and test:rta on a device; JS or Node tooling: test:scripts, then run the affected script; GitHub Actions: the PR's own CI plus a trace of the conditional paths CI doesn't exercise), and returns a go/no-go with any required migration surfaced (and applied on request). Majors never automerge (the org Renovate config), so this is the human-review path. Use when a Renovate major PR appears, or before bumping a dependency's major version by hand. Not for patch or minor bumps (those automerge after a soak) or for Jellyfin server releases (use /server-upgrade).

日本語の概要は準備中です。原文の説明を表示しています。

jellyrock/jellyrock462026年10月26日 更新

jellyrock のスキルをすべて見る

このスキルの問題を報告する