diff --git a/.claude/skills/issue-resolver/SKILL.md b/.claude/skills/issue-resolver/SKILL.md index f07da87ae..3be905928 100644 --- a/.claude/skills/issue-resolver/SKILL.md +++ b/.claude/skills/issue-resolver/SKILL.md @@ -8,33 +8,55 @@ description: 不具合報告(フォーラム/Issue)に基づく調査・再 不具合報告を起点に、調査から修正・記録までを行うワークフロー。 実装時のコーディング規約は `project-worker` スキルに従う。 +## 実行ルール + +1. このスキルはローカル開発環境専用として扱う。 +2. 調査と修正は効率優先・トークン節約優先で進める。 +3. 修正方針を先に判定し、軽微な修正は ExecPlan 作成を省略して実装へ進んでよい(ただし調査報告への承認後に限る)。 +4. 問題が分かりにくい場合や修正が複雑な場合は `exec-plan` を作成してから進める。 +5. 検証に必要な範囲でローカルDBの更新・削除・初期化を許容する。 +6. 本番接続情報や本番データを扱う前提は置かない。 +7. フォーラムURLの本文取得は最初から制限外実行で行い、`curl` / `wget` を順に試す。 +8. URL取得コマンド実行時は都度 `require_escalated` を使い、承認付きで実行する。 +9. `Could not resolve host` などDNS解決失敗時は、サンドボックス内制限として扱い、制限外実行へ切り替える。 +10. URL取得に失敗した状態でローカルコードだけから原因を推測しない。取得不能時は必ずエンジニアへ対応(本文提供・制限外実行)を依頼する。 +11. 原因が判明した時点で必ず先に調査報告を提出し、エンジニア承認前に修正へ進まない。 +12. `evo` コマンドとDB参照はホスト側で直接実行しない。必ず Docker コンテナ内で実行する。 +13. エラー隠蔽を目的とした修正を禁止する。警告/例外を消すための握りつぶしや無条件の値変換を行わず、原因となる不正データの発生源を修正する。 +14. 例: `strpos()` に `null` が渡って落ちる場合、`null` を空文字へ変換して通すのではなく、`null` が渡る経路を特定して上流で是正する。 + ## コマンド ### analyze-issue -1. URLならfetchで内容取得 +1. URLなら最初から制限外実行で本文取得し、HTMLタグを除去したテキストのみを扱う: `curl -fsSL -A "Mozilla/5.0" "" | php -r '$h=stream_get_contents(STDIN); $t=strip_tags($h); $t=preg_replace("/\s+/u"," ",$t); echo trim($t), PHP_EOL;'` を承認付きで実行 → 失敗時 `wget -qO- "" | php -r '$h=stream_get_contents(STDIN); $t=strip_tags($h); $t=preg_replace("/\s+/u"," ",$t); echo trim($t), PHP_EOL;'` を同様に承認付きで実行 2. `AGENTS.md` のドキュメントマップから関連ファイルを特定 -3. `evo config:show` で関連設定値、`evo db:describe` で関連テーブル構造を確認 +3. `docker compose exec php evo config:show` で関連設定値、`docker compose exec php evo db:describe` で関連テーブル構造を確認 4. 現象の要約と原因仮説を3つ提示 -5. 情報不足時はユーザーへの質問リストを作成 +5. 原因が判明した場合は、修正前に「原因・影響範囲・修正方針案」を短く報告 +6. URL本文を取得できない場合は、失敗理由を1行で記録し、環境制限またはアクセス制限の種別を明記する +7. 制限外実行でも取得できない場合は、本文貼り付けを依頼 +8. URL本文が得られるまでは原因推測や修正方針の断定を行わず、エンジニアの対応を待つ +9. 情報不足時はユーザーへの質問リストを作成 ### reproduce - 現象を再現する最小限のPHPコードを作成 -- `evo db:query` でデータ状態を確認し再現条件を特定 +- `docker compose exec php evo db:query` でデータ状態を確認し再現条件を特定 - デバッグ用ログ (`evo()->logEvent(...)`) の挿入箇所を提案 -- `evo cache:clear` でキャッシュクリアしてから再現確認 +- `docker compose exec php evo cache:clear` でキャッシュクリアしてから再現確認 ### create-branch - Issue番号・内容からブランチ名を提案(例: `fix/10705-tv-saving-error`) - mainから分岐して作成 -### draft-plan -- `exec-plan` スキルの `/create-plan` に委譲する +### draft-plan (必要時) +- 問題が分かりにくい場合や修正が複雑な場合のみ `exec-plan` スキルの `/create-plan` に委譲する - analyze-issue の調査結果をタスク概要として渡す ### implement-fix +- 調査報告に対するエンジニア承認を確認してから修正を開始 - draft-planに基づきコードを修正 - `project-worker` スキルの規約を厳守 -- 修正後 `evo cache:clear` でキャッシュクリア +- 修正後 `docker compose exec php evo cache:clear` でキャッシュクリア ### archive - Conventional Commits形式のコミットメッセージ生成(例: `fix(manager): resolve tv saving error on php8.2 (Ref forum#10705)`) diff --git a/.codex/skills/exec-plan/SKILL.md b/.codex/skills/exec-plan/SKILL.md new file mode 100644 index 000000000..ea3395420 --- /dev/null +++ b/.codex/skills/exec-plan/SKILL.md @@ -0,0 +1,45 @@ +--- +name: exec-plan +description: ExecPlan(実行計画)の作成・検証・更新を支援するスキル。複雑なタスク(新機能開発、リファクタリング、バグ修正)の設計フェーズで使用します。`/create-plan`でプラン作成を開始。 +--- + +# Exec Plan + +`.agent/PLANS.md` の仕様に準拠した ExecPlan を作成・管理するワークフロー。 +コーディング規約・ドキュメントマップは `AGENTS.md` を参照。 + +## コマンド + +### /create-plan <タスク概要> +1. `AGENTS.md` のドキュメントマップから関連ドキュメント・コードを探索 +2. プラン案の骨子を提示(重点: Purpose / Context / Plan of Work / Concrete Steps / Validation) + 複雑タスクはマイルストーン分割(目標→作業→成果→検証の物語構造、PoCを先行) +3. エンジニアと設計方針を確認し、非交渉要件(自己完結・初心者実行可能・動作する成果物・用語定義)を検討 +4. `.agent/PLANS.md` テンプレートに従い `.agent/plans/YYYY-MM-DD-task-name.md` を作成 + 全12セクション記載、Progress以外は散文、CMS用語を定義、Validationは観察可能な動作で定義 + 空セクションは見出しのみ残す(プレースホルダ説明は書かない) +5. `/validate-plan` を自動実行 + +探索の重点: `assets/docs/architecture.md`(処理フロー)、`assets/docs/events-and-plugins.md`(フック)、`assets/docs/core-issues.md`(既知の課題)、対象ファイルの既存パターン + +移行タスクでは追加で: 旧API使用箇所のGrep棚卸し、旧→新の置換パターン表、モジュール単位の分割 + +### 補助ツール(CLI導入済みの場合) +`php evo config:show [key]` / `db:tables [--pattern]` / `db:describe ` / `db:count
[--where]` + +### /validate-plan [path] +`references/quality-checklist.md` に基づき品質チェック: 必須12セクション、非交渉要件・アンチパターンを検出し改善提案 + +### /update-plan [path] +各マイルストーン完了時・中断時にこまめに呼び出す: +1. Progress をタイムスタンプ付きで更新(完了チェック、新規項目追加) +2. Surprises & Discoveries に追記(観察+根拠) +3. Decision Log に日付・著者・根拠・代替案を記録 +4. 完了マイルストーンの Progress 詳細を1行の要約に圧縮(トークン節約) +5. コア側の課題(UI結合・設計上の制約・技術的負債等)を発見した場合は `assets/docs/core-issues.md` に追記(発見日・発見元・ファイル・課題・改善案・関連ロードマップ) + +## 意思決定の閾値 + +**自律判断可能**: コードベース探索、関連ドキュメント読み込み、プランのフォーマット整形 + +**要相談**: 設計方針の選定、影響範囲の判断、実装の優先順位、代替案のトレードオフ diff --git a/.codex/skills/exec-plan/agents/openai.yaml b/.codex/skills/exec-plan/agents/openai.yaml new file mode 100644 index 000000000..62fd6288b --- /dev/null +++ b/.codex/skills/exec-plan/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "実行計画" + short_description: "複雑な作業向けのExecPlanを設計・検証・更新する" + default_prompt: "`.agent/PLANS.md` に従って `.agent/plans` の ExecPlan を新規作成または更新し、具体的な実装手順と観察可能な検証条件を含めて、品質チェックを実施してください。" diff --git a/.codex/skills/exec-plan/references/quality-checklist.md b/.codex/skills/exec-plan/references/quality-checklist.md new file mode 100644 index 000000000..6b5fdc37e --- /dev/null +++ b/.codex/skills/exec-plan/references/quality-checklist.md @@ -0,0 +1,35 @@ +# ExecPlan 品質チェックリスト + +`.agent/PLANS.md` の非交渉要件に基づく検証項目。 + +## 必須セクション + +- [ ] Purpose / Big Picture: ユーザーにとっての価値が1-2文で明記されている +- [ ] Progress: タイムスタンプ付きチェックリストがある +- [ ] Surprises & Discoveries: セクションが存在する(実装前は「なし」と記載) +- [ ] Decision Log: 設計判断が日付付きで記録されている +- [ ] Outcomes & Retrospective: セクションが存在する(実装前は「実装後に記載」と記載) +- [ ] Context and Orientation: 対象コードの場所がリポジトリルート相対パスで記載されている +- [ ] Plan of Work: 実装方針と選定理由が散文で記述されている +- [ ] Concrete Steps: 具体的なコード例またはコマンドが含まれている +- [ ] Validation and Acceptance: 観察可能な動作(ブラウザ確認、コマンド実行等)で定義されている +- [ ] Idempotence and Recovery: 中断時の復帰手順が記載されている +- [ ] Artifacts and Notes: 関連ファイル・URLが記載されている +- [ ] Interfaces and Dependencies: 外部依存・他モジュールとのインターフェースが明記されている + +## 非交渉要件・アンチパターン + +- [ ] **自己完結**: 必要な情報がすべてプラン内にあり、外部ブログ・ドキュメントに依存していない +- [ ] **初心者実行可能**: CMS固有用語や技術用語が初出箇所で平易に定義されている +- [ ] **動作する成果物**: 検証手順に具体的なコマンドと期待出力があり、形式的な成果物を排除 +- [ ] **冪等性**: Concrete Steps を再実行しても問題が生じない設計になっている +- [ ] **判断の完結**: 重要な設計決定がプラン内で解決済みであり、実装者に委ねていない + +## フォーマット・簡潔性 + +- [ ] ファイル名が `YYYY-MM-DD-task-name.md` 形式 +- [ ] 保存先が `.agent/plans/` +- [ ] Progress 以外ではチェックボックスを多用せず散文で記述 +- [ ] ネストしたコードブロックはインデントで表現 +- [ ] 空セクションは見出しのみ(プレースホルダ説明なし) +- [ ] 完了マイルストーンの Progress が1行要約に圧縮されている diff --git a/.codex/skills/issue-resolver/SKILL.md b/.codex/skills/issue-resolver/SKILL.md new file mode 100644 index 000000000..afeb679e4 --- /dev/null +++ b/.codex/skills/issue-resolver/SKILL.md @@ -0,0 +1,87 @@ +--- +name: issue-resolver +description: 不具合報告(GitHub Issue、フォーラム投稿、社内報告)を起点に、調査・再現・修正・検証・記録までを一貫実行するスキル。症状の切り分け、原因仮説の整理、最小再現、修正実装、ExecPlan作成、PR下書き、ナレッジ追記が必要なときに使う。 +--- + +# Issue Resolver + +不具合対応を「再現可能な事実」ベースで前進させる。 +実装規約はプロジェクトの `AGENTS.md` を最優先とし、必要に応じて `project-worker` の規約へ委譲する。 + +## 実行ルール + +1. 先に現象と期待値を定義してから実装する。 +2. 推測で修正せず、再現手順か観測ログを必ず作る。 +3. 変更は最小単位に分割し、影響範囲を明示する。 +4. 修正方針を先に判定し、軽微な修正は ExecPlan 作成を省略して `implement-fix` へ進んでよい(ただし調査報告への承認後に限る)。 +5. 問題が分かりにくい場合、影響範囲が読みにくい場合、または実装が複雑な場合は `.agent/PLANS.md` に従って ExecPlan を作成する。 +6. 不具合調査では手動確認より先に `docker compose exec php evo` で設定・DB状態・キャッシュ状態を確認する。 +7. このスキルはローカル開発環境専用とし、本番環境を前提にした慎重運用は行わない。 +8. 調査と修正は効率優先・トークン節約優先で進め、過剰な説明や確認を省く。 +9. 検証に必要な範囲でローカルDBの更新・削除・初期化を許容し、必要なら即時にリセットする。 +10. フォーラムURLの本文取得は最初から制限外実行で行い、`curl` / `wget` を順に試す。 +11. URL取得コマンド実行時は都度 `require_escalated` を使い、承認付きで実行する。 +12. `Could not resolve host` や `Temporary failure in name resolution` はサンドボックス内制限として扱い、制限外実行へ切り替える。 +13. URL取得に失敗した状態でローカルコードだけから原因を推測しない。取得不能時は必ずエンジニアへ対応(本文提供・制限外実行)を依頼する。 +14. 原因が判明した時点で必ず先に調査報告を提出し、エンジニア承認前に修正へ進まない。 +15. `evo` コマンドとDB参照はホスト側で直接実行しない。必ず Docker コンテナ内で実行する。 +16. エラー隠蔽を目的とした修正を禁止する。警告/例外を消すための握りつぶしや無条件の値変換を行わず、原因となる不正データの発生源を修正する。 +17. 例: `strpos()` に `null` が渡って落ちる場合、`null` を空文字へ変換して通すのではなく、`null` が渡る経路を特定して上流で是正する。 + +## evo CLI(実用最小) + +- `docker compose exec php evo config:show ` +- `docker compose exec php evo db:describe
` +- `docker compose exec php evo db:count
--where=...` +- `docker compose exec php evo db:query "SELECT ..."` +- `docker compose exec php evo cache:clear` + +詳細リファレンスは `manager/includes/cli/README.md` を参照する。 +本番接続情報や本番データを扱う前提は置かない。 + +## Workflow + +### analyze-issue +1. 入力が URL の場合は最初から制限外実行で本文取得し、HTMLタグを除去したテキストのみを扱う。`curl -fsSL -A "Mozilla/5.0" "" | php -r '$h=stream_get_contents(STDIN); $t=strip_tags($h); $t=preg_replace("/\s+/u"," ",$t); echo trim($t), PHP_EOL;'` を承認付きで実行し、失敗時は `wget -qO- "" | php -r '$h=stream_get_contents(STDIN); $t=strip_tags($h); $t=preg_replace("/\s+/u"," ",$t); echo trim($t), PHP_EOL;'` を同様に承認付きで実行する。取得テキストから事実情報(環境、手順、実際結果、期待結果)を抽出する。 +2. `AGENTS.md` のドキュメントマップを参照し、関連コンポーネントと確認ドキュメントを特定する。 +3. `docker compose exec php evo config:show ` で関連設定値を確認する。 +4. `docker compose exec php evo db:describe
` で対象テーブル構造を確認する。 +5. 必要時のみ `docker compose exec php evo db:count
--where=...` で件数を確認する。 +6. 現象の要約、再現条件、原因仮説(最大3件)を作る。 +7. 原因が判明した場合は、修正前に「原因・影響範囲・修正方針案」を短く報告する。 +8. URL本文を取得できない場合は、失敗理由を1行で記録し、環境制限またはアクセス制限の種別を明記する。 +9. 制限外実行でも取得できない場合は、投稿本文の貼り付けを依頼する。 +10. URL本文が得られるまでは原因推測や修正方針の断定を行わず、エンジニアの対応を待つ。 +11. 情報不足がある場合は、追加確認項目を短く列挙する。 + + +### reproduce +1. 失敗条件を固定し、最小再現コードまたは最小再現手順を作る。 +2. `docker compose exec php evo db:query "SELECT ..."` で再現に必要なレコード状態を確認する。 +3. 再現前後で `docker compose exec php evo cache:clear` を実行し、キャッシュ要因を切り分ける。 +4. 再現できない場合は「再現不能」のまま進めず、前提差分を明示する。 + +### create-branch +1. Issue 番号と症状からブランチ名を提案する(例: `fix/10705-tv-saving-error`)。 +2. ベースブランチを確認してから分岐する。 + +### draft-plan (必要時) +1. 問題が分かりにくい場合、影響範囲が読みにくい場合、または実装が複雑な場合にのみ ExecPlan を作成する。 +2. `analyze-issue` の結果を、目的・制約・検証方法つきで計画へ反映する。 + +### implement-fix +1. 調査報告に対するエンジニア承認を確認してから実装を開始する。 +2. `draft-plan` に沿って最小差分で実装する。 +3. 既存パターンを優先し、ヘルパー利用・DB安全性・イベント/キャッシュ影響を確認する。 +4. 必要なテストまたは手動確認を実施し、結果を記録する。 +5. 必要に応じて `docker compose exec php evo health:check` を実行し、基本健全性を確認する。 +6. CLI 実行結果は検証ログへ要約して残す。 + +### archive +1. 修正内容を再現条件とセットで要約する。 +2. Conventional Commits 形式のコミットメッセージ案を作る。 +3. 再発防止の観点で、必要なら `assets/docs/troubleshooting/solved-issues.md` を更新する。 + +### pull-request +1. PR タイトルと本文を `What / Why / How / Test` の順で下書きする。 +2. 破壊的変更、互換性影響、運用手順の有無を明記する。 diff --git a/.codex/skills/issue-resolver/agents/openai.yaml b/.codex/skills/issue-resolver/agents/openai.yaml new file mode 100644 index 000000000..b4d9bb3a6 --- /dev/null +++ b/.codex/skills/issue-resolver/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "不具合解決" + short_description: "不具合報告から修正完了までを一貫して進める" + default_prompt: "この不具合報告を分析し、再現手順を整理して原因仮説を最大3件示してください。原因判明後は先に調査報告(原因・影響範囲・修正方針案)を提示し、承認後にのみ修正へ進んでください。URL調査が必要な場合は最初から制限外実行で取得し、evo/DB確認はDockerコンテナ内で実行し、軽微な修正はExecPlan作成を省略して進め、問題が分かりにくい場合や修正が複雑な場合は先にexec-planを作成してください。いずれの場合も修正着手は調査報告への承認後に限定してください。エラー隠蔽を目的とした修正(例: `strpos()` へ渡る `null` を空文字へ変換して通すだけの対処)は行わず、原因データの発生源を修正してください。" diff --git a/manager/processors/login.processor.functions.php b/manager/processors/login.processor.functions.php index e4bc71cb2..22d6483c0 100644 --- a/manager/processors/login.processor.functions.php +++ b/manager/processors/login.processor.functions.php @@ -26,6 +26,24 @@ function jsAlert($msg) } } +function validateLoginInput() +{ + $username = postv('username', getv('username')); + $password = postv('password'); + + if (!$username || trim((string)$username) === '') { + jsAlert('ユーザー名とパスワードを入力してください'); + return false; + } + + if (!$password) { + jsAlert('ユーザー名とパスワードを入力してください'); + return false; + } + + return true; +} + function failedLogin() { //increment the failed login counter diff --git a/manager/processors/login.processor.php b/manager/processors/login.processor.php index f44ce4d6d..70f636b47 100644 --- a/manager/processors/login.processor.php +++ b/manager/processors/login.processor.php @@ -17,6 +17,10 @@ checkSafedUri(); +if (!validateLoginInput()) { + return; +} + $_SESSION['safeMode'] = input('safeMode'); if (!sessionv('SystemAlertMsgQueque')) { $_SESSION['SystemAlertMsgQueque'] = [];