Skip to content

refactor(claude): スキルを二層レイアウト化(個人層 + fleet 公式層)+ maintainer マーカー + canonical inject hook#34

Merged
gotomts merged 4 commits into
mainfrom
claude/dotfiles-skills-maintainer-j5LEh
Jun 6, 2026
Merged

refactor(claude): スキルを二層レイアウト化(個人層 + fleet 公式層)+ maintainer マーカー + canonical inject hook#34
gotomts merged 4 commits into
mainfrom
claude/dotfiles-skills-maintainer-j5LEh

Conversation

@gotomts

@gotomts gotomts commented Jun 6, 2026

Copy link
Copy Markdown
Owner

概要

Claude Code のスキルを二層レイアウトに整理する。

パス 中身 nix link 更新
個人・常用層 claude/skills/ 自作10(maintainer: gotomts)+ 外部 vendor 11(無印) ~/.claude/skills に symlink 手動
fleet 層 claude/fleet/skills/ 公式スキル45(無印) ❌ link しない(canonical のみ) npx skills update

fleet 層は global に常時展開せず、Claude Code on the web の SessionStart hook (claude/fleet/inject-fleet.sh) が CLAUDE_CODE_REMOTE 環境でのみ ~/.claude/skills へ inject する canonical 方式。

注入スクリプトは claude/fleet/inject-fleet.sh のみ。curl|bash・Setup script の類は作らない。公式スキルの中身は改変しない。


コミット構成

  1. chore(claude/skills) — 自作10スキルに maintainer: gotomts 付与
  2. feat(claude/skills) — 公式48スキルを skills CLI で vendor 取り込み
  3. refactor(claude) — 二層レイアウト化(prune 3 / fleet 移動45 / inject hook / nix コメント)

(1) maintainer マーカー — 自作10スキル(claude/skills/

無印=外部由来・編集しない / maintainer: gotomts=自作・編集可」の安全ルールを成立させる。frontmatter に1行追記したのみ。

coderabbit-review / conflict-resolver / create-issue / deploy-check / feature-team / linear-next / pick-next / service-design-builder / sleep-guard / wt-cleanup

⚠️ タスク前提との差異(重要)

「既存21個はすべて自作」が前提だったが、git 履歴上11個は外部 vendorだった。安全ルールを壊さないため、これら11個は無印のまま claude/skills/ に残す(マーカーを付けない):

由来 スキル 根拠
mattpocock/skills (MIT) caveman, diagnose, grill-with-docs, improve-codebase-architecture, prototype, triage 22df5cc
mattpocock/skills (MIT) grill-me / tdd / handoff 7905b0f / 34186e1(verbatim) / 6ef5ce4(SHA一致)
coderabbitai (公式) autofix, code-review 81a9935

(2) 公式スキル取り込み → (3) fleet 層へ整理

bunx skills add <repo> --skill '*' --copy で48個取得後、本 PR で 3個 prune・45個を fleet へ移動

prune した3個(Vercel deploy/infra/perf 系)

claude/skills/ から削除し skills-lock.json からも除外。deploy-to-vercel/Archive.zip も削除:

  • vercel-optimize
  • vercel-cli-with-tokens
  • deploy-to-vercel

claude/fleet/skills/ へ移動した公式45個

リポジトリ 個数
flutter/skills 10
dart-lang/skills 9
expo/skills 16
vercel-labs/agent-skills 6(composition-patterns, react-best-practices, react-native-skills, react-view-transitions, web-design-guidelines, writing-guidelines)
vercel-labs/next-skills 3
yusukebe/hono-skill 1

npx skills update 互換(検証済み)

  • skills-lock.jsonclaude/fleet/skills-lock.json へ relocate し、claude/fleet/ を skills CLI の scope ルートにした。
  • lock の skillPathソースリポジトリ内パス(インストール先非依存)のため、エントリ書き換えは不要。lock ファイルの配置のみ移動。
  • 検証: claude/fleet/ を temp に複製し npx skills update hono -p -y を実行 → スコープ検出(OpenClaw=plain skills/)・再取得・in-place 更新が成功。lock 45件維持。

⚠️ update 後の挙動(要周知): skills CLI は更新時に各スキルを canonical store claude/fleet/.agents/skills/<name>(実体)へ置き、claude/fleet/skills/<name> をそこへの symlink に変換する。一方 inject hook は cp -R fleet/skills/.実ファイルをコピーする前提のため、commit する fleet/skills/<name>実ディレクトリである必要がある。npx skills update 実行後にそのまま commit すると symlink + .agents/ が混入し hook が壊れるので、更新後は実ファイルへ flatten(例: cp -RL で再展開し .agents/ を破棄)してから commit する運用を推奨。.agents/.gitignore 追加も検討余地あり。

(4) nix の link 範囲

nix/modules/home/claude.nixclaude/ 配下を個別 path で linkagents / skills / settings.json / CLAUDE.md / AGENTS.md)しているため、claude/fleet/自動的に link 対象外。この設計意図をコメントで明文化した(機能変更なし。コメント内の不正確な hooks 列挙も除去)。

対象外

  • エージェント(claude/agents)は本タスクでは不変。fleet への移動・改名は別タスク A2

確認 / 判断をお願いしたい点

  1. update 後の flatten 運用(上記⚠️)— この前提で良いか。.gitignoreclaude/fleet/.agents/ を追加するか。
  2. 外部 vendor 11個の無印維持 — premise と異なるため最終確認を。
  3. AGENTS.md 未更新 — 「二層レイアウト」「claude/fleet/」「inject-fleet.sh」「maintainer 安全ルール」は「リポジトリ構造」「運用ルール」に追記価値あり。AGENTS.md 自己更新は「承認後」ルールのため本 PR では未着手。承認あれば follow-up で追記する。

検証サマリ

  • claude/skills = 21(個人)、claude/fleet/skills = 45(公式)、claude/fleet/skills-lock.json = 45エントリ。
  • inject-fleet.sh: bash -n 構文 OK、実行権限 100755
  • git は移動を rename 認識(243 R)、prune を pure deletion(Archive.zip 含む)として記録。
  • repo 作業ツリーに .agents / node_modules / *.zip の混入なし。

https://claude.ai/code/session_013P1AG3qdByQ5S38UqYQVMq

Summary by CodeRabbit

  • New Features

    • iOS App Clip 対応ガイドやネイティブUI/アニメーション/メディア等の実践的ドキュメントを追加。Expo 向け多数の機能ガイドを収録。
  • Documentation

    • Expo/Next.js/Flutter/Dart 向けのスキル参照を大量追加(デプロイ、CI/CD、ルーティング、テスト、最適化、brownfield 等)。
  • Chores

    • 複数スキルに maintainer メタデータを追記。fleet 用インジェクションスクリプトとスキルロックファイルを追加。

claude added 2 commits June 6, 2026 03:46
「無印=外部由来・編集しない」安全ルールを成立させるため、自作スキルの
SKILL.md frontmatter に maintainer: gotomts を1行追記する。

対象は git 履歴で自作と確認できた 10 スキル
(coderabbit-review / conflict-resolver / create-issue / deploy-check /
feature-team / linear-next / pick-next / service-design-builder /
sleep-guard / wt-cleanup)。

mattpocock/skills・coderabbitai 由来の外部 vendor スキル 11 個は
「明らかに外部由来」のため無印のまま除外した (PR 本文に列挙)。
npx/bunx skills add (project scope, --copy) で以下6リポジトリの公式スキルを
claude/skills/ 配下に取り込む。更新管理用の追跡メタデータ skills-lock.json
(48 エントリ) も commit し、後で `npx skills update` で更新可能にする。

取り込んだ公式スキルは無印 (maintainer なし)=外部由来・中身は改変しない。

- flutter/skills (10)
- dart-lang/skills (9)
- expo/skills (16)
- vercel-labs/agent-skills (9)
- vercel-labs/next-skills (3)
- yusukebe/hono-skill (1)

go/rust/infra・secure-coding 系は対象外。注入スクリプト/Setup script/hook の
類は一切作らない (注入の仕組みは別途確定済み)。
@coderabbitai

coderabbitai Bot commented Jun 6, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3339aaeb-dadb-4ea9-96c3-0ce980972d3d

📥 Commits

Reviewing files that changed from the base of the PR and between 1e1abd1 and 9874ae8.

📒 Files selected for processing (1)
  • claude/fleet/inject-fleet.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • claude/fleet/inject-fleet.sh

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/dotfiles-skills-maintainer-j5LEh

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 20

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

🟡 Minor comments (32)
claude/skills/add-app-clip/references/native-module.md-15-18 (1)

15-18: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

例外メッセージが機能内容と一致していません。

MissingCurrentWindowSceneException の reason が「review 要求」文脈のままです。ここは App Clip の SKOverlay 表示失敗を示す文言に直してください。

🤖 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 `@claude/skills/add-app-clip/references/native-module.md` around lines 15 - 18,
The exception message in MissingCurrentWindowSceneException is still referencing
a "requesting a review" modal; update the override var reason in the
MissingCurrentWindowSceneException class to describe the App Clip SKOverlay
presentation failure (e.g., that the current window scene couldn't be determined
to present the SKOverlay for the App Clip) so the message matches the class's
actual failure context.
claude/skills/building-native-ui/SKILL.md-14-30 (1)

14-30: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

fenced code block に言語指定が不足しています。

MD040 警告対象です。該当ブロックは ```text など言語を付与してください。

Also applies to: 263-270

🤖 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 `@claude/skills/building-native-ui/SKILL.md` around lines 14 - 30, 該当の fenced
code block(現在表示されている "references/" リストのブロック)に言語指定が無く MD040
警告になっているので、開閉のバックティック三つの直後に言語を追加してください(例: ```text または ```markdown)。対象は現在の
"references/" リストを囲むコードブロックと、同様の未指定ブロックがある箇所(別途指摘された 263–270
行のブロック)です。該当ブロックを探すにはファイル内の "references/" ヘッダやリスト項目(animations.md, controls.md,
form-sheet.md など)を目印にしてください。

Source: Linters/SAST tools

claude/skills/native-data-fetching/SKILL.md-501-505 (1)

501-505: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

環境変数プレフィックスの表記が誤っています。

Line 501 と Line 504 の EXPO*PUBLIC*EXPO_PUBLIC_ に修正してください。現状のままだとそのままコピペした利用者が設定を誤ります。

🤖 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 `@claude/skills/native-data-fetching/SKILL.md` around lines 501 - 505, Update
the incorrect environment variable prefix instances: replace the misleading
`EXPO*PUBLIC*` tokens with the correct `EXPO_PUBLIC_` prefix in the document
(references appear in the SKILL.md text around the API key guidance, e.g., the
lines containing "Use EXPO*PUBLIC* env vars" and "Client-safe keys: EXPO*PUBLIC*
in .env"). Ensure both occurrences are changed so examples and guidance show the
proper `EXPO_PUBLIC_` prefix for client-safe variables.
claude/skills/building-native-ui/references/media.md-5-5 (1)

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

full-screen のハイフン表記に統一してください。

Line 5 の full screen camera は形容詞句なので full-screen camera が自然です。

🤖 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 `@claude/skills/building-native-ui/references/media.md` at line 5, The phrase
"full screen camera" on Line 5 should be changed to the hyphenated adjective
form "full-screen camera" to match the project's `full-screen` style; update the
text in media.md so the sentence reads "Hide navigation headers when there's a
full-screen camera".

Source: Linters/SAST tools

claude/skills/building-native-ui/references/route-structure.md-18-24 (1)

18-24: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

コードフェンスに言語指定を付けてください(MD040)。

該当ブロックは text などを付けるだけで lint 警告を解消できます。

Also applies to: 30-34, 69-77, 95-106, 112-119, 155-169

🤖 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 `@claude/skills/building-native-ui/references/route-structure.md` around lines
18 - 24, 該当のコードフェンス(例: the block showing the directory tree starting with "app/ 
users/  [id].tsx" と同様のスニペット)に言語指定を追加して MD040 を解消してください;具体的にはバックティック3つの開始行を
```text(または適切な言語) に変更し、同様のコードフェンスがある他の箇所(該当ブロック: the directory-tree snippets and
other examples around the shown blocks)にも同様の修正を適用してください。

Source: Linters/SAST tools

claude/skills/next-best-practices/data-patterns.md-7-23 (1)

7-23: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

コードフェンスに言語を指定してください。

Decision Tree のフェンスが未指定で MD040 警告対象です。text を付けてください。

🤖 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 `@claude/skills/next-best-practices/data-patterns.md` around lines 7 - 23, The
code block containing the Decision Tree is missing a fenced-code language tag
which triggers MD040; update the triple-backtick fence that surrounds the
decision tree (the block starting with "Need to fetch data?") to use a language
specifier by changing ``` to ```text so the fence is explicitly marked as plain
text and the MD040 warning is resolved.

Source: Linters/SAST tools

claude/skills/building-native-ui/references/webgpu-three.md-508-519 (1)

508-519: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

コードフェンスの言語指定を追加してください。

2 つのコードブロックが言語未指定で、markdownlint (MD040) 警告になります。text を付けるのが無難です。

Also applies to: 523-539

🤖 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 `@claude/skills/building-native-ui/references/webgpu-three.md` around lines 508
- 519, Add a language specifier to the unlabeled fenced code blocks in the
markdown (the file tree snippet under src/ and the other unlabeled block later)
to satisfy markdownlint MD040: change the opening triple backticks for those
blocks to use "text" (e.g., ```text) so both the src/ tree block and the second
unlabeled block are explicitly marked as plain text; update the fenced block
starts for the blocks that contain the directory listing and the subsequent
unlabeled block referenced in the comment.

Source: Linters/SAST tools

claude/skills/next-best-practices/bundling.md-11-16 (1)

11-16: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

言語未指定のコードフェンスを修正してください。

エラー文のフェンスに言語がなく、MD040 警告が出ます。text 指定を追加してください。

Also applies to: 112-116

🤖 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 `@claude/skills/next-best-practices/bundling.md` around lines 11 - 16, The
markdown contains code fences showing runtime errors without a language tag
(lines with the block starting at the fence that contains "ReferenceError:
window is not defined" etc.), which triggers MD040; update those fences by
adding the language specifier `text` to the opening backticks for both
occurrences (the one around lines ~11-16 and the other around ~112-116) so the
fences read as a text block and the linter warning is resolved.

Source: Linters/SAST tools

claude/skills/building-native-ui/references/tabs.md-317-321 (1)

317-321: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

コードフェンスの言語指定を追加してください。

このコードブロックは言語未指定のため、markdownlint (MD040) 警告が継続します。text などを明示してください。

修正例
-```
+```text
 app/
   _layout.tsx          # NativeTabs for iOS/Android
   _layout.web.tsx      # Headless tabs for web (expo-router/ui)
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/building-native-ui/references/tabs.md around lines 317 - 321,
The markdown code fence for the snippet listing _layout.tsx and _layout.web.tsx
lacks a language tag (causing MD040); update the opening fence from totext (or another appropriate language) so it becomes ```text and keep the
block contents unchanged—this fixes the lint warning for the code block
containing _layout.tsx and _layout.web.tsx.


</details>

<!-- cr-comment:v1:4a38889e4dbc5fc8da9006b4 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/next-best-practices/error-handling.md-218-227 (1)</summary><blockquote>

`218-227`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**コードフェンスに言語指定を追加してください。**

Line 218 のフェンスに言語がなく、Markdown lint(MD040)に抵触しています。  
  

<details>
<summary>修正案</summary>

```diff
-```
+```text
 app/
 ├── error.tsx           # Catches errors from all children
 ├── blog/
 │   ├── error.tsx       # Catches errors in /blog/*
 │   └── [slug]/
 │       ├── error.tsx   # Catches errors in /blog/[slug]
 │       └── page.tsx
 └── layout.tsx          # Errors here go to global-error.tsx
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/next-best-practices/error-handling.md around lines 218 - 227,
The fenced code block showing the app/ tree lacks a language tag and triggers
MD040; update the opening fence from totext for the snippet containing
the lines "app/", "error.tsx", "blog/", "[slug]/", "page.tsx", and "layout.tsx"
so the markdown linter recognizes it as plain text (e.g., change the fence
before the tree diagram to ```text).


</details>

<!-- cr-comment:v1:c8ca4676077d86f013829932 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/dart-collect-coverage/SKILL.md-3-3 (1)</summary><blockquote>

`3-3`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**`description` のスペルミスを修正してください。**

Line 3 の `packge` は `package` が正しいです。検索性と信頼性のために修正を推奨します。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/dart-collect-coverage/SKILL.md` at line 3, Fix the typo in the
front-matter description field: change "packge" to "package" in the description
key (the `description:` line) inside SKILL.md so it reads "Collect coverage
using the coverage package and create an LCOV report".
```

</details>

<!-- cr-comment:v1:ba7859ab3454bade389f4406 -->

</blockquote></details>
<details>
<summary>claude/skills/dart-migrate-to-checks-package/SKILL.md-13-13 (1)</summary><blockquote>

`13-13`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**目次リンクのフラグメントが無効です。**

Line 13 の `#utilizing-dart-mcp-tools` に対応する見出しが本文に存在しません。目次項目の削除か見出し追加をお願いします。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/dart-migrate-to-checks-package/SKILL.md` at line 13, The table
of contents contains an invalid fragment link "`#utilizing-dart-mcp-tools`" that
has no matching heading in SKILL.md; fix by either removing the TOC entry
"[Utilizing Dart MCP Tools](`#utilizing-dart-mcp-tools`)" or adding a
corresponding heading (for example add a heading like "## Utilizing Dart MCP
Tools" with the expected content) so the fragment resolves correctly; update the
TOC or create the heading near related sections to keep structure consistent.
```

</details>

<!-- cr-comment:v1:20cad3d80a75dbf357053ff1 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/dart-fix-runtime-errors/SKILL.md-3-3 (1)</summary><blockquote>

`3-3`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**フロントマター説明と本文の対象が不一致です。**

Line 3 は「実行時スタックトレース修正」を示していますが、本文は静的解析エラー解消が主題です。スキル選択時の誤用を避けるため、説明文を本文に合わせてください。  
  


Also applies to: 8-9

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/dart-fix-runtime-errors/SKILL.md` at line 3, The frontmatter
"description" currently references runtime stack-trace fixing (mentions
get_runtime_errors and lsp) but the document body describes fixing static
analysis errors; update the frontmatter "description" to accurately reflect the
body (e.g., state that the skill uses analyzer/LSP to fetch static analysis
issues, locate failing lines, apply fixes, and verify via hot_reload), and make
the same correction for the other frontmatter entries that match (the ones
currently referenced around the same block).
```

</details>

<!-- cr-comment:v1:f9aaac183f795ce7a868fb8b -->

</blockquote></details>
<details>
<summary>claude/skills/next-cache-components/SKILL.md-65-83 (1)</summary><blockquote>

`65-83`: _⚠️ Potential issue_ | _🟡 Minor_

**`cookies()` を使うサンプルに import を追加**
「3. Dynamic (Suspense)」のコードでは `cookies()` を呼んでいるのに `cookies` の import がありません。コピペ実行できるように `next/headers` から import を追記してください。

<details>
<summary>修正例</summary>

```diff
 import { Suspense } from 'react'
+import { cookies } from 'next/headers'
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/next-cache-components/SKILL.md` around lines 65 - 83, The
UserPreferences component calls cookies() but the module never imports it; add
an import for cookies from 'next/headers' at the top of the file so the
UserPreferences function can call cookies() (update the file that defines Page
and UserPreferences to include: import { cookies } from 'next/headers').
```

</details>

<!-- cr-comment:v1:277ae78f57f70023b8114847 -->

</blockquote></details>
<details>
<summary>claude/skills/deploy-to-vercel/SKILL.md-60-63 (1)</summary><blockquote>

`60-63`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**未指定言語のコードフェンスを解消してください。**

該当ブロックの開始フェンスに `text` などの言語識別子を付けると、lint警告(MD040)が解消されます。  
  


Also applies to: 112-115, 256-264, 276-282, 289-292

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/deploy-to-vercel/SKILL.md around lines 60 - 63, Summary:
Several fenced code blocks in SKILL.md lack a language identifier, triggering
MD040 lint warnings. Fix: edit the opening backtick fences for the blocks that
contain plain prose (e.g. the block starting with "This project is connected to
Vercel via git. I can commit and push to trigger a deployment. Want me to
proceed?") and add a language tag such as text (```text) so the fences are
annotated; apply the same change to the other mentioned blocks (lines 112-115,
256-264, 276-282, 289-292) to eliminate the MD040 warnings.


</details>

<!-- cr-comment:v1:5c74251e22636e81c5dc5df6 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/next-best-practices/self-hosting.md-18-25 (1)</summary><blockquote>

`18-25`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**コードフェンスに言語指定を追加してください。**

ディレクトリツリーのフェンスに `text` を付けると markdownlint の MD040 警告を解消できます。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/next-best-practices/self-hosting.md around lines 18 - 25, The
Markdown code fence containing the directory tree (.next/ standalone/ static/
etc.) lacks a language tag; change the opening fence from totext so the
directory-tree block is fenced as text (e.g., ```text) to resolve the
markdownlint MD040 warning.


</details>

<!-- cr-comment:v1:fdcb02607b3507355804638f -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/expo-api-routes/SKILL.md-35-43 (1)</summary><blockquote>

`35-43`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**コードフェンスに言語を指定してください。**

Line 35 のフェンスが言語未指定で、markdownlint の MD040 警告対象です。`text` などを付与して lint を解消してください。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/expo-api-routes/SKILL.md around lines 35 - 43, The fenced code
block showing the app/ api/ directory tree in SKILL.md is missing a language tag
(triggering markdownlint MD040); update that opening fence (the triple backticks
before the directory listing) to include a language specifier such as "text" or
"txt" so the block becomes "```text" (locate the block that contains the lines
starting with "app/" and the nested "api/" entries and add the language token to
the opening fence).


</details>

<!-- cr-comment:v1:adc2c264729724deac7701ac -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/expo-brownfield/references/brownfield-isolated.md-203-211 (1)</summary><blockquote>

`203-211`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**コードフェンスの言語未指定を解消してください。**

Line 203 のフェンスに言語がなく MD040 警告になります。ツリー表示なら `text` を指定してください。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/expo-brownfield/references/brownfield-isolated.md around lines
203 - 211, The fenced code block showing the artifacts/MyAppPackage tree is
missing a language tag; update the triple-backtick fence that surrounds the tree
(the block beginning with artifacts/MyAppPackage/) to use a language identifier
(use text) so the fence becomes ```text and resolves the MD040 warning.


</details>

<!-- cr-comment:v1:20127c7d7c27cbe52e4a8dc6 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/expo-deployment/SKILL.md-123-125 (1)</summary><blockquote>

`123-125`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**参照パスが `references` と不一致です。**

この範囲だけ `./reference/...`(単数)になっており、先頭セクションの `./references/...` と不整合です。リンク切れ防止のため統一してください。

  

<details>
<summary>修正例</summary>

```diff
-- See ./reference/testflight.md for credential setup
-- See ./reference/ios-app-store.md for App Store submission
+- See ./references/testflight.md for credential setup
+- See ./references/ios-app-store.md for App Store submission
...
-- See ./reference/play-store.md for detailed setup
+- See ./references/play-store.md for detailed setup
...
-- See ./reference/workflows.md for CI/CD automation
+- See ./references/workflows.md for CI/CD automation
...
-See ./reference/workflows.md for more workflow examples.
+See ./references/workflows.md for more workflow examples.
```
</details>


Also applies to: 130-130, 136-136, 165-165

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/expo-deployment/SKILL.md` around lines 123 - 125, Replace the
incorrect singular reference path "./reference/..." with the canonical plural
"./references/..." throughout the file (e.g. change "./reference/testflight.md"
and "./reference/ios-app-store.md" to "./references/testflight.md" and
"./references/ios-app-store.md") and update the other occurrences mentioned
(lines around the instances at 130, 136, and 165) so all links use
"./references/..." consistently.
```

</details>

<!-- cr-comment:v1:0e7a7881e0753409a63784f7 -->

</blockquote></details>
<details>
<summary>claude/skills/expo-cicd-workflows/scripts/validate.js-15-19 (1)</summary><blockquote>

`15-19`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**スキーマ応答の形状を明示検証してください。**

`body.data` を前提にしているため、API異常時に `ajv.compile(undefined)` 側で分かりにくく落ちます。`data` の存在チェックを追加して、ここで原因を返した方が運用しやすいです。

  

<details>
<summary>修正例</summary>

```diff
 async function fetchSchema() {
   const data = await fetchCached(SCHEMA_URL);
   const body = JSON.parse(data);
+  if (!body || typeof body !== 'object' || !body.data) {
+    throw new Error('Invalid schema response: missing `data` field');
+  }
   return body.data;
 }
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/expo-cicd-workflows/scripts/validate.js` around lines 15 - 19,
fetchSchema currently assumes body.data exists and returns it, causing
ajv.compile(undefined) downstream when the API response is malformed; update
fetchSchema (and use fetchCached/SCHEMA_URL) to validate the parsed JSON shape:
check that body is an object and body.data is present (and of the expected
type), and if not throw a clear Error that includes the raw response or parsed
body and SCHEMA_URL so callers see the root cause instead of failing inside
ajv.compile; ensure parse errors from JSON.parse are also caught and rethrown
with context.
```

</details>

<!-- cr-comment:v1:be241ddb3286f75f01585317 -->

</blockquote></details>
<details>
<summary>claude/skills/next-best-practices/file-conventions.md-9-27 (1)</summary><blockquote>

`9-27`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**複数のコードフェンスで言語指定が不足しています。**

Line 9, 43, 54, 65, 84 のフェンスに言語を付けると lint 警告を一括解消できます。  
  

<details>
<summary>修正イメージ</summary>

```diff
-```
+```text
 app/
 ...
 ```
```
</details>


Also applies to: 43-51, 54-62, 65-75, 84-90

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/next-best-practices/file-conventions.md around lines 9 - 27,
Several fenced code blocks in file-conventions.md that show the app/ directory
tree are missing language identifiers; update each opening triple-backtick for
the blocks that start with "app/" (and the similar directory-tree/code-fence
blocks later in the file) to include a language token (e.g., text) so the linter stops flagging missing language on the code fences; ensure you change every occurrence of the plain before those directory-tree blocks to ```text
(or another suitable language) including the blocks around the example shown
starting with "app/".


</details>

<!-- cr-comment:v1:5971721d192ba081318b74c3 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/expo-module/SKILL.md-25-33 (1)</summary><blockquote>

`25-33`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**コードフェンスに言語指定を追加してください。**

Line 25 のフェンスに言語が無いため、lint警告が発生します。`text` などを付けるだけで解消できます。  
  

<details>
<summary>修正案</summary>

```diff
-```
+```text
 references/
   create-expo-module.md      Scaffolding and add-platform-support workflow, defaults, and quirks
   native-module.md           Module definition DSL: Name, Function, AsyncFunction, Property, Constant, Events, type system, shared objects
   native-view.md             Native view components: View, Prop, EventDispatcher, view lifecycle, ref-based functions
   lifecycle.md               Lifecycle hooks: module, iOS app/AppDelegate, Android activity/application listeners
   config-plugin.md           Config plugins: modifying Info.plist, AndroidManifest.xml, reading values in native code
   module-config.md           expo-module.config.json fields, file placement, and autolinking behavior
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/expo-module/SKILL.md around lines 25 - 33, The fenced code
block that lists the "references/" entries in SKILL.md is missing a language
identifier which triggers a lint warning; update the opening fence for that
block (the triple backticks immediately before the "references/" list) to
include a language token such as text (e.g., change totext) so the
linter recognizes the fence and the warning is resolved, leaving the content
unchanged inside the block.


</details>

<!-- cr-comment:v1:c5a16b66a7baf51f73a8ae31 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/expo-module/references/config-plugin.md-7-14 (1)</summary><blockquote>

`7-14`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**コードフェンスに言語指定を追加してください。**

Line 7 のフェンス未指定で markdownlint 警告になります。  
  

<details>
<summary>修正案</summary>

```diff
-```
+```text
 my-module/
   plugin/
     tsconfig.json
     src/
       index.ts
   app.plugin.js         # Entry: module.exports = require('./plugin/build');
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/expo-module/references/config-plugin.md around lines 7 - 14,
The code fence in the example block (starting with the tree lines like
"my-module/", "plugin/", "tsconfig.json", and "app.plugin.js # Entry:
module.exports = require('./plugin/build');") lacks a language identifier;
update the opening fence to include a language (e.g., text) so markdownlint warnings disappear and the block is rendered as intended. Ensure you only change the opening backticks to something like text and leave the block contents
(the module tree and "app.plugin.js" comment) unchanged.


</details>

<!-- cr-comment:v1:7bafc30e03ccfec0eb1ea9b5 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/expo-observe/references/metrics.md-7-7 (1)</summary><blockquote>

`7-7`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**重複文を削除してください。**

Line 7 で `All durations are in seconds.` が2回連続しており、可読性が下がっています。1回に統一してください。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/expo-observe/references/metrics.md` at line 7, Remove the
duplicated sentence "All durations are in seconds." in the metrics.md content
(the repeated phrase in the block that currently reads "All durations are in
seconds. Data is retained for 90 days. All durations are in seconds. ..."); keep
a single instance of that sentence and ensure the surrounding text remains a
single coherent paragraph (refer to the phrase "All durations are in seconds."
to locate the duplicate).
```

</details>

<!-- cr-comment:v1:f91def2c789757a0c853b96d -->

</blockquote></details>
<details>
<summary>claude/skills/next-best-practices/metadata.md-101-108 (1)</summary><blockquote>

`101-108`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**フェンスドコードブロックに言語指定を追加してください。**

Line 101 のコードフェンスが言語未指定です。markdownlint (MD040) 対策として `text` などを付けてください。  
  
<details>
<summary>修正例</summary>

```diff
-```
+```text
 app/
 ├── favicon.ico
 ├── opengraph-image.png     # Works for both OG and Twitter
 ├── sitemap.ts
 ├── robots.ts
 └── layout.tsx              # With title/description metadata
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/next-best-practices/metadata.md around lines 101 - 108, The
fenced code block containing the directory listing (the block starting with and the line "app/") is missing a language tag which triggers markdownlint MD040; update that fence to include a language identifier (e.g., change to
text) so the block becomes text and keeps the same directory listing
content to satisfy the linter.


</details>

<!-- cr-comment:v1:f76a5608fbc62c1648abd795 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/next-best-practices/hydration-error.md-49-52 (1)</summary><blockquote>

`49-52`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**"Bad" 例でも JSX は閉じておいた方が安全です。**

Line 51 の `<div ...>` が未クローズのため、意図が「ランダム値による不一致」ではなく「構文ミス」に見えます。閉じタグを追加して論点を分離してください。  
  
<details>
<summary>修正例</summary>

```diff
-<div id={Math.random().toString()}>
+<div id={Math.random().toString()} />
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/next-best-practices/hydration-error.md` around lines 49 - 52,
The JSX example uses an unclosed element (<div id={Math.random().toString()}>),
which makes the snippet look like a syntax error instead of demonstrating
server/client mismatch; update the example by adding the corresponding closing
tag for the div so the intent (random id causing hydration mismatch) is
preserved—locate the snippet containing <div id={Math.random().toString()}> in
hydration-error.md and add the closing </div> to properly isolate the issue.
```

</details>

<!-- cr-comment:v1:29f95b766dc275407c862aeb -->

</blockquote></details>
<details>
<summary>claude/skills/next-best-practices/route-handlers.md-29-37 (1)</summary><blockquote>

`29-37`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**フェンスコードブロックに言語指定を追加してください(MD040)**

ドキュメント lint を安定させるため、ディレクトリツリー例にも `text` 指定を付与してください。  
  


Also applies to: 41-48

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/next-best-practices/route-handlers.md around lines 29 - 37,
The fenced code blocks showing the directory tree (the blocks starting with and containing the "app/" tree in route-handlers.md) must include a language specifier `text` to satisfy MD040; update both occurrences (the block around the app/ directory example at lines 29-37 and the similar block at 41-48) by changing the opening fence from to ```text so the directory-tree examples
are explicitly marked as plain text.


</details>

<!-- cr-comment:v1:58f9b1d3f62f3cb660f5c1be -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/next-best-practices/parallel-routes.md-7-21 (1)</summary><blockquote>

`7-21`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**フェンスコードブロックに言語指定がなく、Markdown lint(MD040)に抵触します**

` ```text ` などの言語指定を付けてください。  
  


Also applies to: 221-228, 249-262

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/next-best-practices/parallel-routes.md around lines 7 - 21,
The fenced code blocks in parallel-routes.md that show the app directory tree
(the block containing "app/ ├── @modal/ ... └── page.tsx" and the similar
directory-tree blocks later that list files like layout.tsx and page.tsx) lack a
language tag and trigger MD040; update each of those triple-backtick fences to
include a language (e.g., text) so the directory-tree examples are fenced as text ... ``` and ensure every fenced code block in this document has a
language specifier.


</details>

<!-- cr-comment:v1:465443334e7af998fab66936 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/next-best-practices/route-handlers.md-92-104 (1)</summary><blockquote>

`92-104`: _⚠️ Potential issue_ | _🟡 Minor_

**`cookies()` の `next/headers` import がスニペットにありません**  

該当スニペット(Request Helpers のコードフェンス)では `await cookies()` を使用していますが、`cookies` の import が欠けています。`next/headers` から import を明示してください。  
<details>
<summary>修正例</summary>

```diff
+import { cookies } from 'next/headers'
+
 export async function GET(request: Request) {
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/next-best-practices/route-handlers.md` around lines 92 - 104,
The snippet uses await cookies() inside the GET handler but does not import
cookies; add an explicit named import of cookies from 'next/headers' at the top
of the file (so the GET function can call cookies()), e.g. ensure the module
exports include cookies and that there are no conflicting identifiers; update
any existing imports block to include cookies from 'next/headers'.
```

</details>

<!-- cr-comment:v1:79560c0180271214c5fe1b3c -->

</blockquote></details>
<details>
<summary>claude/skills/flutter-build-responsive-layout/SKILL.md-30-31 (1)</summary><blockquote>

`30-31`: _⚠️ Potential issue_ | _🟡 Minor_

**`flex` 係数の表記を「1.0」→「1」に修正**(claude/skills/flutter-build-responsive-layout/SKILL.md:30-31)

`flex` パラメータは `int` で、`Expanded` は実質 `Flexible(fit: FlexFit.tight, flex: 1)` のショートカットなので、「flex factor of 1.0」ではなく「1」と記載してください。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/flutter-build-responsive-layout/SKILL.md` around lines 30 - 31,
Update the documentation text to use an integer literal for the `flex`
parameter: change the phrase "flex factor of 1.0" to "flex factor of 1" and note
that `Expanded` is equivalent to `Flexible(fit: FlexFit.tight, flex: 1)`
(referencing the `Expanded` and `Flexible` symbols and the `flex` parameter).
```

</details>

<!-- cr-comment:v1:1240e8bea3c801997136f704 -->

</blockquote></details>
<details>
<summary>claude/skills/hono/SKILL.md-274-276 (1)</summary><blockquote>

`274-276`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**フェンスコードブロックに言語指定を追加してください。**

Line 274 のコードフェンスが言語未指定です。`text` などを付けると markdownlint(MD040)を解消できます。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In @claude/skills/hono/SKILL.md around lines 274 - 276, The markdown code fence
containing the middleware flow example ("Request → mw1 before → mw2 before →
handler → mw2 after → mw1 after → Response") is missing a language tag; add a
language identifier such as "text" to the opening fence (e.g., ```text) so the
fenced block is lint-compliant (resolves MD040) in SKILL.md where that flow
example appears.


</details>

<!-- cr-comment:v1:f14dfe8b14cbda575a92d081 -->

_Source: Linters/SAST tools_

</blockquote></details>
<details>
<summary>claude/skills/flutter-setup-localization/SKILL.md-3-3 (1)</summary><blockquote>

`3-3`: _⚠️ Potential issue_ | _🟡 Minor_ | _⚡ Quick win_

**`pubspec.yaml` のキー表記を `generate: true` に統一してください。**

description の `"generate true"` は YAML の実記法とズレています。本文では正しく書けているので、先頭説明も同じ表記に揃えると誤設定を防げます。

<details>
<summary>🤖 Prompt for AI Agents</summary>

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

In `@claude/skills/flutter-setup-localization/SKILL.md` at line 3, The description
line in SKILL.md uses the non-YAML token "generate true"; update the text to the
correct YAML key expression "generate: true" so it matches the rest of the doc
and the example in pubspec.yaml and avoids copy/paste errors — specifically
locate the description string mentioning `generate true` and replace it with
`generate: true`, keeping references to `pubspec.yaml` and `l10n.yaml` intact.
```

</details>

<!-- cr-comment:v1:8297739f5fef46901806f751 -->

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

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 @claude/skills/add-app-clip/SKILL.md:

  • Line 122: The statement claiming "no Content-Type requirements" for AASA is
    incorrect; update the SKILL.md wording about apple-app-site-association/AASA to
    require that the file is served with Content-Type: application/json and returned
    directly with a 200 (no redirects), and note that Expo Router's default public/
    verbatim export may not set that header so instruct to configure the hosting or
    middleware to ensure the apple-app-site-association is served with Content-Type:
    application/json and a direct 200 response.

In @claude/skills/building-native-ui/references/controls.md:

  • Around line 175-191: The Stepper example is invalid because there is no
    Stepper export from react-native; update the example by replacing the invalid
    import "import { Stepper } from 'react-native'" and the <Stepper .../> usage
    with either (a) a small self-contained primitive implementation using Button(s)
  • text state (useState, count, setCount, onPress handlers) so the sample uses
    only React Native core components, or (b) explicitly document that a third-party
    package is required and show the correct import and usage for that package;
    locate references to Stepper, the import line, and the JSX <Stepper .../> in the
    controls.md snippet and change them accordingly.

In @claude/skills/building-native-ui/references/toolbar-and-headers.md:

  • Around line 95-101: The Text style uses numeric fontWeight values (e.g.,
    fontWeight: 700) which can cause TypeScript type errors; update all occurrences
    in this file (including the shown Text components and the other instances around
    lines noted) to use string values like fontWeight: "700" (e.g., in the Text
    components where fontWeight is set) so they match the TextStyle type and avoid
    type-check failures.

In @claude/skills/building-native-ui/references/webgpu-three.md:

  • Around line 177-220: FiberCanvas’s useEffect currently runs on every render
    causing repeated createRoot/configure/state.gl.init; change the useEffect in
    FiberCanvas to run once (or with a precise dependency array) so initialization
    happens only on mount/unmount, and ensure cleanup still unmounts the root; also
    add missing useEffect imports where used (add useEffect to the import lists that
    currently only import useRef/useState/useCallback) so the hooks are defined;
    finally fix the markdown code fences flagged by MD040 by adding explicit
    language tags (e.g., ts or text) for the affected fenced blocks.
  • Around line 230-231: The React hook useEffect is used in the Scene and
    GameScene components but not imported; update the React import statement (the
    line that currently imports useRef) to include useEffect so components like
    Scene and GameScene can compile; specifically modify the import that currently
    reads like the one near useRef/useFrame/useThree to also import useEffect from
    "react".

In @claude/skills/deploy-to-vercel/resources/deploy-codex.sh:

  • Line 239: The curl call that sets RESPONSE (POST to "$DEPLOY_ENDPOINT" with
    file "@$TARBALL" and framework "$FRAMEWORK") has no timeout and can hang; add
    sensible timeouts (e.g. --connect-timeout and --max-time) to that POST
    invocation and to the polling curl calls later (the curl calls around lines
    265-267) so the script can fail fast and let MAX_ATTEMPTS retry logic proceed;
    update the RESPONSE assignment and the polling curl invocations to include the
    chosen timeout options.
  • Around line 242-250: The current parsing of RESPONSE using grep/cut (variables
    RESPONSE, ERROR_MSG, PREVIEW_URL, CLAIM_URL) is fragile; replace those branches
    with a real JSON parser (jq or python -c 'import json,sys;...') to detect and
    extract fields reliably: use jq -e '.error' to check for an error and output its
    value into ERROR_MSG (or exit if present), and use jq -r '.previewUrl // empty'
    and jq -r '.claimUrl // empty' to populate PREVIEW_URL and CLAIM_URL safely;
    ensure you handle missing/null values (treat as empty) and propagate non-zero
    exit on parse failure.
  • Around line 201-206: 現在の tar コマンド invocation (tar -C "$PROJECT_PATH" ... -cf -
    . | tar -C "$STAGING_DIR" -xf -) は除外パターンが不十分で secrets/, 鍵ファイル、.npmrc
    等の機密ファイルを含めてしまう恐れがあるので、tar 実行時に追加の --exclude パターンを渡するか --exclude-from を使って
    .vercelignore(存在しない場合は .gitignore)を参照するように変更してください;具体的には少なくとも
    --exclude='secrets' --exclude='.pem' --exclude='.key' --exclude='.npmrc'
    --exclude='.env*' を追加するか、PROJECT_PATH/.vercelignore を用意して tar
    --exclude-from="$PROJECT_PATH/.vercelignore" を使う実装に置き換えてください。

In @claude/skills/deploy-to-vercel/resources/deploy.sh:

  • Around line 201-206: The tar command in the deploy.sh packaging block is too
    permissive and can include secrets; update the tar invocation (the multi-line
    tar -C "$PROJECT_PATH" ... -cf - . | tar -C "$STAGING_DIR" -xf - block) to
    explicitly exclude common sensitive patterns (at minimum: secrets/, .key,
    .pem, .crt, .p12, .npmrc, .env, id_rsa, id_ed25519, and any ssh/
    or
    keys/* directories) and, if present, prefer reading excludes from .vercelignore
    or .gitignore by adding --exclude-from="$PROJECT_PATH/.vercelignore" (or fall
    back to .gitignore) so uploaded tarballs omit private files.
  • Around line 242-250: The script currently parses JSON from the RESPONSE
    variable using fragile grep/cut logic (lines that set ERROR_MSG, PREVIEW_URL,
    CLAIM_URL), which breaks on escaped characters or key-order changes; replace
    those grep/cut extractions with a proper JSON parser (e.g., use jq or python -c
    'import json,sys;...') to reliably detect an "error" field and to extract
    previewUrl and claimUrl from RESPONSE, updating the branches that check for an
    error and set ERROR_MSG, PREVIEW_URL, and CLAIM_URL to use the parser output
    instead of regex extraction.
  • Line 239: The curl call that posts the tarball (assigning RESPONSE from POST
    to DEPLOY_ENDPOINT using TARBALL/FRAMEWORK) has no timeouts and can hang; update
    that invocation to include both --connect-timeout and --max-time flags (e.g.
    --connect-timeout 10 --max-time 60) so the POST returns on network issues, and
    apply the same timeout flags to the polling curl calls around lines 265-267 (the
    polling response variable/calls) to ensure both the initial deploy POST and
    subsequent poll requests cannot hang indefinitely.

In @claude/skills/expo-brownfield/references/brownfield-integrated.md:

  • Line 16: The minimum Expo SDK requirement is inconsistent:
    brownfield-integrated.md currently states "SDK 54+" while SKILL.md and
    brownfield-isolated.md require "SDK 55+"; update brownfield-integrated.md to
    state "Expo SDK 55 or later" and adjust the sentence that references
    ExpoReactHostFactory, ExpoReactNativeFactory, and ApplicationLifecycleDispatcher
    to require SDK 55+, then run a quick repository search for any other "SDK 54"
    mentions and align them to "SDK 55" to keep all docs consistent.

In @claude/skills/expo-cicd-workflows/scripts/fetch.js:

  • Around line 22-27: The fetch call currently blocks indefinitely; modify the
    fetch invocation in fetch.js to use an AbortController with a configurable
    timeout (e.g., TIMEOUT_MS) so the request is aborted after the timeout and the
    promise rejects; create an AbortController, pass controller.signal into
    fetch(url, { ..., signal }), start a setTimeout to call controller.abort() after
    the timeout and clear the timer once the response is received, and ensure any
    AbortError is handled/propagated by the caller (reference the existing fetch
    usage and the const response = await fetch(...) site).

In @claude/skills/expo-ui-swiftui/SKILL.md:

  • Line 26: SKILL.md の import 文で使用しているパスが誤っており Line 26 の import { Host, VStack,
    RNHostView } from "@expo-ui/swift-ui"; を @expo/ui/swift-ui に修正してください — 対象はファイル内の
    import 文で、該当するシンボル Host, VStack, RNHostView を保持したままパス文字列だけを "@expo/ui/swift-ui"
    に置き換えてください。

In @claude/skills/flutter-add-integration-test/SKILL.md:

  • Around line 27-30: The doc currently mandates calling
    enableFlutterDriverExtension() unconditionally; update SKILL.md to reflect that
    enableFlutterDriverExtension() is only required for legacy flutter_driver
    compatibility/migration and not for the modern integration_test flow — instead
    recommend using IntegrationTestWidgetsFlutterBinding.ensureInitialized() as the
    standard initialization and state that enableFlutterDriverExtension() should be
    used conditionally only when the project explicitly targets flutter_driver
    compatibility or migration paths; mention the two initialization symbols
    (enableFlutterDriverExtension() and
    IntegrationTestWidgetsFlutterBinding.ensureInitialized()) so readers know which
    to use when.

In @claude/skills/flutter-setup-declarative-routing/SKILL.md:

  • Around line 102-108: intent-filter に android:autoVerify="true" を使う場合、https 側の
    要素にも android:host を明示して http 側と同じホストに揃えてください;つまり intent-filter 内の を のように更新し、両方の に同一の android:host 属性(例:
    "yourdomain.com")を設定して検証と assetlinks.json の照合要件を満たしてください。

In @claude/skills/flutter-use-http-package/SKILL.md:

  • Around line 46-47: Update the "Status Validation" guidance so 204 No Content
    is treated as success for GET/PUT/DELETE (and for DELETE explicitly document:
    when response.statusCode == 204, do not attempt to parse a body—treat the call
    as successfully completed), and keep POST success as 201; adjust the
    examples/rules that reference response.statusCode (the lines describing "200 OK
    (GET/PUT/DELETE) and 201 CREATED (POST)") to include 204 for the appropriate
    methods and clarify parsing behavior for delete endpoints; ensure Error Handling
    guidance remains (throw on non-success and never return null) so FutureBuilder
    error states are preserved.

In @claude/skills/next-best-practices/data-patterns.md:

  • Around line 60-74: The code calls revalidateTag('posts') in deletePost but
    only imports revalidatePath; update the top-level imports to also import
    revalidateTag from 'next/cache' so both revalidatePath and revalidateTag are
    available (ensure the import containing revalidatePath is modified to include
    revalidateTag), leaving createPost and deletePost implementations unchanged.

In @claude/skills/next-best-practices/rsc-boundaries.md:

  • Around line 52-56: rsc-boundaries.md で Date/Map/Set を「無効」と断定している誤りを修正してください:
    claude/skills/next-best-practices/rsc-boundaries.md の該当箇所から Date / Map /
    Set を禁止例から外し(または断定的な表現を和らげ)、76–101 行付近の new Date() / new Map() を client に渡す | NoDate の例を見直して、代わりにシリアライズ可能な値(React
    Flight/RSCでサポートされる値)として扱える場合がある旨を明記してください。併せて「JSON-serializable」の表現を「React
    Flight/RSCでシリアライズ可能な値」に置換し、禁止対象は「クラスインスタンス」「未登録の Symbol」「関数(Server Action
    でないもの)」「循環参照」等、実際にサポート外のケースに絞るよう文言を調整してください.

In @claude/skills/next-best-practices/self-hosting.md:

  • Around line 364-366: カール例と再検証エンドポイントの説明が認証を前提にしていないため、/api/revalidate
    ハンドラで必ずシークレット検証または署名検証を行する旨を明記し、ドキュメント中の curl 例を認証付きに差し替えてください(例: クエリに
    secret=YOUR_SECRET を付与、または Authorization ヘッダを使用)。さらに API 側の実装(/api/revalidate
    のハンドラ)で受信したトークンを検証して不正なリクエストは 401/403 を返す旨を明記してください。

Minor comments:
In @claude/skills/add-app-clip/references/native-module.md:

  • Around line 15-18: The exception message in MissingCurrentWindowSceneException
    is still referencing a "requesting a review" modal; update the override var
    reason in the MissingCurrentWindowSceneException class to describe the App Clip
    SKOverlay presentation failure (e.g., that the current window scene couldn't be
    determined to present the SKOverlay for the App Clip) so the message matches the
    class's actual failure context.

In @claude/skills/building-native-ui/references/media.md:

  • Line 5: The phrase "full screen camera" on Line 5 should be changed to the
    hyphenated adjective form "full-screen camera" to match the project's
    full-screen style; update the text in media.md so the sentence reads "Hide
    navigation headers when there's a full-screen camera".

In @claude/skills/building-native-ui/references/route-structure.md:

  • Around line 18-24: 該当のコードフェンス(例: the block showing the directory tree starting
    with "app/ users/ [id].tsx" と同様のスニペット)に言語指定を追加して MD040
    を解消してください;具体的にはバックティック3つの開始行を ```text(または適切な言語) に変更し、同様のコードフェンスがある他の箇所(該当ブロック:
    the directory-tree snippets and other examples around the shown
    blocks)にも同様の修正を適用してください。

In @claude/skills/building-native-ui/references/tabs.md:

  • Around line 317-321: The markdown code fence for the snippet listing
    _layout.tsx and _layout.web.tsx lacks a language tag (causing MD040); update the
    opening fence from totext (or another appropriate language) so it
    becomes ```text and keep the block contents unchanged—this fixes the lint
    warning for the code block containing _layout.tsx and _layout.web.tsx.

In @claude/skills/building-native-ui/references/webgpu-three.md:

  • Around line 508-519: Add a language specifier to the unlabeled fenced code
    blocks in the markdown (the file tree snippet under src/ and the other unlabeled
    block later) to satisfy markdownlint MD040: change the opening triple backticks
    for those blocks to use "text" (e.g., ```text) so both the src/ tree block and
    the second unlabeled block are explicitly marked as plain text; update the
    fenced block starts for the blocks that contain the directory listing and the
    subsequent unlabeled block referenced in the comment.

In @claude/skills/building-native-ui/SKILL.md:

  • Around line 14-30: 該当の fenced code block(現在表示されている "references/"
    リストのブロック)に言語指定が無く MD040 警告になっているので、開閉のバックティック三つの直後に言語を追加してください(例: ```text または
行のブロック)です。該当ブロックを探すにはファイル内の "references/" ヘッダやリスト項目(animations.md, controls.md,
form-sheet.md など)を目印にしてください。

In `@claude/skills/dart-collect-coverage/SKILL.md`:
- Line 3: Fix the typo in the front-matter description field: change "packge" to
"package" in the description key (the `description:` line) inside SKILL.md so it
reads "Collect coverage using the coverage package and create an LCOV report".

In `@claude/skills/dart-fix-runtime-errors/SKILL.md`:
- Line 3: The frontmatter "description" currently references runtime stack-trace
fixing (mentions get_runtime_errors and lsp) but the document body describes
fixing static analysis errors; update the frontmatter "description" to
accurately reflect the body (e.g., state that the skill uses analyzer/LSP to
fetch static analysis issues, locate failing lines, apply fixes, and verify via
hot_reload), and make the same correction for the other frontmatter entries that
match (the ones currently referenced around the same block).

In `@claude/skills/dart-migrate-to-checks-package/SKILL.md`:
- Line 13: The table of contents contains an invalid fragment link
"`#utilizing-dart-mcp-tools`" that has no matching heading in SKILL.md; fix by
either removing the TOC entry "[Utilizing Dart MCP
Tools](`#utilizing-dart-mcp-tools`)" or adding a corresponding heading (for
example add a heading like "## Utilizing Dart MCP Tools" with the expected
content) so the fragment resolves correctly; update the TOC or create the
heading near related sections to keep structure consistent.

In `@claude/skills/deploy-to-vercel/SKILL.md`:
- Around line 60-63: Summary: Several fenced code blocks in SKILL.md lack a
language identifier, triggering MD040 lint warnings. Fix: edit the opening
backtick fences for the blocks that contain plain prose (e.g. the block starting
with "This project is connected to Vercel via git. I can commit and push to
trigger a deployment. Want me to proceed?") and add a language tag such as text
(```text) so the fences are annotated; apply the same change to the other
mentioned blocks (lines 112-115, 256-264, 276-282, 289-292) to eliminate the
MD040 warnings.

In `@claude/skills/expo-api-routes/SKILL.md`:
- Around line 35-43: The fenced code block showing the app/ api/ directory tree
in SKILL.md is missing a language tag (triggering markdownlint MD040); update
that opening fence (the triple backticks before the directory listing) to
include a language specifier such as "text" or "txt" so the block becomes
"```text" (locate the block that contains the lines starting with "app/" and the
nested "api/" entries and add the language token to the opening fence).

In `@claude/skills/expo-brownfield/references/brownfield-isolated.md`:
- Around line 203-211: The fenced code block showing the artifacts/MyAppPackage
tree is missing a language tag; update the triple-backtick fence that surrounds
the tree (the block beginning with artifacts/MyAppPackage/) to use a language
identifier (use text) so the fence becomes ```text and resolves the MD040
warning.

In `@claude/skills/expo-cicd-workflows/scripts/validate.js`:
- Around line 15-19: fetchSchema currently assumes body.data exists and returns
it, causing ajv.compile(undefined) downstream when the API response is
malformed; update fetchSchema (and use fetchCached/SCHEMA_URL) to validate the
parsed JSON shape: check that body is an object and body.data is present (and of
the expected type), and if not throw a clear Error that includes the raw
response or parsed body and SCHEMA_URL so callers see the root cause instead of
failing inside ajv.compile; ensure parse errors from JSON.parse are also caught
and rethrown with context.

In `@claude/skills/expo-deployment/SKILL.md`:
- Around line 123-125: Replace the incorrect singular reference path
"./reference/..." with the canonical plural "./references/..." throughout the
file (e.g. change "./reference/testflight.md" and "./reference/ios-app-store.md"
to "./references/testflight.md" and "./references/ios-app-store.md") and update
the other occurrences mentioned (lines around the instances at 130, 136, and
165) so all links use "./references/..." consistently.

In `@claude/skills/expo-module/references/config-plugin.md`:
- Around line 7-14: The code fence in the example block (starting with the tree
lines like "my-module/", "plugin/", "tsconfig.json", and "app.plugin.js        
# Entry: module.exports = require('./plugin/build');") lacks a language
identifier; update the opening fence to include a language (e.g., ```text) so
markdownlint warnings disappear and the block is rendered as intended. Ensure
you only change the opening backticks to something like ```text and leave the
block contents (the module tree and "app.plugin.js" comment) unchanged.

In `@claude/skills/expo-module/SKILL.md`:
- Around line 25-33: The fenced code block that lists the "references/" entries
in SKILL.md is missing a language identifier which triggers a lint warning;
update the opening fence for that block (the triple backticks immediately before
the "references/" list) to include a language token such as text (e.g., change
``` to ```text) so the linter recognizes the fence and the warning is resolved,
leaving the content unchanged inside the block.

In `@claude/skills/expo-observe/references/metrics.md`:
- Line 7: Remove the duplicated sentence "All durations are in seconds." in the
metrics.md content (the repeated phrase in the block that currently reads "All
durations are in seconds. Data is retained for 90 days. All durations are in
seconds. ..."); keep a single instance of that sentence and ensure the
surrounding text remains a single coherent paragraph (refer to the phrase "All
durations are in seconds." to locate the duplicate).

In `@claude/skills/flutter-build-responsive-layout/SKILL.md`:
- Around line 30-31: Update the documentation text to use an integer literal for
the `flex` parameter: change the phrase "flex factor of 1.0" to "flex factor of
1" and note that `Expanded` is equivalent to `Flexible(fit: FlexFit.tight, flex:
1)` (referencing the `Expanded` and `Flexible` symbols and the `flex`
parameter).

In `@claude/skills/flutter-setup-localization/SKILL.md`:
- Line 3: The description line in SKILL.md uses the non-YAML token "generate
true"; update the text to the correct YAML key expression "generate: true" so it
matches the rest of the doc and the example in pubspec.yaml and avoids
copy/paste errors — specifically locate the description string mentioning
`generate true` and replace it with `generate: true`, keeping references to
`pubspec.yaml` and `l10n.yaml` intact.

In `@claude/skills/hono/SKILL.md`:
- Around line 274-276: The markdown code fence containing the middleware flow
example ("Request → mw1 before → mw2 before → handler → mw2 after → mw1 after →
Response") is missing a language tag; add a language identifier such as "text"
to the opening fence (e.g., ```text) so the fenced block is lint-compliant
(resolves MD040) in SKILL.md where that flow example appears.

In `@claude/skills/native-data-fetching/SKILL.md`:
- Around line 501-505: Update the incorrect environment variable prefix
instances: replace the misleading `EXPO*PUBLIC*` tokens with the correct
`EXPO_PUBLIC_` prefix in the document (references appear in the SKILL.md text
around the API key guidance, e.g., the lines containing "Use EXPO*PUBLIC* env
vars" and "Client-safe keys: EXPO*PUBLIC* in .env"). Ensure both occurrences are
changed so examples and guidance show the proper `EXPO_PUBLIC_` prefix for
client-safe variables.

In `@claude/skills/next-best-practices/bundling.md`:
- Around line 11-16: The markdown contains code fences showing runtime errors
without a language tag (lines with the block starting at the fence that contains
"ReferenceError: window is not defined" etc.), which triggers MD040; update
those fences by adding the language specifier `text` to the opening backticks
for both occurrences (the one around lines ~11-16 and the other around ~112-116)
so the fences read as a text block and the linter warning is resolved.

In `@claude/skills/next-best-practices/data-patterns.md`:
- Around line 7-23: The code block containing the Decision Tree is missing a
fenced-code language tag which triggers MD040; update the triple-backtick fence
that surrounds the decision tree (the block starting with "Need to fetch data?")
to use a language specifier by changing ``` to ```text so the fence is
explicitly marked as plain text and the MD040 warning is resolved.

In `@claude/skills/next-best-practices/error-handling.md`:
- Around line 218-227: The fenced code block showing the app/ tree lacks a
language tag and triggers MD040; update the opening fence from ``` to ```text
for the snippet containing the lines "app/", "error.tsx", "blog/", "[slug]/",
"page.tsx", and "layout.tsx" so the markdown linter recognizes it as plain text
(e.g., change the fence before the tree diagram to ```text).

In `@claude/skills/next-best-practices/file-conventions.md`:
- Around line 9-27: Several fenced code blocks in file-conventions.md that show
the app/ directory tree are missing language identifiers; update each opening
triple-backtick for the blocks that start with "app/" (and the similar
directory-tree/code-fence blocks later in the file) to include a language token
(e.g., ```text) so the linter stops flagging missing language on the code
fences; ensure you change every occurrence of the plain ``` before those
directory-tree blocks to ```text (or another suitable language) including the
blocks around the example shown starting with "app/".

In `@claude/skills/next-best-practices/hydration-error.md`:
- Around line 49-52: The JSX example uses an unclosed element (<div
id={Math.random().toString()}>), which makes the snippet look like a syntax
error instead of demonstrating server/client mismatch; update the example by
adding the corresponding closing tag for the div so the intent (random id
causing hydration mismatch) is preserved—locate the snippet containing <div
id={Math.random().toString()}> in hydration-error.md and add the closing </div>
to properly isolate the issue.

In `@claude/skills/next-best-practices/metadata.md`:
- Around line 101-108: The fenced code block containing the directory listing
(the block starting with ``` and the line "app/") is missing a language tag
which triggers markdownlint MD040; update that fence to include a language
identifier (e.g., change ``` to ```text) so the block becomes ```text and keeps
the same directory listing content to satisfy the linter.

In `@claude/skills/next-best-practices/parallel-routes.md`:
- Around line 7-21: The fenced code blocks in parallel-routes.md that show the
app directory tree (the block containing "app/ ├── `@modal/` ... └── page.tsx" and
the similar directory-tree blocks later that list files like layout.tsx and
page.tsx) lack a language tag and trigger MD040; update each of those
triple-backtick fences to include a language (e.g., ```text) so the
directory-tree examples are fenced as ```text ... ``` and ensure every fenced
code block in this document has a language specifier.

In `@claude/skills/next-best-practices/route-handlers.md`:
- Around line 29-37: The fenced code blocks showing the directory tree (the
blocks starting with ``` and containing the "app/" tree in route-handlers.md)
must include a language specifier `text` to satisfy MD040; update both
occurrences (the block around the app/ directory example at lines 29-37 and the
similar block at 41-48) by changing the opening fence from ``` to ```text so the
directory-tree examples are explicitly marked as plain text.
- Around line 92-104: The snippet uses await cookies() inside the GET handler
but does not import cookies; add an explicit named import of cookies from
'next/headers' at the top of the file (so the GET function can call cookies()),
e.g. ensure the module exports include cookies and that there are no conflicting
identifiers; update any existing imports block to include cookies from
'next/headers'.

In `@claude/skills/next-best-practices/self-hosting.md`:
- Around line 18-25: The Markdown code fence containing the directory tree
(.next/ standalone/ static/ etc.) lacks a language tag; change the opening fence
from ``` to ```text so the directory-tree block is fenced as text (e.g.,
```text) to resolve the markdownlint MD040 warning.

In `@claude/skills/next-cache-components/SKILL.md`:
- Around line 65-83: The UserPreferences component calls cookies() but the
module never imports it; add an import for cookies from 'next/headers' at the
top of the file so the UserPreferences function can call cookies() (update the
file that defines Page and UserPreferences to include: import { cookies } from
'next/headers').
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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


Notes:

- The file has **no extension** and **no `Content-Type` requirements** beyond being served as-is. Expo Router static export serves files in `public/` verbatim.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="claude/skills/add-app-clip/SKILL.md"
if [ ! -f "$FILE" ]; then
  echo "File not found: $FILE" >&2
  exit 1
fi

# Show around line 122
nl -ba "$FILE" | sed -n '110,135p'

Repository: gotomts/dotfiles

Length of output: 104


🌐 Web query:

apple-app-site-association Content-Type application/json redirect not allowed requirements

💡 Result:

To ensure your apple-app-site-association (AASA) file is correctly recognized by iOS, you must strictly follow the requirements regarding content type and redirects. The apple-app-site-association file must be served with the Content-Type header explicitly set to application/json [1][2][3][4]. Serving the file with an incorrect Content-Type, such as text/plain or application/pkcs7-mime, will cause a silent parse failure and prevent universal links from functioning [1][2][4]. Furthermore, redirects are not allowed [1][2][5]. Apple's swcd (system web content daemon) does not follow HTTP 301 or 302 redirects when fetching the AASA file [2][5][6]. The file must be reachable at the canonical URL (either /.well-known/apple-app-site-association or the root /apple-app-site-association) with an HTTP 200 OK status [1][2][5]. Even if some environments appear to work with redirects, they are unreliable and violate the documented requirements for universal links; you should ensure the file is served directly without any redirect chain [7][5][6]. Key technical requirements for the AASA file include: 1. Filename: Must be named apple-app-site-association without any file extension (do not add.json to the filename) [8][1][2]. 2. Location: Should be hosted at /.well-known/apple-app-site-association. While some legacy setups supported the root path, providing it at /.well-known/ is the modern standard [1][5][6]. 3. Connectivity: Must be served over HTTPS [1][2]. 4. Access: The file must be publicly accessible without authentication, login walls, or IP-based blocking [1][2]. 5. Size: The uncompressed file size must be no greater than 128 KB [9][1][2].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="claude/skills/add-app-clip/SKILL.md"

echo "== exact line 122 =="
awk 'NR==122{print}' "$FILE"

echo
echo "== lines 115-130 context =="
sed -n '115,130p' "$FILE"

Repository: gotomts/dotfiles

Length of output: 1157


AASAのContent-Type要件に誤りがあります(122行目)

Content-Type要件なし」は誤解を招きます。AASA(apple-app-site-association)は Content-Type: application/json で、リダイレクトなしで直接200応答となるように配信してください。Expo Routerの「publicをそのまま配信」だけではヘッダー要件を満たさない可能性があるため、要件準拠の文言に修正してください。

🤖 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 `@claude/skills/add-app-clip/SKILL.md` at line 122, The statement claiming "no
Content-Type requirements" for AASA is incorrect; update the SKILL.md wording
about apple-app-site-association/AASA to require that the file is served with
Content-Type: application/json and returned directly with a 200 (no redirects),
and note that Expo Router's default public/ verbatim export may not set that
header so instruct to configure the hosting or middleware to ensure the
apple-app-site-association is served with Content-Type: application/json and a
direct 200 response.

Comment on lines +175 to +191
## Stepper

Increment/decrement numeric values.

```tsx
import { Stepper } from "react-native";
import { useState } from "react";

const [count, setCount] = useState(0);

<Stepper
value={count}
onValueChange={setCount}
minimumValue={0}
maximumValue={10}
/>;
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate the referenced files
ls -la
fd -i "controls.md" claude/skills/building-native-ui/references 2>/dev/null || true
fd -i "SKILL.md" claude/skills/building-native-ui 2>/dev/null || true
fd -i "SKILL.md" claude/skills 2>/dev/null || true

# Print the relevant sections with line numbers (bounded)
echo "---- controls.md (Stepper section) ----"
python3 - <<'PY'
import pathlib, re
paths=[]
for p in pathlib.Path('.').rglob('controls.md'):
    if 'claude/skills/building-native-ui/references' in str(p):
        paths.append(p)
for p in paths:
    txt=p.read_text(encoding='utf-8', errors='ignore').splitlines()
    # find "## Stepper" line
    for i,line in enumerate(txt, start=1):
        if line.strip()=='## Stepper':
            start=max(1,i-10); end=min(len(txt), i+40)
            for j in range(start,end+1):
                print(f"{p}:{j}:{txt[j-1]}")
            break
PY

echo "---- parent SKILL.md (around line ~81 and around delete-policy) ----"
python3 - <<'PY'
import pathlib
candidates=[]
for p in pathlib.Path('.').rglob('SKILL.md'):
    if 'claude/skills/building-native-ui' in str(p):
        candidates.append(p)
for p in candidates:
    txt=p.read_text(encoding='utf-8', errors='ignore').splitlines()
    for i,line in enumerate(txt, start=1):
        if i>=60 and i<=110:
            if '削除' in line or 'モジュール' in line or 'RN' in line or '削除済み' in line or '使わない' in line:
                start=max(1,i-5); end=min(len(txt), i+8)
                print(f"### {p} around line {i}")
                for j in range(start,end+1):
                    print(f"{p}:{j}:{txt[j-1]}")
                print()
PY

echo "---- Check other mentions of Stepper / RN Stepper in docs ----"
rg -n --hidden --no-ignore -S "Stepper" claude/skills/building-native-ui/references claude/skills/building-native-ui -g'*.md' || true
rg -n --hidden --no-ignore -S "react-native\".*Stepper|Stepper.*from \"react-native" claude/skills/building-native-ui -g'*.md' || true

Repository: gotomts/dotfiles

Length of output: 14729


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate the referenced files
ls -la
fd -i "controls.md" claude/skills/building-native-ui/references 2>/dev/null || true
fd -i "SKILL.md" claude/skills/building-native-ui 2>/dev/null || true
fd -i "SKILL.md" claude/skills 2>/dev/null || true

# Print the relevant sections with line numbers (bounded)
echo "---- controls.md (Stepper section) ----"
python3 - <<'PY'
import pathlib
paths=[]
for p in pathlib.Path('.').rglob('controls.md'):
    if 'claude/skills/building-native-ui/references' in str(p):
        paths.append(p)

for p in paths:
    txt=p.read_text(encoding='utf-8', errors='ignore').splitlines()
    for i,line in enumerate(txt, start=1):
        if line.strip()=='## Stepper':
            start=max(1,i-10); end=min(len(txt), i+60)
            for j in range(start,end+1):
                print(f"{p}:{j}:{txt[j-1]}")
            break
PY

echo "---- parent SKILL.md (around line ~81 and around delete-policy) ----"
python3 - <<'PY'
import pathlib
candidates=[]
for p in pathlib.Path('.').rglob('SKILL.md'):
    if 'claude/skills/building-native-ui' in str(p):
        candidates.append(p)

for p in candidates:
    txt=p.read_text(encoding='utf-8', errors='ignore').splitlines()
    for i,line in enumerate(txt, start=1):
        if 60 <= i <= 110 and any(k in line for k in ['削除', 'モジュール', 'RN', '削除済み', '使わない']):
            start=max(1,i-7); end=min(len(txt), i+10)
            print(f"### {p} around line {i}")
            for j in range(start,end+1):
                print(f"{p}:{j}:{txt[j-1]}")
            print()
PY

echo "---- Check other mentions of Stepper / RN Stepper in docs ----"
rg -n --hidden --no-ignore -S "Stepper" claude/skills/building-native-ui/references claude/skills/building-native-ui -g'*.md' || true
rg -n --hidden --no-ignore -S "from \"react-native\".*Stepper|Stepper.*from \"react-native" claude/skills/building-native-ui -g'*.md' || true

Repository: gotomts/dotfiles

Length of output: 16236


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "---- contents around matching policy keywords in building-native-ui/SKILL.md ----"
python3 - <<'PY'
import pathlib,re
p=pathlib.Path("claude/skills/building-native-ui/SKILL.md")
txt=p.read_text(encoding='utf-8', errors='ignore').splitlines()
keywords=["削除済み","削除","モジュール","RN","React Native","使わない","非推奨"]
hits=[]
for i,line in enumerate(txt, start=1):
    if any(k in line for k in keywords):
        hits.append(i)
print("file:",p)
print("hit_lines:",hits[:50], "count=",len(hits))
for i in hits[:10]:
    start=max(1,i-5); end=min(len(txt), i+8)
    print("\n--- around line",i,"---")
    for j in range(start,end+1):
        print(f"{j}:{txt[j-1]}")
PY

echo "---- broad search for '削除' and 'RN' in building-native-ui/SKILL.md ----"
rg -n "削除|RN|React Native|モジュール|使わない|非推奨" claude/skills/building-native-ui/SKILL.md -g'*.md' || true

echo "---- search for 'Stepper' in all building-native-ui docs ----"
rg -n "Stepper" claude/skills/building-native-ui -g'*.md' || true

Repository: gotomts/dotfiles

Length of output: 3113


🌐 Web query:

react-native import { Stepper } from "react-native" Stepper component

💡 Result:

There is no built-in Stepper component in the core React Native library [1]. If you attempt to import { Stepper } from "react-native", it will result in an error because the component does not exist in the official package [1]. The term "Stepper" in React Native typically refers to one of two different UI patterns, both of which require third-party libraries or custom implementation: 1. Progress Steppers (Multi-step flows): These are used to guide users through a series of steps (e.g., a registration wizard). Examples of community-maintained libraries for this purpose include: - react-native-stepper-view [2] - react-native-progress-stepper [3] - @brijen/react-native-multistep [4] - react-native-stepper [5] 2. Numeric Steppers (Increment/Decrement): These are used to adjust numeric values (e.g., changing a quantity in a cart). While some libraries (like react-native-swiftui) may offer a Stepper component for this purpose [6], it is not a standard React Native core component [1]. If you need a stepper, you must either install a third-party package from the React Native community or build a custom component using core primitives like View, Text, and Pressable [1][7].

Citations:


Stepper サンプルは react-native 標準APIとして成立していないため差し替えが必要(controls.md:175-191)

import { Stepper } from "react-native"; は React Native コアに Stepper が無いためエラーになり得ます。react-native のプリミティブ(例: ボタン群+数値表示)で自作するか、使用するならサードパーティ前提を明記して置き換えてください。

🤖 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 `@claude/skills/building-native-ui/references/controls.md` around lines 175 -
191, The Stepper example is invalid because there is no Stepper export from
react-native; update the example by replacing the invalid import "import {
Stepper } from 'react-native'" and the <Stepper .../> usage with either (a) a
small self-contained primitive implementation using Button(s) + text state
(useState, count, setCount, onPress handlers) so the sample uses only React
Native core components, or (b) explicitly document that a third-party package is
required and show the correct import and usage for that package; locate
references to Stepper, the import line, and the JSX <Stepper .../> in the
controls.md snippet and change them accordingly.

Comment on lines +95 to +101
<View style={{ width: 70, height: 32, justifyContent: "center" }}>
<Text style={{ fontSize: 12, fontWeight: 700 }}>Filter by</Text>
<Text
style={{
fontSize: 12,
fontWeight: 700,
color: Color.ios.systemBlue,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

fontWeight は文字列("700")に統一してください(型エラー回避)**

TextStyle.fontWeight の型定義に対して、サンプルの fontWeight: 700 は不整合になりやすいため、そのまま貼り付けると TypeScript で型エラーになりがちです(行 95-101、180-193)。

修正例
-<Text style={{ fontSize: 12, fontWeight: 700 }}>Filter by</Text>
+<Text style={{ fontSize: 12, fontWeight: "700" }}>Filter by</Text>
...
-                fontWeight: 700,
+                fontWeight: "700",
...
-    <Text style={{ fontSize: 12, fontWeight: 700 }}>Filter by</Text>
+    <Text style={{ fontSize: 12, fontWeight: "700" }}>Filter by</Text>
🤖 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 `@claude/skills/building-native-ui/references/toolbar-and-headers.md` around
lines 95 - 101, The Text style uses numeric fontWeight values (e.g., fontWeight:
700) which can cause TypeScript type errors; update all occurrences in this file
(including the shown Text components and the other instances around lines noted)
to use string values like fontWeight: "700" (e.g., in the Text components where
fontWeight is set) so they match the TextStyle type and avoid type-check
failures.

Comment on lines +177 to +220
useEffect(() => {
const context = canvasRef.current!.getContext("webgpu")!;
const renderer = makeWebGPURenderer(context);

// @ts-expect-error - ReactNativeCanvas wraps native canvas
const canvas = new ReactNativeCanvas(context.canvas) as HTMLCanvasElement;
canvas.width = canvas.clientWidth * PixelRatio.get();
canvas.height = canvas.clientHeight * PixelRatio.get();
const size = {
top: 0,
left: 0,
width: canvas.clientWidth,
height: canvas.clientHeight,
};

if (!root.current) {
root.current = createRoot(canvas);
}
root.current.configure({
size,
events,
scene,
camera,
gl: renderer,
frameloop: "always",
dpr: 1,
onCreated: async (state: RootState) => {
// @ts-expect-error - WebGPU renderer has init method
await state.gl.init();
const renderFrame = state.gl.render.bind(state.gl);
state.gl.render = (s: THREE.Scene, c: THREE.Camera) => {
renderFrame(s, c);
context?.present();
};
},
});
root.current.render(children);
return () => {
if (canvas != null) {
unmountComponentAtNode(canvas!);
}
};
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="claude/skills/building-native-ui/references/webgpu-three.md"
echo "== file = $FILE =="
wc -l "$FILE"

# show around useEffect snippet with line numbers
nl -ba "$FILE" | sed -n '150,260p'

# show import section (search for "import" lines near beginning)
echo "== import-like lines early =="
nl -ba "$FILE" | sed -n '1,140p'

# show around mentioned lines ~508-540 for MD040 context
echo "== around 480-560 =="
nl -ba "$FILE" | sed -n '470,560p'

Repository: gotomts/dotfiles

Length of output: 258


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="claude/skills/building-native-ui/references/webgpu-three.md"
echo "== file = $FILE =="
wc -l "$FILE"

echo "== snippet around 150-260 =="
nl -ba "$FILE" | sed -n '150,260p'

echo "== top of file (imports etc) =="
nl -ba "$FILE" | sed -n '1,140p'

echo "== around 480-560 (MD040 hints) =="
nl -ba "$FILE" | sed -n '480,560p'

Repository: gotomts/dotfiles

Length of output: 287


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="claude/skills/building-native-ui/references/webgpu-three.md"

echo "== file = $FILE =="
wc -l "$FILE"

echo "== snippet around useEffect (150-260) =="
awk 'NR>=150 && NR<=260 {printf "%d:%s\n", NR, $0}' "$FILE"

echo "== top (1-140) =="
awk 'NR>=1 && NR<=140 {printf "%d:%s\n", NR, $0}' "$FILE"

echo "== around 480-560 =="
awk 'NR>=480 && NR<=560 {printf "%d:%s\n", NR, $0}' "$FILE"

echo "== find code fences near 170-240 =="
awk 'NR>=160 && NR<=240 { if($0 ~ /^```/) print NR ":" $0 }' "$FILE"

echo "== find all useEffect calls in file =="
rg -n "useEffect\\(" "$FILE" || true

echo "== find import-related snippets around where comment claimed (230-231, 546-547) =="
awk 'NR>=210 && NR<=260 {printf "%d:%s\n", NR, $0}' "$FILE"
awk 'NR>=520 && NR<=580 {printf "%d:%s\n", NR, $0}' "$FILE"

Repository: gotomts/dotfiles

Length of output: 12793


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="claude/skills/building-native-ui/references/webgpu-three.md"

echo "== file = $FILE =="
wc -l "$FILE"

echo "== snippet around useEffect (150-260) =="
awk 'NR>=150 && NR<=260 {printf "%d:%s\n", NR, $0}' "$FILE"

echo "== top (1-140) =="
awk 'NR>=1 && NR<=140 {printf "%d:%s\n", NR, $0}' "$FILE"

echo "== around 480-560 =="
awk 'NR>=480 && NR<=560 {printf "%d:%s\n", NR, $0}' "$FILE"

echo "== find code fences near 160-240 =="
awk 'NR>=160 && NR<=240 { if($0 ~ /^```/) print NR ":" $0 }' "$FILE"

echo "== find all useEffect calls in file =="
rg -n "useEffect\\(" "$FILE" || true

echo "== expand around reported import line ranges (210-260, 520-580) =="
awk 'NR>=210 && NR<=260 {printf "%d:%s\n", NR, $0}' "$FILE"
awk 'NR>=520 && NR<=580 {printf "%d:%s\n", NR, $0}' "$FILE"

Repository: gotomts/dotfiles

Length of output: 12777


FiberCanvasuseEffect は依存配列なしで再初期化され、サンプル内の useEffect import も不足

  • useEffect(177-220): 依存配列なしで毎回実行され、createRoot / configure / state.gl.init() 等の初期化や再設定が繰り返されるため、初期化は1回に分ける/少なくとも依存配列を適切に設定する必要があります。
  • 「Basic 3D Scene」(227-257): useEffect を使用(253付近)しているのに import { useRef } from "react";useEffect が未import。
  • 「Example: Complete Game Scene」(543-575): useEffect を使用(571付近)しているのに import { useRef, useState, useCallback } from "react";useEffect が未import。
  • MD040(508, 523 付近): コードフェンスが言語なし()になっているため ` ts/ ```text` 等に。
🤖 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 `@claude/skills/building-native-ui/references/webgpu-three.md` around lines 177
- 220, FiberCanvas’s useEffect currently runs on every render causing repeated
createRoot/configure/state.gl.init; change the useEffect in FiberCanvas to run
once (or with a precise dependency array) so initialization happens only on
mount/unmount, and ensure cleanup still unmounts the root; also add missing
useEffect imports where used (add useEffect to the import lists that currently
only import useRef/useState/useCallback) so the hooks are defined; finally fix
the markdown code fences flagged by MD040 by adding explicit language tags
(e.g., ```ts or ```text) for the affected fenced blocks.

Comment on lines +230 to +231
import { useRef } from "react";
import { useFrame, useThree } from "@react-three/fiber";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
repo_root="."
file="claude/skills/building-native-ui/references/webgpu-three.md"

# show around line 200-260 and 520-580
sed -n '190,260p' "$file" | nl -ba | sed -n '1,120p'
echo "----"
sed -n '520,580p' "$file" | nl -ba | sed -n '1,120p'

Repository: gotomts/dotfiles

Length of output: 103


🏁 Script executed:

sed -n '215,250p' claude/skills/building-native-ui/references/webgpu-three.md | nl -ba

Repository: gotomts/dotfiles

Length of output: 103


🏁 Script executed:

ls -la
find claude -maxdepth 4 -type f -name 'webgpu-three.md' -print

Repository: gotomts/dotfiles

Length of output: 7227


🏁 Script executed:

#!/bin/bash
set -euo pipefail
file="claude/skills/building-native-ui/references/webgpu-three.md"
test -f "$file" && echo "FOUND:$file" || (echo "NOTFOUND" && exit 1)
wc -l "$file"
echo "---- around 220-240 ----"
nl -ba "$file" | sed -n '210,245p'
echo "---- around 540-565 ----"
nl -ba "$file" | sed -n '530,565p'

Repository: gotomts/dotfiles

Length of output: 276


🏁 Script executed:

set -e
file="claude/skills/building-native-ui/references/webgpu-three.md"
ls -la claude/skills/building-native-ui/references/ | head
head -n 40 "$file"

Repository: gotomts/dotfiles

Length of output: 1689


🏁 Script executed:

#!/bin/bash
set -euo pipefail
file="claude/skills/building-native-ui/references/webgpu-three.md"

echo "---- lines 220-240 ----"
sed -n '220,240p' "$file"

echo "---- lines 540-560 ----"
sed -n '540,560p' "$file"

echo "---- grep useEffect occurrences (with line numbers) ----"
# -n is enough; avoid nl
grep -n "useEffect" "$file" || true

echo "---- grep react import lines (with line numbers) ----"
grep -n "from \"react\"" "$file" || true

Repository: gotomts/dotfiles

Length of output: 1765


🏁 Script executed:

#!/bin/bash
set -euo pipefail
file="claude/skills/building-native-ui/references/webgpu-three.md"

echo "---- Basic 3D Scene: 240-270 ----"
sed -n '240,270p' "$file"

echo "---- More context: 210-240 (show import area) ----"
sed -n '210,240p' "$file"

echo "---- Example: Complete Game Scene: 560-590 (show useEffect area) ----"
sed -n '560,590p' "$file"

echo "---- Example: Complete Game Scene import area: 535-555 ----"
sed -n '535,555p' "$file"

Repository: gotomts/dotfiles

Length of output: 2802


webgpu-three.mduseEffect を import に追加してください
Scene / GameSceneuseEffect を使用していますが、React import に useEffect が含まれておらずビルドエラーになります(Basic 3D Scene: 230-231、Example: Complete Game Scene: 546-547)。

修正例
-import { useRef } from "react";
+import { useRef, useEffect } from "react";
-import { useRef, useState, useCallback } from "react";
+import { useRef, useState, useCallback, useEffect } from "react";
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import { useRef } from "react";
import { useFrame, useThree } from "@react-three/fiber";
import { useRef, useEffect } from "react";
import { useFrame, useThree } from "`@react-three/fiber`";
🤖 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 `@claude/skills/building-native-ui/references/webgpu-three.md` around lines 230
- 231, The React hook useEffect is used in the Scene and GameScene components
but not imported; update the React import statement (the line that currently
imports useRef) to include useEffect so components like Scene and GameScene can
compile; specifically modify the import that currently reads like the one near
useRef/useFrame/useThree to also import useEffect from "react".

Comment on lines +102 to +108
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="yourdomain.com" />
<data android:scheme="https" />
</intent-filter>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

Android App Links の intent-filter で、https 用 <data> に host 未指定は有効な推奨設定ですか?公式ドキュメント上の推奨例を示してください。

💡 Result:

Android App Links を設定する際、intent-filter 内の 要素において host を未指定にすることは、推奨される設定ではありません [1][2]。 公式ドキュメントによると、Android App Links(検証済みウェブリンク)の仕組みにおいて、各 intent-filter はアプリが所有するウェブサイトのドメイン(host)と関連付ける必要があります [1][2]。この検証プロセスは、アプリのマニフェストファイルで指定された scheme と host が、ウェブサイトのサーバー上に配置された assetlinks.json ファイルと一致するかどうかを確認することで行われます [1][2]。 したがって、App Links として意図した動作(自動検証によるディープリンクの直接起動)を実現するためには、 要素で正しい host を指定することが必須です [1][2]。 host を未指定にしたり、曖昧にしたりした場合の影響や公式の指針は以下の通りです。 1. 検証への影響: host が未指定または不適切であると、システムは assetlinks.json を正しく検証できず、Android App Links として機能しなくなる可能性があります [1][2]。その場合、Android システムは通常の「ディープリンク」として振る舞い、ユーザーにアプリ選択のダイアログが表示される標準的な挙動へフォールバックします [3][1][2]。 2. 正しい記述例: 公式ドキュメントでは、以下のように scheme と host を明確に含めることが推奨されています [1][2]。 補足として、ドキュメントには host を指定しない場合、その 要素内の port や path 属性が無視されるという技術的仕様も明記されています [4][5]。特定のサブドメインを含めたい場合は、ワイルドカード(*.example.com)を使用することが案内されていますが、その場合もルートドメインでの検証が必要となります [1][2]。 結論として、App Links の設定ではホスト名(host)を適切に定義してください [1][2]。

Citations:


android:autoVerify="true" の App Links では、https 側の <data> にも android:host を明示してください。

公式ドキュメントでは、intent-filter の検証は scheme/hostassetlinks.json と突き合わせる前提なので、https<data> で host を省くのは推奨されません。http/https で同一 host を揃える形にしてください。

修正例
 <intent-filter android:autoVerify="true">
     <action android:name="android.intent.action.VIEW" />
     <category android:name="android.intent.category.DEFAULT" />
     <category android:name="android.intent.category.BROWSABLE" />
     <data android:scheme="http" android:host="yourdomain.com" />
-    <data android:scheme="https" />
+    <data android:scheme="https" android:host="yourdomain.com" />
 </intent-filter>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="yourdomain.com" />
<data android:scheme="https" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="yourdomain.com" />
<data android:scheme="https" android:host="yourdomain.com" />
</intent-filter>
🤖 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 `@claude/skills/flutter-setup-declarative-routing/SKILL.md` around lines 102 -
108, intent-filter に android:autoVerify="true" を使う場合、https 側の <data> 要素にも
android:host を明示して http 側と同じホストに揃えてください;つまり intent-filter 内の <data
android:scheme="https" /> を <data android:scheme="https"
android:host="yourdomain.com" /> のように更新し、両方の <data> に同一の android:host 属性(例:
"yourdomain.com")を設定して検証と assetlinks.json の照合要件を満たしてください。

Comment on lines +46 to +47
* **Status Validation:** Evaluate `response.statusCode`. Treat `200 OK` (GET/PUT/DELETE) and `201 CREATED` (POST) as success.
* **Error Handling:** Throw explicit exceptions for non-success status codes. Never return `null` on failure, as this prevents `FutureBuilder` from triggering its error state and causes infinite loading indicators.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

成功ステータスの条件が厳しすぎます(204 No Content を許容してください)。

GET/PUT/DELETE で 204 を返すAPIは一般的です。ここを 200/201 のみに固定すると、正常応答を失敗扱いする実装を誘導します。DELETE も「空モデル返却固定」ではなく、204 時はパースせず完了扱いにする記述へ修正した方が安全です。

Also applies to: 68-69

🤖 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 `@claude/skills/flutter-use-http-package/SKILL.md` around lines 46 - 47, Update
the "Status Validation" guidance so 204 No Content is treated as success for
GET/PUT/DELETE (and for DELETE explicitly document: when response.statusCode ==
204, do not attempt to parse a body—treat the call as successfully completed),
and keep POST success as 201; adjust the examples/rules that reference
response.statusCode (the lines describing "200 OK (GET/PUT/DELETE) and 201
CREATED (POST)") to include 204 for the appropriate methods and clarify parsing
behavior for delete endpoints; ensure Error Handling guidance remains (throw on
non-success and never return null) so FutureBuilder error states are preserved.

Comment on lines +60 to +74
import { revalidatePath } from 'next/cache';

export async function createPost(formData: FormData) {
const title = formData.get('title') as string;

await db.post.create({ data: { title } });

revalidatePath('/posts');
}

export async function deletePost(id: string) {
await db.post.delete({ where: { id } });

revalidateTag('posts');
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="claude/skills/next-best-practices/data-patterns.md"
# Print file with line numbers around 40-90 to include snippet.
nl -ba "$file" | sed -n '40,100p'

Repository: gotomts/dotfiles

Length of output: 103


🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="claude/skills/next-best-practices/data-patterns.md"
nl -ba "$file" | sed -n '40,100p'

Repository: gotomts/dotfiles

Length of output: 103


🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="claude/skills/next-best-practices/data-patterns.md"
cat -n "$file" | sed -n '40,100p'

Repository: gotomts/dotfiles

Length of output: 1744


revalidateTag の import が不足しており、コード例が動きません。

deletePostrevalidateTag('posts') を呼んでいるのに、next/cache から revalidateTag を import していません。

修正例
-import { revalidatePath } from 'next/cache';
+import { revalidatePath, revalidateTag } from 'next/cache';
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import { revalidatePath } from 'next/cache';
export async function createPost(formData: FormData) {
const title = formData.get('title') as string;
await db.post.create({ data: { title } });
revalidatePath('/posts');
}
export async function deletePost(id: string) {
await db.post.delete({ where: { id } });
revalidateTag('posts');
}
import { revalidatePath, revalidateTag } from 'next/cache';
export async function createPost(formData: FormData) {
const title = formData.get('title') as string;
await db.post.create({ data: { title } });
revalidatePath('/posts');
}
export async function deletePost(id: string) {
await db.post.delete({ where: { id } });
revalidateTag('posts');
}
🤖 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 `@claude/skills/next-best-practices/data-patterns.md` around lines 60 - 74, The
code calls revalidateTag('posts') in deletePost but only imports revalidatePath;
update the top-level imports to also import revalidateTag from 'next/cache' so
both revalidatePath and revalidateTag are available (ensure the import
containing revalidatePath is modified to include revalidateTag), leaving
createPost and deletePost implementations unchanged.

Comment on lines +52 to +56
- `Date` objects
- `Map`, `Set`, `WeakMap`, `WeakSet`
- Class instances
- `Symbol` (unless globally registered)
- Circular references

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

Next.js最新ドキュメントで、Server Component から Client Component に渡せる「Reactがシリアライズ可能な値」の一覧(Date/Map/Setを含むか)を確認してください。可能なら React 側の一次仕様ページも確認してください。

💡 Result:

Next.js(React Server Components)において、サーバーからクライアントへ渡せる「シリアライズ可能な値」には、JSONの制限を超える独自のプロトコル(React Flight Protocol)が採用されており、Date、Map、Setを含む多くの組み込みオブジェクトがサポートされています[1][2][3]。 React公式ドキュメント('use server' の仕様ページ)に明記されている、サーバーとクライアント間で受け渡し可能な主なデータ型の一覧は以下の通りです[1][2]。 【シリアライズ可能な型】 ・プリミティブ型(string, number, bigint, boolean, undefined, null) ・Date オブジェクト ・Map および Set ・TypedArray および ArrayBuffer ・FormData インスタンス ・Promise(クライアント側で use フックを使用して解決可能) ・React 要素(JSX) ・Server Functions('use server' が付与された関数) ・グローバル Symbol(Symbol.for で登録されたもの) ・プレーンオブジェクト(オブジェクト初期化子で作成されたもの) ・配列およびイテラブル(シリアライズ可能な値を含むもの) 【注意点】 Date、Map、Set は公式にサポートされており、直接受け渡しが可能です[1][2][3]。以前はシリアライズ不可とされていた時期もありましたが、現在のReactの仕様では対応しています[4][5]。ただし、以下のような値は依然としてシリアライズできません[1][2]。 ・通常の関数(Server Function ではないもの) ・クラスインスタンス ・プロトタイプが null のオブジェクト ・グローバル登録されていない Symbol 公式ドキュメントで詳細が確認できる React 側の一次仕様ページは以下の通りです。 https://react.dev/reference/rsc/use-server#serializable-parameters-and-return-values

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="claude/skills/next-best-practices/rsc-boundaries.md"
if [ ! -f "$FILE" ]; then
  echo "Missing file: $FILE" >&2
  exit 1
fi

# Show relevant sections around mentioned lines
python3 - <<'PY'
import itertools,sys
path="claude/skills/next-best-practices/rsc-boundaries.md"
with open(path,'r',encoding='utf-8') as f:
    lines=f.readlines()
def show(start,end):
    for i in range(start-1,end):
        if 0<=i<len(lines):
            print(f"{i+1:4d}: {lines[i].rstrip()}")
show(40,110)
print("\n--- around 154-170 ---\n")
show(140,180)
PY

Repository: gotomts/dotfiles

Length of output: 3206


🌐 Web query:

Next.js React Server Components props: can you pass Date/Map/Set from Server Component to Client Component? what happens (kept as Date/Map or serialized as string/object)?

💡 Result:

In Next.js, when passing props from a Server Component to a Client Component, the data must be serializable to cross the network boundary [1][2][3]. Regarding the specific types: - Date: Modern React (supported in newer versions including React 19+) generally supports Date objects [4][5]. When passed, they are serialized and arrive on the client as Date objects [5]. In older versions or specific configurations, they were often required to be manually converted to ISO strings [6][2]. - Map/Set: These are supported in modern React versions [4][5]. They are serialized and arrive on the client as Map and Set instances, respectively [5]. If you are using an older version of Next.js/React where these are not supported, attempting to pass them will result in a serialization error, and you will need to manually convert them (e.g., converting a Map or Set to an Array or a plain object) before passing them as props [2][7][8]. General Rules for Passing Props: - Data must be serializable [1][5]. - Plain objects, primitives (string, number, boolean, null, undefined, bigint), and specific built-ins like Date, Map, Set, and Promises are supported in current versions [7][4][5]. - Classes, functions (that are not Server Actions), and objects with methods cannot be passed [2][5][9]. - If you encounter issues, the best practice is to convert non-serializable data into plain JSON-compatible structures (e.g., plain objects or arrays) on the server before passing them [6][7][9].

Citations:


🌐 Web query:

react.dev "use server" serializable parameters and return values Date Map Set: is that for server actions or also for Server Components -> Client Components props?

💡 Result:

The rules for serializable parameters and return values differ significantly between Server Actions and props passed from Server Components to Client Components, primarily because they use different serialization mechanisms [1][2][3]. Server Actions (using "use server") Server Actions support a wider range of built-in types because they are designed to handle network communication between client and server [1][2]. According to official React documentation, the following are supported as arguments and return values for Server Actions: - Primitives (string, number, bigint, boolean, undefined, null) - Symbol (only globally registered symbols) - Iterables containing serializable values - String, Array, Map, Set - TypedArray and ArrayBuffer - Date - FormData instances - Plain objects (created with object initializers) - Functions that are themselves Server Functions - Promises [1][2] Server Components to Client Components (Props) When passing props from Server Components to Client Components, the requirements are more restrictive. While often referred to simply as "serializable," this boundary is primarily JSON-based [3][4][5]. - Date objects: These are generally not supported as direct props; they are often serialized to ISO 8601 strings during the transition, meaning the client receives a string rather than a Date instance [3][4][5]. You must manually re-instantiate them on the client using new Date(prop) [3][5]. - Map and Set: These are generally not supported as direct props and will often throw errors or appear as empty objects if passed directly [3][6][5]. The common practice is to convert these to arrays before passing them as props [3][6]. Summary If you need to pass complex types like Map or Set, Server Actions are capable of handling them directly because of the more robust serialization protocol used for network requests [1][2]. If you are passing these types as props to a Client Component, you must convert them to a serializable format (like an array or plain object) beforehand [3][6]. Always check your framework's specific implementation, as some meta-frameworks may provide additional utilities or layers (like superjson) to bridge these gaps [3].

Citations:


🌐 Web query:

React Flight serialization Date Map Set behavior when passed to Client Components (prototype/type preservation or conversion).

💡 Result:

In the React Flight protocol (used for React Server Components), the serialization behavior for Date, Map, and Set objects when passed to Client Components is distinct and does not preserve their original prototype or type in the standard sense. Date Objects: When a Date object is passed as a prop from a Server Component to a Client Component, it is not serialized as a live Date instance [1][2]. Instead, it is serialized into an ISO string format [1][3][4]. Upon receipt on the client, the value remains a string; it is not automatically re-instantiated into a Date object [2][3][4]. Developers must manually convert these strings back into Date objects on the client side [3][4]. Map and Set Objects: Unlike Date objects, the React Flight protocol does not support the direct serialization of Map and Set objects as props [1]. If you attempt to pass a Map or Set object directly to a Client Component, the serialization process will throw an error [1]. To pass these data structures, you must first convert them into a serializable format, such as a plain array or object, before passing them as props [1]. Summary of Behavior: - Date: Serializes to an ISO string; type/prototype is lost; manual conversion required on the client [1][2][3][4]. - Map/Set: Not natively supported for direct prop passing; throws error during serialization; requires manual conversion to plain structures (e.g., arrays) prior to passing [1]. While the internal Flight protocol does have technical provisions to represent these types (often using specific wire-format prefixes like $D for Date, $Q for Map, and $W for Set in specialized or custom implementations) [5][6], the standard React Server Components boundary enforces strict serialization that results in the loss of prototype and specialized class behavior [1][2]. If your application requires complex object serialization, common industry practice is to use utility libraries like superjson to handle the reconstruction of these types automatically [1].

Citations:


🌐 Web query:

react.dev Server Components to Client Components serializable values Date Map Set props

💡 Result:

When passing props from a React Server Component to a Client Component, the data must be serializable [1][2]. React supports passing complex built-in types—including Date, Map, and Set—directly as props across the server-client boundary [1][3][4]. Contrary to older or simplified assumptions that only plain JSON-compatible data (strings, numbers, etc.) can be passed, modern React Server Components natively handle the serialization and deserialization of several advanced types [1][5][4]. Supported serializable prop values include: - Primitives: string, number, bigint, boolean, undefined, null, and global symbols (via Symbol.for) [1][2]. - Iterables and Collections: Array, Map, Set, and TypedArray/ArrayBuffer [1][2][3]. - Built-in Objects: Date and String objects [1][2]. - React Elements: JSX and other Server/Client Component elements [1][2]. - Functions: Specifically Server Functions (marked with 'use server') [1][6][7]. - Promises: Which can be resolved on the client [1][2]. - Plain Objects: Created with object initializers containing serializable properties [1][2]. Unsupported types include: - Functions that are not explicitly marked as Server Functions or exported from a client-marked module [1][2]. - Class instances (e.g., custom objects created with new MyClass()) [1][2]. - Symbols that are not registered globally [1][2]. - Objects with a null prototype [1][2]. If you pass a Date, Map, or Set object from a Server Component to a Client Component, it will arrive on the client as the corresponding type (e.g., typeof prop will be 'object' and instanceof Date will be true), meaning you do not need to manually convert them back from strings [5][3][4]. This differs from standard JSON.stringify/JSON.parse behavior, as React's internal serialization protocol (often referred to as the RSC payload) preserves these specific types [6][8][4].

Citations:


🌐 Web query:

nextjs.org server and client components props must be serializable Date Map Set

💡 Result:

In modern Next.js (App Router), data passed as props from Server Components to Client Components must be serializable via the React Server Component (RSC) Payload [1][2]. Unlike traditional JSON serialization, the RSC protocol supports several built-in JavaScript types directly, including Date, Map, and Set [3][2]. You can pass these types as props from a Server Component to a Client Component, and they will be correctly received by the Client Component [2]. Key points regarding serialization in Next.js: 1. Supported Types: In addition to standard primitives (string, number, boolean, null, undefined) and plain objects/arrays, the RSC protocol supports Date, Map, Set, BigInt, and TypedArray [2]. 2. Limitations: You cannot pass non-serializable data such as class instances (which contain methods/prototypes), standard functions (unless they are marked with 'use server' as Server Actions), or objects with circular references [4][2][5]. 3. Best Practices: If you encounter issues or are working with complex data structures (like ORM models), it is a common best practice to convert these instances into plain serializable objects (POJOs) before passing them as props [4][5]. For example, instead of passing a raw database model instance, transform it into a plain object using a Data Transfer Object (DTO) or a similar serialization utility [5][6]. 4. Troubleshooting: Older documentation or community discussions may occasionally suggest that Date, Map, or Set are not supported [7]. This is typically due to outdated information or confusion with standard JSON.stringify() limitations [3][6]. In the current App Router environment, these types are fully supported as part of the React Flight protocol [2].

Citations:


🌐 Web query:

react.dev rsc use-client serializable values Date Map Set

💡 Result:

According to official React documentation, props passed from a Server Component to a Client Component must be serializable [1][2]. The React serialization protocol (often referred to as the Flight protocol) supports Date, Map, and Set as serializable types [1][2]. When you pass these types as props to a Client Component, they are serialized and reconstituted on the client side [3]. Specifically: - Date: You can pass a Date object directly. The client receives a Date instance [3]. - Map/Set: You can pass Map and Set objects directly. They are preserved through the boundary and arrive as Map or Set instances on the client [3]. While some legacy guidance or third-party documentation may suggest these types are not supported—often because they are not JSON-serializable in the traditional sense [4][5][6][7]—the React RSC architecture provides a richer serialization format that natively handles these built-in objects [3]. If you encounter environments or specific framework configurations that do not support these types, the recommended workaround is to manually serialize them before passing them across the boundary [4][7]. For example, you can convert a Date to an ISO string, or a Map to an array of entries, and reconstruct them on the client [4][7]. Always ensure that the data being passed consists of these supported built-in types, as passing class instances, non-registered symbols, or circular references will cause the application to throw an exception [1][2][8].

Citations:


🌐 Web query:

site:react.dev "serializable" "use-client" Date Map Set

💡 Result:

In React, when passing data from a Server Component to a Client Component (marked with 'use client'), the props must be serializable [1][2]. According to official React documentation, Date, Map, and Set are included in the list of supported serializable types [1][2]. Specifically, React supports passing the following as serializable props [1][2]: - Primitives (string, number, bigint, boolean, undefined, null, and globally registered symbols) [1][2] - Iterables containing serializable values, explicitly including Map and Set [1][2] - Date objects [1][2] - TypedArray and ArrayBuffer [1][2] - Plain objects (created with object initializers) with serializable properties [1][2] - Server Functions [1][2] - React elements (JSX) [1][2] - Promises [1][2] These same types are also supported for arguments and return values when working with Server Functions marked with the 'use server' directive [3][4]. Objects that are instances of custom classes, or functions that are not Server Functions, are generally not supported for these boundaries [1][3].

Citations:


🌐 Web query:

site:react.dev/reference/rsc/use-client Date Map Set

💡 Result:

There is no widely recognized, standard programming concept or specific data structure called a "Date Map Set." It is likely that you encountered these terms together in the context of React documentation regarding "serializable props" [1][2]. In React Server Components, when passing data from a Server Component to a Client Component, the props must be serializable. The official React documentation lists several types that are supported as serializable props, including: - Map [1][2] - Set [1][2] - Date [1][2] These are distinct JavaScript objects—Map, Set, and Date—that are recognized as valid, serializable prop values in this specific framework context [1][2]. They are not a single combined structure.

Citations:


🌐 Web query:

site:nextjs.org "Server Components" "Client Components" Date Map Set serializable props

💡 Result:

In React (Next.js App Router), the requirements for passing data between Server and Client Components depend on whether the data crosses the network boundary [1][2]. 1. Data within Server Components: You can use types like Date, Map, and Set directly within Server Components without any serialization requirements [3]. Because Server Components execute entirely on the server, they are not subject to the serialization constraints that apply when passing data to Client Components [3]. 2. Data passed as props to Client Components: When you pass data from a Server Component to a Client Component as a prop, that data must be serializable by the React Server Component (RSC) protocol [1][2]. While this protocol supports a superset of JSON—including support for Dates, Maps, and Sets [4]—it remains more restrictive than standard JavaScript. - Supported: Primitives, plain objects, arrays, Dates, Maps, Sets, and TypedArrays are generally supported [4]. - Unsupported: Class instances, functions, and symbols are not serializable and cannot be passed as props to Client Components [5][4][6]. 3. Caching Directives (e.g., 'use cache'): The 'use cache' directive also requires arguments and return values to be serializable [4]. Similar to the Client Component prop boundary, it supports types like Date, Map, and Set [4]. Note that serialization requirements for arguments can be stricter than for return values (e.g., while you may be able to return JSX, you generally cannot pass it as an argument unless using specific pass-through patterns) [4]. In summary, while you are free to use complex objects like Maps and Sets inside your Server Components, you must ensure that any data passed across the server-to-client boundary via props adheres to React's serialization capabilities [1][4][3].

Citations:


🌐 Web query:

site:react.dev/reference/rsc/use-server "serializable parameters and return values" Date Map Set

💡 Result:

In the context of modern web development, particularly regarding React Server Functions, Date, Map, and Set objects are explicitly supported as serializable parameters and return values [1]. When client code invokes a Server Function, arguments are serialized to be sent over the network, and return values are similarly serialized when sent back to the client [1]. As of the current specifications, the following types are officially supported for these serializable arguments and return values: - Primitives (string, number, bigint, boolean, undefined, null) - Symbol (only if registered in the global Symbol registry via Symbol.for) - Date - Map - Set - Array and TypedArray - ArrayBuffer - FormData instances - Plain objects (created with object initializers) - Functions that are Server Functions - Promises - Iterables containing serializable values [1] Conversely, types such as classes, React elements (JSX), functions that are not Server Functions, and objects with null prototypes are not supported for serialization [1]. This ensures that data passed between the client and server remains compatible with the required network transport format [1].

Citations:


RSC境界ルールで Date/Map を「無効」と断定している点を修正してください。

ReactのServer Component → Client Component(props境界)では Date/Map/Set がシリアライズ可能な型としてサポートされているため、Date/Map/Set を一律「No/Detect」扱いにしていると有効コードを誤検知します(JSON-serializable という表現も React Flight/RSCでシリアライズ可能な値 に置き換えが必要)。

  • claude/skills/next-best-practices/rsc-boundaries.mdDate / Map / Set を「禁止例」から外す(少なくとも断定をやめて整合させる)
  • 「new Date() / new Map() を client に渡す | No」および Date 例(76-101)を見直す
  • 置換対象は「クラスインスタンス」「未登録Symbol」「関数(Server Actionでないもの)」「循環参照」など、実際に非対応なものに寄せる
🤖 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 `@claude/skills/next-best-practices/rsc-boundaries.md` around lines 52 - 56,
rsc-boundaries.md で Date/Map/Set を「無効」と断定している誤りを修正してください:
`claude/skills/next-best-practices/rsc-boundaries.md` の該当箇所から `Date` / `Map` /
`Set` を禁止例から外し(または断定的な表現を和らげ)、76–101 行付近の `new Date() / new Map() を client に渡す |
No` と `Date` の例を見直して、代わりにシリアライズ可能な値(React
Flight/RSCでサポートされる値)として扱える場合がある旨を明記してください。併せて「JSON-serializable」の表現を「React
Flight/RSCでシリアライズ可能な値」に置換し、禁止対象は「クラスインスタンス」「未登録の Symbol」「関数(Server Action
でないもの)」「循環参照」等、実際にサポート外のケースに絞るよう文言を調整してください.

Comment on lines +364 to +366
# Trigger ISR revalidation
curl http://localhost:3001/api/revalidate?path=/posts

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

ISR 再検証例に再検証APIの認証前提を明記してください。

/api/revalidate をそのまま公開すると、第三者から再検証を乱発される構成になり得ます。少なくとも secret トークン検証(または署名)を必須と明記してください。

🤖 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 `@claude/skills/next-best-practices/self-hosting.md` around lines 364 - 366,
カール例と再検証エンドポイントの説明が認証を前提にしていないため、/api/revalidate
ハンドラで必ずシークレット検証または署名検証を行する旨を明記し、ドキュメント中の curl 例を認証付きに差し替えてください(例: クエリに
secret=YOUR_SECRET を付与、または Authorization ヘッダを使用)。さらに API 側の実装(/api/revalidate
のハンドラ)で受信したトークンを検証して不正なリクエストは 401/403 を返す旨を明記してください。

個人・常用層 (claude/skills) と公式スキルの fleet 層 (claude/fleet/skills) に
分離する。fleet 層は ~/.claude/ に symlink せず、Claude Code on the web の
SessionStart hook で inject する canonical 方式。

1) prune: Vercel の deploy/infra/perf 系3スキルを削除
   (vercel-optimize / vercel-cli-with-tokens / deploy-to-vercel、
    deploy-to-vercel/Archive.zip 含む)。skills-lock.json からも該当エントリを除外。

2) fleet 移動: 残り公式45スキルを claude/skills → claude/fleet/skills へ移動。
   自作10 (maintainer: gotomts) + 外部 vendor 11 (無印) は claude/skills のまま。
   skills-lock.json を claude/fleet/skills-lock.json へ relocate し
   claude/fleet/ を skills CLI の scope ルートにする。
   `cd claude/fleet && npx skills update` で in-place 更新できることを検証済み。

3) canonical hook: claude/fleet/inject-fleet.sh を新規作成 (実行権限付与)。
   CLAUDE_CODE_REMOTE 環境でのみ dotfiles を sparse-checkout し
   claude/skills + claude/fleet/skills を ~/.claude/skills へ束ねて inject する。

4) claude.nix: claude/ 配下を個別 path link しているため claude/fleet/ は
   自動的に link 対象外。その設計意図をコメントで明文化 (個人層のみ link)。

エージェント (claude/agents) は本タスクでは変更しない (fleet 移動は A2)。
@gotomts gotomts changed the title feat(claude/skills): 自作スキルに maintainer マーカー付与 + 公式スキル48個を vendor 取り込み refactor(claude): スキルを二層レイアウト化(個人層 + fleet 公式層)+ maintainer マーカー + canonical inject hook Jun 6, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 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 `@claude/fleet/inject-fleet.sh`:
- Line 9: Replace the global wildcard trust in inject-fleet.sh by configuring
safe.directory only for the temporary clone path: instead of running git config
--global --add safe.directory '*' call git -C "$CLONE_DIR" config --add
safe.directory "$CLONE_DIR" (or use git config --file "$CLONE_DIR/.git/config"
--add safe.directory "$CLONE_DIR") where "$CLONE_DIR" is the repository clone
directory used in inject-fleet.sh; update the existing line that runs git config
--global --add safe.directory '*' to use the repository-scoped command so the
wildcard is not persisted globally.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ff8b38ac-004c-449c-b18c-e2a934e4fecb

📥 Commits

Reviewing files that changed from the base of the PR and between 31a80f5 and 1e1abd1.

📒 Files selected for processing (244)
  • claude/fleet/inject-fleet.sh
  • claude/fleet/skills-lock.json
  • claude/fleet/skills/add-app-clip/SKILL.md
  • claude/fleet/skills/add-app-clip/references/native-module.md
  • claude/fleet/skills/building-native-ui/SKILL.md
  • claude/fleet/skills/building-native-ui/references/animations.md
  • claude/fleet/skills/building-native-ui/references/controls.md
  • claude/fleet/skills/building-native-ui/references/form-sheet.md
  • claude/fleet/skills/building-native-ui/references/gradients.md
  • claude/fleet/skills/building-native-ui/references/icons.md
  • claude/fleet/skills/building-native-ui/references/media.md
  • claude/fleet/skills/building-native-ui/references/route-structure.md
  • claude/fleet/skills/building-native-ui/references/search.md
  • claude/fleet/skills/building-native-ui/references/storage.md
  • claude/fleet/skills/building-native-ui/references/tabs.md
  • claude/fleet/skills/building-native-ui/references/toolbar-and-headers.md
  • claude/fleet/skills/building-native-ui/references/visual-effects.md
  • claude/fleet/skills/building-native-ui/references/webgpu-three.md
  • claude/fleet/skills/building-native-ui/references/zoom-transitions.md
  • claude/fleet/skills/dart-add-unit-test/SKILL.md
  • claude/fleet/skills/dart-build-cli-app/SKILL.md
  • claude/fleet/skills/dart-collect-coverage/SKILL.md
  • claude/fleet/skills/dart-fix-runtime-errors/SKILL.md
  • claude/fleet/skills/dart-generate-test-mocks/SKILL.md
  • claude/fleet/skills/dart-migrate-to-checks-package/SKILL.md
  • claude/fleet/skills/dart-resolve-package-conflicts/SKILL.md
  • claude/fleet/skills/dart-run-static-analysis/SKILL.md
  • claude/fleet/skills/dart-use-pattern-matching/SKILL.md
  • claude/fleet/skills/eas-update-insights/SKILL.md
  • claude/fleet/skills/eas-update-insights/references/channel-insights-schema.md
  • claude/fleet/skills/eas-update-insights/references/update-insights-schema.md
  • claude/fleet/skills/expo-api-routes/SKILL.md
  • claude/fleet/skills/expo-brownfield/SKILL.md
  • claude/fleet/skills/expo-brownfield/references/brownfield-integrated.md
  • claude/fleet/skills/expo-brownfield/references/brownfield-isolated.md
  • claude/fleet/skills/expo-brownfield/references/comparison.md
  • claude/fleet/skills/expo-brownfield/references/troubleshooting.md
  • claude/fleet/skills/expo-cicd-workflows/SKILL.md
  • claude/fleet/skills/expo-cicd-workflows/scripts/fetch.js
  • claude/fleet/skills/expo-cicd-workflows/scripts/package.json
  • claude/fleet/skills/expo-cicd-workflows/scripts/validate.js
  • claude/fleet/skills/expo-deployment/SKILL.md
  • claude/fleet/skills/expo-deployment/references/app-store-metadata.md
  • claude/fleet/skills/expo-deployment/references/ios-app-store.md
  • claude/fleet/skills/expo-deployment/references/play-store.md
  • claude/fleet/skills/expo-deployment/references/testflight.md
  • claude/fleet/skills/expo-deployment/references/workflows.md
  • claude/fleet/skills/expo-dev-client/SKILL.md
  • claude/fleet/skills/expo-module/SKILL.md
  • claude/fleet/skills/expo-module/references/config-plugin.md
  • claude/fleet/skills/expo-module/references/create-expo-module.md
  • claude/fleet/skills/expo-module/references/lifecycle.md
  • claude/fleet/skills/expo-module/references/module-config.md
  • claude/fleet/skills/expo-module/references/native-module.md
  • claude/fleet/skills/expo-module/references/native-view.md
  • claude/fleet/skills/expo-observe/SKILL.md
  • claude/fleet/skills/expo-observe/references/metrics.md
  • claude/fleet/skills/expo-observe/references/queries.md
  • claude/fleet/skills/expo-observe/references/setup.md
  • claude/fleet/skills/expo-tailwind-setup/SKILL.md
  • claude/fleet/skills/expo-ui-jetpack-compose/SKILL.md
  • claude/fleet/skills/expo-ui-swiftui/SKILL.md
  • claude/fleet/skills/flutter-add-integration-test/SKILL.md
  • claude/fleet/skills/flutter-add-widget-preview/SKILL.md
  • claude/fleet/skills/flutter-add-widget-test/SKILL.md
  • claude/fleet/skills/flutter-apply-architecture-best-practices/SKILL.md
  • claude/fleet/skills/flutter-build-responsive-layout/SKILL.md
  • claude/fleet/skills/flutter-fix-layout-issues/SKILL.md
  • claude/fleet/skills/flutter-implement-json-serialization/SKILL.md
  • claude/fleet/skills/flutter-setup-declarative-routing/SKILL.md
  • claude/fleet/skills/flutter-setup-localization/SKILL.md
  • claude/fleet/skills/flutter-use-http-package/SKILL.md
  • claude/fleet/skills/hono/SKILL.md
  • claude/fleet/skills/native-data-fetching/SKILL.md
  • claude/fleet/skills/native-data-fetching/references/expo-router-loaders.md
  • claude/fleet/skills/next-best-practices/SKILL.md
  • claude/fleet/skills/next-best-practices/async-patterns.md
  • claude/fleet/skills/next-best-practices/bundling.md
  • claude/fleet/skills/next-best-practices/data-patterns.md
  • claude/fleet/skills/next-best-practices/debug-tricks.md
  • claude/fleet/skills/next-best-practices/directives.md
  • claude/fleet/skills/next-best-practices/error-handling.md
  • claude/fleet/skills/next-best-practices/file-conventions.md
  • claude/fleet/skills/next-best-practices/font.md
  • claude/fleet/skills/next-best-practices/functions.md
  • claude/fleet/skills/next-best-practices/hydration-error.md
  • claude/fleet/skills/next-best-practices/image.md
  • claude/fleet/skills/next-best-practices/metadata.md
  • claude/fleet/skills/next-best-practices/parallel-routes.md
  • claude/fleet/skills/next-best-practices/route-handlers.md
  • claude/fleet/skills/next-best-practices/rsc-boundaries.md
  • claude/fleet/skills/next-best-practices/runtime-selection.md
  • claude/fleet/skills/next-best-practices/scripts.md
  • claude/fleet/skills/next-best-practices/self-hosting.md
  • claude/fleet/skills/next-best-practices/suspense-boundaries.md
  • claude/fleet/skills/next-cache-components/SKILL.md
  • claude/fleet/skills/next-upgrade/SKILL.md
  • claude/fleet/skills/upgrading-expo/SKILL.md
  • claude/fleet/skills/upgrading-expo/references/expo-av-to-audio.md
  • claude/fleet/skills/upgrading-expo/references/expo-av-to-video.md
  • claude/fleet/skills/upgrading-expo/references/native-tabs.md
  • claude/fleet/skills/upgrading-expo/references/new-architecture.md
  • claude/fleet/skills/upgrading-expo/references/react-19.md
  • claude/fleet/skills/upgrading-expo/references/react-compiler.md
  • claude/fleet/skills/upgrading-expo/references/react-navigation-to-expo-router.md
  • claude/fleet/skills/use-dom/SKILL.md
  • claude/fleet/skills/vercel-composition-patterns/AGENTS.md
  • claude/fleet/skills/vercel-composition-patterns/README.md
  • claude/fleet/skills/vercel-composition-patterns/SKILL.md
  • claude/fleet/skills/vercel-composition-patterns/rules/_sections.md
  • claude/fleet/skills/vercel-composition-patterns/rules/_template.md
  • claude/fleet/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md
  • claude/fleet/skills/vercel-composition-patterns/rules/architecture-compound-components.md
  • claude/fleet/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md
  • claude/fleet/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md
  • claude/fleet/skills/vercel-composition-patterns/rules/react19-no-forwardref.md
  • claude/fleet/skills/vercel-composition-patterns/rules/state-context-interface.md
  • claude/fleet/skills/vercel-composition-patterns/rules/state-decouple-implementation.md
  • claude/fleet/skills/vercel-composition-patterns/rules/state-lift-state.md
  • claude/fleet/skills/vercel-react-best-practices/AGENTS.md
  • claude/fleet/skills/vercel-react-best-practices/README.md
  • claude/fleet/skills/vercel-react-best-practices/SKILL.md
  • claude/fleet/skills/vercel-react-best-practices/rules/_sections.md
  • claude/fleet/skills/vercel-react-best-practices/rules/_template.md
  • claude/fleet/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md
  • claude/fleet/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md
  • claude/fleet/skills/vercel-react-best-practices/rules/advanced-init-once.md
  • claude/fleet/skills/vercel-react-best-practices/rules/advanced-use-latest.md
  • claude/fleet/skills/vercel-react-best-practices/rules/async-api-routes.md
  • claude/fleet/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md
  • claude/fleet/skills/vercel-react-best-practices/rules/async-defer-await.md
  • claude/fleet/skills/vercel-react-best-practices/rules/async-dependencies.md
  • claude/fleet/skills/vercel-react-best-practices/rules/async-parallel.md
  • claude/fleet/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md
  • claude/fleet/skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md
  • claude/fleet/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md
  • claude/fleet/skills/vercel-react-best-practices/rules/bundle-conditional.md
  • claude/fleet/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md
  • claude/fleet/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md
  • claude/fleet/skills/vercel-react-best-practices/rules/bundle-preload.md
  • claude/fleet/skills/vercel-react-best-practices/rules/client-event-listeners.md
  • claude/fleet/skills/vercel-react-best-practices/rules/client-localstorage-schema.md
  • claude/fleet/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md
  • claude/fleet/skills/vercel-react-best-practices/rules/client-swr-dedup.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-batch-dom-css.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-cache-function-results.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-cache-property-access.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-cache-storage.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-combine-iterations.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-early-exit.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-flatmap-filter.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-hoist-regexp.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-index-maps.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-length-check-first.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-min-max-loop.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-request-idle-callback.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-set-map-lookups.md
  • claude/fleet/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-activity.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-conditional-render.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-content-visibility.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-resource-hints.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-svg-precision.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-defer-reads.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-dependencies.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-derived-state.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-memo.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-transitions.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md
  • claude/fleet/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-after-nonblocking.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-auth-actions.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-cache-lru.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-cache-react.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-dedup-props.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-hoist-static-io.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-parallel-fetching.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md
  • claude/fleet/skills/vercel-react-best-practices/rules/server-serialization.md
  • claude/fleet/skills/vercel-react-native-skills/AGENTS.md
  • claude/fleet/skills/vercel-react-native-skills/README.md
  • claude/fleet/skills/vercel-react-native-skills/SKILL.md
  • claude/fleet/skills/vercel-react-native-skills/rules/_sections.md
  • claude/fleet/skills/vercel-react-native-skills/rules/_template.md
  • claude/fleet/skills/vercel-react-native-skills/rules/animation-derived-value.md
  • claude/fleet/skills/vercel-react-native-skills/rules/animation-gesture-detector-press.md
  • claude/fleet/skills/vercel-react-native-skills/rules/animation-gpu-properties.md
  • claude/fleet/skills/vercel-react-native-skills/rules/design-system-compound-components.md
  • claude/fleet/skills/vercel-react-native-skills/rules/fonts-config-plugin.md
  • claude/fleet/skills/vercel-react-native-skills/rules/imports-design-system-folder.md
  • claude/fleet/skills/vercel-react-native-skills/rules/js-hoist-intl.md
  • claude/fleet/skills/vercel-react-native-skills/rules/list-performance-callbacks.md
  • claude/fleet/skills/vercel-react-native-skills/rules/list-performance-function-references.md
  • claude/fleet/skills/vercel-react-native-skills/rules/list-performance-images.md
  • claude/fleet/skills/vercel-react-native-skills/rules/list-performance-inline-objects.md
  • claude/fleet/skills/vercel-react-native-skills/rules/list-performance-item-expensive.md
  • claude/fleet/skills/vercel-react-native-skills/rules/list-performance-item-memo.md
  • claude/fleet/skills/vercel-react-native-skills/rules/list-performance-item-types.md
  • claude/fleet/skills/vercel-react-native-skills/rules/list-performance-virtualize.md
  • claude/fleet/skills/vercel-react-native-skills/rules/monorepo-native-deps-in-app.md
  • claude/fleet/skills/vercel-react-native-skills/rules/monorepo-single-dependency-versions.md
  • claude/fleet/skills/vercel-react-native-skills/rules/navigation-native-navigators.md
  • claude/fleet/skills/vercel-react-native-skills/rules/react-compiler-destructure-functions.md
  • claude/fleet/skills/vercel-react-native-skills/rules/react-compiler-reanimated-shared-values.md
  • claude/fleet/skills/vercel-react-native-skills/rules/react-state-dispatcher.md
  • claude/fleet/skills/vercel-react-native-skills/rules/react-state-fallback.md
  • claude/fleet/skills/vercel-react-native-skills/rules/react-state-minimize.md
  • claude/fleet/skills/vercel-react-native-skills/rules/rendering-no-falsy-and.md
  • claude/fleet/skills/vercel-react-native-skills/rules/rendering-text-in-text-component.md
  • claude/fleet/skills/vercel-react-native-skills/rules/scroll-position-no-state.md
  • claude/fleet/skills/vercel-react-native-skills/rules/state-ground-truth.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-expo-image.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-image-gallery.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-measure-views.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-menus.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-native-modals.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-pressable.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-safe-area-scroll.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-scrollview-content-inset.md
  • claude/fleet/skills/vercel-react-native-skills/rules/ui-styling.md
  • claude/fleet/skills/vercel-react-view-transitions/AGENTS.md
  • claude/fleet/skills/vercel-react-view-transitions/README.md
  • claude/fleet/skills/vercel-react-view-transitions/SKILL.md
  • claude/fleet/skills/vercel-react-view-transitions/references/css-recipes.md
  • claude/fleet/skills/vercel-react-view-transitions/references/implementation.md
  • claude/fleet/skills/vercel-react-view-transitions/references/nextjs.md
  • claude/fleet/skills/vercel-react-view-transitions/references/patterns.md
  • claude/fleet/skills/web-design-guidelines/SKILL.md
  • claude/fleet/skills/writing-guidelines/SKILL.md
💤 Files with no reviewable changes (104)
  • claude/fleet/skills/expo-deployment/references/testflight.md
  • claude/fleet/skills/dart-run-static-analysis/SKILL.md
  • claude/fleet/skills/expo-cicd-workflows/scripts/package.json
  • claude/fleet/skills/expo-cicd-workflows/scripts/validate.js
  • claude/fleet/skills/expo-deployment/references/workflows.md
  • claude/fleet/skills/next-best-practices/SKILL.md
  • claude/fleet/skills/upgrading-expo/references/react-compiler.md
  • claude/fleet/skills/expo-module/references/module-config.md
  • claude/fleet/skills/eas-update-insights/references/update-insights-schema.md
  • claude/fleet/skills/next-upgrade/SKILL.md
  • claude/fleet/skills/flutter-implement-json-serialization/SKILL.md
  • claude/fleet/skills/building-native-ui/references/gradients.md
  • claude/fleet/skills/next-best-practices/runtime-selection.md
  • claude/fleet/skills/upgrading-expo/references/expo-av-to-video.md
  • claude/fleet/skills/upgrading-expo/references/new-architecture.md
  • claude/fleet/skills/upgrading-expo/references/expo-av-to-audio.md
  • claude/fleet/skills/expo-deployment/references/play-store.md
  • claude/fleet/skills/building-native-ui/references/route-structure.md
  • claude/fleet/skills/building-native-ui/references/storage.md
  • claude/fleet/skills/dart-use-pattern-matching/SKILL.md
  • claude/fleet/skills/next-best-practices/directives.md
  • claude/fleet/skills/next-best-practices/async-patterns.md
  • claude/fleet/skills/expo-observe/SKILL.md
  • claude/fleet/skills/next-best-practices/debug-tricks.md
  • claude/fleet/skills/building-native-ui/references/visual-effects.md
  • claude/fleet/skills-lock.json
  • claude/fleet/skills/upgrading-expo/references/react-navigation-to-expo-router.md
  • claude/fleet/skills/expo-observe/references/metrics.md
  • claude/fleet/skills/next-best-practices/scripts.md
  • claude/fleet/skills/building-native-ui/references/zoom-transitions.md
  • claude/fleet/skills/expo-tailwind-setup/SKILL.md
  • claude/fleet/skills/native-data-fetching/SKILL.md
  • claude/fleet/skills/expo-cicd-workflows/scripts/fetch.js
  • claude/fleet/skills/flutter-apply-architecture-best-practices/SKILL.md
  • claude/fleet/skills/next-best-practices/error-handling.md
  • claude/fleet/skills/next-best-practices/functions.md
  • claude/fleet/skills/dart-build-cli-app/SKILL.md
  • claude/fleet/skills/flutter-add-widget-test/SKILL.md
  • claude/fleet/skills/next-best-practices/bundling.md
  • claude/fleet/skills/dart-collect-coverage/SKILL.md
  • claude/fleet/skills/expo-ui-jetpack-compose/SKILL.md
  • claude/fleet/skills/building-native-ui/references/webgpu-three.md
  • claude/fleet/skills/dart-add-unit-test/SKILL.md
  • claude/fleet/skills/eas-update-insights/references/channel-insights-schema.md
  • claude/fleet/skills/next-best-practices/suspense-boundaries.md
  • claude/fleet/skills/flutter-build-responsive-layout/SKILL.md
  • claude/fleet/skills/expo-cicd-workflows/SKILL.md
  • claude/fleet/skills/next-best-practices/route-handlers.md
  • claude/fleet/skills/dart-generate-test-mocks/SKILL.md
  • claude/fleet/skills/building-native-ui/references/icons.md
  • claude/fleet/skills/expo-ui-swiftui/SKILL.md
  • claude/fleet/skills/flutter-setup-localization/SKILL.md
  • claude/fleet/skills/expo-module/references/lifecycle.md
  • claude/fleet/skills/expo-deployment/SKILL.md
  • claude/fleet/skills/next-best-practices/hydration-error.md
  • claude/fleet/skills/expo-module/references/config-plugin.md
  • claude/fleet/skills/flutter-setup-declarative-routing/SKILL.md
  • claude/fleet/skills/expo-brownfield/references/comparison.md
  • claude/fleet/skills/next-best-practices/rsc-boundaries.md
  • claude/fleet/skills/next-best-practices/file-conventions.md
  • claude/fleet/skills/upgrading-expo/references/native-tabs.md
  • claude/fleet/skills/expo-module/references/create-expo-module.md
  • claude/fleet/skills/dart-migrate-to-checks-package/SKILL.md
  • claude/fleet/skills/dart-fix-runtime-errors/SKILL.md
  • claude/fleet/skills/expo-dev-client/SKILL.md
  • claude/fleet/skills/building-native-ui/references/controls.md
  • claude/fleet/skills/expo-brownfield/references/brownfield-isolated.md
  • claude/fleet/skills/add-app-clip/references/native-module.md
  • claude/fleet/skills/building-native-ui/references/animations.md
  • claude/fleet/skills/expo-module/references/native-module.md
  • claude/fleet/skills/dart-resolve-package-conflicts/SKILL.md
  • claude/fleet/skills/upgrading-expo/references/react-19.md
  • claude/fleet/skills/flutter-add-widget-preview/SKILL.md
  • claude/fleet/skills/expo-module/SKILL.md
  • claude/fleet/skills/building-native-ui/references/search.md
  • claude/fleet/skills/flutter-use-http-package/SKILL.md
  • claude/fleet/skills/expo-brownfield/SKILL.md
  • claude/fleet/skills/next-best-practices/metadata.md
  • claude/fleet/skills/next-cache-components/SKILL.md
  • claude/fleet/skills/upgrading-expo/SKILL.md
  • claude/fleet/skills/eas-update-insights/SKILL.md
  • claude/fleet/skills/expo-deployment/references/ios-app-store.md
  • claude/fleet/skills/flutter-fix-layout-issues/SKILL.md
  • claude/fleet/skills/building-native-ui/references/toolbar-and-headers.md
  • claude/fleet/skills/flutter-add-integration-test/SKILL.md
  • claude/fleet/skills/next-best-practices/font.md
  • claude/fleet/skills/next-best-practices/self-hosting.md
  • claude/fleet/skills/building-native-ui/references/media.md
  • claude/fleet/skills/add-app-clip/SKILL.md
  • claude/fleet/skills/next-best-practices/image.md
  • claude/fleet/skills/expo-module/references/native-view.md
  • claude/fleet/skills/expo-deployment/references/app-store-metadata.md
  • claude/fleet/skills/building-native-ui/SKILL.md
  • claude/fleet/skills/expo-api-routes/SKILL.md
  • claude/fleet/skills/native-data-fetching/references/expo-router-loaders.md
  • claude/fleet/skills/next-best-practices/data-patterns.md
  • claude/fleet/skills/expo-observe/references/setup.md
  • claude/fleet/skills/expo-observe/references/queries.md
  • claude/fleet/skills/expo-brownfield/references/troubleshooting.md
  • claude/fleet/skills/next-best-practices/parallel-routes.md
  • claude/fleet/skills/building-native-ui/references/form-sheet.md
  • claude/fleet/skills/expo-brownfield/references/brownfield-integrated.md
  • claude/fleet/skills/hono/SKILL.md
  • claude/fleet/skills/building-native-ui/references/tabs.md

Comment thread claude/fleet/inject-fleet.sh Outdated
CodeRabbit 指摘 (#34)。`git config --global --add safe.directory '*'` は
~/.gitconfig に全ディレクトリ永続信頼を書き込むため過剰。グローバル設定を撤去し、
sparse-checkout 実行時のみ `git -c safe.directory="$TMP/dotfiles"` でスコープする。
ephemeral リモート環境前提でも無害なハードニング。

gotomts commented Jun 6, 2026

Copy link
Copy Markdown
Owner Author

CodeRabbit レビュー対応 (triage)

21 スレッドを確認し、本 PR スコープに照らして以下のとおり対応しました。

✅ 対応済み(1件)

  • claude/fleet/inject-fleet.shsafe.directory '*'(thread: inject-fleet.sh L9)→ グローバル全許可を撤去し、sparse-checkout 実行時のみ git -c safe.directory="$TMP/dotfiles" でスコープ限定する形に修正(commit 9874ae8)。妥当な指摘でした。

⏭️ 対象外: 公式スキルの中身(計13件)

本 PR は公式スキルを skills CLI で vendor 取り込みしており、upstream の中身は意図的に改変しません(無印=外部由来・編集しない方針)。以下はいずれも upstream へ報告すべき内容で、本リポジトリでは修正しません:

  • add-app-clip(AASA / App Links), building-native-ui(fontWeight / webgpu-three / controls), expo-brownfield(SDK バージョン不整合), expo-ui-swiftui, expo-cicd-workflows/scripts/fetch.js(fetch timeout), flutter-add-integration-test, flutter-use-http-package(204 ステータス), next-best-practices(data-patterns / serializable / self-hosting revalidate auth)

これらは npx skills update で upstream 修正が入れば自動的に反映されます。

🗑️ 既に解消: 削除済みファイルへの指摘(計6件)

deploy-to-vercel/resources/deploy.sh / deploy-codex.sh(tar の機密混入 / curl timeout / 壊れやすい JSON パース)への指摘は、本 PR で deploy-to-vercel 自体を prune(削除) したため moot です。


CI(nix flake check + build closure)は green です。


Generated by Claude Code

@gotomts gotomts merged commit 727175e into main Jun 6, 2026
2 checks passed
@gotomts gotomts deleted the claude/dotfiles-skills-maintainer-j5LEh branch June 6, 2026 13:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants