From dd0b09926ef1fbc9391966021d94c1c4aad470e9 Mon Sep 17 00:00:00 2001 From: PullLog Dev Date: Fri, 3 Oct 2025 23:01:13 +0900 Subject: [PATCH 1/6] update: biome to v2.2.5 --- .vscode/frontend.code-workspace | 4 +- package.json | 2 +- pnpm-lock.yaml | 88 ++++++++++++++++----------------- 3 files changed, 48 insertions(+), 46 deletions(-) diff --git a/.vscode/frontend.code-workspace b/.vscode/frontend.code-workspace index 75f8a45..b2ccb18 100644 --- a/.vscode/frontend.code-workspace +++ b/.vscode/frontend.code-workspace @@ -4,5 +4,7 @@ "path": ".." } ], - "settings": {} + "settings": { + "biome.lsp.bin": "${workspaceFolder}/node_modules/.bin/biome.cmd" + } } diff --git a/package.json b/package.json index ff390ec..333e64c 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "zod": "^3.24.3" }, "devDependencies": { - "@biomejs/biome": "^2.2.3", + "@biomejs/biome": "^2.2.5", "@nuxt/types": "^2.18.1", "@nuxt/typescript-build": "^3.0.2", "@primevue/auto-import-resolver": "^4.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e6d754..108afc3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: version: 15.0.12 nuxt: specifier: ^3.17.6 - version: 3.17.6(@biomejs/biome@2.2.3)(@parcel/watcher@2.5.1)(@types/node@24.0.12)(@vue/compiler-sfc@3.5.17)(db0@0.3.2)(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1) + version: 3.17.6(@biomejs/biome@2.2.5)(@parcel/watcher@2.5.1)(@types/node@24.0.12)(@vue/compiler-sfc@3.5.17)(db0@0.3.2)(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1) pinia: specifier: ^3.0.2 version: 3.0.3(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)) @@ -79,8 +79,8 @@ importers: version: 3.25.76 devDependencies: '@biomejs/biome': - specifier: ^2.2.3 - version: 2.2.3 + specifier: ^2.2.5 + version: 2.2.5 '@nuxt/types': specifier: ^2.18.1 version: 2.18.1 @@ -257,55 +257,55 @@ packages: resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} - '@biomejs/biome@2.2.3': - resolution: {integrity: sha512-9w0uMTvPrIdvUrxazZ42Ib7t8Y2yoGLKLdNne93RLICmaHw7mcLv4PPb5LvZLJF3141gQHiCColOh/v6VWlWmg==} + '@biomejs/biome@2.2.5': + resolution: {integrity: sha512-zcIi+163Rc3HtyHbEO7CjeHq8DjQRs40HsGbW6vx2WI0tg8mYQOPouhvHSyEnCBAorfYNnKdR64/IxO7xQ5faw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.2.3': - resolution: {integrity: sha512-OrqQVBpadB5eqzinXN4+Q6honBz+tTlKVCsbEuEpljK8ASSItzIRZUA02mTikl3H/1nO2BMPFiJ0nkEZNy3B1w==} + '@biomejs/cli-darwin-arm64@2.2.5': + resolution: {integrity: sha512-MYT+nZ38wEIWVcL5xLyOhYQQ7nlWD0b/4mgATW2c8dvq7R4OQjt/XGXFkXrmtWmQofaIM14L7V8qIz/M+bx5QQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.2.3': - resolution: {integrity: sha512-OCdBpb1TmyfsTgBAM1kPMXyYKTohQ48WpiN9tkt9xvU6gKVKHY4oVwteBebiOqyfyzCNaSiuKIPjmHjUZ2ZNMg==} + '@biomejs/cli-darwin-x64@2.2.5': + resolution: {integrity: sha512-FLIEl73fv0R7dI10EnEiZLw+IMz3mWLnF95ASDI0kbx6DDLJjWxE5JxxBfmG+udz1hIDd3fr5wsuP7nwuTRdAg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.2.3': - resolution: {integrity: sha512-q3w9jJ6JFPZPeqyvwwPeaiS/6NEszZ+pXKF+IczNo8Xj6fsii45a4gEEicKyKIytalV+s829ACZujQlXAiVLBQ==} + '@biomejs/cli-linux-arm64-musl@2.2.5': + resolution: {integrity: sha512-5Ov2wgAFwqDvQiESnu7b9ufD1faRa+40uwrohgBopeY84El2TnBDoMNXx6iuQdreoFGjwW8vH6k68G21EpNERw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.2.3': - resolution: {integrity: sha512-g/Uta2DqYpECxG+vUmTAmUKlVhnGEcY7DXWgKP8ruLRa8Si1QHsWknPY3B/wCo0KgYiFIOAZ9hjsHfNb9L85+g==} + '@biomejs/cli-linux-arm64@2.2.5': + resolution: {integrity: sha512-5DjiiDfHqGgR2MS9D+AZ8kOfrzTGqLKywn8hoXpXXlJXIECGQ32t+gt/uiS2XyGBM2XQhR6ztUvbjZWeccFMoQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.2.3': - resolution: {integrity: sha512-y76Dn4vkP1sMRGPFlNc+OTETBhGPJ90jY3il6jAfur8XWrYBQV3swZ1Jo0R2g+JpOeeoA0cOwM7mJG6svDz79w==} + '@biomejs/cli-linux-x64-musl@2.2.5': + resolution: {integrity: sha512-AVqLCDb/6K7aPNIcxHaTQj01sl1m989CJIQFQEaiQkGr2EQwyOpaATJ473h+nXDUuAcREhccfRpe/tu+0wu0eQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.2.3': - resolution: {integrity: sha512-LEtyYL1fJsvw35CxrbQ0gZoxOG3oZsAjzfRdvRBRHxOpQ91Q5doRVjvWW/wepgSdgk5hlaNzfeqpyGmfSD0Eyw==} + '@biomejs/cli-linux-x64@2.2.5': + resolution: {integrity: sha512-fq9meKm1AEXeAWan3uCg6XSP5ObA6F/Ovm89TwaMiy1DNIwdgxPkNwxlXJX8iM6oRbFysYeGnT0OG8diCWb9ew==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.2.3': - resolution: {integrity: sha512-Ms9zFYzjcJK7LV+AOMYnjN3pV3xL8Prxf9aWdDVL74onLn5kcvZ1ZMQswE5XHtnd/r/0bnUd928Rpbs14BzVmA==} + '@biomejs/cli-win32-arm64@2.2.5': + resolution: {integrity: sha512-xaOIad4wBambwJa6mdp1FigYSIF9i7PCqRbvBqtIi9y29QtPVQ13sDGtUnsRoe6SjL10auMzQ6YAe+B3RpZXVg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.2.3': - resolution: {integrity: sha512-gvCpewE7mBwBIpqk1YrUqNR4mCiyJm6UI3YWQQXkedSSEwzRdodRpaKhbdbHw1/hmTWOVXQ+Eih5Qctf4TCVOQ==} + '@biomejs/cli-win32-x64@2.2.5': + resolution: {integrity: sha512-F/jhuXCssPFAuciMhHKk00xnCAxJRS/pUzVfXYmOMUp//XW7mO6QeCjsjvnm8L4AO/dG2VOB0O+fJPiJ2uXtIw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -5377,39 +5377,39 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@biomejs/biome@2.2.3': + '@biomejs/biome@2.2.5': optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.2.3 - '@biomejs/cli-darwin-x64': 2.2.3 - '@biomejs/cli-linux-arm64': 2.2.3 - '@biomejs/cli-linux-arm64-musl': 2.2.3 - '@biomejs/cli-linux-x64': 2.2.3 - '@biomejs/cli-linux-x64-musl': 2.2.3 - '@biomejs/cli-win32-arm64': 2.2.3 - '@biomejs/cli-win32-x64': 2.2.3 + '@biomejs/cli-darwin-arm64': 2.2.5 + '@biomejs/cli-darwin-x64': 2.2.5 + '@biomejs/cli-linux-arm64': 2.2.5 + '@biomejs/cli-linux-arm64-musl': 2.2.5 + '@biomejs/cli-linux-x64': 2.2.5 + '@biomejs/cli-linux-x64-musl': 2.2.5 + '@biomejs/cli-win32-arm64': 2.2.5 + '@biomejs/cli-win32-x64': 2.2.5 - '@biomejs/cli-darwin-arm64@2.2.3': + '@biomejs/cli-darwin-arm64@2.2.5': optional: true - '@biomejs/cli-darwin-x64@2.2.3': + '@biomejs/cli-darwin-x64@2.2.5': optional: true - '@biomejs/cli-linux-arm64-musl@2.2.3': + '@biomejs/cli-linux-arm64-musl@2.2.5': optional: true - '@biomejs/cli-linux-arm64@2.2.3': + '@biomejs/cli-linux-arm64@2.2.5': optional: true - '@biomejs/cli-linux-x64-musl@2.2.3': + '@biomejs/cli-linux-x64-musl@2.2.5': optional: true - '@biomejs/cli-linux-x64@2.2.3': + '@biomejs/cli-linux-x64@2.2.5': optional: true - '@biomejs/cli-win32-arm64@2.2.3': + '@biomejs/cli-win32-arm64@2.2.5': optional: true - '@biomejs/cli-win32-x64@2.2.3': + '@biomejs/cli-win32-x64@2.2.5': optional: true '@cloudflare/kv-asset-handler@0.4.0': @@ -6096,7 +6096,7 @@ snapshots: - vue-template-compiler - webpack - '@nuxt/vite-builder@3.17.6(@biomejs/biome@2.2.3)(@types/node@24.0.12)(eslint@9.30.1(jiti@2.4.2))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vue-tsc@2.2.12(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))(yaml@2.8.1)': + '@nuxt/vite-builder@3.17.6(@biomejs/biome@2.2.5)(@types/node@24.0.12)(eslint@9.30.1(jiti@2.4.2))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vue-tsc@2.2.12(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))(yaml@2.8.1)': dependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) '@rollup/plugin-replace': 6.0.2(rollup@4.44.2) @@ -6128,7 +6128,7 @@ snapshots: unenv: 2.0.0-rc.18 vite: 6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1) vite-node: 3.2.4(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1) - vite-plugin-checker: 0.9.3(@biomejs/biome@2.2.3)(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3)) + vite-plugin-checker: 0.9.3(@biomejs/biome@2.2.5)(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3)) vue: 3.5.17(typescript@5.8.3) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: @@ -9080,7 +9080,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@3.17.6(@biomejs/biome@2.2.3)(@parcel/watcher@2.5.1)(@types/node@24.0.12)(@vue/compiler-sfc@3.5.17)(db0@0.3.2)(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1): + nuxt@3.17.6(@biomejs/biome@2.2.5)(@parcel/watcher@2.5.1)(@types/node@24.0.12)(@vue/compiler-sfc@3.5.17)(db0@0.3.2)(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3))(yaml@2.8.1): dependencies: '@nuxt/cli': 3.25.1(magicast@0.3.5) '@nuxt/devalue': 2.0.2 @@ -9088,7 +9088,7 @@ snapshots: '@nuxt/kit': 3.17.6(magicast@0.3.5) '@nuxt/schema': 3.17.6 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 3.17.6(@biomejs/biome@2.2.3)(@types/node@24.0.12)(eslint@9.30.1(jiti@2.4.2))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vue-tsc@2.2.12(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))(yaml@2.8.1) + '@nuxt/vite-builder': 3.17.6(@biomejs/biome@2.2.5)(@types/node@24.0.12)(eslint@9.30.1(jiti@2.4.2))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.2)(sass@1.89.2)(terser@5.43.1)(typescript@5.8.3)(vue-tsc@2.2.12(typescript@5.8.3))(vue@3.5.17(typescript@5.8.3))(yaml@2.8.1) '@unhead/vue': 2.0.12(vue@3.5.17(typescript@5.8.3)) '@vue/shared': 3.5.17 c12: 3.0.4(magicast@0.3.5) @@ -10430,7 +10430,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.9.3(@biomejs/biome@2.2.3)(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3)): + vite-plugin-checker@0.9.3(@biomejs/biome@2.2.5)(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1))(vue-tsc@2.2.12(typescript@5.8.3)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -10443,7 +10443,7 @@ snapshots: vite: 6.3.5(@types/node@24.0.12)(jiti@2.4.2)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.1) vscode-uri: 3.1.0 optionalDependencies: - '@biomejs/biome': 2.2.3 + '@biomejs/biome': 2.2.5 eslint: 9.30.1(jiti@2.4.2) optionator: 0.9.4 typescript: 5.8.3 From 72ded37dc1aa7a9a719880e1d7377222a684ff7f Mon Sep 17 00:00:00 2001 From: PullLog Dev Date: Fri, 3 Oct 2025 23:03:34 +0900 Subject: [PATCH 2/6] fix: type error of body --- server/utils/apiProxyUtil.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/utils/apiProxyUtil.ts b/server/utils/apiProxyUtil.ts index 6569532..988e69e 100644 --- a/server/utils/apiProxyUtil.ts +++ b/server/utils/apiProxyUtil.ts @@ -93,7 +93,8 @@ export async function proxyFetchAndReturn( ) { fetchBody = body } else if (typeof body === "string" || body instanceof Uint8Array) { - fetchBody = body + // biome-ignore lint:/suspicious/noExplicitAny + fetchBody = body as string | Uint8Array as any } else { // 通常のobject(JSON送信) fetchBody = JSON.stringify(body) From 9c5942d7a737d76ee65042723cbdcee130c2408d Mon Sep 17 00:00:00 2001 From: PullLog Dev Date: Fri, 3 Oct 2025 23:17:14 +0900 Subject: [PATCH 3/6] change: temp dir for codex cli --- .gitignore | 2 + AGENTS.md | 3 + docs/edit-stats-layout.md | 97 ----------------------------- docs/issue-seo-ogp.md | 41 ------------ docs/issue-stats-duplicate-tiles.md | 22 ------- docs/issue-stats-grid-order.md | 20 ------ docs/issue-stats-layout-control.md | 53 ---------------- docs/issue-stats-layout-demo.md | 27 -------- docs/issue-stats-toast.md | 42 ------------- 9 files changed, 5 insertions(+), 302 deletions(-) delete mode 100644 docs/edit-stats-layout.md delete mode 100644 docs/issue-seo-ogp.md delete mode 100644 docs/issue-stats-duplicate-tiles.md delete mode 100644 docs/issue-stats-grid-order.md delete mode 100644 docs/issue-stats-layout-control.md delete mode 100644 docs/issue-stats-layout-demo.md delete mode 100644 docs/issue-stats-toast.md diff --git a/.gitignore b/.gitignore index b70203a..f03141a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ .nitro .cache .wrangler +.codex dist # Node dependencies @@ -29,3 +30,4 @@ desktop.ini # Development temporary files public/sample/ public/.well-known/ +docs/ diff --git a/AGENTS.md b/AGENTS.md index 79ecacc..b126c3a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -52,3 +52,6 @@ - `pnpm build` もしくは `pnpm preview` を実行しCLIがタイムアウトした場合は処理を中断して状況を報告すること。 - `runtimeConfig` のキー(例: `API_BASE_URL`, `GOOGLE_CLIENT_ID`)は正しく設定すること。 - ローカル HTTPS は `public/` 内の証明書を使用。警告が出たら信頼設定を行うこと。 + +## その他 +- `.codex/` を codex CLI で作業する際のテンポラリディレクトリとして利用する。作業用の一時ファイルやバグレポート、Issueのひな形、補足ドキュメント等を自由に出力して構いません。 diff --git a/docs/edit-stats-layout.md b/docs/edit-stats-layout.md deleted file mode 100644 index 8e709e2..0000000 --- a/docs/edit-stats-layout.md +++ /dev/null @@ -1,97 +0,0 @@ -## 概要 - -- 統計ページにタイルサイズ変更・ドラッグアンドドロップ並び替え・表示切替を統合したレイアウト管理機能を実装する。 -- レイアウト状態は Pinia ストアで一元管理し、localStorage による即時永続化と、将来的な Laravel `user_filters` テーブルとの同期に対応できる構成とする。 - -## 機能要件 - -- 各チャートタイルのサイズを「最小・小・中・大・最大」の 5 段階(span=2〜6)から選択できること。 -- タイルを SortableJS を用いて並び替えできること。並び順は表示状態に依存せず保持される。 -- タイルごとに表示・非表示を切り替えられること。非表示タイルはレイアウト上から除外されるが順序とサイズ設定は保持する。 -- タイル設定は初回ロード時に既存レイアウト(現行 span 設定)を初期値とし、ユーザー操作後は localStorage に保存される。 -- スマートフォンとタブレットでのレスポンシブ挙動を考慮し、端末幅ごとにサイズ選択肢・グリッド幅を制御する(md 未満は span=6 固定、md 以上 lg 未満は span=3 / span=6 のみ選択可、lg 以上は span=2〜6 の 5 段階)。 - -## UI 仕様 - -- 各チャートカードのタイトル行に 3 つのアイコンボタン (DisplayControllerUI) を配置し、見出しとフレックスレイアウトで右側に並べる。 - - サイズ切替ボタン:`pi-expand` アイコンのアイコンボタン。クリックするとプルダウンメニューを表示し、`大 (large)`・`中 (medium)`・`小 (small)` を選択できる(文言のみ表示)。 - - 表示切替トグル:`pi-eye` / `pi-eye-slash` の状態遷移で `visible` を制御する。非表示時はタイル全体をフェードアウトし、DOM から除去する。 - - ドラッグ可能トグル:初期値はオフ。オンにしたタイルが 1 つでも存在する間は全タイルにドラッグハンドルクラスを付与し、SortableJS により並び替え操作を許可する。オフ時は全タイルを固定する。モバイル幅(`md` 未満)では常時オフ固定。 -- コントロールアイコンには PrimeVue の `OverlayPanel` または `TieredMenu` を活用し、操作後は自動で閉じる。 -- スマートフォン幅(Tailwind `md` 未満)ではサイズ切替 UI を無効化し、全タイルを `span-6` のフル幅で表示する。 -- タブレット幅(`md` 以上 `lg` 未満)では選択肢を `small (span-3)` と `max (span-6)` の 2 段階に限定する。`lg` 以上では `span-2/span-3/span-4/span-5/span-6` の 5 段階を利用する。 -- ドラッグ有効化中は視覚的に分かるよう、タイル外枠に枠線または背景色を追加する。 -- 将来的な統計フィルター設定領域と並列に扱えるよう、設定アイコン群から開くヘルプモーダル(任意)を検討する。 - -## 状態管理(フロントエンド) - -- `useStatsLayoutStore` を拡張し、状態型を次のように定義する。 - ```ts - type TileSize = 'span-2' | 'span-3' | 'span-4' | 'span-5' | 'span-6' - type StatsLayoutState = { - version: 'v1' - tiles: TileConfig[] - filters: Record - } - type TileConfig = { - id: TileId - size: TileSize - visible: boolean - locked?: boolean - } - ``` -- `span` クラスは Vue 側で `size` から算出するユーティリティを実装し、ブレークポイント別に出し分け可能とする(`span-2`〜`span-6` を想定)。 -- 既存タイル順・サイズを `DEFAULT_STATS_TILES` として定数化し、`resetToDefault()` で参照する。 -- SortableJS 読み込みはダイナミックインポートを用い、初回ドラッグ有効化時にロードする。 - -## 永続化・同期仕様 - -- localStorage キー:`pulllog.statsLayout.v1`。JSON 形式で `StatsLayoutState` を保存する。 -- ストア初期化フロー: - 1. localStorage を読み込み、JSON が有効なら採用。無効またはバージョン不一致時はデフォルトを適用。 - 2. Laravel API (`GET /api/user-filters/stats`) を並列で呼び出し、取得成功時にストアへマージして localStorage を更新。 -- ユーザー操作時:`store.$subscribe` で変更を検知し、即時で localStorage へ書き込み。API 実装後は 500ms デバウンスで `PUT /api/user-filters/stats` を送信する。 -- API 未実装段階では同期キューを no-op とし、エラー時はローカル状態を維持する。 -- `version` がサーバーと不一致の場合はリセットダイアログを表示し、ユーザー確認後 `resetToDefault()` を実行する。サーバー更新に失敗した場合は `toast` で「表示設定の読み込みに失敗しました」を通知する。 - -## バックエンド仕様 - -- テーブル `user_filters` を新設し、カラムは `id`, `user_id`, `context`, `layout` (JSON), `filters` (JSON), `version`, `created_at`, `updated_at` とする。 -- 複合ユニーク制約:`user_id` + `context`。主要クエリ向けに同一組み合わせでインデックスを付与する。 -- 利用想定コンテキスト:`stats`, `apps`, `history`, `gallery`。Laravel 側では列挙型またはバリデーションで制限する。 -- API エンドポイント: - - `GET /api/user-filters/{context}`:存在しない場合は 404 ではなくデフォルト JSON を返却しつつ `created` フラグを false で付与する案を検討。 - - `PUT /api/user-filters/{context}`:`version` 一致を前提に更新。相違がある場合は 409 を返し、レスポンスに最新 `version` と推奨アクションを含める。 -- `filters` カラムには今後追加予定の統計フィルター条件を JSON で保存する。現在は空オブジェクトを許容する。 - -## テスト計画 - -- 手動確認: - - 並び替え後のリロードで順序が維持されること。 - - サイズ変更後のチャート再描画が正しく行われること (`layoutKey` の再生成含む)。 - - 表示切替オフにしたタイルが再度オンにした際、元の位置・サイズで戻ること。 - - デバイス幅ごとのサイズ選択制限が期待通り機能すること。 - - localStorage を削除した場合にデフォルトへ戻ること。 -- 自動テスト:Vitest でストアロジック(`setSize`, `setVisible`, `setOrder`, `hydrateFromStorage`, `resetToDefault`)をユニットテスト化する。 - -## 追加確認事項 - -1. ドラッグ可能トグル初期値:オフで確定。モバイルは常時オフのまま。 -2. アイコン指定:サイズ切替は `pi-expand`、表示切替は表示中 `pi-eye-slash` → 非表示中 `pi-eye` に切り替える。 -3. サイズ選択メニュー表記:文言のみを表示し、数値は併記しない。 -4. 409 リカバリー時はトーストで「表示設定の読み込みに失敗しました」を通知し、再同期を促す。 - -## 詳細設定モーダル案 - -- `stats` ページ右上の「詳細設定」ボタンを活性化し、PrimeVue Dialog でモーダル表示する。 -- モーダル内にチャート一覧(`TileId` とラベル)をチェックボックスリストで表示し、非表示にしたタイルも再表示できるようにする。モーダル内でも SortableJS を利用して並び替えが可能とし、フィールド側・モーダル側のどちらからでも順序調整できるようにする。 -- リストの表示順は現行レイアウト順を参照し、ラベルは既存の i18n キー(例:`stats.chart.expenseRatio.expenseLabel`)を利用する。 -- チェックボックスは `visible` と連動し、変更内容はモーダル下部の「適用する」ボタン押下時にストアへ反映→localStorage 保存→必要に応じて API 同期をトリガーする。 -- 非表示状態の項目はテキストを `text-muted` で表示し、視覚的に区別する。フィールド側の非表示ボタンにはツールチップを追加し、「再表示する場合は「詳細設定」から設定してください」を表示する。 -- 将来的な統計フィルター設定も同モーダルにタブまたはアコーディオンで統合できる構成とする。 -- 「適用する」実行後に API 同期が失敗した場合はトーストで「設定の保存に失敗しました。設定内容を適用することができませんでした」を表示し、ストア状態と localStorage を直前の状態へロールバックする。 - -## 検討課題 - -- 現時点で追加の未決事項はなし。実装段階で新たな論点が出た場合は随時追記する。 - diff --git a/docs/issue-seo-ogp.md b/docs/issue-seo-ogp.md deleted file mode 100644 index 99dd5b1..0000000 --- a/docs/issue-seo-ogp.md +++ /dev/null @@ -1,41 +0,0 @@ -背景 -- ランディングページに OGP/Twitter Card 等のメタタグを追加し、各言語で最適化された内容を出力する。 - -目的 -- 共有時の表示最適化と検索・SNSでのクリック率向上。多言語に対応したタイトル/説明/URL/画像/ロケールを提供。 - -対象 -- pages/index.vue(ランディングページ) - -スコープ(実装) -- Nuxt 3 の useSeoMeta + useHead で OGP/Twitter/canonical/hreflang を出力 -- i18n/locales/{ja,en,zh}.ts に seo.index.title / seo.index.description を追加 -- nuxt.config.ts に runtimeConfig.public.siteUrl を追加(本番: https://pulllog.net) -- app.config.ts に siteName / defaultOgImage / twitterHandle を追加(defaultOgImage: /images/og_default.jpg、twitterHandle: @PullLog) -- types/seo.ts を新規作成(ロケール変換マップ・入力型) -- composables/useSeoOg.ts を新規作成(絶対URL生成、ロケール変換、タグ生成を集約) -- pages/index.vue で useSeoOg({ title, description, imagePath? }) を呼び出し -- og:locale と og:locale:alternate を自動設定(ja_JP / en_US / zh) -- link[rel=alternate][hreflang] を ja|en|zh|x-default で出力 -- Twitter: summary_large_image、twitter:site、twitter:title、twitter:description、twitter:image -- 既定OG画像: public/images/og_default.jpg(1200x630) - -非機能・規約準拠 -- TypeScript(4スペース・セミコロン省略)、any禁止、非nullアサーション禁止、JSDoc付与、fetch使用 - -動作確認 -- pnpm build && pnpm preview で各言語切替時のメタ出力を確認 -- canonical/hreflang/og:*/twitter:* が期待通りであること -- OGPデバッガ(Facebook/Twitter/X/LinkedIn)でプレビューOK(本番URL) - -要確認事項(確定済み) -- 本番ドメイン: https://pulllog.net -- 既定OG画像パス: /images/og_default.jpg(1200x630) -- X(Twitter)ハンドル: @PullLog -- 中国語ロケール: 単一 zh - -受け入れ基準(DoD) -- 各言語でタイトル/説明/URL/画像/ロケールが正しく切替 -- pnpm build が成功し、プレビューでメタが確認可能 -- コーディング規約・禁止事項に準拠(JSDoc あり) -- 手動確認手順をPRに記載 diff --git a/docs/issue-stats-duplicate-tiles.md b/docs/issue-stats-duplicate-tiles.md deleted file mode 100644 index 91238b8..0000000 --- a/docs/issue-stats-duplicate-tiles.md +++ /dev/null @@ -1,22 +0,0 @@ -# /stats ドラッグ後に現れる複製タイルを解消する - -## 現在の状況と課題 -- 最終行末尾へタイルをドロップすると、同じ見た目で中身のないタイルが新しい行に複製される事象が再現している。 -- 複製タイルはリフレッシュ操作や再ドロップで消えるが、ユーザー体験を損ない、並び順の保存にも影響する恐れがある。 -- 既存対応で allbackOnBody / emoveCloneOnHide を有効化済みだが、依然として残留するパターンがあるため根本調査が必要。 - -## コードベースでの参考情報 -- plugins/sortable.client.ts で定義している共通 Sortable オプション。 -- pages/stats.vue の initGridSortable / destroyGridSortable / umpLayoutKey と、ドラッグモード切り替えのライフサイクル処理。 -- ssets/styles/_stats.scss の .stats-drag-ghost などドラッグ時スタイル。 -- components/AdvancedSettingsModal.vue のモーダル側 Sortable 実装(再現条件比較用)。 - -## 解決案(初期案) -- SortableJS の clone 機能を無効化する設定や orceFallback の挙動確認を含め、オプションパラメータ( allbackClass, ghostClass など)の再調整を行う。 -- onEnd 後に -extTick で DOM を再走査し、stats-drag-ghost もしくは空チャートを検出した場合に再初期化 or タイルリスト再適用を実施する。 -- umpLayoutKey() による強制再レンダーが Sortable のクローン管理と競合している可能性があるため、ドラッグ中はキー更新を抑止するなどの対策を検討する。 -- 手元で再現させた際のスクリーンショットや DOM 構造を採取し、原因特定に役立つログを整備する。 - -## 対応内容 -- 2025-09-29: pages/stats.vue のレイアウト変更監視処理で、タイルの並び替えのみが行われた場合は umpLayoutKey() を呼ばず、サイズ/表示変更など構造が変わった場合だけ再マウントするよう修正。これにより SortableJS のクローンが残るケースを抑制。 diff --git a/docs/issue-stats-grid-order.md b/docs/issue-stats-grid-order.md deleted file mode 100644 index 5f56623..0000000 --- a/docs/issue-stats-grid-order.md +++ /dev/null @@ -1,20 +0,0 @@ -# /stats グリッドを「Z」順に整える - -## 現在の状況と課題 -- /stats ページでは PC 幅時に CSS Grid の grid-auto-flow: row dense を利用しており、タイル幅の組み合わせによって表示順が再配置される。 -- ユーザーが期待する「左上から右へ 6 列 → 次の行へ折り返し」という Z 字の順序と実際の並びが一致しないケースがあり、ドロップ結果が把握しづらい。 -- span の合計が 6 を超える場合に次の行へ押し出される仕様が明確になったため、ロジックとスタイルの両面で統一した制御が必要。 - -## コードベースでの参考情報 -- pages/stats.vue 内の getTileSpanClass および layoutStore.setOrder 呼び出し(例: pages/stats.vue:120-210)。 -- ssets/styles/_stats.scss の .charts-grid セクションと PC 向けメディアクエリ設定(特に grid-template-columns と grid-auto-flow)。 -- stores/useStatsLayoutStore.ts の iles 並び順管理と ssignSequentialOrder 実装。 - -## 解決案(初期案) -- CSS では grid-auto-flow: row dense を外し、明示的に並び替えた順がそのまま描画されるよう grid-auto-flow: row へ変更する。 -- span 合計が 6 を超える場合に次行へ送る判定を、フロントでの並び替え処理時に計算し、order を付与する際に行ブレークを考慮する(必要ならタイルごとに grid-column-start を計算)。 -- SortableJS の onEnd で取得した順序に対し、Z 順を保つためのバリデーションを挟み、問題がある場合は補正してストアへ反映する。 -- 実装後は span パターン(例: 2-2-2, 3-3, 4-2, 3-4 など)で UI を手動検証し、期待通りの折り返しを確認する。 - -## 対応内容 -- 2025-09-29: ssets/styles/_stats.scss の PC 向け .charts-grid で grid-auto-flow を ow dense から ow へ変更し、DOM 順のまま Z 字に並ぶよう調整。 diff --git a/docs/issue-stats-layout-control.md b/docs/issue-stats-layout-control.md deleted file mode 100644 index e550a63..0000000 --- a/docs/issue-stats-layout-control.md +++ /dev/null @@ -1,53 +0,0 @@ -背景 -- 統計ページのチャートタイルに対するサイズ変更・並び替え・表示切替の要望があり、既存の `docs/edit-stats-layout.md` で仕様が確定した。 -- 将来的に統計フィルターも同一設定領域に統合する計画があるため、拡張性を考慮した実装が必要。 - -目的 -- pages/stats.vue のチャートレイアウトをユーザーが柔軟に調整できるようにし、設定を端末間で将来的に同期可能な形で保存する。 - -対象 -- フロントエンド: `pages/stats.vue`, `stores/useStatsLayoutStore.ts`, `components/chart/*` -- バックエンド連携(プレースホルダ): Laravel API `user_filters` エンドポイント -- ドキュメント: `docs/edit-stats-layout.md` - -スコープ(実装) -- 各タイルにサイズ選択(最小/小/中/大/最大の 5 段階・span=2〜6)、表示切替、ドラッグモード切替の 3 アイコンを追加。 -- モバイル(md 未満)はサイズ変更不可・表示幅は常に最大(span=6)。タブレット(md 以上 lg 未満)はサイズ選択肢を「小(span=3)」「最大(span=6)」の 2 段階に制限し、lg 以上では span=2〜6 の 5 段階を選択可能にする。 -- SortableJS を用いてフィールド内および詳細設定モーダル内で並び替え可能にする。ドラッグモード有効時はタイルにハンドルクラスを付与。 -- 非表示タイルの再表示は「詳細設定」モーダル(PrimeVue Dialog)から行えるようにし、チェックボックスで可視性を切替。 -- 詳細設定モーダルではチャート一覧を現行レイアウト順で表示し、既存 i18n ラベルを利用。SortableJS での並び替えと「適用する」ボタンによる一括反映を実装。 -- 「適用する」後に同期が失敗した場合はトーストでエラーを表示し、ストア/LocalStorage を直前の状態へロールバック。 -- フィールド側の非表示ボタンにはツールチップで「再表示する場合は『詳細設定』から設定してください」を表示。 - -状態管理・永続化 -- `useStatsLayoutStore` を拡張し、`TileConfig` に `size`, `visible`, `locked` を保持。`DEFAULT_STATS_TILES` を定数化。 -- localStorage キー `pulllog.statsLayout.v1` で `StatsLayoutState` を保存。初期化時に LocalStorage → API(将来)→ デフォルトの順で適用。 -- ストア更新を監視して localStorage を即時更新し、API 実装後は 500ms デバウンスで `PUT /api/user-filters/stats` を送信。 -- API 409/失敗時はトースト通知(「表示設定の読み込みに失敗しました」「設定の保存に失敗しました。設定内容を適用することができませんでした」)を表示し、必要に応じてリセット/ロールバック。 - -バックエンド連携(準備) -- `user_filters` テーブルを `user_id + context` でユニーク化し、`layout`, `filters`, `version` を JSON で保持。 -- 利用予定 context: `stats`, `apps`, `history`, `gallery`。 -- エンドポイント: `GET /api/user-filters/{context}`, `PUT /api/user-filters/{context}`(いずれも Laravel 実装予定)。 - -非機能・規約 -- TypeScript(4 スペース・セミコロン省略)、`any` 禁止、非 null アサーション禁止、JSDoc 必須。 -- API 通信は `fetch` を使用。`console.log` を残さない。 -- tailwind ユーティリティを優先し、独自 CSS は最小限。 - -動作確認 -- PC/タブレット/スマホ幅でサイズ選択 UI の制限と挙動を確認。 -- 並び替え・サイズ変更・表示切替が localStorage に保存され、リロード後も再現されること。 -- 詳細設定モーダルでのチェックボックス・並び替え・適用処理が期待通り動作すること。 -- ドラッグモード有効化時のビジュアル変化とハンドル動作、非表示ボタンのツールチップ表示を確認。 -- API 失敗時のトーストとロールバック(モックまたはユニットテストで再現)。 - -受け入れ基準(DoD) -- `docs/edit-stats-layout.md` に記載の仕様が全て実装されている。 -- localStorage 初期化・デバイス幅別挙動・詳細設定モーダル操作が手動確認済み。 -- 将来の API 連携を想定したストア構成と同期キューが実装されている(API コールは feature flag で切替可能)。 -- pnpm build が成功し、関連差分に lint エラーが無い。 -- PR には手動確認手順とトースト表示のスクリーンショット(PC/モバイル)を添付する。 -## 実装補足 -- 表示コントローラUIは `components/DisplayControllerUI.vue` に共通化し、各チャートカードのタイトル内部に配置する。 -- 詳細設定モーダルは `components/AdvancedSettingsModal.vue` として分離し、タイルの可視性と並び順の編集を担う。 diff --git a/docs/issue-stats-layout-demo.md b/docs/issue-stats-layout-demo.md deleted file mode 100644 index b4b9342..0000000 --- a/docs/issue-stats-layout-demo.md +++ /dev/null @@ -1,27 +0,0 @@ -# デモユーザーのログイン時は /stats のレイアウト設定等をバックエンドDBに保存しない。 - -## 背景 -- デモユーザーはゲスト訪問者に広く開放しているため、レイアウト設定等を user_filters テーブルへ保存して永続化してしまうとユーザー体験に偏りが生じてしまう。 -- デモユーザーの場合でも、レイアウト設定等をクライアント側( localStorage )へ保存するのは有効とする。同じデモユーザー間でも差分が永続化できるため。 - -## 要件 -- 環境変数 `USE_FEATURE_FLAG=true` かつ `NEW_FEATURES=StatsLayoutSync` で featureFlag の StatsLayoutSync が有効の場合であっても、認証ユーザーがデモユーザーの時は、GET|PUT /user-filters/{context} のAPIルートを使用せずに、 localStorage とのみ永続データのやり取りを行う。 -- デモユーザーかどうかの判定は `const isDemoUser = computed(() => userStore.hasUserRole("demo"))` で行う。 - -## 手順 -1. 本 docs/issue-stats-layout-demo.md の課題にて、対応にあたって不明点や確認事項があれば下記「確認事項」セクションに追記してください。確認後、私の方で回答を追記します。 -2. 確認事項がクリアになった時点で、本課題の詳細をまとめて `gh` コマンドを使ってGithubにIssueとして登録してください。 `gh` コマンドが使用できない場合は登録内容を通知してください。私の方で手動登録します。 -3. Github Issue が登録されたら、 AGENTS.md の方針に沿って実装対応を行ってください。対応するブランチは dev ブランチから新たに作成してください。 -4. 実装・テストが完了したら、対応内容を本 docs/issue-stats-layout-demo.md に追記して、通知してください。私の方で動作確認を行います。動作確認結果は本 docs/issue-stats-layout-demo.md に追記します。不具合がある場合は 3. に戻って不具合がなくなるまで繰り返します。 -5. 動作確認が正常完了した時点でコミットとPR作成を依頼します。 `gh` コマンドで対応してください。 `gh` コマンドが使用できない場合はコミットメッセージとPR内容を通知してください。私の方で手動で行います。 -6. PRがマージされ、GithubのIssueがクローズされたら本タスクは終了です。 - -## 確認事項 -- なし - -## 対応内容 -- 2025-10-02: Issue #17 を起票。stores/useStatsLayoutStore.ts で demo ロールを判定する computed を追加し、canSyncRemote から /user-filters API 呼び出しを除外して localStorage 永続のみとなるよう更新。 - -## 動作確認 -- 2025-10-02: `pnpm exec biome check stores/useStatsLayoutStore.ts`(エラーなし)。 -- ブラウザ経由でのデモユーザー操作は未検証(バックエンド API 接続環境がないため)。 diff --git a/docs/issue-stats-toast.md b/docs/issue-stats-toast.md deleted file mode 100644 index 5f6c383..0000000 --- a/docs/issue-stats-toast.md +++ /dev/null @@ -1,42 +0,0 @@ -# /stats バージョン競合時にトーストが表示されない - -## 現在の状況と課題 -- user_filters.version をサーバー側で意図的に変更すると、フロントの PUT リクエストが 409 を受けるが、想定していた stats.layout.toast.conflict のトーストが表示されない。 -- 同様に GET が 403 を返したケースでも orbidden トーストが発火しないとの報告がある。 -- 現状のハンドリングでは stores/useStatsLayoutStore.ts の pushRemoteState / syncFromServer で ApiError を捕捉しているが、useAPI().callApi の内部処理との整合性が不透明で、トーストがスキップされている可能性がある。 - -## コードベースでの参考情報 -- stores/useStatsLayoutStore.ts 内の pushRemoteState, esolveConflict, showConflictWarning, showForbiddenError。 -- composables/useAPI.ts の handleErrorResponse と callApi エラーロジック(ApiError の生成箇所)。 -- i18n/locales/{ja,en,zh}.ts の stats.layout.toast 文言定義。 -- docs/issue-bug.md に記録されている再現手順とサーバー側レスポンス構造。 - -## 解決案(初期案) -- callApi 内で 409 を捕捉した際に ApiError が error.data を保持しているか確認し、parseConflictResponse が期待する latestVersion/payload キーと整合するようガードを追加する。 -- pushRemoteState の catch ブロックで error instanceof ApiError を判定した後、error.status === 409 の時点で esolveConflict を必ず呼び出し、トースト表示が保証されるようフローを整理する。 -- 必要であれば useAPI に 409 専用のイベントハンドラを追加し、呼び出し元へ詳細なエラー情報を返す。 -- エラー発生時に一時的なログ出力(開発時限定)を追加し、挙動確認を容易にする。 - -## 対応内容 -- 2025-09-29: stores/useStatsLayoutStore.ts の 409 応答処理を調整。parseConflictResponse で JSON 文字列/latest_version 形式にも対応し、競合情報が取得できない場合でもトーストを表示するように esolveConflict のフォールバックを追加。 -- 2025-09-30: stores/useStatsLayoutStore.ts に group: "notices" を追加してグローバル Toast と連携しつつ、トーストヘルパー全体で共通グループ定数を使用するよう更新。 - -## 現在の状況と課題(2025-09-30) -- 409エラー時のトースト表示はまだ動作していない。 - - 409エラー時のコンソールエラーのスタック: - ` - PUT https://localhost:4649/api/user-filters/stats 409 (Conflict) - - fetchWithTimeout @ useAPI.ts:59 - callApi @ useAPI.ts:180 - pushRemoteState @ useStatsLayoutStore.ts:209 - (anonymous) @ useStatsLayoutStore.ts:260 - setTimeout - scheduleSync @ useStatsLayoutStore.ts:259 - watch.deep @ useStatsLayoutStore.ts:455 - Promise.then - setOrder @ useStatsLayoutStore.ts:350 - onEnd @ stats.vue:145 - ` - そもそも useAPI.ts:59 で処理が中断している? - - toast.add() の引数オプションに group: "notices" がないためグローバルに設置しているトーストコンポーネントがオプションを拾えない。(これがトーストが表示されない直接的な原因だろう) From 13714bdc7558d227a638d019f137814cd3a3536c Mon Sep 17 00:00:00 2001 From: PullLog Dev Date: Fri, 3 Oct 2025 23:39:08 +0900 Subject: [PATCH 4/6] update: add ignore list from HMR --- nuxt.config.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/nuxt.config.ts b/nuxt.config.ts index 807077f..11972ff 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -252,6 +252,25 @@ export default defineNuxtConfig({ }, server: { https: httpsOptions, + watch: { + ignored: [ + "**/.git/**", + "**/.github/**", + "**/.husky/**", + "**/.wrangler/**", + "**/.codex/**", + "**/AGENTS.md", + "**/logs/**", + "**/tmp/**", + "**/*.log", + "**/.DS_Store", + "**/dist/**", + "**/.nuxt/**", + "**/.output/**", + "**/.vscode/**", + "**/coverage/**", + ], + }, }, }, primevue: { From 0c9c98f9224763106c64c103fc14538c7ea4eae3 Mon Sep 17 00:00:00 2001 From: PullLog Dev Date: Fri, 3 Oct 2025 23:51:31 +0900 Subject: [PATCH 5/6] modify: coding rules --- AGENTS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AGENTS.md b/AGENTS.md index b126c3a..627b399 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,10 +26,11 @@ - セミコロンは基本的に省略。構文上必要な場合のみ付与。 - コンポーネント: `PascalCase.vue`。ルート: `pages/` 内は kebab-case。composables: `useXxx.ts`。ストア: `useXxxStore`。 - スタイルは TailwindCSS ユーティリティを優先。独自 CSS は極力避ける。 +- バイナリ以外のリソースファイルは原則文字コード `UTF-8` で `BOM` 無し、改行コードは `LF` とする。原則から外れる場合は通知すること。 - 整形・Lint: Biome を使用。例: `npx @biomejs/biome check --write .` ## 禁止事項 -- `any` 型の使用は禁止。どうしても必要な場合は `unknown` + 型ガードで扱う。 +- `any` 型の使用は原則禁止。どうしても必要な場合は `unknown` + 型ガードで扱う。 - `console.log` を残さない。デバッグは Logger または開発専用ユーティリティを使用する。 - 非null アサーション(`!`)は禁止。代わりに型ガードやオプショナルチェーンを利用する。 - メソッドには原則 TypeDoc 準拠の JSDoc コメントを付与すること。 From 4f5d524061e9b3a27cd93ed2e16498bfd97f1842 Mon Sep 17 00:00:00 2001 From: PullLog Dev Date: Thu, 20 Nov 2025 21:08:05 +0900 Subject: [PATCH 6/6] docs: update author name and bump version to 1.2.2 --- .gitignore | 1 + config/settings.json | 2 +- package.json | 2 +- public/docs/privacy_policy_en.md | 2 +- public/docs/privacy_policy_ja.md | 2 +- public/docs/privacy_policy_zh.md | 2 +- public/docs/terms_en.md | 4 ++-- public/docs/terms_ja.md | 4 ++-- public/docs/terms_zh.md | 4 ++-- 9 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index f03141a..45a9644 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ desktop.ini public/sample/ public/.well-known/ docs/ +api-schema.yaml diff --git a/config/settings.json b/config/settings.json index 70ebb7d..0ec7489 100644 --- a/config/settings.json +++ b/config/settings.json @@ -1,5 +1,5 @@ { "appName": "PullLog", - "appVersion": "0.1.0", + "appVersion": "1.2.2", "copyright": "© 2025 MAGIC METHODS" } diff --git a/package.json b/package.json index 333e64c..9d39416 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pulllog", - "version": "1.2.1", + "version": "1.2.2", "description": "Manage Your Gacha History and Analyze Statistics.", "author": "MAGIC METHODS", "license": "UNLICENSED", diff --git a/public/docs/privacy_policy_en.md b/public/docs/privacy_policy_en.md index 662f73e..6b40a7b 100644 --- a/public/docs/privacy_policy_en.md +++ b/public/docs/privacy_policy_en.md @@ -78,7 +78,7 @@ Currently, personal information is not provided to third parties by outsourcing. For questions or requests regarding this Policy or the handling of personal information, please contact: -> PullLog Operator (Personal Information Protection Manager: Katsuhiko Maeno) +> PullLog Operator (Personal Information Protection Manager: Ka2) > Email: support@pulllog.net --- diff --git a/public/docs/privacy_policy_ja.md b/public/docs/privacy_policy_ja.md index 6d7e1fc..0e253dc 100644 --- a/public/docs/privacy_policy_ja.md +++ b/public/docs/privacy_policy_ja.md @@ -79,7 +79,7 @@ 本ポリシーまたは個人情報の取扱いに関するご質問・ご要望等は、下記までご連絡ください。 -> PullLog運営(管理責任者:前野勝彦) +> PullLog運営(管理責任者:Ka2) > メールアドレス:[support@pulllog.net] --- diff --git a/public/docs/privacy_policy_zh.md b/public/docs/privacy_policy_zh.md index 303e69e..6185ffc 100644 --- a/public/docs/privacy_policy_zh.md +++ b/public/docs/privacy_policy_zh.md @@ -78,7 +78,7 @@ 如对本政策或个人信息的处理有疑问或需求,请通过以下方式联系: -> PullLog运营(个人信息管理负责人:前野胜彦) +> PullLog运营(个人信息管理负责人:Ka2) > 邮箱:support@pulllog.net --- diff --git a/public/docs/terms_en.md b/public/docs/terms_en.md index c05f980..9ad2b3b 100644 --- a/public/docs/terms_en.md +++ b/public/docs/terms_en.md @@ -1,8 +1,8 @@
Last Updated: August 7, 2025
-These Terms of Use (“Terms”) set forth the rights and obligations between users (“Users”) and the operator “MAGIC METHODS” (“Operator”) with respect to the provision and use of PullLog (“Service”). Please read these Terms carefully before using the Service. By using the Service, you agree to these Terms. +These Terms of Use (“Terms”) set forth the rights and obligations between users (“Users”) and the operator “Ka2” (“Operator”) with respect to the provision and use of PullLog (“Service”). Please read these Terms carefully before using the Service. By using the Service, you agree to these Terms. -- Operator: MAGIC METHODS (sole proprietorship) +- Operator: Ka2 - Location: Tokyo, Japan - Contact email: support@pulllog.net diff --git a/public/docs/terms_ja.md b/public/docs/terms_ja.md index be0994a..09fe012 100644 --- a/public/docs/terms_ja.md +++ b/public/docs/terms_ja.md @@ -1,8 +1,8 @@
最終更新日: 2025年8月7日
-本利用規約(以下、「本規約」といいます。)は、PullLog(以下、「当サービス」といいます。)の提供条件および利用者(以下、「ユーザー」といいます。)と当サービスの運営者「MAGIC METHODS」(以下、「当運営者」といいます。)との間の権利義務関係を定めるものです。ご利用前に必ず全文をお読みいただき、同意の上でご利用ください。 +本利用規約(以下、「本規約」といいます。)は、PullLog(以下、「当サービス」といいます。)の提供条件および利用者(以下、「ユーザー」といいます。)と当サービスの運営者「Ka2」(以下、「当運営者」といいます。)との間の権利義務関係を定めるものです。ご利用前に必ず全文をお読みいただき、同意の上でご利用ください。 -- 運営者:MAGIC METHODS(個人事業主) +- 運営者:Ka2 - 所在地:東京都 - 連絡先メールアドレス:support@pulllog.net diff --git a/public/docs/terms_zh.md b/public/docs/terms_zh.md index 19663c5..382f85c 100644 --- a/public/docs/terms_zh.md +++ b/public/docs/terms_zh.md @@ -1,8 +1,8 @@
最后更新日期:2025年8月7日
-本使用条款(以下简称“本条款”)规定了PullLog(以下简称“本服务”)的提供条件,以及用户(以下简称“用户”)与运营者“MAGIC METHODS”(以下简称“运营方”)之间的权利义务。在使用本服务前,请务必完整阅读并同意本条款。 +本使用条款(以下简称“本条款”)规定了 PullLog(以下简称“本服务”)的提供条件,以及用户(以下简称“用户”)与运营者“Ka2”(以下简称“运营方”)之间的权利义务。在使用本服务前,请务必完整阅读并同意本条款。 -- 运营方:MAGIC METHODS(个人业主) +- 运营方:Ka2 - 所在地:日本东京都 - 联系邮箱:support@pulllog.net