From 478a3da4225c18bd0561dbb747e4e1591215fbdd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:10:27 +0000 Subject: [PATCH 1/6] Initial plan From 7ed8bbea2288f3af02ccf8ffd45cac778239a458 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:13:01 +0000 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=E4=BD=9C=E6=A5=AD=E8=A8=88?= =?UTF-8?q?=E7=94=BB=E3=81=AE=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docs CI導入に向けた進め方を共有するため。 事前確認を踏まえた最小変更の計画を明確化した。 Co-authored-by: LevelCapTech <99854263+LevelCapTech@users.noreply.github.com> --- package-lock.json | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index b20b5324..303148f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21826,24 +21826,6 @@ } } }, - "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", From e2150796088b68e00c34c732d5f82358533aa921 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:16:49 +0000 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20Docs=E5=90=91=E3=81=91CI=E3=81=AE?= =?UTF-8?q?=E5=B0=8E=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MarkdownlintとMermaid図検証をReviewdogで通知するため。 package-lock.jsonの誤差分を戻し、設定とワークフローを追加した。 Co-authored-by: LevelCapTech <99854263+LevelCapTech@users.noreply.github.com> --- .github/workflows/markdownlint.yml | 40 ++++++++++++ .github/workflows/mermaid-lint.yml | 97 ++++++++++++++++++++++++++++++ .markdownlint.json | 4 ++ package-lock.json | 18 ++++++ 4 files changed, 159 insertions(+) create mode 100644 .github/workflows/markdownlint.yml create mode 100644 .github/workflows/mermaid-lint.yml create mode 100644 .markdownlint.json diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml new file mode 100644 index 00000000..4109cc54 --- /dev/null +++ b/.github/workflows/markdownlint.yml @@ -0,0 +1,40 @@ +name: markdownlint + +on: + pull_request: + paths: + - "docs/**/*.md" + - ".github/**/*.md" + push: + paths: + - "docs/**/*.md" + - ".github/**/*.md" + +jobs: + markdownlint: + runs-on: ubuntu-latest + + permissions: + contents: read + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install tools + run: | + npm install -g markdownlint-cli + npm install -g reviewdog + + - name: Markdown lint + run: | + markdownlint "docs/**/*.md" ".github/**/*.md" \ + | reviewdog \ + -f=markdownlint \ + -name="Markdownチェック" \ + -reporter=github-pr-review \ + -level=warning diff --git a/.github/workflows/mermaid-lint.yml b/.github/workflows/mermaid-lint.yml new file mode 100644 index 00000000..998e7cf3 --- /dev/null +++ b/.github/workflows/mermaid-lint.yml @@ -0,0 +1,97 @@ +name: mermaid-lint + +on: + pull_request: + paths: + - "docs/**/*.md" + - ".github/**/*.md" + +jobs: + mermaid: + runs-on: ubuntu-latest + + permissions: + contents: read + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install tools + run: | + npm install -g @mermaid-js/mermaid-cli + npm install -g reviewdog + + - name: Extract Mermaid blocks + run: | + mkdir -p tmp + node <<'EOF' + const fs = require('fs') + const path = require('path') + + let i = 0 + const mapPath = path.join('tmp', 'map.txt') + fs.writeFileSync(mapPath, '') + + function walk(dir) { + if (!fs.existsSync(dir)) return + fs.readdirSync(dir).forEach((file) => { + const full = path.join(dir, file) + if (fs.statSync(full).isDirectory()) walk(full) + else if (full.endsWith('.md')) processFile(full) + }) + } + + function processFile(file) { + const lines = fs.readFileSync(file, 'utf8').split('\n') + let inside = false + let buffer = [] + let startLine = 0 + + lines.forEach((line, idx) => { + if (line.startsWith('```mermaid')) { + inside = true + buffer = [] + startLine = idx + 1 + return + } + + if (inside && line.startsWith('```')) { + inside = false + const name = `tmp/diagram-${++i}.mmd` + fs.writeFileSync(name, buffer.join('\n')) + fs.appendFileSync(mapPath, `${name}:${file}:${startLine}\n`) + return + } + + if (inside) buffer.push(line) + }) + } + + walk('docs') + walk('.github') + EOF + + - name: Validate Mermaid diagrams + run: | + : > result.txt + + if [ -s tmp/map.txt ]; then + while IFS=":" read -r mmd src line; do + if ! mmdc -i "$mmd" -o "$mmd.svg"; then + echo "$src:$line: Mermaid図の構文エラー" >> result.txt + fi + done < tmp/map.txt + fi + + - name: Report via reviewdog + run: | + cat result.txt | reviewdog \ + -efm="%f:%l: %m" \ + -name="Mermaid図チェック" \ + -reporter=github-pr-review \ + -level=error diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 00000000..26593a22 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,4 @@ +{ + "MD013": false, + "MD033": false +} diff --git a/package-lock.json b/package-lock.json index 303148f1..b20b5324 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21826,6 +21826,24 @@ } } }, + "node_modules/tailwindcss/node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", From d7570626e955f210fdc3319d6421389d8e0a80d1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:18:56 +0000 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20reviewdog=E5=B0=8E=E5=85=A5=E3=81=AE?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reviewdogのセットアップを公式アクションに切り替えるため。 lintツールのバージョンを固定し、コメント用トークンを設定した。 Co-authored-by: LevelCapTech <99854263+LevelCapTech@users.noreply.github.com> --- .github/workflows/markdownlint.yml | 10 ++++++++-- .github/workflows/mermaid-lint.yml | 22 +++++++++++++++------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml index 4109cc54..9846537a 100644 --- a/.github/workflows/markdownlint.yml +++ b/.github/workflows/markdownlint.yml @@ -27,8 +27,12 @@ jobs: - name: Install tools run: | - npm install -g markdownlint-cli - npm install -g reviewdog + npm install -g markdownlint-cli@0.48.0 + + - name: Setup reviewdog + uses: reviewdog/action-setup@v1 + with: + reviewdog_version: v0.21.0 - name: Markdown lint run: | @@ -38,3 +42,5 @@ jobs: -name="Markdownチェック" \ -reporter=github-pr-review \ -level=warning + env: + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/mermaid-lint.yml b/.github/workflows/mermaid-lint.yml index 998e7cf3..7374a84b 100644 --- a/.github/workflows/mermaid-lint.yml +++ b/.github/workflows/mermaid-lint.yml @@ -23,8 +23,12 @@ jobs: - name: Install tools run: | - npm install -g @mermaid-js/mermaid-cli - npm install -g reviewdog + npm install -g @mermaid-js/mermaid-cli@11.12.0 + + - name: Setup reviewdog + uses: reviewdog/action-setup@v1 + with: + reviewdog_version: v0.21.0 - name: Extract Mermaid blocks run: | @@ -90,8 +94,12 @@ jobs: - name: Report via reviewdog run: | - cat result.txt | reviewdog \ - -efm="%f:%l: %m" \ - -name="Mermaid図チェック" \ - -reporter=github-pr-review \ - -level=error + if [ -s result.txt ]; then + cat result.txt | reviewdog \ + -efm="%f:%l: %m" \ + -name="Mermaid図チェック" \ + -reporter=github-pr-review \ + -level=error + fi + env: + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 8be9f681a8fd7bbd8a7d1eeae808c34141e212ff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:19:58 +0000 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20lint=E5=87=BA=E5=8A=9B=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit markdownlintの結果を確実にreviewdogへ渡すため。 Mermaid図検証の出力詳細とカウンタ名を明確化した。 Co-authored-by: LevelCapTech <99854263+LevelCapTech@users.noreply.github.com> --- .github/workflows/markdownlint.yml | 12 ++++++------ .github/workflows/mermaid-lint.yml | 9 +++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml index 9846537a..b6a5eeac 100644 --- a/.github/workflows/markdownlint.yml +++ b/.github/workflows/markdownlint.yml @@ -36,11 +36,11 @@ jobs: - name: Markdown lint run: | - markdownlint "docs/**/*.md" ".github/**/*.md" \ - | reviewdog \ - -f=markdownlint \ - -name="Markdownチェック" \ - -reporter=github-pr-review \ - -level=warning + markdownlint "docs/**/*.md" ".github/**/*.md" > markdownlint.txt || true + cat markdownlint.txt | reviewdog \ + -f=markdownlint \ + -name="Markdownチェック" \ + -reporter=github-pr-review \ + -level=warning env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/mermaid-lint.yml b/.github/workflows/mermaid-lint.yml index 7374a84b..6cf5b50d 100644 --- a/.github/workflows/mermaid-lint.yml +++ b/.github/workflows/mermaid-lint.yml @@ -37,7 +37,7 @@ jobs: const fs = require('fs') const path = require('path') - let i = 0 + let diagramCounter = 0 const mapPath = path.join('tmp', 'map.txt') fs.writeFileSync(mapPath, '') @@ -66,7 +66,7 @@ jobs: if (inside && line.startsWith('```')) { inside = false - const name = `tmp/diagram-${++i}.mmd` + const name = `tmp/diagram-${++diagramCounter}.mmd` fs.writeFileSync(name, buffer.join('\n')) fs.appendFileSync(mapPath, `${name}:${file}:${startLine}\n`) return @@ -86,8 +86,9 @@ jobs: if [ -s tmp/map.txt ]; then while IFS=":" read -r mmd src line; do - if ! mmdc -i "$mmd" -o "$mmd.svg"; then - echo "$src:$line: Mermaid図の構文エラー" >> result.txt + if ! output=$(mmdc -i "$mmd" -o "$mmd.svg" 2>&1); then + compact=$(printf "%s" "$output" | tr '\n' ' ') + echo "$src:$line: Mermaid図の構文エラー: $compact" >> result.txt fi done < tmp/map.txt fi From a9592d6dfdbd8a507887126467e13adcd09ca3cb Mon Sep 17 00:00:00 2001 From: Yoshio Nishiyama Date: Sat, 7 Mar 2026 03:36:08 +0000 Subject: [PATCH 6/6] =?UTF-8?q?config:=20markdownlint=E3=82=92=E4=B8=A6?= =?UTF-8?q?=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/markdownlint.yml | 136 +++++++++++++++++++--- .github/workflows/mermaid-lint.yml | 175 ++++++++++++++++++++++++----- 2 files changed, 267 insertions(+), 44 deletions(-) diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml index b6a5eeac..507aacd1 100644 --- a/.github/workflows/markdownlint.yml +++ b/.github/workflows/markdownlint.yml @@ -1,7 +1,8 @@ -name: markdownlint +name: Markdownチェック(reviewdog) on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "docs/**/*.md" - ".github/**/*.md" @@ -10,8 +11,16 @@ on: - "docs/**/*.md" - ".github/**/*.md" +permissions: + contents: read + +concurrency: + group: markdownlint-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: - markdownlint: + markdownlint-pr: + if: github.event_name == 'pull_request' runs-on: ubuntu-latest permissions: @@ -19,28 +28,127 @@ jobs: pull-requests: write steps: - - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v6 - - uses: actions/setup-node@v4 + - name: Setup Node.js + uses: actions/setup-node@v6 with: - node-version: 20 + node-version: "24" - name: Install tools + run: npm install -g markdownlint-cli@0.48.0 + + - name: Log goコマンド確認開始 + run: echo "goコマンドの存在を確認します" >&2 + + - name: Check Go availability run: | - npm install -g markdownlint-cli@0.48.0 + if ! command -v go >/dev/null 2>&1; then + echo "goコマンドが見つからないためジョブを失敗扱いにします" >&2 + exit 1 + fi - - name: Setup reviewdog - uses: reviewdog/action-setup@v1 - with: - reviewdog_version: v0.21.0 + - name: Install reviewdog + run: | + go install github.com/reviewdog/reviewdog/cmd/reviewdog@v0.21.0 + echo "$HOME/go/bin" >> "$GITHUB_PATH" + + - name: Log markdownlint開始 + run: echo "markdownlintとreviewdogを実行します" >&2 - name: Markdown lint + env: + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - markdownlint "docs/**/*.md" ".github/**/*.md" > markdownlint.txt || true - cat markdownlint.txt | reviewdog \ + set -eu + # 複数コマンドをパイプで繋いでいないため pipefail は省略 + exit_code=0 + markdownlint "docs/**/*.md" ".github/**/*.md" > markdownlint.txt || exit_code=$? + reviewdog_exit=0 + reviewdog < markdownlint.txt \ -f=markdownlint \ -name="Markdownチェック" \ - -reporter=github-pr-review \ - -level=warning + -reporter="github-pr-review" \ + -level=warning || reviewdog_exit=$? + # markdownlint: 1=lint違反, 2以上=実行エラー + # reviewdog: 0=成功(PRコメント/チェックの投稿が成功) + if [ "$reviewdog_exit" -ne 0 ]; then + echo "reviewdogが失敗しました: exit code ${reviewdog_exit}" >&2 + exit "$reviewdog_exit" + fi + # exit_code=1 は reviewdog で通知済みのため成功扱い + if [ "$exit_code" -gt 1 ]; then + echo "markdownlintが失敗しました: exit code ${exit_code}" >&2 + exit "$exit_code" + fi + + - name: Log markdownlint完了 + run: echo "markdownlintとreviewdogの処理が完了しました" >&2 + + markdownlint-push: + if: github.event_name == 'push' + runs-on: ubuntu-latest + + permissions: + contents: read + checks: write + + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "24" + + - name: Install tools + run: npm install -g markdownlint-cli@0.48.0 + + - name: Log goコマンド確認開始 + run: echo "goコマンドの存在を確認します" >&2 + + - name: Check Go availability + run: | + if ! command -v go >/dev/null 2>&1; then + echo "goコマンドが見つからないためジョブを失敗扱いにします" >&2 + exit 1 + fi + + - name: Install reviewdog + run: | + go install github.com/reviewdog/reviewdog/cmd/reviewdog@v0.21.0 + echo "$HOME/go/bin" >> "$GITHUB_PATH" + + - name: Log markdownlint開始 + run: echo "markdownlintとreviewdogを実行します" >&2 + + - name: Markdown lint env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -eu + # 複数コマンドをパイプで繋いでいないため pipefail は省略 + exit_code=0 + markdownlint "docs/**/*.md" ".github/**/*.md" > markdownlint.txt || exit_code=$? + reviewdog_exit=0 + reviewdog < markdownlint.txt \ + -f=markdownlint \ + -name="Markdownチェック" \ + -reporter="github-check" \ + -level=warning || reviewdog_exit=$? + # markdownlint: 1=lint違反, 2以上=実行エラー + # reviewdog: 0=成功(PRコメント/チェックの投稿が成功) + if [ "$reviewdog_exit" -ne 0 ]; then + echo "reviewdogが失敗しました: exit code ${reviewdog_exit}" >&2 + exit "$reviewdog_exit" + fi + # exit_code=1 は reviewdog で通知済みのため成功扱い + if [ "$exit_code" -gt 1 ]; then + echo "markdownlintが失敗しました: exit code ${exit_code}" >&2 + exit "$exit_code" + fi + + - name: Log markdownlint完了 + run: echo "markdownlintとreviewdogの処理が完了しました" >&2 diff --git a/.github/workflows/mermaid-lint.yml b/.github/workflows/mermaid-lint.yml index 6cf5b50d..6b041cc3 100644 --- a/.github/workflows/mermaid-lint.yml +++ b/.github/workflows/mermaid-lint.yml @@ -1,11 +1,19 @@ -name: mermaid-lint +name: Mermaid図チェック(reviewdog) on: pull_request: + types: [opened, synchronize, reopened, ready_for_review] paths: - "docs/**/*.md" - ".github/**/*.md" +permissions: + contents: read + +concurrency: + group: mermaid-lint-${{ github.event.pull_request.number }} + cancel-in-progress: true + jobs: mermaid: runs-on: ubuntu-latest @@ -15,20 +23,52 @@ jobs: pull-requests: write steps: - - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v6 - - uses: actions/setup-node@v4 + - name: Setup Node.js + uses: actions/setup-node@v6 with: - node-version: 20 + node-version: "24" - - name: Install tools + - name: Log Mermaid CLIインストール開始 + run: echo "Mermaid CLIをインストールします" >&2 + + - name: Install Mermaid CLI run: | + set -e npm install -g @mermaid-js/mermaid-cli@11.12.0 - - name: Setup reviewdog - uses: reviewdog/action-setup@v1 - with: - reviewdog_version: v0.21.0 + - name: Log Mermaid CLIインストール完了 + run: echo "Mermaid CLIのインストールが完了しました" >&2 + + - name: Log mmdcコマンド確認開始 + run: echo "mmdcコマンドの存在を確認します" >&2 + + - name: Check mmdc availability + run: | + if ! command -v mmdc >/dev/null 2>&1; then + echo "mmdcコマンドが見つからないためジョブを失敗扱いにします" >&2 + exit 1 + fi + + - name: Log goコマンド確認開始 + run: echo "goコマンドの存在を確認します" >&2 + + - name: Check Go availability + run: | + if ! command -v go >/dev/null 2>&1; then + echo "goコマンドが見つからないためジョブを失敗扱いにします" >&2 + exit 1 + fi + + - name: Install reviewdog + run: | + go install github.com/reviewdog/reviewdog/cmd/reviewdog@v0.21.0 + echo "$HOME/go/bin" >> "$GITHUB_PATH" + + - name: Log Mermaidブロック抽出開始 + run: echo "Mermaidブロック抽出を開始します" >&2 - name: Extract Mermaid blocks run: | @@ -37,16 +77,27 @@ jobs: const fs = require('fs') const path = require('path') - let diagramCounter = 0 + // Mermaid抽出ファイルと元Markdownの対応を「抽出ファイル:元ファイル:開始行」形式で記録 + // 例: tmp/diagram-1.mmd:docs/example.md:42 const mapPath = path.join('tmp', 'map.txt') fs.writeFileSync(mapPath, '') + // Mermaidブロックの件数 + let index = 0 + + // 指定ディレクトリ以下のMarkdownを探索 function walk(dir) { if (!fs.existsSync(dir)) return - fs.readdirSync(dir).forEach((file) => { - const full = path.join(dir, file) - if (fs.statSync(full).isDirectory()) walk(full) - else if (full.endsWith('.md')) processFile(full) + fs.readdirSync(dir).forEach((entry) => { + const full = path.join(dir, entry) + const stat = fs.statSync(full) + if (stat.isDirectory()) { + walk(full) + return + } + if (full.endsWith('.md')) { + processFile(full) + } }) } @@ -57,16 +108,19 @@ jobs: let startLine = 0 lines.forEach((line, idx) => { - if (line.startsWith('```mermaid')) { + const trimmed = line.trim() + // Mermaidブロックの開始 + if (!inside && trimmed.startsWith('```mermaid')) { inside = true buffer = [] startLine = idx + 1 return } - if (inside && line.startsWith('```')) { + // Mermaidブロックの終了 + if (inside && trimmed.startsWith('```')) { inside = false - const name = `tmp/diagram-${++diagramCounter}.mmd` + const name = `tmp/diagram-${++index}.mmd` fs.writeFileSync(name, buffer.join('\n')) fs.appendFileSync(mapPath, `${name}:${file}:${startLine}\n`) return @@ -74,33 +128,94 @@ jobs: if (inside) buffer.push(line) }) + + // ファイル末尾まで到達しても終了フェンスが無い場合(閉じ忘れ)もブロックを検証対象に含める + if (inside) { + const name = `tmp/diagram-${++index}.mmd` + fs.writeFileSync(name, buffer.join('\n')) + fs.appendFileSync(mapPath, `${name}:${file}:${startLine}\n`) + } } walk('docs') walk('.github') + console.error(`抽出したMermaid図: ${index}件`) EOF + - name: Log Mermaidブロック抽出完了 + run: echo "Mermaidブロック抽出が完了しました" >&2 + + - name: Log Mermaid図検証開始 + run: echo "Mermaid図の検証を開始します" >&2 + - name: Validate Mermaid diagrams run: | - : > result.txt - + : > tmp/result.txt + MAX_ERROR_LENGTH=500 + # Mermaid CLIの実行環境起因エラー(Puppeteer/ブラウザ起動失敗等)を判定するための正規表現パターン + # 各要素は正規表現として評価するため、必要に応じてメタ文字を使用/エスケープする + # 出力メッセージの大文字小文字揺れを吸収するため、grepは -i を使用する + MMD_CLI_EXEC_ERROR_PATTERNS=( + # Puppeteer関連のエラー文言(例: "Error: Puppeteer failed to connect") + 'error.*puppeteer' + # 実行ファイル未検出(例: "Executable doesn't exist at /path/to/chrome") + "executable doesn't exist" + # browser executable.*exist は実行ファイル探索時の存在エラー検知を意図(例: "browser executable doesn't exist") + 'browser executable.*exist' + # 起動失敗の共通文言(例: "Failed to launch the browser process!") + 'failed to launch' + # browsertype.launch のドットはリテラルとして扱う(例: "browserType.launch: Executable doesn't exist ...") + 'browsertype\.launch' + ) + # 配列要素を | で連結して正規表現文字列を生成(例: error.*puppeteer|...) + MMD_CLI_EXEC_ERROR_REGEX=$(IFS='|'; printf '%s' "${MMD_CLI_EXEC_ERROR_PATTERNS[*]}") + cat <<'JSON' > tmp/puppeteer-config.json + { + "args": ["--no-sandbox", "--disable-setuid-sandbox"] + } + JSON if [ -s tmp/map.txt ]; then + mmdc_exec_error=0 + mmdc_exec_summary="" while IFS=":" read -r mmd src line; do - if ! output=$(mmdc -i "$mmd" -o "$mmd.svg" 2>&1); then - compact=$(printf "%s" "$output" | tr '\n' ' ') - echo "$src:$line: Mermaid図の構文エラー: $compact" >> result.txt + if [ -z "${mmd}" ]; then + continue + fi + if ! output=$(mmdc -p tmp/puppeteer-config.json -i "${mmd}" -o "${mmd}.svg" 2>&1); then + summary=$(printf "%s" "${output}" | tr '\n' ' ' | cut -c1-${MAX_ERROR_LENGTH}) + if printf "%s" "${output}" | grep -qiE "${MMD_CLI_EXEC_ERROR_REGEX}"; then + mmdc_exec_error=1 + mmdc_exec_summary="${summary}" + echo "mmdcの実行に失敗しました: ${summary}" >&2 + # 実行環境エラーは全図に影響するため、以降の検証を中断してジョブを失敗扱いにする + break + fi + echo "${src}:${line}: Mermaid図の構文検証に失敗しました: ${summary}" >> tmp/result.txt fi done < tmp/map.txt + if [ "${mmdc_exec_error}" -ne 0 ]; then + echo "Mermaid CLIの実行エラーのためジョブを失敗扱いにします: ${mmdc_exec_summary}" >&2 + exit 1 + fi + else + echo "Mermaidブロックが見つからなかったため検証をスキップします" >&2 fi + - name: Log Mermaid図検証完了 + run: echo "Mermaid図の検証が完了しました" >&2 + + - name: Log reviewdog通知開始 + run: echo "reviewdogで結果を通知します" >&2 + - name: Report via reviewdog - run: | - if [ -s result.txt ]; then - cat result.txt | reviewdog \ - -efm="%f:%l: %m" \ - -name="Mermaid図チェック" \ - -reporter=github-pr-review \ - -level=error - fi env: REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + reviewdog < tmp/result.txt \ + -efm="%f:%l: %m" \ + -name="Mermaid図チェック" \ + -reporter=github-pr-review \ + -level=error + + - name: Log reviewdog通知完了 + run: echo "reviewdogの通知処理が完了しました" >&2