From 350016df8431a8b9f79ff4b161734310a967ca22 Mon Sep 17 00:00:00 2001 From: dwebxr Date: Mon, 21 Sep 2026 21:23:48 +0900 Subject: [PATCH] =?UTF-8?q?feat(guide):=20AI=20=E3=81=A7=E6=B3=A8=E6=96=87?= =?UTF-8?q?=E3=81=99=E3=82=8B=20/=20AI=20=E3=81=8C=E6=94=AF=E6=89=95?= =?UTF-8?q?=E3=81=86=20=E3=82=AC=E3=82=A4=E3=83=89=E3=81=AE=E4=B8=8A?= =?UTF-8?q?=E9=83=A8=E3=83=AA=E3=83=B3=E3=82=AF=E3=82=92=20OpenPay=20Agent?= =?UTF-8?q?=20=E3=81=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit user 提案 (9/21): 2 つのガイド上部の「トップにもどる」を /agent へのリンクにすると導線が良い。 - トップへはヘッダのロゴで常に戻れるので、本文上部のリンクは役割が重複していた。 その枠を文脈上の親である /agent に使う (/agent は 2 つのガイドを「2 つの使い方」として束ねるハブ・ 読み終えた人の次の行動 = セットアップも /agent にある)。 - ラベルは「Agent にもどる」ではなく「← OpenPay Agent」。このガイドへの流入は /agent だけでなく AI ストア・LP・店舗ガイド等からもあるので、「もどる」と書くとそこから来ていない人には事実と合わない。 親ページの名前を出すパンくず型なら、どこから来ても正しい。 - SOT のキーを backHome (文字列) から backLink (label と href) に変更。リンク先がページ側に直書きだった。 - /guide/sell (API を売るガイド) は売り手向けで親は AI ストアなので対象外。ほかのガイドも変更なし。 検証: typecheck・eslint・full vitest 11,432 pass・next build OK。本番 build の実機で ja/en の 4 ページとも リンクが /ja/agent・/en/agent を指すことを確認。 Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01LmCRFvTbAq9XiBKZNBakPp --- app/[locale]/guide/agent/page.tsx | 4 ++-- app/[locale]/guide/ai-pay/page.tsx | 4 ++-- lib/agentGuide.ts | 7 ++++--- lib/aiPayGuide.ts | 7 ++++--- tests/lib/agentGuide.test.ts | 8 ++++++++ tests/lib/aiPayGuide.test.ts | 8 ++++++++ 6 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/[locale]/guide/agent/page.tsx b/app/[locale]/guide/agent/page.tsx index 73987dec..45a524d0 100644 --- a/app/[locale]/guide/agent/page.tsx +++ b/app/[locale]/guide/agent/page.tsx @@ -47,11 +47,11 @@ export default async function GuideAgentPage({
- {c.backHome} + {c.backLink.label}
diff --git a/app/[locale]/guide/ai-pay/page.tsx b/app/[locale]/guide/ai-pay/page.tsx index c1960aef..1dbd81ce 100644 --- a/app/[locale]/guide/ai-pay/page.tsx +++ b/app/[locale]/guide/ai-pay/page.tsx @@ -46,11 +46,11 @@ export default async function GuideAiPayPage({
- {c.backHome} + {c.backLink.label}
diff --git a/lib/agentGuide.ts b/lib/agentGuide.ts index 30de53eb..e6764d3a 100644 --- a/lib/agentGuide.ts +++ b/lib/agentGuide.ts @@ -113,7 +113,8 @@ export type AgentGuideContent = { readonly ctaButton: string; readonly ctaButtonHref: string; - readonly backHome: string; + /** ページ上部のリンク。トップへはヘッダのロゴで戻れるので、文脈上の親 (/agent) を指す。 */ + readonly backLink: { readonly label: string; readonly href: string }; }; const ja: AgentGuideContent = { @@ -280,7 +281,7 @@ const ja: AgentGuideContent = { ctaButton: 'AIストアを見る', ctaButtonHref: '/discovery', - backHome: '← トップにもどる', + backLink: { label: '← OpenPay Agent', href: '/agent' }, }; const en: AgentGuideContent = { @@ -446,7 +447,7 @@ const en: AgentGuideContent = { ctaButton: 'Open the AI store', ctaButtonHref: '/discovery', - backHome: '← Back to home', + backLink: { label: '← OpenPay Agent', href: '/agent' }, }; export const AGENT_GUIDE: Record = { ja, en }; diff --git a/lib/aiPayGuide.ts b/lib/aiPayGuide.ts index 73d3184b..e9edc7a3 100644 --- a/lib/aiPayGuide.ts +++ b/lib/aiPayGuide.ts @@ -98,7 +98,8 @@ export type AiPayGuideContent = JpycSectionContent & { readonly metaDescription: string; readonly title: string; readonly subtitle: string; - readonly backHome: string; + /** ページ上部のリンク。トップへはヘッダのロゴで戻れるので、文脈上の親 (/agent) を指す。 */ + readonly backLink: AiPayGuideLink; readonly mechanismTitle: string; readonly mechanismIntro: string; @@ -174,7 +175,7 @@ const ja: AiPayGuideContent = { title: 'あなたの AI に、支払う力を。', subtitle: 'Claude などの AI エージェントが、AI ストアのデータ・API・AI への相談を JPYC で都度購入できるようになります。数分のセットアップで、支払いは数円から。', - backHome: '← トップにもどる', + backLink: { label: '← OpenPay Agent', href: '/agent' }, mechanismTitle: '仕組み (30 秒)', mechanismIntro: @@ -292,7 +293,7 @@ const en: AiPayGuideContent = { title: 'Give your AI the power to pay.', subtitle: 'AI agents such as Claude can buy data, APIs, and consultations with other AIs from the AI Store, paying JPYC per use. Setup takes minutes, and purchases start at just a few yen.', - backHome: '← Back to home', + backLink: { label: '← OpenPay Agent', href: '/agent' }, mechanismTitle: 'How it works (30 seconds)', mechanismIntro: diff --git a/tests/lib/agentGuide.test.ts b/tests/lib/agentGuide.test.ts index 7ae5bcf8..41f33489 100644 --- a/tests/lib/agentGuide.test.ts +++ b/tests/lib/agentGuide.test.ts @@ -90,6 +90,14 @@ describe('guideAgentMetadata: メタデータ組立', () => { // ── (2) ja/en parity + 全 leaf 非空 ─────────────────────────────── describe('AGENT_GUIDE: ja/en 構造 parity と非空', () => { + it.each(LOCALES)('%s: 上部のリンクは文脈上の親 (/agent) を指し、ラベルは「もどる」と言わない', (loc) => { + // トップへはヘッダのロゴで戻れる。流入元は複数 (/agent・LP のモバイルオーダー節・店舗ガイド…) なので親ページの名前を出す。 + const c = AGENT_GUIDE[loc]; + expect(c.backLink.href).toBe('/agent'); + expect(c.backLink.label).toBe('← OpenPay Agent'); + expect(c.backLink.label).not.toMatch(/もどる|戻る|Back/i); + }); + it('ja と en のトップレベルキーが完全一致', () => { expect(Object.keys(AGENT_GUIDE.ja).sort()).toEqual( Object.keys(AGENT_GUIDE.en).sort(), diff --git a/tests/lib/aiPayGuide.test.ts b/tests/lib/aiPayGuide.test.ts index 48e544c1..8201fdee 100644 --- a/tests/lib/aiPayGuide.test.ts +++ b/tests/lib/aiPayGuide.test.ts @@ -128,6 +128,14 @@ describe('AI_PAY_GUIDE: 主要リンク', () => { expect(c.sdkLink.href).toBe(expected.sdk); }); + it.each(LOCALES)('%s: 上部のリンクは文脈上の親 (/agent) を指し、ラベルは「もどる」と言わない', (loc) => { + // トップへはヘッダのロゴで戻れる。流入元は複数 (/agent・AI ストア・LP…) なので「もどる」ではなく親ページの名前を出す。 + const c = AI_PAY_GUIDE[loc]; + expect(c.backLink.href).toBe('/agent'); + expect(c.backLink.label).toBe('← OpenPay Agent'); + expect(c.backLink.label).not.toMatch(/もどる|戻る|Back/i); + }); + it.each(LOCALES)('%s: discovery と売り手ガイドの内部リンクが正しい', (loc) => { const c = AI_PAY_GUIDE[loc]; expect(c.ctaButtonHref).toBe('/discovery');